ATLAS Offline Software
Loading...
Searching...
No Matches
RpcToyCablingJsonDumpAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
9#include "GeoModelKernel/throwExcept.h"
10#include "nlohmann/json.hpp"
11#include <fstream>
12
13namespace Muon {
15 ATH_CHECK(m_idHelperSvc.retrieve());
16 ATH_CHECK(detStore()->retrieve(m_detMgr));
17 if (!m_idHelperSvc->hasRPC()) {
18 ATH_MSG_FATAL("You can't write rpc cablings without rpc detectors? ");
19 return StatusCode::FAILURE;
20 }
21
22 m_BIL_stIdx = m_idHelperSvc->rpcIdHelper().stationNameIndex("BIL");
23 m_BIS_stIdx = m_idHelperSvc->rpcIdHelper().stationNameIndex("BIS");
24 return StatusCode::SUCCESS;
25 }
27 std::ofstream outStream{m_cablingJSON};
28 if (!outStream.good()) {
29 ATH_MSG_FATAL("Failed to create JSON file " << m_cablingJSON);
30 return StatusCode::FAILURE;
31 }
32
33 std::vector<const MuonGMR4::RpcReadoutElement *> reEles{m_detMgr->getAllRpcReadoutElements()};
34
36 constexpr int subDetA{0x65}, subDetB{0x66};
37 constexpr unsigned nStripsPerBoard = RpcFlatCableTranslator::readStrips;
38
39 unsigned int boardSecA{0}, boardSecC{0};
40
41 nlohmann::json chamberJSON{}, flatCableJSON{};
42 std::vector<std::unique_ptr<RpcFlatCableTranslator>> flatTranslators{};
43
44 auto connectFlatCable = [&flatCableJSON, &flatTranslators, this](const unsigned coveredStrips) -> unsigned{
45 for (std::unique_ptr<RpcFlatCableTranslator>& translator : flatTranslators){
46 if (static_cast<unsigned>(translator->connectedChannels()) == coveredStrips){
47 return translator->id();
48 }
49 }
50 auto& translator = flatTranslators.emplace_back(std::make_unique<RpcFlatCableTranslator>(flatTranslators.size()));
51 for (unsigned int s = RpcFlatCableTranslator::firstStrip; s <= coveredStrips; ++s) {
52 if (!translator->mapChannels(s, RpcFlatCableTranslator::readStrips -s, msgStream())){
53 THROW_EXCEPTION("Channel mapping failed");
54 }
55 }
56 nlohmann::json chipJSON{};
57 chipJSON["flatCableId"] = translator->id();
58 std::vector<std::pair<unsigned,unsigned>> pins{};
59 for (unsigned int s = RpcFlatCableTranslator::firstStrip; s <= coveredStrips; ++s) {
60 pins.emplace_back(s, translator->tdcChannel(s, msgStream()).value_or(RpcFlatCableTranslator::notSet));
61 }
62 chipJSON["pinAssignment"] = pins;
63
64 flatCableJSON.push_back(chipJSON);
65 return translator->id();
66 };
67
68 constexpr int16_t measPhiBit = RpcCablingData::measPhiBit;
69 constexpr int16_t stripSideBit = RpcCablingData::stripSideBit;
70 for (const MuonGMR4::RpcReadoutElement *reEle : reEles) {
71 const unsigned int subDet = reEle->stationEta() > 0 ? subDetA : subDetB;
72 const unsigned int boardSec = reEle->stationEta() > 0 ? (++boardSecA) : (++boardSecC);
73 unsigned int board{1};
74 for (unsigned int gasGap = 1; gasGap <= reEle->nGasGaps(); ++gasGap) {
75 for (int doubletPhi = reEle->doubletPhi(); doubletPhi <= reEle->doubletPhiMax(); ++doubletPhi) {
76 for (bool measPhi : {false, true}) {
77 const IdentifierHash layHash = reEle->createHash(1, gasGap, doubletPhi, measPhi);
78 if (!reEle->nStrips(layHash))
79 continue;
80 const unsigned int nStrips = reEle->nStrips(layHash);
81 const unsigned int nBoardChips = (nStrips % nStripsPerBoard > 0) +
82 (nStrips - (nStrips % nStripsPerBoard)) / nStripsPerBoard;
83
84 for (bool side : {false, true}) {
85 bool run4_BIS = ((reEle->stationName() == m_BIS_stIdx) && (std::abs(reEle->stationEta()) < 7));
86 if (side && reEle->stationName() != m_BIL_stIdx && !(run4_BIS)) {
88 continue;
89 }
90 unsigned int measPhiSide = (side * stripSideBit) | (measPhi * measPhiBit);
91 for (unsigned int chip = 0; chip < nBoardChips; ++chip) {
92 const unsigned firstStrip = (RpcFlatCableTranslator::firstStrip + nStripsPerBoard * chip);
93 const unsigned coveredStrips = std::min(nStripsPerBoard, nStrips - (firstStrip - RpcFlatCableTranslator::firstStrip));
94 nlohmann::json cablingChannel{};
95 cablingChannel["station"] = m_idHelperSvc->stationNameString(reEle->identify());
96 cablingChannel["eta"] = reEle->stationEta();
97 cablingChannel["phi"] = reEle->stationPhi();
98 cablingChannel["doubletR"] = reEle->doubletR();
99 cablingChannel["doubletZ"] = reEle->doubletZ();
100 cablingChannel["doubletPhi"] = doubletPhi;
101 cablingChannel["gasGap"] = gasGap;
102 cablingChannel["measPhi"] = measPhiSide;
103
104 cablingChannel["subDetector"] = subDet;
105 cablingChannel["boardSector"] = boardSec;
106 cablingChannel["firstStrip"] = firstStrip;
107 cablingChannel["board"] = (++board);
108 cablingChannel["flatCableId"] = connectFlatCable(coveredStrips);
109 ATH_MSG_VERBOSE("Install new cabling "<<m_idHelperSvc->toString(reEle->measurementId(layHash))
110 <<"nStrips: "<<nStrips<<", stripsPerBoard "
111 <<nStripsPerBoard<<", nChips: "<<nBoardChips<<", covered: "<<coveredStrips);
112 chamberJSON.push_back(cablingChannel);
113 }
114 }
115 }
116 }
117 }
118 }
119 nlohmann::json finalJSON{};
120 finalJSON["chamberMap"] = chamberJSON;
121 finalJSON["readoutCards"] = flatCableJSON;
122 outStream << finalJSON.dump(2) << std::endl;
123 return StatusCode::SUCCESS;
124 }
125}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
const ServiceHandle< StoreGateSvc > & detStore() const
This is a "hash" representation of an Identifier.
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
virtual StatusCode initialize() override
const MuonGMR4::MuonDetectorManager * m_detMgr
virtual StatusCode execute() override
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
static constexpr int8_t measPhiBit
gas gap -> 1-3
static constexpr int8_t stripSideBit
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10