The staggering of the hedgehog cards does not coincide with the multi-layer staggering i.e. tubeZero is 2,3,4,5 or 2,3,4,5,6,7.
45 {
46 const EventContext& ctx = Gaudi::Hive::currentContext();
47 ATH_MSG_INFO(
"Dump cabling & mezzanines into JSON file");
48
49 const MuonGM::MuonDetectorManager* detectorMgr{nullptr};
51
52 const MuonMDT_CablingMap*
cabling{
nullptr};
54
56
57 std::vector<MdtMezzanineCard> cached_cards{};
58 std::set<MdtCablingData> cached_chnls{};
62 if (!readEle) {
64 continue;
65 }
70 << " since it will be inserted manually");
71 continue;
72 }
73
75 MdtMezzanineCard dummy_card(Mapping{}, readEle->
getNLayers(), -1);
76 std::map<TdcIdentifier, Mapping> chamber_mezz{};
80
81 for (
int layer = 1 ;
layer <= nLayers; ++
layer){
82 for (int tubeInLayer = 1 ; tubeInLayer <= nTubes; ++tubeInLayer) {
83 bool is_valid{false};
85 layer, tubeInLayer, is_valid);
86 if (!is_valid) {
88 continue;
89 }
92 cabling->convert(tube_id,cabling_data);
94 if (!
cabling->getOnlineId(cabling_data, msgStream())) {
96 continue;
97 }
99 chamber_mezz.try_emplace(tdc_id,unsetArray);
100 chamber_mezz[tdc_id][
cabling_data.channelId] = dummy_card.tubeNumber(layer, tubeInLayer);
101 }
102 }
104 for (auto&[tdc, mezz_mapping] : chamber_mezz) {
105 MdtCablingData mezzCablingId{};
106
108 static_cast<MdtCablingOnData&>(mezzCablingId) = tdc;
109 mezzCablingId.
tdcId = tdc.tdcId;
110
111 MdtTdcOnlSorter chipInCab =
cabling->getOnlineConvMap().at(tdc).all_modules.at(tdc.tdcId);
113 static_cast<MdtCablingOffData&
>(mezzCablingId) = chipInCab->
offId();
116
117 const uint8_t tubeOffSet = (mezzCablingId.
tube-1)%dummy_card.numTubesPerLayer();
120 if (tubeOffSet) {
121 MdtMezzanineCard
remap{mezz_mapping, dummy_card.numTubeLayers(), 0};
122 for (
size_t chan = 0 ;
chan < mezz_mapping.size(); ++
chan) {
123 const OfflineCh tube_lay =
remap.offlineTube(chan, msgStream());
124 if (!tube_lay.isValid) continue;
125 uint8_t tubeNumber = tube_lay.tube + tubeOffSet + 1;
126 mezz_mapping[
chan] =
remap.tubeNumber(tube_lay.layer, tubeNumber);
127 }
128 }
130 Mapping& mtmp = mezz_mapping;
131 std::vector<MdtMezzanineCard>::const_iterator itr = std::find_if(cached_cards.begin(), cached_cards.end(),
132 [&dummy_card, &mtmp](const MdtMezzanineCard& card ){
133 if (dummy_card.numTubeLayers() != card.numTubeLayers()) return false;
134 for (size_t ch =0; ch < mtmp.size(); ++ch) {
135 if (mtmp[ch] != card.tdcToTubeMap()[ch]) return false;
136 }
137 return true;
138 });
139 if (itr != cached_cards.end()) {
141 } else {
142 cached_cards.emplace_back(mezz_mapping, dummy_card.numTubeLayers(), cached_cards.size() + 10);
143 if (!cached_cards.back().checkConsistency(msgStream())) {
145 return StatusCode::FAILURE;
146 }
148 }
149 cached_chnls.insert(std::move(mezzCablingId));
150 }
151 }
152
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181 constexpr std::array<uint8_t,24> mezzanineType6InvertedMap{23, 17, 11, 5,
182 22, 16, 10, 4,
183 21, 15, 9, 3,
184 20, 14, 8, 2,
185 19, 13, 7, 1,
186 18, 12, 6, 0};
187
188 constexpr std::array<uint8_t,24> mezzanineType6bInvertedMap{250, 250, 250,250,
189 22, 16, 10, 4,
190 21, 15, 9, 3,
191 20, 14, 8, 2,
192 19, 13, 7, 1,
193 18, 12, 6, 0};
194 constexpr std::array<uint8_t,24> mezzanineType6b2InvertedMap{250, 250, 250, 250,
195 23, 17, 11, 5,
196 22, 16, 10, 4,
197 21, 15, 9, 3,
198 20, 14, 8, 2,
199 19, 13, 7, 1};
200
201 constexpr std::array<uint8_t,24> mezzanineType7Map{12, 18, 0, 6,
202 13, 19, 1, 7,
203 14, 20, 2, 8,
204 15, 21, 3, 9,
205 16, 22, 4, 10,
206 17, 23, 5, 11};
207
208 constexpr std::array<uint8_t,24> mezzanineType7bMap{12, 18, 0, 6,
209 13, 19, 1, 7,
210 14, 20, 2, 8,
211 15, 21, 3, 9,
212 16, 22, 4, 10,
213 250, 250, 250, 250};
214
215 constexpr std::array<uint8_t,24> mezzanineType7b2Map{ 13, 19, 1, 7,
216 14, 20, 2, 8,
217 15, 21, 3, 9,
218 16, 22, 4, 10,
219 17, 23, 5, 11,
220 250, 250, 250, 250};
221
222
223
224
225 std::map<std::string, MdtMezzanineCard> mezzTypes{};
226 mezzTypes.emplace(std::make_pair("mezzanineType6", MdtMezzanineCard(mezzanineType6InvertedMap, 4, 0)));
227 mezzTypes.emplace(std::make_pair("mezzanineType6b", MdtMezzanineCard(mezzanineType6bInvertedMap, 4, 0)));
228 mezzTypes.emplace(std::make_pair("mezzanineType6b2", MdtMezzanineCard(mezzanineType6b2InvertedMap, 4, 0)));
229 mezzTypes.emplace(std::make_pair("mezzanineType7", MdtMezzanineCard(mezzanineType7Map, 4, 0)));
230 mezzTypes.emplace(std::make_pair("mezzanineType7b", MdtMezzanineCard(mezzanineType7bMap, 4, 0)));
231 mezzTypes.emplace(std::make_pair("mezzanineType7b2", MdtMezzanineCard(mezzanineType7b2Map, 4, 0)));
232 std::map<std::string, int> mezzTypeIds{};
233 for(auto& [type,card] : mezzTypes){
234 auto itr = std::ranges::find_if(cached_cards,
235 [&card](const MdtMezzanineCard& cachedCard){
237 return false;
238 }
239 for(
size_t ch = 0;
ch < card.tdcToTubeMap().size(); ++
ch){
240 if(cachedCard.
tdcToTubeMap()[ch] != card.tdcToTubeMap()[ch]) {
241 return false;
242 }
243 }
244 return true;
245 });
246 if(itr != cached_cards.end()){
247 mezzTypeIds[
type] = itr->id();
248 } else {
249 cached_cards.emplace_back(card.tdcToTubeMap(), card.numTubeLayers(), cached_cards.size() + 10);
250 mezzTypeIds[
type] = cached_cards.back().id();
251 }
252 }
253
254 for(auto& [type,card] : mezzTypes){
255 ATH_MSG_VERBOSE(
"mezzz type" << type <<
" has id " << mezzTypeIds[type]);
256 }
257
258
259
260 std::map<uint8_t, uint8_t> mrodMap, csmMap;
261 mrodMap[97] = 55; csmMap[97] = 0;
262 mrodMap[98] = 55; csmMap[98] = 0;
263
266 if (!readEle) {
268 continue;
269 }
270
272 continue;
273 }
276 continue;
277 }
278
282
284
290 subdetectorId = 97;
291 } else{
292 subdetectorId = 98;
293 }
294 for(int tubeInLayer = 1 ; tubeInLayer <= nTubes;
295 tubeInLayer += mezzTypes.at("mezzanineType6").numTubesPerLayer()){
296
297 if(tubeInLayer==1 && std::abs(readEle->
getStationEta()) !=7){tubeInLayer -=1;}
298 MdtCablingData mezzCablingId_ml1{};
299 if(tubeInLayer <= tubesPerLayer_ml1){
305 mezzCablingId_ml1.
csm = csmMap[subdetectorId];
306 mezzCablingId_ml1.
mrod = mrodMap[subdetectorId];
307 mezzCablingId_ml1.
tdcId = tdcId;
308 mezzCablingId_ml1.
tube = tubeInLayer;
309 }
310
311
312 MdtCablingData mezzCablingId_ml2{};
318 mezzCablingId_ml2.
csm = csmMap[subdetectorId];
319 mezzCablingId_ml2.
mrod = mrodMap[subdetectorId];
320 mezzCablingId_ml2.
tdcId = tdcId +1;
321 mezzCablingId_ml2.
tube = tubeInLayer;
322
323
324
325 std::string mezzEndString = "";
326
327 if(std::abs(readEle->
getStationEta()) !=7 && tubeInLayer + 6 > nTubes) { mezzEndString =
"b"; }
328 if(std::abs(readEle->
getStationEta()) !=7 && tubeInLayer==0 ) { mezzEndString =
"b2"; }
329 ATH_MSG_VERBOSE(
"For station "<<
m_idHelperSvc->toString(station_id) <<
" tube " << tubeInLayer<<
" assigning mezzanine types for tubeInLayer "<<tubeInLayer <<
" mezzEndString "<<mezzEndString);
331
333 if(tubeInLayer <= tubesPerLayer_ml1) {
334 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
335 }
336 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
337 } else {
338 if(tubeInLayer <= tubesPerLayer_ml1) {
339 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
340 }
341 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
342 }
343 } else {
344
346 if(tubeInLayer <= tubesPerLayer_ml1){
347 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
348 }
349 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
350 } else {
351 if(tubeInLayer <= tubesPerLayer_ml1){
352 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
353 }
354 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
355 }
356 }
357 if(tubeInLayer <= tubesPerLayer_ml1) {
358 cached_chnls.insert(std::move(mezzCablingId_ml1));
359 }
360 cached_chnls.insert(std::move(mezzCablingId_ml2));
361
362 tdcId+=2;
363
364 if((std::abs(readEle->
getStationEta()) == 1 && tdcId >=12) ||
366
367 tdcId = 0;
368 csmMap[subdetectorId] +=1;
369 if(csmMap[subdetectorId]>5){
370 csmMap[subdetectorId]=0;
371 mrodMap[subdetectorId]+=1;
372 }
373 }
374 }
375
376 csmMap[subdetectorId] +=1;
377 if(csmMap[subdetectorId]>5){
378 csmMap[subdetectorId]=0;
379 mrodMap[subdetectorId]+=1;
380 }
381 }
382 }
384 {
388 return StatusCode::FAILURE;
389 }
390 summary<<
"Extracted "<<cached_cards.size()<<
" mezzanine card layouts and "
391 <<cached_chnls.size()<<" chamber channels. \n\n\n";
392 for (const MdtMezzanineCard& card : cached_cards) {
394 MdtCablingOffData chamb{};
395 for (const MdtCablingData& cabling : cached_chnls) {
396 if (
cabling.mezzanine_type != card.id())
continue;
397 if (chamb != cabling) {
400 summary<<static_cast<int>(std::abs(chamb.
eta));
402 summary<<static_cast<int>(chamb.
phi);
405 }
406 summary<<static_cast<int>(
cabling.tdcId)<<
", ";
407 }
409 <<"##############################################################\n";
410 }
411 }
413 {
415 if (!mezz_json.good()) {
417 return StatusCode::FAILURE;
418 }
419 mezz_json<<"["<<std::endl;
420 for (
size_t i = 0;
i < cached_cards.size() ; ++
i) {
421 const MdtMezzanineCard& card = cached_cards[
i];
422 mezz_json<<" {\n";
423 mezz_json<<
" \"mezzId\": "<<
static_cast<int>(card.
id())<<
",\n";
424 mezz_json<<
" \"nTubeLayer\": "<<
static_cast<int>(card.
numTubeLayers())<<
",\n";
425 mezz_json<<" \"tdcToTubeMap\": [";
428 if (ch + 1 != card.
tdcToTubeMap().size())mezz_json<<
",";
429 }
430 mezz_json<<"]\n";
431 mezz_json<<" }";
432 if (i +1 != cached_cards.size()) mezz_json<<",";
433 mezz_json<<"\n";
434 }
435 mezz_json<<"]";
436 }
437 {
439 if (!chamb_json.good()) {
441 return StatusCode::FAILURE;
442 }
443 chamb_json<<"[\n";
445 for (const MdtCablingData& chamb : cached_chnls){
446 chamb_json<<" {\n";
448 chamb_json<<
" \"eta\": "<<
static_cast<int>(chamb.
eta)<<
",\n";
449 chamb_json<<
" \"phi\": "<<
static_cast<int>(chamb.
phi)<<
",\n";
450 chamb_json<<
" \"ml\": "<<
static_cast<int>(chamb.
multilayer)<<
",\n";
451 chamb_json<<" \"subDet\": "<<static_cast<int>(chamb.subdetectorId)<<",\n";
452 chamb_json<<" \"csm\": "<<static_cast<int>(chamb.csm)<<",\n";
453 chamb_json<<" \"mrod\": "<<static_cast<int>(chamb.mrod)<<",\n";
454 chamb_json<<" \"tdcId\": "<<static_cast<int>(chamb.tdcId)<<",\n";
455 chamb_json<<" \"mezzId\": "<<static_cast<int>(chamb.mezzanine_type)<<",\n";
456 chamb_json<<" \"tubeZero\": "<<static_cast<int>(chamb.tube)<<"\n";
457 chamb_json<<" }";
458 if (i +1 != cached_chnls.size()) chamb_json<<",";
459 chamb_json<<"\n";
461 }
462 chamb_json<<"]"<<std::endl;
463 }
464
465
466 return StatusCode::SUCCESS;
467}
constexpr std::array< T, N > make_array(const T &def_val)
Helper function to initialize in-place arrays with non-zero values.
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Gaudi::Property< std::string > m_summaryTxt
Gaudi::Property< std::string > m_mezzJSON
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_DetectorManagerKey
SG::ReadCondHandleKey< MuonMDT_CablingMap > m_cablingKey
Gaudi::Property< std::string > m_cablingJSON
Gaudi::Property< bool > m_insertBISCabling
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Identifier multilayerID(const Identifier &channeldID) const
Identifier elementID(int stationName, int stationEta, int stationPhi) const
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int tubeLayer, int tube) const
static constexpr uint8_t NOTSET
const Mapping & tdcToTubeMap() const
Returns the underlying TDC -> Tube conversion map.
uint8_t id() const
returns mezzanine database identifier
uint8_t numTubeLayers() const
returns the number of layers
const MdtCablingOffData & offId() const
get the offline identifier
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.
const MdtReadoutElement * getMdtReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
int getStationPhi() const
int getStationEta() const
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
const std::string & stationNameString(const Identifier &id) const
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
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
uint8_t tdcId
Mezzanine type.
uint8_t mezzanine_type
Tube number in the layer.
int tube
Layer inside the multilayer.
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.
uint8_t & subdetectorId
CSM number.
uint8_t & csm
MROD number.