Subdetector identifiers (0x65 for chambers on the posivie side and 0x66 for chambers on the other side
24 {
26 if (!outStream.good()) {
28 return StatusCode::FAILURE;
29 }
30
31 std::vector<const MuonGMR4::RpcReadoutElement *> reEles{
m_detMgr->getAllRpcReadoutElements()};
32
34 constexpr int subDetA{0x65}, subDetB{0x66};
36
37 unsigned int boardSecA{0}, boardSecC{0};
38
39 nlohmann::json chamberJSON{}, flatCableJSON{};
40 std::vector<std::unique_ptr<RpcFlatCableTranslator>> flatTranslators{};
41
42 auto connectFlatCable = [&flatCableJSON, &flatTranslators, this](const unsigned coveredStrips) -> unsigned{
43 for (std::unique_ptr<RpcFlatCableTranslator>& translator : flatTranslators){
44 if (static_cast<unsigned>(translator->connectedChannels()) == coveredStrips){
45 return translator->id();
46 }
47 }
48 auto& translator = flatTranslators.emplace_back(std::make_unique<RpcFlatCableTranslator>(flatTranslators.size()));
52 }
53 }
54 nlohmann::json chipJSON{};
55 chipJSON["flatCableId"] = translator->id();
56 std::vector<std::pair<unsigned,unsigned>> pins{};
59 }
60 chipJSON["pinAssignment"] = pins;
61
62 flatCableJSON.push_back(chipJSON);
63 return translator->id();
64 };
65
68 for (const MuonGMR4::RpcReadoutElement *reEle : reEles) {
69 const unsigned int subDet = reEle->stationEta() > 0 ? subDetA : subDetB;
70 const unsigned int boardSec = reEle->stationEta() > 0 ? (++boardSecA) : (++boardSecC);
71 unsigned int board{1};
72 for (
unsigned int gasGap = 1;
gasGap <= reEle->nGasGaps(); ++
gasGap) {
73 for (
int doubletPhi = reEle->doubletPhi(); doubletPhi <= reEle->doubletPhiMax(); ++
doubletPhi) {
74 for (bool measPhi : {false, true}) {
75 const IdentifierHash layHash = reEle->createHash(1, gasGap, doubletPhi, measPhi);
76 if (!reEle->nStrips(layHash))
77 continue;
78 const unsigned int nStrips = reEle->nStrips(layHash);
79 const unsigned int nBoardChips = (
nStrips % nStripsPerBoard > 0) +
80 (nStrips - (nStrips % nStripsPerBoard)) / nStripsPerBoard;
81
82 for (bool side : {false, true}) {
83 if (side && reEle->nPhiStrips()!= 0) {
85 continue;
86 }
87 unsigned int measPhiSide = (
side * stripSideBit) | (measPhi * measPhiBit);
88 for (unsigned int chip = 0; chip < nBoardChips; ++chip) {
91 nlohmann::json cablingChannel{};
92 cablingChannel[
"station"] =
m_idHelperSvc->stationNameString(reEle->identify());
93 cablingChannel["eta"] = reEle->stationEta();
94 cablingChannel["phi"] = reEle->stationPhi();
95 cablingChannel["doubletR"] = reEle->doubletR();
96 cablingChannel["doubletZ"] = reEle->doubletZ();
98 cablingChannel[
"gasGap"] =
gasGap;
99 cablingChannel["measPhi"] = measPhiSide;
100
101 cablingChannel["subDetector"] = subDet;
102 cablingChannel["boardSector"] = boardSec;
104 cablingChannel["board"] = (++board);
105 cablingChannel["flatCableId"] = connectFlatCable(coveredStrips);
107 <<"nStrips: "<<nStrips<<", stripsPerBoard "
108 <<nStripsPerBoard<<", nChips: "<<nBoardChips<<", covered: "<<coveredStrips);
109 chamberJSON.push_back(cablingChannel);
110 }
111 }
112 }
113 }
114 }
115 }
116 nlohmann::json finalJSON{};
117 finalJSON["chamberMap"] = chamberJSON;
118 finalJSON["readoutCards"] = flatCableJSON;
119 outStream << finalJSON.dump(2) << std::endl;
120 return StatusCode::SUCCESS;
121 }
#define ATH_MSG_VERBOSE(x)
static constexpr uint8_t firstStrip
Convention of the lowest strip number.
static constexpr uint8_t readStrips
Number of channels covered by one chip.
static constexpr uint8_t notSet
Default value indicating that the channel is not set.
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Gaudi::Property< std::string > m_cablingJSON
const MuonGMR4::MuonDetectorManager * m_detMgr
int nStrips(const MuonGM::TgcReadoutElement &readoutEle, int layer)
setScaleOne setStatusOne setSaturated int16_t
static constexpr int8_t measPhiBit
gas gap -> 1-3
static constexpr int8_t stripSideBit
#define THROW_EXCEPTION(MESSAGE)