ATLAS Offline Software
Loading...
Searching...
No Matches
PixelCablingCondData.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include "Identifier/Identifier.h"
7#include <fstream>
8#include <iostream>
9#include <sstream>
10#include <utility>
11
12namespace{
13 constexpr Identifier invalidId{};
14}
15
16
29
31
32void PixelCablingCondData::add_entry_onoff(const uint64_t onlineId, const Identifier offlineId) {
33 m_idMap_onoff.insert(std::make_pair(onlineId, offlineId)); // add online identifier -> offline identifier pair in m_idMap_onoff
34}
35
36void PixelCablingCondData::add_entry_offon(const Identifier offlineId, const uint64_t onlineId) {
37 m_idMap_offon.insert(std::make_pair(offlineId, onlineId)); // add offline identifier -> online identifier pair in m_idMap_offon
38}
39
40void PixelCablingCondData::add_entry_offrob(const Identifier offlineId, const uint32_t robid) {
41 m_idMap_offrob.insert(std::make_pair(offlineId, robid)); // add offline identifier -> offline ROBId pair in m_idMap_offrob
42}
43
44void PixelCablingCondData::add_entry_rodrob(int rodid, int robid) {
45 auto [iter, newElementAdded] = m_idMap_rodrob.insert(std::make_pair(rodid, robid)); // add RODId identifier -> offline ROBId pair in m_idMap_rodrob
46 if ( newElementAdded )
47 m_allRods.push_back(rodid);
48}
49
50void PixelCablingCondData::add_entry_robrod(int robid, int rodid) {
51 auto [iter, newElementAdded] = m_idMap_robrod.insert(std::make_pair(robid, rodid));
52 if ( newElementAdded )
53 m_allRobs.push_back(robid);
54}
55
56void PixelCablingCondData::add_entry_offlineList(const uint32_t robid, const Identifier offlineId) {
57 m_offlineListVect[robid].push_back(offlineId); // add ROBid -> offline identifier pair in m_offlineListVect
58}
59
60void PixelCablingCondData::add_entry_DCSoffline(const std::string& DCSname, const Identifier offlineId) {
61 m_idMapDCSoff.insert(std::make_pair(DCSname, offlineId));
62}
63
64void PixelCablingCondData::set_readout_map(std::map<uint32_t, bool> rodReadoutMap) {
65 m_rodReadoutMap = std::move(rodReadoutMap);
66}
67
68Identifier PixelCablingCondData::find_entry_onoff(const uint64_t onlineId) const {
69 // Search m_idMap_onoff for the onlineId
70 uint64_t searchId = onlineId;
71 Identifier offlineId(0);
72 std::unordered_map<uint64_t, Identifier>::const_iterator iter(m_idMap_onoff.find(searchId));
73
74 // OnlineId has been found - get the offline identifier
75 if (iter != m_idMap_onoff.end()) offlineId = (*iter).second;
76
77 // Is onlineId not found? Then check if this is a b-layer module; if it is read out at
78 // 80 Mbit, search again with link = 0, since FMT has enough info to identify the module
79 else {
80 uint32_t rodid = (onlineId & 0xFFFFFF); // last 24 bit are rodid
81
82 if ((rodid & 0x130000) >> 16 == 0x13) {
83 std::map<uint32_t, bool>::const_iterator it = m_rodReadoutMap.find(rodid);
84
85 if (it != m_rodReadoutMap.end()) {
86 if ((*it).second) { // true = is 80 MBit
87
88 // Search again
89 searchId = onlineId & (0xF0FFFFFF);
90 iter = m_idMap_onoff.find(searchId);
91
92 // Get identifier
93 if (iter != m_idMap_onoff.end()) offlineId = (*iter).second;
94 }
95 }
96 }
97 // If onlineId is still not found, the empty identifier is returned.
98 }
99 return offlineId;
100}
101
102uint64_t PixelCablingCondData::find_entry_offon(const Identifier offlineId) const {
103 uint64_t onlineId; // declare online identifier
104 std::unordered_map<Identifier, uint64_t, idHasher>::const_iterator iter(m_idMap_offon.find(offlineId)); // find offline identifier in m_idMap_offon map
105 if (iter == m_idMap_offon.end()) { // if offline identifier not found in m_idMap_offon map -> ERROR
106 onlineId = 0; // fill online identifier with empty identifier
107 return onlineId; // return empty online identifier
108 }
109 onlineId = (*iter).second; // fill online identifier with found online identifier
110 return onlineId; // return found online identifier
111}
112
113uint32_t
115 uint32_t robid{};
116 if (offlineId == invalidId) return robid;
117 const auto iter = m_idMap_offrob.find(offlineId);
118 if (iter == m_idMap_offrob.end()) {
119 return robid;
120 }
121 robid = (*iter).second; // fill ROBId with found ROBId
122 return robid; // return found ROBId
123}
124
125int PixelCablingCondData::find_entry_rodrob(const int rodid) const {
126 std::unordered_map<int, int>::const_iterator iter(m_idMap_rodrob.find(rodid));
127 if (iter == m_idMap_rodrob.end()) {
128 return 0;
129 }
130 int robid = iter->second;
131 return robid;
132}
133
134int PixelCablingCondData::find_entry_robrod(const int robid) const {
135 std::unordered_map<int,int>::const_iterator iter(m_idMap_robrod.find(robid));
136 if (iter == m_idMap_robrod.end()) return 0;
137 return iter->second;
138}
139
140std::deque<Identifier> PixelCablingCondData::find_entry_offlineList(uint32_t robid) const {
141 std::deque<Identifier> offlineId; // declare collection identifier list for the ROBId
142 std::deque<Identifier>::const_iterator it1 = m_offlineListVect.at(robid).begin(); // first offline identifier for the ROBId
143 std::deque<Identifier>::const_iterator it2 = m_offlineListVect.at(robid).end(); // last offline identifier for the ROBId
144 for (; it1 != it2; ++it1) { // loop thrue offline identifiers
145 offlineId.push_back(*it1); // fill offline identifier into offline identifier list
146 }
147 return offlineId; // return the offline identifier list for the ROBId
148}
149
151 std::unordered_map<std::string, Identifier>::const_iterator iter(m_idMapDCSoff.find(DCSname));
152 if (iter == m_idMapDCSoff.end()) {
153 return Identifier(0);
154 }
155 return iter->second;
156}
157
158std::string PixelCablingCondData::find_entry_offlineDCS(const Identifier offlineId) const {
159 std::unordered_map<std::string, Identifier>::const_iterator iter = m_idMapDCSoff.begin();
160 for (; iter != m_idMapDCSoff.end(); ++iter) {
161 if (iter->second == offlineId)
162 return iter->first;
163 }
164 return ""; // not found
165}
166
167const std::vector<uint32_t>& PixelCablingCondData::get_allRods() const {
168 return m_allRods;
169}
170
171const std::vector<uint32_t>& PixelCablingCondData::get_allRobs() const {
172 return m_allRobs;
173}
174
176// getOnlineIdFromRobId - returns the onlineId from the robId and the link number
177// onlineId convention: onlineId is constructed as 0xAABBDDMMMM, where MMMM = robId,
178// DD = subdetector id, AABB = link number.
179// For pixels, there is only one link number per onlineId, so AA = 00.
181uint64_t PixelCablingCondData::getOnlineIdFromRobId(uint32_t robid, uint32_t link) const {
182 uint32_t subDetId = (robid & 0xFFFFFF) >> 16;
183
184 // Pixels:
185 if (subDetId < 0x14) return (robid & 0xFFFFFF) | (link << 24);
186
187 // IBL / DBM:
188 else if (subDetId == 0x14 || subDetId == 0x15) {
189
190 // Need to search the on-off map for the appropriate onlineId
191 uint32_t linknum_temp;
192 std::unordered_map<uint64_t, Identifier>::const_iterator itr = m_idMap_onoff.begin();
193 for (; itr != m_idMap_onoff.end(); ++itr) {
194 if ((itr->first & 0xFFFFFF) == robid) {
195 linknum_temp = (itr->first >> 24);
196 // Check for linknum in both first and third nibble
197 if ((linknum_temp & 0xF) == link || ((linknum_temp >> 8) & 0xF) == link) return itr->first;
198 }
199 }
200 }
201 return 0;
202}
203
204const std::unordered_map<uint64_t, Identifier>& PixelCablingCondData::get_idMap_onoff() const {
205 return m_idMap_onoff;
206}
207
208const std::unordered_map<Identifier, uint64_t, idHasher>& PixelCablingCondData::get_idMap_offon() const {
209 return m_idMap_offon;
210}
211
212const std::unordered_map<Identifier, uint32_t, idHasher>& PixelCablingCondData::get_idMap_offrob() const {
213 return m_idMap_offrob;
214}
215
216const std::unordered_map<int,int>& PixelCablingCondData::get_idMap_rodrob() const {
217 return m_idMap_rodrob;
218}
219
220const std::unordered_map<int,int>& PixelCablingCondData::get_idMap_robrod() const {
221 return m_idMap_robrod;
222}
223
224const std::unordered_map<std::string, Identifier>& PixelCablingCondData::get_idMapDCSoff() const {
225 return m_idMapDCSoff;
226}
227
229 m_idMap_onoff.clear();
230 m_idMap_offon.clear();
231 m_idMap_offrob.clear();
232 m_idMap_rodrob.clear();
233 m_idMap_robrod.clear();
234 m_offlineListVect.clear();
235 m_idMapDCSoff.clear();
236 m_rodReadoutMap.clear();
237 m_allRods.clear();
238 m_allRobs.clear();
239}
240
static const ITkStripOnlineId invalidId
const std::unordered_map< Identifier, uint32_t, idHasher > & get_idMap_offrob() const
const std::vector< uint32_t > & get_allRobs() const
void add_entry_onoff(const uint64_t, const Identifier)
std::map< uint32_t, std::deque< Identifier > > m_offlineListVect
ROBId -> offline identifier list.
std::string find_entry_offlineDCS(const Identifier offlineId) const
std::unordered_map< Identifier, uint32_t, idHasher > m_idMap_offrob
offline identifier -> ROBId map
void add_entry_DCSoffline(const std::string &, const Identifier)
void add_entry_offlineList(const uint32_t, const Identifier)
std::map< uint32_t, bool > m_rodReadoutMap
Readout speed for each ROD. false=40MBit, true=80MBit.
std::deque< Identifier > find_entry_offlineList(uint32_t robid) const
std::vector< uint32_t > m_allRods
void add_entry_offon(const Identifier, const uint64_t)
const std::unordered_map< int, int > & get_idMap_rodrob() const
void add_entry_rodrob(int rodid, int robid)
std::unordered_map< std::string, Identifier > m_idMapDCSoff
DCS name -> offline identifier.
void add_entry_robrod(int robid, int rodid)
Identifier find_entry_onoff(const uint64_t) const
const std::unordered_map< Identifier, uint64_t, idHasher > & get_idMap_offon() const
const std::unordered_map< int, int > & get_idMap_robrod() const
int find_entry_rodrob(const int rodid) const
uint64_t find_entry_offon(const Identifier) const
const std::vector< uint32_t > & get_allRods() const
std::vector< uint32_t > m_allRobs
const std::unordered_map< std::string, Identifier > & get_idMapDCSoff() const
std::unordered_map< Identifier, uint64_t, idHasher > m_idMap_offon
online identifier -> offline identifier map
std::unordered_map< uint64_t, Identifier > m_idMap_onoff
offline identifier -> online identifier map
Identifier find_entry_DCSoffline(const std::string &DCSname) const
std::unordered_map< int, int > m_idMap_robrod
ROBId -> RODId map (reverse of m_idMap_rodrob)
uint32_t find_entry_offrob(Identifier offlineId) const
int find_entry_robrod(const int robid) const
void set_readout_map(std::map< uint32_t, bool > rodReadoutMap)
std::unordered_map< int, int > m_idMap_rodrob
RODId -> ROBId map.
const std::unordered_map< uint64_t, Identifier > & get_idMap_onoff() const
virtual ~PixelCablingCondData()
void add_entry_offrob(const Identifier, const uint32_t)
uint64_t getOnlineIdFromRobId(uint32_t robid, uint32_t link) const