2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
4 #ifndef MUONREADOUTGEOMETRYR4_MMREADOUTELEMENT_ICC
5 #define MUONREADOUTGEOMETRYR4_MMREADOUTELEMENT_ICC
8 template <> inline Amg::Transform3D
9 TransformCacheDetEle<MuonGMR4::MmReadoutElement>::fetchTransform(const DetectorAlignStore* store) const {
10 return m_parent->toStation(store) * m_parent->fromGapToChamOrigin(hash());
12 template <> inline Identifier
13 TransformCacheDetEle<MuonGMR4::MmReadoutElement>::identify() const {
14 using RE = MuonGMR4::MmReadoutElement;
15 return m_parent->measurementId(RE::createHash(RE::gasGapNumber(hash()), 1));
21 inline double MmReadoutElement::thickness() const { return 2.* m_pars.halfThickness; }
22 inline int MmReadoutElement::multilayer() const{ return m_multilayer; }
23 inline double MmReadoutElement::moduleHeight() const { return 2.*m_pars.halfHeight; }
24 inline double MmReadoutElement::moduleWidthS() const { return 2.*m_pars.halfShortWidth; }
25 inline double MmReadoutElement::moduleWidthL() const { return 2.*m_pars.halfLongWidth; }
26 inline double MmReadoutElement::moduleThickness() const { return 2.*m_pars.halfThickness; }
27 inline double MmReadoutElement::gapLengthS(const IdentifierHash& hash) const { return 2.*stripLayer(hash).design().shortHalfHeight(); }
28 inline double MmReadoutElement::gapLengthL(const IdentifierHash& hash) const { return 2.*stripLayer(hash).design().longHalfHeight();}
29 inline double MmReadoutElement::gapHeight(const IdentifierHash& hash) const { return 2.*stripLayer(hash).design().halfWidth();}
30 inline int MmReadoutElement::readoutSide(const IdentifierHash& measHash) const {
31 return m_pars.readoutSide[static_cast<unsigned>(layerHash(measHash))];
33 inline unsigned int MmReadoutElement::nGasGaps() const { return m_pars.layers.size(); }
34 inline unsigned int MmReadoutElement::numStrips(const IdentifierHash& hash) const {
35 return stripLayer(hash).design().numStrips();
37 inline unsigned int MmReadoutElement::firstStrip(const IdentifierHash& hash) const {
38 return stripLayer(hash).design().firstStripNumber();
40 inline double MmReadoutElement::stripLength(const IdentifierHash& hash) const {
41 return stripLayer(hash).design().stripLength(stripNumber(hash));
45 inline IdentifierHash MmReadoutElement::createHash(const int gasGap, const int strip) {
46 /*gasGap can be 1 to 4. So we make sure it contributes to the lower 4 bits. (Bit shifting begins from left to right).
47 Then we shift the bit position to the left by 4 positions and allocate the strip binary expression.
48 (gasGap-1) --> is the binary representation of the gasGap.
49 strip --> is the binary representation of the strip.
51 IdentifierHash hash = strip << 4 | (gasGap - 1);
55 inline IdentifierHash MmReadoutElement::measurementHash(const Identifier& measId) const {
56 if (m_idHelper.elementID(measId) != m_idHelper.elementID(identify()) ) {
57 ATH_MSG_WARNING("The measurement " << idHelperSvc()->toString(measId)
58 << " picks the wrong readout element " << idHelperSvc()->toStringDetEl(identify()));
60 return createHash(m_idHelper.gasGap(measId), m_idHelper.channel(measId));
63 inline IdentifierHash MmReadoutElement::layerHash(const Identifier& measId) const {
64 if (m_idHelper.elementID(measId) != m_idHelper.elementID(identify()) ) {
65 ATH_MSG_WARNING("The measurement " << idHelperSvc()->toString(measId)
66 << " picks the wrong readout element " << idHelperSvc()->toStringDetEl(identify()));
68 return createHash(m_idHelper.gasGap(measId), 0);
71 inline IdentifierHash MmReadoutElement::layerHash(const IdentifierHash& measHash) const {
72 //measHash & 0xF will extract the gasGap number from 0 to 3, which is what you need based on
73 // the fact that you createHash through :
74 //IdentifierHash hash = (gasGap - 1) | strip << 4;
75 return IdentifierHash{static_cast<unsigned int>((measHash & 0xF))};
79 inline Identifier MmReadoutElement::measurementId(const IdentifierHash& measHash) const {
80 return m_idHelper.channelID(identify(),multilayer(), gasGapNumber(measHash), stripNumber(measHash));
83 // Extract the gas gap number from the lower 4 bits of the hash
84 inline unsigned int MmReadoutElement::gasGapNumber(const IdentifierHash& measHash) {
85 return (measHash & 0xF) + 1;
88 // Extract the strip number from the remaining bits after removing the gas gap bits
89 inline unsigned int MmReadoutElement::stripNumber(const IdentifierHash& measHash) {
90 // Right shift by 4 to get rid of the lower 4 bits (gas gap bits).
91 return (measHash >> 4);
94 inline const StripLayer& MmReadoutElement::stripLayer(const IdentifierHash& measHash) const {
95 return *m_pars.layers.at(static_cast<unsigned int>(layerHash(measHash)));
98 inline const StripLayer& MmReadoutElement::stripLayer(const Identifier& measId) const {
99 return stripLayer(measurementHash(measId));
104 inline Amg::Vector3D MmReadoutElement::stripPosition(const ActsGeometryContext& ctx, const Identifier& measId) const {
105 return stripPosition(ctx, measurementHash(measId));
108 inline Amg::Vector3D MmReadoutElement::leftStripEdge(const ActsGeometryContext& ctx, const Identifier& measId) const{
109 return leftStripEdge(ctx, measurementHash(measId));
112 inline Amg::Vector3D MmReadoutElement::rightStripEdge(const ActsGeometryContext& ctx, const Identifier& measId) const{
113 return rightStripEdge(ctx, measurementHash(measId));
117 } // namespace MuonGMR4