ATLAS Offline Software
MuonIntersectGeoData.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include <TString.h> // for Form
8 
13 
14 namespace Muon {
15 
19  const IMuonIdHelperSvc* idHelperSvc, const MdtCondDbData* dbData) :
20  m_idHelperSvc{idHelperSvc}, m_dbData{dbData} {
21  m_geometry.resize(m_idHelperSvc->mdtIdHelper().detectorElement_hash_max());
22  for (unsigned int n = 0; n < m_geometry.size(); ++n) {
23  IdentifierHash id_hash{n};
24  const MuonGM::MdtReadoutElement* mdt_ele = detMgr->getMdtReadoutElement(id_hash);
25  // The Mdt intersectionGeometry relies on the first multi layer. We can skip the other layers
26  if (!mdt_ele || mdt_ele->getMultilayer() != 1) continue;
27  m_geometry[id_hash] = std::make_unique<Muon::MdtIntersectGeometry>(log, mdt_ele->identify(), idHelperSvc, detMgr, dbData);
28  }
29  }
30 
31  std::vector<std::shared_ptr<const Muon::MdtIntersectGeometry>> MuonIntersectGeoData::getStationGeometry(const Identifier& id) const {
32  // get ids of geometry associated with identifier
33  std::vector<Identifier> chambers = binPlusneighbours(id);
34 
35  // vector to store result
36  std::vector<std::shared_ptr<const Muon::MdtIntersectGeometry>> stations;
37  stations.reserve(chambers.size());
38  // loop over bins, retrieve geometry
39  for (const Identifier& chId : chambers) {
40  if (m_dbData && !m_dbData->isGood(chId)) { continue; }
41  std::shared_ptr<const MdtIntersectGeometry> chamb = getChamber(chId);
42  if (chamb) stations.push_back(std::move(chamb));
43  }
44  return stations;
45  }
46  std::shared_ptr<const MdtIntersectGeometry> MuonIntersectGeoData::getChamber(const Identifier& chId) const {
48  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
49  if (idHelper.get_detectorElement_hash(idHelper.multilayerID(chId), hash)) return nullptr;
50  return hash < m_geometry.size() ? m_geometry[hash] : nullptr;
51  }
52 
54  const Identifier& id, const Amg::Vector3D& pos,
55  const Amg::Vector3D& dir) const {
56  std::vector<std::shared_ptr<const Muon::MdtIntersectGeometry>> stations = getStationGeometry(id);
57 
59  for (std::shared_ptr<const Muon::MdtIntersectGeometry>& it : stations) {
60  Muon::MuonStationIntersect intersect = it->intersection(detMgr, pos, dir);
61  tubeIntersects.insert(tubeIntersects.end(), intersect.tubeIntersects().begin(), intersect.tubeIntersects().end());
62  }
63 
64  Muon::MuonStationIntersect intersection{std::move(tubeIntersects)};
65  return intersection;
66  }
67 
68  std::vector<Identifier> MuonIntersectGeoData::binPlusneighbours(const Identifier& id) const {
69  std::vector<Identifier> chIds;
71  int stPhi = m_idHelperSvc->mdtIdHelper().stationPhi(id);
72  int stEta = m_idHelperSvc->mdtIdHelper().stationEta(id);
74  auto [stEtaMin, stEtaMax] = m_idHelperSvc->mdtIdHelper().stationEtaMinMax(id);
75 
76  int chEtaLeft = stEta - 1;
77  int chEtaRight = stEta + 1;
78 
79 
80 
81  // chamber with smallest eta
82  if (chEtaLeft < stEtaMin) chEtaLeft = -999;
83 
84  // chamber with largest eta
85  if (chEtaRight > stEtaMax) chEtaRight = -999;
86 
87  using namespace MuonStationIndex;
89 
90  // special treatment of EOS chambers
91  if (chIndex == ChIndex::EOS) {
92  chEtaRight = -999;
93  chEtaLeft = -999;
94  }
95 
96  if (isBarrel) {
97  // eta = 0 doesn't exist take next
98  if (chEtaLeft == 0) chEtaLeft -= 1;
99  if (chEtaRight == 0) chEtaRight += 1;
100  } else {
101  // do not combined positive and negative endcaps
102  if (chEtaLeft == 0) chEtaLeft = -999;
103  if (chEtaRight == 0) chEtaRight = -999;
104  }
105 
106  // no neighbours for BIS8
107  if (chIndex == ChIndex::BIS && std::abs(stEta) == 8) {
108  chEtaLeft = -999;
109  chEtaRight = -999;
110  }
111 
112  // BIS 8 never neighbour of a chamber
113  if (chIndex == ChIndex::BIS) {
114  if (std::abs(chEtaLeft) == 8) chEtaLeft = -999;
115  if (std::abs(chEtaRight) == 8) chEtaRight = -999;
116  }
117 
119  //Chambers can only be -5, -4, 4, 5
120  if( std::abs(chEtaLeft) != 5 && std::abs(chEtaLeft) != 4 ) chEtaLeft = -999;
121  if( std::abs(chEtaRight) != 5 && std::abs(chEtaRight) != 4 ) chEtaRight = -999;
122  }
123 
124  if (chEtaLeft != -999 &&
126  chIds.push_back(m_idHelperSvc->mdtIdHelper().elementID(stName, chEtaLeft, stPhi));
127  chIds.push_back(m_idHelperSvc->mdtIdHelper().elementID(id));
128  if (chEtaRight != -999 &&
130  chIds.push_back(m_idHelperSvc->mdtIdHelper().elementID(stName, chEtaRight, stPhi));
131 
132  // if (msgLvl(MSG::VERBOSE)) {
133  // ATH_MSG_VERBOSE(" returning chambers for id " << m_idHelperSvc->toString(id) << " ids " << chIds.size() << " eta " <<
134  // chEtaLeft
135  // << " " << stEta << " " << chEtaRight << " chambers: ");
136  // for (unsigned int i = 0; i < chIds.size(); ++i) ATH_MSG_VERBOSE(m_idHelperSvc->toString(chIds[i]));
137  // }
138 
139  return chIds;
140  }
141 
142 } // namespace Muon
MdtIdHelper::validElement
bool validElement(const Identifier &id) const
Definition: MdtIdHelper.cxx:557
MdtReadoutElement.h
MdtCondDbData::isGood
bool isGood(const Identifier &Id) const
Returns if the identifier (tube/multiLayer/chamber) is masked in the conditions database.
Definition: MdtCondDbData.cxx:25
Muon::MuonIntersectGeoData::m_geometry
std::vector< std::shared_ptr< MdtIntersectGeometry > > m_geometry
Definition: MuonIntersectGeoData.h:40
Muon::IMuonIdHelperSvc::hasCSC
virtual bool hasCSC() const =0
returns whether the CSC identifiers are loaded
Muon::MuonStationIndex::ChIndex::EOS
@ EOS
Muon::MuonStationIndex::stName
const std::string & stName(StIndex index)
convert StIndex into a string
Definition: MuonStationIndex.cxx:104
skel.it
it
Definition: skel.GENtoEVGEN.py:407
Muon::MuonIntersectGeoData::getStationGeometry
std::vector< std::shared_ptr< const MdtIntersectGeometry > > getStationGeometry(const Identifier &id) const
get geometry description of the given chamber + neighbouring chambers
Definition: MuonIntersectGeoData.cxx:31
MdtCondDbData
Definition: MdtCondDbData.h:21
Muon::MuonIntersectGeoData::m_dbData
const MdtCondDbData * m_dbData
Definition: MuonIntersectGeoData.h:42
MuonIdHelper::stationName
int stationName(const Identifier &id) const
Definition: MuonIdHelper.cxx:804
Muon::MuonStationIndex::ChIndex::EIS
@ EIS
Muon
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
Definition: TrackSystemController.h:45
intersection
std::vector< std::string > intersection(std::vector< std::string > &v1, std::vector< std::string > &v2)
Definition: compareFlatTrees.cxx:25
Muon::MuonIntersectGeoData::m_idHelperSvc
const IMuonIdHelperSvc * m_idHelperSvc
Definition: MuonIntersectGeoData.h:41
Muon::MuonStationIndex::ChIndex::EIL
@ EIL
MuonIntersectGeoData.h
Muon::MuonStationIndex::ChIndex::BIS
@ BIS
MuonGM::MdtReadoutElement
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h:51
Muon::MuonStationIndex::chIndex
ChIndex chIndex(const std::string &index)
convert ChIndex name string to enum
Definition: MuonStationIndex.cxx:11
beamspotman.n
n
Definition: beamspotman.py:729
MdtIdHelper
Definition: MdtIdHelper.h:61
Muon::MuonIntersectGeoData::~MuonIntersectGeoData
~MuonIntersectGeoData()
MuonGM::MdtReadoutElement::getMultilayer
int getMultilayer() const
Returns the multilayer represented by the readout element.
MdtIdHelper::stationEtaMinMax
std::pair< int, int > stationEtaMinMax(const Identifier &id) const
Definition: MdtIdHelper.cxx:443
Muon::IMuonIdHelperSvc::chamberIndex
virtual MuonStationIndex::ChIndex chamberIndex(const Identifier &id) const =0
calculate chamber index from Identifier
beamspotman.dir
string dir
Definition: beamspotman.py:621
Muon::MuonIntersectGeoData::getChamber
std::shared_ptr< const MdtIntersectGeometry > getChamber(const Identifier &id) const
get a pointer to the cached chamber
Definition: MuonIntersectGeoData.cxx:46
MuonIdHelper::stationPhi
int stationPhi(const Identifier &id) const
Definition: MuonIdHelper.cxx:814
Muon::IMuonIdHelperSvc::mdtIdHelper
virtual const MdtIdHelper & mdtIdHelper() const =0
access to MdtIdHelper
MuonIdHelper::isBarrel
bool isBarrel(const Identifier &id) const
Definition: MuonIdHelper.cxx:829
MuonIdHelper::stationEta
int stationEta(const Identifier &id) const
Definition: MuonIdHelper.cxx:809
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MuonDetectorManager.h
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:16
Muon::MuonStationIntersect
Definition: MuonStationIntersect.h:12
MdtIdHelper::elementID
Identifier elementID(int stationName, int stationEta, int stationPhi) const
Definition: MdtIdHelper.cxx:630
Muon::MuonIntersectGeoData::tubesCrossedByTrack
Muon::MuonStationIntersect tubesCrossedByTrack(const MuonGM::MuonDetectorManager *detMgr, const Identifier &id, const Amg::Vector3D &pos, const Amg::Vector3D &dir) const
Definition: MuonIntersectGeoData.cxx:53
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:108
Amg::intersect
std::optional< double > intersect(const AmgVector(N)&posA, const AmgVector(N)&dirA, const AmgVector(N)&posB, const AmgVector(N)&dirB)
Calculates the point B' along the line B that's closest to a second line A.
Definition: GeoPrimitivesHelpers.h:347
MuonGM::MuonDetectorManager
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:51
Muon::MuonIntersectGeoData::binPlusneighbours
std::vector< Identifier > binPlusneighbours(const Identifier &id) const
Definition: MuonIntersectGeoData.cxx:68
MuonGM::MuonReadoutElement::identify
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:184
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
python.LArCondContChannels.isBarrel
isBarrel
Definition: LArCondContChannels.py:659
Muon::IMuonIdHelperSvc
Interface for Helper service that creates muon Identifiers and can be used to print Identifiers.
Definition: IMuonIdHelperSvc.h:27
Muon::MuonStationIndex::ChIndex
ChIndex
enum to classify the different chamber layers in the muon spectrometer
Definition: MuonStationIndex.h:15
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
Muon::MuonStationIntersect::TubeIntersects
std::vector< MuonTubeIntersect > TubeIntersects
Definition: MuonStationIntersect.h:14
MdtCondDbData.h
Muon::MuonIntersectGeoData::MuonIntersectGeoData
MuonIntersectGeoData()
IMuonIdHelperSvc.h
Identifier
Definition: IdentifierFieldParser.cxx:14