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

#include <MdtReadoutElement.h>

Inheritance diagram for MuonGM::MdtReadoutElement:

Classes

struct  GeoInfo

Public Member Functions

 MdtReadoutElement (GeoVFullPhysVol *pv, const std::string &stName, MuonDetectorManager *mgr)
 ~MdtReadoutElement ()=default
unsigned int nMDTinStation () const
 How many MDT chambers are in the station.
void setNMdtInStation (unsigned int numMdt)
bool barrel () const
 Returns whether the chamber is in the barrel (Assement on first later in stationName)
bool endcap () const
 Returns whether the chamber is in the endcap.
int getMultilayer () const
 Returns the multilayer represented by the readout element.
int getNLayers () const
 Returns the number of tube layers inside the multilayer.
int getNtubesperlayer () const
 Returns the number of tubes in each tube layer.
int getNtubesinastep () const
 Returns the number of tubes in the endcap trapezoid sharing the same length.
void setMultilayer (const int ml)
 Sets the multilayer number.
void setNLayers (const int nl)
 Sets the number of layers.
bool getWireFirstLocalCoordAlongZ (int tubeLayer, double &coord) const
bool getWireFirstLocalCoordAlongR (int tubeLayer, double &coord) const
bool containsId (const Identifier &id) const override
double tubeLength (const int tubeLayer, const int tube) const
double getActiveTubeLength (const int tubeLayer, const int tube) const
double getWireLength (const int tubeLayer, const int tube) const
double tubeLength (const Identifier &id) const
double innerTubeRadius () const
 Returns the inner tube radius excluding the aluminium walls.
double outerTubeRadius () const
 Returns the tube radius taking the thickness of the tubes into account.
double tubePitch () const
 Returns the distance between 2 tubes in a tube layer.
const Amg::Transform3DlocalToGlobalTransf (const Identifier &id) const
const Amg::Transform3DlocalToGlobalTransf (const int tubeLayer, const int tube) const
Amg::Transform3D nodeform_localToGlobalTransf (const Identifier &id) const
Amg::Transform3D nodeform_localToGlobalTransf (const int tubeLayer, const int tube) const
Amg::Transform3D globalToLocalTransf (const int tubeLayer, const int tube) const
Amg::Transform3D globalToLocalTransf (const Identifier &id) const
Amg::Transform3D nodeform_globalToLocalTransf (const Identifier &id) const
Amg::Transform3D nodeform_globalToLocalTransf (const int tubeLayer, const int tube) const
Amg::Vector3D localTubePos (const Identifier &id) const
Amg::Vector3D localTubePos (const int tubelayer, const int tube) const
Amg::Vector3D nodeform_localTubePos (const Identifier &id) const
Amg::Vector3D nodeform_localTubePos (const int tubelayer, const int tube) const
Amg::Vector3D tubePos (const Identifier &id) const
 Returns the global position of the given tube.
Amg::Vector3D tubePos (const int tubelayer, const int tube) const
Amg::Vector3D nodeform_tubePos (const Identifier &id) const
 Returns the global position of the tube excluding the B-line & As-built corrections.
Amg::Vector3D nodeform_tubePos (const int tubelayer, const int tube) const
double signedRODistanceFromTubeCentre (const Identifier &id) const
double signedRODistanceFromTubeCentre (const int tubeLayer, const int tube) const
double RODistanceFromTubeCentre (const Identifier &id) const
double RODistanceFromTubeCentre (const int tubeLayer, const int tube) const
double distanceFromRO (const Amg::Vector3D &GlobalHitPosition, const Identifier &id) const
double distanceFromRO (const Amg::Vector3D &GlobalHitPosition, const int tubelayer, const int tube) const
int isAtReadoutSide (const Amg::Vector3D &GlobalHitPosition, const Identifier &id) const
int isAtReadoutSide (const Amg::Vector3D &GlobalHitPosition, const int tubelayer, const int tube) const
Amg::Vector3D localROPos (const Identifier &id) const
Amg::Vector3D localROPos (const int tubelayer, const int tube) const
Amg::Vector3D ROPos (const int tubelayer, const int tube) const
Amg::Vector3D ROPos (const Identifier &id) const
Amg::Vector3D tubeFrame_localROPos (const int tubelayer, const int tube) const
Amg::Vector3D tubeFrame_localROPos (const Identifier &id) const
void setBLinePar (const BLinePar *bLine)
void clearBLinePar ()
const BLinePargetBLinePar () const
void clearCache () override final
void fillCache () override final
virtual const Trk::Surfacesurface () const override final
 Return surface associated with this detector element.
virtual const Trk::StraightLineSurfacesurface (const Identifier &id) const override final
 Return surface associated with this identifier, which should come from the PrepRawData object (i.e.
virtual const Trk::StraightLineSurfacesurface (const int tubeLayer, const int tube) const
virtual const Trk::SurfaceBoundsbounds () const override final
 Return the boundaries of the element.
virtual const Trk::CylinderBoundsbounds (const Identifier &id) const override final
 Return the boundaries of the surface associated with this identifier.
virtual const Trk::CylinderBoundsbounds (const int tubeLayer, const int tube) const
virtual const Amg::Transform3Dtransform (const Identifier &id) const override final
 Return local to global transform associated with this identifier.
virtual const Amg::Transform3Dtransform () const override final
 Return local to global transform.
const Amg::Transform3Dtransform (const int tubeLayer, const int tube) const
virtual const Amg::Vector3Dcenter (const Identifier &) const override final
 Return the center of the surface associated with this identifier In the case of silicon it returns the same as center()
virtual const Amg::Vector3Dcenter () const override final
 Return the center of the element.
const Amg::Vector3Dcenter (const int tubeLayer, const int tube) const
virtual const Amg::Vector3Dnormal (const Identifier &) const override final
 Return the normal of the surface associated with this identifier In the case of silicon it returns the same as normal()
virtual const Amg::Vector3Dnormal () const override final
 Return the normal of the element.
std::vector< const Trk::Surface * > surfaces () const
 returns all the surfaces contained in this detector element
Amg::Transform3D tubeToMultilayerTransf (const Identifier &id) const
Amg::Transform3D tubeToMultilayerTransf (const int tubeLayer, const int tube) const
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
virtual Amg::Vector3D AmdbLRSToGlobalCoords (const Amg::Vector3D &x) const
virtual Amg::Transform3D AmdbLRSToGlobalTransform () const
virtual Amg::Vector3D GlobalToAmdbLRSCoords (const Amg::Vector3D &x) const
virtual Amg::Transform3D GlobalToAmdbLRSTransform () 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.

Protected Member Functions

const MuonDetectorManagermanager () const

Protected Attributes

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 geoInitDone ()
double getTubeLengthForCaching (const int tubeLayer, const int tube) const
double getNominalTubeLengthWoCutouts (const int tubeLayer, const int tube) const
Amg::Vector3D localNominalTubePosWoCutouts (const int tubelayer, const int tube) const
const Amg::Transform3DfromIdealToDeformed (const int tubelayer, const int tube) const
Amg::Vector3D posOnDefChamWire (const Amg::Vector3D &locAMDBPos, const double width_narrow, const double width_wide, const double height, const double thickness, const Amg::Vector3D &fixedPoint) const
void wireEndpointsAsBuilt (Amg::Vector3D &locAMDBWireEndP, Amg::Vector3D &locAMDBWireEndN, const int tubelayer, const int tube) const
Amg::Transform3D globalTransform (const Amg::Vector3D &tubePos, const Amg::Transform3D &toDeform) const
std::unique_ptr< GeoInfomakeGeoInfo (const int tubelayer, const int tube) const
const GeoInfogeoInfo (const int tubeLayer, const int tube) const
Amg::Transform3D deformedTransform (const int tubelayer, const int tube) const
void initMessaging () const
 Initialize our message level and MessageSvc.

Static Private Member Functions

static Amg::Transform3D tubeToMultilayerTransf (const Amg::Vector3D &tubePos, const Amg::Transform3D &toDeform)

Private Attributes

const MdtIdHelperm_idHelper {idHelperSvc()->mdtIdHelper()}
const int m_stIdx_BIS {m_idHelper.stationNameIndex("BIS")}
const int m_stIdx_BOL {m_idHelper.stationNameIndex("BOL")}
unsigned int m_nMDTinStation {0}
int m_multilayer {0}
int m_nlayers {-1}
double m_tubepitch {-9999.}
double m_tubelayerpitch {-9999.}
int m_ntubesperlayer {-1}
int m_nsteps {-1}
int m_ntubesinastep {-1}
double m_tubelenStepSize {-9999.}
double m_cutoutShift {-9999.}
double m_endpluglength {-9999.}
double m_deadlength {-9999.}
bool m_inBarrel {false}
std::array< double, maxnstepsm_tubelength {make_array<double, maxnsteps>(-9999.)}
std::array< double, maxnlayersm_firstwire_x {make_array<double, maxnlayers>(-9999.)}
std::array< double, maxnlayersm_firstwire_y {make_array<double, maxnlayers>(-9999.)}
double m_innerRadius {-9999.}
double m_tubeWallThickness {-9999.}
CxxUtils::CachedValue< int > m_zsignRO_tubeFrame {}
std::vector< CxxUtils::CachedUniquePtr< GeoInfo > > m_tubeGeo {}
std::vector< CxxUtils::CachedUniquePtr< GeoInfo > > m_backupTubeGeo {}
std::vector< CxxUtils::CachedUniquePtr< Amg::Transform3D > > m_deformTransf {}
const BLineParm_BLinePar {nullptr}
CxxUtils::CachedValue< Amg::Vector3Dm_elemNormal {}
std::vector< CxxUtils::CachedUniquePtr< Trk::StraightLineSurface > > m_tubeSurfaces {}
std::vector< CxxUtils::CachedUniquePtr< Trk::CylinderBounds > > m_tubeBounds {}
std::atomic< bool > m_haveTubeSurfaces {false}
 Flag whether any elements have been inserted into the corresponding vectors.
std::atomic< bool > m_haveTubeGeo {false}
std::atomic< bool > m_haveTubeBounds {false}
std::atomic< bool > m_haveDeformTransf {false}
CxxUtils::CachedUniquePtr< Trk::Surfacem_associatedSurface {}
CxxUtils::CachedUniquePtr< Trk::SurfaceBoundsm_associatedBounds {}
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)

Friends

class MuonGMR4::ReadoutGeomCnvAlg
class MuonChamber
class MuonChamberLite

Detailed Description

Constructor & Destructor Documentation

◆ MdtReadoutElement()

MuonGM::MdtReadoutElement::MdtReadoutElement ( GeoVFullPhysVol * pv,
const std::string & stName,
MuonDetectorManager * mgr )

Definition at line 60 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

60 :
62 // get the setting of the caching flag from the manager
63 m_inBarrel = stName[0]== 'B';
64
65 setStationName(stName);
66 }
MuonReadoutElement(GeoVFullPhysVol *pv, MuonDetectorManager *mgr, Trk::DetectorElemType detType)
const std::string & stName(StIndex index)
convert StIndex into a string

◆ ~MdtReadoutElement()

MuonGM::MdtReadoutElement::~MdtReadoutElement ( )
default

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()

Amg::Vector3D MuonGM::MuonReadoutElement::AmdbLRSToGlobalCoords ( const Amg::Vector3D & x) const
virtualinherited

◆ AmdbLRSToGlobalTransform()

Amg::Transform3D MuonGM::MuonReadoutElement::AmdbLRSToGlobalTransform ( ) const
virtualinherited

Reimplemented in MuonGM::MMReadoutElement, and MuonGM::sTgcReadoutElement.

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

90 {
92 }
const Amg::Transform3D & getNativeToAmdbLRS() const
Amg::Transform3D getTransform() const

◆ barrel()

bool MuonGM::MdtReadoutElement::barrel ( ) const

Returns whether the chamber is in the barrel (Assement on first later in stationName)

◆ bounds() [1/3]

const Trk::SurfaceBounds & MuonGM::MdtReadoutElement::bounds ( ) const
finaloverridevirtual

Return the boundaries of the element.

Implements Trk::TrkDetElementBase.

Definition at line 910 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

910 {
911 if (!m_associatedBounds) {
912 if (barrel()) {
914 std::make_unique<Trk::RectangleBounds>(getSsize() / 2., getZsize() / 2.));
915 } else {
916 m_associatedBounds.set(std::make_unique<Trk::TrapezoidBounds>(
917 getSsize() / 2., getLongSsize() / 2., getRsize() / 2.));
918 }
919 }
920 return *m_associatedBounds;
921 }
bool barrel() const
Returns whether the chamber is in the barrel (Assement on first later in stationName)

◆ bounds() [2/3]

virtual const Trk::CylinderBounds & MuonGM::MdtReadoutElement::bounds ( const Identifier & id) const
finaloverridevirtual

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.

◆ bounds() [3/3]

const Trk::CylinderBounds & MuonGM::MdtReadoutElement::bounds ( const int tubeLayer,
const int tube ) const
virtual

Definition at line 850 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

850 {
851 int istep = 0;
852 int ntot_steps = m_nsteps;
853
854 if (hasCutouts() && manager()->MinimalGeoFlag() == 0) {
855 ntot_steps = m_nlayers * m_ntubesperlayer;
856 istep = (tubeLayer - 1) * m_ntubesperlayer + tube - 1;
857 } else {
858 if (endcap()) istep = int((tube - 1) / m_ntubesinastep);
859
860 if (istep < 0 || istep >= ntot_steps) {
861 ATH_MSG_WARNING( "bounds for Element named "<< " with tech. " << getTechnologyType()
862 << " DEid = " << idHelperSvc()->toStringDetEl(identify()) << " called with: tubeL, tube " << tubeLayer << " " << tube
863 << "; step " << istep << " out of range 0-" << m_nsteps - 1 << " m_ntubesinastep " << m_ntubesinastep );
864 ATH_MSG_WARNING( "Please run in DEBUG mode to get extra diagnostic; setting istep = 0" );
865 }
866 }
867 if ((unsigned int)istep >= m_tubeBounds.size()) {
868 THROW_EXCEPTION(__func__<<"("<<tubeLayer<<","<<tube<<") but m_tubeBounds.size()="<<m_tubeBounds.size()<<" for "<<
869 idHelperSvc()->toStringDetEl(identify()));
870 }
872 if (!ptr) {
873 double tubelength = getTubeLengthForCaching(tubeLayer, tube);
874 ptr.set(std::make_unique<Trk::CylinderBounds>(innerTubeRadius(), 0.5 * tubelength - m_deadlength));
876 }
877 return *ptr;
878 }
#define ATH_MSG_WARNING(x)
double getTubeLengthForCaching(const int tubeLayer, const int tube) const
bool endcap() const
Returns whether the chamber is in the endcap.
std::vector< CxxUtils::CachedUniquePtr< Trk::CylinderBounds > > m_tubeBounds
double innerTubeRadius() const
Returns the inner tube radius excluding the aluminium walls.
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
CachedUniquePtrT< const T > CachedUniquePtr
void * ptr(T *p)
Definition SGImplSvc.cxx:74
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10

◆ center() [1/3]

const Amg::Vector3D & MuonGM::MdtReadoutElement::center ( ) const
finaloverridevirtual

Return the center of the element.

Implements Trk::TrkDetElementBase.

Definition at line 908 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

908{ return surface().center(); }
virtual const Trk::Surface & surface() const override final
Return surface associated with this detector element.
const Amg::Vector3D & center() const
Returns the center position of the Surface.

◆ center() [2/3]

virtual const Amg::Vector3D & MuonGM::MdtReadoutElement::center ( const Identifier & id) const
finaloverridevirtual

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

Implements Trk::TrkDetElementBase.

◆ center() [3/3]

const Amg::Vector3D & MuonGM::MdtReadoutElement::center ( const int tubeLayer,
const int tube ) const

◆ clearBLinePar()

void MuonGM::MdtReadoutElement::clearBLinePar ( )

◆ clearCache()

void MuonGM::MdtReadoutElement::clearCache ( )
finaloverridevirtual

Implements MuonGM::MuonReadoutElement.

Definition at line 922 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

922 {
923 ATH_MSG_DEBUG( "Clearing cache for ReadoutElement " << idHelperSvc()->toStringDetEl(identify()) );
925 m_associatedSurface.release();
926 }
927 else ATH_MSG_VERBOSE( "no associated surface to be deleted" );
928
929 if (m_associatedBounds) {
930 m_associatedBounds.release();
931 } ATH_MSG_VERBOSE( "no associated bounds to be deleted" );
932 m_elemNormal.reset();
933 if (m_haveTubeSurfaces) {
934 m_haveTubeSurfaces = false;
935 for (auto& s : m_tubeSurfaces) { s.release(); }
936 }
937 if (m_haveTubeGeo) {
938 m_haveTubeGeo = false;
939 for (auto& g : m_tubeGeo) { g.release(); }
940 }
941 if (m_haveTubeBounds) {
942 m_haveTubeBounds = false;
943 for (auto& b : m_tubeBounds) { b.release(); }
944 }
945 // reset here the deform-related transforms
946 if (m_haveDeformTransf) {
947 m_haveDeformTransf = false;
948 for (auto& d : m_deformTransf) { d.release(); }
949 }
950 }
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
std::vector< CxxUtils::CachedUniquePtr< Trk::StraightLineSurface > > m_tubeSurfaces
std::atomic< bool > m_haveTubeSurfaces
Flag whether any elements have been inserted into the corresponding vectors.
std::vector< CxxUtils::CachedUniquePtr< Amg::Transform3D > > m_deformTransf

◆ containsId()

bool MuonGM::MdtReadoutElement::containsId ( const Identifier & id) const
overridevirtual

Implements MuonGM::MuonReadoutElement.

Definition at line 1023 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

1023 {
1024 if (idHelperSvc()->detElId(id) != identify()) return false;
1025 int layer = m_idHelper.tubeLayer(id);
1026 if (layer < 1 || layer > getNLayers()) return false;
1027 int tube = m_idHelper.tube(id);
1028 return tube >= 1 && tube <= getNtubesperlayer();
1029 }
int getNLayers() const
Returns the number of tube layers inside the multilayer.
int getNtubesperlayer() const
Returns the number of tubes in each tube layer.
@ layer
Definition HitInfo.h:79

◆ deformedTransform()

Amg::Transform3D MuonGM::MdtReadoutElement::deformedTransform ( const int tubelayer,
const int tube ) const
private

Definition at line 461 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

461 {
462
463 const MuonStation* ms = parentMuonStation();
464 if (!ms->hasBLines() && !ms->hasMdtAsBuiltParams()) {
465 return Amg::Transform3D::Identity();
466 }
467 const Amg::Vector3D fixedPoint = ms->getBlineFixedPointInAmdbLRS();
468
469 // Chamber parameters
470 double moduleWidthS = m_Ssize;
471 double moduleWidthL = m_LongSsize;
472 double height = barrel() ? ms->ZsizeMdtStation() : ms->RsizeMdtStation();
473 double thickness = barrel() ? ms->RsizeMdtStation() : ms->ZsizeMdtStation();
474
475 ATH_MSG_VERBOSE("Calculate deformed transform "<<idHelperSvc()->toStringDetEl(identify())
476 <<", layer: "<<tubeLayer<<", tube: "<<tube<<", fixedPoint: "<<Amg::toString(fixedPoint)<<" / "
477 <<Amg::toString(ms->getGeoTransform()->getDefTransform() *ms->getNativeToAmdbLRS().inverse()* fixedPoint)
478 <<", height: "<<height<<", thickness: "<<thickness
479 <<", ideal tube: "<<Amg::toString(localNominalTubePosWoCutouts(tubeLayer,tube)));
480
481#ifndef NDEBUG
482 double heightML = barrel() ? m_Zsize : m_Rsize;
483 double thicknessML = barrel() ? m_Rsize : m_Zsize;
484 if (std::abs(height - heightML) > 10.) {
485 ATH_MSG_DEBUG( "RE " << idHelperSvc()->toStringDetEl(identify())
486 << "Different ML and MDTStation length in the precision coord.direction --- MultiLayerHeight, MDTstationHeigh "
487 << heightML << " " << height << " MultiLayerThickness, MDTstationThickness " << thicknessML << " " << thickness);
488 }
489#endif
490 // Chamber dimension in Z is defined with extraneous glue width. Correct for it
491 double glue = (tubePitch() - 2. * outerTubeRadius());
492 height -= glue;
493
494 // Calculate transformation from native to AMDB.
495 const Amg::Transform3D toAMDB = ms->getNativeToAmdbLRS() * toParentStation();
496 const Amg::Transform3D fromAMDB = toAMDB.inverse();
497
498 // Get positions of the wire center and end without deformations
499 Amg::Vector3D pt_center = localNominalTubePosWoCutouts(tubeLayer, tube);
500 double halftubelen = 0.5 * getNominalTubeLengthWoCutouts(tubeLayer, tube);
501
502 // Compute tube ends in AMDB coordinates
503 Amg::Vector3D pt_end1 = toAMDB * pt_center + halftubelen * Amg::Vector3D::UnitX(); // s>0 side
504 Amg::Vector3D pt_end2 = toAMDB * pt_center - halftubelen * Amg::Vector3D::UnitX(); // s>0 side
505
506 Amg::Vector3D pt_end1_new = pt_end1;
507 Amg::Vector3D pt_end2_new = pt_end2;
508
509 // if there are as built parameters ... apply them here
510 if (ms->hasMdtAsBuiltParams()) {
511 wireEndpointsAsBuilt(pt_end1_new, pt_end2_new, tubeLayer, tube);
512 }
513
514 // if there are deformation parameters ... apply them here
515 if (ms->hasBLines()) {
516
517 // Get positions after the deformations applied
518 // first wire end point
519 pt_end1_new = posOnDefChamWire(pt_end1_new, moduleWidthS, moduleWidthL, height, thickness, fixedPoint);
520
521 // second wire end point
522 pt_end2_new = posOnDefChamWire(pt_end2_new, moduleWidthS, moduleWidthL, height, thickness, fixedPoint);
523 }
524
525 // Switch tube ends back to MGM coordinates
526 pt_end1 = fromAMDB * pt_end1;
527 pt_end2 = fromAMDB * pt_end2;
528 pt_end1_new = fromAMDB * pt_end1_new;
529 pt_end2_new = fromAMDB * pt_end2_new;
530
531 // Calculate deformation. Make sure that the wire length stays the same.
532 // Code in positionOnDeformedChamber does not provide this by default.
533 // Break transformation into translation of the wire center and the rotation of the wire
534 // Move to the coordinate system originated at the wire center, then rotate the wire, then
535 // move wire center to the new position
536 const Amg::Vector3D pt_center_new = 0.5 * (pt_end1_new + pt_end2_new);
537 const Amg::Transform3D to_center{Amg::getTranslate3D(-pt_center)};
538 const Amg::Transform3D from_center{Amg::getTranslate3D(pt_center_new)};
539 const Amg::Vector3D old_direction = (pt_end2 - pt_end1).unit();
540 const Amg::Vector3D new_direction = (pt_end2_new - pt_end1_new).unit();
541 const Amg::Vector3D rotation_vector = old_direction.cross(new_direction);
542
543
544 Amg::Transform3D deformedTransform{Amg::Transform3D::Identity()};
545 if (rotation_vector.mag() > 10. * std::numeric_limits<double>::epsilon()) {
546 const Amg::AngleAxis3D wire_rotation(std::asin(rotation_vector.mag()), rotation_vector.unit());
547 deformedTransform = from_center * wire_rotation * to_center;
548 } else {
549 deformedTransform = from_center * to_center;
550 }
551 ATH_MSG_VERBOSE("To center "<<GeoTrf::toString(to_center)<<" from: "<<GeoTrf::toString(from_center)<<
552 " -- direction: "<<GeoTrf::toString(old_direction)<<" vs. "<<GeoTrf::toString(new_direction)
553 <<" --> rot: "<<GeoTrf::toString(rotation_vector)<<" ==> "<<GeoTrf::toString(deformedTransform,true));
554 return deformedTransform;
555 }
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
void wireEndpointsAsBuilt(Amg::Vector3D &locAMDBWireEndP, Amg::Vector3D &locAMDBWireEndN, const int tubelayer, const int tube) const
double getNominalTubeLengthWoCutouts(const int tubeLayer, const int tube) const
Amg::Vector3D localNominalTubePosWoCutouts(const int tubelayer, const int tube) const
Amg::Vector3D posOnDefChamWire(const Amg::Vector3D &locAMDBPos, const double width_narrow, const double width_wide, const double height, const double thickness, const Amg::Vector3D &fixedPoint) const
double outerTubeRadius() const
Returns the tube radius taking the thickness of the tubes into account.
double tubePitch() const
Returns the distance between 2 tubes in a tube layer.
Amg::Transform3D deformedTransform(const int tubelayer, const int tube) const
Amg::Transform3D getTranslate3D(const double X, const double Y, const double Z)
: Returns a shift transformation along an arbitrary axis
Eigen::AngleAxisd AngleAxis3D
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D

◆ 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.

◆ distanceFromRO() [1/2]

double MuonGM::MdtReadoutElement::distanceFromRO ( const Amg::Vector3D & GlobalHitPosition,
const Identifier & id ) const

◆ distanceFromRO() [2/2]

double MuonGM::MdtReadoutElement::distanceFromRO ( const Amg::Vector3D & GlobalHitPosition,
const int tubelayer,
const int tube ) const

Definition at line 189 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

189 {
190 // x is given in the global reference frame
191 const Amg::Vector3D cPos = center(tubeLayer, tube);
192 const Amg::Vector3D roPos = ROPos(tubeLayer, tube);
193 const Amg::Vector3D c_ro = cPos - roPos;
194 const Amg::Vector3D x_ro = x - roPos;
195
196 double scalprod = c_ro.dot(x_ro);
197 double wlen = getWireLength(tubeLayer, tube);
198 if (wlen > 10. * CLHEP::mm)
199 scalprod = std::abs(2. * scalprod / getWireLength(tubeLayer, tube));
200 else {
201 ATH_MSG_WARNING( " Distance of Point " <<Amg::toString(x) << " from RO side cannot be calculated (=0) since wirelength = " << wlen );
202 scalprod = 0.;
203 }
204 return scalprod;
205 }
Amg::Vector3D ROPos(const int tubelayer, const int tube) const
virtual const Amg::Vector3D & center(const Identifier &) const override final
Return the center of the surface associated with this identifier In the case of silicon it returns th...
double getWireLength(const int tubeLayer, const int tube) const

◆ endcap()

bool MuonGM::MdtReadoutElement::endcap ( ) const

Returns whether the chamber is in the endcap.

◆ fillCache()

void MuonGM::MdtReadoutElement::fillCache ( )
finaloverridevirtual

Implements MuonGM::MuonReadoutElement.

Definition at line 961 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

961 {
962 ATH_MSG_DEBUG( "Filling cache for ReadoutElement " << idHelperSvc()->toStringDetEl(identify()));
963
964 const Trk::PlaneSurface* tmpSurface = dynamic_cast<const Trk::PlaneSurface*>(&surface()); //<! filling m_associatedSurface
965 const Trk::SurfaceBounds* tmpBounds = nullptr; //<! filling m_associatedBounds
966 if (barrel())
967 tmpBounds = dynamic_cast<const Trk::RectangleBounds*>(&bounds());
968 else
969 tmpBounds = dynamic_cast<const Trk::TrapezoidBounds*>(&bounds());
970 ATH_MSG_VERBOSE( "global Surface / Bounds pointers " << tmpSurface << " " << tmpBounds );
971 ATH_MSG_VERBOSE( "global Normal " << normal() );
972
973 const Trk::CylinderBounds* tmpCil = nullptr;
974 const Trk::StraightLineSurface* tmpSaggL = nullptr;
975 Amg::Vector3D myPoint{Amg::Vector3D::Zero()};
976 Amg::Transform3D myTransform{Amg::Transform3D::Identity()};
977 for (int tl = 1; tl <= getNLayers(); ++tl) {
978 for (int tube = 1; tube <= getNtubesperlayer(); ++tube) {
979 // in case of BMG chambers, do not check the 'dead' tubes
980 // (the tubes are numbered from 1-54 for each however there are cutouts for the
981 // alignment system where no tubes are built-in, meaning, those tubes do not exist/are 'dead')
982 if (manager()->mdtIdHelper()->isBMG(identify())) {
983 PVConstLink cv = getMaterialGeom();
984 // usually the tube number corresponds to the child number, however for
985 // BMG chambers full tubes are skipped during the building process
986 // therefore the matching needs to be done via the volume ID
987 int packed_id = tube + maxNTubesPerLayer * tl;
988 bool found = false;
989 geoGetIds(
990 [&](int id) {
991 if (!found && id == packed_id) {
992 myTransform = transform(tl, tube); //<! filling m_tubeTransf
993 myPoint = center(tl, tube); //<! filling m_tubeCenter
994 tmpCil = dynamic_cast<const Trk::CylinderBounds*>(&bounds(tl, tube)); //<! filling m_tubeBounds
995 tmpSaggL = dynamic_cast<const Trk::StraightLineSurface*>(&surface(tl, tube)); //<! filling m_tubeSurfaces
996 found = true;
997 }
998 },
999 &*cv);
1000 if (found) {
1001 ATH_MSG_VERBOSE( "tubeLayer/tube " << tl << " " << tube << " transform at origin "
1002 << Amg::toString(myTransform.linear()) );
1003 ATH_MSG_VERBOSE( "tubeLayer/tube " << tl << " " << tube << " tube center " << myPoint );
1004 ATH_MSG_VERBOSE( "tubeLayer/tube " << tl << " " << tube << " tube bounds pointer " << tmpCil );
1005 ATH_MSG_VERBOSE( "tubeLayer/tube " << tl << " " << tube << " tube surface pointer " << tmpSaggL );
1006 }
1007 } else {
1008 // print in order to compute !!!
1009 myTransform = transform(tl, tube); //<! filling m_tubeTransf
1010 myPoint = center(tl, tube); //<! filling m_tubeCenter
1011 tmpCil = dynamic_cast<const Trk::CylinderBounds*>(&bounds(tl, tube)); //<! filling m_tubeBounds
1012 tmpSaggL = dynamic_cast<const Trk::StraightLineSurface*>(&surface(tl, tube)); //<! filling m_tubeSurfaces
1013 ATH_MSG_VERBOSE( "tubeLayer/tube " << tl << " " << tube << " transform at origin "
1014 << Amg::toString(myTransform.translation()) );
1015 ATH_MSG_VERBOSE( "tubeLayer/tube " << tl << " " << tube << " tube center " << myPoint );
1016 ATH_MSG_VERBOSE( "tubeLayer/tube " << tl << " " << tube << " tube bounds pointer " << tmpCil );
1017 ATH_MSG_VERBOSE( "tubeLayer/tube " << tl << " " << tube << " tube surface pointer " << tmpSaggL );
1018 }
1019 }
1020 }
1021 }
void geoGetIds(FUNCTION f, const GeoGraphNode *node, int depthLimit=1)
Template helper for running the visitor.
Definition GeoGetIds.h:82
virtual const Amg::Vector3D & normal(const Identifier &) const override final
Return the normal of the surface associated with this identifier In the case of silicon it returns th...
virtual const Amg::Transform3D & transform() const override final
Return local to global transform.
virtual const Trk::SurfaceBounds & bounds() const override final
Return the boundaries of the element.

◆ fromIdealToDeformed()

const Amg::Transform3D & MuonGM::MdtReadoutElement::fromIdealToDeformed ( const int tubelayer,
const int tube ) const
private

Definition at line 433 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

433 {
434 size_t itube = (tubeLayer - 1) * m_ntubesperlayer + tube - 1;
435 if (itube >= m_deformTransf.size()) {
436 ATH_MSG_WARNING(__func__<<"() :"<<__LINE__<< " called with tubeLayer or tube out of range in chamber "
437 << idHelperSvc()->toStringDetEl(identify()) << " : layer " << tubeLayer << " max " << m_nlayers << " tube " << tube
438 << " max " << m_ntubesperlayer << " will compute deformation for first tube in this chamber" );
439 ATH_MSG_WARNING( "Please run in DEBUG mode to get extra diagnostic" );
440 itube = 0;
441 }
442
444 if (!ptr) {
445 Amg::Transform3D trans = deformedTransform(tubeLayer, tube);
446 ptr.set(std::make_unique<Amg::Transform3D>(std::move(trans)));
448 }
449 return *ptr;
450 }

◆ geoInfo()

const MdtReadoutElement::GeoInfo & MuonGM::MdtReadoutElement::geoInfo ( const int tubeLayer,
const int tube ) const
private

Definition at line 807 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

807 {
808 size_t itube = (tubeLayer - 1) * m_ntubesperlayer + tube - 1;
809 if (itube >= m_tubeGeo.size()) {
810 ATH_MSG_WARNING(__func__<<"() :"<<__LINE__<<" called with tubeLayer or tube out of range in chamber "
811 << idHelperSvc()->toStringDetEl(identify()) << " : layer " << tubeLayer << " max " << m_nlayers << " tube " << tube
812 << " max " << m_ntubesperlayer << " will compute transform for first tube in this chamber" );
813 ATH_MSG_WARNING( "Please run in DEBUG mode to get extra diagnostic" );
814 itube = 0;
815 }
816
818 if (!ptr) {
819 ptr.set(makeGeoInfo(tubeLayer, tube));
820 if (!m_haveTubeGeo) m_haveTubeGeo = true;
821 }
822 return *ptr;
823 }
std::unique_ptr< GeoInfo > makeGeoInfo(const int tubelayer, const int tube) const

◆ geoInitDone()

void MuonGM::MdtReadoutElement::geoInitDone ( )
private

Definition at line 93 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

93 {
97
98 int ntot_steps = m_nsteps;
99 if (hasCutouts() && manager()->MinimalGeoFlag() == 0) { ntot_steps = m_nlayers * m_ntubesperlayer; }
100 m_tubeBounds.resize(ntot_steps);
101 }

◆ getActiveTubeLength()

double MuonGM::MdtReadoutElement::getActiveTubeLength ( const int tubeLayer,
const int tube ) const

◆ getBLinePar()

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

◆ getLongRsize()

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

◆ getLongSsize()

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

◆ getLongZsize()

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

◆ getMultilayer()

int MuonGM::MdtReadoutElement::getMultilayer ( ) const

Returns the multilayer represented by the readout element.

◆ getNLayers()

int MuonGM::MdtReadoutElement::getNLayers ( ) const

Returns the number of tube layers inside the multilayer.

◆ getNominalTubeLengthWoCutouts()

double MuonGM::MdtReadoutElement::getNominalTubeLengthWoCutouts ( const int tubeLayer,
const int tube ) const
private

Definition at line 407 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

407 {
408 if (barrel())
409 return m_Ssize;
410 else {
411 int istep = int((tube - 1) / m_ntubesinastep);
412 if (istep < 0 || istep >= m_nsteps) {
413 ATH_MSG_WARNING( "getNominalTubeLengthWoCutouts for Element named " << idHelperSvc()->toStringDetEl(identify())
414 << " called with: tubeL, tube " << tubeLayer
415 << " " << tube << "; step " << istep << " out of range 0-" << m_nsteps - 1 << " m_ntubesinastep " << m_ntubesinastep);
416 istep = 0;
417 }
418 return m_tubelength[istep];
419 }
420 }

◆ getNtubesinastep()

int MuonGM::MdtReadoutElement::getNtubesinastep ( ) const

Returns the number of tubes in the endcap trapezoid sharing the same length.

◆ getNtubesperlayer()

int MuonGM::MdtReadoutElement::getNtubesperlayer ( ) const

Returns the number of tubes in each tube layer.

◆ 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); }

◆ getTubeLengthForCaching()

double MuonGM::MdtReadoutElement::getTubeLengthForCaching ( const int tubeLayer,
const int tube ) const
private

Definition at line 103 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

103 {
104 double nominalTubeLength = 0.;
105 if (barrel())
106 nominalTubeLength = m_Ssize;
107 else {
108 int istep = int((tube - 1) / m_ntubesinastep);
109 if (istep < 0 || istep >= m_nsteps) {
110 ATH_MSG_WARNING( "getTubeLenght for Element with tech. " << getTechnologyType()
111 << " DEid = " << idHelperSvc()->toStringDetEl(identify()) << " called with: tubeL, tube " << tubeLayer << " " << tube
112 << "; step " << istep << " out of range 0-" << m_nsteps - 1 << " m_ntubesinastep " << m_ntubesinastep );
113 istep = 0;
114 }
115 nominalTubeLength = m_tubelength[istep];
116 }
117
118 double tlength = nominalTubeLength;
119
120 if (hasCutouts()) {
121 if (manager()->MinimalGeoFlag() == 0) {
122 ATH_MSG_VERBOSE( " MdtReadoutElement " <<idHelperSvc()->toStringDetEl(identify())
123 << " has cutouts, check for real tube length for tubeLayer, tube " << tubeLayer << " " << tube );
124 PVConstLink cv = getMaterialGeom(); // it is "Multilayer"
125 int nGrandchildren = cv->getNChildVols();
126 if (nGrandchildren <= 0) return tlength;
127 // child vol 0 is foam; 1 to (nGrandchildren-1) should be tubes
128 int ii = (tubeLayer - 1) * m_ntubesperlayer + tube;
129 // BIS78 only (the BIS7 of Run1/2 has no cutouts, thus, this block won't be reached)
130 if ((getStationIndex() == m_stIdx_BIS && std::abs(getStationEta()) == 7)) --ii;
131 if (m_idHelper.isBMG(identify())) {
132 // usually the tube number corresponds to the child number, however for
133 // BMG chambers full tubes are skipped during the building process
134 // therefore the matching needs to be done via the volume ID
135 int packed_id = tube + maxNTubesPerLayer * tubeLayer;
136 int kk = 0;
137 bool found = false;
138 geoGetIds(
139 [&](int id) {
140 if (!found && id == packed_id) {
141 ii = kk;
142 found = true;
143 }
144 ++kk;
145 }, cv);
146 if (found) {
147 ATH_MSG_DEBUG( " MdtReadoutElement tube match found for BMG - input : tube(" << tube << "), layer("
148 << tubeLayer << ") - output match : tube(" << ii % maxNTubesPerLayer << "), layer(" << ii / maxNTubesPerLayer
149 << ")" );
150 }
151 }
152 if (ii >= nGrandchildren) {
153 ATH_MSG_WARNING( " MdtReadoutElement " << idHelperSvc()->toStringDetEl(identify()) << " has cutouts, nChild = " << nGrandchildren
154 << " --- getTubeLength is looking for child with index ii=" << ii << " for tubeL and tube = " << tubeLayer << " "
155 << tube );
156 ATH_MSG_WARNING( "returning nominalTubeLength " );
157 return tlength;
158 }
159 if (ii < 0) {
160 ATH_MSG_WARNING( " MdtReadoutElement " << idHelperSvc()->toStringDetEl(identify()) << " has cutouts, nChild = " << nGrandchildren
161 << " --- getTubeLength is looking for child with index ii=" << ii << " for tubeL and tube = " << tubeLayer << " "
162 << tube );
163 ATH_MSG_WARNING( "returning nominalTubeLength " );
164 return tlength;
165 }
166 PVConstLink physChild = cv->getChildVol(ii);
167 const GeoShape* shape = physChild->getLogVol()->getShape();
168 if (shape == nullptr) return tlength;
169 const GeoTube* theTube = dynamic_cast<const GeoTube*>(shape);
170 if (theTube != nullptr)
171 tlength = 2. * theTube->getZHalfLength();
172 else
173 ATH_MSG_WARNING( "PhysChild with index " << ii
174 << " out of (tubeLayer-1)*m_ntubesperlayer+tube with tl=" << tubeLayer << " tubes/lay=" << m_ntubesperlayer
175 << " t=" << tube << " for MdtReadoutElement " << idHelperSvc()->toStringDetEl(identify()) );
176 }
177 if (std::abs(tlength - nominalTubeLength) > 0.1) {
178 ATH_MSG_VERBOSE( "Tube " << tube << " in tubeLayer = " << tubeLayer
179 << " is affected by a cutout: eff. length = " << tlength << " while nominal = " << nominalTubeLength
180 << " in station " << idHelperSvc()->toStringDetEl(identify()));
181 } else {
182 ATH_MSG_VERBOSE( "Tube " << tube << " in tubeLayer = " << tubeLayer
183 << " is NOT affected by the cutout: eff. length = " << tlength << " while nominal = " << nominalTubeLength);
184 }
185 }
186 return tlength;
187 }

◆ getWireFirstLocalCoordAlongR()

bool MuonGM::MdtReadoutElement::getWireFirstLocalCoordAlongR ( int tubeLayer,
double & coord ) const

Definition at line 86 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

86 {
87 coord = -9999.;
88 if (tubeLayer > getNLayers() || tubeLayer < 1) return false;
89 coord = m_firstwire_y[tubeLayer - 1];
90 return true;
91 }
double coord
Type of coordination system.

◆ getWireFirstLocalCoordAlongZ()

bool MuonGM::MdtReadoutElement::getWireFirstLocalCoordAlongZ ( int tubeLayer,
double & coord ) const

Definition at line 80 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

80 {
81 coord = -9999.;
82 if (tubeLayer > getNLayers() || tubeLayer < 1) return false;
83 coord = m_firstwire_x[tubeLayer - 1];
84 return true;
85 }

◆ getWireLength()

double MuonGM::MdtReadoutElement::getWireLength ( const int tubeLayer,
const int tube ) const

◆ getZsize()

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

◆ globalPosition()

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

◆ GlobalToAmdbLRSCoords()

Amg::Vector3D MuonGM::MuonReadoutElement::GlobalToAmdbLRSCoords ( const Amg::Vector3D & x) const
virtualinherited

◆ GlobalToAmdbLRSTransform()

Amg::Transform3D MuonGM::MuonReadoutElement::GlobalToAmdbLRSTransform ( ) const
virtualinherited

◆ globalToLocalTransf() [1/2]

Amg::Transform3D MuonGM::MdtReadoutElement::globalToLocalTransf ( const Identifier & id) const

◆ globalToLocalTransf() [2/2]

Amg::Transform3D MuonGM::MdtReadoutElement::globalToLocalTransf ( const int tubeLayer,
const int tube ) const

Definition at line 400 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

400 {
401 return transform(tubeLayer, tube).inverse();
402 }

◆ globalTransform()

Amg::Transform3D MuonGM::MdtReadoutElement::globalTransform ( const Amg::Vector3D & tubePos,
const Amg::Transform3D & toDeform ) const
private

Definition at line 391 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

391 {
392 return transform() * tubeToMultilayerTransf(tubePos, toDeform);
393 }
Amg::Transform3D tubeToMultilayerTransf(const Identifier &id) const
Amg::Vector3D tubePos(const Identifier &id) const
Returns the global position of the given tube.

◆ 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

◆ 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)

◆ innerTubeRadius()

double MuonGM::MdtReadoutElement::innerTubeRadius ( ) const

Returns the inner tube radius excluding the aluminium walls.

◆ isAtReadoutSide() [1/2]

int MuonGM::MdtReadoutElement::isAtReadoutSide ( const Amg::Vector3D & GlobalHitPosition,
const Identifier & id ) const

◆ isAtReadoutSide() [2/2]

int MuonGM::MdtReadoutElement::isAtReadoutSide ( const Amg::Vector3D & GlobalHitPosition,
const int tubelayer,
const int tube ) const

Definition at line 207 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

207 {
208 double distance = distanceFromRO(GlobalHitPosition, tubeLayer, tube);
209 if (distance < 0) {
210 ATH_MSG_WARNING( "isAtReadoutSide() - GlobalHitPosition appears to be outside the tube volume " << distance );
211 return 1;
212 } else if (distance <= getWireLength(tubeLayer, tube) / 2.)
213 return 1;
214 else if (distance < getWireLength(tubeLayer, tube))
215 return -1;
216 else {
217 ATH_MSG_WARNING( "isAtReadoutSide() - GlobalHitPosition appears to be outside the tube volume " << distance );
218 return -1;
219 }
220 }
double distanceFromRO(const Amg::Vector3D &GlobalHitPosition, const Identifier &id) const
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space

◆ 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 }
#define ATH_MSG_FATAL(x)

◆ localNominalTubePosWoCutouts()

Amg::Vector3D MuonGM::MdtReadoutElement::localNominalTubePosWoCutouts ( const int tubelayer,
const int tube ) const
private

Definition at line 421 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

421 {
422 double xtube{0.}, ztube{0.};
423 if (barrel()) {
424 xtube = -m_Rsize / 2. + m_firstwire_y[tubeLayer - 1];
425 ztube = -m_Zsize / 2. + m_firstwire_x[tubeLayer - 1] + (tube - 1) * m_tubepitch;
426 } else {
427 xtube = -m_Zsize / 2. + m_firstwire_y[tubeLayer - 1];
428 ztube = -m_Rsize / 2. + m_firstwire_x[tubeLayer - 1] + (tube - 1) * m_tubepitch;
429 }
430 return Amg::Vector3D{xtube, 0., ztube};
431 }

◆ localROPos() [1/2]

Amg::Vector3D MuonGM::MdtReadoutElement::localROPos ( const Identifier & id) const

◆ localROPos() [2/2]

Amg::Vector3D MuonGM::MdtReadoutElement::localROPos ( const int tubelayer,
const int tube ) const

Definition at line 285 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

285 {
286 return tubeToMultilayerTransf(tubeLayer, tube) * tubeFrame_localROPos(tubeLayer, tube);
287 }
Amg::Vector3D tubeFrame_localROPos(const int tubelayer, const int tube) const

◆ localToGlobalTransf() [1/2]

const Amg::Transform3D & MuonGM::MdtReadoutElement::localToGlobalTransf ( const Identifier & id) const

◆ localToGlobalTransf() [2/2]

const Amg::Transform3D & MuonGM::MdtReadoutElement::localToGlobalTransf ( const int tubeLayer,
const int tube ) const

◆ localTubePos() [1/2]

Amg::Vector3D MuonGM::MdtReadoutElement::localTubePos ( const Identifier & id) const

◆ localTubePos() [2/2]

Amg::Vector3D MuonGM::MdtReadoutElement::localTubePos ( const int tubelayer,
const int tube ) const

Definition at line 291 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

291 {
292 return fromIdealToDeformed(tubeLayer, tube) * nodeform_localTubePos(tubeLayer, tube);
293 }
Amg::Vector3D nodeform_localTubePos(const Identifier &id) const
const Amg::Transform3D & fromIdealToDeformed(const int tubelayer, const int tube) const

◆ makeGeoInfo()

std::unique_ptr< MdtReadoutElement::GeoInfo > MuonGM::MdtReadoutElement::makeGeoInfo ( const int tubelayer,
const int tube ) const
private

Definition at line 802 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

802 {
804 return std::make_unique<GeoInfo>(std::move(transform));
805 }
Amg::Transform3D globalTransform(const Amg::Vector3D &tubePos, const Amg::Transform3D &toDeform) const
virtual const Amg::Transform3D & transform(const Identifier &id) const override final
Return local to global transform associated with this identifier.

◆ manager()

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

◆ 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 163 of file AthMessaging.h.

164{
165 MsgStream* ms = m_msg_tls.get();
166 if (!ms) {
167 if (!m_initialized.test_and_set()) initMessaging();
168 ms = new MsgStream(m_imsg,m_nm);
169 m_msg_tls.reset( ms );
170 }
171
172 ms->setLevel (m_lvl);
173 return *ms;
174}
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 178 of file AthMessaging.h.

179{ 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 (m_lvl <= lvl) {
154 msg() << lvl;
155 return true;
156 } else {
157 return false;
158 }
159}

◆ nMDTinStation()

unsigned int MuonGM::MdtReadoutElement::nMDTinStation ( ) const
inline

◆ nodeform_globalToLocalTransf() [1/2]

Amg::Transform3D MuonGM::MdtReadoutElement::nodeform_globalToLocalTransf ( const Identifier & id) const

◆ nodeform_globalToLocalTransf() [2/2]

Amg::Transform3D MuonGM::MdtReadoutElement::nodeform_globalToLocalTransf ( const int tubeLayer,
const int tube ) const

Definition at line 404 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

404 {
405 return nodeform_localToGlobalTransf(tubeLayer, tube).inverse();
406 }
Amg::Transform3D nodeform_localToGlobalTransf(const Identifier &id) const

◆ nodeform_localToGlobalTransf() [1/2]

Amg::Transform3D MuonGM::MdtReadoutElement::nodeform_localToGlobalTransf ( const Identifier & id) const

◆ nodeform_localToGlobalTransf() [2/2]

Amg::Transform3D MuonGM::MdtReadoutElement::nodeform_localToGlobalTransf ( const int tubeLayer,
const int tube ) const

Definition at line 397 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

397 {
398 return globalTransform(nodeform_localTubePos(tubeLayer, tube), Amg::Transform3D::Identity());
399 }

◆ nodeform_localTubePos() [1/2]

Amg::Vector3D MuonGM::MdtReadoutElement::nodeform_localTubePos ( const Identifier & id) const

◆ nodeform_localTubePos() [2/2]

Amg::Vector3D MuonGM::MdtReadoutElement::nodeform_localTubePos ( const int tubelayer,
const int tube ) const

Definition at line 295 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

295 {
296 ATH_MSG_VERBOSE( " Computing LocalTubePos for "<< idHelperSvc()->toStringDetEl(identify())
297 << "/" << tubeLayer << "/" << tube );
298 double xtube{0.}, ytube{0.}, ztube{0.};
299 if (barrel()) {
300 xtube = -m_Rsize / 2. + m_firstwire_y[tubeLayer - 1];
301 ztube = -m_Zsize / 2. + m_firstwire_x[tubeLayer - 1] + (tube - 1) * m_tubepitch;
302 } else {
303 xtube = -m_Zsize / 2. + m_firstwire_y[tubeLayer - 1];
304 ztube = -m_Rsize / 2. + m_firstwire_x[tubeLayer - 1] + (tube - 1) * m_tubepitch;
305 }
306 Amg::Vector3D tubePos{xtube, ytube, ztube};
307 if (hasCutouts()) {
308 if (manager()->MinimalGeoFlag() == 0) {
309 ATH_MSG_DEBUG( " MdtReadoutElement " << idHelperSvc()->toStringDetEl(identify()) << " has cutouts, check for real position of tubes " );
310 PVConstLink cv = getMaterialGeom(); // it is "Multilayer"
311 int nGrandchildren = cv->getNChildVols();
312 // child vol 0 is foam; 1 to (nGrandchildren-1) should be tubes
313 int ii = (tubeLayer - 1) * m_ntubesperlayer + tube;
314
315 // BIS78 only (the BIS7 of Run1/2 has no cutouts, thus, this block won't be reached)
316 if ((getStationIndex() == m_stIdx_BIS && std::abs(getStationEta()) == 7)) --ii;
317 if (m_idHelper.isBMG(identify())) {
318 // usually the tube number corresponds to the child number, however for
319 // BMG chambers full tubes are skipped during the building process
320 // therefore the matching needs to be done via the volume ID
321 int packed_id = tube + maxNTubesPerLayer * tubeLayer;
322 int kk = 0;
323 bool found = false;
324 geoGetIds(
325 [&](int id) {
326 if (!found && id == packed_id) {
327 ii = kk;
328 found = true;
329 }
330 ++kk;
331 },
332 &*cv);
333 if (found) {
334 ATH_MSG_DEBUG( " MdtReadoutElement tube match found for BMG - input : tube(" << tube << "), layer("
335 << tubeLayer << ") - output match : tube(" << ii % maxNTubesPerLayer << "), layer(" << ii / maxNTubesPerLayer
336 << ")" );
337 }
338 }
339 GeoTrf::Transform3D tubeTrans = cv->getXToChildVol(ii);
340 PVConstLink tv = cv->getChildVol(ii);
341 constexpr double maxtol = 0.0000001;
342
343 if (std::abs(xtube - tubeTrans(0, 3)) > maxtol || std::abs(ztube - tubeTrans(2, 3)) > maxtol) {
344 THROW_EXCEPTION(__func__<<"("<<tubeLayer<<","<<tube<<")"<<" - mismatch between local from tube-id/pitch/cutout position"<<
345 Amg::toString(tubePos)<<" and GeoModel "<< Amg::toString(tubeTrans.linear().col(3))<<" for detector element "<<
346 idHelperSvc()->toStringDetEl(identify()) <<"There are "<<nGrandchildren<<" child volumes and "<<
347 (m_ntubesperlayer * m_nlayers)<<" are expected. There should be "<<m_nlayers<<" and "<<
348 m_ntubesperlayer<<" tubes per layer");
349 }
350 if (tubeTrans(1, 3) > maxtol) {
351
352 ATH_MSG_DEBUG( "This a tube with cutout stName/Eta/Phi/ml/tl/t = " << idHelperSvc()->toStringDetEl(identify())
353 << "/" << tubeLayer << "/" << tube);
354 // check only for tubes actually shifted
355 if (std::abs(m_cutoutShift - tubeTrans(1, 3)) > maxtol) {
356 THROW_EXCEPTION(__func__<<"("<<tubeLayer<<","<<tube<<")"<<" - mismatch between local from tube-id/pitch/cutout position"<<
357 Amg::toString(tubePos)<<" and GeoModel "<< Amg::toString(tubeTrans.linear().col(3))<<" for detector element "<<
358 idHelperSvc()->toStringDetEl(identify()) <<"There are "<<nGrandchildren<<" child volumes and "<<
359 (m_ntubesperlayer * m_nlayers)<<" are expected. There should be "<<m_nlayers<<" and "<<
360 m_ntubesperlayer<<" tubes per layer");
361 }
362 }
363
364 Amg::Vector3D x = tubeTrans.translation();
365 if (tube > m_ntubesperlayer || tubeLayer > m_nlayers) { x = tubePos; }
366 return x;
367 }
368 }
369 return tubePos;
370 }

◆ nodeform_tubePos() [1/2]

Amg::Vector3D MuonGM::MdtReadoutElement::nodeform_tubePos ( const Identifier & id) const

Returns the global position of the tube excluding the B-line & As-built corrections.

◆ nodeform_tubePos() [2/2]

Amg::Vector3D MuonGM::MdtReadoutElement::nodeform_tubePos ( const int tubelayer,
const int tube ) const

Definition at line 372 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

372 {
373 return transform() * nodeform_localTubePos(tubeLayer, tube);
374 }

◆ normal() [1/2]

const Amg::Vector3D & MuonGM::MdtReadoutElement::normal ( ) const
finaloverridevirtual

Return the normal of the element.

Implements Trk::TrkDetElementBase.

Definition at line 880 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

880 {
881 if (!m_elemNormal.isValid()) { m_elemNormal.set(transform().linear() * Amg::Vector3D::UnitX()); }
882 return *m_elemNormal.ptr();
883 }

◆ normal() [2/2]

virtual const Amg::Vector3D & MuonGM::MdtReadoutElement::normal ( const Identifier & id) const
finaloverridevirtual

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

Implements Trk::TrkDetElementBase.

◆ outerTubeRadius()

double MuonGM::MdtReadoutElement::outerTubeRadius ( ) const

Returns the tube radius taking the thickness of the tubes into account.

◆ 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 }

◆ posOnDefChamWire()

Amg::Vector3D MuonGM::MdtReadoutElement::posOnDefChamWire ( const Amg::Vector3D & locAMDBPos,
const double width_narrow,
const double width_wide,
const double height,
const double thickness,
const Amg::Vector3D & fixedPoint ) const
private

Definition at line 578 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

583 {
584
585 using Parameter = BLinePar::Parameter;
586 const double sp = m_BLinePar->getParameter(Parameter::sp);
587 const double sn = m_BLinePar->getParameter(Parameter::sn);
588 const double tw = m_BLinePar->getParameter(Parameter::tw);
589 const double eg = m_BLinePar->getParameter(Parameter::eg);
590 double ep = m_BLinePar->getParameter(Parameter::ep);
591 double en = m_BLinePar->getParameter(Parameter::en);
592 // S.Spagnolo Feb.6, 2011, modified by P.F Giraud, 2015-01-17
593 // This version does not implement deformations modifying only the second
594 // coordinate, or leaving the end-plug positions unchanged.
595 // This version should be called only with the coordinates of the end-plugs
596 // as argument, as is done in fromIdealToDeformed
597
598 // MDT deformations like tube bow: bz,bp,bn bend the tube while the wire endpoints are not affected
599 // => the wire keeps it's nominal straight line trajectory but it is not concentric to the tube
600 // ==> in this function bz, bp and bn are ignored or set to 0
601 // MDT deformations that extend/contract the wire longitudinally (while keeping it straight):
602 // delta_s from eg and tr are irrelevant for the tube geometry
603 // and for the wire trajectory => set to 0 here
604 // (should be applied as a correction to the
605 // tube lenght => tube surface bounds
606 // =++>>>> effect in tracking just through the gravitational sagging TOTALLY NEGLIGIBLE=> ignore)
607 // pg is irrelevant for tracking purposes and (at least for the endcaps) is applies to the internal bars only, not to the tubes !!!
608 // =++>>>> IGNORE IT
609 // ep,en: bend the tube by moving (differently) the endplugs ===> the wire straight trajectory is moved w.r.t. the nominal one
610 // in addition the tubes keep their nominal position at the center => the wire is not concentric to
611 // the tube delta_s from ep,en must also be considered for the implementation of the realistic tube
612 // trajectory induced by ep,en
613 // tw,sp,sn,pg (for deltaT and deltaZ) are geometrical effects, that impact on tracking and keep the wire straight.
614
615
616
617 Amg::Vector3D deformPos(locAMDBPos);
618
619 // NOTE s0,z0,t0 are the coord. in the amdb frame of this point: the origin of the frame can be different than the fixed point for
620 // deformations s0mdt,z0mdt,t0mdt
621 // (always equal to the point at lowest t,z and s=0 of the MDT stack)
622 ATH_MSG_VERBOSE( "** In "<<__func__<<" - moduleWidthS " << moduleWidthS<<", moduleWidthL: "
623 <<moduleWidthL <<", height: "<<height<<", thickness: " <<thickness << "." );
624 ATH_MSG_VERBOSE( "** In "<<__func__<<" - going to correct for B-line the position of Point at " <<Amg::toString(locAMDBPos)
625 << " in the amdb-szt frame" );
626
627 double s0mdt = locAMDBPos.x(); // always I think !
628 if (std::abs(fixedPoint.x()) > 0.01) {
629 s0mdt = locAMDBPos.x() - fixedPoint.x();
630 }
631 double z0mdt = locAMDBPos.y();
632 // unless in the D section of this station there's a dy diff. from 0 for the innermost MDT multilayer (sometimes in the barrel)
633 if (std::abs(fixedPoint.y()) > 0.01) {
634 z0mdt = locAMDBPos.y() - fixedPoint.y();
635 }
636 double t0mdt = locAMDBPos.z();
637 // unless in the D section of this station there's a dz diff. from 0 for the innermost MDT multilayer (often in barrel)
638 if (std::abs(fixedPoint.z()) > 0.01) t0mdt = locAMDBPos.z() - fixedPoint.z();
639 if (z0mdt < 0 || t0mdt < 0) {
640 ATH_MSG_WARNING(""<<__func__<<": correcting the local position of a point outside the mdt station (2 multilayers) volume -- RE "
641 << idHelperSvc()->toStringDetEl(identify()) << " local point: szt=" << Amg::toString(locAMDBPos)
642 << " fixedPoint " <<Amg::toString(fixedPoint) );
643 }
644 ATH_MSG_VERBOSE( "** In "<<__func__<<" - correct for offset of B-line fixed point " << s0mdt << " " << z0mdt << " " << t0mdt);
645
646 double ds{0.},dz{0.},dt{0.};
647 double width_actual = moduleWidthS + (moduleWidthL - moduleWidthS) * (z0mdt / height);
648 double s_rel = s0mdt / (width_actual / 2.);
649 double z_rel = (z0mdt - height / 2.) / (height / 2.);
650 double t_rel = (t0mdt - thickness / 2.) / (thickness / 2.);
651
652 ATH_MSG_VERBOSE( "** In "<<__func__<<" - width_actual: "<<width_actual<<", s_rel: "<<s_rel<<", z_rel: "
653 <<z_rel<<", t_rel: "<<t_rel);
654
655 // sp, sn - cross plate sag out of plane
656 if ((sp != 0) || (sn != 0)) {
657 double ztmp = z_rel * z_rel - 1;
658 dt += 0.5 * (sp + sn) * ztmp + 0.5 * (sp - sn) * ztmp * s_rel;
659 }
660
661 // tw - twist
662 if (tw != 0) {
663 dt -= tw * s_rel * z_rel;
664 dz += tw * s_rel * t_rel * thickness / height;
665 ATH_MSG_VERBOSE( "** In "<<__func__<<": tw=" << tw << " dt, dz " << dt << " " << dz );
666 }
667
668 // eg - global expansion
669 if (eg != 0) {
670 double egppm = eg / 1000.;
671 ds += 0.;
672 dz += z0mdt * egppm;
673 dt += t0mdt * egppm;
674 }
675
676 // ep, en - local expansion
677 //
678 // Imporant note: the chamber height and length, as they denoted in Christoph's talk,
679 // correspond to thickness and height parameters of this function;
680 //
681
682 if ((ep != 0) || (en != 0)) {
683 ep = ep / 1000.;
684 en = en / 1000.;
685 double phi = 0.5 * (ep + en) * s_rel * s_rel + 0.5 * (ep - en) * s_rel;
686 double localDt = phi * (t0mdt - thickness / 2.);
687 double localDz = phi * (z0mdt - height / 2.);
688 dt += localDt;
689 dz += localDz;
690 }
691
692 ATH_MSG_VERBOSE( "posOnDefChamStraighWire: ds,z,t = " << ds << " " << dz << " " << dt );
693 deformPos[0] = locAMDBPos[0] + ds;
694 deformPos[1] = locAMDBPos[1] + dz;
695 deformPos[2] = locAMDBPos[2] + dt;
696
697 return deformPos;
698 }
Scalar phi() const
phi method
static Double_t sp

◆ 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

◆ RODistanceFromTubeCentre() [1/2]

double MuonGM::MdtReadoutElement::RODistanceFromTubeCentre ( const Identifier & id) const

◆ RODistanceFromTubeCentre() [2/2]

double MuonGM::MdtReadoutElement::RODistanceFromTubeCentre ( const int tubeLayer,
const int tube ) const

Definition at line 221 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

221 {
222 return getWireLength(tubeLayer, tube) / 2.;
223 }

◆ ROPos() [1/2]

Amg::Vector3D MuonGM::MdtReadoutElement::ROPos ( const Identifier & id) const

◆ ROPos() [2/2]

Amg::Vector3D MuonGM::MdtReadoutElement::ROPos ( const int tubelayer,
const int tube ) const

Definition at line 288 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

288 {
289 return transform(tubeLayer, tube) * tubeFrame_localROPos(tubeLayer, tube);
290 }

◆ setBLinePar()

void MuonGM::MdtReadoutElement::setBLinePar ( const BLinePar * bLine)

Definition at line 952 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

952 {
953 ATH_MSG_DEBUG( "Setting B-line for " << idHelperSvc()->toStringDetEl(identify()) );
954 if (m_BLinePar == bLine) {
955 return;
956 }
957 m_BLinePar = bLine;
958 refreshCache();
959 }

◆ 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

◆ setMultilayer()

void MuonGM::MdtReadoutElement::setMultilayer ( const int ml)

◆ setNLayers()

void MuonGM::MdtReadoutElement::setNLayers ( const int nl)

Sets the number of layers.

Definition at line 68 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

68{ m_nlayers = nl; }

◆ setNMdtInStation()

void MuonGM::MdtReadoutElement::setNMdtInStation ( unsigned int numMdt)
inline

◆ 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

◆ signedRODistanceFromTubeCentre() [1/2]

double MuonGM::MdtReadoutElement::signedRODistanceFromTubeCentre ( const Identifier & id) const

◆ signedRODistanceFromTubeCentre() [2/2]

double MuonGM::MdtReadoutElement::signedRODistanceFromTubeCentre ( const int tubeLayer,
const int tube ) const

Definition at line 224 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

224 {
225 // it is a signed quantity:
226 // the sign corresponds to the sign of the z coordinate of the RO endplug in the tube
227 // reference frame
228 int amdb_plus_minus1 = 1;
229 if (!m_zsignRO_tubeFrame.isValid()) {
230 const MuonStation* ms = parentMuonStation();
231 if (std::abs(ms->xAmdbCRO()) > 10.) {
232 Amg::Vector3D tem = ms->xAmdbCRO()* Amg::Vector3D::UnitX();
233 Amg::Transform3D amdbToGlobal{ms->getAmdbLRSToGlobal()};
234 Amg::Vector3D temGlo = amdbToGlobal * tem;
235 Amg::Vector3D ROtubeFrame = nodeform_globalToLocalTransf(tubeLayer, tube) * temGlo;
236 if (ROtubeFrame.z() < 0)
237 m_zsignRO_tubeFrame.set(-1);
238 else
239 m_zsignRO_tubeFrame.set(1);
240 }
241 }
242 // if no CRO in a chamber in AMDB (BIS in layout R), use the standard convention for RO-HV side
243 if (!m_zsignRO_tubeFrame.isValid()) {
244 int sign = 0;
245 if (barrel()) {
246 if (sideA()) {
247 if (largeSector())
248 sign = -1;
249 else
250 sign = 1;
251 } else {
252 if (largeSector())
253 sign = 1;
254 else
255 sign = -1;
256 }
257 // a special case is BIS in sector 12
258 if (getStationName().substr(0, 3) == "BIS" && getStationPhi() == 6) sign = -sign;
259 } else {
260 if (sideA()) {
261 if (largeSector())
262 sign = 1;
263 else
264 sign = -1;
265 } else {
266 if (largeSector())
267 sign = -1;
268 else
269 sign = 1;
270 }
271 }
273 }
274 amdb_plus_minus1 = *m_zsignRO_tubeFrame.ptr();
275 if (amdb_plus_minus1 == 0) {
276 ATH_MSG_WARNING( "Unable to get the sign of RO side; signedRODistancefromTubeCenter returns 0" );
277 }
278
279 return amdb_plus_minus1 * getWireLength(tubeLayer, tube) / 2.;
280 }
int sign(int a)
Amg::Transform3D nodeform_globalToLocalTransf(const Identifier &id) const

◆ 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 }

◆ surface() [1/3]

const Trk::Surface & MuonGM::MdtReadoutElement::surface ( ) const
finaloverridevirtual

Return surface associated with this detector element.

Implements Trk::TrkDetElementBase.

Definition at line 885 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

885 {
886 if (!m_associatedSurface) {
887 Amg::RotationMatrix3D muonTRotation(transform().rotation());
888 Amg::RotationMatrix3D surfaceTRotation;
889 surfaceTRotation.col(0) = muonTRotation.col(1);
890 surfaceTRotation.col(1) = muonTRotation.col(2);
891 surfaceTRotation.col(2) = muonTRotation.col(0);
892
893 Amg::Transform3D trans3D(surfaceTRotation);
894 trans3D.pretranslate(transform().translation());
895
896 if (barrel()) {
897 m_associatedSurface.set(std::make_unique<Trk::PlaneSurface>(Amg::Transform3D(trans3D), getSsize() * 0.5,
898 getZsize() * 0.5));
899 } else {
900 m_associatedSurface.set(std::make_unique<Trk::PlaneSurface>(Amg::Transform3D(trans3D), getSsize() * 0.5,
901 getLongSsize() * 0.5,
902 getRsize() * 0.5));
903 }
904 }
905 return *m_associatedSurface;
906 }
Eigen::Matrix< double, 3, 3 > RotationMatrix3D

◆ surface() [2/3]

virtual const Trk::StraightLineSurface & MuonGM::MdtReadoutElement::surface ( const Identifier & id) const
finaloverridevirtual

Return surface associated with this identifier, which should come from the PrepRawData object (i.e.

Surface s = PRD.detElement().surface( PRD.identify() ). This is only really relevant for the TRT (where there are several surfaces per detector element). For other detector elements it will just return surface() ... the Identifier is ignored.

Implements Trk::TrkDetElementBase.

◆ surface() [3/3]

const Trk::StraightLineSurface & MuonGM::MdtReadoutElement::surface ( const int tubeLayer,
const int tube ) const
virtual

Definition at line 829 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

829 {
830
831 int ntot_tubes = m_nlayers * m_ntubesperlayer;
832 int itube = (tubeLayer - 1) * m_ntubesperlayer + tube - 1;
833 // consistency checks
834 if (itube >= ntot_tubes) {
835 ATH_MSG_WARNING( "surface called with tubeLayer or tube out of range in chamber "
836 << idHelperSvc()->toStringDetEl(identify()) << " : layer " << tubeLayer << " max " << m_nlayers << " tube " << tube
837 << " max " << m_ntubesperlayer << " will compute surface for first tube in this chamber" );
838 ATH_MSG_WARNING( "Please run in DEBUG mode to get extra diagnostic" );
839 itube = 0;
840 }
841
843 if (!ptr) {
844 Identifier id = m_idHelper.channelID(identify(), getMultilayer(), tubeLayer, tube);
845 ptr.set(std::make_unique<Trk::StraightLineSurface>(*this, id));
847 }
848 return *ptr;
849 }
int getMultilayer() const
Returns the multilayer represented by the readout element.

◆ surfaces()

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

returns all the surfaces contained in this detector element

Definition at line 70 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

70 {
71 std::vector<const Trk::Surface*> elementSurfaces;
72 elementSurfaces.reserve(m_tubeSurfaces.size() + 1);
73 if (m_associatedSurface) { elementSurfaces.push_back(m_associatedSurface.get()); }
74 for (const auto& s : m_tubeSurfaces) {
75 if (s) elementSurfaces.push_back(s.get());
76 }
77 return elementSurfaces;
78 }

◆ 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]

virtual const Amg::Transform3D & MuonGM::MdtReadoutElement::transform ( ) const
finaloverridevirtual

Return local to global transform.

Implements Trk::TrkDetElementBase.

◆ transform() [2/3]

virtual const Amg::Transform3D & MuonGM::MdtReadoutElement::transform ( const Identifier & id) const
finaloverridevirtual

Return local to global transform associated with this identifier.

Implements Trk::TrkDetElementBase.

◆ transform() [3/3]

const Amg::Transform3D & MuonGM::MdtReadoutElement::transform ( const int tubeLayer,
const int tube ) const

◆ tubeFrame_localROPos() [1/2]

Amg::Vector3D MuonGM::MdtReadoutElement::tubeFrame_localROPos ( const Identifier & id) const

◆ tubeFrame_localROPos() [2/2]

Amg::Vector3D MuonGM::MdtReadoutElement::tubeFrame_localROPos ( const int tubelayer,
const int tube ) const

Definition at line 282 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

282 {
283 return signedRODistanceFromTubeCentre(tubeLayer, tube) * Amg::Vector3D::UnitZ();
284 }
double signedRODistanceFromTubeCentre(const Identifier &id) const

◆ tubeLength() [1/2]

double MuonGM::MdtReadoutElement::tubeLength ( const Identifier & id) const

◆ tubeLength() [2/2]

double MuonGM::MdtReadoutElement::tubeLength ( const int tubeLayer,
const int tube ) const

◆ tubePitch()

double MuonGM::MdtReadoutElement::tubePitch ( ) const

Returns the distance between 2 tubes in a tube layer.

◆ tubePos() [1/2]

Amg::Vector3D MuonGM::MdtReadoutElement::tubePos ( const Identifier & id) const

Returns the global position of the given tube.

◆ tubePos() [2/2]

Amg::Vector3D MuonGM::MdtReadoutElement::tubePos ( const int tubelayer,
const int tube ) const

Definition at line 375 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

375 {
376 return transform() * localTubePos(tubeLayer, tube);
377 }
Amg::Vector3D localTubePos(const Identifier &id) const

◆ tubeToMultilayerTransf() [1/3]

Amg::Transform3D MuonGM::MdtReadoutElement::tubeToMultilayerTransf ( const Amg::Vector3D & tubePos,
const Amg::Transform3D & toDeform )
staticprivate

Definition at line 394 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

394 {
395 return toDeform * Amg::Translation3D{tubePos} * Amg::getRotateX3D(90. * CLHEP::deg);
396 }
Amg::Transform3D getRotateX3D(double angle)
get a rotation transformation around X-axis
Eigen::Translation< double, 3 > Translation3D

◆ tubeToMultilayerTransf() [2/3]

Amg::Transform3D MuonGM::MdtReadoutElement::tubeToMultilayerTransf ( const Identifier & id) const

◆ tubeToMultilayerTransf() [3/3]

Amg::Transform3D MuonGM::MdtReadoutElement::tubeToMultilayerTransf ( const int tubeLayer,
const int tube ) const

Definition at line 378 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

378 {
379 return tubeToMultilayerTransf(nodeform_localTubePos(tubeLayer, tube),
380 fromIdealToDeformed(tubeLayer, tube));
381 }

◆ wireEndpointsAsBuilt()

void MuonGM::MdtReadoutElement::wireEndpointsAsBuilt ( Amg::Vector3D & locAMDBWireEndP,
Amg::Vector3D & locAMDBWireEndN,
const int tubelayer,
const int tube ) const
private

Definition at line 712 of file MuonDetDescr/MuonReadoutGeometry/src/MdtReadoutElement.cxx.

713 {
714 const MdtAsBuiltPar* params = parentMuonStation()->getMdtAsBuiltParams();
715 if (!params) {
716 ATH_MSG_WARNING( "Cannot find Mdt AsBuilt parameters for chamber " << idHelperSvc()->toStringDetEl(identify()) );
717 return;
718 }
719
720 ATH_MSG_VERBOSE( "Applying as-built parameters for chamber " << idHelperSvc()->toStringDetEl(identify())
721 << " tubeLayer=" << tubeLayer << " tube=" << tube);
722
723 constexpr int nsid = 2;
724 using tubeSide_t = MdtAsBuiltPar::tubeSide_t;
725 using multilayer_t = MdtAsBuiltPar::multilayer_t;
726 std::array<MdtAsBuiltPar::tubeSide_t, nsid> tubeSide{tubeSide_t::POS, tubeSide_t::NEG};
727 std::array<Amg::Vector3D, nsid> wireEnd{locAMDBWireEndP, locAMDBWireEndN};
728 multilayer_t ml = (getMultilayer() == 1) ? multilayer_t::ML1 : multilayer_t::ML2;
729
730 const double xmin = *std::min_element(m_firstwire_x.begin(), m_firstwire_x.begin() + m_nlayers) - outerTubeRadius();
731 const int ref_layer = (ml == multilayer_t::ML1) ? m_nlayers : 1;
732 const double y_offset = (ml == multilayer_t::ML1) ? outerTubeRadius() : -outerTubeRadius();
733
734 for (int isid = 0; isid < nsid; ++isid) { // first s>0 then s<0
735 // Compute the reference for the as-built parameters
736 double xref{0.}, yref{0.}, zref{0.};
737 if (barrel()) {
738 xref = -m_Rsize / 2. + m_firstwire_y[ref_layer - 1] + y_offset;
739 zref = -m_Zsize / 2. + xmin;
740 } else {
741 xref = -m_Zsize / 2. + m_firstwire_y[ref_layer - 1] + y_offset;
742 zref = -m_Rsize / 2. + xmin;
743 }
745 Amg::Vector3D reference_point{xref, yref, zref};
746
747 reference_point = toAMDB * reference_point;
748
749 if (isid == 0)
750 reference_point = reference_point + 0.5 * getNominalTubeLengthWoCutouts(ref_layer, 1) * Amg::Vector3D::UnitX();
751 else
752 reference_point = reference_point -0.5 * getNominalTubeLengthWoCutouts(ref_layer, 1) * Amg::Vector3D::UnitX();
753
754 ATH_MSG_VERBOSE("AMDB transform "<<idHelperSvc()->toStringDetEl(identify())<<
755 " "<<GeoTrf::toString(toAMDB, true)<<", reference point: "<<Amg::toString(reference_point));
756
757 int layer_delta = tubeLayer;
758 if (ml == multilayer_t::ML1) layer_delta = m_nlayers + 1 - tubeLayer;
759
760 // Get the As-Built parameters for this ML and side of the chamber
761 double zpitch = params->zpitch(ml, tubeSide[isid]);
762 double ypitch = params->ypitch(ml, tubeSide[isid]);
763 double stagg = (double)params->stagg(ml, tubeSide[isid]);
764 double alpha = params->alpha(ml, tubeSide[isid]);
765 double y0 = params->y0(ml, tubeSide[isid]);
766 double z0 = params->z0(ml, tubeSide[isid]);
767
768 // Find the vector from the reference_point to the endplug
769 int do_stagg = (layer_delta - 1) % 2; // 0 for layer 1 and 3, 1 for layer 2 and 4
770 double offset_stagg = ((double)do_stagg) * 0.5 * zpitch * stagg;
771 Amg::Vector3D end_plug(0., (tube - 1.0) * zpitch + offset_stagg, (layer_delta - 1) * ypitch);
772
773 const Amg::Transform3D amgTransf{Amg::getRotateX3D(-alpha)};
774 end_plug = amgTransf * end_plug;
775
776 // Calculate x position, which varies for endcap chambers
777 double xshift = 0.;
778 if (isid == 0)
779 xshift = 0.5 * getNominalTubeLengthWoCutouts(tubeLayer, tube) - 0.5 * getNominalTubeLengthWoCutouts(ref_layer, 1);
780 else
781 xshift = -0.5 * getNominalTubeLengthWoCutouts(tubeLayer, tube) + 0.5 * getNominalTubeLengthWoCutouts(ref_layer, 1);
782
783 Amg::Vector3D ret(reference_point.x() + xshift, reference_point.y() + z0 + end_plug.y(),
784 reference_point.z() + y0 + end_plug.z());
785
786 // Warn if result of calculation is too far off
787 // BIL1A13 has as-built parameters up to 3mm off, giving the size of the cut
788 if ((ret - wireEnd[isid]).mag() > 3. * CLHEP::mm) {
789 ATH_MSG_WARNING( "Large as-built correction for chamber " << idHelperSvc()->toStringDetEl(identify()) << ", side "
790 << isid << ", Delta " << Amg::toString(ret - wireEnd[isid]) );
791 }
792 ATH_MSG_VERBOSE(( tubeSide[isid] == tubeSide_t::POS ? "positive" : "negative")<<" wire end has moved from "
793 <<Amg::toString(wireEnd[isid])<<" to "<<Amg::toString(ret));
794
795 // Save the result
796 if (tubeSide[isid] == tubeSide_t::POS)
797 locAMDBWireEndP = ret;
798 else
799 locAMDBWireEndN = ret;
800 }
801 }
Scalar mag() const
mag method
multilayer_t
MDT multi-layer index.
tubeSide_t
MDT tube side.
const MdtAsBuiltPar * getMdtAsBuiltParams() const
double xmin
Definition listroot.cxx:60

◆ MuonChamber

◆ MuonChamberLite

◆ 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.

◆ m_associatedBounds

CxxUtils::CachedUniquePtr<Trk::SurfaceBounds> MuonGM::MdtReadoutElement::m_associatedBounds {}
private

◆ m_associatedSurface

CxxUtils::CachedUniquePtr<Trk::Surface> MuonGM::MdtReadoutElement::m_associatedSurface {}
private

◆ m_backupTubeGeo

std::vector<CxxUtils::CachedUniquePtr<GeoInfo> > MuonGM::MdtReadoutElement::m_backupTubeGeo {}
private

Definition at line 253 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h.

253{}; // one per tube

◆ m_BLinePar

const BLinePar* MuonGM::MdtReadoutElement::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_cutoutShift

double MuonGM::MdtReadoutElement::m_cutoutShift {-9999.}
private

◆ m_deadlength

double MuonGM::MdtReadoutElement::m_deadlength {-9999.}
private

◆ m_deformTransf

std::vector<CxxUtils::CachedUniquePtr<Amg::Transform3D> > MuonGM::MdtReadoutElement::m_deformTransf {}
private

Definition at line 254 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h.

254{}; // one per tube

◆ 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_elemNormal

CxxUtils::CachedValue<Amg::Vector3D> MuonGM::MdtReadoutElement::m_elemNormal {}
private

◆ m_endpluglength

double MuonGM::MdtReadoutElement::m_endpluglength {-9999.}
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_firstwire_x

std::array<double, maxnlayers> MuonGM::MdtReadoutElement::m_firstwire_x {make_array<double, maxnlayers>(-9999.)}
private

Definition at line 229 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h.

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

◆ m_firstwire_y

std::array<double, maxnlayers> MuonGM::MdtReadoutElement::m_firstwire_y {make_array<double, maxnlayers>(-9999.)}
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_haveDeformTransf

std::atomic<bool> MuonGM::MdtReadoutElement::m_haveDeformTransf {false}
mutableprivate

◆ m_haveTubeBounds

std::atomic<bool> MuonGM::MdtReadoutElement::m_haveTubeBounds {false}
mutableprivate

◆ m_haveTubeGeo

std::atomic<bool> MuonGM::MdtReadoutElement::m_haveTubeGeo {false}
mutableprivate

◆ m_haveTubeSurfaces

std::atomic<bool> MuonGM::MdtReadoutElement::m_haveTubeSurfaces {false}
mutableprivate

Flag whether any elements have been inserted into the corresponding vectors.

Used to speed up the clear-cache operations for the case where the vectors are empty.

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

265{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 MdtIdHelper& MuonGM::MdtReadoutElement::m_idHelper {idHelperSvc()->mdtIdHelper()}
private

Definition at line 211 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h.

virtual const MdtIdHelper & mdtIdHelper() const =0
access to MdtIdHelper

◆ 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_inBarrel

bool MuonGM::MdtReadoutElement::m_inBarrel {false}
private

◆ m_innerRadius

double MuonGM::MdtReadoutElement::m_innerRadius {-9999.}
private

◆ 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_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_multilayer

int MuonGM::MdtReadoutElement::m_multilayer {0}
private

◆ m_muon_mgr

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

◆ m_nlayers

int MuonGM::MdtReadoutElement::m_nlayers {-1}
private

◆ m_nm

std::string AthMessaging::m_nm
privateinherited

Message source name.

Definition at line 129 of file AthMessaging.h.

◆ m_nMDTinStation

unsigned int MuonGM::MdtReadoutElement::m_nMDTinStation {0}
private

◆ m_nsteps

int MuonGM::MdtReadoutElement::m_nsteps {-1}
private

◆ m_ntubesinastep

int MuonGM::MdtReadoutElement::m_ntubesinastep {-1}
private

◆ m_ntubesperlayer

int MuonGM::MdtReadoutElement::m_ntubesperlayer {-1}
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_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_stIdx_BIS

const int MuonGM::MdtReadoutElement::m_stIdx_BIS {m_idHelper.stationNameIndex("BIS")}
private

Definition at line 212 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h.

212{m_idHelper.stationNameIndex("BIS")};

◆ m_stIdx_BOL

const int MuonGM::MdtReadoutElement::m_stIdx_BOL {m_idHelper.stationNameIndex("BOL")}
private

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

213{m_idHelper.stationNameIndex("BOL")};

◆ 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_tubeBounds

std::vector<CxxUtils::CachedUniquePtr<Trk::CylinderBounds> > MuonGM::MdtReadoutElement::m_tubeBounds {}
private

Definition at line 259 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h.

259{}; // one per step in tube-length

◆ m_tubeGeo

std::vector<CxxUtils::CachedUniquePtr<GeoInfo> > MuonGM::MdtReadoutElement::m_tubeGeo {}
private

Definition at line 252 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h.

252{}; // one per tube

◆ m_tubelayerpitch

double MuonGM::MdtReadoutElement::m_tubelayerpitch {-9999.}
private

◆ m_tubelength

std::array<double, maxnsteps> MuonGM::MdtReadoutElement::m_tubelength {make_array<double, maxnsteps>(-9999.)}
private

◆ m_tubelenStepSize

double MuonGM::MdtReadoutElement::m_tubelenStepSize {-9999.}
private

◆ m_tubepitch

double MuonGM::MdtReadoutElement::m_tubepitch {-9999.}
private

◆ m_tubeSurfaces

std::vector<CxxUtils::CachedUniquePtr<Trk::StraightLineSurface> > MuonGM::MdtReadoutElement::m_tubeSurfaces {}
private

Definition at line 258 of file MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h.

258{}; // one per tube

◆ m_tubeWallThickness

double MuonGM::MdtReadoutElement::m_tubeWallThickness {-9999.}
private

◆ m_type

◆ m_zsignRO_tubeFrame

CxxUtils::CachedValue<int> MuonGM::MdtReadoutElement::m_zsignRO_tubeFrame {}
private

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

233{}; // comes from AMDB CRO location in the station

◆ m_Zsize

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

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