ATLAS Offline Software
MuonIntersectGeoData.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 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_detMgr{detMgr}, 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 Amg::Vector3D& dir) const {
55  std::vector<std::shared_ptr<const Muon::MdtIntersectGeometry>> stations = getStationGeometry(id);
56 
58  for (std::shared_ptr<const Muon::MdtIntersectGeometry>& it : stations) {
59  Muon::MuonStationIntersect intersect = it->intersection(pos, dir);
60  tubeIntersects.insert(tubeIntersects.end(), intersect.tubeIntersects().begin(), intersect.tubeIntersects().end());
61  }
62 
63  Muon::MuonStationIntersect intersection{std::move(tubeIntersects)};
64  return intersection;
65  }
66 
67  std::vector<Identifier> MuonIntersectGeoData::binPlusneighbours(const Identifier& id) const {
68  std::vector<Identifier> chIds;
69  int stName = m_idHelperSvc->mdtIdHelper().stationName(id);
70  int stPhi = m_idHelperSvc->mdtIdHelper().stationPhi(id);
71  int stEta = m_idHelperSvc->mdtIdHelper().stationEta(id);
73  auto [stEtaMin, stEtaMax] = m_idHelperSvc->mdtIdHelper().stationEtaMinMax(id);
74 
75  int chEtaLeft = stEta - 1;
76  int chEtaRight = stEta + 1;
77 
78  // chamber with smallest eta
79  if (chEtaLeft < stEtaMin) chEtaLeft = -999;
80 
81  // chamber with largest eta
82  if (chEtaRight > stEtaMax) chEtaRight = -999;
83 
85 
86  // special treatment of EOS chambers
87  if (chIndex == Muon::MuonStationIndex::EOS) {
88  chEtaRight = -999;
89  chEtaLeft = -999;
90  }
91 
92  if (isBarrel) {
93  // eta = 0 doesn't exist take next
94  if (chEtaLeft == 0) chEtaLeft -= 1;
95  if (chEtaRight == 0) chEtaRight += 1;
96  } else {
97  // do not combined positive and negative endcaps
98  if (chEtaLeft == 0) chEtaLeft = -999;
99  if (chEtaRight == 0) chEtaRight = -999;
100  }
101 
102  // no neighbours for BIS8
103  if (chIndex == Muon::MuonStationIndex::BIS && std::abs(stEta) == 8) {
104  chEtaLeft = -999;
105  chEtaRight = -999;
106  }
107 
108  // BIS 8 never neighbour of a chamber
109  if (chIndex == Muon::MuonStationIndex::BIS) {
110  if (std::abs(chEtaLeft) == 8) chEtaLeft = -999;
111  if (std::abs(chEtaRight) == 8) chEtaRight = -999;
112  }
114  if ((chIndex == Muon::MuonStationIndex::EIS || chIndex == Muon::MuonStationIndex::EIL) && !m_idHelperSvc->hasCSC()) {
115  return chIds;
116  }
117  if (chEtaLeft != -999 &&
118  m_idHelperSvc->mdtIdHelper().validElement(m_idHelperSvc->mdtIdHelper().elementID(stName, chEtaLeft, stPhi)))
119  chIds.push_back(m_idHelperSvc->mdtIdHelper().elementID(stName, chEtaLeft, stPhi));
120  chIds.push_back(m_idHelperSvc->mdtIdHelper().elementID(id));
121  if (chEtaRight != -999 &&
122  m_idHelperSvc->mdtIdHelper().validElement(m_idHelperSvc->mdtIdHelper().elementID(stName, chEtaRight, stPhi)))
123  chIds.push_back(m_idHelperSvc->mdtIdHelper().elementID(stName, chEtaRight, stPhi));
124 
125  // if (msgLvl(MSG::VERBOSE)) {
126  // ATH_MSG_VERBOSE(" returning chambers for id " << m_idHelperSvc->toString(id) << " ids " << chIds.size() << " eta " <<
127  // chEtaLeft
128  // << " " << stEta << " " << chEtaRight << " chambers: ");
129  // for (unsigned int i = 0; i < chIds.size(); ++i) ATH_MSG_VERBOSE(m_idHelperSvc->toString(chIds[i]));
130  // }
131 
132  return chIds;
133  }
134 
135 } // namespace Muon
Muon::MuonStationIndex::BIS
@ BIS
Definition: MuonStationIndex.h:17
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:41
Muon::IMuonIdHelperSvc::hasCSC
virtual bool hasCSC() const =0
returns whether the CSC identifiers are loaded
skel.it
it
Definition: skel.GENtoEVGEN.py:396
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:44
MuonIdHelper::stationName
int stationName(const Identifier &id) const
Definition: MuonIdHelper.cxx:800
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::MuonStationIndex::EIS
@ EIS
Definition: MuonStationIndex.h:18
Muon::MuonIntersectGeoData::m_idHelperSvc
const IMuonIdHelperSvc * m_idHelperSvc
Definition: MuonIntersectGeoData.h:42
Muon::MuonStationIndex::EOS
@ EOS
Definition: MuonStationIndex.h:18
MuonIntersectGeoData.h
MuonGM::MdtReadoutElement
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h:51
beamspotman.n
n
Definition: beamspotman.py:731
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:623
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:810
Muon::IMuonIdHelperSvc::mdtIdHelper
virtual const MdtIdHelper & mdtIdHelper() const =0
access to MdtIdHelper
MuonIdHelper::isBarrel
bool isBarrel(const Identifier &id) const
Definition: MuonIdHelper.cxx:825
MuonIdHelper::stationEta
int stationEta(const Identifier &id) const
Definition: MuonIdHelper.cxx:805
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MuonDetectorManager.h
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
Muon::MuonStationIntersect
Definition: MuonStationIntersect.h:12
MdtIdHelper::elementID
Identifier elementID(int stationName, int stationEta, int stationPhi) const
Definition: MdtIdHelper.cxx:630
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
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:50
Muon::MuonIntersectGeoData::binPlusneighbours
std::vector< Identifier > binPlusneighbours(const Identifier &id) const
Definition: MuonIntersectGeoData.cxx:67
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
Muon::MuonIntersectGeoData::tubesCrossedByTrack
Muon::MuonStationIntersect tubesCrossedByTrack(const Identifier &id, const Amg::Vector3D &pos, const Amg::Vector3D &dir) const
Definition: MuonIntersectGeoData.cxx:53
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
Muon::MuonStationIndex::EIL
@ EIL
Definition: MuonStationIndex.h:18
Identifier
Definition: IdentifierFieldParser.cxx:14