46 ATH_MSG_INFO(
"Dump cabling & mezzanines into JSON file");
56 std::vector<MdtMezzanineCard> cached_cards{};
57 std::set<MdtCablingData> cached_chnls{};
69 <<
" since it will be inserted manually");
75 std::map<TdcIdentifier, Mapping> chamber_mezz{};
80 for (
int layer = 1 ; layer <= nLayers; ++layer){
81 for (
int tubeInLayer = 1 ; tubeInLayer <= nTubes; ++tubeInLayer) {
84 layer, tubeInLayer, is_valid);
91 cabling->convert(tube_id,cabling_data);
93 if (!cabling->getOnlineId(cabling_data, msgStream())) {
97 const TdcIdentifier tdc_id{cabling_data};
98 chamber_mezz.try_emplace(tdc_id,unsetArray);
99 chamber_mezz[tdc_id][cabling_data.channelId] = dummy_card.
tubeNumber(layer, tubeInLayer);
103 for (
auto&[tdc, mezz_mapping] : chamber_mezz) {
108 mezzCablingId.
tdcId = tdc.tdcId;
110 MdtTdcOnlSorter chipInCab = cabling->getOnlineConvMap().at(tdc).all_modules.at(tdc.tdcId);
121 for (
size_t chan = 0 ; chan < mezz_mapping.size(); ++chan) {
122 const OfflineCh tube_lay =
remap.offlineTube(chan, msgStream());
123 if (!tube_lay.isValid)
continue;
124 uint8_t tubeNumber = tube_lay.tube + tubeOffSet + 1;
125 mezz_mapping[chan] =
remap.tubeNumber(tube_lay.layer, tubeNumber);
129 Mapping& mtmp = mezz_mapping;
130 std::vector<MdtMezzanineCard>::const_iterator itr = std::find_if(cached_cards.begin(), cached_cards.end(),
132 if (dummy_card.numTubeLayers() != card.numTubeLayers()) return false;
133 for (size_t ch =0; ch < mtmp.size(); ++ch) {
134 if (mtmp[ch] != card.tdcToTubeMap()[ch]) return false;
138 if (itr != cached_cards.end()) {
139 mezzCablingId.mezzanine_type = itr->id();
141 cached_cards.emplace_back(mezz_mapping, dummy_card.
numTubeLayers(), cached_cards.size() + 10);
142 if (!cached_cards.back().checkConsistency(msgStream())) {
144 return StatusCode::FAILURE;
146 mezzCablingId.mezzanine_type = cached_cards.back().id();
148 cached_chnls.insert(std::move(mezzCablingId));
152 if(m_insertBISCabling){
180 constexpr std::array<uint8_t,24> mezzanineType6InvertedMap{23, 17, 11, 5,
187 constexpr std::array<uint8_t,24> mezzanineType6bInvertedMap{250, 250, 250,250,
193 constexpr std::array<uint8_t,24> mezzanineType6b2InvertedMap{250, 250, 250, 250,
200 constexpr std::array<uint8_t,24> mezzanineType7Map{12, 18, 0, 6,
207 constexpr std::array<uint8_t,24> mezzanineType7bMap{12, 18, 0, 6,
214 constexpr std::array<uint8_t,24> mezzanineType7b2Map{ 13, 19, 1, 7,
224 std::map<std::string, MdtMezzanineCard> mezzTypes{};
225 mezzTypes.emplace(std::make_pair(
"mezzanineType6",
MdtMezzanineCard(mezzanineType6InvertedMap, 4, 0)));
226 mezzTypes.emplace(std::make_pair(
"mezzanineType6b",
MdtMezzanineCard(mezzanineType6bInvertedMap, 4, 0)));
227 mezzTypes.emplace(std::make_pair(
"mezzanineType6b2",
MdtMezzanineCard(mezzanineType6b2InvertedMap, 4, 0)));
228 mezzTypes.emplace(std::make_pair(
"mezzanineType7",
MdtMezzanineCard(mezzanineType7Map, 4, 0)));
229 mezzTypes.emplace(std::make_pair(
"mezzanineType7b",
MdtMezzanineCard(mezzanineType7bMap, 4, 0)));
230 mezzTypes.emplace(std::make_pair(
"mezzanineType7b2",
MdtMezzanineCard(mezzanineType7b2Map, 4, 0)));
231 std::map<std::string, int> mezzTypeIds{};
232 for(
auto& [
type,card] : mezzTypes){
233 auto itr = std::ranges::find_if(cached_cards,
238 for(
size_t ch = 0;
ch < card.tdcToTubeMap().
size(); ++
ch){
239 if(cachedCard.
tdcToTubeMap()[ch] != card.tdcToTubeMap()[ch]) {
245 if(itr != cached_cards.end()){
246 mezzTypeIds[
type] = itr->id();
248 cached_cards.emplace_back(card.tdcToTubeMap(), card.numTubeLayers(), cached_cards.size() + 10);
249 mezzTypeIds[
type] = cached_cards.back().id();
253 for(
auto& [
type,card] : mezzTypes){
259 std::map<uint8_t, uint8_t> mrodMap, csmMap;
260 mrodMap[97] = 55; csmMap[97] = 0;
261 mrodMap[98] = 55; csmMap[98] = 0;
263 for (
auto det_itr = idHelper.detectorElement_begin(); det_itr != idHelper.detectorElement_end(); ++det_itr){
274 if( !m_insertBISCabling || m_idHelperSvc->stationNameString(station_id)!=
"BIS" || readEle->
getStationEta() >= 7) {
282 ATH_MSG_INFO(
"Will insert cabling for station "<<m_idHelperSvc->toString(station_id));
293 for(
int tubeInLayer = 1 ; tubeInLayer <= nTubes;
294 tubeInLayer += mezzTypes.at(
"mezzanineType6").numTubesPerLayer()){
296 if(tubeInLayer==1 && std::abs(readEle->
getStationEta()) !=7){tubeInLayer -=1;}
298 if(tubeInLayer <= tubesPerLayer_ml1){
299 mezzCablingId_ml1.
stationIndex = m_idHelperSvc->stationName(station_id);
304 mezzCablingId_ml1.
csm = csmMap[subdetectorId];
305 mezzCablingId_ml1.
mrod = mrodMap[subdetectorId];
306 mezzCablingId_ml1.
tdcId = tdcId;
307 mezzCablingId_ml1.
tube = tubeInLayer;
312 mezzCablingId_ml2.
stationIndex = m_idHelperSvc->stationName(station_id);
317 mezzCablingId_ml2.
csm = csmMap[subdetectorId];
318 mezzCablingId_ml2.
mrod = mrodMap[subdetectorId];
319 mezzCablingId_ml2.
tdcId = tdcId +1;
320 mezzCablingId_ml2.
tube = tubeInLayer;
324 std::string mezzEndString =
"";
326 if(std::abs(readEle->
getStationEta()) !=7 && tubeInLayer + 6 > nTubes) { mezzEndString =
"b"; }
327 if(std::abs(readEle->
getStationEta()) !=7 && tubeInLayer==0 ) { mezzEndString =
"b2"; }
328 ATH_MSG_VERBOSE(
"For station "<<m_idHelperSvc->toString(station_id) <<
" tube " << tubeInLayer<<
" assigning mezzanine types for tubeInLayer "<<tubeInLayer <<
" mezzEndString "<<mezzEndString);
332 if(tubeInLayer <= tubesPerLayer_ml1) {
333 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
335 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
337 if(tubeInLayer <= tubesPerLayer_ml1) {
338 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
340 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
345 if(tubeInLayer <= tubesPerLayer_ml1){
346 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
348 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType6"+mezzEndString];
350 if(tubeInLayer <= tubesPerLayer_ml1){
351 mezzCablingId_ml1.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
353 mezzCablingId_ml2.
mezzanine_type = mezzTypeIds[
"mezzanineType7"+mezzEndString];
356 if(tubeInLayer <= tubesPerLayer_ml1) {
357 cached_chnls.insert(std::move(mezzCablingId_ml1));
359 cached_chnls.insert(std::move(mezzCablingId_ml2));
363 if((std::abs(readEle->
getStationEta()) == 1 && tdcId >=12) ||
367 csmMap[subdetectorId] +=1;
368 if(csmMap[subdetectorId]>5){
369 csmMap[subdetectorId]=0;
370 mrodMap[subdetectorId]+=1;
375 csmMap[subdetectorId] +=1;
376 if(csmMap[subdetectorId]>5){
377 csmMap[subdetectorId]=0;
378 mrodMap[subdetectorId]+=1;
384 std::ofstream
summary{m_summaryTxt};
387 return StatusCode::FAILURE;
389 summary<<
"Extracted "<<cached_cards.size()<<
" mezzanine card layouts and "
390 <<cached_chnls.size()<<
" chamber channels. \n\n\n";
395 if (
cabling.mezzanine_type != card.id())
continue;
396 if (chamb != cabling) {
399 summary<<static_cast<int>(std::abs(chamb.
eta));
401 summary<<static_cast<int>(chamb.
phi);
405 summary<<static_cast<int>(
cabling.tdcId)<<
", ";
408 <<
"##############################################################\n";
413 std::ofstream mezz_json{m_mezzJSON};
414 if (!mezz_json.good()) {
416 return StatusCode::FAILURE;
418 mezz_json<<
"["<<std::endl;
419 for (
size_t i = 0;
i < cached_cards.size() ; ++
i) {
422 mezz_json<<
" \"mezzId\": "<<
static_cast<int>(card.
id())<<
",\n";
423 mezz_json<<
" \"nTubeLayer\": "<<
static_cast<int>(card.
numTubeLayers())<<
",\n";
424 mezz_json<<
" \"tdcToTubeMap\": [";
427 if (ch + 1 != card.
tdcToTubeMap().size())mezz_json<<
",";
431 if (i +1 != cached_cards.size()) mezz_json<<
",";
437 std::ofstream chamb_json{m_cablingJSON};
438 if (!chamb_json.good()) {
440 return StatusCode::FAILURE;
446 chamb_json<<
" \"station\": \""<<idHelper.stationNameString(chamb.
stationIndex)<<
"\",\n";
447 chamb_json<<
" \"eta\": "<<
static_cast<int>(chamb.
eta)<<
",\n";
448 chamb_json<<
" \"phi\": "<<
static_cast<int>(chamb.
phi)<<
",\n";
449 chamb_json<<
" \"ml\": "<<
static_cast<int>(chamb.
multilayer)<<
",\n";
450 chamb_json<<
" \"subDet\": "<<
static_cast<int>(chamb.subdetectorId)<<
",\n";
451 chamb_json<<
" \"csm\": "<<
static_cast<int>(chamb.csm)<<
",\n";
452 chamb_json<<
" \"mrod\": "<<
static_cast<int>(chamb.mrod)<<
",\n";
453 chamb_json<<
" \"tdcId\": "<<
static_cast<int>(chamb.tdcId)<<
",\n";
454 chamb_json<<
" \"mezzId\": "<<
static_cast<int>(chamb.mezzanine_type)<<
",\n";
455 chamb_json<<
" \"tubeZero\": "<<
static_cast<int>(chamb.tube)<<
"\n";
457 if (i +1 != cached_chnls.size()) chamb_json<<
",";
461 chamb_json<<
"]"<<std::endl;
465 return StatusCode::SUCCESS;