CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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),
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  }
187  if (subdetswitchtotdigifailureon) {
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) {
290  SBDeclaredAt = (int)currentLS;
291  SBTransitionDone = true;
292  }
293 
294  if (subdetswitchtotdigifailureon && currentLS % integrateNLumisections_ == 0) {
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
308  && ((int)currentLS - SBDeclaredAt) > ignoreFirstNLumisections_ &&
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);
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";
464  StripMultiplicityApvShotsGlobal = ibooker.book1D(HistoName,
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 
537  folder_organizer.getLayerFolderName(ss, 0, tTopo);
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 
555  digiFailureMEs.SubDetDigiFailures2D = ibooker.book2D(HistoName,
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)
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()) {
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
RunNumber_t run() const
Definition: EventID.h:38
LuminosityBlockID id() const
void ResetModuleMEs(uint32_t idet)
std::optional< T > tryToGet() const
Definition: EventSetup.h:103
std::map< std::string, LayerMEs > LayerMEsMap
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)
void addActiveDetectorsRawIds(std::vector< uint32_t > &) const
virtual DQM_DEPRECATED void setCanExtend(unsigned int value)
void createMEs(DQMStore::IBooker &ibooker, const edm::EventSetup &es)
MonitorElement * LayerNumberOfDigisTrend
std::pair< const std::string, const char * > getSubDetFolderAndTag(const uint32_t &detid, const TrackerTopology *tTopo)
LuminosityBlockIndex index() const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
MonitorElement * LayerStripOccupancy
MonitorElement * LayerADCsHottestStrip
edm::InputTag historyProducer_
const L1GtfeExtWord gtfeWord() const
get / set GTFE word (record) in the GT readout record
MonitorElement * LayerADCsHottestStripTrend
std::unique_ptr< TkHistoMap > tkmapNstripApvshot
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)
Kind kind() const
Get the type of the monitor element.
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
tuple nStrips
1.2 is to make the matching window safely the two nearest strips 0.35 is the size of an ME0 chamber i...
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
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)
bool getData(T &iHolder) const
Definition: EventSetup.h:122
const std::vector< const FedChannelConnection * > & getConnections(uint32_t det_id) const
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 getStatus(edm::Event const &e, edm::EventSetup const &eSetup)
char const * label
MonitorElement * NumberOfDigisPerStrip
const std::vector< APVShot > & getShots() const
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
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
edm::EDGetTokenT< EventWithHistory > historyProducerToken_
std::vector< uint32_t > activeDets
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
std::vector< float > vecSubDetTotDigiProfLS
LuminosityBlock const & getLuminosityBlock() const
Definition: Event.h:100
std::shared_ptr< bool > globalBeginLuminosityBlock(const edm::LuminosityBlock &lumi, const edm::EventSetup &iSetup) const override
int orbitNumber() const
Definition: EventBase.h:65
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
bool isValid() const
Definition: HandleBase.h:70
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)
virtual double getBinContent(int binx) const
get content of bin (1-D)
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
SiStripHistoId hidmanager
std::vector< const edm::DetSetVector< SiStripDigi > * > digi_detset_handles
Log< level::Info, false > LogInfo
bool failedToGet() const
Definition: HandleBase.h:72
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
T const * product() const
Definition: Handle.h:70
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
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
SiStripFolderOrganizer folder_organizer
LuminosityBlockNumber_t luminosityBlock() const
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)
std::unique_ptr< TkHistoMap > tkmapdigi
std::vector< edm::InputTag > digiProducerList
const uint16_t nApvPairs(uint32_t det_id) const
edm::EDGetTokenT< APVCyclePhaseCollection > apvPhaseProducerToken_
T median(std::vector< T > values)
Definition: median.h:16
edm::EventID id() const
Definition: EventBase.h:59
collection_type data
Definition: DetSet.h:80
MonitorElement * LayerStripOccupancyTrend
T get() const
Definition: EventSetup.h:82
string end
Definition: dataset.py:937
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
bool isValid() const
Definition: ESHandle.h:44
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:102
int currentLS
const cms_uint16_t beamMode() const
void FillApvShotsMap(TkHistoMap *, const std::vector< APVShot > &, uint32_t id, int)
MonitorElement * NumberOfFEDDigis
void createModuleMEs(DQMStore::IBooker &ibooker, ModMEs &mod_single, uint32_t detid)
Definition: Run.h:45
uint16_t *__restrict__ uint16_t const *__restrict__ adc
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)