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