ATLAS Offline Software
MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
8 #include <GaudiKernel/SystemOfUnits.h>
9 
10 #include <optional>
11 
12 using namespace ActsTrk;
13 
14 namespace MuonGMR4 {
15 std::ostream& operator<<(std::ostream& ostr, const MuonGMR4::MdtReadoutElement::parameterBook& pars) {
16  ostr << std::endl;
17  ostr << " // Chamber half- length (min/max): "<<pars.shortHalfX<<"/"<<pars.longHalfX
18  <<", half-width "<<pars.halfY<<", height: "<<pars.halfHeight;
19  ostr << " // Number of tube layers " << pars.tubeLayers.size()<< std::endl;
20  ostr << " // Tube pitch: " << pars.tubePitch
21  << " wall thickness: " << pars.tubeWall
22  << " inner radius: " << pars.tubeInnerRad
23  << " endplug: "<<pars.endPlugLength
24  << " deadlength: "<<pars.deadLength<< std::endl;
25  for (const MdtTubeLayerPtr& layer : pars.tubeLayers) {
26  ostr << " // **** "<< Amg::toString(layer->tubeTransform(0).translation(), 2)<<std::endl;
27  }
28  return ostr;
29 }
30 MdtReadoutElement::MdtReadoutElement(defineArgs&& args)
31  : MuonReadoutElement(std::move(args)),
32  m_pars{std::move(args)} {
33 }
35 Identifier MdtReadoutElement::measurementId(const IdentifierHash& measHash) const {
37  layerNumber(measHash) + 1,
38  tubeNumber(measHash) + 1);
39 }
43  if (!numLayers() || !numTubesInLay()) {
44  ATH_MSG_FATAL("The readout element "<< idHelperSvc()->toStringDetEl(identify())<<" has no tubes. Please check "<<std::endl<<m_pars);
45  return StatusCode::FAILURE;
46  }
47  if (m_pars.tubePitch<=tubeRadius()) {
48  ATH_MSG_FATAL("The tubes of "<<idHelperSvc()->toStringDetEl(identify())<<" will fall together on a single point. Please check "<<std::endl<<m_pars);
49  return StatusCode::FAILURE;
50  }
51 #ifndef SIMULATIONBASE
55  m_pars.halfY)));
56 #endif
57 
60  std::optional<Amg::Vector3D> prevLayPos{std::nullopt};
61 
62  for (unsigned int lay =1 ; lay <= numLayers() ; ++lay) {
64  const IdentifierHash layHash = measurementHash(lay,0);
65  ATH_CHECK(insertTransform<MdtReadoutElement>(layHash));
66 #ifndef SIMULATIONBASE
69  m_pars.halfY)));
70 #endif
71  std::optional<Amg::Vector3D> prevTubePos{std::nullopt};
74  GeoVolumeCursor tubeCursor = layer.tubeCursor();
75  GeoTrf::Transform3D layerTransform = layer.layerTransform();
76  for (unsigned int tube = 1; tube <= numTubesInLay(); ++ tube, tubeCursor.next()) {
77  assert (!tubeCursor.atEnd());
78  const IdentifierHash idHash = measurementHash(lay,tube);
79  if (m_pars.removedTubes.count(idHash)) {
80  prevTubePos = std::nullopt;
81  continue;
82  }
83  ATH_CHECK(insertTransform<MdtReadoutElement>(idHash));
84 #ifndef SIMULATIONBASE
85  ATH_CHECK(strawSurfaceFactory(idHash, m_pars.tubeBounds->make_bounds(innerTubeRadius(), 0.5*tubeLength(idHash))));
86 #endif
87  GeoTrf::Transform3D tubeFrame = layerTransform*tubeCursor.getDefTransform();
89  const AmgSymMatrix(3) tubeRot = tubeFrame.linear();
90  if (std::abs(tubeRot.determinant()- 1.) > std::numeric_limits<float>::epsilon()){
91  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Transformation matrix is not a pure rotation for "<<
92  idHelperSvc()->toStringDetEl(identify())<<" in layer: "<<lay<<", tube: "<<tube
93  <<Amg::toString(tubeFrame));
94  return StatusCode::FAILURE;
95  }
97  const Amg::Vector3D tubePos = tubeFrame.translation();
98 
99  constexpr double pitchTolerance = 20. * Gaudi::Units::micrometer;
100  if (prevTubePos) {
101  const double dR = std::abs((tubePos - (*prevTubePos)).z());
102  if (std::abs(dR - tubePitch()) > pitchTolerance) {
103  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Detected irregular tube in "<<
104  idHelperSvc()->toStringDetEl(identify())<<" in layer: "<<lay<<", tube: "<<tube
105  <<". Expected tube pitch: "<<tubePitch()<<" measured tube pitch: "
106  <<dR<<" tube position: "<<Amg::toString(tubePos,2)
107  <<" previous: "<<Amg::toString((*prevTubePos), 2));
108  return StatusCode::FAILURE;
109  }
110  }
111  if (prevLayPos && tube == 1) {
112  const double dR = (tubePos - (*prevLayPos)).mag();
113  if (std::abs(dR - tubePitch()) > pitchTolerance) {
114  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Detected irregular layer pitch in "<<
115  idHelperSvc()->toStringDetEl(identify())<<" for layer "<<lay
116  <<". Expected tube pitch: "<<tubePitch()<<" measured tube pitch: "
117  <<dR<<" tube position: "<<Amg::toString(tubePos,2)
118  <<" previous:"<<Amg::toString((*prevLayPos), 2));
119  }
120  }
121  if (tube == 1) {
122  prevLayPos = std::make_optional<Amg::Vector3D>(tubePos);
123  }
124  prevTubePos = std::make_optional<Amg::Vector3D>(tubePos);
125  }
126  }
127 #ifndef SIMULATIONBASE
128  m_pars.tubeBounds.reset();
129  m_pars.layerBounds.reset();
130 #endif
131  return StatusCode::SUCCESS;
132 }
133 
135  const IdentifierHash& hash) const {
136  return localToGlobalTrans(ctx) * localTubePos(hash);
137 }
138 
139 Amg::Vector3D MdtReadoutElement::localTubePos(const IdentifierHash& hash) const {
140  return toTubeFrame(hash).translation();
141 }
143  const IdentifierHash& hash) const {
144  const unsigned int layer = layerNumber(hash);
145  const unsigned int tube = tubeNumber(hash);
146  const MdtTubeLayer& zeroT{*m_pars.tubeLayers[layer]};
147  const double length = zeroT.tubeHalfLength(tube) * m_pars.readoutSide;
148  return localToGlobalTrans(ctx) * zeroT.tubeTransform(tube)*(length * Amg::Vector3D::UnitZ());
149 }
151  const IdentifierHash& hash) const {
152  const unsigned int layer = layerNumber(hash);
153  const unsigned int tube = tubeNumber(hash);
154  const MdtTubeLayer& zeroT{*m_pars.tubeLayers[layer]};
155  const double length = - zeroT.tubeHalfLength(tube) * m_pars.readoutSide;
156  return localToGlobalTrans(ctx) * zeroT.tubeTransform(tube)*(length * Amg::Vector3D::UnitZ());
157 }
159  const unsigned int layer = layerNumber(hash);
160  const MdtTubeLayer& zeroT{*m_pars.tubeLayers[layer]};
161  return zeroT.layerTransform();
162 }
164  const unsigned int layer = layerNumber(hash);
165  const unsigned int tube = tubeNumber(hash);
166  const MdtTubeLayer& zeroT{*m_pars.tubeLayers[layer]};
167  return zeroT.tubeTransform(tube);
168 }
169 double MdtReadoutElement::activeTubeLength(const IdentifierHash& hash) const {
170  const unsigned int layer = layerNumber(hash);
171  const unsigned int tube = tubeNumber(hash);
172  const MdtTubeLayer& zeroT{*m_pars.tubeLayers[layer]};
173  return 2. * zeroT.tubeHalfLength(tube);
174 }
175 double MdtReadoutElement::tubeLength(const IdentifierHash& hash) const {
176  return activeTubeLength(hash) + 2.*m_pars.deadLength;
177 }
178 double MdtReadoutElement::wireLength(const IdentifierHash& hash) const {
179  return tubeLength(hash) - 2.*m_pars.endPlugLength;
180 }
182  const IdentifierHash& measHash,
183  const Amg::Vector3D& globPoint) const {
184  const Amg::Vector3D locPoint = globalToLocalTrans(ctx, measHash) * globPoint;
186  const unsigned int layer = layerNumber(measHash);
187  const unsigned int tube = tubeNumber(measHash);
188  const MdtTubeLayer& zeroT{*m_pars.tubeLayers[layer]};
190  zeroT.tubeHalfLength(tube) *
191  Amg::Vector3D::UnitZ();
192  return readOutPos.z() - locPoint.z();
193 }
194 #ifndef SIMULATIONBASE
195 std::map<Identifier, std::shared_ptr<Acts::Surface>> MdtReadoutElement::getSurfaces() const {
196  std::map<Identifier, std::shared_ptr<Acts::Surface>> surfaces{};
197  for (unsigned int layer = 1; layer<= numLayers(); ++layer) {
198  for (unsigned int tube = 1; tube<= numTubesInLay(); ++tube) {
199  const IdentifierHash measHash = measurementHash(layer, tube);
200  if (isValid(measHash)) {
201  surfaces[measurementId(measHash)] = surfacePtr(measHash);
202  }
203  }
204  }
205  return surfaces;
206 }
207 #endif
208 
209 } // namespace MuonGMR4
make_hlt_rep.pars
pars
Definition: make_hlt_rep.py:90
GeoModel::TransientConstSharedPtr
The TransientConstSharedPtr allows non-const access if the pointer itself is non-const but in the con...
Definition: TransientConstSharedPtr.h:13
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
MuonGMR4::MdtReadoutElement::parameterBook::tubeBounds
ActsTrk::SurfaceBoundSetPtr< Acts::LineBounds > tubeBounds
Sets of surface bounds which is shared amongst all readout elements used to assign the same bound obj...
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:62
MuonGMR4::MdtReadoutElement::localTubePos
Amg::Vector3D localTubePos(const IdentifierHash &hash) const
Returns the tube position in the chamber coordinate frame.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:139
MuonGMR4::MdtReadoutElement::parameterBook::removedTubes
std::set< IdentifierHash > removedTubes
List of tube places without tubes.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:28
MuonGMR4::MdtReadoutElement::numTubesInLay
unsigned int numTubesInLay() const
Returns the number of tubes per layer.
AthCheckMacros.h
MuonGMR4::MdtReadoutElement::parameterBook::layerBounds
ActsTrk::SurfaceBoundSetPtr< Acts::TrapezoidBounds > layerBounds
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:63
MuonGMR4::MdtReadoutElement::parameterBook::tubeLayers
std::vector< MdtTubeLayerPtr > tubeLayers
Vector defining the position of all tubes in each tube layer.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:25
MuonGMR4::MdtReadoutElement::tubeLength
double tubeLength(const IdentifierHash &hash) const
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:175
MuonGMR4::MdtReadoutElement::measurementHash
static IdentifierHash measurementHash(unsigned int layerNumber, unsigned int tubeNumber)
Transform the layer and tube number to the measurementHash.
MuonGMR4::MdtReadoutElement::toChamberLayer
Amg::Transform3D toChamberLayer(const IdentifierHash &hash) const
Returns the transformation into the rest frame of the tube x-axis: Pointing towards the next layer y-...
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:158
MuonGMR4::MuonReadoutElement
The MuonReadoutElement is an abstract class representing the geometry representing the muon detector.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonReadoutElement.h:38
MuonGMR4::MdtReadoutElement::activeTubeLength
double activeTubeLength(const IdentifierHash &hash) const
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:169
MuonGMR4::MdtReadoutElement::readOutPos
Amg::Vector3D readOutPos(const ActsGeometryContext &ctx, const Identifier &measId) const
Returns the global position of the readout card.
MuonGMR4::MuonReadoutElement::createGeoTransform
StatusCode createGeoTransform()
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:31
MuonGMR4::MdtTubeLayer
Helper struct to retrieve the tube lengths and the tube centers directly from the GeoModel tree.
Definition: MdtTubeLayer.h:28
MuonGMR4::MuonReadoutElement::globalToLocalTrans
Amg::Transform3D globalToLocalTrans(const ActsGeometryContext &ctx) const
Transformations to translate between local <-> global coordinates.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:73
MuonGMR4::MdtReadoutElement::initElement
StatusCode initElement() override final
Element initialization.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:40
AmgSymMatrix
#define AmgSymMatrix(dim)
Definition: EventPrimitives.h:52
MuonGMR4::MdtReadoutElement::tubeRadius
double tubeRadius() const
Adds the thickness of the tube wall onto the radius.
MuonGMR4::MdtReadoutElement::parameterBook::readoutSide
double readoutSide
Is the readout chip at positive or negative Z?
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:58
MuonGMR4::MdtReadoutElement::measurementId
Identifier measurementId(const IdentifierHash &measHash) const override final
Converts the measurement hash back to the full Identifier.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:35
MuonGMR4::MdtReadoutElement::multilayer
unsigned int multilayer() const
Returns the multi layer of the MdtReadoutElement.
MuonGMR4::MdtReadoutElement::wireLength
double wireLength(const IdentifierHash &hash) const
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:178
MuonGMR4::MdtReadoutElement::layerNumber
static unsigned int layerNumber(const IdentifierHash &hash)
Transforms the identifier hash into a layer number ranging from (0-numLayers()-1)
MuonGMR4::MdtReadoutElement::parameterBook::halfY
double halfY
Length ~ number of tubes.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:54
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
MuonGMR4
A muon chamber is a collection of readout elements belonging to the same station.
Definition: ChamberAssembleTool.h:16
MuonGMR4::MdtReadoutElement::m_pars
parameterBook m_pars
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:184
MuonGMR4::MdtReadoutElement::getSurfaces
std::map< Identifier, std::shared_ptr< Acts::Surface > > getSurfaces() const override final
Returns all surfaces that are associated with the active readout planes.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:195
z
#define z
MuonGMR4::MdtReadoutElement::parameterBook
Set of parameters to describe a MDT chamber.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:20
MuonGMR4::MuonReadoutElement::idHelperSvc
const Muon::IMuonIdHelperSvc * idHelperSvc() const
Returns the pointer to the muonIdHelperSvc.
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
MuonGMR4::MdtReadoutElement::numLayers
unsigned int numLayers() const
Returns the number of tube layer.
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
ActsTrk::operator<<
MsgStream & operator<<(MsgStream &out, const ActsUtils::Stat &stat)
Definition: TrackToTruthAssociationAlg.cxx:25
python.SystemOfUnits.micrometer
int micrometer
Definition: SystemOfUnits.py:71
ActsGeometryContext
Include the GeoPrimitives which need to be put first.
Definition: ActsGeometryContext.h:28
MuonGMR4::MdtReadoutElement::innerTubeRadius
double innerTubeRadius() const
Returns the inner tube radius.
MdtIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int tubeLayer, int tube) const
Definition: MdtIdHelper.cxx:659
MuonGMR4::MdtReadoutElement::distanceToReadout
double distanceToReadout(const ActsGeometryContext &ctx, const Identifier &measId, const Amg::Vector3D &globPoint) const
Returns the distance along the wire from the readout card The distance is given as the delta z of the...
MuonGMR4::MuonReadoutElement::geoTransformHash
static IdentifierHash geoTransformHash()
Returns the hash that is associated with the surface cache holding the transformation that is placing...
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:39
MuonGMR4::MuonReadoutElement::strawSurfaceFactory
StatusCode strawSurfaceFactory(const IdentifierHash &hash, std::shared_ptr< Acts::LineBounds > lBounds)
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:97
MuonGMR4::MuonReadoutElement::identify
Identifier identify() const override final
Return the athena identifier.
MuonGMR4::MdtReadoutElement::tubePitch
double tubePitch() const
Returns the pitch between 2 tubes in a layer.
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MuonGMR4::MdtReadoutElement::parameterBook::tubePitch
double tubePitch
Distance between 2 tubes in the layer.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:35
MuonGMR4::MdtReadoutElement::tubeNumber
static unsigned int tubeNumber(const IdentifierHash &hash)
Transforms the idenfier hash into a tube number ranging from (0- numTubesInLay()-1)
MuonGMR4::MdtReadoutElement::parameterBook::endPlugLength
double endPlugLength
Depth of the endplug into the active tube volume.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:39
MuonGMR4::MdtReadoutElement::m_idHelper
const MdtIdHelper & m_idHelper
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:185
MuonGMR4::MdtReadoutElement::parameterBook::shortHalfX
double shortHalfX
The chambers have either a rectangular or a trapezoidal shape to first approximation.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:51
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
MuonGMR4::MuonReadoutElement::planeSurfaceFactory
StatusCode planeSurfaceFactory(const IdentifierHash &hash, std::shared_ptr< Acts::PlanarBounds > pBounds)
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:120
MuonGMR4::MuonReadoutElement::surfacePtr
std::shared_ptr< Acts::Surface > surfacePtr(const IdentifierHash &hash) const
Returns the pointer associated to a certain wire / plane.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:84
MdtReadoutElement.h
GeoPrimitivesHelpers.h
GeoPrimitivesToStringConverter.h
MuonGMR4::MdtReadoutElement::parameterBook::deadLength
double deadLength
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:41
MuonGMR4::MdtReadoutElement::parameterBook::longHalfX
double longHalfX
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:52
MuonGMR4::MuonReadoutElement::localToGlobalTrans
const Amg::Transform3D & localToGlobalTrans(const ActsGeometryContext &ctx) const
Returns the local to global transformation into the ATLAS coordinate system.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:76
MuonGMR4::MdtReadoutElement::globalTubePos
Amg::Vector3D globalTubePos(const ActsGeometryContext &ctx, const Identifier &measId) const
Returns the global position of the tube center.
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:34
MuonGMR4::MdtReadoutElement::getParameters
const parameterBook & getParameters() const
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:34
MuonGMR4::MdtReadoutElement::toTubeFrame
Amg::Transform3D toTubeFrame(const IdentifierHash &hash) const
Returns the transformation into the rest frame of the tube x-axis: Pointing towards the next layer y-...
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:163
MuonGMR4::MdtReadoutElement::highVoltPos
Amg::Vector3D highVoltPos(const ActsGeometryContext &ctx, const Identifier &measId) const
Returns the global position of the High Voltage connectors.
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
MuonGMR4::MdtReadoutElement::isValid
bool isValid(const IdentifierHash &measHash) const
mag
Scalar mag() const
mag method
Definition: AmgMatrixBasePlugin.h:25
calibdata.tube
tube
Definition: calibdata.py:31
python.CaloScaleNoiseConfig.args
args
Definition: CaloScaleNoiseConfig.py:80
MuonGMR4::MdtReadoutElement::defineArgs
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:69