CMS 3D CMS Logo

SiStripMonitorDigi.cc
Go to the documentation of this file.
1 // -*- c++ -*-
4 // Original Author: Dorian Kcira
5 // Created: Sat Feb 4 20:49:10 CET 2006
6 // Updated: May 2020, Suvankar Roy Chowdhury
7 
8 // std library includes
9 #include <fstream>
10 #include <iostream>
11 
12 // root includes
13 #include "TNamed.h"
14 #include "TMath.h"
15 
16 // user file includes
43 
44 /* mia: but is there not a smarter way ?!?!?! */
45 namespace {
46  const double NORBITS_PER_LS = 262144.; // per-second value would be 11223
47 }
48 
49 //--------------------------------------------------------------------------------------------
51  : //dqmStore_(edm::Service<DQMStore>().operator->()),
52  conf_(iConfig),
53  show_mechanical_structure_view(true),
54  show_readout_view(false),
55  show_control_view(false),
56  select_all_detectors(true),
57  reset_each_run(false),
58  folder_organizer(),
59  m_cacheID_(0) {
60  firstEvent = -1;
61  eventNb = 0;
62 
63  // Detector Partitions
64  SubDetPhasePartMap["TIB"] = "TI";
65  SubDetPhasePartMap["TID__MINUS"] = "TI";
66  SubDetPhasePartMap["TID__PLUS"] = "TI";
67  SubDetPhasePartMap["TOB"] = "TO";
68  SubDetPhasePartMap["TEC__MINUS"] = "TM";
69  SubDetPhasePartMap["TEC__PLUS"] = "TP";
70 
71  topFolderName_ = conf_.getParameter<std::string>("TopFolderName");
72 
73  // get Digi Producer List
74  digiProducerList = conf_.getParameter<std::vector<edm::InputTag> >("DigiProducersList");
75  for (auto const& tag : digiProducerList) {
77  }
78 
79  //get on/off option for every cluster from cfi
80  edm::ParameterSet ParametersNumberOfDigis = conf_.getParameter<edm::ParameterSet>("TH1NumberOfDigis");
81  layerswitchnumdigison = ParametersNumberOfDigis.getParameter<bool>("layerswitchon");
82  moduleswitchnumdigison = ParametersNumberOfDigis.getParameter<bool>("moduleswitchon");
83 
84  edm::ParameterSet ParametersNumberOfDigisPerStrip = conf_.getParameter<edm::ParameterSet>("TH1NumberOfDigisPerStrip");
85  moduleswitchnumdigispstripon = ParametersNumberOfDigisPerStrip.getParameter<bool>("moduleswitchon");
86 
87  edm::ParameterSet ParametersADCsHottestStrip = conf_.getParameter<edm::ParameterSet>("TH1ADCsHottestStrip");
88  layerswitchadchotteston = ParametersADCsHottestStrip.getParameter<bool>("layerswitchon");
89  moduleswitchadchotteston = ParametersADCsHottestStrip.getParameter<bool>("moduleswitchon");
90 
91  edm::ParameterSet ParametersADCsCoolestStrip = conf_.getParameter<edm::ParameterSet>("TH1ADCsCoolestStrip");
92  layerswitchadccooleston = ParametersADCsCoolestStrip.getParameter<bool>("layerswitchon");
93  moduleswitchadccooleston = ParametersADCsCoolestStrip.getParameter<bool>("moduleswitchon");
94 
95  edm::ParameterSet ParametersDigiADCs = conf_.getParameter<edm::ParameterSet>("TH1DigiADCs");
96  layerswitchdigiadcson = ParametersDigiADCs.getParameter<bool>("layerswitchon");
97  moduleswitchdigiadcson = ParametersDigiADCs.getParameter<bool>("moduleswitchon");
98 
99  edm::ParameterSet ParametersStripOccupancy = conf_.getParameter<edm::ParameterSet>("TH1StripOccupancy");
100  layerswitchstripoccupancyon = ParametersStripOccupancy.getParameter<bool>("layerswitchon");
101  moduleswitchstripoccupancyon = ParametersStripOccupancy.getParameter<bool>("moduleswitchon");
102 
103  edm::ParameterSet ParametersDigiProf = conf_.getParameter<edm::ParameterSet>("TProfNumberOfDigi");
104  layerswitchnumdigisprofon = ParametersDigiProf.getParameter<bool>("layerswitchon");
105 
106  edm::ParameterSet ParametersDigiADC = conf_.getParameter<edm::ParameterSet>("TProfDigiADC");
107  layerswitchdigiadcprofon = ParametersDigiProf.getParameter<bool>("layerswitchon");
108 
109  edm::ParameterSet ParametersTotDigiProf = conf_.getParameter<edm::ParameterSet>("TProfTotalNumberOfDigis");
110  subdetswitchtotdigiprofon = ParametersTotDigiProf.getParameter<bool>("subdetswitchon");
111 
112  edm::ParameterSet ParametersTotDigiFailure = conf_.getParameter<edm::ParameterSet>("TotalNumberOfDigisFailure");
113  subdetswitchtotdigifailureon = ParametersTotDigiFailure.getParameter<bool>("subdetswitchon");
114 
115  edm::ParameterSet ParametersDigiApvProf = conf_.getParameter<edm::ParameterSet>("TProfDigiApvCycle");
116  subdetswitchapvcycleprofon = ParametersDigiApvProf.getParameter<bool>("subdetswitchon");
117 
118  edm::ParameterSet ParametersDigiApvTH2 = conf_.getParameter<edm::ParameterSet>("TH2DigiApvCycle");
119  subdetswitchapvcycleth2on = ParametersDigiApvTH2.getParameter<bool>("subdetswitchon");
120 
121  edm::ParameterSet ParametersNApvShots = conf_.getParameter<edm::ParameterSet>("TH1NApvShots");
122  subdetswitchnapvshotson = ParametersNApvShots.getParameter<bool>("subdetswitchon");
123 
124  edm::ParameterSet ParametersNStripApvShots = conf_.getParameter<edm::ParameterSet>("TH1NStripsApvShots");
125  subdetswitchnstripsapvshotson = ParametersNStripApvShots.getParameter<bool>("subdetswitchon");
126 
127  edm::ParameterSet ParametersChargeMedianApvShots = conf_.getParameter<edm::ParameterSet>("TH1ChargeMedianApvShots");
128  subdetswitchchargemedianapvshotson = ParametersChargeMedianApvShots.getParameter<bool>("subdetswitchon");
129 
130  edm::ParameterSet ParametersApvNumberApvShots = conf_.getParameter<edm::ParameterSet>("TH1ApvNumApvShots");
131  subdetswitchapvshotsApvon = ParametersChargeMedianApvShots.getParameter<bool>("subdetswitchon");
132 
133  edm::ParameterSet ParametersNApvShotsProf = conf_.getParameter<edm::ParameterSet>("TProfNShotsVsTime");
134  subdetswitchapvshotsonprof = ParametersNApvShotsProf.getParameter<bool>("subdetswitchon");
135 
136  //Global Histograms
137 
138  edm::ParameterSet ParametersGlobalNApvShots = conf_.getParameter<edm::ParameterSet>("TH1NApvShots");
139  globalswitchnapvshotson = ParametersGlobalNApvShots.getParameter<bool>("globalswitchon");
140 
141  edm::ParameterSet ParametersGlobalNApvShotsProf = conf_.getParameter<edm::ParameterSet>("TProfGlobalNShots");
142  globalsummaryapvshotson = ParametersGlobalNApvShotsProf.getParameter<bool>("globalswitchon");
143 
144  edm::ParameterSet ParametersGlobalNStripApvShots = conf_.getParameter<edm::ParameterSet>("TH1NStripsApvShots");
145  globalswitchnstripsapvshotson = ParametersGlobalNStripApvShots.getParameter<bool>("globalswitchon");
146 
147  edm::ParameterSet ParametersGlobalApvNumApvShots = conf_.getParameter<edm::ParameterSet>("TH1ApvNumApvShots");
148  globalswitchapvshotsApvon = ParametersGlobalApvNumApvShots.getParameter<bool>("globalswitchon");
149 
150  edm::ParameterSet ParametersGlobalChargeMedianApvShots =
151  conf_.getParameter<edm::ParameterSet>("TH1ChargeMedianApvShots");
152  globalswitchchargemedianapvshotson = ParametersGlobalChargeMedianApvShots.getParameter<bool>("globalswitchon");
153 
154  edm::ParameterSet ParametersGlobalNApvShotsTimeProf = conf_.getParameter<edm::ParameterSet>("TProfNShotsVsTime");
155  globalswitchapvshotsonprof = ParametersGlobalNApvShotsTimeProf.getParameter<bool>("globalswitchon");
156 
157  edm::ParameterSet ParametersGlobalNDigisFEDID = conf_.getParameter<edm::ParameterSet>("TProfNDigisFED");
158  globalswitchNDigisFEDID = ParametersGlobalNDigisFEDID.getParameter<bool>("globalswitchon");
159 
160  //Digi and APV Shots Maps
161 
162  digitkhistomapon = conf_.getParameter<bool>("TkHistoMap_On");
163 
164  shotshistomapon = conf_.getParameter<bool>("TkHistoMapNApvShots_On");
165  shotsstripshistomapon = conf_.getParameter<bool>("TkHistoMapNStripApvShots_On");
166  shotschargehistomapon = conf_.getParameter<bool>("TkHistoMapMedianChargeApvShots_On");
167 
168  createTrendMEs = conf_.getParameter<bool>("CreateTrendMEs");
169  Mod_On_ = conf_.getParameter<bool>("Mod_On");
170  m_trendVs10LS = conf_.getParameter<bool>("TrendVs10LS");
171  // xLumiProf = conf_.getParameter<int>("xLumiProf");
172  // Event History Producer
173  historyProducer_ = conf_.getParameter<edm::InputTag>("HistoryProducer");
174  historyProducerToken_ = consumes<EventWithHistory>(conf_.getParameter<edm::InputTag>("HistoryProducer"));
175 
176  // Apv Phase Producer
177  apvPhaseProducer_ = conf_.getParameter<edm::InputTag>("ApvPhaseProducer");
178  apvPhaseProducerToken_ = consumes<APVCyclePhaseCollection>(conf_.getParameter<edm::InputTag>("ApvPhaseProducer"));
179 
180  gtEvmToken_ = consumes<L1GlobalTriggerEvmReadoutRecord>(edm::InputTag("gtEvmDigis"));
181 
183  tTopoTokenRun_ = esConsumes<edm::Transition::BeginRun>();
184  tkDetMapTokenRun_ = esConsumes<edm::Transition::BeginRun>();
185  SiStripDetCablingTokenRun_ = esConsumes<edm::Transition::BeginRun>();
186  }
188  runInfoTokenRun_ = esConsumes<edm::Transition::BeginRun>();
189  }
191 
192  // Create DCS Status
193  bool checkDCS = conf_.getParameter<bool>("UseDCSFiltering");
194  if (checkDCS)
196  else
197  dcsStatus_ = nullptr;
198 
199  //initialize boolean for the data-presence check (needed for TotalNumberOfDigisFailure histogram)
200  SBTransitionDone = false;
201  SBDeclaredAt = 0;
202  ignoreFirstNLumisections_ = TMath::Max(0, ParametersTotDigiFailure.getParameter<int32_t>("ignoreFirstNLumisections"));
203  integrateNLumisections_ = TMath::Max(1, ParametersTotDigiFailure.getParameter<int32_t>("integrateNLumisections"));
204  vecSubDetTotDigiProfLS.reserve(7);
205 }
206 //------------------------------------------------------------------------------------------
207 
209  if (dcsStatus_)
210  delete dcsStatus_;
211 }
212 
215  unsigned long long cacheID = es.get<SiStripDetCablingRcd>().cacheIdentifier();
216  if (m_cacheID_ != cacheID) {
217  m_cacheID_ = cacheID;
218  edm::LogInfo("SiStripMonitorDigi") << "SiStripMonitorDigi::bookHistograms: "
219  << " Creating MEs for new Cabling ";
220  createMEs(ibooker, es);
221  }
222  } else if (reset_each_run) {
223  edm::LogInfo("SiStripMonitorDigi") << "SiStripMonitorDigi::bookHistograms: "
224  << " Resetting MEs ";
225  for (std::map<uint32_t, ModMEs>::const_iterator idet = DigiMEs.begin(); idet != DigiMEs.end(); idet++) {
226  ResetModuleMEs(idet->first);
227  }
228  }
229 }
230 
231 //--------------------------------------------------------------------------------------------
234  //get FED cabling to know if SiStrip is in DAQ or no
235  unsigned long long cacheID = es.get<SiStripDetCablingRcd>().cacheIdentifier();
236  if (m_cacheID_ != cacheID) {
237  m_cacheID_ = cacheID;
238  }
239 
240  //nFEDConnected = 0;
241  nFedTIB = 0;
242  nFedTIDm = 0;
243  nFedTIDp = 0;
244  nFedTECm = 0;
245  nFedTECp = 0;
246  nFedTOB = 0;
247 
248  //const int siStripFedIdMin = FEDNumbering::MINSiStripFEDID;
249  //const int siStripFedIdMax = FEDNumbering::MAXSiStripFEDID;
250 
251  if (auto runInfoRec = es.tryToGet<RunInfoRcd>()) {
252  edm::ESHandle<RunInfo> sumFED = runInfoRec->getHandle(runInfoTokenRun_);
253 
254  if (sumFED.isValid()) {
255  std::vector<int> FedsInIds = sumFED->m_fed_in;
256  for (unsigned int it = 0; it < FedsInIds.size(); ++it) {
257  int fedID = FedsInIds[it];
258  // if(fedID>=siStripFedIdMin && fedID<=siStripFedIdMax) ++nFEDConnected;
259  /* mia: but is there not a smarter way !?!?!? */
260  if (fedID >= 50 && fedID <= 133)
261  ++nFedTIB;
262  if (fedID >= 134 && fedID <= 148)
263  ++nFedTIDm;
264  if (fedID >= 149 && fedID <= 163)
265  ++nFedTIDp;
266  if (fedID >= 164 && fedID <= 259)
267  ++nFedTECm;
268  if (fedID >= 260 && fedID <= 355)
269  ++nFedTECp;
270  if (fedID >= 356 && fedID <= 489)
271  ++nFedTOB;
272  }
273  }
274  }
275  }
276 }
277 
278 //--------------------------------------------------------------------------------------------
280  const edm::EventSetup& es) const {
281  bool isStableBeams = false;
282  return std::make_shared<bool>(isStableBeams);
283 }
284 
285 //--------------------------------------------------------------------------------------------
287  unsigned int currentLS = lb.id().luminosityBlock();
288  const bool isStableBeams = luminosityBlockCache(lb.index());
289  if (subdetswitchtotdigifailureon && isStableBeams && !SBTransitionDone) {
291  SBTransitionDone = true;
292  }
293 
295  int nFeds[6] = {96, 96, 84, 15, 15, 134}; // tec- , tec+ , tib , tid- , tid+ , tob
296  int nFedsConnected[6] = {nFedTECm, nFedTECp, nFedTIB, nFedTIDm, nFedTIDp, nFedTOB};
297 
299  for (int ibin = 1; ibin < 7; ibin++) {
300  //the vector now has the sum from previous integrateNLumisections_
301  //whereas digiFailureMEs.SubDetTotDigiProfLS now has sum for all LS upto now.
304 
305  float fillvalue = 2;
306  if (isStableBeams
307  // && (int)lb.id().luminosityBlock() > ignoreFirstNLumisections_ //ignore first X lumisections for HV rampup
309  (float)nFedsConnected[ibin - 1] / nFeds[ibin - 1] > 0.5 && value < 50.) {
310  fillvalue = 1.01;
311  }
312  //account for integrated LS: fill previous bins as well
313  for (int fillbin = (int)currentLS - integrateNLumisections_ + 1; fillbin <= (int)currentLS; fillbin++)
314  digiFailureMEs.SubDetDigiFailures2D->Fill(fillbin, ibin - 1, fillvalue);
315  }
316  }
317  }
318 }
319 //--------------------------------------------------------------------------------------------
322  //Retrieve tracker topology from geometry
323  const TrackerTopology* const tTopo = &es.getData(tTopoTokenRun_);
324  const TkDetMap* tkDetMap = &es.getData(tkDetMapTokenRun_);
325 
326  // take from eventSetup the SiStripDetCabling object - here will use SiStripDetControl later on
328 
329  // get list of active detectors from SiStripDetCabling
330  std::vector<uint32_t> activeDets;
331  activeDets.clear(); // just in case
333 
334  // remove any eventual zero elements - there should be none, but just in case
335  for (std::vector<uint32_t>::iterator idets = activeDets.begin(); idets != activeDets.end(); idets++) {
336  if (*idets == 0)
337  activeDets.erase(idets);
338  }
339 
340  // create SiStripFolderOrganizer
342 
343  // Create TkHistoMap for Digi and APV shots properies
344 
345  if (digitkhistomapon)
346  tkmapdigi = std::make_unique<TkHistoMap>(tkDetMap, ibooker, topFolderName_, "TkHMap_NumberOfDigi", 0.0, true);
347  if (shotshistomapon)
348  tkmapNApvshots = std::make_unique<TkHistoMap>(tkDetMap, ibooker, topFolderName_, "TkHMap_NApvShots", 0.0, true);
351  std::make_unique<TkHistoMap>(tkDetMap, ibooker, topFolderName_, "TkHMap_NStripApvShots", 0.0, true);
354  std::make_unique<TkHistoMap>(tkDetMap, ibooker, topFolderName_, "TkHMap_MedianChargeApvShots", 0.0, true);
355 
356  std::vector<uint32_t> tibDetIds;
357 
358  // loop over detectors and book MEs
359  edm::LogInfo("SiStripTkDQM|SiStripMonitorDigi") << "nr. of activeDets: " << activeDets.size();
360  for (std::vector<uint32_t>::const_iterator detid_iterator = activeDets.begin(); detid_iterator != activeDets.end();
361  detid_iterator++) {
362  uint32_t detid = (*detid_iterator);
363 
364  ModMEs local_modmes;
365 
366  local_modmes.NumberOfDigis = nullptr;
367  local_modmes.NumberOfDigisPerStrip = nullptr;
368  local_modmes.ADCsHottestStrip = nullptr;
369  local_modmes.ADCsCoolestStrip = nullptr;
370  local_modmes.DigiADCs = nullptr;
371  local_modmes.StripOccupancy = nullptr;
372 
373  if (Mod_On_) {
374  // set appropriate folder using SiStripFolderOrganizer
375  folder_organizer.setDetectorFolder(detid, tTopo); // pass the detid to this method
376  if (reset_each_run)
377  ResetModuleMEs(detid);
378  createModuleMEs(ibooker, local_modmes, detid);
379 
380  // append to DigiMEs
381  DigiMEs.insert(std::make_pair(detid, local_modmes));
382  }
383 
384  // Create Layer Level MEs if they are not created already
385  std::pair<std::string, int32_t> det_layer_pair = folder_organizer.GetSubDetAndLayer(detid, tTopo);
386  SiStripHistoId hidmanager;
387  std::string label = hidmanager.getSubdetid(detid, tTopo, false);
388 
389  // get detids for the layer
390  std::map<std::string, LayerMEs>::iterator iLayerME = LayerMEsMap.find(label);
391 
392  if (iLayerME == LayerMEsMap.end()) {
393  int32_t lnumber = det_layer_pair.second;
394  std::vector<uint32_t> layerDetIds;
395  if (det_layer_pair.first == "TIB") {
396  SiStripSubStructure::getTIBDetectors(activeDets, layerDetIds, tTopo, lnumber, 0, 0, 0);
397  } else if (det_layer_pair.first == "TOB") {
398  SiStripSubStructure::getTOBDetectors(activeDets, layerDetIds, tTopo, lnumber, 0, 0);
399  } else if (det_layer_pair.first == "TID" && lnumber > 0) {
400  SiStripSubStructure::getTIDDetectors(activeDets, layerDetIds, tTopo, 2, abs(lnumber), 0, 0);
401  } else if (det_layer_pair.first == "TID" && lnumber < 0) {
402  SiStripSubStructure::getTIDDetectors(activeDets, layerDetIds, tTopo, 1, abs(lnumber), 0, 0);
403  } else if (det_layer_pair.first == "TEC" && lnumber > 0) {
404  SiStripSubStructure::getTECDetectors(activeDets, layerDetIds, tTopo, 2, abs(lnumber), 0, 0, 0, 0);
405  } else if (det_layer_pair.first == "TEC" && lnumber < 0) {
406  SiStripSubStructure::getTECDetectors(activeDets, layerDetIds, tTopo, 1, abs(lnumber), 0, 0, 0, 0);
407  }
408 
409  LayerDetMap[label] = layerDetIds;
410 
411  // book Layer plots
412  folder_organizer.setLayerFolder(detid, tTopo, det_layer_pair.second);
413  createLayerMEs(ibooker, label, layerDetIds.size());
414  }
415 
416  // book sub-detector plots
417  auto sdet_pair = folder_organizer.getSubDetFolderAndTag(detid, tTopo);
418  if (SubDetMEsMap.find(sdet_pair.second) == SubDetMEsMap.end()) {
419  ibooker.setCurrentFolder(sdet_pair.first);
420  createSubDetMEs(ibooker, sdet_pair.second);
421  }
422 
423  } //end of loop over detectors
424 
425  //book some Summary histograms on APV shots in the MechanicalView
426 
427  ibooker.setCurrentFolder(topFolderName_ + "/MechanicalView/");
428 
430  const char* HistoName = "Summary Mean Apv shots for SubDets";
431  NApvShotsGlobalProf = ibooker.bookProfile(HistoName, HistoName, 6, 0.5, 6.5, 100, 0., 0., "");
438  NApvShotsGlobalProf->setAxisTitle(" mean APV shots # / evt", 2);
439  }
440 
441  //cumulative number of APV shots Vs Time
444  const char* HistoName = "NApv_Shots_vs_Time";
445  ShotsVsTimeApvShotsGlobal = ibooker.bookProfile(HistoName,
446  HistoName,
447  Parameters.getParameter<int32_t>("Nbins"),
448  Parameters.getParameter<double>("xmin"),
449  Parameters.getParameter<double>("xmax"),
450  200, //that parameter should not be there !?
451  Parameters.getParameter<double>("ymin"),
452  Parameters.getParameter<double>("ymax"),
453  "");
454  ShotsVsTimeApvShotsGlobal->setAxisTitle("Time (s)", 1);
455  ShotsVsTimeApvShotsGlobal->setAxisTitle("# Apv Shots", 2);
457  ShotsVsTimeApvShotsGlobal->setCanExtend(TH1::kAllAxes);
458  }
459 
460  //cumulative number of Strips in APV shots
463  const char* HistoName = "Number_of_Strips_in_Apv_Shots";
465  HistoName,
466  Parameters.getParameter<int32_t>("Nbins"),
467  Parameters.getParameter<double>("xmin"),
468  Parameters.getParameter<double>("xmax"));
469  StripMultiplicityApvShotsGlobal->setAxisTitle("# strips in Apv Shots", 1);
470  }
471 
472  //cumulative number of APV shots
475  const char* HistoName = "Number_of_Apv_Shots";
476  NApvShotsGlobal = ibooker.book1D(HistoName,
477  HistoName,
478  Parameters.getParameter<int32_t>("Nbins"),
479  Parameters.getParameter<double>("xmin"),
480  Parameters.getParameter<double>("xmax"));
481  NApvShotsGlobal->setAxisTitle("# Apv Shots", 1);
482  }
483 
484  //cumulative Median Charge in APV shots
486  edm::ParameterSet Parameters = conf_.getParameter<edm::ParameterSet>("TH1ChargeMedianApvShots");
487  //dqmStore_->setCurrentFolder("SiStrip/MechanicalView/"+label);
488  const char* HistoName = "Apv_Shots_Charge_Median";
489  MedianChargeApvShotsGlobal = ibooker.book1D(HistoName,
490  HistoName,
491  Parameters.getParameter<int32_t>("Nbins"),
492  Parameters.getParameter<double>("xmin"),
493  Parameters.getParameter<double>("xmax"));
494  MedianChargeApvShotsGlobal->setAxisTitle("Apv Shots Charge Median (ADC)", 1);
495  }
496 
497  //cmulative APV number with shots
500  //dqmStore_->setCurrentFolder("SiStrip/MechanicalView/"+label);
501  const char* HistoName = "Apv_Shots_Apv_Number";
502  NApvApvShotsGlobal = ibooker.book1D(HistoName,
503  HistoName,
504  Parameters.getParameter<int32_t>("Nbins"),
505  Parameters.getParameter<double>("xmin"),
506  Parameters.getParameter<double>("xmax"));
507  NApvApvShotsGlobal->setAxisTitle("Apv Number", 1);
508  }
509 
511  // Number of digis per FED
512  edm::ParameterSet FEDDigi = conf_.getParameter<edm::ParameterSet>("TProfNDigisFED");
513  const char* HistoName = "NumberOfDigisinFED_v_FEDID";
514  //Using TProfile for average.
515  NumberOfFEDDigis = ibooker.bookProfile(HistoName,
516  HistoName,
517  FEDDigi.getParameter<int32_t>("Nbinsx"),
518  FEDDigi.getParameter<double>("xmin"),
519  FEDDigi.getParameter<double>("xmax"),
520  FEDDigi.getParameter<int32_t>("Nbinsy"),
521  FEDDigi.getParameter<double>("ymin"),
522  FEDDigi.getParameter<double>("ymax"),
523  "");
524  NumberOfFEDDigis->setAxisTitle("FED ID", 1);
525  NumberOfFEDDigis->setAxisTitle("Mean # of Digis in FED", 2);
526  }
527 
528  //
529  // Book new histogram to monitor digi in last LS
530  //
531 
534 
535  std::stringstream ss;
536 
538  ibooker.setCurrentFolder(ss.str());
539 
541  const char* HistoName = "NumberOfDigisInLastLS";
542  digiFailureMEs.SubDetTotDigiProfLS = ibooker.bookProfile(HistoName, HistoName, 6, 0.5, 6.5, 0., 0., "");
549  }
550 
552  std::string HistoName = "DataPresentInLS";
553  edm::ParameterSet Parameters = conf_.getParameter<edm::ParameterSet>("TotalNumberOfDigisFailure");
554 
556  HistoName,
557  Parameters.getParameter<int32_t>("Nbins"), //bins X
558  1, //xmin
559  Parameters.getParameter<int32_t>("Nbins") + 1, //xmax
560  6, //bins Y
561  0, //ymin
562  6); //ymax
563 
570  digiFailureMEs.SubDetDigiFailures2D->setAxisTitle("Luminosity Section");
571  }
572  } //end of if
573 
574 } //end of method
575 
576 //--------------------------------------------------------------------------------------------
578  // Filter out events if DCS Event if requested
579  if (dcsStatus_ && !dcsStatus_->getStatus(iEvent, iSetup))
580  return;
581 
582  //Retrieve tracker topology from geometry
583  const TrackerTopology* const tTopo = &iSetup.getData(tTopoToken_);
584 
585  TotalNShots = 0;
586 
587  runNb = iEvent.id().run();
588  eventNb++;
589 
590  float iOrbitVar =
591  m_trendVs10LS ? iEvent.orbitNumber() / (10 * NORBITS_PER_LS) : iEvent.orbitNumber() / NORBITS_PER_LS;
592 
593  digi_detset_handles.clear();
594 
595  std::vector<edm::EDGetTokenT<edm::DetSetVector<SiStripDigi> > >::const_iterator iToken =
596  digiProducerTokenList.begin();
597  for (std::vector<edm::InputTag>::const_iterator iter = digiProducerList.begin(), iEnd = digiProducerList.end();
598  iter != iEnd;
599  ++iter, ++iToken) {
601  iEvent.getByToken(*iToken, digi_handle);
602  if (digi_handle.isValid())
603  digi_detset_handles.push_back(digi_handle.product());
604  }
605 
606  // initialise # of clusters to zero
607  for (std::map<std::string, SubDetMEs>::iterator iSubdet = SubDetMEsMap.begin(); iSubdet != SubDetMEsMap.end();
608  iSubdet++) {
609  iSubdet->second.totNDigis = 0;
610  iSubdet->second.SubDetApvShots.clear();
611  }
612 
613  std::map<int, int> FEDID_v_digisum;
614 
615  for (std::map<std::string, std::vector<uint32_t> >::const_iterator iterLayer = LayerDetMap.begin();
616  iterLayer != LayerDetMap.end();
617  iterLayer++) {
618  std::string layer_label = iterLayer->first;
619 
620  std::vector<uint32_t> layer_dets = iterLayer->second;
621  std::map<std::string, LayerMEs>::iterator iLayerME = LayerMEsMap.find(layer_label);
622 
623  //get Layer MEs
624  LayerMEs local_layermes;
625 
626  if (iLayerME == LayerMEsMap.end())
627  continue;
628  else
629  local_layermes = iLayerME->second;
630 
631  int largest_adc_layer = 0;
632  int smallest_adc_layer = 99999;
633 
634  int ndigi_layer = 0;
635 
636  uint16_t iDet = 0;
637 
638  std::string subdet_label = "";
639 
640  // loop over all modules in the layer
641  for (std::vector<uint32_t>::const_iterator iterDets = layer_dets.begin(); iterDets != layer_dets.end();
642  iterDets++) {
643  iDet++;
644 
645  // detid and type of ME
646  uint32_t detid = (*iterDets);
647 
648  // Get SubDet label once
649  if (subdet_label.empty())
650  subdet_label = folder_organizer.getSubDetFolderAndTag(detid, tTopo).second;
651 
652  // DetId and corresponding set of MEs
653 
654  std::map<uint32_t, ModMEs>::iterator pos = DigiMEs.find(detid);
655  ModMEs local_modmes = pos->second;
656 
657  // search digis of detid
658  int loc = getDigiSourceIndex(detid);
659 
660  int ndigi_det = 0;
661 
662  if (loc > -1) {
663  ndigi_det = (*(digi_detset_handles[loc]))[detid].size();
664 
666 
667  //Get all FED connections associated with given detID.
668  // All connections for a detid have same FED Id therefore one FEDID is associated with a given detID.
669  std::vector<const FedChannelConnection*> fedConnections = SiStripDetCabling_->getConnections(detid);
670 
671  // Filling FED Id associated clusters map.
672 
673  int good_fcc_index = -999;
674  for (unsigned int x = 0; x < fedConnections.size(); x++) {
675  if (fedConnections[x] != nullptr) {
676  good_fcc_index = x;
677  break;
678  }
679  }
680  if (fedConnections[good_fcc_index] != nullptr) {
681  int temp_fedid = fedConnections[good_fcc_index]->fedId();
682  if (FEDID_v_digisum.find(temp_fedid) != FEDID_v_digisum.end()) {
683  if (ndigi_det < 1000 && ndigi_det > 0) {
684  FEDID_v_digisum[temp_fedid] = FEDID_v_digisum.find(temp_fedid)->second + ndigi_det;
685  }
686  } else {
687  if (ndigi_det < 1000 && ndigi_det > 0) {
688  FEDID_v_digisum[temp_fedid] = ndigi_det;
689  }
690  }
691  } else {
692  edm::LogInfo("SiStripMonitorDigi")
693  << "SiStripMonitorDigi::analyze WARNING! no good connections for detid = " << detid << std::endl;
694  }
696 
697  APVShotFinder theShotFinder = APVShotFinder((*(digi_detset_handles[loc]))[detid]);
698  const std::vector<APVShot>& shots = theShotFinder.getShots();
699  AddApvShotsToSubDet(shots, SubDetMEsMap[subdet_label].SubDetApvShots);
700  if (shotshistomapon)
701  tkmapNApvshots->fill(detid, shots.size());
703  FillApvShotsMap(tkmapNstripApvshot.get(), shots, detid, 1);
705  FillApvShotsMap(tkmapMedianChargeApvshots.get(), shots, detid, 2);
706  }
707 
708  if (Mod_On_ && moduleswitchnumdigison && (local_modmes.NumberOfDigis != nullptr))
709  (local_modmes.NumberOfDigis)->Fill(ndigi_det);
710 
712  local_layermes.LayerNumberOfDigisProfile->Fill(iDet * 1.0, ndigi_det);
713 
714  if (digitkhistomapon)
715  tkmapdigi->fill(detid, ndigi_det);
716 
717  if (ndigi_det == 0)
718  continue; // no digis for this detid => jump to next step of loop
719 
720  const edm::DetSet<SiStripDigi>& digi_detset = (*(digi_detset_handles[loc]))[detid];
721 
722  ndigi_layer += ndigi_det;
723 
724  // ADCs
725  int largest_adc = (digi_detset.data.begin())->adc();
726  int smallest_adc = (digi_detset.data.begin())->adc();
727 
728  // Check if these parameters are really needed
729  float det_occupancy = 0.0;
730 
731  for (edm::DetSet<SiStripDigi>::const_iterator digiIter = digi_detset.data.begin();
732  digiIter != digi_detset.data.end();
733  digiIter++) {
734  int this_adc = digiIter->adc();
735 
736  if (this_adc > 0.0)
737  det_occupancy++;
738 
739  if (this_adc > largest_adc)
740  largest_adc = this_adc;
741  if (this_adc < smallest_adc)
742  smallest_adc = this_adc;
743 
744  if (Mod_On_ && moduleswitchnumdigispstripon && (local_modmes.NumberOfDigisPerStrip != nullptr) &&
745  (this_adc > 0.0))
746  (local_modmes.NumberOfDigisPerStrip)->Fill(digiIter->strip());
747 
748  if (Mod_On_ && moduleswitchdigiadcson && (local_modmes.DigiADCs != nullptr))
749  (local_modmes.DigiADCs)->Fill(static_cast<float>(this_adc));
750 
751  //Fill #ADCs for this digi at layer level
752  if (layerswitchdigiadcson) {
753  fillME(local_layermes.LayerDigiADCs, this_adc);
754  if (createTrendMEs)
755  fillTrend(local_layermes.LayerDigiADCsTrend, this_adc, iOrbitVar);
756  }
757 
759  local_layermes.LayerDigiADCProfile->Fill(iDet * 1.0, this_adc);
760 
761  } //end of loop over digis in this det
762 
763  // Occupancy
764  short nstrips = SiStripDetCabling_->nApvPairs(detid) * 2 * 128;
765  if (nstrips > 0 && det_occupancy > 0) {
766  det_occupancy = det_occupancy / nstrips;
767  if (Mod_On_ && moduleswitchstripoccupancyon && (local_modmes.StripOccupancy != nullptr))
768  (local_modmes.StripOccupancy)->Fill(det_occupancy);
770  fillME(local_layermes.LayerStripOccupancy, det_occupancy);
771  if (createTrendMEs)
772  fillTrend(local_layermes.LayerStripOccupancyTrend, det_occupancy, iOrbitVar);
773  }
774  }
775 
776  if (largest_adc > largest_adc_layer)
777  largest_adc_layer = largest_adc;
778  if (smallest_adc < smallest_adc_layer)
779  smallest_adc_layer = smallest_adc;
780 
781  // nr. of adcs for hottest strip
782  if (Mod_On_ && moduleswitchadchotteston && (local_modmes.ADCsHottestStrip != nullptr))
783  (local_modmes.ADCsHottestStrip)->Fill(static_cast<float>(largest_adc));
784 
785  // nr. of adcs for coolest strip
786  if (Mod_On_ && moduleswitchadccooleston && (local_modmes.ADCsCoolestStrip != nullptr))
787  (local_modmes.ADCsCoolestStrip)->Fill(static_cast<float>(smallest_adc));
788 
789  } //end of loop over DetIds
790 
791  if (layerswitchnumdigison) {
792  fillME(local_layermes.LayerNumberOfDigis, ndigi_layer);
793  if (createTrendMEs)
794  fillTrend(local_layermes.LayerNumberOfDigisTrend, ndigi_layer, iOrbitVar);
795  }
797  fillME(local_layermes.LayerADCsHottestStrip, largest_adc_layer);
798  if (createTrendMEs)
799  fillTrend(local_layermes.LayerADCsHottestStripTrend, largest_adc_layer, iOrbitVar);
800  }
802  fillME(local_layermes.LayerADCsCoolestStrip, smallest_adc_layer);
803  if (createTrendMEs)
804  fillTrend(local_layermes.LayerADCsCoolestStripTrend, smallest_adc_layer, iOrbitVar);
805  }
806 
807  std::map<std::string, SubDetMEs>::iterator iSubdet = SubDetMEsMap.find(subdet_label);
808  if (iSubdet != SubDetMEsMap.end()) {
809  iSubdet->second.totNDigis += ndigi_layer;
810  //std::cout << " totDigis" << iSubdet->second.totNDigis << " in " << subdet_label << std::endl;
811  }
812  }
813 
814  bool& isStableBeams = *luminosityBlockCache(iEvent.getLuminosityBlock().index());
816  //check Stable beams bit
818  iEvent.getByToken(gtEvmToken_, gtEvm_handle);
819  L1GlobalTriggerEvmReadoutRecord const* gtevm = gtEvm_handle.product();
820 
821  L1GtfeExtWord gtfeEvmExtWord;
822  if (gtevm) {
823  gtfeEvmExtWord = gtevm->gtfeWord();
824  } else
825  edm::LogInfo("DQMProvInfo") << " gtfeEvmWord inaccessible";
826 
827  /* mia: is there not a smarter way !?!?!?!? */
828  if (gtfeEvmExtWord.beamMode() == 11)
829  isStableBeams = true;
830  }
831 
832  for (std::map<std::string, SubDetMEs>::iterator it = SubDetMEsMap.begin(); it != SubDetMEsMap.end(); it++) {
834  if (strcmp(it->first.c_str(), "TEC__MINUS") == 0) {
835  digiFailureMEs.SubDetTotDigiProfLS->Fill(1, it->second.totNDigis);
836  } else if (strcmp(it->first.c_str(), "TEC__PLUS") == 0) {
837  digiFailureMEs.SubDetTotDigiProfLS->Fill(2, it->second.totNDigis);
838  } else if (strcmp(it->first.c_str(), "TIB") == 0) {
839  digiFailureMEs.SubDetTotDigiProfLS->Fill(3, it->second.totNDigis);
840  } else if (strcmp(it->first.c_str(), "TID__MINUS") == 0) {
841  digiFailureMEs.SubDetTotDigiProfLS->Fill(4, it->second.totNDigis);
842  } else if (strcmp(it->first.c_str(), "TID__PLUS") == 0) {
843  digiFailureMEs.SubDetTotDigiProfLS->Fill(5, it->second.totNDigis);
844  } else if (strcmp(it->first.c_str(), "TOB") == 0) {
845  digiFailureMEs.SubDetTotDigiProfLS->Fill(6, it->second.totNDigis);
846  }
847  }
848 
850  if (strcmp(it->first.c_str(), "TEC__MINUS") == 0) {
851  NApvShotsGlobalProf->Fill(1, it->second.SubDetApvShots.size());
852  } else if (strcmp(it->first.c_str(), "TEC__PLUS") == 0) {
853  NApvShotsGlobalProf->Fill(2, it->second.SubDetApvShots.size());
854  } else if (strcmp(it->first.c_str(), "TIB") == 0) {
855  NApvShotsGlobalProf->Fill(3, it->second.SubDetApvShots.size());
856  } else if (strcmp(it->first.c_str(), "TID__MINUS") == 0) {
857  NApvShotsGlobalProf->Fill(4, it->second.SubDetApvShots.size());
858  } else if (strcmp(it->first.c_str(), "TID__PLUS") == 0) {
859  NApvShotsGlobalProf->Fill(5, it->second.SubDetApvShots.size());
860  } else if (strcmp(it->first.c_str(), "TOB") == 0) {
861  NApvShotsGlobalProf->Fill(6, it->second.SubDetApvShots.size());
862  }
863  }
864 
865  SubDetMEs subdetmes = it->second;
866  std::string subdet = it->first;
867 
868  // Fill APV shots histograms for SubDet
869 
870  uint ShotsSize = subdetmes.SubDetApvShots.size();
871  TotalNShots += ShotsSize; //Counter for total Shots in the SiStrip Tracker
872 
874  subdetmes.SubDetNApvShotsTH1->Fill(ShotsSize); // N shots
876  subdetmes.SubDetNApvShotsProf->Fill(iOrbitVar, ShotsSize); //N shots vs time
877 
878  for (uint i = 0; i < ShotsSize;
879  ++i) { // Strip multiplicity, charge median and APV number distributions for APV shots
880 
882  subdetmes.SubDetNApvShotsNApvTH1->Fill(
883  (subdetmes.SubDetApvShots[i].apvNumber() + 1)); //APV are defined by 0 to 5 I want 1 to 6
885  NApvApvShotsGlobal->Fill((subdetmes.SubDetApvShots[i].apvNumber() + 1));
886 
888  subdetmes.SubDetNStripsApvShotsTH1->Fill(subdetmes.SubDetApvShots[i].nStrips());
890  StripMultiplicityApvShotsGlobal->Fill(subdetmes.SubDetApvShots[i].nStrips());
891 
893  subdetmes.SubDetChargeMedianApvShotsTH1->Fill(subdetmes.SubDetApvShots[i].median());
895  MedianChargeApvShotsGlobal->Fill(subdetmes.SubDetApvShots[i].median());
896  }
897 
899  subdetmes.SubDetTotDigiProf->Fill(iOrbitVar, subdetmes.totNDigis);
900  }
901 
906 
908  std::map<int, int>::iterator it;
909  for (it = FEDID_v_digisum.begin(); it != FEDID_v_digisum.end(); it++) {
910  NumberOfFEDDigis->Fill(it->first, it->second);
911  }
912  }
913 
914  // get EventHistory
915 
916  edm::Handle<EventWithHistory> event_history;
917  iEvent.getByToken(historyProducerToken_, event_history);
918 
919  // get Phase of APV
920  edm::Handle<APVCyclePhaseCollection> apv_phase_collection;
921  iEvent.getByToken(apvPhaseProducerToken_, apv_phase_collection);
922 
923  if (event_history.isValid() && !event_history.failedToGet() && apv_phase_collection.isValid() &&
924  !apv_phase_collection.failedToGet()) {
925  long long tbx = event_history->absoluteBX();
926 
927  for (std::map<std::string, SubDetMEs>::iterator it = SubDetMEsMap.begin(); it != SubDetMEsMap.end(); it++) {
928  SubDetMEs subdetmes;
929  std::string subdet = it->first;
930  subdetmes = it->second;
931 
932  int the_phase = APVCyclePhaseCollection::invalid;
933  long long tbx_corr = tbx;
934 
935  if (SubDetPhasePartMap.find(subdet) != SubDetPhasePartMap.end())
936  the_phase = apv_phase_collection->getPhase(SubDetPhasePartMap[subdet]);
939  the_phase = 30;
940  tbx_corr -= the_phase;
941 
943  subdetmes.SubDetDigiApvProf->Fill(tbx_corr % 70, subdetmes.totNDigis);
945  subdetmes.SubDetDigiApvTH2->Fill(tbx_corr % 70, subdetmes.totNDigis);
946  }
947  }
948 } //end of method analyze
949 //--------------------------------------------------------------------------------------------
951  std::map<uint32_t, ModMEs>::iterator pos = DigiMEs.find(idet);
952  ModMEs mod_me = pos->second;
953 
955  mod_me.NumberOfDigis->Reset();
957  mod_me.NumberOfDigisPerStrip->Reset();
959  mod_me.ADCsHottestStrip->Reset();
961  mod_me.ADCsCoolestStrip->Reset();
963  mod_me.DigiADCs->Reset();
965  mod_me.StripOccupancy->Reset();
966 }
967 //------------------------------------------------------------------------------------------
969  const char* ParameterSetLabel,
970  const char* HistoName) {
971  edm::ParameterSet ParametersTrend = conf_.getParameter<edm::ParameterSet>("Trending");
972  MonitorElement* me =
973  ibooker.bookProfile(HistoName,
974  HistoName,
975  ParametersTrend.getParameter<int32_t>("Nbins"),
976  // 0,
977  ParametersTrend.getParameter<double>("xmin"),
978  ParametersTrend.getParameter<double>("xmax"),
979  // ParametersTrend.getParameter<int32_t>("Nbins"),
980  100, //that parameter should not be there !?
981  ParametersTrend.getParameter<double>("ymin"),
982  ParametersTrend.getParameter<double>("ymax"),
983  "");
984  if (!me)
985  return me;
986 
987  me->setAxisTitle("Lumisection", 1);
988  if (me->kind() == MonitorElement::Kind::TPROFILE)
989  me->setCanExtend(TH1::kAllAxes);
990  return me;
991 }
992 
993 //------------------------------------------------------------------------------------------
995  const char* ParameterSetLabel,
996  const char* HistoName) {
998  return ibooker.book1D(HistoName,
999  HistoName,
1000  Parameters.getParameter<int32_t>("Nbinx"),
1001  Parameters.getParameter<double>("xmin"),
1002  Parameters.getParameter<double>("xmax"));
1003 }
1004 
1005 //--------------------------------------------------------------------------------
1006 void SiStripMonitorDigi::fillTrend(MonitorElement* me, float value, float timeinorbit) {
1007  if (!me)
1008  return;
1009  me->Fill(timeinorbit, value);
1010 }
1011 
1012 //
1013 // -- Create Module Level MEs
1014 //
1015 void SiStripMonitorDigi::createModuleMEs(DQMStore::IBooker& ibooker, ModMEs& mod_single, uint32_t detid) {
1016  // use SistripHistoId for producing histogram id (and title)
1017  SiStripHistoId hidmanager;
1018  std::string hid;
1019 
1020  //nr. of digis per module
1021  if (moduleswitchnumdigison) {
1022  hid = hidmanager.createHistoId("NumberOfDigis", "det", detid);
1023  mod_single.NumberOfDigis = ibooker.book1D(hid, hid, 21, -0.5, 20.5);
1024  mod_single.NumberOfDigis->setAxisTitle("number of digis in one detector module");
1025  mod_single.NumberOfDigis->setStatOverflows(kTRUE); // over/underflows in Mean calculation
1026  }
1027 
1028  //nr. of digis per strip in module
1030  hid = hidmanager.createHistoId("NumberOfDigisPerStrip", "det", detid);
1031  short nstrips = SiStripDetCabling_->nApvPairs(detid) * 2 * 128;
1032  mod_single.NumberOfDigisPerStrip = ibooker.book1D(hid, hid, nstrips, -0.5, nstrips + 0.5);
1033  mod_single.NumberOfDigisPerStrip->setAxisTitle("number of (digis > 0) per strip");
1034  mod_single.NumberOfDigisPerStrip->setStatOverflows(kTRUE); // over/underflows in Mean calculation
1035  }
1036  //#ADCs for hottest strip
1038  hid = hidmanager.createHistoId("ADCsHottestStrip", "det", detid);
1039  mod_single.ADCsHottestStrip = bookME1D(ibooker, "TH1ADCsHottestStrip", hid.c_str());
1040  mod_single.ADCsHottestStrip->setAxisTitle("number of ADCs for hottest strip");
1041  }
1042 
1043  //#ADCs for coolest strip
1045  hid = hidmanager.createHistoId("ADCsCoolestStrip", "det", detid);
1046  mod_single.ADCsCoolestStrip = bookME1D(ibooker, "TH1ADCsCoolestStrip", hid.c_str());
1047  mod_single.ADCsCoolestStrip->setAxisTitle("number of ADCs for coolest strip");
1048  }
1049 
1050  //#ADCs for each digi
1051  if (moduleswitchdigiadcson) {
1052  hid = hidmanager.createHistoId("DigiADCs", "det", detid);
1053  mod_single.DigiADCs = bookME1D(ibooker, "TH1DigiADCs", hid.c_str());
1054  mod_single.DigiADCs->setAxisTitle("number of ADCs for each digi");
1055  }
1056 
1057  //Strip occupancy
1059  hid = hidmanager.createHistoId("StripOccupancy", "det", detid);
1060  mod_single.StripOccupancy = bookME1D(ibooker, "TH1StripOccupancy", hid.c_str());
1061  mod_single.StripOccupancy->setAxisTitle("strip occupancy");
1062  }
1063 }
1064 
1065 //
1066 // -- Create Module Level MEs
1067 //
1068 
1070  std::map<std::string, LayerMEs>::iterator iLayerME = LayerMEsMap.find(label);
1071  if (iLayerME == LayerMEsMap.end()) {
1072  SiStripHistoId hidmanager;
1073  LayerMEs layerMEs;
1074  layerMEs.LayerNumberOfDigis = nullptr;
1075  layerMEs.LayerNumberOfDigisTrend = nullptr;
1076  layerMEs.LayerADCsHottestStrip = nullptr;
1077  layerMEs.LayerADCsHottestStripTrend = nullptr;
1078  layerMEs.LayerADCsCoolestStrip = nullptr;
1079  layerMEs.LayerADCsCoolestStripTrend = nullptr;
1080  layerMEs.LayerDigiADCs = nullptr;
1081  layerMEs.LayerDigiADCsTrend = nullptr;
1082  layerMEs.LayerStripOccupancy = nullptr;
1083  layerMEs.LayerStripOccupancyTrend = nullptr;
1084  layerMEs.LayerNumberOfDigisProfile = nullptr;
1085  layerMEs.LayerDigiADCProfile = nullptr;
1086 
1087  //#Digis
1088  if (layerswitchnumdigison) {
1089  layerMEs.LayerNumberOfDigis =
1090  bookME1D(ibooker,
1091  "TH1NumberOfDigis",
1092  hidmanager.createHistoLayer("Summary_TotalNumberOfDigis", "layer", label, "").c_str());
1093  if (createTrendMEs)
1094  layerMEs.LayerNumberOfDigisTrend =
1095  bookMETrend(ibooker,
1096  "TH1NumberOfDigis",
1097  hidmanager.createHistoLayer("Trend_NumberOfDigis", "layer", label, "").c_str());
1098  }
1099 
1100  //#ADCs for hottest strip
1102  layerMEs.LayerADCsHottestStrip =
1103  bookME1D(ibooker,
1104  "TH1ADCsHottestStrip",
1105  hidmanager.createHistoLayer("Summary_ADCsHottestStrip", "layer", label, "").c_str());
1106  if (createTrendMEs)
1107  layerMEs.LayerADCsHottestStripTrend =
1108  bookMETrend(ibooker,
1109  "TH1ADCsHottestStrip",
1110  hidmanager.createHistoLayer("Trend_ADCsHottestStrip", "layer", label, "").c_str());
1111  }
1112 
1113  //#ADCs for coolest strip
1115  layerMEs.LayerADCsCoolestStrip =
1116  bookME1D(ibooker,
1117  "TH1ADCsCoolestStrip",
1118  hidmanager.createHistoLayer("Summary_ADCsCoolestStrip", "layer", label, "").c_str());
1119  if (createTrendMEs)
1120  layerMEs.LayerADCsCoolestStripTrend =
1121  bookMETrend(ibooker,
1122  "TH1ADCsCoolestStrip",
1123  hidmanager.createHistoLayer("Trend_ADCsCoolestStrip", "layer", label, "").c_str());
1124  }
1125 
1126  //#ADCs for each digi
1127  if (layerswitchdigiadcson) {
1128  layerMEs.LayerDigiADCs =
1129  bookME1D(ibooker, "TH1DigiADCs", hidmanager.createHistoLayer("Summary_DigiADCs", "layer", label, "").c_str());
1130  if (createTrendMEs)
1131  layerMEs.LayerDigiADCsTrend = bookMETrend(
1132  ibooker, "TH1DigiADCs", hidmanager.createHistoLayer("Trend_DigiADCs", "layer", label, "").c_str());
1133  }
1134 
1135  //Strip Occupancy
1137  layerMEs.LayerStripOccupancy =
1138  bookME1D(ibooker,
1139  "TH1StripOccupancy",
1140  hidmanager.createHistoLayer("Summary_StripOccupancy", "layer", label, "").c_str());
1141  if (createTrendMEs)
1142  layerMEs.LayerStripOccupancyTrend =
1143  bookMETrend(ibooker,
1144  "TH1StripOccupancy",
1145  hidmanager.createHistoLayer("Trend_StripOccupancy", "layer", label, "").c_str());
1146  }
1147  // # of Digis
1149  std::string hid = hidmanager.createHistoLayer("NumberOfDigiProfile", "layer", label, "");
1150  layerMEs.LayerNumberOfDigisProfile = ibooker.bookProfile(hid, hid, ndets, 0.5, ndets + 0.5, 21, -0.5, 200.5);
1151  }
1152 
1153  // # of Digis
1155  std::string hid = hidmanager.createHistoLayer("DigiADCProfile", "layer", label, "");
1156  layerMEs.LayerDigiADCProfile = ibooker.bookProfile(hid, hid, ndets, 0.5, ndets + 0.5, 64, -0.5, 255.5);
1157  }
1158 
1159  LayerMEsMap[label] = layerMEs;
1160  }
1161 }
1162 //
1163 // -- Create SubDetector MEs
1164 //
1166  SubDetMEs subdetMEs;
1167  subdetMEs.totNDigis = 0;
1168  subdetMEs.SubDetTotDigiProf = nullptr;
1169  subdetMEs.SubDetDigiApvProf = nullptr;
1170  subdetMEs.SubDetDigiApvTH2 = nullptr;
1171 
1172  subdetMEs.SubDetApvShots.clear();
1173  subdetMEs.SubDetNApvShotsTH1 = nullptr;
1174  subdetMEs.SubDetChargeMedianApvShotsTH1 = nullptr;
1175  subdetMEs.SubDetNStripsApvShotsTH1 = nullptr;
1176  subdetMEs.SubDetNApvShotsProf = nullptr;
1177 
1179 
1180  // Total Number of Digi - Profile
1182  edm::ParameterSet Parameters = conf_.getParameter<edm::ParameterSet>("TProfTotalNumberOfDigis");
1183  HistoName = "TotalNumberOfDigiProfile__" + label;
1184  subdetMEs.SubDetTotDigiProf = ibooker.bookProfile(HistoName,
1185  HistoName,
1186  Parameters.getParameter<int32_t>("Nbins"),
1187  Parameters.getParameter<double>("xmin"),
1188  Parameters.getParameter<double>("xmax"),
1189  100, //that parameter should not be there !?
1190  Parameters.getParameter<double>("ymin"),
1191  Parameters.getParameter<double>("ymax"),
1192  "");
1193  subdetMEs.SubDetTotDigiProf->setAxisTitle("Lumisection", 1);
1194 
1196  subdetMEs.SubDetTotDigiProf->setCanExtend(TH1::kAllAxes);
1197  }
1198 
1199  // Number of Digi vs Bx - Profile
1202  HistoName = "Digi_vs_ApvCycle__" + label;
1203  subdetMEs.SubDetDigiApvProf = ibooker.bookProfile(HistoName,
1204  HistoName,
1205  Parameters.getParameter<int32_t>("Nbins"),
1206  Parameters.getParameter<double>("xmin"),
1207  Parameters.getParameter<double>("xmax"),
1208  200, //that parameter should not be there !?
1209  Parameters.getParameter<double>("ymin"),
1210  Parameters.getParameter<double>("ymax"),
1211  "");
1212  subdetMEs.SubDetDigiApvProf->setAxisTitle("ApvCycle (Corrected Absolute Bx % 70)", 1);
1213  }
1214 
1215  // Number of Digi vs Bx - TH2
1218  //dqmStore_->setCurrentFolder("SiStrip/MechanicalView/"+label);
1219  HistoName = "Digi_vs_ApvCycle_2D__" + label;
1220  // Adjusting the scale for 2D histogram
1221  double h2ymax = 9999.0;
1222  double yfact = Parameters.getParameter<double>("yfactor");
1223  if (label.find("TIB") != std::string::npos)
1224  h2ymax = (6984. * 256.) * yfact;
1225  else if (label.find("TID") != std::string::npos)
1226  h2ymax = (2208. * 256.) * yfact;
1227  else if (label.find("TOB") != std::string::npos)
1228  h2ymax = (12906. * 256.) * yfact;
1229  else if (label.find("TEC") != std::string::npos)
1230  h2ymax = (7552. * 2. * 256.) * yfact;
1231  subdetMEs.SubDetDigiApvTH2 =
1232  ibooker.book2D(HistoName,
1233  HistoName,
1234  Parameters.getParameter<int32_t>("Nbins"),
1235  Parameters.getParameter<double>("xmin"),
1236  Parameters.getParameter<double>("xmax"),
1237  Parameters.getParameter<int32_t>("Nbinsy"), //it was 100 that parameter should not be there !?
1238  Parameters.getParameter<double>("ymin"),
1239  h2ymax);
1240  subdetMEs.SubDetDigiApvTH2->setAxisTitle("absolute Bx mod(70)", 1);
1241  }
1242 
1243  //Number of APV Shots
1246  //dqmStore_->setCurrentFolder("SiStrip/MechanicalView/"+label);
1247  HistoName = "Number_of_Apv_Shots_" + label;
1248  subdetMEs.SubDetNApvShotsTH1 = ibooker.book1D(HistoName,
1249  HistoName,
1250  Parameters.getParameter<int32_t>("Nbins"),
1251  Parameters.getParameter<double>("xmin"),
1252  Parameters.getParameter<double>("xmax"));
1253  subdetMEs.SubDetNApvShotsTH1->setAxisTitle("# Apv Shots", 1);
1254  }
1255 
1256  //Strip multiplicity of APV Shots
1259  //dqmStore_->setCurrentFolder("SiStrip/MechanicalView/"+label);
1260  HistoName = "Number_of_Strips_in_Apv_Shots_" + label;
1261  subdetMEs.SubDetNStripsApvShotsTH1 = ibooker.book1D(HistoName,
1262  HistoName,
1263  Parameters.getParameter<int32_t>("Nbins"),
1264  Parameters.getParameter<double>("xmin"),
1265  Parameters.getParameter<double>("xmax"));
1266  subdetMEs.SubDetNStripsApvShotsTH1->setAxisTitle("# strips in Apv Shots", 1);
1267  }
1268 
1269  //Charge median of APV Shots
1271  edm::ParameterSet Parameters = conf_.getParameter<edm::ParameterSet>("TH1ChargeMedianApvShots");
1272  //dqmStore_->setCurrentFolder("SiStrip/MechanicalView/"+label);
1273  HistoName = "Apv_Shots_Charge_Median_" + label;
1274  subdetMEs.SubDetChargeMedianApvShotsTH1 = ibooker.book1D(HistoName,
1275  HistoName,
1276  Parameters.getParameter<int32_t>("Nbins"),
1277  Parameters.getParameter<double>("xmin"),
1278  Parameters.getParameter<double>("xmax"));
1279  subdetMEs.SubDetChargeMedianApvShotsTH1->setAxisTitle("Apv Shots Charge Median (ADC)", 1);
1280  }
1281 
1284  //dqmStore_->setCurrentFolder("SiStrip/MechanicalView/"+label);
1285  HistoName = "Apv_Shots_Apv_Number_" + label;
1286  subdetMEs.SubDetNApvShotsNApvTH1 = ibooker.book1D(HistoName,
1287  HistoName,
1288  Parameters.getParameter<int32_t>("Nbins"),
1289  Parameters.getParameter<double>("xmin"),
1290  Parameters.getParameter<double>("xmax"));
1291  subdetMEs.SubDetNApvShotsNApvTH1->setAxisTitle("Apv Number", 1);
1292  }
1293 
1294  //APV Shots number Vs time
1297  HistoName = "NApv_Shots_vs_Time_" + label;
1298  subdetMEs.SubDetNApvShotsProf = ibooker.bookProfile(HistoName,
1299  HistoName,
1300  Parameters.getParameter<int32_t>("Nbins"),
1301  Parameters.getParameter<double>("xmin"),
1302  Parameters.getParameter<double>("xmax"),
1303  200, //that parameter should not be there !?
1304  Parameters.getParameter<double>("ymin"),
1305  Parameters.getParameter<double>("ymax"),
1306  "");
1307  subdetMEs.SubDetNApvShotsProf->setAxisTitle("Time (s)", 1);
1308  subdetMEs.SubDetNApvShotsProf->setAxisTitle("# Apv Shots", 2);
1310  subdetMEs.SubDetNApvShotsProf->setCanExtend(TH1::kAllAxes);
1311  }
1312 
1313  SubDetMEsMap[label] = subdetMEs;
1314 }
1315 //
1316 // -- Get DetSet vector for a given Detector
1317 //
1319  int location = -1;
1320  for (unsigned int ival = 0; ival < digi_detset_handles.size(); ++ival) {
1322  if (isearch != digi_detset_handles[ival]->end()) {
1323  location = ival;
1324  break;
1325  }
1326  }
1327  return location;
1328 }
1329 
1330 void SiStripMonitorDigi::AddApvShotsToSubDet(const std::vector<APVShot>& moduleShots,
1331  std::vector<APVShot>& subdetShots) {
1332  for (uint i = 0; i < moduleShots.size(); i++) {
1333  subdetShots.push_back(moduleShots[i]);
1334  }
1335 }
1336 
1337 void SiStripMonitorDigi::FillApvShotsMap(TkHistoMap* the_map, const std::vector<APVShot>& shots, uint32_t id, int mode) {
1338  for (uint i = 0; i < shots.size(); i++) {
1339  if (mode == 1)
1340  the_map->fill(id, shots[i].nStrips()); //mode == 1 fill with strip multiplicity
1341  if (mode == 2)
1342  the_map->fill(id, shots[i].median()); // mode == 2 fill with charge median
1343  }
1344 }
1345 
1346 //define this as a plug-in
void ResetModuleMEs(uint32_t idet)
LuminosityBlockNumber_t luminosityBlock() const
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
std::map< std::string, LayerMEs > LayerMEsMap
const cms_uint16_t beamMode() const
void getTIBDetectors(const std::vector< uint32_t > &inputDetRawIds, std::vector< uint32_t > &tibDetRawIds, const TrackerTopology *trackerTopology, uint32_t layer=0, uint32_t bkw_frw=0, uint32_t int_ext=0, uint32_t string=0)
virtual DQM_DEPRECATED void setCanExtend(unsigned int value)
void createMEs(DQMStore::IBooker &ibooker, const edm::EventSetup &es)
MonitorElement * LayerNumberOfDigisTrend
const std::vector< const FedChannelConnection * > & getConnections(uint32_t det_id) const
std::pair< const std::string, const char * > getSubDetFolderAndTag(const uint32_t &detid, const TrackerTopology *tTopo)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
MonitorElement * LayerStripOccupancy
MonitorElement * LayerADCsHottestStrip
edm::InputTag historyProducer_
MonitorElement * LayerADCsHottestStripTrend
T const * product() const
Definition: Handle.h:70
std::optional< T > tryToGet() const
Definition: EventSetup.h:103
std::unique_ptr< TkHistoMap > tkmapNstripApvshot
Kind kind() const
Get the type of the monitor element.
const L1GtfeExtWord gtfeWord() const
get / set GTFE word (record) in the GT readout record
edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > tTopoTokenRun_
void getTIDDetectors(const std::vector< uint32_t > &inputDetRawIds, std::vector< uint32_t > &tidDetRawIds, const TrackerTopology *trackerTopology, uint32_t side=0, uint32_t wheel=0, uint32_t ring=0, uint32_t ster=0)
MonitorElement * NApvShotsGlobalProf
std::map< uint32_t, ModMEs > DigiMEs
std::map< std::string, std::string > SubDetPhasePartMap
void getLayerFolderName(std::stringstream &ss, uint32_t rawdetid, const TrackerTopology *tTopo, bool ring_flag=false)
MonitorElement * MedianChargeApvShotsGlobal
MonitorElement * StripMultiplicityApvShotsGlobal
const SiStripDetCabling * SiStripDetCabling_
void setLayerFolder(uint32_t rawdetid, const TrackerTopology *tTopo, int32_t layer=0, bool ring_flag=false)
edm::ESGetToken< RunInfo, RunInfoRcd > runInfoTokenRun_
void getTECDetectors(const std::vector< uint32_t > &inputDetRawIds, std::vector< uint32_t > &tecDetRawIds, const TrackerTopology *trackerTopology, uint32_t side=0, uint32_t wheel=0, uint32_t petal_bkw_frw=0, uint32_t petal=0, uint32_t ring=0, uint32_t ster=0)
edm::ESGetToken< TkDetMap, TrackerTopologyRcd > tkDetMapTokenRun_
std::unique_ptr< TkHistoMap > tkmapMedianChargeApvshots
MonitorElement * LayerNumberOfDigisProfile
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
nStrips
1.2 is to make the matching window safely the two nearest strips 0.35 is the size of an ME0 chamber i...
long long absoluteBX(const unsigned int ev1) const
void dqmBeginRun(const edm::Run &r, const edm::EventSetup &c) override
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
std::vector< APVShot > SubDetApvShots
void setDetectorFolder(uint32_t rawdetid, const TrackerTopology *tTopo)
void Fill(long long x)
unsigned long long m_cacheID_
MonitorElement * SubDetNApvShotsNApvTH1
void createSubDetMEs(DQMStore::IBooker &ibooker, std::string label)
virtual void Reset()
Remove all data from the ME, keept the empty histogram with all its settings.
void globalEndLuminosityBlock(const edm::LuminosityBlock &lumi, const edm::EventSetup &iSetup) override
bool failedToGet() const
Definition: HandleBase.h:72
bool getStatus(edm::Event const &e, edm::EventSetup const &eSetup)
char const * label
MonitorElement * NumberOfDigisPerStrip
edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > tTopoToken_
int iEvent
Definition: GenABIO.cc:224
MonitorElement * ADCsCoolestStrip
vector< ParameterSet > Parameters
SiStripDCSStatus * dcsStatus_
MonitorElement * bookProfile(TString const &name, TString const &title, int nchX, double lowX, double highX, int, double lowY, double highY, char const *option="s", FUNC onbooking=NOOP())
Definition: DQMStore.h:399
MonitorElement * LayerADCsCoolestStripTrend
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
MonitorElement * SubDetNStripsApvShotsTH1
DigiFailureMEs digiFailureMEs
std::vector< int > m_fed_in
Definition: RunInfo.h:25
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
edm::EDGetTokenT< EventWithHistory > historyProducerToken_
void fillME(MonitorElement *ME, float value1)
MonitorElement * bookME1D(DQMStore::IBooker &ibooker, const char *ParameterSetLabel, const char *HistoName)
MonitorElement * NApvApvShotsGlobal
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
T get() const
Definition: EventSetup.h:82
std::vector< float > vecSubDetTotDigiProfLS
std::shared_ptr< bool > globalBeginLuminosityBlock(const edm::LuminosityBlock &lumi, const edm::EventSetup &iSetup) const override
bool getData(T &iHolder) const
Definition: EventSetup.h:122
Definition: value.py:1
edm::ESGetToken< SiStripDetCabling, SiStripDetCablingRcd > SiStripDetCablingTokenRun_
std::map< std::string, SubDetMEs > SubDetMEsMap
std::string getSubdetid(uint32_t id, const TrackerTopology *tTopo, bool flag_ring)
MonitorElement * ADCsHottestStrip
virtual void setBinLabel(int bin, const std::string &label, int axis=1)
set bin label for x, y or z axis (axis=1, 2, 3 respectively)
void createLayerMEs(DQMStore::IBooker &ibooker, std::string label, int ndet)
void fillTrend(MonitorElement *me, float value, float timeinorbit)
edm::EDGetTokenT< L1GlobalTriggerEvmReadoutRecord > gtEvmToken_
MonitorElement * NApvShotsGlobal
std::vector< edm::EDGetTokenT< edm::DetSetVector< SiStripDigi > > > digiProducerTokenList
MonitorElement * LayerDigiADCProfile
bool isValid() const
Definition: ESHandle.h:44
std::vector< const edm::DetSetVector< SiStripDigi > * > digi_detset_handles
Log< level::Info, false > LogInfo
int getDigiSourceIndex(uint32_t id)
void analyze(const edm::Event &, const edm::EventSetup &) override
SiStripMonitorDigi(const edm::ParameterSet &)
edm::InputTag apvPhaseProducer_
std::unique_ptr< TkHistoMap > tkmapNApvshots
LuminosityBlockID id() const
std::string createHistoId(std::string description, std::string id_type, uint32_t component_id)
MonitorElement * SubDetChargeMedianApvShotsTH1
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:212
void fill(DetId detid, float value)
Definition: TkHistoMap.cc:177
virtual DQM_DEPRECATED void setStatOverflows(bool value)
MonitorElement * bookMETrend(DQMStore::IBooker &ibooker, const char *ParameterSetLabel, const char *HistoName)
std::map< std::string, std::vector< uint32_t > > LayerDetMap
std::string topFolderName_
edm::ParameterSet conf_
std::string HistoName
std::pair< std::string, int32_t > GetSubDetAndLayer(const uint32_t &detid, const TrackerTopology *tTopo, bool ring_flag=false)
bool isValid() const
Definition: HandleBase.h:70
const std::vector< APVShot > & getShots() const
std::unique_ptr< TkHistoMap > tkmapdigi
std::vector< edm::InputTag > digiProducerList
LuminosityBlockIndex index() const
edm::EDGetTokenT< APVCyclePhaseCollection > apvPhaseProducerToken_
T median(std::vector< T > values)
Definition: median.h:16
const int getPhase(const std::string partition) const
collection_type data
Definition: DetSet.h:80
MonitorElement * LayerStripOccupancyTrend
MonitorElement * LayerADCsCoolestStrip
void AddApvShotsToSubDet(const std::vector< APVShot > &, std::vector< APVShot > &)
SiStripFolderOrganizer folder_organizer
MonitorElement * ShotsVsTimeApvShotsGlobal
void getTOBDetectors(const std::vector< uint32_t > &inputDetRawIds, std::vector< uint32_t > &tobDetRawIds, const TrackerTopology *trackerTopology, uint32_t layer=0, uint32_t bkw_frw=0, uint32_t rod=0)
std::string createHistoLayer(std::string description, std::string id_type, std::string path, std::string flag)
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
collection_type::const_iterator const_iterator
Definition: DetSet.h:31
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:102
int currentLS
void FillApvShotsMap(TkHistoMap *, const std::vector< APVShot > &, uint32_t id, int)
MonitorElement * NumberOfFEDDigis
const uint16_t nApvPairs(uint32_t det_id) const
void createModuleMEs(DQMStore::IBooker &ibooker, ModMEs &mod_single, uint32_t detid)
Definition: Run.h:45
void addActiveDetectorsRawIds(std::vector< uint32_t > &) const
uint16_t *__restrict__ uint16_t const *__restrict__ adc
virtual double getBinContent(int binx) const
get content of bin (1-D)
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)