ATLAS Offline Software
Loading...
Searching...
No Matches
Muon::MuonIntersectGeoData Class Reference

#include <MuonIntersectGeoData.h>

Collaboration diagram for Muon::MuonIntersectGeoData:

Public Member Functions

 ~MuonIntersectGeoData ()
 MuonIntersectGeoData ()
 MuonIntersectGeoData (MsgStream &msg, const MuonGM::MuonDetectorManager *detMgr, const IMuonIdHelperSvc *idHelperSvc, const MdtCondDbData *cond_data)
Muon::MuonStationIntersect tubesCrossedByTrack (const MuonGM::MuonDetectorManager *detMgr, const Identifier &id, const Amg::Vector3D &pos, const Amg::Vector3D &dir) const
std::vector< std::shared_ptr< const MdtIntersectGeometry > > getStationGeometry (const Identifier &id) const
 get geometry description of the given chamber + neighbouring chambers
std::shared_ptr< const MdtIntersectGeometrygetChamber (const Identifier &id) const
 get a pointer to the cached chamber

Private Member Functions

std::vector< IdentifierbinPlusneighbours (const Identifier &id) const

Private Attributes

std::vector< std::shared_ptr< MdtIntersectGeometry > > m_geometry {}
const IMuonIdHelperSvcm_idHelperSvc {nullptr}
const MdtCondDbDatam_dbData {nullptr}

Detailed Description

Definition at line 22 of file MuonIntersectGeoData.h.

Constructor & Destructor Documentation

◆ ~MuonIntersectGeoData()

Muon::MuonIntersectGeoData::~MuonIntersectGeoData ( )
default

◆ MuonIntersectGeoData() [1/2]

Muon::MuonIntersectGeoData::MuonIntersectGeoData ( )
default

◆ MuonIntersectGeoData() [2/2]

Muon::MuonIntersectGeoData::MuonIntersectGeoData ( MsgStream & msg,
const MuonGM::MuonDetectorManager * detMgr,
const IMuonIdHelperSvc * idHelperSvc,
const MdtCondDbData * cond_data )

Definition at line 18 of file MuonIntersectGeoData.cxx.

19 :
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 }
int getMultilayer() const
Returns the multilayer represented by the readout element.
const MdtReadoutElement * getMdtReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
std::vector< std::shared_ptr< MdtIntersectGeometry > > m_geometry
const IMuonIdHelperSvc * m_idHelperSvc
const MdtCondDbData * m_dbData

Member Function Documentation

◆ binPlusneighbours()

std::vector< Identifier > Muon::MuonIntersectGeoData::binPlusneighbours ( const Identifier & id) const
private

Definition at line 68 of file MuonIntersectGeoData.cxx.

68 {
69 std::vector<Identifier> chIds;
70 int stName = m_idHelperSvc->mdtIdHelper().stationName(id);
71 int stPhi = m_idHelperSvc->mdtIdHelper().stationPhi(id);
72 int stEta = m_idHelperSvc->mdtIdHelper().stationEta(id);
73 bool isBarrel = m_idHelperSvc->mdtIdHelper().isBarrel(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;
88 ChIndex chIndex = m_idHelperSvc->chamberIndex(id);
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
118 if ((chIndex == ChIndex::EIS || chIndex == ChIndex::EIL) && !m_idHelperSvc->hasCSC()) {
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 &&
125 m_idHelperSvc->mdtIdHelper().validElement(m_idHelperSvc->mdtIdHelper().elementID(stName, chEtaLeft, stPhi)))
126 chIds.push_back(m_idHelperSvc->mdtIdHelper().elementID(stName, chEtaLeft, stPhi));
127 chIds.push_back(m_idHelperSvc->mdtIdHelper().elementID(id));
128 if (chEtaRight != -999 &&
129 m_idHelperSvc->mdtIdHelper().validElement(m_idHelperSvc->mdtIdHelper().elementID(stName, chEtaRight, stPhi)))
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 }
ChIndex chIndex(const std::string &index)
convert ChIndex name string to enum
bool isBarrel(const ChIndex index)
Returns true if the chamber index points to a barrel chamber.
const std::string & stName(StIndex index)
convert StIndex into a string
ChIndex
enum to classify the different chamber layers in the muon spectrometer

◆ getChamber()

std::shared_ptr< const MdtIntersectGeometry > Muon::MuonIntersectGeoData::getChamber ( const Identifier & id) const

get a pointer to the cached chamber

Definition at line 46 of file MuonIntersectGeoData.cxx.

46 {
47 IdentifierHash hash{0};
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 }
Identifier multilayerID(const Identifier &channeldID) const
virtual int get_detectorElement_hash(const Identifier &id, IdentifierHash &hash_id) const override

◆ getStationGeometry()

std::vector< std::shared_ptr< const Muon::MdtIntersectGeometry > > Muon::MuonIntersectGeoData::getStationGeometry ( const Identifier & id) const

get geometry description of the given chamber + neighbouring chambers

Definition at line 31 of file MuonIntersectGeoData.cxx.

31 {
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 }
std::shared_ptr< const MdtIntersectGeometry > getChamber(const Identifier &id) const
get a pointer to the cached chamber
std::vector< Identifier > binPlusneighbours(const Identifier &id) const

◆ tubesCrossedByTrack()

Muon::MuonStationIntersect Muon::MuonIntersectGeoData::tubesCrossedByTrack ( const MuonGM::MuonDetectorManager * detMgr,
const Identifier & id,
const Amg::Vector3D & pos,
const Amg::Vector3D & dir ) const

Definition at line 53 of file MuonIntersectGeoData.cxx.

55 {
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 }
std::vector< std::shared_ptr< const MdtIntersectGeometry > > getStationGeometry(const Identifier &id) const
get geometry description of the given chamber + neighbouring chambers
std::vector< MuonTubeIntersect > TubeIntersects
std::vector< std::string > intersection(std::vector< std::string > &v1, std::vector< std::string > &v2)
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.

Member Data Documentation

◆ m_dbData

const MdtCondDbData* Muon::MuonIntersectGeoData::m_dbData {nullptr}
private

Definition at line 42 of file MuonIntersectGeoData.h.

42{nullptr};

◆ m_geometry

std::vector<std::shared_ptr<MdtIntersectGeometry> > Muon::MuonIntersectGeoData::m_geometry {}
private

Definition at line 40 of file MuonIntersectGeoData.h.

40{};

◆ m_idHelperSvc

const IMuonIdHelperSvc* Muon::MuonIntersectGeoData::m_idHelperSvc {nullptr}
private

Definition at line 41 of file MuonIntersectGeoData.h.

41{nullptr};

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