ATLAS Offline Software
MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonDetectorManager.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
5 
13 #include <limits>
14 
15 namespace {
16  template <class T>
20  template <class ReadOutEleStoreType,
21  class ReadoutEleReturnType> void insert(const ElementStorage<ReadOutEleStoreType>& eleStore,
22  std::vector<ReadoutEleReturnType>& returnVec) {
23  returnVec.reserve(returnVec.capacity() + eleStore.size());
24  for (const auto& ele : eleStore) {
25  if (ele) returnVec.push_back(ele.get());
26  }
27  }
28  template <class ReadOutEleType,
29  class ReadOutEleReturnType> void insert(std::vector<ReadOutEleType*>&& eleStore,
30  std::vector<ReadOutEleReturnType*>& returnVec) {
31  returnVec.insert(returnVec.end(),
32  std::make_move_iterator(eleStore.begin()),
33  std::make_move_iterator(eleStore.end()));
34  }
35 }
36 
37 #define WRITE_SETTER(ELE_TYPE, SETTER, STORAGE_VEC) \
38  StatusCode MuonDetectorManager::SETTER(ElementPtr<ELE_TYPE> element) { \
39  if (!element) { \
40  ATH_MSG_FATAL(__func__ << " -- nullptr is given."); \
41  return StatusCode::FAILURE; \
42  } \
43  ATH_CHECK(element->initElement()); \
44  element->releaseUnAlignedTrfs(); \
45  size_t idx = static_cast<unsigned int>(element->identHash()); \
46  if (idx >= STORAGE_VEC.size()) \
47  STORAGE_VEC.resize(idx + 1); \
48  std::unique_ptr<ELE_TYPE>& new_element = STORAGE_VEC[idx]; \
49  if (new_element) { \
50  ATH_MSG_FATAL("The detector element " \
51  << m_idHelperSvc->toStringDetEl(element->identify()) \
52  << " has already been added before " \
53  <<m_idHelperSvc->toStringDetEl(new_element->identify())); \
54  return StatusCode::FAILURE; \
55  } \
56  new_element = std::move(element); \
57  return StatusCode::SUCCESS; \
58  }
59 #define ADD_DETECTOR(ELE_TYPE, STORAGE_VEC) \
60  WRITE_SETTER(ELE_TYPE, add##ELE_TYPE, STORAGE_VEC) \
61  \
62  std::vector<const ELE_TYPE*> MuonDetectorManager::getAll##ELE_TYPE##s() const { \
63  std::vector<const ELE_TYPE*> allElements{}; \
64  insert(STORAGE_VEC, allElements); \
65  return allElements; \
66  } \
67  \
68  std::vector<ELE_TYPE*> MuonDetectorManager::getAll##ELE_TYPE##s() { \
69  std::vector<ELE_TYPE*> allElements{}; \
70  insert(STORAGE_VEC, allElements); \
71  return allElements; \
72  }
73 #define WRITE_ALLGETTER(TYPE) \
74  std::vector<TYPE MuonReadoutElement*> MuonDetectorManager::getAllReadoutElements() TYPE { \
75  std::vector<TYPE MuonReadoutElement*> allEles{}; \
76  insert(getAllMdtReadoutElements(), allEles); \
77  insert(getAllRpcReadoutElements(), allEles); \
78  insert(getAllTgcReadoutElements(), allEles); \
79  insert(getAllMmReadoutElements(), allEles); \
80  insert(getAllsTgcReadoutElements(), allEles); \
81  return allEles; \
82  } \
83  TYPE MuonReadoutElement* MuonDetectorManager::getReadoutElement(const Identifier& id) TYPE { \
84  if (m_idHelperSvc->isMdt(id)) return getMdtReadoutElement(id); \
85  else if (m_idHelperSvc->isRpc(id)) return getRpcReadoutElement(id); \
86  else if (m_idHelperSvc->isTgc(id)) return getTgcReadoutElement(id); \
87  else if (m_idHelperSvc->issTgc(id)) return getsTgcReadoutElement(id); \
88  else if (m_idHelperSvc->isMM(id)) return getMmReadoutElement(id); \
89  ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<" Not a muon detector element " \
90  <<m_idHelperSvc->toString(id)); \
91  return nullptr; \
92 }
93 
94 
95 namespace MuonGMR4 {
96 
97 #ifndef SIMULATIONBASE
99  if (a->stationName() != b->stationName()) return a->stationName() < b->stationName();
100  if (a->stationEta() != b->stationEta()) return a->stationEta() < b->stationEta();
101  return a->stationPhi() < b->stationPhi();
102 }
103 #endif
104 
106  : AthMessaging{"MuonDetectorManagerR4"} {
107  if (!m_idHelperSvc.retrieve().isSuccess()) {
108  ATH_MSG_FATAL(__func__<< "() -- Failed to retrieve the Identifier service");
109  throw std::runtime_error("MuonIdHelperSvc does not exist");
110  }
111  setName("MuonR4");
112 }
113 
114 WRITE_ALLGETTER(const)
121 
122 unsigned int MuonDetectorManager::getNumTreeTops() const {
123  return m_treeTopVector.size();
124 }
125 PVConstLink MuonDetectorManager::getTreeTop(unsigned int i) const {
126  return m_treeTopVector[i];
127 }
128 
130  m_treeTopVector.push_back(pv);
131 }
133  return m_idHelperSvc.get();
134 }
135 std::vector<ActsTrk::DetectorType> MuonDetectorManager::getDetectorTypes() const {
136  std::vector<ActsTrk::DetectorType> types{};
137  if (!m_mdtEles.empty()) types.push_back(ActsTrk::DetectorType::Mdt);
138  if (!m_tgcEles.empty()) types.push_back(ActsTrk::DetectorType::Tgc);
139  if (!m_rpcEles.empty()) types.push_back(ActsTrk::DetectorType::Rpc);
140  if (!m_sTgcEles.empty()) types.push_back(ActsTrk::DetectorType::sTgc);
141  if (!m_mmEles.empty()) types.push_back(ActsTrk::DetectorType::Mm);
142  return types;
143 }
144 
145 #ifndef SIMULATIONBASE
148  return re ? re->getChamber() : nullptr;
149  }
151  MuonChamberSet allChambers{};
152  std::vector<const MuonReadoutElement*> allREs{getAllReadoutElements()};
153  for (const MuonReadoutElement* re : allREs) {
154  if (re->getChamber()) {
155  allChambers.insert(re->getChamber());
156  }
157  }
158  return allChambers;
159  }
160 #endif
161 
162 
163 } // namespace MuonGMR4
164 #undef WRITE_SETTER
165 #undef ADD_DETECTOR
166 #undef WRITE_ALLGETTER
MuonGMR4::MmReadoutElement
Definition: MmReadoutElement.h:18
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
MuonGMR4::MuonDetectorManager::getDetectorTypes
std::vector< ActsTrk::DetectorType > getDetectorTypes() const
Returns a list of all detector types.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonDetectorManager.cxx:135
AthCheckMacros.h
MuonGMR4::MuonDetectorManager
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonDetectorManager.h:61
MuonGMR4::MuonDetectorManager::m_tgcEles
ElementStorage< TgcReadoutElement > m_tgcEles
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonDetectorManager.h:115
ActsTrk::DetectorType::Tgc
@ Tgc
Resitive Plate Chambers.
MuonGMR4::MuonReadoutElement
The MuonReadoutElement is an abstract class representing the geometry representing the muon detector.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonReadoutElement.h:38
MuonGMR4::MuonDetectorManager::MuonDetectorManager
MuonDetectorManager()
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonDetectorManager.cxx:105
MuonGMR4::MuonDetectorManager::getAllReadoutElements
std::vector< const MuonReadoutElement * > getAllReadoutElements() const
Returns the list of all detector elements.
MuonGMR4::MuonDetectorManager::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonDetectorManager.h:111
MuonGMR4::MuonDetectorManager::m_rpcEles
ElementStorage< RpcReadoutElement > m_rpcEles
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonDetectorManager.h:116
MuonGMR4::MuonChamber
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonChamber.h:39
MuonGMR4::MuonDetectorManager::ChamberSorter::operator()
bool operator()(const MuonChamber *a, const MuonChamber *b) const
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonDetectorManager.cxx:98
ActsTrk::DetectorType::sTgc
@ sTgc
Micromegas (NSW)
MuonGMR4::RpcReadoutElement
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/RpcReadoutElement.h:14
sTgcReadoutElement.h
MuonGMR4
A muon chamber is a collection of readout elements belonging to the same station.
Definition: ChamberAssembleTool.h:16
ActsTrk::DetectorType::Mm
@ Mm
Maybe not needed in the migration.
lumiFormat.i
int i
Definition: lumiFormat.py:92
WRITE_ALLGETTER
#define WRITE_ALLGETTER(TYPE)
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonDetectorManager.cxx:73
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
MuonGMR4::MuonDetectorManager::MuonChamberSet
std::set< const MuonChamber *, ChamberSorter > MuonChamberSet
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonDetectorManager.h:103
MuonDetectorManager.h
MuonChamber.h
AthMessaging
Class to provide easy MsgStream access and capabilities.
Definition: AthMessaging.h:55
MuonGMR4::ADD_DETECTOR
ADD_DETECTOR(MdtReadoutElement, m_mdtEles)
MuonGMR4::MuonDetectorManager::getChamber
const MuonChamber * getChamber(const Identifier &channelId) const
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonDetectorManager.cxx:146
CaloCondBlobAlgs_fillNoiseFromASCII.channelId
channelId
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:122
MuonGMR4::MuonDetectorManager::getTreeTop
PVConstLink getTreeTop(unsigned int i) const override final
Returns the i-th top node of the MuonSystem trees.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonDetectorManager.cxx:125
MuonGMR4::MuonDetectorManager::m_mdtEles
ElementStorage< MdtReadoutElement > m_mdtEles
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonDetectorManager.h:114
MuonGMR4::MuonDetectorManager::m_treeTopVector
std::vector< PVConstLink > m_treeTopVector
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonDetectorManager.h:120
ActsTrk::DetectorType::Mdt
@ Mdt
MuonSpectrometer.
MuonGMR4::MdtReadoutElement
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:15
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
MuonGMR4::MuonDetectorManager::addTreeTop
void addTreeTop(PVConstLink pv)
Adds a new GeoModelTree node indicating the entrance to a muon system description.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonDetectorManager.cxx:129
MuonGMR4::sTgcReadoutElement
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/sTgcReadoutElement.h:19
RpcReadoutElement.h
MuonGMR4::MuonDetectorManager::ElementStorage
std::vector< ElementPtr< MuonDetectorType > > ElementStorage
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonDetectorManager.h:70
a
TList * a
Definition: liststreamerinfos.cxx:10
MuonGMR4::MuonDetectorManager::getAllChambers
MuonChamberSet getAllChambers() const
: Returns all MuonChambers associated with the readout geometry
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonDetectorManager.cxx:150
MuonGMR4::MuonDetectorManager::m_sTgcEles
ElementStorage< sTgcReadoutElement > m_sTgcEles
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonDetectorManager.h:117
MdtReadoutElement.h
re
const boost::regex re(r_e)
MuonGMR4::MuonDetectorManager::idHelperSvc
const Muon::IMuonIdHelperSvc * idHelperSvc() const
Returns a pointer to the central MuonIdHelperSvc.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonDetectorManager.cxx:132
python.changerun.pv
pv
Definition: changerun.py:81
ActsTrk::DetectorType::Rpc
@ Rpc
Monitored Drift Tubes.
Muon::IMuonIdHelperSvc
Interface for Helper service that creates muon Identifiers and can be used to print Identifiers.
Definition: IMuonIdHelperSvc.h:26
MuonGMR4::MuonDetectorManager::m_mmEles
ElementStorage< MmReadoutElement > m_mmEles
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonDetectorManager.h:118
TgcReadoutElement.h
MuonGMR4::TgcReadoutElement
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/TgcReadoutElement.h:16
MmReadoutElement.h
MuonGMR4::MuonDetectorManager::getReadoutElement
const MuonReadoutElement * getReadoutElement(const Identifier &id) const
Returns a generic Muon readout element.