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.
43 {
44 const EventContext& ctx = Gaudi::Hive::currentContext();
45 ATH_MSG_INFO(
"Dump cabling & mezzanines into JSON file");
46
50 return StatusCode::FAILURE;
51 }
52
56 return StatusCode::FAILURE;
57 }
59
60 std::vector<MdtMezzanineCard> cached_cards{};
61 std::set<MdtCablingData> cached_chnls{};
64 const MuonGM::MdtReadoutElement* readEle = detectorMgr->getMdtReadoutElement(*det_itr);
65 if (!readEle) {
67 continue;
68 }
72 MdtMezzanineCard dummy_card(Mapping{}, readEle->
getNLayers(), -1);
73 std::map<TdcIdentifier, Mapping> chamber_mezz{};
77 for (
int layer = 1 ;
layer <= nLayers; ++
layer){
78 for (int tubeInLayer = 1 ; tubeInLayer <= nTubes; ++tubeInLayer) {
79 bool is_valid{false};
81 layer, tubeInLayer, is_valid);
82 if (!is_valid) {
84 continue;
85 }
88 cabling->convert(tube_id,cabling_data);
90 if (!
cabling->getOnlineId(cabling_data, msgStream())) {
92 return StatusCode::FAILURE;
93 }
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();
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;
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()) {
137 } else {
138 cached_cards.emplace_back(mezz_mapping, dummy_card.numTubeLayers(), cached_cards.size() + 10);
139 if (!cached_cards.back().checkConsistency(msgStream())) {
141 return StatusCode::FAILURE;
142 }
144 }
145 cached_chnls.insert(std::move(mezzCablingId));
146 }
147
148
149
150 }
152 {
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) {
162 MdtCablingOffData chamb{};
163 for (const MdtCablingData& cabling : cached_chnls) {
164 if (
cabling.mezzanine_type != card.id())
continue;
165 if (chamb != cabling) {
168 summary<<static_cast<int>(std::abs(chamb.
eta));
170 summary<<static_cast<int>(chamb.
phi);
173 }
174 summary<<static_cast<int>(
cabling.tdcId)<<
", ";
175 }
177 <<"##############################################################\n";
178 }
179 }
181 {
183 if (!mezz_json.good()) {
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\": [";
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 {
207 if (!chamb_json.good()) {
209 return StatusCode::FAILURE;
210 }
211 chamb_json<<"[\n";
213 for (const MdtCablingData& chamb : cached_chnls){
214 chamb_json<<" {\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";
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.
#define ATH_MSG_VERBOSE(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
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
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.
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
const std::string & stationNameString(const int &index) const
std::map< std::string, std::string > remap
list of directories to be explicitly remapped
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.