CMS 3D CMS Logo

SiPixelStatusHarvester.cc
Go to the documentation of this file.
1 
2 /*
3  * See header file for a description of this class.
4  *
5  * author
6  */
7 
8 // CMSSW FW
21 
22 // Pixel geometry and cabling map
29 
30 // Condition Format
34 // CondOutput
36 
37 // Dataformat of SiPixel status in ALCAPROMPT data
39 //#include "CondCore/Utilities/bin/cmscond_export_iov.cpp"
40 //#include "CondCore/Utilities/interface/Utilities.h"
41 
42 // harvest helper class
44 // header file
46 
47 #include <iostream>
48 #include <cstring>
49 
50 using namespace edm;
51 
52 //--------------------------------------------------------------------------------------------------
54  SiPixelPhase1Base(iConfig),
55  outputBase_(iConfig.getParameter<ParameterSet>("SiPixelStatusManagerParameters").getUntrackedParameter<std::string>("outputBase")),
56  aveDigiOcc_(iConfig.getParameter<ParameterSet>("SiPixelStatusManagerParameters").getUntrackedParameter<int>("aveDigiOcc")),
57  nLumi_(iConfig.getParameter<edm::ParameterSet>("SiPixelStatusManagerParameters").getUntrackedParameter<int>("resetEveryNLumi")),
58  moduleName_(iConfig.getParameter<ParameterSet>("SiPixelStatusManagerParameters").getUntrackedParameter<std::string>("moduleName")),
59  label_(iConfig.getParameter<ParameterSet>("SiPixelStatusManagerParameters").getUntrackedParameter<std::string>("label")){
60 
61  SiPixelStatusManager* siPixelStatusManager = new SiPixelStatusManager(iConfig, consumesCollector());
62  siPixelStatusManager_ = *siPixelStatusManager;
63  debug_ = iConfig.getUntrackedParameter<bool>("debug");
64  recordName_ = iConfig.getUntrackedParameter<std::string>("recordName", "SiPixelQualityFromDbRcd");
65 
66  sensorSize_.clear();
67  pixelO2O_.clear();
68 
70  endLumiBlock_ = 0;
71  countLumi_ = 0;
72 
73 }
74 
75 //--------------------------------------------------------------------------------------------------
77 
78 //--------------------------------------------------------------------------------------------------
80 
81 //--------------------------------------------------------------------------------------------------
83 
84 //--------------------------------------------------------------------------------------------------
86 
87 //--------------------------------------------------------------------------------------------------
89 
90  // tracker geometry and cabling map to convert offline row/column (module) to online row/column
91  edm::ESHandle<TrackerGeometry> tmpTkGeometry;
92  iSetup.get<TrackerDigiGeometryRecord>().get(tmpTkGeometry);
93  trackerGeometry_ = tmpTkGeometry.product();
94 
96  iSetup.get<SiPixelFedCablingMapRcd>().get(pixelCabling);
97  cablingMap_ = pixelCabling.product();
98 
99  for (TrackerGeometry::DetContainer::const_iterator it = trackerGeometry_->dets().begin(); it != trackerGeometry_->dets().end(); it++){
100 
101  const PixelGeomDetUnit *pgdu = dynamic_cast<const PixelGeomDetUnit*>((*it));
102  if (pgdu == nullptr) continue;
103  DetId detId = (*it)->geographicalId();
104  int detid = detId.rawId();
105 
106  const PixelTopology* topo = static_cast<const PixelTopology*>(&pgdu->specificTopology());
107  // number of row/columns for a given module
108  int rowsperroc = topo->rowsperroc();
109  int colsperroc = topo->colsperroc();
110 
111  int nROCrows = pgdu->specificTopology().nrows()/rowsperroc;
112  int nROCcolumns = pgdu->specificTopology().ncolumns()/colsperroc;
113  unsigned int nrocs = nROCrows*nROCcolumns;
114  sensorSize_[detid] = nrocs;
115 
116  std::map<int, std::pair<int,int> > rocToOfflinePixel;
117 
118  std::vector<sipixelobjects::CablingPathToDetUnit> path = (cablingMap_->det2PathMap()).find(detId.rawId())->second;
119  typedef std::vector<sipixelobjects::CablingPathToDetUnit>::const_iterator IT;
120  for(IT it = path.begin(); it != path.end(); ++it) {
121  // Pixel ROC building from path in cabling map
122  const sipixelobjects::PixelROC *roc = cablingMap_->findItem(*it);
123  int idInDetUnit = (int) roc->idInDetUnit();
124 
125  // local to global conversion
126  sipixelobjects::LocalPixel::RocRowCol local = {rowsperroc/2, colsperroc/2};
128 
129  rocToOfflinePixel[idInDetUnit] = std::pair<int,int>(global.row, global.col);
130 
131  }
132 
133  pixelO2O_[detid] = rocToOfflinePixel;
134  }
135 
136  // Permananent bad components
137  edm::ESHandle<SiPixelQuality> qualityInfo;
138  iSetup.get<SiPixelQualityFromDbRcd>().get( qualityInfo );
139  badPixelInfo_ = qualityInfo.product();
140 
141  // read in SiPixel occupancy data in ALCARECO/ALCAPROMPT
143  std::map<edm::LuminosityBlockNumber_t,std::map<int,std::vector<int>> > FEDerror25Map = siPixelStatusManager_.getFEDerror25Rocs();
144  std::map<edm::LuminosityBlockNumber_t,SiPixelDetectorStatus> siPixelStatusMap = siPixelStatusManager_.getBadComponents();
145 
146  // DB service
148 
149  if(poolDbService.isAvailable() ) {// if(poolDbService.isAvailable() )
150 
151  std::vector<int> vDetId;
152  // start producing tag for permanent component removed
153  SiPixelQuality *siPixelQualityPermBad = new SiPixelQuality();
154  const std::vector<SiPixelQuality::disabledModuleType> badComponentList = badPixelInfo_->getBadComponentList();
155  for(unsigned int i = 0; i<badComponentList.size();i++){
156 
157  siPixelQualityPermBad->addDisabledModule(badComponentList[i]);
158 
159  uint32_t detId = badComponentList[i].DetID;
160  int detid = int(detId);
161  unsigned int nroc = sensorSize_[detid];
162 
163  for(int iroc = 0; iroc<int(nroc); iroc++){
164  if(badPixelInfo_->IsRocBad(detId, short(iroc)) ){
165  std::map<int, std::pair<int,int> > rocToOfflinePixel = pixelO2O_[detid];
166  int row = rocToOfflinePixel[iroc].first;
167  int column = rocToOfflinePixel[iroc].second;
168  histo[PERMANENTBADROC].fill(detId, nullptr, column, row);
169  }
170  }
171 
172  }
173  if(debug_==true){ // only produced for debugging reason
174  cond::Time_t thisIOV = (cond::Time_t) iRun.id().run();
175  poolDbService->writeOne<SiPixelQuality>(siPixelQualityPermBad, thisIOV, recordName_+"_permanentBad");
176  }
177 
178  // IOV for final payloads. FEDerror25 and pcl
179  std::map<edm::LuminosityBlockNumber_t, edm::LuminosityBlockNumber_t> finalIOV;
180  std::map<edm::LuminosityBlockNumber_t, edm::LuminosityBlockNumber_t> fedError25IOV;
181  std::map<edm::LuminosityBlockNumber_t, edm::LuminosityBlockNumber_t> pclIOV;
182 
183  //int nLumiBlock_ = countLumi_-FEDerror25Map.begin()->first+1;
184 
185  // container for SiPixelQuality for the whole run
186  std::map<int, SiPixelQuality*> siPixelQualityStuckTBM_Tag;
187 
188  // stuckTBM tag from FED error 25 with permanent component removed
189  for(SiPixelStatusManager::FEDerror25Map_iterator it=FEDerror25Map.begin(); it!=FEDerror25Map.end();it++){
190 
191  cond::Time_t thisIOV = 1;
192  edm::LuminosityBlockID lu(iRun.id().run(),it->first);
193  thisIOV = (cond::Time_t)(lu.value());
194 
195  int interval = 0;
196  // interval is the number of lumi sections in the IOV
198  if(nextIt!=FEDerror25Map.end()) interval = int(nextIt->first - it->first);
199  else interval = int(endLumiBlock_ - it->first + 1);
200 
201  SiPixelQuality *siPixelQuality_stuckTBM = new SiPixelQuality();
202  SiPixelQuality *siPixelQuality_FEDerror25 = new SiPixelQuality();
203 
204  std::map<int, std::vector<int> > tmpFEDerror25 = it->second;
205  for(std::map<int, std::vector<int> >::iterator ilist = tmpFEDerror25.begin(); ilist!=tmpFEDerror25.end();ilist++){
206 
207  int detid = ilist->first;
208  uint32_t detId = uint32_t(detid);
209 
210  SiPixelQuality::disabledModuleType BadModule_stuckTBM, BadModule_FEDerror25;
211 
212  BadModule_stuckTBM.DetID = uint32_t(detid); BadModule_FEDerror25.DetID = uint32_t(detid);
213  BadModule_stuckTBM.errorType = 3; BadModule_FEDerror25.errorType = 3;
214 
215  BadModule_stuckTBM.BadRocs = 0; BadModule_FEDerror25.BadRocs = 0;
216  std::vector<uint32_t> BadRocList_stuckTBM, BadRocList_FEDerror25;
217  std::vector<int> list = ilist->second;
218 
219  for(unsigned int i=0; i<list.size();i++){
220 
221  int iroc = list[i];
222  std::map<int, std::pair<int,int> > rocToOfflinePixel = pixelO2O_[detid];
223  int row = rocToOfflinePixel[iroc].first;
224  int column = rocToOfflinePixel[iroc].second;
225 
226  BadRocList_FEDerror25.push_back(uint32_t(iroc));
227  for (int iLumi = 0; iLumi<interval;iLumi++){
228  histo[FEDERRORROC].fill(detId, nullptr, column, row);// 1.0/nLumiBlock_);
229  }
230 
231  // only include rocs that are not permanent known bad
232  if(!badPixelInfo_->IsRocBad(detId, short(iroc))){ // stuckTBM = FEDerror25 - permanent bad
233  BadRocList_stuckTBM.push_back(uint32_t(iroc));
234  for (int iLumi = 0; iLumi<interval;iLumi++){
235  histo[STUCKTBMROC].fill(detId, nullptr, column, row);//, 1.0/nLumiBlock_);
236  }
237  }
238 
239  }
240 
241  // change module error type if all ROCs are bad
242  if(BadRocList_stuckTBM.size()==sensorSize_[detid])
243  BadModule_stuckTBM.errorType = 0;
244 
245  short badrocs_stuckTBM = 0;
246  for(std::vector<uint32_t>::iterator iter = BadRocList_stuckTBM.begin(); iter != BadRocList_stuckTBM.end(); ++iter){
247  badrocs_stuckTBM += 1 << *iter; // 1 << *iter = 2^{*iter} using bitwise shift
248  }
249  // fill the badmodule only if there is(are) bad ROC(s) in it
250  if(badrocs_stuckTBM!=0){
251  BadModule_stuckTBM.BadRocs = badrocs_stuckTBM;
252  siPixelQuality_stuckTBM->addDisabledModule(BadModule_stuckTBM);
253  }
254 
255  // change module error type if all ROCs are bad
256  if(BadRocList_FEDerror25.size()==sensorSize_[detid])
257  BadModule_FEDerror25.errorType = 0;
258 
259  short badrocs_FEDerror25 = 0;
260  for(std::vector<uint32_t>::iterator iter = BadRocList_FEDerror25.begin(); iter != BadRocList_FEDerror25.end(); ++iter){
261  badrocs_FEDerror25 += 1 << *iter; // 1 << *iter = 2^{*iter} using bitwise shift
262  }
263  // fill the badmodule only if there is(are) bad ROC(s) in it
264  if(badrocs_FEDerror25!=0){
265  BadModule_FEDerror25.BadRocs = badrocs_FEDerror25;
266  siPixelQuality_FEDerror25->addDisabledModule(BadModule_FEDerror25);
267  }
268 
269  } // loop over modules
270 
271  siPixelQualityStuckTBM_Tag[it->first] = siPixelQuality_stuckTBM;
272 
273  finalIOV[it->first] = it->first;
274  fedError25IOV[it->first] = it->first;
275 
276  if(debug_==true) // only produced for debugging reason
277  poolDbService->writeOne<SiPixelQuality>(siPixelQuality_FEDerror25, thisIOV, recordName_+"_FEDerror25");
278 
279  delete siPixelQuality_FEDerror25;
280 
281  }
282 
283  // IOV for PCL output tags that "combines" permanent bad/stuckTBM/other
284  for(SiPixelStatusManager::siPixelStatusMap_iterator it=siPixelStatusMap.begin(); it!=siPixelStatusMap.end();it++){
285  finalIOV[it->first] = it->first;
286  pclIOV[it->first] = it->first;
287  }
288 
289  // loop over final IOV
290  std::map<edm::LuminosityBlockNumber_t, edm::LuminosityBlockNumber_t>::iterator itIOV;
291 
292  // container for SiPixelQuality for the whole run
293  std::map<int, SiPixelQuality*> siPixelQualityPCL_Tag;
294  std::map<int, SiPixelQuality*> siPixelQualityPrompt_Tag;
295  std::map<int, SiPixelQuality*> siPixelQualityOther_Tag;
296 
297  for(itIOV=finalIOV.begin();itIOV!=finalIOV.end();itIOV++){
298 
299  int interval = 0;
300  std::map<edm::LuminosityBlockNumber_t, edm::LuminosityBlockNumber_t>::iterator nextItIOV = std::next(itIOV);
301  if(nextItIOV!=finalIOV.end()) interval = int(nextItIOV->first - itIOV->first);
302  else interval = int(endLumiBlock_ - itIOV->first + 1);
303 
304  edm::LuminosityBlockNumber_t lumiFEDerror25 = SiPixelStatusHarvester::stepIOV(itIOV->first,fedError25IOV);
305  edm::LuminosityBlockNumber_t lumiPCL = SiPixelStatusHarvester::stepIOV(itIOV->first,pclIOV);
306 
307  // get badROC list due to FEDerror25 = stuckTBM + permanent bad components
308  std::map<int, std::vector<int> > tmpFEDerror25 = FEDerror25Map[lumiFEDerror25];
309  // get SiPixelDetectorStatus
310  SiPixelDetectorStatus tmpSiPixelStatus = siPixelStatusMap[lumiPCL];
311  double DetAverage = tmpSiPixelStatus.perRocDigiOcc();
312 
313  // For the IOV of which the statistics is too low, for e.g., a cosmic run
314  // When using dynamicLumibased harvester or runbased harvester
315  // this only happens when the full run is lack of statistics
316  if(DetAverage<aveDigiOcc_) {
317 
318  edm::LogInfo("SiPixelStatusHarvester")
319  << "Tag requested for prompt in low statistics IOV in the "<<outputBase_<<" harvester"<< std::endl;
320  siPixelQualityPCL_Tag[itIOV->first] = siPixelQualityPermBad;
321  siPixelQualityPrompt_Tag[itIOV->first] = siPixelQualityPermBad;
322 
323  // add empty bad components to "other" tag
324  edm::LogInfo("SiPixelStatusHarvester")
325  << "Tag requested for other in low statistics IOV in the "<<outputBase_<<" harvester"<< std::endl;
326  siPixelQualityOther_Tag[itIOV->first] = new SiPixelQuality();
327 
328  continue;
329 
330  }
331 
333 
334  // create the DB object
335  // payload including all : PCL = permanent bad (low DIGI ROC) + other + stuckTBM
336  SiPixelQuality *siPixelQualityPCL = new SiPixelQuality();
337  SiPixelQuality *siPixelQualityOther = new SiPixelQuality();
338  // Prompt = permanent bad(low DIGI + low eff/damaged ROCs + other)
339  SiPixelQuality *siPixelQualityPrompt = new SiPixelQuality();
340 
341  // loop over modules
342  std::map<int, SiPixelModuleStatus> detectorStatus = tmpSiPixelStatus.getDetectorStatus();
343  std::map<int, SiPixelModuleStatus>::iterator itModEnd = detectorStatus.end();
344  for (std::map<int, SiPixelModuleStatus>::iterator itMod = detectorStatus.begin(); itMod != itModEnd; ++itMod) {
345 
346  // create the bad module list for PCL and other
347  SiPixelQuality::disabledModuleType BadModulePCL, BadModuleOther;
348 
349  int detid = itMod->first;
350  uint32_t detId = uint32_t(detid);
351 
352  BadModulePCL.DetID = uint32_t(detid); BadModuleOther.DetID = uint32_t(detid);
353  BadModulePCL.errorType = 3; BadModuleOther.errorType = 3;
354  BadModulePCL.BadRocs = 0; BadModuleOther.BadRocs = 0;
355 
356  std::vector<uint32_t> BadRocListPCL, BadRocListOther;
357 
358  // module status and FEDerror25 status for module with DetId detId
359  SiPixelModuleStatus modStatus = itMod->second;
360  std::vector<int> listFEDerror25 = tmpFEDerror25[detid];
361 
362  for (int iroc = 0; iroc < modStatus.nrocs(); ++iroc) {
363 
364  unsigned int rocOccupancy = modStatus.digiOccROC(iroc);
365 
366  // Bad ROC are from low DIGI Occ ROCs
367  if(rocOccupancy<1.e-4*DetAverage){ // if BAD
368 
369  std::map<int, std::pair<int,int> > rocToOfflinePixel = pixelO2O_[detid];
370  int row = rocToOfflinePixel[iroc].first;
371  int column = rocToOfflinePixel[iroc].second;
372 
373  //PCL bad roc list
374  BadRocListPCL.push_back(uint32_t(iroc));
375  for (int iLumi = 0; iLumi<interval;iLumi++){
376  histo[BADROC].fill(detId, nullptr, column, row);//, 1.0/nLumiBlock_);
377  }
378 
379  //FEDerror25 list
380  std::vector<int>::iterator it = std::find(listFEDerror25.begin(), listFEDerror25.end(),iroc);
381 
382  // other source of bad components = PCL bad - FEDerror25 - permanent bad
383  if(it==listFEDerror25.end() && !(badPixelInfo_->IsRocBad(detId, short(iroc)))){
384  // if neither permanent nor FEDerror25
385  BadRocListOther.push_back(uint32_t(iroc));
386  for (int iLumi = 0; iLumi<interval;iLumi++){
387  histo[OTHERBADROC].fill(detId, nullptr, column, row);//, 1.0/nLumiBlock_);
388  }
389  }
390 
391  }// if BAD
392 
393  } // loop over ROCs
394 
395  // errorType 0 means the full module is bad
396  if(BadRocListPCL.size()==sensorSize_[detid]) BadModulePCL.errorType = 0;
397  if(BadRocListOther.size()==sensorSize_[detid]) BadModuleOther.errorType = 0;
398 
399  // PCL
400  short badrocsPCL = 0;
401  for(std::vector<uint32_t>::iterator iterPCL = BadRocListPCL.begin(); iterPCL != BadRocListPCL.end(); ++iterPCL){
402  badrocsPCL += 1 << *iterPCL; // 1 << *iter = 2^{*iter} using bitwise shift
403  }
404  if(badrocsPCL!=0){
405  BadModulePCL.BadRocs = badrocsPCL;
406  siPixelQualityPCL->addDisabledModule(BadModulePCL);
407  }
408 
409  // Other
410  short badrocsOther = 0;
411  for(std::vector<uint32_t>::iterator iterOther = BadRocListOther.begin(); iterOther != BadRocListOther.end(); ++iterOther){
412  badrocsOther += 1 << *iterOther; // 1 << *iter = 2^{*iter} using bitwise shift
413  }
414  if(badrocsOther!=0){
415  BadModuleOther.BadRocs = badrocsOther;
416  siPixelQualityOther->addDisabledModule(BadModuleOther);
417  }
418 
419  // start constructing bad components for prompt = "other" + permanent
420  SiPixelQuality::disabledModuleType BadModulePrompt;
421  BadModulePrompt.DetID = uint32_t(detid);
422  BadModulePrompt.errorType = 3;
423  BadModulePrompt.BadRocs = 0;
424 
425  std::vector<uint32_t> BadRocListPrompt;
426  for (int iroc = 0; iroc < modStatus.nrocs(); ++iroc) {
427  // if in permannet bad tag or is in other tag
428  if(badPixelInfo_->IsRocBad(detId, short(iroc))|| ((badrocsOther >> short(iroc))&0x1)){
429  BadRocListPrompt.push_back(uint32_t(iroc));
430 
431  std::map<int, std::pair<int,int> > rocToOfflinePixel = pixelO2O_[detid];
432  int row = rocToOfflinePixel[iroc].first;
433  int column = rocToOfflinePixel[iroc].second;
434  for (int iLumi = 0; iLumi<interval;iLumi++){
435  histo[PROMPTBADROC].fill(detId, nullptr, column, row);//, 1.0/nLumiBlock_);
436  }
437  } // if bad
438  } // loop over all ROCs
439 
440  // errorType 0 means the full module is bad
441  if(BadRocListPrompt.size()==sensorSize_[detid]) BadModulePrompt.errorType = 0;
442 
443  short badrocsPrompt = 0;
444  for(std::vector<uint32_t>::iterator iterPrompt = BadRocListPrompt.begin(); iterPrompt != BadRocListPrompt.end(); ++iterPrompt){
445  badrocsPrompt += 1 << *iterPrompt; // 1 << *iter = 2^{*iter} using bitwise shift
446  }
447  if(badrocsPrompt!=0){
448  BadModulePrompt.BadRocs = badrocsPrompt;
449  siPixelQualityPrompt->addDisabledModule(BadModulePrompt);
450  }
451 
452  } // end module loop
453 
454  // PCL
455  siPixelQualityPCL_Tag[itIOV->first] = siPixelQualityPCL;
456  // Prompt
457  siPixelQualityPrompt_Tag[itIOV->first] = siPixelQualityPrompt;
458  // Other
459  siPixelQualityOther_Tag[itIOV->first] = siPixelQualityOther;
460 
461  }// loop over IOV
462 
463  // Now construct the tags made of payloads
464  // and only append newIOV if this payload differs wrt last
465 
466  //PCL
467  if(debug_==true)// only produced for debugging reason
468  SiPixelStatusHarvester::constructTag(siPixelQualityPCL_Tag, poolDbService, "PCL", iRun);
469  // other
470  SiPixelStatusHarvester::constructTag(siPixelQualityOther_Tag, poolDbService, "other", iRun);
471  // prompt
472  SiPixelStatusHarvester::constructTag(siPixelQualityPrompt_Tag, poolDbService, "prompt", iRun);
473  // stuckTBM
474  SiPixelStatusHarvester::constructTag(siPixelQualityStuckTBM_Tag, poolDbService, "stuckTBM", iRun);
475 
476  // Add a dummy IOV starting from last lumisection+1 to close the tag for the run
477  if(outputBase_ == "nLumibased" || outputBase_ == "dynamicLumibased"){
478 
480  cond::Time_t thisIOV = (cond::Time_t)(lu.value());
481  poolDbService->writeOne<SiPixelQuality>(siPixelQualityPermBad, thisIOV, recordName_+"_prompt");
482 
483  // add empty bad components to "other" tag
484  SiPixelQuality* siPixelQualityDummy = new SiPixelQuality();
485  poolDbService->writeOne<SiPixelQuality>(siPixelQualityDummy, thisIOV, recordName_+"_other");
486  delete siPixelQualityDummy;
487  }
488 
489  delete siPixelQualityPermBad;
490 
491  } // end of if(poolDbService.isAvailable() )
492 
493 }
494 
495 //--------------------------------------------------------------------------------------------------
497  countLumi_++;
498 }
499 
500 
501 //--------------------------------------------------------------------------------------------------
503 
505  // update endLumiBlock_ by current lumi block
506  if(endLumiBlock_<iLumi.luminosityBlock())
507  endLumiBlock_ = iLumi.luminosityBlock();
508 
509 }
510 
511 // step function for IOV
512 edm::LuminosityBlockNumber_t SiPixelStatusHarvester::stepIOV(edm::LuminosityBlockNumber_t pin, std::map<edm::LuminosityBlockNumber_t,edm::LuminosityBlockNumber_t> IOV){
513 
514  std::map<edm::LuminosityBlockNumber_t, edm::LuminosityBlockNumber_t>::iterator itIOV;
515  for(itIOV=IOV.begin();itIOV!=IOV.end();itIOV++){
516  std::map<edm::LuminosityBlockNumber_t, edm::LuminosityBlockNumber_t>::iterator nextItIOV;
517  nextItIOV = itIOV; nextItIOV++;
518 
519  if(nextItIOV!=IOV.end()){
520  if(pin>=itIOV->first && pin<nextItIOV->first){
521  return itIOV->first;
522  }
523  }
524  else{
525  if(pin>=itIOV->first){
526  return itIOV->first;
527  }
528  }
529 
530  }
531 
532  // return the firstIOV in case all above fail
533  return (IOV.begin())->first;
534 
535 }
536 
538 
539  std::vector<SiPixelQuality::disabledModuleType> badRocListA;
540  std::vector<SiPixelQuality::disabledModuleType> badRocListB;
541 
542  for(unsigned int ia = 0; ia < (a->getBadComponentList()).size();ia++){
543  badRocListA.push_back((a->getBadComponentList())[ia]);
544  }
545  for(unsigned int ib = 0; ib < (b->getBadComponentList()).size();ib++){
546  badRocListB.push_back((b->getBadComponentList())[ib]);
547  }
548 
549  if(badRocListA.size()!=badRocListB.size()) return false;
550 
551  // ordering ROCs by DetId
552  std::sort(badRocListA.begin(),badRocListA.end(),SiPixelQuality::BadComponentStrictWeakOrdering());
553  std::sort(badRocListB.begin(),badRocListB.end(),SiPixelQuality::BadComponentStrictWeakOrdering());
554 
555  for(unsigned int i = 0; i<badRocListA.size();i++){
556 
557  uint32_t detIdA = badRocListA[i].DetID;
558  uint32_t detIdB = badRocListB[i].DetID;
559  if(detIdA!=detIdB) return false;
560  else{
561  unsigned short BadRocsA = badRocListA[i].BadRocs;
562  unsigned short BadRocsB = badRocListA[i].BadRocs;
563  if(BadRocsA!=BadRocsB) return false;
564  }
565 
566  }
567 
568  //if the module list is the same, and for each module, roc list is the same
569  //the two SiPixelQualitys are equal
570  return true;
571 
572 
573 }
574 
575 void SiPixelStatusHarvester::constructTag(std::map<int,SiPixelQuality*>siPixelQualityTag, edm::Service<cond::service::PoolDBOutputService>& poolDbService, std::string tagName,edm::Run& iRun){
576 
577  for (std::map<int, SiPixelQuality*>::iterator qIt = siPixelQualityTag.begin(); qIt != siPixelQualityTag.end(); ++qIt) {
578 
579  edm::LuminosityBlockID lu(iRun.id().run(),qIt->first);
580  cond::Time_t thisIOV = (cond::Time_t)(lu.value());
581 
582  SiPixelQuality* thisPayload = qIt->second;
583  if(qIt==siPixelQualityTag.begin())
584  poolDbService->writeOne<SiPixelQuality>(thisPayload, thisIOV, recordName_+"_"+tagName);
585  else{
586  SiPixelQuality* prevPayload = (std::prev(qIt))->second;
587  if(!SiPixelStatusHarvester::equal(thisPayload,prevPayload)) // only append newIOV if this payload differs wrt last
588  poolDbService->writeOne<SiPixelQuality>(thisPayload, thisIOV, recordName_+"_"+tagName);
589  }
590  }
591 
592 }
593 
void endLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) final
size
Write out results.
void addDisabledModule(disabledModuleType module)
T getUntrackedParameter(std::string const &, T const &) const
virtual int nrows() const =0
virtual int rowsperroc() const =0
RunID const & id() const
Definition: RunBase.h:39
bool equal(SiPixelQuality *a, SiPixelQuality *b)
std::map< int, unsigned int > sensorSize_
void constructTag(std::map< int, SiPixelQuality * >siPixelQualityTag, edm::Service< cond::service::PoolDBOutputService > &poolDbService, std::string tagName, edm::Run &iRun)
RunNumber_t run() const
Definition: RunID.h:39
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
const std::map< edm::LuminosityBlockNumber_t, std::map< int, std::vector< int > > > & getFEDerror25Rocs()
edm::LuminosityBlockNumber_t endLumiBlock_
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:47
virtual std::map< uint32_t, std::vector< sipixelobjects::CablingPathToDetUnit > > det2PathMap() const =0
bool IsRocBad(const uint32_t &detid, const short &rocNb) const
edm::LuminosityBlockNumber_t stepIOV(edm::LuminosityBlockNumber_t pin, std::map< edm::LuminosityBlockNumber_t, edm::LuminosityBlockNumber_t > IOV)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
unsigned int LuminosityBlockNumber_t
SiPixelStatusManager siPixelStatusManager_
identify pixel inside single ROC
Definition: LocalPixel.h:7
global coordinates (row and column in DetUnit, as in PixelDigi)
Definition: GlobalPixel.h:6
LuminosityBlockNumber_t luminosityBlock() const
U second(std::pair< T, U > const &p)
const DetContainer & dets() const override
Returm a vector of all GeomDet (including all GeomDetUnits)
int iEvent
Definition: GenABIO.cc:230
unsigned long long Time_t
Definition: Time.h:16
virtual int colsperroc() const =0
const SiPixelQuality * badPixelInfo_
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
unsigned int idInDetUnit() const
id of this ROC in DetUnit etermined by token path
Definition: PixelROC.h:40
bool isAvailable() const
Definition: Service.h:46
void writeOne(T *payload, Time_t time, const std::string &recordName, bool withlogging=false)
const std::vector< disabledModuleType > getBadComponentList() const
const SiPixelFedCabling * cablingMap_
std::vector< LinkConnSpec >::const_iterator IT
const TrackerGeometry * trackerGeometry_
void endRunProduce(edm::Run &, const edm::EventSetup &) final
std::map< int, SiPixelModuleStatus > getDetectorStatus()
std::map< edm::LuminosityBlockNumber_t, std::map< int, std::vector< int > > >::iterator FEDerror25Map_iterator
Definition: DetId.h:18
virtual const sipixelobjects::PixelROC * findItem(const sipixelobjects::CablingPathToDetUnit &) const =0
SiPixelStatusHarvester(const edm::ParameterSet &)
virtual const PixelTopology & specificTopology() const
Returns a reference to the pixel proxy topology.
double b
Definition: hdecay.h:120
row and collumn in ROC representation
Definition: LocalPixel.h:15
std::map< int, std::map< int, std::pair< int, int > > > pixelO2O_
std::map< edm::LuminosityBlockNumber_t, SiPixelDetectorStatus >::iterator siPixelStatusMap_iterator
void beginLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) final
std::vector< HistogramManager > histo
HLT enums.
virtual int ncolumns() const =0
double a
Definition: hdecay.h:121
T get() const
Definition: EventSetup.h:63
unsigned int digiOccROC(int iroc)
return ROC status (= hits on ROC iroc)
void readLumi(const edm::LuminosityBlock &)
const std::map< edm::LuminosityBlockNumber_t, SiPixelDetectorStatus > & getBadComponents()
T const * product() const
Definition: ESHandle.h:86
void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) final
Definition: Run.h:44
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
ib
Definition: cuy.py:661
GlobalPixel toGlobal(const LocalPixel &loc) const
Definition: PixelROC.h:59