ATLAS Offline Software
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 
13 namespace Muon {
15  ATH_CHECK(m_idHelperSvc.retrieve());
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 nStripsPerTdc = RpcFlatCableTranslator::readStrips;
38 
39  unsigned int tdcSecA{0}, tdcSecC{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 tdcSec = reEle->stationEta() > 0 ? (++tdcSecA) : (++tdcSecC);
73  unsigned int tdc{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 nTdcChips = (nStrips % nStripsPerTdc > 0) +
82  (nStrips - (nStrips % nStripsPerTdc)) / nStripsPerTdc;
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 < nTdcChips; ++chip) {
92  const unsigned firstStrip = (RpcFlatCableTranslator::firstStrip + nStripsPerTdc * chip);
93  const unsigned coveredStrips = std::min(nStripsPerTdc, 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["tdcSector"] = tdcSec;
106  cablingChannel["firstStrip"] = firstStrip;
107  cablingChannel["tdc"] = (++tdc);
108  cablingChannel["flatCableId"] = connectFlatCable(coveredStrips);
109  ATH_MSG_VERBOSE("Install new cabling "<<m_idHelperSvc->toString(reEle->measurementId(layHash))
110  <<"nStrips: "<<nStrips<<", stripsPerTdc"
111  <<nStripsPerTdc<<", nChips: "<<nTdcChips<<", 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 }
Muon::RpcFlatCableTranslator::readStrips
static constexpr uint8_t readStrips
Number of channels covered by one chip.
Definition: RpcFlatCableTranslator.h:21
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
RpcToyCablingJsonDumpAlg.h
Muon::RpcToyCablingJsonDumpAlg::initialize
virtual StatusCode initialize() override
Definition: RpcToyCablingJsonDumpAlg.cxx:14
dumpTgcDigiDeadChambers.gasGap
list gasGap
Definition: dumpTgcDigiDeadChambers.py:33
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
RpcCablingData.h
Muon::RpcToyCablingJsonDumpAlg::execute
virtual StatusCode execute() override
Definition: RpcToyCablingJsonDumpAlg.cxx:26
json
nlohmann::json json
Definition: HistogramDef.cxx:9
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
Muon::RpcFlatCableTranslator::notSet
static constexpr uint8_t notSet
Default value indicating that the channel is not set.
Definition: RpcFlatCableTranslator.h:23
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
THROW_EXCEPTION
#define THROW_EXCEPTION(MSG)
Definition: MMReadoutElement.cxx:48
Muon
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
Definition: TrackSystemController.h:45
Muon::RpcCablingOfflineID::measPhiBit
static constexpr int8_t measPhiBit
gas gap -> 1-3
Definition: RpcCablingData.h:54
MuonGMR4::RpcReadoutElement
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/RpcReadoutElement.h:17
xAOD::int16_t
setScaleOne setStatusOne setSaturated int16_t
Definition: gFexGlobalRoI_v1.cxx:55
Muon::RpcToyCablingJsonDumpAlg::m_detMgr
const MuonGMR4::MuonDetectorManager * m_detMgr
Definition: RpcToyCablingJsonDumpAlg.h:35
AthCommonDataStore< AthCommonMsg< Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
TRT::Hit::side
@ side
Definition: HitInfo.h:83
Muon::RpcToyCablingJsonDumpAlg::m_cablingJSON
Gaudi::Property< std::string > m_cablingJSON
Definition: RpcToyCablingJsonDumpAlg.h:37
SCT_CalibAlgs::firstStrip
@ firstStrip
Definition: SCT_CalibNumbers.h:10
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
Muon::RpcToyCablingJsonDumpAlg::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: RpcToyCablingJsonDumpAlg.h:33
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonGM::nStrips
int nStrips(const MuonGM::TgcReadoutElement &readoutEle, int layer)
Definition: MuonDetDescr/MuonGeoModelTest/src/GeoModelTgcTest.cxx:46
Muon::RpcCablingOfflineID::stripSideBit
static constexpr int8_t stripSideBit
Definition: RpcCablingData.h:55
RpcFlatCableTranslator.h
Muon::RpcFlatCableTranslator::firstStrip
static constexpr uint8_t firstStrip
Convention of the lowest strip number.
Definition: RpcFlatCableTranslator.h:25
Muon::RpcToyCablingJsonDumpAlg::m_BIS_stIdx
int m_BIS_stIdx
Definition: RpcToyCablingJsonDumpAlg.h:40
createCablingJSON.doubletPhi
int doubletPhi
Definition: createCablingJSON.py:16
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
Muon::RpcToyCablingJsonDumpAlg::m_BIL_stIdx
int m_BIL_stIdx
Definition: RpcToyCablingJsonDumpAlg.h:39