ATLAS Offline Software
Loading...
Searching...
No Matches
MdtCablingJsonDumpAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
9#include <fstream>
10
11namespace {
12 struct TdcIdentifier: public MdtCablingOnData {
13 uint8_t tdcId{0};
15 bool operator==(const TdcIdentifier& other) const noexcept{
16 return this->MdtCablingOnData::operator==(other) && tdcId == other.tdcId;
17 }
18 bool operator<(const TdcIdentifier& other) const noexcept {
19 if (this->MdtCablingOnData::operator!=(other)) return this->MdtCablingOnData::operator<(other);
20 return tdcId < other.tdcId;
21 }
22 TdcIdentifier(const MdtCablingData& cabling):
23 MdtCablingOnData{cabling},
24 tdcId{cabling.tdcId} {}
25 };
26
27 using Mapping = MdtMezzanineCard::Mapping;
28 using OfflineCh = MdtMezzanineCard::OfflineCh;
29
30}
31
32MdtCablingJsonDumpAlg::MdtCablingJsonDumpAlg(const std::string& name, ISvcLocator* pSvcLocator):
33 AthAlgorithm(name,pSvcLocator) {}
34
35
37 ATH_CHECK(m_idHelperSvc.retrieve());
38 ATH_CHECK(m_DetectorManagerKey.initialize());
39 ATH_CHECK(m_cablingKey.initialize());
40 return StatusCode::SUCCESS;
41}
42
44 const EventContext& ctx = Gaudi::Hive::currentContext();
45 ATH_MSG_INFO("Dump cabling & mezzanines into JSON file");
46
48 if (!detectorMgr.isValid()){
49 ATH_MSG_FATAL("Failed to retrieve the Detector manager "<<m_DetectorManagerKey.fullKey());
50 return StatusCode::FAILURE;
51 }
52
54 if (!cabling.isValid()) {
55 ATH_MSG_ERROR("Failed to retrieve the Mdt cabling "<<m_cablingKey.fullKey());
56 return StatusCode::FAILURE;
57 }
58 const MdtIdHelper& idHelper = m_idHelperSvc->mdtIdHelper();
59
60 std::vector<MdtMezzanineCard> cached_cards{};
61 std::set<MdtCablingData> cached_chnls{};
62 constexpr auto unsetArray{make_array<uint8_t,24>(MdtMezzanineCard::NOTSET)};
63 for (auto det_itr = idHelper.detectorElement_begin(); det_itr != idHelper.detectorElement_end(); ++det_itr){
64 const MuonGM::MdtReadoutElement* readEle = detectorMgr->getMdtReadoutElement(*det_itr);
65 if (!readEle) {
66 ATH_MSG_DEBUG("Detector element does not exist. ");
67 continue;
68 }
69 const Identifier station_id = idHelper.elementID(readEle->identify());
70 ATH_MSG_DEBUG("Check station "<<m_idHelperSvc->toString(station_id));
72 MdtMezzanineCard dummy_card(Mapping{}, readEle->getNLayers(), -1);
73 std::map<TdcIdentifier, Mapping> chamber_mezz{};
74 const int nLayers{readEle->getNLayers()};
75 const int nTubes{readEle->getNtubesperlayer()};
76 const int multiLayer{readEle->getMultilayer()};
77 for (int layer = 1 ; layer <= nLayers; ++layer){
78 for (int tubeInLayer = 1 ; tubeInLayer <= nTubes; ++tubeInLayer) {
79 bool is_valid{false};
80 const Identifier tube_id = idHelper.channelID(station_id, multiLayer,
81 layer, tubeInLayer, is_valid);
82 if (!is_valid) {
83 ATH_MSG_VERBOSE("Invalid element");
84 continue;
85 }
87 MdtCablingData cabling_data{};
88 cabling->convert(tube_id,cabling_data);
90 if (!cabling->getOnlineId(cabling_data, msgStream())) {
91 ATH_MSG_ERROR("Could no retrieve a valid online channel for "<<m_idHelperSvc->toString(tube_id));
92 return StatusCode::FAILURE;
93 }
94 const TdcIdentifier tdc_id{cabling_data};
95 chamber_mezz.try_emplace(tdc_id,unsetArray);
96 chamber_mezz[tdc_id][cabling_data.channelId] = dummy_card.tubeNumber(layer, tubeInLayer);
97 }
98 }
100 for (auto&[tdc, mezz_mapping] : chamber_mezz) {
101 MdtCablingData mezzCablingId{};
102
104 static_cast<MdtCablingOnData&>(mezzCablingId) = tdc;
105 mezzCablingId.tdcId = tdc.tdcId;
106
107 MdtTdcOnlSorter chipInCab = cabling->getOnlineConvMap().at(tdc).all_modules.at(tdc.tdcId);
109 static_cast<MdtCablingOffData&>(mezzCablingId) = chipInCab->offId();
111 mezzCablingId.tube = chipInCab->tubeZero();
112
113 const uint8_t tubeOffSet = (mezzCablingId.tube-1)%dummy_card.numTubesPerLayer();
116 if (tubeOffSet) {
117 MdtMezzanineCard remap{mezz_mapping, dummy_card.numTubeLayers(), 0};
118 for (size_t chan = 0 ; chan < mezz_mapping.size(); ++chan) {
119 const OfflineCh tube_lay = remap.offlineTube(chan, msgStream());
120 if (!tube_lay.isValid) continue;
121 uint8_t tubeNumber = tube_lay.tube + tubeOffSet + 1;
122 mezz_mapping[chan] = remap.tubeNumber(tube_lay.layer, tubeNumber);
123 }
124 }
126 Mapping& mtmp = mezz_mapping; // Work around clang15 compilation error.
127 std::vector<MdtMezzanineCard>::const_iterator itr = std::find_if(cached_cards.begin(), cached_cards.end(),
128 [&dummy_card, &mtmp](const MdtMezzanineCard& card ){
129 if (dummy_card.numTubeLayers() != card.numTubeLayers()) return false;
130 for (size_t ch =0; ch < mtmp.size(); ++ch) {
131 if (mtmp[ch] != card.tdcToTubeMap()[ch]) return false;
132 }
133 return true;
134 });
135 if (itr != cached_cards.end()) {
136 mezzCablingId.mezzanine_type = itr->id();
137 } else {
138 cached_cards.emplace_back(mezz_mapping, dummy_card.numTubeLayers(), cached_cards.size() + 10);
139 if (!cached_cards.back().checkConsistency(msgStream())) {
140 ATH_MSG_ERROR("Wrong assignment for "<<mezzCablingId);
141 return StatusCode::FAILURE;
142 }
143 mezzCablingId.mezzanine_type = cached_cards.back().id();
144 }
145 cached_chnls.insert(std::move(mezzCablingId));
146 }
147
148
149
150 }
152 {
153 std::ofstream summary{m_summaryTxt};
154 if (!summary.good()) {
155 ATH_MSG_ERROR("Failed to write "<<m_summaryTxt);
156 return StatusCode::FAILURE;
157 }
158 summary<<"Extracted "<<cached_cards.size()<<" mezzanine card layouts and "
159 <<cached_chnls.size()<<" chamber channels. \n\n\n";
160 for (const MdtMezzanineCard& card : cached_cards) {
161 summary<<card;
162 MdtCablingOffData chamb{};
163 for (const MdtCablingData& cabling : cached_chnls) {
164 if (cabling.mezzanine_type != card.id()) continue;
165 if (chamb != cabling) {
166 chamb = cabling;
167 summary<<std::endl<<" *** "<<idHelper.stationNameString(chamb.stationIndex);
168 summary<<static_cast<int>(std::abs(chamb.eta));
169 summary<<(chamb.eta > 0 ? "A" : "C");
170 summary<<static_cast<int>(chamb.phi);
171 summary<<"M"<<static_cast<int>(chamb.multilayer);
172 summary<<" --- tdcs: ";
173 }
174 summary<<static_cast<int>(cabling.tdcId)<<", ";
175 }
176 summary<<"\n\n"
177 <<"##############################################################\n";
178 }
179 }
181 {
182 std::ofstream mezz_json{m_mezzJSON};
183 if (!mezz_json.good()) {
184 ATH_MSG_ERROR("Failed to write "<<m_summaryTxt);
185 return StatusCode::FAILURE;
186 }
187 mezz_json<<"["<<std::endl;
188 for (size_t i = 0; i < cached_cards.size() ; ++i) {
189 const MdtMezzanineCard& card = cached_cards[i];
190 mezz_json<<" {\n";
191 mezz_json<<" \"mezzId\": "<<static_cast<int>(card.id())<<",\n";
192 mezz_json<<" \"nTubeLayer\": "<<static_cast<int>(card.numTubeLayers())<<",\n";
193 mezz_json<<" \"tdcToTubeMap\": [";
194 for (size_t ch = 0 ; ch < card.tdcToTubeMap().size(); ++ch) {
195 mezz_json<<static_cast<int>(card.tdcToTubeMap()[ch]);
196 if (ch + 1 != card.tdcToTubeMap().size())mezz_json<<",";
197 }
198 mezz_json<<"]\n";
199 mezz_json<<" }";
200 if (i +1 != cached_cards.size()) mezz_json<<",";
201 mezz_json<<"\n";
202 }
203 mezz_json<<"]";
204 }
205 {
206 std::ofstream chamb_json{m_cablingJSON};
207 if (!chamb_json.good()) {
208 ATH_MSG_FATAL("Failed to write "<<m_cablingJSON);
209 return StatusCode::FAILURE;
210 }
211 chamb_json<<"[\n";
212 size_t i =0;
213 for (const MdtCablingData& chamb : cached_chnls){
214 chamb_json<<" {\n";
215 chamb_json<<" \"station\": \""<<idHelper.stationNameString(chamb.stationIndex)<<"\",\n";
216 chamb_json<<" \"eta\": "<<static_cast<int>(chamb.eta)<<",\n";
217 chamb_json<<" \"phi\": "<<static_cast<int>(chamb.phi)<<",\n";
218 chamb_json<<" \"ml\": "<<static_cast<int>(chamb.multilayer)<<",\n";
219 chamb_json<<" \"subDet\": "<<static_cast<int>(chamb.subdetectorId)<<",\n";
220 chamb_json<<" \"csm\": "<<static_cast<int>(chamb.csm)<<",\n";
221 chamb_json<<" \"mrod\": "<<static_cast<int>(chamb.mrod)<<",\n";
222 chamb_json<<" \"tdcId\": "<<static_cast<int>(chamb.tdcId)<<",\n";
223 chamb_json<<" \"mezzId\": "<<static_cast<int>(chamb.mezzanine_type)<<",\n";
224 chamb_json<<" \"tubeZero\": "<<static_cast<int>(chamb.tube)<<"\n";
225 chamb_json<<" }";
226 if (i +1 != cached_chnls.size()) chamb_json<<",";
227 chamb_json<<"\n";
228 ++i;
229 }
230 chamb_json<<"]"<<std::endl;
231 }
232
233
234 return StatusCode::SUCCESS;
235}
constexpr std::array< T, N > make_array(const T &def_val)
Helper function to initialize in-place arrays with non-zero values.
Definition ArrayHelper.h:10
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
bool operator<(const DataVector< T > &a, const DataVector< T > &b)
Vector ordering relation.
bool operator==(const DataVector< T > &a, const DataVector< T > &b)
Vector equality comparison.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
MdtCablingJsonDumpAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_DetectorManagerKey
SG::ReadCondHandleKey< MuonMDT_CablingMap > m_cablingKey
virtual StatusCode initialize() override
virtual StatusCode execute() override
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Identifier elementID(int stationName, int stationEta, int stationPhi) const
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int tubeLayer, int tube) const
MdtMezzanineCard - Helper struct to represent the structure of a mezzanine card in a consistent way E...
static constexpr uint8_t NOTSET
uint8_t numTubesPerLayer() const
returns the number of tubes per layer;
const Mapping & tdcToTubeMap() const
Returns the underlying TDC -> Tube conversion map.
uint8_t id() const
returns mezzanine database identifier
std::array< uint8_t, 24 > Mapping
uint8_t numTubeLayers() const
returns the number of layers
uint8_t tubeNumber(uint8_t tubeLay, uint8_t tube) const
returns the tube number
const MdtCablingOffData & offId() const
get the offline identifier
Definition MdtTdcMap.h:57
uint8_t tubeZero() const
Definition MdtTdcMap.h:72
int getNLayers() const
Returns the number of tube layers inside the multilayer.
int getMultilayer() const
Returns the multilayer represented by the readout element.
int getNtubesperlayer() const
Returns the number of tubes in each tube layer.
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
const_id_iterator detectorElement_begin() const
Iterators over full set of ids.
const_id_iterator detectorElement_end() const
std::map< std::string, std::string > remap
list of directories to be explicitly remapped
Definition hcg.cxx:95
uint8_t tdcId
Mezzanine type.
int tube
Layer inside the multilayer.
Split the offline part of the cabling apart to use it later for sorting.
int8_t & multilayer
Phi sector of the MDT station.
int8_t & eta
Station of the chamber (i.e, BIL,BIS,etc.)
int8_t & phi
Eta of the MDT station.
bool operator==(const MdtCablingOnData &other) const
bool operator<(const MdtCablingOnData &other) const
Helper struct to pipe the result from the tdc -> offline channel translation.
Helper struct to search through the std::set if a conversion from online -> offline is needed.
Definition MdtTdcMap.h:100