CMS 3D CMS Logo

SiStripCondObjBuilderFromDb.cc
Go to the documentation of this file.
1 
19 
20 #include <cstdlib>
21 #include <iostream>
22 #include <sstream>
23 #include <iomanip>
24 #include "Fed9UUtils.hh"
25 
26 using namespace std;
27 using namespace sistrip;
28 
29 
30 // -----------------------------------------------------------------------------
33  const edm::ActivityRegistry&):
34  m_skippedDevices(pset.getUntrackedParameter<edm::VParameterSet>("SkippedDevices", edm::VParameterSet())),
35  m_tickmarkThreshold(static_cast<float>(pset.getUntrackedParameter<double>("TickmarkThreshold",50.))),
36  m_gaincalibrationfactor(static_cast<float>(pset.getUntrackedParameter<double>("GainNormalizationFactor",640.))),
37  m_defaultpedestalvalue(static_cast<float>(pset.getUntrackedParameter<double>("DefaultPedestal",0.))),
38  m_defaultnoisevalue(static_cast<float>(pset.getUntrackedParameter<double>("DefaultNoise",0.))),
39  m_defaultthresholdhighvalue(static_cast<float>(pset.getUntrackedParameter<double>("DefaultThresholdHigh",0.))),
40  m_defaultthresholdlowvalue(static_cast<float>(pset.getUntrackedParameter<double>("DefaultThresholdLow",0.))),
41  m_defaultapvmodevalue(static_cast<uint16_t>(pset.getUntrackedParameter<uint32_t>("DefaultAPVMode",37))),
42  m_defaultapvlatencyvalue(static_cast<uint16_t>(pset.getUntrackedParameter<uint32_t>("DefaultAPVLatency",142))),
43  m_defaulttickheightvalue(static_cast<float>(pset.getUntrackedParameter<double>("DefaultTickHeight",690.))),
44  m_useanalysis(static_cast<bool>(pset.getUntrackedParameter<bool>("UseAnalysis",false))),
45  m_usefed(static_cast<bool>(pset.getUntrackedParameter<bool>("UseFED",false))),
46  m_usefec(static_cast<bool>(pset.getUntrackedParameter<bool>("UseFEC",false))),
47  m_debug(static_cast<bool>(pset.getUntrackedParameter<bool>("DebugMode",false))),
48  tTopo(buildTrackerTopology())
49 {
51  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
52  << " Constructing object...";
53  for (const auto &pset : m_skippedDevices){
54  skippedDevices.emplace_back(pset);
55  }
56 }
57 
58 // -----------------------------------------------------------------------------
61 {
63  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
64  << " Constructing object...";
65 }
66 
67 // -----------------------------------------------------------------------------
71  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
72  << " Destructing object...";
73  delete tTopo;
74 }
75 
76 // -----------------------------------------------------------------------------
77 
80  if (!(dbParams_==dbParams())){
82  buildCondObj();
83  }
84 }
85 // -----------------------------------------------------------------------------
93 
94  pxbVals_.layerStartBit_ = 16;
95  pxbVals_.ladderStartBit_ = 8;
96  pxbVals_.moduleStartBit_ = 2;
97  pxbVals_.layerMask_ = 0xF;
98  pxbVals_.ladderMask_ = 0xFF;
99  pxbVals_.moduleMask_ = 0x3F;
100  pxfVals_.sideStartBit_ = 23;
101  pxfVals_.diskStartBit_ = 16;
102  pxfVals_.bladeStartBit_ = 10;
103  pxfVals_.panelStartBit_ = 8;
104  pxfVals_.moduleStartBit_ = 2;
105  pxfVals_.sideMask_ = 0x3;
106  pxfVals_.diskMask_ = 0xF;
107  pxfVals_.bladeMask_ = 0x3F;
108  pxfVals_.panelMask_ = 0x3;
109  pxfVals_.moduleMask_ = 0x3F;
110  tecVals_.sideStartBit_ = 18;
111  tecVals_.wheelStartBit_ = 14;
112  tecVals_.petal_fw_bwStartBit_ = 12;
113  tecVals_.petalStartBit_ = 8;
114  tecVals_.ringStartBit_ = 5;
115  tecVals_.moduleStartBit_ = 2;
116  tecVals_.sterStartBit_ = 0;
117  tecVals_.sideMask_ = 0x3;
118  tecVals_.wheelMask_ = 0xF;
119  tecVals_.petal_fw_bwMask_ = 0x3;
120  tecVals_.petalMask_ = 0xF;
121  tecVals_.ringMask_ = 0x7;
122  tecVals_.moduleMask_ = 0x7;
123  tecVals_.sterMask_ = 0x3;
124  tibVals_.layerStartBit_ = 14;
125  tibVals_.str_fw_bwStartBit_ = 12;
126  tibVals_.str_int_extStartBit_ = 10;
127  tibVals_.strStartBit_ = 4;
128  tibVals_.moduleStartBit_ = 2;
129  tibVals_.sterStartBit_ = 0;
130  tibVals_.layerMask_ = 0x7;
131  tibVals_.str_fw_bwMask_ = 0x3;
132  tibVals_.str_int_extMask_ = 0x3;
133  tibVals_.strMask_ = 0x3F;
134  tibVals_.moduleMask_ = 0x3;
135  tibVals_.sterMask_ = 0x3;
136  tidVals_.sideStartBit_ = 13;
137  tidVals_.wheelStartBit_ = 11;
138  tidVals_.ringStartBit_ = 9;
139  tidVals_.module_fw_bwStartBit_ = 7;
140  tidVals_.moduleStartBit_ = 2;
141  tidVals_.sterStartBit_ = 0;
142  tidVals_.sideMask_ = 0x3;
143  tidVals_.wheelMask_ = 0x3;
144  tidVals_.ringMask_ = 0x3;
145  tidVals_.module_fw_bwMask_ = 0x3;
146  tidVals_.moduleMask_ = 0x1F;
147  tidVals_.sterMask_ = 0x3;
148  tobVals_.layerStartBit_ = 14;
149  tobVals_.rod_fw_bwStartBit_ = 12;
150  tobVals_.rodStartBit_ = 5;
151  tobVals_.moduleStartBit_ = 2;
152  tobVals_.sterStartBit_ = 0;
153  tobVals_.layerMask_ = 0x7;
154  tobVals_.rod_fw_bwMask_ = 0x3;
155  tobVals_.rodMask_ = 0x7F;
156  tobVals_.moduleMask_ = 0x7;
157  tobVals_.sterMask_ = 0x3;
158 
159  return new TrackerTopology(pxbVals_, pxfVals_, tecVals_, tibVals_, tidVals_, tobVals_);
160 }
161 // -----------------------------------------------------------------------------
164  // DEPRECATED. Superseded by SiStripCondObjBuilderFromDb::getConfigString(const std::type_info& typeInfo).
165 
166  //get current config DB parameter
167 
169 
170  SiStripDbParams::SiStripPartitions::const_iterator ipart = partitionsRange.begin();
171  SiStripDbParams::SiStripPartitions::const_iterator ipartEnd = partitionsRange.end();
172  for ( ; ipart != ipartEnd; ++ipart ) {
173  SiStripPartition partition=ipart->second;
174  output << "@ "
175  << " Partition " << partition.partitionName() ;
176  if (label!="Cabling" && label !="ApvLatency")
177  output << " FedVer " << partition.fedVersion().first << "." << partition.fedVersion().second;
178  if(label=="Cabling")
179  output << " CabVer " << partition.cabVersion().first << "." << partition.cabVersion().second
180  << " MaskVer " << partition.maskVersion().first << "." << partition.maskVersion().second;
181  if(label=="ApvTiming")
182  output<< " ApvTimingVer " << partition.apvTimingVersion().first << "." << partition.apvTimingVersion().second;
183  if(label=="ApvLatency")
184  output<< " FecVersion " << partition.fecVersion().first << "." << partition.fecVersion().second;
185  }
186 
187  if (!strcmp(output.str().c_str(),input.str().c_str()))
188  return false;
189 
190  return true;
191 }
192 // -----------------------------------------------------------------------------
195  // create config line used by fast O2O
196 
197  std::stringstream output;
198 
200  SiStripDbParams::SiStripPartitions::const_iterator ipart = partitionsRange.begin();
201  SiStripDbParams::SiStripPartitions::const_iterator ipartEnd = partitionsRange.end();
202  for ( ; ipart != ipartEnd; ++ipart ) {
203  SiStripPartition partition=ipart->second;
204  output << "%%" << "Partition: " << partition.partitionName();
205 
206  // Make everything depend on cabVersion and maskVersion!
207  output << " CablingVersion: " << partition.cabVersion().first << "." << partition.cabVersion().second;
208  output << " MaskVersion: " << partition.maskVersion().first << "." << partition.maskVersion().second;
209 
210  if(typeInfo==typeid(SiStripFedCabling)){
211  // Do nothing. FedCabling only depends on cabVersion and maskVersion.
212  }
213  else if(typeInfo==typeid(SiStripLatency)){
214  // Latency is FEC related, add fecVersion.
215  output << " FecVersion: " << partition.fecVersion().first << "." << partition.fecVersion().second;
216  }else{
217  // BadStrip, Noises, Pedestals and Thresholds are FED related, add fecVersion.
218  output << " FedVersion: " << partition.fedVersion().first << "." << partition.fedVersion().second;
219  if(typeInfo==typeid(SiStripApvGain)){
220  // Not used in O2O.
221  output << " ApvTimingVersion: " << partition.apvTimingVersion().first << "." << partition.apvTimingVersion().second;
222  }
223  }
224  }
225 
226  return output.str();
227 
228 }
229 // -----------------------------------------------------------------------------
233  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]";
234 
235  // Check if DB connection is made
236  if ( db_ ) {
237 
238  // Check if DB connection is made
239  if ( db_->deviceFactory() ||
240  db_->databaseCache() ) {
241 
242  // Build FEC cabling object
243  SiStripFecCabling fec_cabling;
244 
246  fec_cabling,
249 
251  SiStripDetCabling det_cabling( *fed_cabling_, tTopo );
252  buildStripRelatedObjects( &*db_, det_cabling );
253 
254 
258 
259 
260 
261  } else {
263  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
264  << " NULL pointer to DeviceFactory returned by SiStripConfigDb!"
265  << " Cannot build Pedestals object!";
266  }
267  } else {
269  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
270  << " NULL pointer to SiStripConfigDb returned by DB \"service\"!"
271  << " Cannot build Pedestals object!";
272  }
273 }
274 
275 // -----------------------------------------------------------------------------
277 //Retrieve FedDescriptions from configuration database
280  if ( descriptions.empty() ) {
282  << "SiStripCondObjBuilderFromDb::" << __func__ << "]"
283  << " No FED descriptions found!";
284 
285  return false;
286  }
287  return true;
288 }
289 
290 // -----------------------------------------------------------------------------
292  // Retrieve gain from configuration database
295  db->getAnalysisDescriptions( CommissioningAnalysisDescription::T_ANALYSIS_TIMING );
296  if ( anal_descriptions.empty() ) {
298  << "SiStripCondObjBuilderFromDb::" << __func__ << "]"
299  << " Unable to build SiStripApvGain object!"
300  << " No timing-scan analysis descriptions found!";
301  return false;
302  }
303  return true;
304 }
305 
306 // -----------------------------------------------------------------------------
308  // Retrieve list of active DetIds
310  vector<uint32_t> det_ids;
311  det_cabling.addActiveDetectorsRawIds(det_ids);
312  if ( det_ids.empty() ) {
314  << "SiStripCondObjBuilderFromDb::" << __func__ << "]"
315  << " Unable to build Pedestals object!"
316  << " No DetIds found!";
317  return det_ids;
318  }
320  << "\n\nSiStripCondObjBuilderFromDb::" << __func__ << "]"
321  << " Found " << det_ids.size() << " active DetIds";
322  return det_ids;
323 }
324 
325 // -----------------------------------------------------------------------------
327  //build connections per DetId
328 vector<const FedChannelConnection *> SiStripCondObjBuilderFromDb::buildConnections(const SiStripDetCabling& det_cabling, uint32_t det_id ){
329  vector<const FedChannelConnection *> conns = det_cabling.getConnections(det_id);
330  if (conns.size()==0){
332  << "SiStripCondObjBuilderFromDb::" << __func__ << "]"
333  << " Unable to build condition object!"
334  << " No FED channel connections found for detid "<< det_id;
335  }
336  return conns;
337 }
338 
339 // -----------------------------------------------------------------------------
341 //retrieve number of APV pairs per detid
343  uint16_t nApvPairs;
345  nApvPairs=fr->getNumberOfApvsAndStripLength(det_id).first/2;
346  return nApvPairs;
347 }
348 
349 // -----------------------------------------------------------------------------
351 //set default values for Cabling Objects Peds, Noise, thresh, Quality
353  uint16_t istrip = apvPair*sistrip::STRIPS_PER_FEDCH;
354  std::cout << "Found disabled FedConnection! APVPair: " << apvPair << " Strips: " << sistrip::STRIPS_PER_FEDCH << std::endl;
355  inputQuality.push_back(quality_->encode(istrip,sistrip::STRIPS_PER_FEDCH));
356  for ( ;istrip < (apvPair+1)*sistrip::STRIPS_PER_FEDCH; ++istrip ){
360  }
361 }
362 
363 // -----------------------------------------------------------------------------
365 void SiStripCondObjBuilderFromDb::setDefaultValuesApvTiming(uint32_t detid, uint32_t apvPair){
367 
368  if (gain_last_){
369  auto range = gain_last_->getRange(detid);
370  if (apvPair*2 < range.second - range.first){
371  height = gain_last_->getApvGain(apvPair*2, range);
372  edm::LogWarning(mlESSources_) << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
373  << " [ApvGain] Read gain value from last IOV for DetId: " << detid << " ApvPair: " << apvPair << ", value=" << height;
374  }else{
375  edm::LogWarning(mlESSources_) << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
376  << " [ApvGain] Unable to read gain value from last IOV for DetId: " << detid << " ApvPair: " << apvPair << ", use dummy value=" << height;
377  }
378  } else {
379  edm::LogWarning(mlESSources_) << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
380  << " [ApvGain] NULL pointer for last stored gain object in DB!!! " << "Will use dummy value=" << height << " for DetId: " << detid << " ApvPair: " << apvPair;
381  }
382 
383  inputApvGain.push_back(height); // APV0
384  inputApvGain.push_back(height); // APV1
385 }
386 
387 // -----------------------------------------------------------------------------
390  std::cout << "[SiStripCondObjBuilderFromDb::"<<__func__<<"]: Set Default Latency for Detid: " << detid << " ApvNr: " << apvnr << std::endl;
391  if(!latency_.put( detid, apvnr, m_defaultapvmodevalue, m_defaultapvlatencyvalue))
392  {
393  std::cout << "[SiStripCondObjBuilderFromDb::"<<__func__<<"]: Unable to fill Latency for Detid: " << detid << " ApvNr: " << apvnr << std::endl;
394  }
395  if(!latency_.put( detid, ++apvnr, m_defaultapvmodevalue, m_defaultapvlatencyvalue))
396  {
397  std::cout << "[SiStripCondObjBuilderFromDb::"<<__func__<<"]: Unable to fill Latency for Detid: " << detid << " ApvNr: " << apvnr << std::endl;
398  }
399 
400 }
401 
402 
403 
404 // -----------------------------------------------------------------------------
407  SiStripConfigDb::AnalysisDescriptionsRange anal_descriptions = db->getAnalysisDescriptions( CommissioningAnalysisDescription::T_ANALYSIS_TIMING );
408  SiStripConfigDb::AnalysisDescriptionsV::const_iterator iii = anal_descriptions.begin();
409  SiStripConfigDb::AnalysisDescriptionsV::const_iterator jjj = anal_descriptions.end();
410 
411  while ( iii != jjj ) {
412  CommissioningAnalysisDescription* tmp = *iii;
413  uint16_t fed_id = tmp->getFedId();
414  uint16_t fed_ch = SiStripFedKey::fedCh( tmp->getFeUnit(), tmp->getFeChan() );
415  if ( fed_id == ipair.fedId() && fed_ch == ipair.fedCh() ) { break; }
416  iii++;
417  }
418 
419  TimingAnalysisDescription *anal=0;
420  if ( iii != jjj ) { anal = dynamic_cast<TimingAnalysisDescription*>(*iii); }
421  if ( !anal ) {
422  edm::LogWarning(mlESSources_) << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
423  << " [ApvGain] Unable to find Timing Analysis Description from DB for DetId: " << ipair.detId() << " ApvPair:" << ipair.apvPairNumber();
424  return false;
425  }
426 
427  for (const auto &desc : skippedDevices){
428  if (desc.isConsistent(ipair)){
429  edm::LogInfo(mlESSources_) << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
430  << " [ApvGain] Skip module with DetId:" << ipair.detId() << " ApvPair:" << ipair.apvPairNumber()
431  << " according to \n" << desc.dump();
432  if (std::find(skippedDetIds.begin(), skippedDetIds.end(), ipair.detId()) == skippedDetIds.end()){
433  skippedDetIds.push_back(ipair.detId());
434  }
435  return false;
436  }
437  }
438 
439  if ( anal->getHeight() > m_tickmarkThreshold ) {
440  float tick_height = (anal->getHeight() / m_gaincalibrationfactor);
441  inputApvGain.push_back( tick_height ); // APV0
442  inputApvGain.push_back( tick_height ); // APV1
443  } else {
444  edm::LogWarning(mlESSources_) << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
445  << " [ApvGain] Low tickmark height for DetId:" << ipair.detId() << " ApvPair:" << ipair.apvPairNumber() << ", height=" << anal->getHeight();
446  return false;
447  }
448 
449  return true;
450 }
451 
452 // -----------------------------------------------------------------------------
457 
458  SiStripConfigDb::DeviceDescriptionsV::const_iterator iapv = apvs.begin();
459  SiStripConfigDb::DeviceDescriptionsV::const_iterator japv = apvs.end();
460  if(iapv==japv) return false;
461  for ( ; iapv != japv; ++iapv ) {
462  apvDescription* apv = dynamic_cast<apvDescription*>( *iapv );
463  if ( !apv ) { continue; }
464  if((apv->getCrateId()) != (ipair.fecCrate())) continue;
465  if((apv->getFecSlot()) != (ipair.fecSlot())) continue;
466  if((apv->getRingSlot()) != (ipair.fecRing())) continue;
467  if((apv->getCcuAddress()) != (ipair.ccuAddr())) continue;
468  if((apv->getChannel()) != (ipair.ccuChan())) continue;
469  // Insert latency values into latency object
470  if((apv->getAddress()) == (ipair.i2cAddr(0))) {
471  if(!latency_.put( detid, apvnr, static_cast<uint16_t>(apv->getLatency()), static_cast<uint16_t>(apv->getApvMode()))){
472  std::cout << "UNABLE APVLatency Put: Detid "<< dec<<detid
473  << " APVNr.: " << apvnr
474  << " Latency Value: " << dec <<static_cast<uint16_t>(apv->getLatency())
475  << " APV Mode: " << dec<< static_cast<uint16_t>(apv->getApvMode())
476  << std::endl;
477  return false;
478  }else{++apvnr;}
479  }
480  if((apv->getAddress()) == (ipair.i2cAddr(1))) {
481  if(!latency_.put( detid, apvnr, static_cast<uint16_t>(apv->getLatency()), static_cast<uint16_t>(apv->getApvMode()))){
482  std::cout << "UNABLE APVLatency Put: Detid "<<dec<< detid
483  << " APVNr.: " << apvnr
484  << " Latency Value: " << dec <<static_cast<uint16_t>(apv->getLatency())
485  << " APV Mode: " << dec <<static_cast<uint16_t>(apv->getApvMode())
486  << std::endl;
487  continue;
488  return false;
489  }else{++apvnr;}
490  }
491  }
492  return true;
493 }
494 
495 // -----------------------------------------------------------------------------
497 //bool SiStripCondObjBuilderFromDb::setValuesCabling(SiStripConfigDb* const db, FedChannelConnection &ipair, uint32_t detid){
499  //SiStripConfigDb::FedDescriptionsRange descriptions = db->getFedDescriptions();
500  SiStripConfigDb::FedDescriptionsV::const_iterator description = descriptions.begin();
501  while ( description != descriptions.end() ) {
502  if ( (*description)->getFedId() ==ipair.fedId() ) { break; }
503  description++;
504  }
505  if ( description == descriptions.end() ) {return false;}
506  // Retrieve Fed9UStrips object from FED description
507  const Fed9U::Fed9UStrips& strips = (*description)->getFedStrips();
508 
509 
510  // Retrieve StripDescriptions for each APV
511  uint16_t jstrip = ipair.apvPairNumber()*sistrip::STRIPS_PER_FEDCH;
512  for ( uint16_t iapv = 2*ipair.fedCh(); iapv < 2*ipair.fedCh()+2; iapv++ ) {
513 
514  // Get StripDescriptions for the given APV
515  Fed9U::Fed9UAddress addr;
516  addr.setFedApv(iapv);
517  vector<Fed9U::Fed9UStripDescription> strip = strips.getApvStrips(addr);
518 
519  vector<Fed9U::Fed9UStripDescription>::const_iterator istrip = strip.begin();
520 
521  for ( ; istrip != strip.end(); istrip++ ) {
522  pedestals_->setData( istrip->getPedestal() , inputPedestals);
523  noises_ ->setData( istrip->getNoise() , inputNoises );
524  threshold_->setData( jstrip, istrip->getLowThresholdFactor(),
525  istrip->getHighThresholdFactor(), inputThreshold );
526  if(istrip->getDisable()){
527  std::cout << "Found disabled strip! Detid: " << detid << " APVNr: " << iapv << " Strips: " << jstrip << std::endl;
528 
529  inputQuality.push_back(quality_->encode(jstrip,1));
530  }
531  jstrip++;
532  }
533  }
534  return true;
535 }
536 
537 
538 // -----------------------------------------------------------------------------
540 //store objects
542  if ( !pedestals_->put(det_id, inputPedestals ) ) {
543  std::cout
544  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
545  << " Unable to insert values into SiStripPedestals object!"
546  << " DetId already exists!" << std::endl;
547  }
548  inputPedestals.clear();
549 
550  }
551 
552 
553 
554 // -----------------------------------------------------------------------------
557  // Insert noise values into Noises object
558 
559  if ( !noises_->put(det_id, inputNoises ) ) {
560  std::cout
561  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
562  << " Unable to insert values into SiStripNoises object!"
563  << " DetId already exists!" << std::endl;
564  }
565  inputNoises.clear();
566 
567  }
568 
569 // -----------------------------------------------------------------------------
572  // Insert threshold values into Threshold object
573  if ( !threshold_->put(det_id, inputThreshold ) ) {
574  std::cout
575  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
576  << " Unable to insert values into SiStripThreshold object!"
577  << " DetId already exists!" << std::endl;
578  }
579  inputThreshold.clear();
580 }
581 
582 // -----------------------------------------------------------------------------
585  // Insert quality values into Quality object
586  if (inputQuality.size()){
587  quality_->compact(det_id,inputQuality);
588  if ( !quality_->put(det_id, inputQuality ) ) {
589  std::cout
590  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
591  << " Unable to insert values into SiStripQuality object!"
592  << " DetId already exists!" << std::endl;
593  }
594  }
595  inputQuality.clear();
596 }
597 
598 // -----------------------------------------------------------------------------
601  // Insert tick height values into Gain object
602  SiStripApvGain::Range range( inputApvGain.begin(), inputApvGain.end() );
603  if ( !gain_->put( det_id, range ) ) {
605  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
606  << " [ApvGain] Unable to insert values into SiStripApvGain object!"
607  << " DetId already exists!";
608  }
609  inputApvGain.clear();
610 }
611 
612 // -----------------------------------------------------------------------------
615  const SiStripDetCabling& det_cabling){
616  //variables needed in this function
617  uint16_t nApvPairs;
618  vector<uint32_t>::const_iterator det_id;
619  vector<uint32_t> det_ids;
620 
622  << "\n[SiStripCondObjBuilderFromDb::" << __func__ << "] first call to this method";
623 
624  //Check if FedDescriptions exist, if not return
625  if (!retrieveFedDescriptions(db)) {std::cout<< "Found no FedDescription!" << std::endl;return;}
626  // Retrieve list of active DetIds
627  det_cabling.addActiveDetectorsRawIds(det_ids);
628  if ( det_ids.empty() ) {
629  std::cout
630  << "SiStripCondObjBuilderFromDb::" << __func__ << "]"
631  << " Unable to build Pedestals object!"
632  << " No DetIds found!" << std::endl;
633  return;
634  }
635  std::cout << "\n\nSiStripCondObjBuilderFromDb::" << __func__ << "]"
636  << " Found " << det_ids.size() << " active DetIds";
637 
638  // Loop Active DetIds
639  det_id = det_ids.begin();
640  for ( ; det_id != det_ids.end(); det_id++ ) {
641  std::stringstream ssMessage;
642 
643  // Ignore NULL DetIds
644  if ( !(*det_id) ) { continue; }
645  if ( *det_id == sistrip::invalid32_ ) { continue; }
646 
647 
648  //build connections per DetId
649  const vector<const FedChannelConnection *>& conns=buildConnections(det_cabling, *det_id);
650 
651  vector<const FedChannelConnection *>::const_iterator ipair = conns.begin();
652  if(conns.size() ==0 ) continue;
653 
654  //retrieve number of APV pairs per detid
655  nApvPairs=retrieveNumberAPVPairs(*det_id);
656 
657 
658  //loop connections and check if APVPair is connected
659  vector< vector<const FedChannelConnection *>::const_iterator > listConns(nApvPairs,conns.end());
660 
661  for ( ; ipair != conns.end(); ++ipair ){
662  // Check if the ApvPair is connected
663  if ( !(*ipair) ) continue;
664  if ((*ipair)->fedId()!=sistrip::invalid_ && (*ipair)->apvPairNumber()<3){
665  // (*ipair)->print(ssMessage);
666  // ssMessage<< std::endl;
667  listConns[ipair-conns.begin()]=ipair;
668  } else {
669  std::cout
670  << "\n impossible to assign connection position in listConns " << std::endl;
671  // (*ipair)->print(ssMessage);
672  // ssMessage << std::endl;
673  }
674  }
675 
676  // get data
677  // vector< vector<const FedChannelConnection *>::const_iterator >::const_iterator ilistConns=listConns.begin();
678  for (uint16_t apvPair=0;apvPair<listConns.size();++apvPair){
679  ipair=listConns[apvPair];
680  if ( ipair == conns.end() ) {
681  // Fill object with default values
682  std::cout
683  << "\n "
684  << " Unable to find FED connection for detid : " << std::dec << *det_id << " APV pair number " << apvPair
685  << " Writing default values" << std::endl;
686 // (*ipair)->print(ssMessage); // this will crash!
687  //If no connection was found, add 100 to apvpair
688  apvPair+=100;
689  std::cout << " Put apvPair+100:" << apvPair << " into vector!" << std::endl;
690  // use dummy FedChannelConnection since it's not used in this case
692  p_apvpcon=std::make_pair(apvPair,dummy);
693  v_apvpcon.push_back(p_apvpcon);
694  apvPair=apvPair-100;
695  continue;
696  }
697  p_apvpcon=std::make_pair(apvPair,**ipair);
698  v_apvpcon.push_back(p_apvpcon);
699  } //conns loop
700  p_detcon=std::make_pair(*det_id,v_apvpcon);
701  v_trackercon.push_back(p_detcon);
702  v_apvpcon.clear();
703  } // det id loop
704 }
705 
706 // -----------------------------------------------------------------------------
709  trackercon tc = _tc;
710  std::cout << "Entering [SiStripCondObjBuilderFromDb::"<<__func__ <<"]"<<std::endl;
711  //data container
712  gain_= new SiStripApvGain();
713 
714  //check if Timing analysis description is found, otherwise quit
717  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
718  << " NULL pointer to AnalysisDescriptions returned by SiStripConfigDb!"
719  << " Cannot build Analysis object! QUIT";
720  throw cms::Exception("Cannot build Analysis object!");
721  }
722 
723  // Get all detIds from the ideal geometry to build the payload
725  const std::map<uint32_t, SiStripDetInfoFileReader::DetInfo > DetInfos = fr->getAllData();
726 
727  for(auto it = DetInfos.begin(); it != DetInfos.end(); ++it){
728  // check if det id is correct and if it is actually cabled in the detector
729  if( it->first==0 || it->first==sistrip::invalid32_) {
730  edm::LogError("DetIdNotGood") << "@SUB=analyze" << "Invalid detid: " << it->first
731  << " ... neglecting!" << std::endl;
732  continue;
733  }
734 
735  uint32_t detid = it->first;
736  bool update_ = true;
737  i_trackercon det_iter = std::find_if(tc.begin(), tc.end(), [detid](const pair_detcon &p){ return p.first==detid; });
738  if(det_iter==tc.end()) {
739  update_ = false; // do not update if it is not connected in cabling
740  }
741 
742  if(update_){
743  //loop connections
744  for(i_apvpairconn connections=det_iter->second.begin();connections!=det_iter->second.end();connections++){
745  uint32_t apvPair =(*connections).first;
746  FedChannelConnection ipair =(*connections).second;
747 
748  //no connection for apvPair found
749  if(apvPair>=100){
750  setDefaultValuesApvTiming(detid, apvPair-100);
751  continue;
752  }
753 
754  //fill data
755  if(!setValuesApvTiming(db, ipair)){
756  // either not found in analysis table or low tickmark height
757  setDefaultValuesApvTiming(detid, apvPair);
758  }
759  }//connections
760 
761  }else{
762  uint32_t nApvPairs = it->second.nApvs/2;
763  for (uint32_t apvPair=0; apvPair<nApvPairs; ++apvPair){
764  setDefaultValuesApvTiming(detid, apvPair);
765  }
766  }
767 
768  storeTiming(detid);
769 
770  }// end loop detids
771 
772  //print out skipped modules
773  std::stringstream ss;
774  for (const auto &skip : skippedDetIds){
775  ss << "\n" << skip;
776  }
778  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
779  << " [ApvGainSummary] Skipped " << skippedDetIds.size() << " modules: " << ss.str();
780 
781 
782 
783 }
784 
785 // -----------------------------------------------------------------------------
788  trackercon tc = _tc;
789  std::cout << "Entering [SiStripCondObjBuilderFromDb::"<<__func__ <<"]"<<std::endl;
790  //data container
791  latency_ = new SiStripLatency();
792 
793  i_trackercon detids_end=tc.end();
794 
795  // get APV DeviceDescriptions
797 
798 
799  //loop detids
800  for(i_trackercon detids=tc.begin();detids!=detids_end;detids++){
801  uint32_t detid = (*detids).first;
802  uint16_t apvnr=1;
803  i_apvpairconn connections_end=((*detids).second).end();
804 
805 
806  //loop connections
807  for(i_apvpairconn connections=((*detids).second).begin();connections!=connections_end;connections++){
808  uint32_t apvPair =(*connections).first;
809  FedChannelConnection ipair =(*connections).second;
810 
811  //no connection for apvPair found
812  if(apvPair>=100){
813  //setDefaultValuesApvLatency((*latency_),ipair, detid, apvnr);
814  std::cout << "[SiStripCondObjBuilderFromDb::" << __func__ << "] No FEDConnection for DetId " << detid << " ApvPair " << apvPair-100 << " found, skipping Latency Insertion!" << std::endl;
815  continue;
816  }
817 
818  //fill data
819  if(!setValuesApvLatency((*latency_),db, ipair, detid, apvnr, apvs)){
820  std::cout
821  << "\n "
822  << " Unable to find FEC Description"
823  << " Skipping Insertion for DetId: " << detid << std::endl;
824  //setDefaultValuesApvLatency((*latency_),ipair, detid, apvnr);
825  }
826  apvnr+=2;
827  }//connections
828  // compact Latency Object
829 
830  }//detids
831  latency_->compress();
832  std::stringstream ss;
833  // latency debug output
834  latency_->printSummary(ss);
835  latency_->printDebug(ss);
836  std::cout << ss.str() << std::endl;
837 }
838 
839 // -----------------------------------------------------------------------------
842  trackercon tc = _tc;
843  std::cout << "Entering [SiStripCondObjBuilderFromDb::"<<__func__ <<"]"<<std::endl;
844 
845  //data containers
847  noises_ = new SiStripNoises();
849  quality_ = new SiStripQuality();
850 
851  i_trackercon detids_end=tc.end();
852 
853  //Build FED Descriptions out of db object
855 
856  //loop detids
857  for(i_trackercon detids=tc.begin();detids!=detids_end;detids++){
858  uint32_t detid = (*detids).first;
859  i_apvpairconn connections_end=((*detids).second).end();
860 
861  //loop connections
862  for(i_apvpairconn connections=((*detids).second).begin();connections!=connections_end;connections++){
863  uint32_t apvPair =(*connections).first;
864  FedChannelConnection ipair =(*connections).second;
865 
866  //no connection for apvPair found
867  if(apvPair>=100){
868  std::cout
869  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
870  << " Unable to find FED description for FED id: " << ipair.fedId()
871  << " detid : " << detid << " APV pair number " << apvPair
872  << " Writing default values"<< std::endl;
873  setDefaultValuesCabling((apvPair-100));
874  continue;
875  }
876  // if(!setValuesCabling(db, ipair, detid)){
877  if(!setValuesCabling(descriptions, ipair, detid)){
878  std::cout
879  << "[SiStripCondObjBuilderFromDb::" << __func__ << "]"
880  << " Unable to find FED description for FED id: " << ipair.fedId()
881  << " detid : " << detid << " APV pair number " << apvPair
882  << " Writing default values"<< std::endl;
883  setDefaultValuesCabling(apvPair);
884  }
885  }//connections
886  storePedestals(detid);
887  storeNoise(detid);
888  storeThreshold(detid);
889  storeQuality(detid);
890  }//detids
891 }
892 
894  fec_(sistrip::invalid_),
895  fed_(sistrip::invalid_),
896  detid_(sistrip::invalid32_)
897 {}
898 
900  fec_(pset.getUntrackedParameter<uint32_t>("fecCrate", sistrip::invalid_),
901  pset.getUntrackedParameter<uint32_t>("fecSlot", sistrip::invalid_),
902  pset.getUntrackedParameter<uint32_t>("fecRing", sistrip::invalid_),
903  pset.getUntrackedParameter<uint32_t>("ccuAddr", sistrip::invalid_),
904  pset.getUntrackedParameter<uint32_t>("ccuChan", sistrip::invalid_),
905  pset.getUntrackedParameter<uint32_t>("lldChan", sistrip::invalid_),
906  pset.getUntrackedParameter<uint32_t>("i2cAddr", sistrip::invalid_)),
907  fed_(pset.getUntrackedParameter<uint32_t>("fedId", sistrip::invalid_),
908  pset.getUntrackedParameter<uint32_t>("feUnit", sistrip::invalid_),
909  pset.getUntrackedParameter<uint32_t>("feChan", sistrip::invalid_),
910  pset.getUntrackedParameter<uint32_t>("fedApv", sistrip::invalid_)),
911  detid_(pset.getUntrackedParameter<uint32_t>("detid", sistrip::invalid32_))
912 {
914  throw cms::Exception("InvalidPSet") << "None of FEC coordinates/FED coordinates/detids are valid in this PSet!\n" << pset.dump(2);
915  }
916 }
917 
919 
920  auto comp = [](uint16_t desc, uint16_t device) { return desc==0 || desc==device; };
921 
922  // use FEC coordinates first if provided
923  if (fec_.isValid()){
924  return comp(fec_.fecCrate(), fc.fecCrate())
925  && comp(fec_.fecSlot(), fc.fecSlot())
926  && comp(fec_.fecRing(), fc.fecRing())
927  && comp(fec_.ccuAddr(), fc.ccuAddr())
928  && comp(fec_.ccuChan(), fc.ccuChan())
929  && comp(fec_.lldChan(), fc.lldChannel())
930  && (comp(fec_.i2cAddr(), fc.i2cAddr(0)) || comp(fec_.i2cAddr(), fc.i2cAddr(1))); // do not distinguish between APV1 and APV2
931  }
932 
933  // then try FED coordinates
934  if (fed_.isValid()){
935  return comp(fed_.fedId(), fc.fedId())
938  // no fedApv in FedChannelConnection -- and we do not distinguish between APV1 and APV2
939  }
940 
941  // last try detids (will skip all APVs on the module)
943  return detid_ == fc.detId();
944  }
945 
946  return false;
947 }
948 
950  std::stringstream ss;
951  fec_.terse(ss);
952  ss << "\n";
953  fed_.terse(ss);
954  ss << "\n";
955  ss << "detid=" << detid_;
956  return ss.str();
957 }
const uint16_t & fecSlot() const
bool put(const uint32_t &detID, const InputVector &vect)
vector< uint32_t > retrieveActiveDetIds(const SiStripDetCabling &det_cabling)
SiStripPedestals::InputVector inputPedestals
const uint16_t & fecCrate() const
bool put(const uint32_t detId, const uint16_t apv, const uint16_t latency, const uint16_t mode)
void addActiveDetectorsRawIds(std::vector< uint32_t > &) const
const uint16_t & fecRing() const
Versions maskVersion() const
const uint16_t & fedCh() const
const std::pair< unsigned short, double > getNumberOfApvsAndStripLength(uint32_t detId) const
std::string dump(unsigned int indent=0) const
void buildAnalysisRelatedObjects(SiStripConfigDb *const db, const trackercon &tc)
DeviceFactory *const deviceFactory(std::string method_name="") const
static const uint32_t invalid32_
Definition: Constants.h:15
SiStripQuality::InputVector inputQuality
FedDescriptionsRange getFedDescriptions(std::string partition="")
std::vector< ParameterSet > VParameterSet
Definition: ParameterSet.h:33
std::string partitionName() const
uint16_t apvPairNumber() const
bool isConsistent(const FedChannelConnection &fc) const
std::pair< uint32_t, v_apvpairconn > pair_detcon
FedDescriptions::range FedDescriptionsRange
const uint16_t & lldChan() const
const uint16_t & fecSlot() const
uint16_t lldChannel() const
SiStripThreshold::InputVector inputThreshold
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
const uint16_t & i2cAddr() const
const uint16_t & fedId() const
sistrip classes
virtual void terse(std::stringstream &ss) const
void setDefaultValuesCabling(uint16_t apvPair)
static std::string const input
Definition: EdmProvDump.cc:44
edm::Service< SiStripConfigDb > db_
bool put(const uint32_t &detID, Range input)
void buildFECRelatedObjects(SiStripConfigDb *const db, const trackercon &tc)
const std::vector< const FedChannelConnection * > & getConnections(uint32_t det_id) const
const_iterator_range partitions() const
bool setValuesApvLatency(SiStripLatency &latency_, SiStripConfigDb *const db, FedChannelConnection &ipair, uint32_t detid, uint16_t apvnr, SiStripConfigDb::DeviceDescriptionsRange apvs)
bool retrieveFedDescriptions(SiStripConfigDb *const db)
Versions apvTimingVersion() const
void buildStripRelatedObjects(SiStripConfigDb *const db, const SiStripDetCabling &det_cabling)
bool checkForCompatibility(std::stringstream &input, std::stringstream &output, std::string &label)
std::shared_ptr< SiStripApvGain > gain_last_
const std::map< uint32_t, DetInfo > & getAllData() const
const uint16_t & fecRing() const
const uint32_t & detId() const
static void buildFecCabling(SiStripConfigDb *const, SiStripFecCabling &, const sistrip::CablingSource &)
Class containning control, module, detector and connection information, at the level of a FED channel...
DeviceDescriptions::range DeviceDescriptionsRange
bool isValid() const
void compact(unsigned int &, std::vector< unsigned int > &)
An interface class to the DeviceFactory.
const uint16_t & ccuChan() const
void buildFEDRelatedObjects(SiStripConfigDb *const db, const trackercon &tc)
std::pair< ContainerIterator, ContainerIterator > Range
uint16_t retrieveNumberAPVPairs(uint32_t det_id)
std::vector< pair_detcon > trackercon
Container class for database partition parameters.
#define end
Definition: vmac.h:37
AnalysisDescriptionsRange getAnalysisDescriptions(AnalysisType, std::string partition="")
const uint16_t & ccuAddr() const
vector< const FedChannelConnection * > buildConnections(const SiStripDetCabling &det_cabling, uint32_t det_id)
SiStripNoises::InputVector inputNoises
#define LogTrace(id)
void printSummary(std::stringstream &ss) const
Prints the number of ranges as well as the value of singleLatency and singleMode. ...
bool put(const uint32_t &detID, const InputVector &input)
DbClient *const databaseCache(std::string method_name="") const
const uint16_t & fecCrate() const
const SiStripDbParams & dbParams() const
bool setValuesCabling(SiStripConfigDb::FedDescriptionsRange &descriptions, FedChannelConnection &ipair, uint32_t detid)
static void getFedCabling(const SiStripFecCabling &in, SiStripFedCabling &out)
static const uint16_t STRIPS_PER_FEDCH
bool put(const uint32_t &detID, InputVector &input)
const uint16_t & feUnit() const
bool retrieveTimingAnalysisDescriptions(SiStripConfigDb *const db)
AnalysisDescriptions::range AnalysisDescriptionsRange
unsigned int module_fw_bwStartBit_
const uint16_t & ccuAddr() const
static const uint16_t invalid_
Definition: Constants.h:16
std::string getConfigString(const std::type_info &typeInfo)
void setDefaultValuesApvLatency(SiStripLatency &latency_, const FedChannelConnection &ipair, uint32_t detid, uint16_t apvnr)
void setData(const uint16_t &strip, const float &lTh, const float &hTh, Container &vthr)
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
boost::iterator_range< SiStripPartitions::const_iterator > const_iterator_range
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
SiStripApvGain::InputVector inputApvGain
void printDebug(std::stringstream &ss) const
Prints the full list of all ranges and corresponding values of latency and mode.
void setData(float ped, InputVector &vped)
HLT enums.
bool isValid() const
const uint16_t & feChan() const
const uint16_t & ccuChan() const
const uint16_t & fedId() const
void setDefaultValuesApvTiming(uint32_t detid, uint32_t apvPair)
static uint16_t fedCh(const uint16_t &fe_unit, const uint16_t &fe_chan)
DeviceDescriptionsRange getDeviceDescriptions(std::string partition="")
static const char mlESSources_[]
std::vector< SkipDeviceDescription > skippedDevices
const uint16_t & i2cAddr(const uint16_t &apv0_or_1) const
bool put(const uint32_t &detID, const InputVector &vect)
std::vector< pair_detcon >::iterator i_trackercon
Versions fecVersion() const
Versions cabVersion() const
std::vector< pair_apvpairconn >::iterator i_apvpairconn
unsigned int encode(const unsigned short &first, const unsigned short &NconsecutiveBadStrips, const unsigned short &flag=0)
Versions fedVersion() const
void setData(float noise_, InputVector &vped)
bool setValuesApvTiming(SiStripConfigDb *const db, FedChannelConnection &ipair)
virtual void terse(std::stringstream &ss) const