ATLAS Offline Software
Loading...
Searching...
No Matches
RpcCablingMap.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
6
9#include <cmath>
10#include <ranges>
11#include <format>
12
13namespace Muon {
15 m_rpcIdHelper{idHelperSvc->rpcIdHelper()}{}
16
18
19 bool RpcCablingMap::convert(const RpcCablingData& translator, Identifier& id, bool check_valid) const {
20 bool valid{!check_valid};
21 id = check_valid
22 ? m_rpcIdHelper.channelID(translator.stationIndex, translator.eta, translator.phi,
23 translator.doubletR, translator.doubletZ,
24 translator.doubletPhi, translator.gasGap,
25 translator.measuresPhi(), translator.strip, valid)
26 : m_rpcIdHelper.channelID(translator.stationIndex, translator.eta, translator.phi,
27 translator.doubletR, translator.doubletZ,
28 translator.doubletPhi, translator.gasGap,
29 translator.measuresPhi(), translator.strip);
30 return valid;
31 }
32
33 bool RpcCablingMap::convert(const Identifier& channelId, RpcCablingData& translator, bool setSideBit) const {
34 if (!m_rpcIdHelper.is_rpc(channelId)) {
35 return false;
36 }
37 translator.stationIndex = m_rpcIdHelper.stationName(channelId);
38 translator.eta = m_rpcIdHelper.stationEta(channelId);
39 translator.phi = m_rpcIdHelper.stationPhi(channelId);
40 translator.doubletR = m_rpcIdHelper.doubletR(channelId);
41 translator.doubletPhi = m_rpcIdHelper.doubletPhi(channelId);
42 translator.doubletZ = m_rpcIdHelper.doubletZ(channelId);
43 translator.gasGap = m_rpcIdHelper.gasGap(channelId);
44 translator.setMeasPhiAndSide(m_rpcIdHelper.measuresPhi(channelId), setSideBit);
45 translator.strip = m_rpcIdHelper.strip(channelId);
46 return true;
47 }
48
50 bool RpcCablingMap::getOnlineId(RpcCablingData& translatorCache, MsgStream& log) const {
51 if (log.level()<= MSG::DEBUG) {
52 log<<MSG::DEBUG<<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__<<": test "<<translatorCache<<endmsg;
53 }
54 const RpcCablingOfflineID& offId{translatorCache};
55 OfflToOnlMap::const_iterator itr = m_offToOnline.find(offId);
56 if (itr == m_offToOnline.end()) {
57 log << MSG::DEBUG<<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__<<": The offline identifier "
58 << offId << " is unknown " << endmsg;
59 return false;
60 }
61 const AllTdcsPerGasGap& tdcs{itr->second};
63 if (log.level() <= MSG::DEBUG) {
64 log<<MSG::DEBUG<<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__<<": Chamber "<<offId<<" has "
65 <<tdcs.size()<<" cards "<<endmsg;
66 }
67
68 const AllTdcsPerGasGap::const_iterator onlineCardItr =
69 std::ranges::find_if(tdcs, [&translatorCache](const GasGapToTdcAssociation& tdc){
70 return tdc.firstStrip + RpcFlatCableTranslator::readStrips > translatorCache.strip
71 && tdc.firstStrip <= translatorCache.strip;
72 });
73 if (onlineCardItr != itr->second.end()) {
74 const GasGapToTdcAssociation& onlineCard = (*onlineCardItr);
76 std::optional<uint8_t> tdcChannel = onlineCard.flatCable->tdcChannel(translatorCache.strip, log);
77 if (tdcChannel) {
78 static_cast<RpcCablingOnlineID&>(translatorCache) = onlineCard.tdcID;
79 translatorCache.channelId = (*tdcChannel);
80 if (log.level() <= MSG::DEBUG) {
81 log <<MSG::DEBUG<<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__<<": Mapped to card "
82 <<onlineCard.tdcID<<", channel: "<<static_cast<int>(translatorCache.channelId)<<endmsg;
83 }
84 return true;
85 } else if (log.level() <= MSG::DEBUG) {
86 log <<MSG::DEBUG<<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__<<":\n"<<(*onlineCard.flatCable)<<endmsg;
87 }
88 }
89 log << MSG::DEBUG<<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__<<": No tdc channel could be found for the object "
90 << static_cast<const RpcCablingOfflineID&>(translatorCache)<< " strip: " << static_cast<int>(translatorCache.strip) << endmsg;
91 return false;
92 }
93 bool RpcCablingMap::getOfflineId(RpcCablingData& translatorCache, MsgStream& log) const {
94 OnlToOfflMap::const_iterator itr = m_onToOffline.find(translatorCache);
95 if (itr == m_onToOffline.end()) {
96 log << MSG::DEBUG <<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__<<": The tdc chip "
97 << static_cast<const RpcCablingOnlineID&>(translatorCache) << " is unknown " << endmsg;
98 return false;
99 }
100 for (const TdcToGasGapAssociation& connectChamb: itr->second) {
101 const std::optional<uint8_t> stripCh = connectChamb.flatCable->stripChannel(translatorCache.channelId, log);
103 if (!stripCh) {
104 continue;
105 }
107 static_cast<RpcCablingOfflineID&>(translatorCache) = connectChamb.gasGapID;
108 translatorCache.strip = (*stripCh) + connectChamb.firstStrip;
109 if (log.level() <= MSG::DEBUG) {
110 log <<MSG::DEBUG<<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__<<": -- Card "
111 <<connectChamb.gasGapID<<", strip: "<<static_cast<int>(translatorCache.strip)<<endmsg;
112 }
113 return true;
114 }
115 log << MSG::DEBUG<<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__<<": No tdc channel could be found for the object "
116 << static_cast<const RpcCablingOnlineID&>(translatorCache)
117 << " tdc: " << static_cast<int>(translatorCache.channelId) << endmsg;
118
119 return false;
120 }
121
122 bool RpcCablingMap::insertChannels(CoolDBEntry&& entry, MsgStream& log) {
123 RpcCablingOfflineID offCh{entry};
124 RpcCablingOnlineID onlCh{entry};
125 GasGapToTdcAssociation offToOnl{};
126 offToOnl.tdcID = onlCh;
127 offToOnl.flatCable = entry.flatCable;
128 offToOnl.firstStrip = entry.firstStrip;
129
130 m_offToOnline[offCh].emplace_back(std::move(offToOnl));
131 std::ranges::sort(m_offToOnline[offCh],
133 return a.firstStrip < b.firstStrip;
134 });
135
136 TdcToGasGapAssociation onlToOff{};
137 onlToOff.gasGapID = offCh;
138 onlToOff.firstStrip = entry.firstStrip - RpcFlatCableTranslator::firstStrip;
139 onlToOff.flatCable = entry.flatCable;
140 m_onToOffline[onlCh].push_back(std::move(onlToOff));
141 std::ranges::sort(m_onToOffline[onlCh],
143 return a.firstStrip < b.firstStrip;
144 });
145
146 if (log.level()<= MSG::DEBUG) {
147 log<<MSG::DEBUG<<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__<<": Add new cabling channel "
148 <<offCh<<std::format("firstStrip: {:2d}", entry.firstStrip)<<" - "<<onlCh
149 <<std::format("flatCable: {:2d}", entry.flatCable->id())<<endmsg;
150 }
151
152 int sub = entry.subDetector;
153 int rod = entry.boardSector;
154
155 int32_t hardId = (sub << 16) | rod;
156
157 const bool robInitialized = std::find(m_listOfROB.begin(), m_listOfROB.end(), hardId) != m_listOfROB.end();
158 if (!robInitialized) {
159 m_listOfROB.push_back(hardId);
160 }
161
162 return true;
163 }
164 bool RpcCablingMap::finalize(MsgStream& log) {
165 if (m_offToOnline.empty()) {
166 log << MSG::ERROR <<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__
167 <<": finalize() -- No data has been loaded " << endmsg;
168 return false;
169 }
171 RpcCablingData RobOffId{};
172 RobOffId.strip = 1;
173 for (const auto& [card, chambers] : m_onToOffline) {
174 for (const TdcToGasGapAssociation& chamber : chambers) {
175 static_cast<RpcCablingOfflineID&>(RobOffId) = chamber.gasGapID;
176 Identifier chId{0};
177 if (!convert(RobOffId, chId, true)) {
178 log << MSG::ERROR<<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__
179 << ": Could not construct an offline identifier from " << chamber.gasGapID << endmsg;
180 return false;
181 }
182 IdentifierHash hash{0};
183 if (m_rpcIdHelper.get_module_hash(chId, hash)) {
184 log << MSG::ERROR <<"RpcCablingMap::"<<__func__<<"() - "<<__LINE__
185 << ": Failed to generate a hash for " << chamber.gasGapID << endmsg;
186 return false;
187 }
188 uint32_t hardId = (card.subDetector << 16) | card.boardSector;
189 m_chambROBs[hash] = hardId;
190 std::vector<IdentifierHash>& robHashes = m_ROBHashes[hardId];
191 if (std::ranges::find(robHashes, hash) == robHashes.end()){
192 robHashes.push_back(hash);
193 }
194 }
195 }
196 return true;
197 }
198 uint32_t RpcCablingMap::getROBId(const IdentifierHash& stationCode, MsgStream& log) const {
199 ChamberToROBMap::const_iterator it = m_chambROBs.find(stationCode);
200 if (it != m_chambROBs.end()) {
201 return it->second;
202 }
203 if (log.level() <= MSG::WARNING) {
204 log << MSG::WARNING << "Station code " << stationCode << " not found !! "<< endmsg;
205 }
206 return 0;
207 }
208
209 RpcCablingMap::ListOfROB RpcCablingMap::getROBId(const std::vector<IdentifierHash>& rpcHashVector, MsgStream& log) const {
210 ListOfROB toRet{};
211 toRet.reserve(rpcHashVector.size());
212 for (const IdentifierHash& hash : rpcHashVector) {
213 toRet.push_back(getROBId(hash, log));
214 }
215 return toRet;
216 }
217 const std::vector<IdentifierHash>& RpcCablingMap::getChamberHashVec(const uint32_t ROBI, MsgStream& log) const {
218 ROBToChamberMap::const_iterator itr = m_ROBHashes.find(ROBI);
219 if (itr != m_ROBHashes.end()){
220 return itr->second;
221 }
222 if (log.level() <= MSG::WARNING) {
223 log << MSG::WARNING << "ROB ID " << ROBI << " not found ! " << endmsg;
224 }
225 static const std::vector<IdentifierHash> dummy;
226 return dummy;
227 }
228 std::vector<IdentifierHash> RpcCablingMap::getChamberHashVec(const ListOfROB& ROBs, MsgStream& log) const {
229 std::unordered_set<IdentifierHash> hashSet{};
230 for (const uint32_t rob : ROBs) {
231 const std::vector<IdentifierHash>& hashFromROB = getChamberHashVec(rob, log);
232 hashSet.insert(hashFromROB.begin(), hashFromROB.end());
233 }
234 std::vector<IdentifierHash> hashVec{};
235 hashVec.insert(hashVec.end(), hashSet.begin(), hashSet.end());
236 return hashVec;
237 }
238
242 std::set<RpcCablingMap::FlatCablePtr> RpcCablingMap::flatCables() const {
243 std::set<FlatCablePtr> cables{};
244 for (const auto &[offId, gapToTdcs] : m_offToOnline) {
245 for (const GasGapToTdcAssociation& assoc : gapToTdcs){
246 cables.insert(assoc.flatCable);
247 }
248 }
249 return cables;
250 }
251}
#define endmsg
static Double_t a
This is a "hash" representation of an Identifier.
Interface for Helper service that creates muon Identifiers and can be used to print Identifiers.
OnlToOfflMap m_onToOffline
Map storing the connection from online -> offline channels.
OfflToOnlMap m_offToOnline
Map to cache the offline -> online conversions *‍/.
bool convert(const RpcCablingData &translationCache, Identifier &id, bool checkValid=true) const
Converts the translation cache back to an Identifier.
bool insertChannels(CoolDBEntry &&dbEntry, MsgStream &log)
Inserts a new dbEntry into the map.
const ListOfROB & getAllROBId() const
return the full list of ROD id
const RpcIdHelper & m_rpcIdHelper
Pointer to the RpcIdHelper.
bool getOfflineId(RpcCablingData &cabling_data, MsgStream &log) const
return the offline id given the online id
RpcCablingMap(const IMuonIdHelperSvc *idHelperSvc)
Constructor taking the IdHelperSvc.
const std::vector< IdentifierHash > & getChamberHashVec(const uint32_t ROBI, MsgStream &log) const
return a HashId list for a given ROD
std::vector< GasGapToTdcAssociation > AllTdcsPerGasGap
ROBToChamberMap m_ROBHashes
std::vector< uint32_t > ListOfROB
bool finalize(MsgStream &log)
Performs consistency checks for the cabling data (I.e.
ListOfROB m_listOfROB
full list of ROBs
bool getOnlineId(RpcCablingData &cabling_data, MsgStream &log) const
return the online id given the offline id
ChamberToROBMap m_chambROBs
std::set< FlatCablePtr > flatCables() const
Returns the list of all Rpc flat cable cards.
uint32_t getROBId(const IdentifierHash &stationCode, MsgStream &log) const
return the ROD id of a given chamber, given the hash id
static constexpr uint8_t firstStrip
Convention of the lowest strip number.
std::optional< uint8_t > tdcChannel(uint8_t strip, MsgStream &log) const
Returns the connected tdc channel connected to a strip.
static constexpr uint8_t readStrips
Number of channels covered by one chip.
std::optional< uint8_t > stripChannel(uint8_t tdcChannel, MsgStream &log) const
Returns the strip channel connected to a strip.
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
Helper struct that is parsed to the cabling map to translate between the offline & online Identifiers...
uint8_t channelId
Online board channel number.
uint8_t strip
Offline strip number.
Helper struct to ship all information from the Database.
Helper struct to associate all strips in an eta/phi gasGap to the corresponding Tdc.
FlatCablePtr flatCable
Pointer to the flat cable card.
RpcCablingOnlineID tdcID
Associated tdc chip.
uint8_t firstStrip
Lowest strip number covered by the cable.
Helper struct to associate all Tdcs to their corresponding strips in the gasGap.
FlatCablePtr flatCable
Pointer to the flat cable card.
RpcCablingOfflineID gasGapID
Associated tdc chip.
Struct to represent the offline identifier of the Rpc measurement decomposed into the particular fiel...
int8_t & phi
Eta index of the RPC station.
int8_t & eta
Station of the chamber (i.e, BIL,BIS,etc.)
int8_t & doubletZ
doublet Phi -> 1,2
int8_t & doubletPhi
doublet R -> 1,2
int8_t & doubletR
Station phi of the RPC station.
int8_t & gasGap
doublet Z -> 1,2
bool measuresPhi() const
: Does the channel measure phi
void setMeasPhiAndSide(bool measPhi, bool stripSide)
Sets the measuresPhi & stripSide fields of the cabling data object.
In an analogous way to the RpcCablingOfflineID, the RpcCablingOnlineID, holds all information needed ...