ATLAS Offline Software
Loading...
Searching...
No Matches
MuonGM::sTgcReadoutElement Class Referencefinal

An sTgcReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station contains: More...

#include <sTgcReadoutElement.h>

Inheritance diagram for MuonGM::sTgcReadoutElement:
Collaboration diagram for MuonGM::sTgcReadoutElement:

Public Member Functions

 sTgcReadoutElement (GeoVFullPhysVol *pv, const std::string &stName, int zi, int fi, int mL, MuonDetectorManager *mgr)
 constructor
 ~sTgcReadoutElement ()
 destructor
virtual bool containsId (const Identifier &id) const override final
 function to be used to check whether a given Identifier is contained in the readout element
virtual double distanceToReadout (const Amg::Vector2D &pos, const Identifier &id) const override final
 distance to readout.
virtual int stripNumber (const Amg::Vector2D &pos, const Identifier &id) const override final
 strip number corresponding to local position.
double channelPitch (const Identifier &id) const
 Channel pitch.
virtual bool stripPosition (const Identifier &id, Amg::Vector2D &pos) const override final
 strip position - should be renamed to channel position If the strip number is outside the range of valid strips, the function will return false
bool stripGlobalPosition (const Identifier &id, Amg::Vector3D &gpos) const
int padNumber (const Amg::Vector2D &pos, const Identifier &id) const
 pad number corresponding to local position
int wireNumber (const Amg::Vector2D &pos, const Identifier &id) const
 wire number corresponding to local position
double wirePitch (int gas_gap=1) const
 single wire pitch.
double positionFirstWire (const Identifier &id) const
 Get the local position of the first wire of the chamber corresponding to the identifier.
int numberOfWires (const Identifier &id) const
 Get the total number of wires (single wires) of a chamber.
bool padPosition (const Identifier &id, Amg::Vector2D &pos) const
 pad position
bool padGlobalPosition (const Identifier &id, Amg::Vector3D &gpos) const
 pad global position
bool padCorners (const Identifier &id, std::array< Amg::Vector2D, 4 > &corners) const
 pad corners
bool padGlobalCorners (const Identifier &id, std::array< Amg::Vector3D, 4 > &gcorners) const
 pad global corners
bool isEtaZero (const Identifier &id, const Amg::Vector2D &localPosition) const
 is eta=0 of QL1 or QS1?
virtual int numberOfLayers (bool) const override final
 number of layers in phi/eta projection
virtual int numberOfStrips (const Identifier &layerId) const override final
 number of strips per layer
virtual int numberOfStrips (int, bool measuresPhi) const override final
int numberOfPads (const Identifier &layerId) const
 Get the number of pad per layer.
int maxPadNumber (const Identifier &layerId) const
 Get largest pad number, which is different to the number of pads in a gas volume due to the pad numbering in Athena.
virtual bool spacePointPosition (const Identifier &phiId, const Identifier &etaId, Amg::Vector2D &pos) const override final
 space point position for a given pair of phi and eta identifiers The LocalPosition is expressed in the reference frame of the phi surface.
virtual bool spacePointPosition (const Identifier &phiId, const Identifier &etaId, Amg::Vector3D &pos) const override final
 Global space point position for a given pair of phi and eta identifiers If one of the identifiers is outside the valid range, the function will return false.
void spacePointPosition (const Amg::Vector2D &phiPos, const Amg::Vector2D &etaPos, Amg::Vector2D &pos) const
 space point position for a pair of phi and eta local positions and a layer identifier The LocalPosition is expressed in the reference frame of the phi projection.
void spacePointPosition (const Identifier &layerId, double locXpos, double locYpos, Amg::Vector3D &pos) const
 space point position, corrected for chamber deformations (b-lines), if b-lines are enabled.
Amg::Vector3D localToGlobalCoords (const Amg::Vector3D &locPos, Identifier id) const
 simHit local (SD) To Global position - to be used by MuonGeoAdaprors only
virtual void fillCache () override final
 function to fill tracking cache
virtual int surfaceHash (const Identifier &id) const override final
 returns the hash to be used to look up the surface and transform in the MuonClusterReadoutElement tracking cache
int surfaceHash (int gasGap, int channelType) const
 returns the hash to be used to look up the surface and transform in the MuonClusterReadoutElement tracking cache
virtual int layerHash (const Identifier &id) const override
 returns the hash to be used to look up the normal and center in the MuonClusterReadoutElement tracking cache
virtual int boundaryHash (const Identifier &id) const override final
 returns the hash to be used to look up the normal and center in the MuonClusterReadoutElement tracking cache
virtual bool measuresPhi (const Identifier &id) const override final
 returns whether the current identifier corresponds to a phi measurement
void initDesign (double thickness)
 initialize the design classes for this readout element
const MuonChannelDesigngetDesign (const Identifier &id) const
 returns the MuonChannelDesign class for the given identifier
const MuonChannelDesigngetDesign (int gasGap, int channelType) const
 returns the MuonChannelDesign class
const MuonPadDesigngetPadDesign (const Identifier &id) const
 returns the MuonChannelDesign class for the given identifier
MuonPadDesigngetPadDesign (const Identifier &id)
const MuonPadDesigngetPadDesign (int gasGap) const
 returns the MuonChannelDesign
void setChamberLayer (int ml)
 set methods only to be used by MuonGeoModel
const Amg::Transform3DgetDelta () const
 read A-line parameters and include the chamber rotation/translation in the local-to-global (ATLAS) reference frame transformaton
void setDelta (const ALinePar &aline)
void setBLinePar (const BLinePar &bLine)
 read B-line (chamber-deformation) parameters
void posOnDefChamber (Amg::Vector3D &locPosML) const
 transform a position (in chamber-frame coordinates) to the deformed-chamber geometry
bool has_ALines () const
bool has_BLines () const
const ALinePargetALinePar () const
const BLinePargetBLinePar () const
void clearALinePar ()
void clearBLinePar ()
virtual Amg::Vector3D AmdbLRSToGlobalCoords (const Amg::Vector3D &x) const override final
virtual Amg::Transform3D AmdbLRSToGlobalTransform () const override final
virtual Amg::Vector3D GlobalToAmdbLRSCoords (const Amg::Vector3D &x) const override final
virtual Amg::Transform3D GlobalToAmdbLRSTransform () const override final
virtual void clearCache () override final
 clear the cache of the readout elememt
virtual const Trk::PlaneSurfacesurface () const override
 access to chamber surface (phi orientation), uses the first gas gap
virtual const Trk::PlaneSurfacesurface (const Identifier &id) const override
 access to layer surfaces
const Trk::PlaneSurfacesurface (int surfHash) const
 access to layer surfaces
virtual const Trk::SurfaceBoundsbounds () const override
 Return the boundaries of the element.
virtual const Trk::SurfaceBoundsbounds (const Identifier &id) const override
 Return the boundaries of the surface associated with this identifier.
const Trk::SurfaceBoundsbounds (int boundHash) const
virtual const Amg::Vector3Dcenter () const override
 Return the center of the element.
virtual const Amg::Vector3Dcenter (const Identifier &id) const override
 Return the center of the surface associated with this identifier In the case of silicon it returns the same as center().
const Amg::Vector3Dcenter (int layHash) const
virtual const Amg::Vector3Dnormal () const override
 Return the normal of the element.
virtual const Amg::Vector3Dnormal (const Identifier &id) const override
 Return the normal of the surface associated with this identifier In the case of silicon it returns the same as normal().
const Amg::Vector3Dnormal (int layHash) const
virtual const Amg::Transform3Dtransform () const override
 Return local to global transform.
virtual const Amg::Transform3Dtransform (const Identifier &id) const override
 Return local to global transform associated with this identifier.
const Amg::Transform3Dtransform (int surfHash) const
virtual std::vector< const Trk::Surface * > surfaces () const
 returns all the surfaces contained in this detector element
Identifier identify () const override final
 Returns the ATLAS Identifier of the MuonReadOutElement.
IdentifierHash identifyHash () const override final
 Returns the IdentifierHash of the MuonStation, i.e.
IdentifierHash detectorElementHash () const
 Returns the IdentifierHash of the detector element.
void setIdentifier (const Identifier &id)
 Sets the Identifier, hashes & station names.
int getStationIndex () const
int getStationEta () const
int getStationPhi () const
const Amg::Vector3D globalPosition () const
const Amg::Transform3DabsTransform () const
const Amg::Transform3DdefTransform () const
std::string getTechnologyType () const
const std::string & getTechnologyName () const
void setTechnologyName (const std::string &str)
std::string getStationType () const
const std::string & getStationName () const
void setStationName (const std::string &)
double getSsize () const
double getRsize () const
double getZsize () const
double getLongSsize () const
double getLongRsize () const
double getLongZsize () const
double getStationS () const
 Seems to be exclusively used by the MDTs --> Move it to MdtReadoutElement.
void setStationS (double)
void setLongSsize (double)
void setLongRsize (double)
void setLongZsize (double)
void setSsize (double)
void setRsize (double)
void setZsize (double)
bool largeSector () const
bool smallSector () const
bool sideA () const
bool sideC () const
const MuonStationparentMuonStation () const
void setParentMuonStation (const MuonStation *)
Amg::Transform3D toParentStation () const
Amg::Vector3D parentMuonStationPos () const
bool hasCutouts () const
void setHasCutouts (bool flag)
void refreshCache ()
const Muon::IMuonIdHelperSvcidHelperSvc () const
Trk::DetectorElemType detectorType () const override final
 Return the Detector element type.
std::string detectorTypeString () const
 Returns a string of the Detector element type.
bool msgLvl (const MSG::Level lvl) const
 Test the output level.
MsgStream & msg () const
 The standard message stream.
MsgStream & msg (const MSG::Level lvl) const
 The standard message stream.
void setLevel (MSG::Level lvl)
 Change the current logging level.

Static Public Member Functions

static double triggerBandIdToRadius (bool isLarge, int triggerBand)

Protected Member Functions

const MuonDetectorManagermanager () const

Protected Attributes

std::unique_ptr< SurfaceDatam_surfaceData {}
double m_Ssize {-9999.}
double m_Rsize {-9999.}
double m_Zsize {-9999.}
double m_LongSsize {-9999.}
double m_LongRsize {-9999.}
double m_LongZsize {-9999.}
 size in the specified direction
std::string m_techname {"TTT0"}
 MDT or RPC or TGC or CSC plus a two digits subtype; example RPC17.
std::string m_statname {"XXX0"}
 examples are BMS5, CSS1, EML1
int m_caching {-1}
 0 if we want to avoid caching geometry info for tracking interface
bool m_hasCutouts {false}
 true is there are cutouts in the readdout-element

Private Member Functions

void initDesignFromSQLite (double thickness)
void initDesignFromAGDD (double thickness)
void initMessaging () const
 Initialize our message level and MessageSvc.

Private Attributes

const sTgcIdHelperm_idHelper {idHelperSvc()->stgcIdHelper()}
std::array< MuonChannelDesign, 4 > m_phiDesign {}
std::array< MuonChannelDesign, 4 > m_etaDesign {}
std::array< MuonPadDesign, 4 > m_padDesign {}
int m_ml {0}
double m_offset {0.}
bool m_diamondShape {false}
const ALineParm_ALinePar {nullptr}
const BLineParm_BLinePar {nullptr}
Amg::Transform3D m_delta {Amg::Transform3D::Identity()}
std::array< Amg::Transform3D, 4 > m_Xlg {make_array<Amg::Transform3D, 4>(Amg::Transform3D::Identity())}
ServiceHandle< Muon::IMuonIdHelperSvcm_idHelperSvc {"Muon::MuonIdHelperSvc/MuonIdHelperSvc", "MuonDetectorManager"}
Trk::DetectorElemType m_type {Trk::DetectorElemType::SolidState}
Identifier m_id {}
 extended data-collection identifier
IdentifierHash m_idhash {0}
 data-collection hash identifier
IdentifierHash m_detectorElIdhash {0}
 detector element hash identifier
double m_stationS {0.}
int m_stIdx {-1}
 Identifier field of the station index.
int m_eta {-1}
 Identifier field of the station eta.
int m_phi {-1}
 Identifier field of the station phi.
const MuonStationm_parentMuonStation {nullptr}
MuonDetectorManagerm_muon_mgr {nullptr}
std::string m_nm
 Message source name.
boost::thread_specific_ptr< MsgStream > m_msg_tls
 MsgStream instance (a std::cout like with print-out levels).
std::atomic< IMessageSvc * > m_imsg { nullptr }
 MessageSvc pointer.
std::atomic< MSG::Level > m_lvl { MSG::NIL }
 Current logging level.
std::atomic_flag m_initialized ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
 Messaging initialized (initMessaging).

Static Private Attributes

static constexpr int m_nlayers {4}
static constexpr std::array< double, 94 > LBANDIDSP
static constexpr std::array< double, 92 > SBANDIDSP

Friends

class MuonGMR4::ReadoutGeomCnvAlg

Detailed Description

An sTgcReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station contains:

Definition at line 30 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

Constructor & Destructor Documentation

◆ sTgcReadoutElement()

MuonGM::sTgcReadoutElement::sTgcReadoutElement ( GeoVFullPhysVol * pv,
const std::string & stName,
int zi,
int fi,
int mL,
MuonDetectorManager * mgr )

constructor

Definition at line 61 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

63 , m_ml(mL) {
64
65 std::string fixName = (stName[1] == 'L') ? "STL" : "STS";
66 Identifier id = mgr->stgcIdHelper()->channelID(fixName, zi, fi, mL, 1,
68
69 setStationName(fixName);
71 setIdentifier(id); // representative identifier, with stName, stEta, stPhi, mL
72 }
MuonClusterReadoutElement(GeoVFullPhysVol *pv, MuonDetectorManager *mgr, Trk::DetectorElemType detType)
void setIdentifier(const Identifier &id)
Sets the Identifier, hashes & station names.
void setChamberLayer(int ml)
set methods only to be used by MuonGeoModel
const std::string & stName(StIndex index)
convert StIndex into a string

◆ ~sTgcReadoutElement()

MuonGM::sTgcReadoutElement::~sTgcReadoutElement ( )
default

destructor

Member Function Documentation

◆ absTransform()

const Amg::Transform3D & MuonGM::MuonReadoutElement::absTransform ( ) const
inlineinherited

Definition at line 199 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

199{ return getMaterialGeom()->getAbsoluteTransform(); }

◆ AmdbLRSToGlobalCoords()

virtual Amg::Vector3D MuonGM::sTgcReadoutElement::AmdbLRSToGlobalCoords ( const Amg::Vector3D & x) const
inlinefinaloverridevirtual

◆ AmdbLRSToGlobalTransform()

virtual Amg::Transform3D MuonGM::sTgcReadoutElement::AmdbLRSToGlobalTransform ( ) const
inlinefinaloverridevirtual

Reimplemented from MuonGM::MuonReadoutElement.

Definition at line 200 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

const Amg::Transform3D & getDelta() const
read A-line parameters and include the chamber rotation/translation in the local-to-global (ATLAS) re...
Amg::Transform3D getTranslateZ3D(const double Z)
: Returns a shift transformation along the z-axis

◆ boundaryHash()

int MuonGM::sTgcReadoutElement::boundaryHash ( const Identifier & id) const
inlinefinaloverridevirtual

returns the hash to be used to look up the normal and center in the MuonClusterReadoutElement tracking cache

returns the hash function to be used to look up the surface boundary for a given identifier

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 269 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

269 {
270 int iphi = m_idHelper.channelType(id) != sTgcIdHelper::sTgcChannelTypes::Strip; // wires and pads have locX oriented along phi
271 if (std::abs(getStationEta()) < 3) iphi += 2 * (m_idHelper.gasGap(id) - 1);
272 return iphi;
273 }

◆ bounds() [1/3]

const Trk::SurfaceBounds & MuonGM::MuonClusterReadoutElement::bounds ( ) const
inlineoverridevirtualinherited

Return the boundaries of the element.

Implements Trk::TrkDetElementBase.

Definition at line 127 of file MuonClusterReadoutElement.h.

127{ return bounds(0); }
virtual const Trk::SurfaceBounds & bounds() const override
Return the boundaries of the element.

◆ bounds() [2/3]

const Trk::SurfaceBounds & MuonGM::MuonClusterReadoutElement::bounds ( const Identifier & id) const
inlineoverridevirtualinherited

Return the boundaries of the surface associated with this identifier.

For TRT this will be a straw, while for silicon it returns the same as bounds()

Implements Trk::TrkDetElementBase.

Definition at line 133 of file MuonClusterReadoutElement.h.

133{ return bounds(boundaryHash(id)); }
virtual int boundaryHash(const Identifier &id) const =0
returns the hash function to be used to look up the surface boundary for a given identifier

◆ bounds() [3/3]

const Trk::SurfaceBounds & MuonGM::MuonClusterReadoutElement::bounds ( int boundHash) const
inlineinherited

Definition at line 185 of file MuonClusterReadoutElement.h.

185 {
186 if (!m_surfaceData) {
187 ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" "<<__func__<<" Requesting bounds but cache is empty");
188 throw std::runtime_error("Empty bounds cache");
189 }
190 if (hash == -1 || hash >= (int)m_surfaceData->m_surfBounds.size()) {
191 ATH_MSG_WARNING("normal hash out of range: " << hash << " elements " << m_surfaceData->m_surfBounds.size());
192 return *m_surfaceData->m_surfBounds.front();
193 }
194 return *m_surfaceData->m_surfBounds[hash];
195 }
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
std::unique_ptr< SurfaceData > m_surfaceData

◆ center() [1/3]

const Amg::Vector3D & MuonGM::MuonClusterReadoutElement::center ( ) const
inlineoverridevirtualinherited

Return the center of the element.

Implements Trk::TrkDetElementBase.

Definition at line 125 of file MuonClusterReadoutElement.h.

125{ return center(0); }
virtual const Amg::Vector3D & center() const override
Return the center of the element.

◆ center() [2/3]

const Amg::Vector3D & MuonGM::MuonClusterReadoutElement::center ( const Identifier & id) const
inlineoverridevirtualinherited

Return the center of the surface associated with this identifier In the case of silicon it returns the same as center().

Implements Trk::TrkDetElementBase.

Definition at line 131 of file MuonClusterReadoutElement.h.

131{ return center(layerHash(id)); }
virtual int layerHash(const Identifier &id) const =0
returns the hash function to be used to look up the center and the normal of the tracking surface for...

◆ center() [3/3]

const Amg::Vector3D & MuonGM::MuonClusterReadoutElement::center ( int layHash) const
inlineinherited

Definition at line 161 of file MuonClusterReadoutElement.h.

161 {
162 if (!m_surfaceData) {
163 ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" "<<__func__<<" Requesting center but cache is empty");
164 throw std::runtime_error("Empty center cache");
165 }
166 if (hash == -1 || hash >= (int)m_surfaceData->m_layerCenters.size()) {
167 ATH_MSG_WARNING("center hash out of range: " << hash << " elements " << m_surfaceData->m_layerCenters.size());
168 return m_surfaceData->m_layerCenters.front();
169 }
170 return m_surfaceData->m_layerCenters[hash];
171 }

◆ channelPitch()

double MuonGM::sTgcReadoutElement::channelPitch ( const Identifier & id) const

Channel pitch.

Gives full pitch for strips, width of a full wire group Gives the Height of a pad

Definition at line 590 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

590 {
591 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) {
592 const MuonPadDesign* design = getPadDesign(id);
593 if (!design) {
594 ATH_MSG_WARNING( "no pad Design" );
595 return -1;
596 }
597 return design->channelWidth(Amg::Vector2D::Zero(), 0);
598 }
599
600 const MuonChannelDesign* design = getDesign(id);
601 if (!design) return -1;
602 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Strip) // sTGC strips
603 return design->inputPitch;
604 else if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire) // sTGC wires
605 return design->inputPitch * design->groupWidth; // wire Pitch * number of wires in a group
606 else
607 return -1;
608 }
const MuonPadDesign * getPadDesign(const Identifier &id) const
returns the MuonChannelDesign class for the given identifier
const MuonChannelDesign * getDesign(const Identifier &id) const
returns the MuonChannelDesign class for the given identifier
double channelWidth(const Amg::Vector2D &pos, bool measPhi, bool preciseMeas=false) const
calculate local channel width

◆ clearALinePar()

◆ clearBLinePar()

void MuonGM::sTgcReadoutElement::clearBLinePar ( )
inline

◆ clearCache()

void MuonGM::MuonClusterReadoutElement::clearCache ( )
finaloverridevirtualinherited

clear the cache of the readout elememt

Implements MuonGM::MuonReadoutElement.

Definition at line 13 of file MuonClusterReadoutElement.cxx.

13{ m_surfaceData.reset(); }

◆ containsId()

bool MuonGM::sTgcReadoutElement::containsId ( const Identifier & id) const
finaloverridevirtual

function to be used to check whether a given Identifier is contained in the readout element

Implements MuonGM::MuonReadoutElement.

Definition at line 568 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

568 {
569 if (m_idHelper.stationEta(id) != getStationEta()) return false;
570 if (m_idHelper.stationPhi(id) != getStationPhi()) return false;
571
572 if (m_idHelper.multilayerID(id) != m_ml) return false;
573
574 int gasgap = m_idHelper.gasGap(id);
575 if (gasgap < 1 || gasgap > m_nlayers) return false;
576
577 int strip = m_idHelper.channel(id);
578 if (strip < 1) return false;
579 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Strip && strip > m_etaDesign[gasgap - 1].nch) return false;
580 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire && strip > m_phiDesign[gasgap -1].nGroups) return false;
581 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) {
582 const auto [etaId, phiId] = m_padDesign[gasgap -1].etaPhiId(strip);
583 if (etaId < 0 || phiId < 0) return false;
584 }
585 return true;
586 }

◆ defTransform()

const Amg::Transform3D & MuonGM::MuonReadoutElement::defTransform ( ) const
inlineinherited

Definition at line 201 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

201{ return getMaterialGeom()->getDefAbsoluteTransform(); }

◆ detectorElementHash()

IdentifierHash MuonGM::MuonReadoutElement::detectorElementHash ( ) const
inlineinherited

Returns the IdentifierHash of the detector element.

Unlike the identifyHash, this hash is unique for each readout element

Definition at line 175 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

175{ return m_detectorElIdhash; }

◆ detectorType()

Trk::DetectorElemType MuonGM::MuonReadoutElement::detectorType ( ) const
inlinefinaloverridevirtualinherited

◆ detectorTypeString()

std::string Trk::TrkDetElementBase::detectorTypeString ( ) const
inherited

Returns a string of the Detector element type.

Definition at line 10 of file TrkDetElementBase.cxx.

10 {
11 auto type = detectorType();
13 return "SolidState";
14 else if (type == Trk::DetectorElemType::Silicon)
15 return "Silicon";
16 else if (type == Trk::DetectorElemType::TRT)
17 return "TRT";
18 else if (type == Trk::DetectorElemType::Csc)
19 return "Csc";
20 else if (type == Trk::DetectorElemType::Mdt)
21 return "Mdt";
22 else if (type == Trk::DetectorElemType::Rpc)
23 return "Rpc";
24 else if (type == Trk::DetectorElemType::Tgc)
25 return "Tgc";
26 else if (type == Trk::DetectorElemType::sTgc)
27 return "sTgc";
28 else if (type == Trk::DetectorElemType::MM)
29 return "Mm";
30 return "Unknown";
31}
virtual DetectorElemType detectorType() const =0
Return the Detector element type.

◆ distanceToReadout()

double MuonGM::sTgcReadoutElement::distanceToReadout ( const Amg::Vector2D & pos,
const Identifier & id ) const
inlinefinaloverridevirtual

distance to readout.

If the local position is outside the active volume, the function first shift the position back into the active volume

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 303 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

303 {
304 const MuonChannelDesign* design = getDesign(id);
305 if (!design) return -10000.;
306 return design->distanceToReadout(pos);
307 }

◆ fillCache()

void MuonGM::sTgcReadoutElement::fillCache ( )
finaloverridevirtual

function to fill tracking cache

Implements MuonGM::MuonReadoutElement.

Definition at line 467 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

467 {
468
469 if (m_surfaceData) {
470 ATH_MSG_WARNING("calling fillCache on an already filled cache" );
471 return;
472 }
473
474 m_surfaceData = std::make_unique<SurfaceData>();
475
476 for (int layer{0}; layer < m_nlayers; ++layer) {
477
478 // Define the geometry for the strips, pads and wires of this readout element.
479 // For QL3 (cutoff trapezoid), diamondBounds are used, while trapezoid bounds are used for the rest.
480 // The assigned coordinate along the layer normal is at the center of the gas gap;
481 // wires are considered at x=0, while strips and pads are shifted by +10/-10 microns.
482
483 //-------------------
484 // Layer boundaries
485 //-------------------
486
487 if (m_diamondShape) {
488 m_surfaceData->m_surfBounds.push_back(std::make_unique<Trk::RotatedDiamondBounds>(m_etaDesign[layer].minYSize() / 2.,
489 m_etaDesign[layer].maxYSize() / 2.,
490 m_etaDesign[layer].maxYSize() / 2.,
491 m_etaDesign[layer].xSize() / 2. - m_etaDesign[layer].yCutout() / 2,
492 m_etaDesign[layer].yCutout() / 2)); // strips
493
494 m_surfaceData->m_surfBounds.push_back(std::make_unique<Trk::DiamondBounds>(m_padDesign[layer].sPadWidth / 2.,
495 m_padDesign[layer].lPadWidth / 2.,
496 m_padDesign[layer].lPadWidth / 2.,
497 m_padDesign[layer].Size / 2. - m_padDesign[layer].yCutout / 2, m_padDesign[layer].yCutout / 2)); // pad and wires
498
499 } else {
500 m_surfaceData->m_surfBounds.push_back(std::make_unique<Trk::RotatedTrapezoidBounds>(m_etaDesign[layer].xSize() / 2.,
501 m_etaDesign[layer].minYSize() / 2.,
502 m_etaDesign[layer].maxYSize() / 2.)); // strips
503
504 m_surfaceData->m_surfBounds.push_back(std::make_unique<Trk::TrapezoidBounds>(m_padDesign[layer].sPadWidth /2.,
505 m_padDesign[layer].lPadWidth / 2.,
506 m_padDesign[layer].Size / 2.));
507
508
509 }
510
511 //-------------------
512 // Wires
513 //-------------------
514
515 // identifier of the first channel - wire plane - locX along phi, locY max->min R
516 Identifier id = m_idHelper.channelID(getStationName(), getStationEta(), getStationPhi(), m_ml, layer + 1, 2, 1);
517
518 m_surfaceData->m_layerSurfaces.push_back(std::make_unique<Trk::PlaneSurface>(*this, id));
519 m_surfaceData->m_layerTransforms.push_back(
520 absTransform() // transformation from chamber to ATLAS frame
521 * m_delta // transformations from the alignment group
522 * m_Xlg[layer] // x-shift of the gas-gap center w.r.t. quadruplet center
523 * Amg::getTranslateZ3D(m_offset) // z-shift to volume center (after m_delta!)
524 * Amg::getRotateY3D(-90 * CLHEP::deg) // x<->z because of GeoTrd definition
525 * Amg::getRotateZ3D(-90 * CLHEP::deg)); // x<->y for wires
526
527 m_surfaceData->m_layerCenters.emplace_back(m_surfaceData->m_layerTransforms.back().translation());
528 m_surfaceData->m_layerNormals.emplace_back(m_surfaceData->m_layerTransforms.back().linear() * Amg::Vector3D(0., 0., -1.));
529
530 //-------------------
531 // Strips
532 //-------------------
533
534 const double shift{layer%2 == 0 ? 0.01 : -0.01}; // 1st layer gets +0.01; layer numbering starts from 0 here!
535
536 // identifier of the first channel - strip plane
537 id = m_idHelper.channelID(getStationName(), getStationEta(), getStationPhi(), m_ml, layer + 1, 1, 1);
538
539 m_surfaceData->m_layerSurfaces.push_back(std::make_unique<Trk::PlaneSurface>(*this, id));
540
541 m_surfaceData->m_layerTransforms.push_back(absTransform() * m_delta * m_Xlg[layer] *Amg::Translation3D(shift, 0., m_offset)
542 *Amg::getRotateY3D(-90 * CLHEP::deg)); // x<->z because of GeoTrd definition
543
544 m_surfaceData->m_layerCenters.emplace_back(m_surfaceData->m_layerTransforms.back().translation());
545 m_surfaceData->m_layerNormals.emplace_back(m_surfaceData->m_layerTransforms.back().linear() * Amg::Vector3D(0., 0., -1.));
546
547 //-------------------
548 // Trigger Pads
549 //-------------------
550
551 // identifier of the first channel - pad plane
552 id = m_idHelper.channelID(getStationName(), getStationEta(), getStationPhi(), m_ml, layer + 1, 0, 1);
553
554 m_surfaceData->m_layerSurfaces.push_back(std::make_unique<Trk::PlaneSurface>(*this, id));
555
556 m_surfaceData->m_layerTransforms.push_back(absTransform() * m_delta * m_Xlg[layer] *
557 Amg::getTranslate3D(-shift, 0., m_offset)
558 * Amg::getRotateY3D(-90 * CLHEP::deg) // x<->z because of GeoTrd definition
559 * Amg::getRotateZ3D(-90 * CLHEP::deg)); // x<->y for pads
560
561 m_surfaceData->m_layerCenters.emplace_back(m_surfaceData->m_layerTransforms.back().translation());
562 m_surfaceData->m_layerNormals.emplace_back(m_surfaceData->m_layerTransforms.back().linear() * Amg::Vector3D(0., 0., -1.));
563 }
564 }
Amg::Transform3D getTranslate3D(const double X, const double Y, const double Z)
: Returns a shift transformation along an arbitrary axis
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Eigen::Matrix< double, 3, 1 > Vector3D
Amg::Transform3D getRotateY3D(double angle)
get a rotation transformation around Y-axis
Eigen::Translation< double, 3 > Translation3D
virtual void shift(size_t pos, ptrdiff_t offs) override
Shift the elements of the container.
@ layer
Definition HitInfo.h:79

◆ getALinePar()

const ALinePar * MuonGM::sTgcReadoutElement::getALinePar ( ) const
inline

◆ getBLinePar()

const BLinePar * MuonGM::sTgcReadoutElement::getBLinePar ( ) const
inline

◆ getDelta()

const Amg::Transform3D & MuonGM::sTgcReadoutElement::getDelta ( ) const
inline

read A-line parameters and include the chamber rotation/translation in the local-to-global (ATLAS) reference frame transformaton

Definition at line 182 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

182{ return m_delta; }

◆ getDesign() [1/2]

const MuonChannelDesign * MuonGM::sTgcReadoutElement::getDesign ( const Identifier & id) const
inline

returns the MuonChannelDesign class for the given identifier

Definition at line 279 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

279 {
280 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Strip) return &(m_etaDesign[m_idHelper.gasGap(id) - 1]);
281 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire) return &(m_phiDesign[m_idHelper.gasGap(id) - 1]);
282 return nullptr;
283 }

◆ getDesign() [2/2]

const MuonChannelDesign * MuonGM::sTgcReadoutElement::getDesign ( int gasGap,
int channelType ) const
inline

returns the MuonChannelDesign class

Definition at line 295 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

295 {
296 if (channelType == 1) return &(m_etaDesign[gasGap - 1]);
297 if (channelType == 2) return &(m_phiDesign[gasGap - 1]);
298 return 0;
299 }

◆ getLongRsize()

double MuonGM::MuonReadoutElement::getLongRsize ( ) const
inlineinherited

◆ getLongSsize()

double MuonGM::MuonReadoutElement::getLongSsize ( ) const
inlineinherited

◆ getLongZsize()

double MuonGM::MuonReadoutElement::getLongZsize ( ) const
inlineinherited

◆ getPadDesign() [1/3]

MuonPadDesign * MuonGM::sTgcReadoutElement::getPadDesign ( const Identifier & id)
inline

Definition at line 290 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

290 {
291 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) return &(m_padDesign[m_idHelper.gasGap(id) - 1]);
292 return nullptr;
293 }

◆ getPadDesign() [2/3]

const MuonPadDesign * MuonGM::sTgcReadoutElement::getPadDesign ( const Identifier & id) const
inline

returns the MuonChannelDesign class for the given identifier

Definition at line 285 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

285 {
286 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) return &(m_padDesign[m_idHelper.gasGap(id) - 1]);
287 return nullptr;
288 }

◆ getPadDesign() [3/3]

const MuonPadDesign * MuonGM::sTgcReadoutElement::getPadDesign ( int gasGap) const
inline

◆ getRsize()

double MuonGM::MuonReadoutElement::getRsize ( ) const
inlineinherited

◆ getSsize()

double MuonGM::MuonReadoutElement::getSsize ( ) const
inlineinherited

◆ getStationEta()

int MuonGM::MuonReadoutElement::getStationEta ( ) const
inlineinherited

◆ getStationIndex()

int MuonGM::MuonReadoutElement::getStationIndex ( ) const
inlineinherited

◆ getStationName()

const std::string & MuonGM::MuonReadoutElement::getStationName ( ) const
inlineinherited

◆ getStationPhi()

int MuonGM::MuonReadoutElement::getStationPhi ( ) const
inlineinherited

◆ getStationS()

double MuonGM::MuonReadoutElement::getStationS ( ) const
inlineinherited

◆ getStationType()

std::string MuonGM::MuonReadoutElement::getStationType ( ) const
inlineinherited

Definition at line 178 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

178{ return m_statname.substr(0,3); }

◆ getTechnologyName()

const std::string & MuonGM::MuonReadoutElement::getTechnologyName ( ) const
inlineinherited

Definition at line 177 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

177{ return m_techname; }
std::string m_techname
MDT or RPC or TGC or CSC plus a two digits subtype; example RPC17.

◆ getTechnologyType()

std::string MuonGM::MuonReadoutElement::getTechnologyType ( ) const
inlineinherited

Definition at line 176 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

176{ return m_techname.substr(0, 3); }

◆ getZsize()

double MuonGM::MuonReadoutElement::getZsize ( ) const
inlineinherited

◆ globalPosition()

const Amg::Vector3D MuonGM::MuonReadoutElement::globalPosition ( ) const
inherited

Definition at line 47 of file MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx.

47{ return absTransform().translation(); }

◆ GlobalToAmdbLRSCoords()

virtual Amg::Vector3D MuonGM::sTgcReadoutElement::GlobalToAmdbLRSCoords ( const Amg::Vector3D & x) const
inlinefinaloverridevirtual

◆ GlobalToAmdbLRSTransform()

virtual Amg::Transform3D MuonGM::sTgcReadoutElement::GlobalToAmdbLRSTransform ( ) const
inlinefinaloverridevirtual

◆ has_ALines()

bool MuonGM::sTgcReadoutElement::has_ALines ( ) const
inline

Definition at line 191 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

191{ return (m_ALinePar != nullptr); }

◆ has_BLines()

bool MuonGM::sTgcReadoutElement::has_BLines ( ) const
inline

Definition at line 192 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

192{ return (m_BLinePar != nullptr); }

◆ hasCutouts()

bool MuonGM::MuonReadoutElement::hasCutouts ( ) const
inlineinherited

◆ identify()

Identifier MuonGM::MuonReadoutElement::identify ( ) const
inlinefinaloverridevirtualinherited

Returns the ATLAS Identifier of the MuonReadOutElement.

Usually the Identifier corresponds to the first channel covered by the Element

Implements Trk::TrkDetElementBase.

Definition at line 173 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

173{ return m_id; }

◆ identifyHash()

IdentifierHash MuonGM::MuonReadoutElement::identifyHash ( ) const
inlinefinaloverridevirtualinherited

Returns the IdentifierHash of the MuonStation, i.e.

2 readoutelements with same sationIndex, stationEta, stationPhi have the same identifiyHash

Implements Trk::TrkDetElementBase.

Definition at line 174 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

174{ return m_idhash; }

◆ idHelperSvc()

const Muon::IMuonIdHelperSvc * MuonGM::MuonReadoutElement::idHelperSvc ( ) const
inlineinherited

◆ initDesign()

void MuonGM::sTgcReadoutElement::initDesign ( double thickness)

initialize the design classes for this readout element

Definition at line 455 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

455 {
456
457
458
459 SmartIF<IGeoDbTagSvc> geoDbTag{Gaudi::svcLocator()->service("GeoDbTagSvc")};
460 if (!geoDbTag) THROW_EXCEPTION_RE( "Could not locate GeoDbTagSvc" );
461 if (geoDbTag->getSqliteReader()) initDesignFromSQLite(thickness);
462 else initDesignFromAGDD(thickness);
463
464 }

◆ initDesignFromAGDD()

void MuonGM::sTgcReadoutElement::initDesignFromAGDD ( double thickness)
private

Definition at line 281 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

281 {
282
283 if (manager()->MinimalGeoFlag() == 0) {
284 PVConstLink pvc {getMaterialGeom()};
285 unsigned int nchildvol = pvc->getNChildVols();
286 int llay = 0;
287 std::string::size_type npos;
288 for (unsigned ich = 0; ich < nchildvol; ++ich) {
289 PVConstLink pc = pvc->getChildVol(ich);
290 std::string childname = (pc->getLogVol())->getName();
291
292 ATH_MSG_DEBUG("Volume Type: " << pc->getLogVol()->getShape()->type());
293 if ((npos = childname.find("Sensitive")) == std::string::npos) {
294 continue;
295 }
296 ++llay;
297 if (llay > 4) {
298 ATH_MSG_DEBUG("number of sTGC layers > 4: increase transform array size");
299 continue;
300 }
301 m_Xlg[llay - 1] = pvc->getXToChildVol(ich);
302 }
303 assert(m_nlayers == llay);
304 }
305 char sector_l = getStationName().substr(2, 1) == "L" ? 'L' : 'S';
306 int stEta = std::abs(getStationEta());
307 int Etasign = getStationEta() / stEta;
308 std::string side = (Etasign > 0) ? "A" : "C";
309 m_diamondShape = sector_l == 'L' && stEta == 3;
310
311 ATH_MSG_DEBUG("station name" << getStationName());
312
313 sTGCDetectorHelper aHelper;
314 sTGCDetectorDescription* stgc = aHelper.Get_sTGCDetector(sector_l, stEta, getStationPhi(), m_ml, side.back());
315
316 ATH_MSG_DEBUG( "Found sTGC Detector " << stgc->GetName() );
317
318 MuonGM::sTGC_Technology *tech = stgc->GetTechnology();
319 if (!tech) THROW_EXCEPTION_RE(" Failed To get Technology for stgc element:"<< stgc->GetName());
320
321
322 // Get Chamber length, width and frame widths
323 setSsize(stgc->sWidth()); // bottom base length (full chamber)
324 setLongSsize(stgc->lWidth()); // top base length (full chamber)
325 setRsize(stgc->Length()); // height of the trapezoid (full chamber)
326 setZsize(stgc->Tck()); // thickness (full chamber)
327 double ysFrame = stgc->ysFrame(); // Frame thickness on short parallel edge
328 double ylFrame = stgc->ylFrame(); // Frame thickness on long parallel edge
329 double xFrame = stgc->xFrame(); // Frame thickness of non parallel edges
330 double yCutout = stgc->yCutoutCathode(); // y of cutout of trapezoid (only in outermost detectors)
331 sTGCReadoutParameters roParam = stgc->GetReadoutParameters();
332
333
334 // Radial shift of the local frame origin w.r.t. the center of the quadruplet.
335 // For diamond shape (QL3) the origin is on the cutout base. For the rest, the it is at the center
336 // of the active area, therefore the shift is half the difference of the top and bottom frame widths.
337 m_offset = (m_diamondShape) ? 0.5*getRsize() - (yCutout + ylFrame) : -0.5*(ylFrame - ysFrame);
338
339 //-------------------
340 // Strips
341 //-------------------
342 for (int il = 0; il < m_nlayers; il++) {
343 // identifier of the first channel - strip plane - to retrieve max number of strips
346 if (yCutout == 0.) {
347 m_etaDesign[il].defineTrapezoid(0.5 * roParam.sStripWidth,
348 0.5 * roParam.lStripWidth,
349 0.5 * (getRsize() - ysFrame - ylFrame));
350 } else {
351 m_etaDesign[il].defineDiamond(0.5 * roParam.sStripWidth,
352 0.5 * roParam.lStripWidth,
353 0.5 * (getRsize() - ysFrame - ylFrame), yCutout);
354 }
355 m_etaDesign[il].inputPitch = stgc->stripPitch();
356 m_etaDesign[il].inputWidth = stgc->stripWidth();
357 m_etaDesign[il].thickness = tech->gasThickness;
358 m_etaDesign[il].firstPitch = roParam.firstStripWidth[il];
359 m_etaDesign[il].setFirstPos((m_diamondShape) ? -(m_etaDesign[il].xSize()- yCutout) + m_etaDesign[il].firstPitch
360 : -0.5 * m_etaDesign[il].xSize()+ m_etaDesign[il].firstPitch);
361 m_etaDesign[il].nch = roParam.nStrips;
362
363 ATH_MSG_DEBUG("initDesign:" << getStationName() << " layer " << il
364 << ", strip pitch " << m_etaDesign[il].inputPitch
365 << ", nstrips " << m_etaDesign[il].nch
366 << ", firstPos: " << m_etaDesign[il].firstPos() );
367 }
368
369 //-------------------
370 // Wires
371 //-------------------
372 for (int il = 0; il < m_nlayers; il++) {
375 if (yCutout == 0.) {
376 m_phiDesign[il].defineTrapezoid(0.5 * roParam.sPadWidth,
377 0.5 * roParam.lPadWidth,
378 0.5 * (getRsize() - ysFrame - ylFrame) );
379 } else {
380 m_phiDesign[il].defineDiamond(0.5 * roParam.sPadWidth,
381 0.5 * roParam.lPadWidth,
382 0.5 * (getRsize() - ysFrame - ylFrame), yCutout);
383 }
384 m_phiDesign[il].inputPitch = stgc->wirePitch();
385 m_phiDesign[il].inputWidth = 0.015;
386 m_phiDesign[il].thickness = getZsize();
387 m_phiDesign[il].setFirstPos(roParam.firstWire[il]); // Position of 1st wire, accounts for staggering
388 m_phiDesign[il].firstPitch = roParam.firstWireGroup[il]; // Number of Wires in 1st group, group staggering
389 m_phiDesign[il].groupWidth = roParam.wireGroupWidth; // Number of Wires normal group
390 m_phiDesign[il].nGroups = roParam.nWireGroups[il]; // Number of Wire Groups
391 m_phiDesign[il].wireCutout = roParam.wireCutout[il]; // Size of "active" wire region for digits
392 m_phiDesign[il].nch = roParam.nWires[il];
393
394 ATH_MSG_DEBUG( "initDesign:" << getStationName() << " layer " << il << ", wireGang pitch "
395 << m_phiDesign[il].inputPitch << ", nWireGangs " << m_phiDesign[il].nch );
396 }
397
398 //-------------------
399 // Pads
400 //-------------------
401 double radius = absTransform().translation().perp() + m_offset;
402 for (int il = 0; il < m_nlayers; il++) {
403 m_padDesign[il].Length = getRsize();
404 m_padDesign[il].sWidth = getSsize();
405 m_padDesign[il].lWidth = getLongSsize();
406 m_padDesign[il].Size = getRsize() - ylFrame - ysFrame;
407 m_padDesign[il].xFrame = xFrame;
408 m_padDesign[il].ysFrame = ysFrame;
409 m_padDesign[il].ylFrame = ylFrame;
410 m_padDesign[il].yCutout = yCutout;
411 m_padDesign[il].etasign = Etasign;
412 m_padDesign[il].setR(radius);
413 m_padDesign[il].sPadWidth = roParam.sPadWidth;
414 m_padDesign[il].lPadWidth = roParam.lPadWidth;
415 m_padDesign[il].nPadColumns = roParam.nPadPhi[il];
416
417 // The C side of the NSW is mirrored instead of rotated
418 // We should be using the same values for the pads for both A and C
419 // It is easier for us to simply read the same correct value once
420 // whereas changing the XML and the reading functions will make this incompatible with past versions
421 // Alexandre Laurier 12 Sept 2018
422 m_padDesign[il].firstPhiPos = roParam.firstPadPhiDivision_A[il];
423 m_padDesign[il].inputPhiPitch = roParam.anglePadPhi; // stEta<2 ? PAD_PHI_DIVISION/PAD_PHI_SUBDIVISION : PAD_PHI_DIVISION ;
424 m_padDesign[il].PadPhiShift = roParam.PadPhiShift_A[il];
425 m_padDesign[il].padEtaMin = roParam.firstPadRow[il]; // FIRST_PAD_ROW_DIVISION[2*sector+(m_ml-1)][stEta-1][il];
426 m_padDesign[il].nPadH = roParam.nPadH[il];
427 m_padDesign[il].padEtaMax = m_padDesign[il].padEtaMin + roParam.nPadH[il]; // PAD_ROWS[2*sector+(m_ml-1)][stEta-1][il];
428 m_padDesign[il].firstRowPos = roParam.firstPadH[il]; // H_PAD_ROW_0[2*sector+(m_ml-1)][il];
429 m_padDesign[il].inputRowPitch = roParam.padH[il]; // PAD_HEIGHT[2*sector+(m_ml-1)][il];
430
431 if (sector_l == 'L') {
432 m_padDesign[il].isLargeSector = 1;
433 m_padDesign[il].sectorOpeningAngle = m_padDesign[il].largeSectorOpeningAngle;
434 } else {
435 m_padDesign[il].isLargeSector = 0;
436 m_padDesign[il].sectorOpeningAngle = m_padDesign[il].smallSectorOpeningAngle;
437 }
438
439 m_padDesign[il].thickness = thickness;
440
441 ATH_MSG_DEBUG( "initDesign: " << idHelperSvc()->toStringDetEl(identify())
442 << " layer " << il<< ", pad phi angular width "
443 << m_padDesign[il].inputPhiPitch << ", eta pad size " << m_padDesign[il].inputRowPitch
444 << " Length: " << m_padDesign[il].Length << " sWidth: " << m_padDesign[il].sWidth
445 << " lWidth: " << m_padDesign[il].lWidth << " firstPhiPos:" << m_padDesign[il].firstPhiPos
446 << " padEtaMin:" << m_padDesign[il].padEtaMin << " padEtaMax:" << m_padDesign[il].padEtaMax
447 << " firstRowPos:" << m_padDesign[il].firstRowPos << " inputRowPitch:" << m_padDesign[il].inputRowPitch
448 << " thickness:" << m_padDesign[il].thickness << " sPadWidth: " << m_padDesign[il].sPadWidth
449 << " lPadWidth: " << m_padDesign[il].lPadWidth << " xFrame: " << m_padDesign[il].xFrame
450 << " ysFrame: " << m_padDesign[il].ysFrame << " ylFrame: " << m_padDesign[il].ylFrame
451 << " yCutout: " << m_padDesign[il].yCutout );
452 }
453 }
#define ATH_MSG_DEBUG(x)
const std::string & GetName() const
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
sTGCReadoutParameters & GetReadoutParameters()
MuonGM::sTGC_Technology * GetTechnology()
sTGCDetectorDescription * Get_sTGCDetector(char type, int ieta, int iphi, int layer=1, char side='A')
std::vector< int > firstWireGroup
std::vector< double > firstPadPhiDivision_A
std::vector< double > firstStripWidth
std::vector< double > firstPadH
std::vector< double > firstWire
std::vector< double > padH
std::vector< double > wireCutout
std::vector< double > PadPhiShift_A
std::vector< double > nPadH

◆ initDesignFromSQLite()

void MuonGM::sTgcReadoutElement::initDesignFromSQLite ( double thickness)
private

Definition at line 79 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

79 {
80
81 PVConstLink pvc {getMaterialGeom()};
82 auto sensitiveVol = getAllSubVolumes(pvc,[](const GeoChildNodeWithTrf& node){
83 return node.nodeName.find("Gas") != std::string::npos;
84 });
85 assert(sensitiveVol.size() == m_nlayers);
86 for (unsigned int llay = 0; llay< sensitiveVol.size(); ++llay) {
87 m_Xlg[llay] = sensitiveVol[llay].transform;
88 }
89
90 SmartIF<IGeoDbTagSvc> geoDbTag{Gaudi::svcLocator()->service("GeoDbTagSvc")};
91 SmartIF<IRDBAccessSvc> accessSvc{Gaudi::svcLocator()->service(geoDbTag->getParamSvcName())};
92
93 IRDBRecordset_ptr nswdimRec = accessSvc->getRecordsetPtr("NSWDIM","","");
94 IRDBRecordset_ptr wstgcRec = accessSvc->getRecordsetPtr("WSTGC","","");
95 IRDBRecordset_ptr nswPars = accessSvc->getRecordsetPtr("NSWPARS","","");
96
97 PVConstLink parent = getMaterialGeom()->getParent();
98 unsigned int index=parent->indexOf(getMaterialGeom()).value();
99 std::string pVName=parent->getNameOfChildVol(index);
100 float yCutoutCathode(0);
101 if (nswPars->size()==0) {
102 THROW_EXCEPTION_RE("Error, cannot access NSWPARS record!");
103 } else {
104 yCutoutCathode=(*nswPars)[0]->getFloat("NSW_sTGC_yCutoutCathode");
105 }
106
107 for (size_t w=0;w<nswdimRec->size();w++) {
108 const IRDBRecord *nswdim = (*nswdimRec)[w];
109 const std::string type = nswdim->getString("NSW_TYPE").substr(5,4);
110 std::string logVolSubName=getMaterialGeom()->getLogVol()->getName().substr(7,4);
111 if (type==logVolSubName) {
112 setSsize(nswdim->getDouble("BASE_WIDTH")); // bottom base length (full chamber)
113 setLongSsize(nswdim->getDouble("TOP_WIDTH")); // top base length (full chamber)
114 setRsize(nswdim->getDouble("LENGTH")); // height of the trapezoid (full chamber)
115 break;
116 }
117 }
118
119 for (unsigned int ind = 0; ind < wstgcRec->size(); ind++) {
120 std::string WSTGC_TYPE = (*wstgcRec)[ind]->getString("WSTGC_TYPE");
121 if (WSTGC_TYPE.size()<=8)
122 THROW_EXCEPTION_RE("Malformed WSTGC_TYPE = " << WSTGC_TYPE);
123 if (getStationName()[2] != WSTGC_TYPE[6]) continue;
124 if (std::abs(getStationEta()) != static_cast<int>(WSTGC_TYPE[7]-'0')) continue;
125 if (getStationName()[2] == 'S' && WSTGC_TYPE[8] != (m_ml ==2 ?'P' : 'C')) continue;
126 if (getStationName()[2] == 'L' && WSTGC_TYPE[8] != (m_ml ==2 ?'C' : 'P')) continue;
127
128 const double gasTck = (*wstgcRec)[ind]->getDouble("gasTck");
129 const double Tck = (*wstgcRec)[ind]->getDouble("Tck");
130 const double xFrame = (*wstgcRec)[ind]->getDouble("xFrame");
131 const double ylFrame = (*wstgcRec)[ind]->getDouble("ylFrame");
132 const double ysFrame = (*wstgcRec)[ind]->getDouble("ysFrame");
133 const double wirePitch = (*wstgcRec)[ind]->getDouble("wirePitch");
134 const double stripPitch = (*wstgcRec)[ind]->getDouble("stripPitch");
135 const double stripWidth = (*wstgcRec)[ind]->getDouble("stripWidth");
136 const double sPadWidth = (*wstgcRec)[ind]->getDouble("sPadWidth");
137 const double lPadWidth = (*wstgcRec)[ind]->getDouble("lPadWidth");
138 const double anglePadPhi = (*wstgcRec)[ind]->getDouble("anglePadPhi");
139 const double sStripWidth = (*wstgcRec)[ind]->getDouble("sStripWidth");
140 const double lStripWidth = (*wstgcRec)[ind]->getDouble("lStripWidth");
141 const int wireGroupWidth = (*wstgcRec)[ind]->getInt("wireGroupWidth");
142 const int nStrips = (*wstgcRec)[ind]->getInt("nStrips");
143 const std::vector<double> padH = tokenizeDouble((*wstgcRec)[ind]->getString("padH"),";");
144 const std::vector<int> nPadPhi = tokenizeInt((*wstgcRec)[ind]->getString("nPadPhi"),";");
145 const std::vector<double> firstPadPhiDivision_A = tokenizeDouble((*wstgcRec)[ind]->getString("firstPadPhiDivision_A"),";");
146 const std::vector<double> PadPhiShift_A = tokenizeDouble((*wstgcRec)[ind]->getString("PadPhiShift_A"),";");
147 const std::vector<int> nPadH = tokenizeInt((*wstgcRec)[ind]->getString("nPadH"),";");
148 const std::vector<double> firstPadH = tokenizeDouble((*wstgcRec)[ind]->getString("firstPadH"),";");
149 const std::vector<double> firstPadRow = tokenizeDouble((*wstgcRec)[ind]->getString("firstPadRow"),";");
150 const std::vector<double> wireCutout = tokenizeDouble((*wstgcRec)[ind]->getString("wireCutout"),";");
151 const std::vector<int> nWires = tokenizeInt((*wstgcRec)[ind]->getString("nWires"),";");
152 const std::vector<int> firstWire = tokenizeInt((*wstgcRec)[ind]->getString("firstWire"),";");
153 const std::vector<double> firstStripWidth = tokenizeDouble((*wstgcRec)[ind]->getString("firstStripWidth"),";");
154 const std::vector<int> nWireGroups = tokenizeInt((*wstgcRec)[ind]->getString("nWireGroups"),";");
155 const std::vector<double> firstWireGroup = tokenizeDouble((*wstgcRec)[ind]->getString("firstWireGroup"),";");
156
157 char sector_l = getStationName()[2];
158 int stEta = std::abs(getStationEta());
159 int Etasign = getStationEta() / stEta;
160 std::string side = (Etasign > 0) ? "A" : "C";
161 m_diamondShape = sector_l == 'L' && stEta == 3;
162
163
164 // Get frame widths
165 setZsize(Tck); // thickness (full chamber)
166
167 double yCutout = m_diamondShape ? yCutoutCathode: 0.0; // y of cutout of trapezoid (only in outermost detectors)
168
169
170 // Radial shift of the local frame origin w.r.t. the center of the quadruplet.
171 // For diamond shape (QL3) the origin is on the cutout base. For the rest, the it is at the center
172 // of the active area, therefore the shift is half the difference of the top and bottom frame widths.
173 m_offset = (m_diamondShape) ? 0.5*getRsize() - (yCutout + ylFrame) : -0.5*(ylFrame - ysFrame);
174
175 //-------------------
176 // Strips
177 //-------------------
178 for (int il = 0; il < m_nlayers; il++) {
181 if (yCutout == 0.) {
182 m_etaDesign[il].defineTrapezoid(0.5 * sStripWidth,
183 0.5 * lStripWidth,
184 0.5 * (getRsize() - ysFrame - ylFrame));
185 } else {
186 m_etaDesign[il].defineDiamond(0.5 * sStripWidth,
187 0.5 * lStripWidth,
188 0.5 * (getRsize() - ysFrame - ylFrame), yCutout);
189 }
190 m_etaDesign[il].inputPitch = stripPitch;
191 m_etaDesign[il].inputWidth = stripWidth;
192 m_etaDesign[il].thickness = gasTck;
193 m_etaDesign[il].firstPitch = firstStripWidth[il];
194 m_etaDesign[il].setFirstPos(m_diamondShape ? -(m_etaDesign[il].xSize()- yCutout) + m_etaDesign[il].firstPitch
195 : -0.5 * m_etaDesign[il].xSize()+ m_etaDesign[il].firstPitch);
196 m_etaDesign[il].nch = nStrips;
197 }
198
199 //-------------------
200 // Wires
201 //-------------------
202 for (int il = 0; il < m_nlayers; il++) {
205 if (yCutout == 0.) {
206 m_phiDesign[il].defineTrapezoid(0.5 * sPadWidth,
207 0.5 * lPadWidth,
208 0.5 * (getRsize() - ysFrame - ylFrame) );
209 } else {
210 m_phiDesign[il].defineDiamond(0.5 * sPadWidth,
211 0.5 * lPadWidth,
212 0.5 * (getRsize() - ysFrame - ylFrame), yCutout);
213 }
214 m_phiDesign[il].inputPitch = wirePitch;
215 m_phiDesign[il].inputWidth = 0.015;
216 m_phiDesign[il].thickness = getZsize();
217 m_phiDesign[il].setFirstPos(firstWire[il]); // Position of 1st wire, accounts for staggering
218 m_phiDesign[il].firstPitch = firstWireGroup[il]; // Number of Wires in 1st group, group staggering
219 m_phiDesign[il].groupWidth = wireGroupWidth; // Number of Wires normal group
220 m_phiDesign[il].nGroups = nWireGroups[il]; // Number of Wire Groups
221 m_phiDesign[il].wireCutout = wireCutout[il]; // Size of "active" wire region for digits
222 m_phiDesign[il].nch = nWires[il];
223
224 }
225
226 //-------------------
227 // Pads
228 //-------------------
229 double radius = absTransform().translation().perp() + m_offset;
230 for (int il = 0; il < m_nlayers; il++) {
231 m_padDesign[il].Length = getRsize();
232 m_padDesign[il].sWidth = getSsize();
233 m_padDesign[il].lWidth = getLongSsize();
234 m_padDesign[il].Size = getRsize() - ylFrame - ysFrame;
235 m_padDesign[il].xFrame = xFrame;
236 m_padDesign[il].ysFrame = ysFrame;
237 m_padDesign[il].ylFrame = ylFrame;
238 m_padDesign[il].yCutout = yCutout;
239 m_padDesign[il].etasign = Etasign;
240 m_padDesign[il].setR(radius);
241 m_padDesign[il].sPadWidth = sPadWidth;
242 m_padDesign[il].lPadWidth = lPadWidth;
243
244 m_padDesign[il].nPadColumns = nPadPhi[il];
245
246 // The C side of the NSW is mirrored instead of rotated
247 // We should be using the same values for the pads for both A and C
248 // It is easier for us to simply read the same correct value once
249 // whereas changing the XML and the reading functions will make this incompatible with past versions
250 // Alexandre Laurier 12 Sept 2018
251 m_padDesign[il].firstPhiPos= firstPadPhiDivision_A[il];
252 m_padDesign[il].inputPhiPitch = anglePadPhi; // stEta<2 ? PAD_PHI_DIVISION/PAD_PHI_SUBDIVISION : PAD_PHI_DIVISION ;
253 m_padDesign[il].PadPhiShift= PadPhiShift_A[il];
254 m_padDesign[il].padEtaMin = firstPadRow[il]; // FIRST_PAD_ROW_DIVISION[2*sector+(m_ml-1)][stEta-1][il];
255 m_padDesign[il].nPadH = nPadH[il];
256 m_padDesign[il].padEtaMax = m_padDesign[il].padEtaMin + m_padDesign[il].nPadH; // PAD_ROWS[2*sector+(m_ml-1)][stEta-1][il];
257 m_padDesign[il].firstRowPos = firstPadH[il]; // H_PAD_ROW_0[2*sector+(m_ml-1)][il];
258 m_padDesign[il].inputRowPitch = padH[il]; // PAD_HEIGHT[2*sector+(m_ml-1)][il];
259
260 if (sector_l == 'L') {
261 m_padDesign[il].isLargeSector = 1;
262 m_padDesign[il].sectorOpeningAngle = m_padDesign[il].largeSectorOpeningAngle;
263 } else {
264 m_padDesign[il].isLargeSector = 0;
265 m_padDesign[il].sectorOpeningAngle = m_padDesign[il].smallSectorOpeningAngle;
266 }
267 m_padDesign[il].thickness = thickness;
268 ATH_MSG_DEBUG("initDesign: " << idHelperSvc()->toStringDetEl(identify()) << " layer " << il << ", pad phi angular width "
269 << m_padDesign[il].inputPhiPitch << ", eta pad size " << m_padDesign[il].inputRowPitch
270 << " Length: " << m_padDesign[il].Length << " sWidth: " << m_padDesign[il].sWidth
271 << " lWidth: " << m_padDesign[il].lWidth << " firstPhiPos:" << m_padDesign[il].firstPhiPos
272 << " padEtaMin:" << m_padDesign[il].padEtaMin << " padEtaMax:" << m_padDesign[il].padEtaMax
273 << " firstRowPos:" << m_padDesign[il].firstRowPos << " inputRowPitch:" << m_padDesign[il].inputRowPitch
274 << " thickness:" << m_padDesign[il].thickness << " sPadWidth: " << m_padDesign[il].sPadWidth
275 << " lPadWidth: " << m_padDesign[il].lPadWidth << " xFrame: " << m_padDesign[il].xFrame
276 << " ysFrame: " << m_padDesign[il].ysFrame << " ylFrame: " << m_padDesign[il].ylFrame
277 << " yCutout: " << m_padDesign[il].yCutout );
278 }
279 }
280 }
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
virtual double getDouble(std::string_view fieldName) const =0
Get double field value.
virtual const std::string & getString(std::string_view fieldName) const =0
Get string field value.
virtual unsigned int size() const =0
std::vector< double > tokenizeDouble(std::string_view the_str, std::string_view delimiter)
std::vector< int > tokenizeInt(std::string_view str, std::string_view delimiter)
str index
Definition DeMoScan.py:362
int nStrips(const MuonGM::TgcReadoutElement &readoutEle, int layer)

◆ initMessaging()

void AthMessaging::initMessaging ( ) const
privateinherited

Initialize our message level and MessageSvc.

This method should only be called once.

Definition at line 39 of file AthMessaging.cxx.

40{
42 // If user did not set an explicit level, set a default
43 if (m_lvl == MSG::NIL) {
44 m_lvl = m_imsg ?
45 static_cast<MSG::Level>( m_imsg.load()->outputLevel(m_nm) ) :
46 MSG::INFO;
47 }
48}
std::string m_nm
Message source name.
std::atomic< IMessageSvc * > m_imsg
MessageSvc pointer.
std::atomic< MSG::Level > m_lvl
Current logging level.
IMessageSvc * getMessageSvc(bool quiet=false)

◆ isEtaZero()

bool MuonGM::sTgcReadoutElement::isEtaZero ( const Identifier & id,
const Amg::Vector2D & localPosition ) const
inline

is eta=0 of QL1 or QS1?

Support for Strip and Pad cathodes is valid when the Strip, Pad and Wire surfaces have the same dimensions.

Definition at line 382 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

382 {
383 // False if not a QL1 or QS1 quadruplet
384 if (std::abs(m_idHelper.stationEta(id)) != 1) return false;
385 const MuonChannelDesign* wireDesign = (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire) ?
386 getDesign(id) :
387 getDesign(m_idHelper.channelID(id,
388 m_idHelper.multilayer(id),
390 sTgcIdHelper::sTgcChannelTypes::Wire,
391 1));
392 if (!wireDesign) {
393 ATH_MSG_WARNING("Cannot determine whether the pos "<<Amg::toString(localPosition)<<" is etaZero() for "
394 <<idHelperSvc()->toString(id));
395 return false;
396 }
397
398 // Require the x coordinate for strips, and the y coordinate for wires and pads
399 double lpos = (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Strip) ?
400 localPosition.x() : localPosition.y();
401 if (lpos < 0.5 * wireDesign->xSize() - wireDesign->wireCutout) return true;
402
403 return false;
404 }
if(pathvar)
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.

◆ largeSector()

bool MuonGM::MuonReadoutElement::largeSector ( ) const
inherited

Definition at line 49 of file MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx.

49 {
50 // this doesn't apply to TGC
51 if(m_statname.size() >= 3){
52 char c = m_statname[2];
53 if (c == 'L')
54 return true;
55 else if (c == 'S')
56 return false;
57 else {
58 if (c == 'E' || c == 'F' || c == 'G') return false;
59 if (c == 'M' || c == 'R') return true;
60 }
61 }
62 ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" largeSector() - is this station a larger sector answer is no for readout element "<<m_idHelperSvc->toStringDetEl(identify()));
63 throw std::runtime_error("Unknown sector");
64 return false;
65 }

◆ layerHash()

int MuonGM::sTgcReadoutElement::layerHash ( const Identifier & id) const
inlineoverridevirtual

returns the hash to be used to look up the normal and center in the MuonClusterReadoutElement tracking cache

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 265 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

265 {
266 return surfaceHash(id); // don't have a choice here : rewrite MuonClusterReadoutElement first
267 }
virtual int surfaceHash(const Identifier &id) const override final
returns the hash to be used to look up the surface and transform in the MuonClusterReadoutElement tra...

◆ localToGlobalCoords()

Amg::Vector3D MuonGM::sTgcReadoutElement::localToGlobalCoords ( const Amg::Vector3D & locPos,
Identifier id ) const

simHit local (SD) To Global position - to be used by MuonGeoAdaprors only

Definition at line 709 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

709 {
710 int gg = m_idHelper.gasGap(id);
711 int channelType = m_idHelper.channelType(id);
712
713 // The assigned coordinate along the layer normal is at the center of the gas gap;
714 // wires are considered at x=0, while:
715 // for layers 1, 3 strips (pads) are shifted by +10 (-10) microns
716 // for layers 2, 4 strips (pads) are shifted by -10 (+10) microns
717 double shift{0.};
718 if (channelType != 2) shift = ((gg % 2) ^ (channelType==0)) ? 0.01 : -0.01;
719 const Amg::Vector3D locPos_ML = m_Xlg[gg - 1] * Amg::getTranslate3D(shift, 0., m_offset) * locPos;
720
721 ATH_MSG_DEBUG( "position coordinates in the gas-gap r.f.: " << Amg::toString(locPos) );
722 ATH_MSG_DEBUG( "position coordinates in the multilayer r.f.: " << Amg::toString(locPos_ML) );
723 return absTransform() * m_delta * locPos_ML;
724 }

◆ manager()

const MuonDetectorManager * MuonGM::MuonReadoutElement::manager ( ) const
inlineprotectedinherited

◆ maxPadNumber()

int MuonGM::sTgcReadoutElement::maxPadNumber ( const Identifier & layerId) const
inline

Get largest pad number, which is different to the number of pads in a gas volume due to the pad numbering in Athena.

Definition at line 427 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

427 {
428 const MuonPadDesign* design = getPadDesign(layerId);
429 if (!design) {
430 ATH_MSG_WARNING("no pad design found when trying to get the largest pad number "<<idHelperSvc()->toString(layerId));
431 return 0;
432 }
433 return (design->nPadColumns - 1) * m_idHelper.padEtaMax() + design->nPadH;
434 }

◆ measuresPhi()

bool MuonGM::sTgcReadoutElement::measuresPhi ( const Identifier & id) const
inlinefinaloverridevirtual

returns whether the current identifier corresponds to a phi measurement

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 275 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

275 {
276 return (m_idHelper.channelType(id) != sTgcIdHelper::sTgcChannelTypes::Strip);
277 }

◆ msg() [1/2]

MsgStream & AthMessaging::msg ( ) const
inlineinherited

The standard message stream.

Returns a reference to the default message stream May not be invoked before sysInitialize() has been invoked.

Definition at line 167 of file AthMessaging.h.

168{
169 MsgStream* ms = m_msg_tls.get();
170 if (!ms) {
171 if (!m_initialized.test_and_set()) initMessaging();
172 ms = new MsgStream(m_imsg,m_nm);
173 m_msg_tls.reset( ms );
174 }
175
176 ms->setLevel (m_lvl);
177 return *ms;
178}
boost::thread_specific_ptr< MsgStream > m_msg_tls
MsgStream instance (a std::cout like with print-out levels).
void initMessaging() const
Initialize our message level and MessageSvc.

◆ msg() [2/2]

MsgStream & AthMessaging::msg ( const MSG::Level lvl) const
inlineinherited

The standard message stream.

Returns a reference to the default message stream May not be invoked before sysInitialize() has been invoked.

Definition at line 182 of file AthMessaging.h.

183{ return msg() << lvl; }
MsgStream & msg() const
The standard message stream.

◆ msgLvl()

bool AthMessaging::msgLvl ( const MSG::Level lvl) const
inlineinherited

Test the output level.

Parameters
lvlThe message level to test against
Returns
boolean Indicating if messages at given level will be printed
Return values
trueMessages at level "lvl" will be printed

Definition at line 151 of file AthMessaging.h.

152{
153 // If user did not set explicit message level we have to initialize
154 // the messaging and retrieve the default via the MessageSvc.
155 if (m_lvl==MSG::NIL && !m_initialized.test_and_set()) initMessaging();
156
157 if (m_lvl <= lvl) {
158 msg() << lvl;
159 return true;
160 } else {
161 return false;
162 }
163}

◆ normal() [1/3]

const Amg::Vector3D & MuonGM::MuonClusterReadoutElement::normal ( ) const
inlineoverridevirtualinherited

Return the normal of the element.

Implements Trk::TrkDetElementBase.

Definition at line 126 of file MuonClusterReadoutElement.h.

126{ return normal(0); }
virtual const Amg::Vector3D & normal() const override
Return the normal of the element.

◆ normal() [2/3]

const Amg::Vector3D & MuonGM::MuonClusterReadoutElement::normal ( const Identifier & id) const
inlineoverridevirtualinherited

Return the normal of the surface associated with this identifier In the case of silicon it returns the same as normal().

Implements Trk::TrkDetElementBase.

Definition at line 132 of file MuonClusterReadoutElement.h.

132{ return normal(layerHash(id)); }

◆ normal() [3/3]

const Amg::Vector3D & MuonGM::MuonClusterReadoutElement::normal ( int layHash) const
inlineinherited

Definition at line 173 of file MuonClusterReadoutElement.h.

173 {
174 if (!m_surfaceData) {
175 ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" "<<__func__<<" Requesting normal but cache is empty");
176 throw std::runtime_error("Empty normal cache");
177 }
178 if (hash == -1 || hash >= (int)m_surfaceData->m_layerNormals.size()) {
179 ATH_MSG_WARNING("normal hash out of range: " << hash << " elements " << m_surfaceData->m_layerNormals.size());
180 return m_surfaceData->m_layerNormals.front();
181 }
182 return m_surfaceData->m_layerNormals[hash];
183 }

◆ numberOfLayers()

int MuonGM::sTgcReadoutElement::numberOfLayers ( bool ) const
inlinefinaloverridevirtual

number of layers in phi/eta projection

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 406 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

406{ return m_nlayers; }

◆ numberOfPads()

int MuonGM::sTgcReadoutElement::numberOfPads ( const Identifier & layerId) const
inline

Get the number of pad per layer.

Definition at line 418 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

418 {
419 const MuonPadDesign* design = getPadDesign(layerId);
420 if (!design) {
421 ATH_MSG_WARNING("no pad design found when trying to get the number of pads "<<idHelperSvc()->toString(layerId));
422 return 0;
423 }
424 return design->nPadColumns * design->nPadH;
425 }

◆ numberOfStrips() [1/2]

int MuonGM::sTgcReadoutElement::numberOfStrips ( const Identifier & layerId) const
inlinefinaloverridevirtual

number of strips per layer

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 408 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

408 {
409 return numberOfStrips(m_idHelper.gasGap(layerId) - 1,
410 m_idHelper.channelType(layerId) == sTgcIdHelper::sTgcChannelTypes::Wire);
411 }
virtual int numberOfStrips(const Identifier &layerId) const override final
number of strips per layer

◆ numberOfStrips() [2/2]

int MuonGM::sTgcReadoutElement::numberOfStrips ( int lay,
bool measuresPhi ) const
inlinefinaloverridevirtual

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 413 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

413 {
414 if (lay > -1 && lay < m_nlayers) { return !measPhi ? m_etaDesign[lay].nch : m_phiDesign[lay].nGroups; }
415 return -1;
416 }

◆ numberOfWires()

int MuonGM::sTgcReadoutElement::numberOfWires ( const Identifier & id) const

Get the total number of wires (single wires) of a chamber.

Definition at line 692 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

692 {
693 int nWires = -1;
694 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire) {
695 const MuonChannelDesign* design = getDesign(id);
696 if (!design) {
697 ATH_MSG_WARNING( "no wire design when trying to get the total number of wires" );
698 return nWires;
699 }
700 nWires = design->nch;
701 } else {
702 ATH_MSG_WARNING( "attempt to retrieve the number of wires with a wrong identifier" );
703 }
704 return nWires;
705 }

◆ padCorners()

bool MuonGM::sTgcReadoutElement::padCorners ( const Identifier & id,
std::array< Amg::Vector2D, 4 > & corners ) const
inline

pad corners

Definition at line 358 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

358 {
359 const MuonPadDesign* design = getPadDesign(id);
360 if (!design) {
361 ATH_MSG_WARNING("Cannot find the pad corners for "<<idHelperSvc()->toString(id));
362 return false;
363 }
364 int padEta = m_idHelper.padEta(id);
365 int padPhi = m_idHelper.padPhi(id);
366
367 return design->channelCorners(std::make_pair(padEta, padPhi), corners);
368 }
bool channelCorners(const std::pair< int, int > &pad, CornerArray &corners) const

◆ padGlobalCorners()

bool MuonGM::sTgcReadoutElement::padGlobalCorners ( const Identifier & id,
std::array< Amg::Vector3D, 4 > & gcorners ) const
inline

pad global corners

Definition at line 370 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

370 {
371 std::array<Amg::Vector2D,4> lcorners{make_array<Amg::Vector2D, 4>(Amg::Vector2D::Zero())};
372 if (!padCorners(id, lcorners)) {
373 return false;
374 }
375 for (size_t c = 0; c < lcorners.size() ; ++c) {
376 surface(id).localToGlobal(lcorners[c], Amg::Vector3D::Zero(), gcorners[c]);
377 }
378 return true;
379 }
constexpr std::array< T, N > make_array(const T &def_val)
Helper function to initialize in-place arrays with non-zero values.
Definition ArrayHelper.h:10
virtual const Trk::PlaneSurface & surface() const override
access to chamber surface (phi orientation), uses the first gas gap
bool padCorners(const Identifier &id, std::array< Amg::Vector2D, 4 > &corners) const
pad corners
virtual void localToGlobal(const Amg::Vector2D &locp, const Amg::Vector3D &mom, Amg::Vector3D &glob) const override final
Specified for PlaneSurface: LocalToGlobal method without dynamic memory allocation.

◆ padGlobalPosition()

bool MuonGM::sTgcReadoutElement::padGlobalPosition ( const Identifier & id,
Amg::Vector3D & gpos ) const
inline

pad global position

Definition at line 351 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

351 {
352 Amg::Vector2D lpos{Amg::Vector2D::Zero()};
353 if (!padPosition(id, lpos)) return false;
354 surface(id).localToGlobal(lpos, Amg::Vector3D::Zero(), gpos);
355 return true;
356 }
bool padPosition(const Identifier &id, Amg::Vector2D &pos) const
pad position
Eigen::Matrix< double, 2, 1 > Vector2D

◆ padNumber()

int MuonGM::sTgcReadoutElement::padNumber ( const Amg::Vector2D & pos,
const Identifier & id ) const

pad number corresponding to local position

Definition at line 612 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

612 {
613 const MuonPadDesign* design = getPadDesign(id);
614 if (!design) {
615 ATH_MSG_WARNING( "no pad Design" );
616 return -1;
617 }
618 std::pair<int, int> pad(design->channelNumber(pos));
619 const sTgcIdHelper& id_helper{*manager()->stgcIdHelper()};
620 if (pad.first > 0 && pad.second > 0) {
621#ifndef NDEBUG
622 bool is_valid {true};
623#endif
624 const Identifier padID = id_helper.padID(id, id_helper.multilayer(id),
625 id_helper.gasGap(id), sTgcIdHelper::Pad, pad.first, pad.second
626#ifndef NDEBUG
627 , is_valid
628#endif
629
630 );
631 int channel = id_helper.channel(padID);
632 int padEta = id_helper.padEta(padID);
633 int padPhi = id_helper.padPhi(padID);
634 if (
635#ifndef NDEBUG
636 !is_valid ||
637#endif
638 padEta != pad.first || padPhi != pad.second) {
639
640 ATH_MSG_WARNING( " bad pad indices: input " << pad.first << " " << pad.second << " from ID " << padEta << " "
641 << padPhi );
642 return -1;
643 }
644 return channel;
645 }
646
647 ATH_MSG_WARNING(__LINE__<< " bad channelNumber" <<pad.first<<" "<<pad.second );
648
649 return -1;
650 }
int padPhi(const Identifier &id) const
int multilayer(const Identifier &id) const
int padEta(const Identifier &id) const
int channel(const Identifier &id) const override
Identifier padID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int padEta, int padPhi) const
int gasGap(const Identifier &id) const override
get the hashes
std::pair< int, int > channelNumber(const Amg::Vector2D &pos) const
calculate local channel number, range 1=nstrips like identifiers.

◆ padPosition()

bool MuonGM::sTgcReadoutElement::padPosition ( const Identifier & id,
Amg::Vector2D & pos ) const
inline

pad position

Definition at line 339 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

339 {
340 const MuonPadDesign* design = getPadDesign(id);
341 if (!design){
342 ATH_MSG_WARNING("Cannot determine the pad position for "<<idHelperSvc()->toString(id));
343 return false;
344 }
345 int padEta = m_idHelper.padEta(id);
346 int padPhi = m_idHelper.padPhi(id);
347
348 return design->channelPosition(std::make_pair(padEta, padPhi), pos);
349 }
bool channelPosition(const std::pair< int, int > &pad, Amg::Vector2D &pos) const
calculate local channel position for a given channel number

◆ parentMuonStation()

const MuonStation * MuonGM::MuonReadoutElement::parentMuonStation ( ) const
inherited

◆ parentMuonStationPos()

Amg::Vector3D MuonGM::MuonReadoutElement::parentMuonStationPos ( ) const
inherited

Definition at line 82 of file MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx.

82 {
83 return parentMuonStation()->getTransform().translation();
84 }
Amg::Transform3D getTransform() const

◆ positionFirstWire()

double MuonGM::sTgcReadoutElement::positionFirstWire ( const Identifier & id) const

Get the local position of the first wire of the chamber corresponding to the identifier.

Definition at line 675 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

675 {
676 double pos_wire = -9999.9;
677 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire) {
678 const MuonChannelDesign* design = getDesign(id);
679 if (!design) {
680 ATH_MSG_WARNING( "no wire design when trying to get the 1st wire position" );
681 return pos_wire;
682 }
683 pos_wire = design->firstPos();
684 } else {
685 ATH_MSG_WARNING( "attempt to retrieve the 1st wire position with a wrong identifier" );
686 }
687 return pos_wire;
688 }

◆ posOnDefChamber()

void MuonGM::sTgcReadoutElement::posOnDefChamber ( Amg::Vector3D & locPosML) const

transform a position (in chamber-frame coordinates) to the deformed-chamber geometry

Definition at line 761 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

761 {
762
763 // note: amdb frame (s, z, t) = chamber frame (y, z, x)
764 if (!has_BLines()) return;
765
766 double t0 = locPosML.x();
767 double s0 = locPosML.y();
768 double z0 = locPosML.z();
769 double width = getSsize() + (getLongSsize() - getSsize())*(z0/getRsize() + 0.5); // because z0 is in [-length/2, length/2]
770
771 double s_rel = s0/(width/2.); // in [-1, 1]
772 double z_rel = z0/(getRsize()/2.); // in [-1, 1]
773 double t_rel = t0/(getZsize()/2.); // in [-1, 1]
774
775 // b-line parameters
776 using Parameter = BLinePar::Parameter;
777 const double bp = m_BLinePar->getParameter(Parameter::bp);
778 const double bn = m_BLinePar->getParameter(Parameter::bn);
779 const double sp = m_BLinePar->getParameter(Parameter::sp);
780 const double sn = m_BLinePar->getParameter(Parameter::sn);
781 const double tw = m_BLinePar->getParameter(Parameter::tw);
782 const double eg = m_BLinePar->getParameter(Parameter::eg)*1.e-3;
783 const double ep = m_BLinePar->getParameter(Parameter::ep)*1.e-3;
784 const double en = m_BLinePar->getParameter(Parameter::en)*1.e-3;
785
786 double ds{0.}, dz{0.}, dt{0.};
787
788 if (bp != 0 || bn != 0)
789 dt += 0.5*(s_rel*s_rel - 1)*((bp + bn) + (bp - bn)*z_rel);
790
791 if (sp != 0 || sn != 0)
792 dt += 0.5*(z_rel*z_rel - 1)*((sp + sn) + (sp - sn)*s_rel);
793
794 if (tw != 0) {
795 dt -= tw*s_rel*z_rel;
796 dz += tw*s_rel*t_rel*getZsize()/getRsize();
797 }
798
799 if (eg != 0) {
800 dt += t0*eg;
801 ds += s0*eg;
802 dz += z0*eg;
803 }
804
805 if (ep != 0 || en != 0) {
806 // the formulas below differ from those in Christoph's talk
807 // because are origin for NSW is at the center of the chamber,
808 // whereas in the talk (i.e. MDTs), it is at the bottom!
809 double delta = s_rel*s_rel * ((ep + en)*s_rel/6 + (ep - en)/4);
810 double phi = s_rel * ((ep + en)*s_rel + (ep - en)) / 2;
811 dt += phi*t0;
812 ds += delta*width/2;
813 dz += phi*z0;
814 }
815
816 locPosML[0] += dt;
817 locPosML[1] += ds;
818 locPosML[2] += dz;
819 }
Scalar phi() const
phi method
static Double_t sp
static Double_t s0
static Double_t t0
const double width

◆ refreshCache()

void MuonGM::MuonReadoutElement::refreshCache ( )
inherited

Definition at line 122 of file MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx.

122 {
123 clearCache();
124 fillCache();
125 }
virtual void fillCache()=0
virtual void clearCache()=0

◆ setBLinePar()

void MuonGM::sTgcReadoutElement::setBLinePar ( const BLinePar & bLine)

read B-line (chamber-deformation) parameters

Definition at line 755 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

755 {
756 ATH_MSG_DEBUG("Setting B-line for " <<idHelperSvc()->toStringDetEl(identify())<<" "<<bLine);
757 m_BLinePar = &bLine;
758 }

◆ setChamberLayer()

void MuonGM::sTgcReadoutElement::setChamberLayer ( int ml)
inline

set methods only to be used by MuonGeoModel

Definition at line 176 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

176{ m_ml = ml; }

◆ setDelta()

void MuonGM::sTgcReadoutElement::setDelta ( const ALinePar & aline)

Definition at line 728 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

728 {
729 // amdb frame (s, z, t) = chamber frame (y, z, x)
730 if (aline) {
731 static const Amg::Transform3D permute{GeoTrf::GeoRotation{90.*Gaudi::Units::deg,90.*Gaudi::Units::deg, 0.}};
732 // The origin of the rotation axes is at the center of the active area
733 // in the z (radial) direction. Account for this shift in the definition
734 // of m_delta so that it can be applied on chamber frame coordinates.
735 m_ALinePar = &aline;
736 m_delta = Amg::getTranslateZ3D(m_offset)* permute*aline.delta()*
737 permute.inverse()*Amg::getTranslateZ3D(-m_offset);
738 ATH_MSG_DEBUG(idHelperSvc()->toStringDetEl(identify())<<" setup new alignment: "<<GeoTrf::toString(m_delta));
739 refreshCache();
740 } else {
742 }
743 }
Amg::Transform3D delta() const
Returns the final transformations of the A lines.
Definition ALinePar.cxx:36
Eigen::Affine3d Transform3D

◆ setHasCutouts()

void MuonGM::MuonReadoutElement::setHasCutouts ( bool flag)
inlineinherited

◆ setIdentifier()

void MuonGM::MuonReadoutElement::setIdentifier ( const Identifier & id)
inherited

Sets the Identifier, hashes & station names.

Definition at line 101 of file MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx.

101 {
102 m_id = id;
103 if (!m_idHelperSvc->isMuon(id)) {
104 ATH_MSG_FATAL("The Identifier "<<m_idHelperSvc->toString(id)<<" is not a muon one.");
105 throw std::runtime_error("Invalid Identifier set");
106 }
107 m_stIdx = m_idHelperSvc->stationName(id);
108 m_eta = m_idHelperSvc->stationEta(id);
109 m_phi = m_idHelperSvc->stationPhi(id);
110 m_idhash = m_idHelperSvc->moduleHash(id);
111 m_detectorElIdhash = m_idHelperSvc->detElementHash(id);
112 }

◆ setLevel()

void AthMessaging::setLevel ( MSG::Level lvl)
inherited

Change the current logging level.

Use this rather than msg().setLevel() for proper operation with MT.

Definition at line 28 of file AthMessaging.cxx.

29{
30 m_lvl = lvl;
31}

◆ setLongRsize()

void MuonGM::MuonReadoutElement::setLongRsize ( double v)
inherited

◆ setLongSsize()

void MuonGM::MuonReadoutElement::setLongSsize ( double v)
inherited

◆ setLongZsize()

void MuonGM::MuonReadoutElement::setLongZsize ( double v)
inherited

◆ setParentMuonStation()

void MuonGM::MuonReadoutElement::setParentMuonStation ( const MuonStation * mstat)
inherited

Definition at line 76 of file MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx.

76 {
77 m_parentMuonStation = mstat;
78 }

◆ setRsize()

void MuonGM::MuonReadoutElement::setRsize ( double v)
inherited

◆ setSsize()

void MuonGM::MuonReadoutElement::setSsize ( double v)
inherited

◆ setStationName()

void MuonGM::MuonReadoutElement::setStationName ( const std::string & str)
inherited

◆ setStationS()

void MuonGM::MuonReadoutElement::setStationS ( double v)
inherited

◆ setTechnologyName()

void MuonGM::MuonReadoutElement::setTechnologyName ( const std::string & str)
inherited

◆ setZsize()

void MuonGM::MuonReadoutElement::setZsize ( double v)
inherited

◆ sideA()

bool MuonGM::MuonReadoutElement::sideA ( ) const
inlineinherited

◆ sideC()

bool MuonGM::MuonReadoutElement::sideC ( ) const
inlineinherited

◆ smallSector()

bool MuonGM::MuonReadoutElement::smallSector ( ) const
inherited

Definition at line 67 of file MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx.

67 {
68 // this doesn't apply to TGC
69 return (!largeSector());
70 }

◆ spacePointPosition() [1/4]

void MuonGM::sTgcReadoutElement::spacePointPosition ( const Amg::Vector2D & phiPos,
const Amg::Vector2D & etaPos,
Amg::Vector2D & pos ) const
inline

space point position for a pair of phi and eta local positions and a layer identifier The LocalPosition is expressed in the reference frame of the phi projection.

Definition at line 450 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

450 {
451 pos[0] = phiPos.x();
452 pos[1] = etaPos.x();
453 }

◆ spacePointPosition() [2/4]

void MuonGM::sTgcReadoutElement::spacePointPosition ( const Identifier & layerId,
double locXpos,
double locYpos,
Amg::Vector3D & pos ) const

space point position, corrected for chamber deformations (b-lines), if b-lines are enabled.

Accepts a precision (x) coordinate and a y-seed, in the local layer frame, and returns a 3D position, in the same frame so that sTgcReadoutElement::transform() can be directly cast on it. Accounts for: a) PCB deformations (as-built), if as-built conditions are enabled b) Chamber deformations (b-lines), if b-lines are enabled

Definition at line 823 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

823 {
824
825 pos = Amg::Vector3D(locXpos, locYpos, 0.);
826
827 const MuonChannelDesign* design = getDesign(layerId);
828 if (!design) {
829 ATH_MSG_WARNING( "Unable to get MuonChannelDesign, therefore cannot provide position corrections. Returning." );
830 return;
831 }
832
833#ifndef SIMULATIONBASE
834 //*********************
835 // As-Built (MuonNswAsBuilt is not included in AthSimulation)
836 //*********************
837 if(manager()->getsTGCAsBuilt() && design->type == MuonChannelDesign::ChannelType::etaStrip){
838#if __GNUC__ >= 13
839// Avoid a warning seen with -march=x86-64-v3.
840// This has been cleaned up in eigen after 3.4.0.
841# pragma GCC diagnostic push
842# pragma GCC diagnostic ignored "-Warray-bounds"
843#endif
844 pos.head(2) = manager()->getsTGCAsBuilt()->correctPosition(layerId, pos.head(2));
845#if __GNUC__ >= 13
846# pragma GCC diagnostic pop
847#endif
848 }
849#ifndef NDEBUG
850 else {
851 MsgStream log(Athena::getMessageSvc(), "sTgcReadoutElement");
852 if (log.level() <= MSG::DEBUG) {
853 log << MSG::DEBUG << "No as-built corrections provided for stEta: "<<getStationEta() << " stPhi: "<<getStationPhi()<<" ml: "<<m_ml<< endmsg;
854 }
855 }
856#endif
857#endif
858
859
860 //*********************
861 // B-Lines
862 //*********************
863 if (has_BLines()) {
864 // go to the muultilayer frame
865 Amg::Transform3D trfToML = m_delta.inverse()*absTransform().inverse()*transform(layerId);
866 pos = trfToML*pos;
867 posOnDefChamber(pos);
868 // back to the layer reference frame from where we started
869 pos = trfToML.inverse()*pos;
870
871 }
872 }
#define endmsg
virtual const Amg::Transform3D & transform() const override
Return local to global transform.
void posOnDefChamber(Amg::Vector3D &locPosML) const
transform a position (in chamber-frame coordinates) to the deformed-chamber geometry
Amg::Vector2D correctPosition(const Identifier &channelId, const Amg::Vector2D &pos) const

◆ spacePointPosition() [3/4]

bool MuonGM::sTgcReadoutElement::spacePointPosition ( const Identifier & phiId,
const Identifier & etaId,
Amg::Vector2D & pos ) const
inlinefinaloverridevirtual

space point position for a given pair of phi and eta identifiers The LocalPosition is expressed in the reference frame of the phi surface.

If one of the identifiers is outside the valid range, the function will return false

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 436 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

436 {
437 Amg::Vector2D phiPos{Amg::Vector2D::Zero()}, etaPos{Amg::Vector2D::Zero()};
438 if (!stripPosition(phiId, phiPos) || !stripPosition(etaId, etaPos)) return false;
439 spacePointPosition(phiPos, etaPos, pos);
440 return true;
441 }
virtual bool stripPosition(const Identifier &id, Amg::Vector2D &pos) const override final
strip position - should be renamed to channel position If the strip number is outside the range of va...
virtual bool spacePointPosition(const Identifier &phiId, const Identifier &etaId, Amg::Vector2D &pos) const override final
space point position for a given pair of phi and eta identifiers The LocalPosition is expressed in th...

◆ spacePointPosition() [4/4]

bool MuonGM::sTgcReadoutElement::spacePointPosition ( const Identifier & phiId,
const Identifier & etaId,
Amg::Vector3D & pos ) const
inlinefinaloverridevirtual

Global space point position for a given pair of phi and eta identifiers If one of the identifiers is outside the valid range, the function will return false.

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 443 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

443 {
444 Amg::Vector2D lpos{Amg::Vector2D::Zero()};
445 spacePointPosition(phiId, etaId, lpos);
446 surface(phiId).localToGlobal(lpos, pos, pos);
447 return true;
448 }

◆ stripGlobalPosition()

bool MuonGM::sTgcReadoutElement::stripGlobalPosition ( const Identifier & id,
Amg::Vector3D & gpos ) const
inline

Definition at line 332 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

332 {
333 Amg::Vector2D lpos{Amg::Vector2D::Zero()};
334 if (!stripPosition(id, lpos)) return false;
335 surface(id).localToGlobal(lpos, Amg::Vector3D::Zero(), gpos);
336 return true;
337 }

◆ stripNumber()

int MuonGM::sTgcReadoutElement::stripNumber ( const Amg::Vector2D & pos,
const Identifier & id ) const
inlinefinaloverridevirtual

strip number corresponding to local position.

Should be renamed to channelNumber : the only public access for all hit types

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 309 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

309 {
310 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) return padNumber(pos, id);
311
312 const MuonChannelDesign* design = getDesign(id);
313 if (!design) {
314 ATH_MSG_WARNING("Cannot associate the strip number for "<<Amg::toString(pos)<<" in layer "
315 <<idHelperSvc()->toStringGasGap(id));
316 return -1;
317 }
318 return design->channelNumber(pos);
319 }
int padNumber(const Amg::Vector2D &pos, const Identifier &id) const
pad number corresponding to local position

◆ stripPosition()

bool MuonGM::sTgcReadoutElement::stripPosition ( const Identifier & id,
Amg::Vector2D & pos ) const
inlinefinaloverridevirtual

strip position - should be renamed to channel position If the strip number is outside the range of valid strips, the function will return false

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 321 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

321 {
322 if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) return padPosition(id, pos);
323
324 const MuonChannelDesign* design = getDesign(id);
325 if (!design) {
326 ATH_MSG_WARNING("Cannot determine the strip postion for "<<idHelperSvc()->toString(id));
327 return false;
328 }
329 return design->center(m_idHelper.channel(id), pos);
330 }

◆ surface() [1/3]

const Trk::PlaneSurface & MuonGM::MuonClusterReadoutElement::surface ( ) const
inlineoverridevirtualinherited

access to chamber surface (phi orientation), uses the first gas gap

Implements Trk::TrkDetElementBase.

Definition at line 123 of file MuonClusterReadoutElement.h.

123{ return surface(0); }

◆ surface() [2/3]

const Trk::PlaneSurface & MuonGM::MuonClusterReadoutElement::surface ( const Identifier & id) const
inlineoverridevirtualinherited

access to layer surfaces

Implements Trk::TrkDetElementBase.

Definition at line 129 of file MuonClusterReadoutElement.h.

129{ return surface(surfaceHash(id)); }
virtual int surfaceHash(const Identifier &id) const =0
returns the hash function to be used to look up the surface and surface transform for a given identif...

◆ surface() [3/3]

const Trk::PlaneSurface & MuonGM::MuonClusterReadoutElement::surface ( int surfHash) const
inlineinherited

access to layer surfaces

Definition at line 135 of file MuonClusterReadoutElement.h.

135 {
136 if (!m_surfaceData) {
137 ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" "<<__func__<<" Requesting surface but cache is empty");
138 throw std::runtime_error("Empty surface cache");
139 }
140 if (hash == -1 || hash >= (int)m_surfaceData->m_layerSurfaces.size()) {
141 ATH_MSG_WARNING(" surface hash out of range: " << hash << " elements "
142 << m_surfaceData->m_layerSurfaces.size());
143 return *m_surfaceData->m_layerSurfaces.front();
144 }
145 return *m_surfaceData->m_layerSurfaces[hash];
146 }

◆ surfaceHash() [1/2]

int MuonGM::sTgcReadoutElement::surfaceHash ( const Identifier & id) const
inlinefinaloverridevirtual

returns the hash to be used to look up the surface and transform in the MuonClusterReadoutElement tracking cache

Implements MuonGM::MuonClusterReadoutElement.

Definition at line 257 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

257 {
258 return surfaceHash(m_idHelper.gasGap(id), m_idHelper.channelType(id));
259 }

◆ surfaceHash() [2/2]

int MuonGM::sTgcReadoutElement::surfaceHash ( int gasGap,
int channelType ) const
inline

returns the hash to be used to look up the surface and transform in the MuonClusterReadoutElement tracking cache

Definition at line 261 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

261 {
262 return (gasGap - 1) * 3 + (2 - channelType); // assumes channelType=2 (wires), 1(strips), 0(pads)
263 }

◆ surfaces()

std::vector< const Trk::Surface * > MuonGM::MuonClusterReadoutElement::surfaces ( ) const
inlinevirtualinherited

returns all the surfaces contained in this detector element

Definition at line 197 of file MuonClusterReadoutElement.h.

197 {
198 std::vector<const Trk::Surface*> elementSurfaces;
199
200 // create when first time requested and when possible
201 if (m_surfaceData) {
202 elementSurfaces.reserve(m_surfaceData->m_layerSurfaces.size());
203 for (const std::unique_ptr<Trk::PlaneSurface>& ptr : m_surfaceData->m_layerSurfaces) {
204 elementSurfaces.emplace_back(ptr.get());
205 }
206 }
207 // return the element surfaces
208 return elementSurfaces;
209 }
void * ptr(T *p)
Definition SGImplSvc.cxx:74

◆ toParentStation()

Amg::Transform3D MuonGM::MuonReadoutElement::toParentStation ( ) const
inherited

Definition at line 72 of file MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx.

72 {
73 return getMaterialGeom()->getX();
74 }

◆ transform() [1/3]

const Amg::Transform3D & MuonGM::MuonClusterReadoutElement::transform ( ) const
inlineoverridevirtualinherited

Return local to global transform.

Implements Trk::TrkDetElementBase.

Definition at line 124 of file MuonClusterReadoutElement.h.

124{ return transform(0); }

◆ transform() [2/3]

const Amg::Transform3D & MuonGM::MuonClusterReadoutElement::transform ( const Identifier & id) const
inlineoverridevirtualinherited

Return local to global transform associated with this identifier.

Implements Trk::TrkDetElementBase.

Definition at line 130 of file MuonClusterReadoutElement.h.

130{ return transform(surfaceHash(id)); }

◆ transform() [3/3]

const Amg::Transform3D & MuonGM::MuonClusterReadoutElement::transform ( int surfHash) const
inlineinherited

Definition at line 148 of file MuonClusterReadoutElement.h.

148 {
149 if (!m_surfaceData) {
150 ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" "<<__func__<<" Requesting transform but cache is empty");
151 throw std::runtime_error("Empty transform cache");
152 }
153 if (hash == -1 || hash >= (int)m_surfaceData->m_layerTransforms.size()) {
154 ATH_MSG_WARNING("transform hash out of range: " << hash << " elements "
155 << m_surfaceData->m_layerTransforms.size());
156 return m_surfaceData->m_layerTransforms.front();
157 }
158 return m_surfaceData->m_layerTransforms[hash];
159 }

◆ triggerBandIdToRadius()

double MuonGM::sTgcReadoutElement::triggerBandIdToRadius ( bool isLarge,
int triggerBand )
inlinestatic

Definition at line 456 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

456 {
457 if(isLarge){
458 return LBANDIDSP[triggerBand];
459 } else {
460 return SBANDIDSP[triggerBand];
461 }
462 };

◆ wireNumber()

int MuonGM::sTgcReadoutElement::wireNumber ( const Amg::Vector2D & pos,
const Identifier & id ) const

wire number corresponding to local position

Definition at line 654 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

654 {
655 const MuonChannelDesign* design = getDesign(id);
656 if (!design) {
657 ATH_MSG_WARNING( "no wire design when trying to get the wire number" );
658 return -1;
659 }
660 return design->wireNumber(pos);
661 }

◆ wirePitch()

double MuonGM::sTgcReadoutElement::wirePitch ( int gas_gap = 1) const

single wire pitch.

sTGC wire pitch is the same for all chambers, so the default gas gap is set to the 1st gap

Definition at line 665 of file MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx.

665 {
666 if (m_phiDesign.empty()) {
667 ATH_MSG_WARNING( "no wire design when trying to get the wire pitch" );
668 return -1.0;
669 }
670 return (m_phiDesign[gas_gap - 1]).inputPitch;
671 }

◆ MuonGMR4::ReadoutGeomCnvAlg

Member Data Documentation

◆ ATLAS_THREAD_SAFE

std::atomic_flag m_initialized AthMessaging::ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
mutableprivateinherited

Messaging initialized (initMessaging).

Definition at line 141 of file AthMessaging.h.

◆ LBANDIDSP

std::array<double, 94> MuonGM::sTgcReadoutElement::LBANDIDSP
staticconstexprprivate
Initial value:
= {
10, 10, 10, 10, 10, 10, 1156.72, 1187.98, 1231.87, 1271.34, 1312.87, 1354.56, 1396.38, 1438.07,
1479.73, 1521.44, 1563.11, 1604.8, 1646.48, 1688.02, 1729.84, 1771.51, 1813.2, 1854.89, 1896.57, 1938.26, 1979.93, 2021.61,
2063.14, 2104.98, 2146.55, 2181.64, 2209.01, 2251.65, 2282.54, 2313.27, 2356.24, 2396.73, 2438.29, 2480.09, 2521.75, 2563.46,
2605.11, 2646.85, 2688.48, 2730.19, 2771.86, 2813.41, 2855.21, 2896.93, 2938.61, 2980.26, 3021.95, 3063.63, 3105.31, 3146.98,
3188.85, 3230.37, 3272.05, 3313.77, 3353.77, 3376.19, 3426.09, 3464.49, 3506.78, 3563.91, 3589.03, 3626.17, 3667.84, 3709.56,
3751.33, 3792.92, 3834.58, 3876.27, 3917.9, 3959.62, 4001.29, 4043.03, 4084.66, 4126.39, 4168.05, 4209.74, 4251.38, 4293.16,
4334.72, 4376.47, 4417.54, 4459.75, 4496.31, 4543.27, 4584.77, 4626.47, 4668.25, 4701.14
}

Definition at line 233 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

233 {
234 10, 10, 10, 10, 10, 10, 1156.72, 1187.98, 1231.87, 1271.34, 1312.87, 1354.56, 1396.38, 1438.07,
235 1479.73, 1521.44, 1563.11, 1604.8, 1646.48, 1688.02, 1729.84, 1771.51, 1813.2, 1854.89, 1896.57, 1938.26, 1979.93, 2021.61,
236 2063.14, 2104.98, 2146.55, 2181.64, 2209.01, 2251.65, 2282.54, 2313.27, 2356.24, 2396.73, 2438.29, 2480.09, 2521.75, 2563.46,
237 2605.11, 2646.85, 2688.48, 2730.19, 2771.86, 2813.41, 2855.21, 2896.93, 2938.61, 2980.26, 3021.95, 3063.63, 3105.31, 3146.98,
238 3188.85, 3230.37, 3272.05, 3313.77, 3353.77, 3376.19, 3426.09, 3464.49, 3506.78, 3563.91, 3589.03, 3626.17, 3667.84, 3709.56,
239 3751.33, 3792.92, 3834.58, 3876.27, 3917.9, 3959.62, 4001.29, 4043.03, 4084.66, 4126.39, 4168.05, 4209.74, 4251.38, 4293.16,
240 4334.72, 4376.47, 4417.54, 4459.75, 4496.31, 4543.27, 4584.77, 4626.47, 4668.25, 4701.14
241 };

◆ m_ALinePar

const ALinePar* MuonGM::sTgcReadoutElement::m_ALinePar {nullptr}
private

◆ m_BLinePar

const BLinePar* MuonGM::sTgcReadoutElement::m_BLinePar {nullptr}
private

◆ m_caching

int MuonGM::MuonReadoutElement::m_caching {-1}
protectedinherited

0 if we want to avoid caching geometry info for tracking interface

Definition at line 150 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

150{-1};

◆ m_delta

Amg::Transform3D MuonGM::sTgcReadoutElement::m_delta {Amg::Transform3D::Identity()}
private

Definition at line 225 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

225{Amg::Transform3D::Identity()};

◆ m_detectorElIdhash

IdentifierHash MuonGM::MuonReadoutElement::m_detectorElIdhash {0}
privateinherited

detector element hash identifier

Definition at line 159 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

159{0};

◆ m_diamondShape

bool MuonGM::sTgcReadoutElement::m_diamondShape {false}
private

◆ m_eta

int MuonGM::MuonReadoutElement::m_eta {-1}
privateinherited

Identifier field of the station eta.

Definition at line 165 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

165{-1};

◆ m_etaDesign

std::array<MuonChannelDesign,4> MuonGM::sTgcReadoutElement::m_etaDesign {}
private

◆ m_hasCutouts

bool MuonGM::MuonReadoutElement::m_hasCutouts {false}
protectedinherited

true is there are cutouts in the readdout-element

Definition at line 152 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

152{false};

◆ m_id

Identifier MuonGM::MuonReadoutElement::m_id {}
privateinherited

extended data-collection identifier

Definition at line 157 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

157{};

◆ m_idhash

IdentifierHash MuonGM::MuonReadoutElement::m_idhash {0}
privateinherited

data-collection hash identifier

Definition at line 158 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

158{0};

◆ m_idHelper

const sTgcIdHelper& MuonGM::sTgcReadoutElement::m_idHelper {idHelperSvc()->stgcIdHelper()}
private

Definition at line 213 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

virtual const sTgcIdHelper & stgcIdHelper() const =0
access to TgcIdHelper

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> MuonGM::MuonReadoutElement::m_idHelperSvc {"Muon::MuonIdHelperSvc/MuonIdHelperSvc", "MuonDetectorManager"}
privateinherited

Definition at line 155 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

155{"Muon::MuonIdHelperSvc/MuonIdHelperSvc", "MuonDetectorManager"};

◆ m_imsg

std::atomic<IMessageSvc*> AthMessaging::m_imsg { nullptr }
mutableprivateinherited

MessageSvc pointer.

Definition at line 135 of file AthMessaging.h.

135{ nullptr };

◆ m_LongRsize

double MuonGM::MuonReadoutElement::m_LongRsize {-9999.}
protectedinherited

◆ m_LongSsize

double MuonGM::MuonReadoutElement::m_LongSsize {-9999.}
protectedinherited

◆ m_LongZsize

double MuonGM::MuonReadoutElement::m_LongZsize {-9999.}
protectedinherited

size in the specified direction

Definition at line 142 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

142{-9999.};

◆ m_lvl

std::atomic<MSG::Level> AthMessaging::m_lvl { MSG::NIL }
mutableprivateinherited

Current logging level.

Definition at line 138 of file AthMessaging.h.

138{ MSG::NIL };

◆ m_ml

int MuonGM::sTgcReadoutElement::m_ml {0}
private

◆ m_msg_tls

boost::thread_specific_ptr<MsgStream> AthMessaging::m_msg_tls
mutableprivateinherited

MsgStream instance (a std::cout like with print-out levels).

Definition at line 132 of file AthMessaging.h.

◆ m_muon_mgr

MuonDetectorManager* MuonGM::MuonReadoutElement::m_muon_mgr {nullptr}
privateinherited

◆ m_nlayers

int MuonGM::sTgcReadoutElement::m_nlayers {4}
staticconstexprprivate

◆ m_nm

std::string AthMessaging::m_nm
privateinherited

Message source name.

Definition at line 129 of file AthMessaging.h.

◆ m_offset

double MuonGM::sTgcReadoutElement::m_offset {0.}
private

◆ m_padDesign

std::array<MuonPadDesign,4> MuonGM::sTgcReadoutElement::m_padDesign {}
private

◆ m_parentMuonStation

const MuonStation* MuonGM::MuonReadoutElement::m_parentMuonStation {nullptr}
privateinherited

◆ m_phi

int MuonGM::MuonReadoutElement::m_phi {-1}
privateinherited

Identifier field of the station phi.

Definition at line 167 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

167{-1};

◆ m_phiDesign

std::array<MuonChannelDesign,4> MuonGM::sTgcReadoutElement::m_phiDesign {}
private

◆ m_Rsize

double MuonGM::MuonReadoutElement::m_Rsize {-9999.}
protectedinherited

◆ m_Ssize

double MuonGM::MuonReadoutElement::m_Ssize {-9999.}
protectedinherited

◆ m_stationS

double MuonGM::MuonReadoutElement::m_stationS {0.}
privateinherited

◆ m_statname

std::string MuonGM::MuonReadoutElement::m_statname {"XXX0"}
protectedinherited

examples are BMS5, CSS1, EML1

Definition at line 148 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

148{"XXX0"};

◆ m_stIdx

int MuonGM::MuonReadoutElement::m_stIdx {-1}
privateinherited

Identifier field of the station index.

Definition at line 163 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

163{-1};

◆ m_surfaceData

std::unique_ptr<SurfaceData> MuonGM::MuonClusterReadoutElement::m_surfaceData {}
protectedinherited

Definition at line 120 of file MuonClusterReadoutElement.h.

120{};

◆ m_techname

std::string MuonGM::MuonReadoutElement::m_techname {"TTT0"}
protectedinherited

MDT or RPC or TGC or CSC plus a two digits subtype; example RPC17.

Definition at line 146 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h.

146{"TTT0"};

◆ m_type

◆ m_Xlg

std::array<Amg::Transform3D, 4> MuonGM::sTgcReadoutElement::m_Xlg {make_array<Amg::Transform3D, 4>(Amg::Transform3D::Identity())}
private

◆ m_Zsize

double MuonGM::MuonReadoutElement::m_Zsize {-9999.}
protectedinherited

◆ SBANDIDSP

std::array<double, 92> MuonGM::sTgcReadoutElement::SBANDIDSP
staticconstexprprivate
Initial value:
= {
10.0, 10.0, 958.077, 998.248, 1037.405, 1076.535, 1115.69, 1154.82, 1193.97, 1233.135, 1272.265, 1311.395,
1350.59, 1389.705, 1428.865, 1468.01, 1507.175, 1546.305, 1585.435, 1624.58, 1663.71, 1702.895, 1742.055,
1781.165, 1820.315, 1859.44, 1898.575, 1937.75, 1976.885, 2016.04, 2055.15, 2094.345, 2136.125, 2172.61,
2217.68, 2255.125, 2316.115, 2348.91, 2388.06, 2427.245, 2466.385, 2505.515, 2544.69, 2583.8, 2622.99,
2662.115, 2701.31, 2740.395, 2779.55, 2818.715, 2857.905, 2897.0, 2936.185, 2975.315, 3014.47, 3053.615,
3092.775, 3131.895, 3171.075, 3210.225, 3249.375, 3288.485, 3317.74, 3347.075, 3396.65, 3440.175, 3475.575,
3540.81, 3581.97, 3621.13, 3660.285, 3699.41, 3738.535, 3777.73, 3816.89, 3856.055, 3895.105, 3934.3, 3974.34,
4012.565, 4051.71, 4090.865, 4130.04, 4169.145, 4208.285, 4247.55, 4286.65, 4320.075, 4364.84, 4404.12, 4443.14, 4482.29
}

Definition at line 244 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h.

244 {
245 10.0, 10.0, 958.077, 998.248, 1037.405, 1076.535, 1115.69, 1154.82, 1193.97, 1233.135, 1272.265, 1311.395,
246 1350.59, 1389.705, 1428.865, 1468.01, 1507.175, 1546.305, 1585.435, 1624.58, 1663.71, 1702.895, 1742.055,
247 1781.165, 1820.315, 1859.44, 1898.575, 1937.75, 1976.885, 2016.04, 2055.15, 2094.345, 2136.125, 2172.61,
248 2217.68, 2255.125, 2316.115, 2348.91, 2388.06, 2427.245, 2466.385, 2505.515, 2544.69, 2583.8, 2622.99,
249 2662.115, 2701.31, 2740.395, 2779.55, 2818.715, 2857.905, 2897.0, 2936.185, 2975.315, 3014.47, 3053.615,
250 3092.775, 3131.895, 3171.075, 3210.225, 3249.375, 3288.485, 3317.74, 3347.075, 3396.65, 3440.175, 3475.575,
251 3540.81, 3581.97, 3621.13, 3660.285, 3699.41, 3738.535, 3777.73, 3816.89, 3856.055, 3895.105, 3934.3, 3974.34,
252 4012.565, 4051.71, 4090.865, 4130.04, 4169.145, 4208.285, 4247.55, 4286.65, 4320.075, 4364.84, 4404.12, 4443.14, 4482.29
253 };

The documentation for this class was generated from the following files: