CMS 3D CMS Logo

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