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 return StatusCode::SUCCESS;
23 }
25 std::ofstream outStream{m_cablingJSON};
26 if (!outStream.good()) {
27 ATH_MSG_FATAL("Failed to create JSON file " << m_cablingJSON);
28 return StatusCode::FAILURE;
29 }
30
31 std::vector<const MuonGMR4::RpcReadoutElement *> reEles{m_detMgr->getAllRpcReadoutElements()};
32
34 constexpr int subDetA{0x65}, subDetB{0x66};
35 constexpr unsigned nStripsPerBoard = RpcFlatCableTranslator::readStrips;
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()));
49 for (unsigned int s = RpcFlatCableTranslator::firstStrip; s <= coveredStrips; ++s) {
50 if (!translator->mapChannels(s, RpcFlatCableTranslator::readStrips -s, msgStream())){
51 THROW_EXCEPTION("Channel mapping failed");
52 }
53 }
54 nlohmann::json chipJSON{};
55 chipJSON["flatCableId"] = translator->id();
56 std::vector<std::pair<unsigned,unsigned>> pins{};
57 for (unsigned int s = RpcFlatCableTranslator::firstStrip; s <= coveredStrips; ++s) {
58 pins.emplace_back(s, translator->tdcChannel(s, msgStream()).value_or(RpcFlatCableTranslator::notSet));
59 }
60 chipJSON["pinAssignment"] = pins;
61
62 flatCableJSON.push_back(chipJSON);
63 return translator->id();
64 };
65
66 constexpr int16_t measPhiBit = RpcCablingData::measPhiBit;
67 constexpr int16_t stripSideBit = RpcCablingData::stripSideBit;
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) {
89 const unsigned firstStrip = (RpcFlatCableTranslator::firstStrip + nStripsPerBoard * chip);
90 const unsigned coveredStrips = std::min(nStripsPerBoard, nStrips - (firstStrip - RpcFlatCableTranslator::firstStrip));
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();
97 cablingChannel["doubletPhi"] = doubletPhi;
98 cablingChannel["gasGap"] = gasGap;
99 cablingChannel["measPhi"] = measPhiSide;
100
101 cablingChannel["subDetector"] = subDet;
102 cablingChannel["boardSector"] = boardSec;
103 cablingChannel["firstStrip"] = firstStrip;
104 cablingChannel["board"] = (++board);
105 cablingChannel["flatCableId"] = connectFlatCable(coveredStrips);
106 ATH_MSG_VERBOSE("Install new cabling "<<m_idHelperSvc->toString(reEle->measurementId(layHash))
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 }
122}
#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