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