46 const EventContext& ctx = Gaudi::Hive::currentContext();
47 ATH_MSG_INFO(
"Dump cabling & mezzanines into JSON file");
57 std::vector<MdtMezzanineCard> cached_cards{};
58 std::set<MdtCablingData> cached_chnls{};
70 <<
" since it will be inserted manually");
76 std::map<TdcIdentifier, Mapping> chamber_mezz{};
81 for (
int layer = 1 ; layer <= nLayers; ++layer){
82 for (
int tubeInLayer = 1 ; tubeInLayer <= nTubes; ++tubeInLayer) {
85 layer, tubeInLayer, is_valid);
92 cabling->convert(tube_id,cabling_data);
94 if (!cabling->getOnlineId(cabling_data, msgStream())) {
98 const TdcIdentifier tdc_id{cabling_data};
99 chamber_mezz.try_emplace(tdc_id,unsetArray);
100 chamber_mezz[tdc_id][cabling_data.channelId] = dummy_card.
tubeNumber(layer, tubeInLayer);
104 for (
auto&[tdc, mezz_mapping] : chamber_mezz) {
109 mezzCablingId.
tdcId = tdc.tdcId;
111 MdtTdcOnlSorter chipInCab = cabling->getOnlineConvMap().at(tdc).all_modules.at(tdc.tdcId);
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);
130 Mapping& mtmp = mezz_mapping;
131 std::vector<MdtMezzanineCard>::const_iterator itr = std::find_if(cached_cards.begin(), cached_cards.end(),
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;
139 if (itr != cached_cards.end()) {
140 mezzCablingId.mezzanine_type = itr->id();
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;
147 mezzCablingId.mezzanine_type = cached_cards.back().id();
149 cached_chnls.insert(std::move(mezzCablingId));
153 if(m_insertBISCabling){
181 constexpr std::array<uint8_t,24> mezzanineType6InvertedMap{23, 17, 11, 5,
188 constexpr std::array<uint8_t,24> mezzanineType6bInvertedMap{250, 250, 250,250,
194 constexpr std::array<uint8_t,24> mezzanineType6b2InvertedMap{250, 250, 250, 250,
201 constexpr std::array<uint8_t,24> mezzanineType7Map{12, 18, 0, 6,
208 constexpr std::array<uint8_t,24> mezzanineType7bMap{12, 18, 0, 6,
215 constexpr std::array<uint8_t,24> mezzanineType7b2Map{ 13, 19, 1, 7,
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,
239 for(
size_t ch = 0;
ch < card.tdcToTubeMap().size(); ++
ch){
240 if(cachedCard.
tdcToTubeMap()[ch] != card.tdcToTubeMap()[ch]) {
246 if(itr != cached_cards.end()){
247 mezzTypeIds[
type] = itr->id();
249 cached_cards.emplace_back(card.tdcToTubeMap(), card.numTubeLayers(), cached_cards.size() + 10);
250 mezzTypeIds[
type] = cached_cards.back().id();
254 for(
auto& [
type,card] : mezzTypes){
260 std::map<uint8_t, uint8_t> mrodMap, csmMap;
261 mrodMap[97] = 55; csmMap[97] = 0;
262 mrodMap[98] = 55; csmMap[98] = 0;
264 for (
auto det_itr = idHelper.detectorElement_begin(); det_itr != idHelper.detectorElement_end(); ++det_itr){
275 if( !m_insertBISCabling || m_idHelperSvc->stationNameString(station_id)!=
"BIS" || readEle->
getStationEta() >= 7) {
283 ATH_MSG_INFO(
"Will insert cabling for station "<<m_idHelperSvc->toString(station_id));
294 for(
int tubeInLayer = 1 ; tubeInLayer <= nTubes;
295 tubeInLayer += mezzTypes.at(
"mezzanineType6").numTubesPerLayer()){
297 if(tubeInLayer==1 && std::abs(readEle->
getStationEta()) !=7){tubeInLayer -=1;}
299 if(tubeInLayer <= tubesPerLayer_ml1){
300 mezzCablingId_ml1.
stationIndex = m_idHelperSvc->stationName(station_id);
305 mezzCablingId_ml1.
csm = csmMap[subdetectorId];
306 mezzCablingId_ml1.
mrod = mrodMap[subdetectorId];
307 mezzCablingId_ml1.
tdcId = tdcId;
308 mezzCablingId_ml1.
tube = tubeInLayer;
313 mezzCablingId_ml2.
stationIndex = m_idHelperSvc->stationName(station_id);
318 mezzCablingId_ml2.
csm = csmMap[subdetectorId];
319 mezzCablingId_ml2.
mrod = mrodMap[subdetectorId];
320 mezzCablingId_ml2.
tdcId = tdcId +1;
321 mezzCablingId_ml2.
tube = tubeInLayer;
325 std::string mezzEndString =
"";
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);
333 if(tubeInLayer <= tubesPerLayer_ml1) {
334 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
336 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
338 if(tubeInLayer <= tubesPerLayer_ml1) {
339 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
341 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
346 if(tubeInLayer <= tubesPerLayer_ml1){
347 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
349 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
351 if(tubeInLayer <= tubesPerLayer_ml1){
352 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
354 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
357 if(tubeInLayer <= tubesPerLayer_ml1) {
358 cached_chnls.insert(std::move(mezzCablingId_ml1));
360 cached_chnls.insert(std::move(mezzCablingId_ml2));
364 if((std::abs(readEle->
getStationEta()) == 1 && tdcId >=12) ||
368 csmMap[subdetectorId] +=1;
369 if(csmMap[subdetectorId]>5){
370 csmMap[subdetectorId]=0;
371 mrodMap[subdetectorId]+=1;
376 csmMap[subdetectorId] +=1;
377 if(csmMap[subdetectorId]>5){
378 csmMap[subdetectorId]=0;
379 mrodMap[subdetectorId]+=1;
385 std::ofstream
summary{m_summaryTxt};
388 return StatusCode::FAILURE;
390 summary<<
"Extracted "<<cached_cards.size()<<
" mezzanine card layouts and "
391 <<cached_chnls.size()<<
" chamber channels. \n\n\n";
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);
406 summary<<static_cast<int>(
cabling.tdcId)<<
", ";
409 <<
"##############################################################\n";
414 std::ofstream mezz_json{m_mezzJSON};
415 if (!mezz_json.good()) {
417 return StatusCode::FAILURE;
419 mezz_json<<
"["<<std::endl;
420 for (
size_t i = 0;
i < cached_cards.size() ; ++
i) {
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<<
",";
432 if (i +1 != cached_cards.size()) mezz_json<<
",";
438 std::ofstream chamb_json{m_cablingJSON};
439 if (!chamb_json.good()) {
441 return StatusCode::FAILURE;
447 chamb_json<<
" \"station\": \""<<idHelper.stationNameString(chamb.
stationIndex)<<
"\",\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";
458 if (i +1 != cached_chnls.size()) chamb_json<<
",";
462 chamb_json<<
"]"<<std::endl;
466 return StatusCode::SUCCESS;