CMS 3D CMS Logo

SiStripDetCabling.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 // Package: SiStripObjects
3 // Class : SiStripDetCabling
4 // Original Author: dkcira
5 // Created: Wed Mar 22 12:24:33 CET 2006
11 
12 #include <iostream>
13 
14 //---- default constructor / destructor
15 SiStripDetCabling::SiStripDetCabling(const TrackerTopology *const topology) : fedCabling_(nullptr), tTopo(topology) {}
17 
18 //---- construct detector view (DetCabling) out of readout view (FedCabling)
20  : fullcabling_(), connected_(), detected_(), undetected_(), fedCabling_(&fedcabling), tTopo(topology) {
21  // --- CONNECTED = have fedid and i2cAddr
22  // create fullcabling_, loop over vector of FedChannelConnection, either make
23  // new element of map, or add to appropriate vector of existing map element
24  // get feds list (vector) from fedcabling object - these are the active FEDs
25  auto feds = fedcabling.fedIds();
26  for (auto ifed = feds.begin(); ifed != feds.end(); ifed++) { // iterate over active feds, get all their
27  // FedChannelConnection-s
29  for (auto iconn = conns.begin(); iconn != conns.end(); iconn++) { // loop over FedChannelConnection objects
30  addDevices(*iconn,
31  fullcabling_); // leave separate method, in case you will need
32  // to add devices also after constructing
33  bool have_fed_id = iconn->fedId();
34  std::vector<int> vector_of_connected_apvs;
35  if (have_fed_id) { // these apvpairs are seen from the readout
36  // there can be at most 6 APVs on one DetId: 0,1,2,3,4,5
37  int which_apv_pair = iconn->apvPairNumber(); // APVPair (0,1) for 512 strips and (0,1,2)
38  // for 768 strips
39 
40  // patch needed to take into account invalid detids or apvPairs
41  if (iconn->detId() == 0 || iconn->detId() == sistrip::invalid32_ ||
42  iconn->apvPairNumber() == sistrip::invalid_ || iconn->nApvPairs() == sistrip::invalid_) {
43  continue;
44  }
45 
46  if (iconn->i2cAddr(0))
47  vector_of_connected_apvs.push_back(2 * which_apv_pair + 0); // first apv of the pair
48  if (iconn->i2cAddr(1))
49  vector_of_connected_apvs.push_back(2 * which_apv_pair + 1); // second apv of the pair
50  }
51  if (!vector_of_connected_apvs.empty()) { // add only is smth. there, obviously
52  std::map<uint32_t, std::vector<int>> map_of_connected_apvs;
53  map_of_connected_apvs.insert(std::make_pair(iconn->detId(), vector_of_connected_apvs));
54  addFromSpecificConnection(connected_, map_of_connected_apvs, &(connectionCount[0]));
55  }
56  }
57  }
58  // --- DETECTED = do not have fedid but have i2cAddr
59  SiStripFedCabling::ConnsConstIterRange detected_fed_connections = fedcabling.detectedDevices();
60  for (std::vector<FedChannelConnection>::const_iterator idtct = detected_fed_connections.begin();
61  idtct != detected_fed_connections.end();
62  ++idtct) {
63  addDevices(*idtct, fullcabling_);
64  bool have_fed_id = idtct->fedId();
65  std::vector<int> vector_of_detected_apvs;
66  if (!have_fed_id) {
67  int which_apv_pair = idtct->apvPairNumber(); // APVPair (0,1) for 512 strips and (0,1,2)
68  // for 768 strips
69  if (idtct->i2cAddr(0))
70  vector_of_detected_apvs.push_back(2 * which_apv_pair + 0); // first apv of the pair
71  if (idtct->i2cAddr(1))
72  vector_of_detected_apvs.push_back(2 * which_apv_pair + 1); // second apv of the pair
73  }
74  if (!vector_of_detected_apvs.empty()) { // add only is smth. there, obviously
75  std::map<uint32_t, std::vector<int>> map_of_detected_apvs;
76  map_of_detected_apvs.insert(std::make_pair(idtct->detId(), vector_of_detected_apvs));
77  addFromSpecificConnection(detected_, map_of_detected_apvs, &(connectionCount[1]));
78  }
79  }
80  // --- UNDETECTED = have neither fedid nor i2caddr
81  SiStripFedCabling::ConnsConstIterRange undetected_fed_connections = fedcabling.undetectedDevices();
82  for (std::vector<FedChannelConnection>::const_iterator iudtct = undetected_fed_connections.begin();
83  iudtct != undetected_fed_connections.end();
84  ++iudtct) {
85  addDevices(*iudtct, fullcabling_);
86  bool have_fed_id = iudtct->fedId();
87  std::vector<int> vector_of_undetected_apvs;
88  if (!have_fed_id) {
89  int which_apv_pair = iudtct->apvPairNumber(); // APVPair (0,1) for 512 strips and (0,1,2)
90  // for 768 strips
91  if (iudtct->i2cAddr(0))
92  vector_of_undetected_apvs.push_back(2 * which_apv_pair + 0); // first apv of the pair
93  if (iudtct->i2cAddr(1))
94  vector_of_undetected_apvs.push_back(2 * which_apv_pair + 1); // second apv of the pair
95  }
96  if (!vector_of_undetected_apvs.empty()) { // add only is smth. there, obviously
97  std::map<uint32_t, std::vector<int>> map_of_undetected_apvs;
98  map_of_undetected_apvs.insert(std::make_pair(iudtct->detId(), vector_of_undetected_apvs));
99  addFromSpecificConnection(undetected_, map_of_undetected_apvs, &(connectionCount[2]));
100  }
101  }
102 }
103 
104 //---- add to certain connections
106  std::map<uint32_t, std::vector<const FedChannelConnection *>> &conns) {
107  if (conn.detId() && conn.detId() != sistrip::invalid32_ && // check for valid detid
108  conn.apvPairNumber() != sistrip::invalid_) { // check for valid apv pair number
109  if (conn.fedId() == 0 || conn.fedId() == sistrip::invalid_) {
110  edm::LogInfo("") << " SiStripDetCabling::addDevices for connection "
111  "associated to detid "
112  << conn.detId() << " apvPairNumber " << conn.apvPairNumber() << "the fedId is " << conn.fedId();
113  return;
114  }
115  // check cached vector size is sufficient
116  // if not, resize
117  if (conn.apvPairNumber() >= conns[conn.detId()].size()) {
118  conns[conn.detId()].resize(conn.apvPairNumber() + 1);
119  }
120  // add latest connection object
121  conns[conn.detId()][conn.apvPairNumber()] = &conn;
122  }
123 }
124 
125 //----
127  const FedChannelConnection &conn) { // by default add to fullcabling_ connections - special case of
128  // above class
129  addDevices(conn, fullcabling_); // add to fullcabling_
130 }
131 
132 //---- get vector of connected modules. replaces getActiveDetectorRawIds method
133 //- avoid use of static
134 void SiStripDetCabling::addActiveDetectorsRawIds(std::vector<uint32_t> &vector_to_fill_with_detids) const {
135  for (std::map<uint32_t, std::vector<int>>::const_iterator conn_it = connected_.begin(); conn_it != connected_.end();
136  ++conn_it) {
137  vector_to_fill_with_detids.push_back(conn_it->first);
138  }
139  // no elements added to vector_to_fill_with_detids is empty connected_
140 }
141 
142 //---- get vector of all modules.
143 void SiStripDetCabling::addAllDetectorsRawIds(std::vector<uint32_t> &vector_to_fill_with_detids) const {
144  for (std::map<uint32_t, std::vector<int>>::const_iterator conn_it = connected_.begin(); conn_it != connected_.end();
145  ++conn_it) {
146  vector_to_fill_with_detids.push_back(conn_it->first);
147  }
148  for (std::map<uint32_t, std::vector<int>>::const_iterator conn_it = detected_.begin(); conn_it != detected_.end();
149  ++conn_it) {
150  vector_to_fill_with_detids.push_back(conn_it->first);
151  }
152  for (std::map<uint32_t, std::vector<int>>::const_iterator conn_it = undetected_.begin(); conn_it != undetected_.end();
153  ++conn_it) {
154  vector_to_fill_with_detids.push_back(conn_it->first);
155  }
156  // no elements added to vector_to_fill_with_detids is empty connected_,
157  // detected_.begin and undetected_.begin
158 }
159 
160 //----
161 const std::vector<const FedChannelConnection *> &SiStripDetCabling::getConnections(
162  uint32_t det_id) const { // return all connections corresponding to one det_id
163  std::map<uint32_t, std::vector<const FedChannelConnection *>>::const_iterator detcabl_it =
164  fullcabling_.find(det_id); // has to be const_iterator because this
165  // function cannot change data members
166  if (!(detcabl_it == fullcabling_.end())) { // found detid in fullcabling_
167  return (detcabl_it->second);
168  } else { // DKwarn : is there need for output message here telling det_id does
169  // not exist?
170  const static std::vector<const FedChannelConnection *> default_empty_fedchannelconnection;
171  return default_empty_fedchannelconnection;
172  }
173 }
174 
175 //----
176 const FedChannelConnection &SiStripDetCabling::getConnection(uint32_t det_id, unsigned short apv_pair) const {
177  const std::vector<const FedChannelConnection *> &fcconns = getConnections(det_id);
178  for (std::vector<const FedChannelConnection *>::const_iterator iconn = fcconns.begin(); iconn != fcconns.end();
179  ++iconn) {
180  if (((*iconn) != nullptr) && (((*iconn)->apvPairNumber()) == apv_pair)) { // check if apvPairNumber() of present
181  // FedChannelConnection is the same as requested one
182  return (**iconn); // if yes, return the FedChannelConnection object
183  }
184  }
185  // if did not match none of the above, return some default value - DKwarn :
186  // also output message?
187  const static FedChannelConnection default_empty_fedchannelconnection;
188  return default_empty_fedchannelconnection;
189 }
190 
191 //----
192 const unsigned int SiStripDetCabling::getDcuId(uint32_t det_id) const {
193  const std::vector<const FedChannelConnection *> &fcconns = getConnections(det_id);
194  if (!fcconns.empty()) {
195  // patch needed to take into account the possibility that the first
196  // component of fcconns is invalid
197  for (size_t i = 0; i < fcconns.size(); ++i)
198  if (fcconns.at(i) && fcconns.at(i)->detId() != sistrip::invalid32_ && fcconns.at(i)->detId() != 0)
199  return (fcconns.at(i))->dcuId(); // get dcuId of first element - when
200  // you build check this consistency
201  }
202  // default if none of the above is fulfilled
203  unsigned int default_zero_value = 0;
204  return default_zero_value;
205 }
206 
207 //---- one can find the nr of apvs from fullcabling_ ->
208 // std::vector<FedChannelConnection> -> size * 2
209 const uint16_t SiStripDetCabling::nApvPairs(uint32_t det_id) const {
210  const std::vector<const FedChannelConnection *> &fcconns = getConnections(det_id);
211  if (!fcconns.empty()) {
212  // patch needed to take into account the possibility that the first
213  // component of fcconns is invalid
214  for (size_t i = 0; i < fcconns.size(); ++i) {
215  if ((fcconns.at(i) != nullptr) && (fcconns.at(i)->nApvPairs() != sistrip::invalid_)) {
216  return fcconns.at(i)->nApvPairs(); // nr of apvpairs for associated module
217  }
218  }
219  }
220  // else {
221  // return 0;
222  // }
223  return 0;
224 }
225 
226 //---- map of detector to list of APVs for APVs seen from FECs and FEDs
227 void SiStripDetCabling::addConnected(std::map<uint32_t, std::vector<int>> &map_to_add_to) const {
228  addFromSpecificConnection(map_to_add_to, connected_);
229 }
230 
231 //--- map of detector to list of APVs for APVs seen neither from FECS or FEDs
232 void SiStripDetCabling::addDetected(std::map<uint32_t, std::vector<int>> &map_to_add_to) const {
233  addFromSpecificConnection(map_to_add_to, detected_);
234 }
235 
236 //---- map of detector to list of APVs for APVs seen neither from FECS or FEDs
237 void SiStripDetCabling::addUnDetected(std::map<uint32_t, std::vector<int>> &map_to_add_to) const {
238  addFromSpecificConnection(map_to_add_to, undetected_);
239 }
240 
241 //---- map of detector to list of APVs that are not connected - combination of
242 // addDetected and addUnDetected
243 void SiStripDetCabling::addNotConnectedAPVs(std::map<uint32_t, std::vector<int>> &map_to_add_to) const {
244  addFromSpecificConnection(map_to_add_to, detected_);
245  addFromSpecificConnection(map_to_add_to, undetected_);
246 }
247 
248 //----
249 void SiStripDetCabling::addFromSpecificConnection(std::map<uint32_t, std::vector<int>> &map_to_add_to,
250  const std::map<uint32_t, std::vector<int>> &specific_connection,
251  std::map<int16_t, uint32_t> *connectionsToFill) const {
252  for (std::map<uint32_t, std::vector<int>>::const_iterator conn_it = specific_connection.begin();
253  conn_it != specific_connection.end();
254  ++conn_it) {
255  uint32_t new_detid = conn_it->first;
256  std::vector<int> new_apv_vector = conn_it->second;
257  std::map<uint32_t, std::vector<int>>::iterator it = map_to_add_to.find(new_detid);
258  if (it == map_to_add_to.end()) { // detid does not exist in map, add new entry
259  std::sort(new_apv_vector.begin(),
260  new_apv_vector.end()); // not very efficient sort, time consuming?
261  map_to_add_to.insert(std::make_pair(new_detid, new_apv_vector));
262 
263  // Count the number of detIds per layer. Doing it in this "if" we count
264  // each detId only once (otherwise it would be counted once per APV pair)
265  // ATTENTION: consider changing the loop content to avoid this
266  // This is the expected full number of modules (double sided are counted
267  // twice because the two sides have different detId). TIB1 : 336, TIB2 :
268  // 432, TIB3 : 540, TIB4 : 648 TID : each disk has 48+48+40
269  // (ring1+ring2+ring3) TOB1 : 504, TOB2 : 576, TOB3 : 648, TOB4 : 720,
270  // TOB5 : 792, TOB6 : 888 TEC1 : Total number of modules = 6400.
271  if (connectionsToFill) {
272  (*connectionsToFill)[layerSearch(new_detid)]++;
273  }
274 
275  } else { // detid exists already, add to its vector - if its not there
276  // already . . .
277  std::vector<int> existing_apv_vector = it->second;
278  for (std::vector<int>::iterator inew = new_apv_vector.begin(); inew != new_apv_vector.end(); ++inew) {
279  bool there_already = false;
280  for (std::vector<int>::iterator iold = existing_apv_vector.begin(); iold != existing_apv_vector.end(); ++iold) {
281  if (*iold == *inew) {
282  there_already = true;
283  break; // leave the loop
284  }
285  }
286  if (!there_already) {
287  existing_apv_vector.push_back(*inew);
288  std::sort(existing_apv_vector.begin(),
289  existing_apv_vector.end()); // not very efficient sort, time consuming?
290  } else {
291  // edm::LogWarning("Logical") << "apv "<<*inew<<" already exists in
292  // the detector module "<<new_detid;
293  }
294  }
295  }
296  }
297 }
298 
299 int16_t SiStripDetCabling::layerSearch(const uint32_t detId) const {
300  const DetId detectorId = DetId(detId);
301  const int subdet = detectorId.subdetId();
302  if (subdet == StripSubdetector::TIB) {
303  return tTopo->layer(detId);
304  } else if (subdet == StripSubdetector::TID) {
305  // side: 1 = negative, 2 = positive
306  return 10 + (tTopo->side(detId) - 1) * 3 + tTopo->layer(detId);
307  } else if (subdet == StripSubdetector::TOB) {
308  return 100 + tTopo->layer(detId);
309  } else if (subdet == StripSubdetector::TEC) {
310  // side: 1 = negative, 2 = positive
311  return 1000 + (tTopo->side(detId) - 1) * 9 + tTopo->layer(detId);
312  }
313  return 0;
314 }
315 
318 uint32_t SiStripDetCabling::detNumber(const std::string &subDet, const uint16_t layer, const int connectionType) const {
319  uint16_t subDetLayer = layer;
320  // TIB = 1, TID = 2, TOB = 3, TEC = 4
321  if (subDet == "TID-")
322  subDetLayer += 10;
323  else if (subDet == "TID+")
324  subDetLayer += 10 + 3;
325  else if (subDet == "TOB")
326  subDetLayer += 100;
327  else if (subDet == "TEC-")
328  subDetLayer += 1000;
329  else if (subDet == "TEC+")
330  subDetLayer += 1000 + 9;
331  else if (subDet != "TIB") {
332  LogDebug("SiStripDetCabling") << "Error: Wrong subDet. Please use one of TIB, TID, TOB, TEC." << std::endl;
333  return 0;
334  }
335  auto found = connectionCount[connectionType].find(subDetLayer);
336  if (found != connectionCount[connectionType].end()) {
337  return found->second;
338  }
339  return 0;
340 }
341 
342 //---- map of all connected, detected, undetected to contiguous Ids - map reset
343 // first!
344 void SiStripDetCabling::getAllDetectorsContiguousIds(std::map<uint32_t, unsigned int> &allToContiguous) const {
345  allToContiguous.clear(); // reset map
346  std::vector<uint32_t> all;
348  std::sort(all.begin(), all.end()); // get all detids and sort them
349  unsigned int contiguousIndex = 0;
350  for (std::vector<uint32_t>::const_iterator idet = all.begin(); idet != all.end(); ++idet) {
351  ++contiguousIndex;
352  allToContiguous.insert(std::make_pair(*idet, contiguousIndex));
353  }
354 }
355 
356 //---- map of all connected - map reset first!
357 void SiStripDetCabling::getActiveDetectorsContiguousIds(std::map<uint32_t, unsigned int> &connectedToContiguous) const {
358  connectedToContiguous.clear(); // reset map
359  std::vector<uint32_t> connected;
361  std::sort(connected.begin(),
362  connected.end()); // get connected detids and sort them (not
363  // strictly necessary)
364  std::map<uint32_t, unsigned int> allToContiguous;
365  getAllDetectorsContiguousIds(allToContiguous); // create map of all indices
366  for (std::vector<uint32_t>::const_iterator idet = connected.begin(); idet != connected.end();
367  ++idet) { // select only the indices for active detectors
368  std::map<uint32_t, unsigned int>::iterator deco = allToContiguous.find(*idet);
369  if (deco != allToContiguous.end()) {
370  connectedToContiguous.insert(*deco);
371  }
372  }
373 }
374 
375 bool SiStripDetCabling::IsConnected(const uint32_t &det_id) const { return IsInMap(det_id, connected_); }
376 
377 bool SiStripDetCabling::IsDetected(const uint32_t &det_id) const { return IsInMap(det_id, detected_); }
378 bool SiStripDetCabling::IsUndetected(const uint32_t &det_id) const { return IsInMap(det_id, undetected_); }
379 bool SiStripDetCabling::IsInMap(const uint32_t &det_id, const std::map<uint32_t, std::vector<int>> &map) const {
380  std::map<uint32_t, std::vector<int>>::const_iterator it = map.find(det_id);
381  return (it != map.end());
382 }
383 
384 // -----------------------------------------------------------------------------
386 void SiStripDetCabling::print(std::stringstream &ss) const {
387  uint32_t valid = 0;
388  uint32_t total = 0;
389  typedef std::vector<const FedChannelConnection *> Conns;
390  typedef std::map<uint32_t, Conns> ConnsMap;
391  ConnsMap::const_iterator ii = fullcabling_.begin();
392  ConnsMap::const_iterator jj = fullcabling_.end();
393  ss << "[SiStripDetCabling::" << __func__ << "]"
394  << " Printing DET cabling for " << fullcabling_.size() << " modules " << std::endl;
395  for (; ii != jj; ++ii) {
396  ss << "Printing " << ii->second.size() << " connections for DetId: " << ii->first << std::endl;
397  Conns::const_iterator iii = ii->second.begin();
398  Conns::const_iterator jjj = ii->second.end();
399  for (; iii != jjj; ++iii) {
400  if ((*iii)->isConnected()) {
401  valid++;
402  }
403  total++;
404  ss << **iii << std::endl;
405  }
406  }
407  ss << "Number of connected: " << valid << std::endl << "Number of connections: " << total << std::endl;
408 }
409 
410 void SiStripDetCabling::printSummary(std::stringstream &ss, const TrackerTopology *trackerTopo) const {
411  for (int connectionType = 0; connectionType < 3; ++connectionType) {
412  if (connectionType == 0)
413  ss << "Connected modules:" << std::endl;
414  else if (connectionType == 1)
415  ss << "Detected modules:" << std::endl;
416  else
417  ss << "Undetected modules:" << std::endl;
418  ss << "SubDet and layer\t modules" << std::endl;
419  std::map<int16_t, uint32_t>::const_iterator iter = connectionCount[connectionType].begin();
420  for (; iter != connectionCount[connectionType].end(); ++iter) {
421  uint32_t subDetLayer = iter->first;
422  uint32_t modules = iter->second;
423  if (int(subDetLayer / 10) == 0) {
424  ss << "TIB \t layer " << subDetLayer << " \t" << modules << std::endl;
425  } else if (int(subDetLayer / 100) == 0) {
426  int layer = subDetLayer % 10;
427  if (layer <= 3)
428  ss << "TID- \t disk " << layer << "\t" << modules << std::endl;
429  else
430  ss << "TID+ \t disk " << layer - 3 << "\t" << modules << std::endl;
431  } else if (int(subDetLayer / 1000) == 0) {
432  int layer = subDetLayer % 100;
433  ss << "TOB \t layer " << layer << " \t" << modules << std::endl;
434  } else {
435  int layer = subDetLayer % 100;
436  if (layer <= 9)
437  ss << "TEC- \t disk " << layer << " \t" << modules << std::endl;
438  else
439  ss << "TEC+ \t disk " << layer - 9 << " \t" << modules << std::endl;
440  }
441  }
442  }
443 }
444 
445 void SiStripDetCabling::printDebug(std::stringstream &ss, const TrackerTopology * /*trackerTopo*/) const { print(ss); }
void addDetected(std::map< uint32_t, std::vector< int >> &) const
static constexpr auto TEC
void printDebug(std::stringstream &ss, const TrackerTopology *trackerTopo) const
const unsigned int getDcuId(uint32_t det_id) const
void addConnected(std::map< uint32_t, std::vector< int >> &) const
def all(container)
workaround iterator generators for ROOT classes
Definition: cmstools.py:25
void printSummary(std::stringstream &ss, const TrackerTopology *trackerTopo) const
const std::vector< const FedChannelConnection * > & getConnections(uint32_t det_id) const
std::map< uint32_t, std::vector< const FedChannelConnection * > > fullcabling_
static const uint32_t invalid32_
Definition: Constants.h:15
std::map< uint32_t, std::vector< int > > const & connected() const
bool IsUndetected(const uint32_t &det_id) const
void addNotConnectedAPVs(std::map< uint32_t, std::vector< int >> &) const
unsigned int side(const DetId &id) const
bool IsConnected(const uint32_t &det_id) const
int16_t layerSearch(const uint32_t detId) const
unsigned int layer(const DetId &id) const
const FedChannelConnection & getConnection(uint32_t det_id, unsigned short apv_pair) const
boost::iterator_range< ConnsConstIter > ConnsConstIterRange
bool IsInMap(const uint32_t &det_id, const std::map< uint32_t, std::vector< int >> &) const
Class containning control, module, detector and connection information, at the level of a FED channel...
void print(std::stringstream &) const
void getAllDetectorsContiguousIds(std::map< uint32_t, unsigned int > &) const
void addDevices(const FedChannelConnection &, std::map< uint32_t, std::vector< const FedChannelConnection *>> &)
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
static constexpr auto TOB
ii
Definition: cuy.py:589
std::map< uint32_t, std::vector< int > > connected_
Log< level::Info, false > LogInfo
Definition: DetId.h:17
virtual ~SiStripDetCabling()
bool IsDetected(const uint32_t &det_id) const
static constexpr auto TIB
void getActiveDetectorsContiguousIds(std::map< uint32_t, unsigned int > &) const
ConnsConstIterRange undetectedDevices() const
static const uint16_t invalid_
Definition: Constants.h:16
std::map< uint32_t, std::vector< int > > detected_
void addUnDetected(std::map< uint32_t, std::vector< int >> &) const
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
std::map< uint32_t, std::vector< int > > undetected_
void addFromSpecificConnection(std::map< uint32_t, std::vector< int >> &, const std::map< uint32_t, std::vector< int >> &, std::map< int16_t, uint32_t > *connectionsToFill=nullptr) const
void addAllDetectorsRawIds(std::vector< uint32_t > &vector_to_fill_with_detids) const
conn
Definition: getInfo.py:9
const TrackerTopology *const tTopo
std::map< int16_t, uint32_t > connectionCount[3]
FedsConstIterRange fedIds() const
static constexpr auto TID
SiStripDetCabling(const TrackerTopology *const topology)
const uint16_t nApvPairs(uint32_t det_id) const
ConnsConstIterRange detectedDevices() const
ConnsConstIterRange fedConnections(uint16_t fed_id) const
uint32_t detNumber(const std::string &subDet, const uint16_t layer, const int connectionType) const
void addActiveDetectorsRawIds(std::vector< uint32_t > &) const
#define LogDebug(id)