CMS 3D CMS Logo

GEMDQMHarvester.cc
Go to the documentation of this file.
8 
9 //DQM services
14 
15 #include <TH2F.h>
16 #include <TFile.h>
17 #include <TDirectoryFile.h>
18 #include <TKey.h>
19 
20 using namespace edm;
21 
23 public:
25  ~GEMDQMHarvester() override{};
26  static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
27 
28  typedef std::tuple<int, int> IdChamber;
29  typedef std::tuple<int, int, int> IdVFAT;
30  typedef struct PreStatusInfo {
32  int nLumiEnd;
33  int nStatus;
34  } StatusInfo;
35 
36  class NumStatus {
37  public:
38  NumStatus(Float_t fNumTotal = 0,
39  Float_t fNumOcc = 0,
40  Float_t fNumErrVFAT = 0,
41  Float_t fNumWarnVFAT = 0,
42  Float_t fNumErrOH = 0,
43  Float_t fNumWarnOH = 0,
44  Float_t fNumErrAMC = 0,
45  Float_t fNumWarnAMC = 0,
46  Float_t fNumErrAMC13 = 0)
47  : fNumTotal_(fNumTotal),
48  fNumOcc_(fNumOcc),
49  fNumErrVFAT_(fNumErrVFAT),
50  fNumWarnVFAT_(fNumWarnVFAT),
51  fNumErrOH_(fNumErrOH),
52  fNumWarnOH_(fNumWarnOH),
53  fNumErrAMC_(fNumErrAMC),
54  fNumWarnAMC_(fNumWarnAMC),
55  fNumErrAMC13_(fNumErrAMC13) {}
56  float fNumTotal_;
57  float fNumOcc_;
58  float fNumErrVFAT_;
60  float fNumErrOH_;
61  float fNumWarnOH_;
62  float fNumErrAMC_;
63  float fNumWarnAMC_;
65  };
66 
67 protected:
68  void dqmEndLuminosityBlock(DQMStore::IBooker &,
70  edm::LuminosityBlock const &iLumi,
71  edm::EventSetup const &) override;
72  void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) override{}; // Cannot use; it is called after dqmSaver
73 
74  void drawSummaryHistogram(edm::Service<DQMStore> &store, Int_t nLumiCurr);
75  void createTableWatchingSummary();
76  void copyLabels(MonitorElement *h2Src, MonitorElement *h2Dst);
77  void getGeometryInfo(edm::Service<DQMStore> &store, MonitorElement *h2Src);
78  void createSummaryHist(edm::Service<DQMStore> &store, MonitorElement *h2Src, MonitorElement *&h2Sum);
79  void createSummaryVFAT(edm::Service<DQMStore> &store,
80  MonitorElement *h2Src,
81  std::string strSuffix,
82  MonitorElement *&h2Sum);
83  Float_t refineSummaryHistogram(std::string strName,
84  MonitorElement *h2Sum,
85  std::vector<MonitorElement *> &listOccPlots,
86  MonitorElement *h2SrcStatusA,
87  MonitorElement *h2SrcStatusE,
88  MonitorElement *h2SrcStatusW,
89  MonitorElement *h2SrcStatusEVFAT,
90  MonitorElement *h2SrcStatusWVFAT,
91  MonitorElement *h2SrcStatusEOH,
92  MonitorElement *h2SrcStatusWOH,
93  MonitorElement *h2SrcStatusEAMC,
94  MonitorElement *h2SrcStatusWAMC,
95  MonitorElement *h2SrcStatusEAMC13,
96  Int_t nLumiCurr);
97  Int_t refineSummaryVFAT(std::string strName,
98  MonitorElement *h2Sum,
99  MonitorElement *h2SrcOcc,
100  MonitorElement *h2SrcStatusE,
101  MonitorElement *h2SrcStatusW,
102  Int_t nLumiCurr,
103  Int_t nIdxLayer);
104  Int_t assessOneBin(
105  std::string strName, Int_t nIdxX, Int_t nIdxY, Float_t fAll, Float_t fNumOcc, Float_t fNumErr, Float_t fNumWarn);
106 
107  Int_t UpdateStatusChamber(Int_t nIdxLayer, Int_t nIdxCh, Int_t nLumiCurr, NumStatus numStatus);
108  Int_t UpdateStatusChamber(Int_t nIdxLayer, Int_t nIdxCh, Int_t nIdxVFAT, Int_t nLumiCurr, NumStatus numStatus);
109  Int_t UpdateStatusChamber(std::vector<StatusInfo> &listStatus,
110  NumStatus &numStatus,
111  Int_t nLumiCurr,
112  NumStatus numStatusNew);
113  void createLumiFuncHist(edm::Service<DQMStore> &store, std::string strSuffix, Int_t nIdxLayer, Int_t nLumiCurr);
114  void createInactiveChannelFracHist(edm::Service<DQMStore> &store, std::string strSuffix, Int_t nNumChamber);
115 
116  Float_t fCutErr_, fCutLowErr_, fCutWarn_;
117 
118  const std::string strDirSummary_ = "GEM/EventInfo";
119  const std::string strDirRecHit_ = "GEM/RecHits";
120  const std::string strDirStatus_ = "GEM/DAQStatus";
121 
122  const Int_t nCodeFine_ = 1;
123  const Int_t nCodeError_ = 2;
124  const Int_t nCodeWarning_ = 3;
125  const Int_t nCodeLowError_ = 4;
126 
127  const Int_t nBitWarnVFAT_ = 7;
128  const Int_t nBitErrVFAT_ = 6;
129  const Int_t nBitWarnOH_ = 5;
130  const Int_t nBitErrOH_ = 4;
131  const Int_t nBitWarnAMC_ = 3;
132  const Int_t nBitErrAMC_ = 2;
133  const Int_t nBitErrAMC13_ = 1;
134  const Int_t nBitOcc_ = 0;
135 
136  const Int_t nNumVFATs_ = 24;
137 
138  const Int_t nMaxLumi_ = 6000; // From DQMServices/Components/plugins/DQMProvInfo.h
139  //const Int_t nResolutionLumi_ = 5;
141 
142  typedef std::vector<std::vector<Float_t>> TableStatusOcc;
143  typedef std::vector<std::vector<Int_t>> TableStatusNum;
144 
145  std::map<IdChamber, std::vector<StatusInfo>> mapStatusChambersSummary_;
146  std::map<IdVFAT, std::vector<StatusInfo>> mapStatusVFATsSummary_;
147  std::map<IdChamber, NumStatus> mapNumStatusChambersSummary_;
148  std::map<IdVFAT, NumStatus> mapNumStatusVFATsSummary_;
149 
150  std::vector<std::string> listLayer_;
151  std::map<std::string, int> mapIdxLayer_; // All indices in the following objects start at 1
152  std::map<int, int> mapNumChPerChamber_;
153  std::map<int, MonitorElement *> mapHistLumiFunc_;
155 };
156 
158  fCutErr_ = cfg.getParameter<double>("cutErr");
159  fCutLowErr_ = cfg.getParameter<double>("cutLowErr");
160  fCutWarn_ = cfg.getParameter<double>("cutWarn");
161  nResolutionLumi_ = cfg.getParameter<int>("resolutionLumi");
162  bIsStatusChambersInit_ = false;
163 }
164 
167  desc.add<double>("cutErr", 0.05);
168  desc.add<double>("cutLowErr", 0.00);
169  desc.add<double>("cutWarn", 0.05);
170  desc.add<int>("resolutionLumi", 1);
171  descriptions.add("GEMDQMHarvester", desc);
172 }
173 
176  edm::LuminosityBlock const &iLumi,
177  edm::EventSetup const &) {
179  Int_t nLumiCurr = iLumi.id().luminosityBlock();
180  drawSummaryHistogram(store, nLumiCurr);
181 }
182 
184  Float_t fReportSummary = -1.0;
185 
186  std::string strSrcStatusA = "GEM/DAQStatus/chamberAllStatus";
187  std::string strSrcStatusE = "GEM/DAQStatus/chamberErrors";
188  std::string strSrcStatusW = "GEM/DAQStatus/chamberWarnings";
189  std::string strSrcStatusEVFAT = "GEM/DAQStatus/chamberVFATErrors";
190  std::string strSrcStatusWVFAT = "GEM/DAQStatus/chamberVFATWarnings";
191  std::string strSrcStatusEOH = "GEM/DAQStatus/chamberOHErrors";
192  std::string strSrcStatusWOH = "GEM/DAQStatus/chamberOHWarnings";
193  std::string strSrcStatusEAMC = "GEM/DAQStatus/chamberAMCErrors";
194  std::string strSrcStatusWAMC = "GEM/DAQStatus/chamberAMCWarnings";
195  std::string strSrcStatusEAMC13 = "GEM/DAQStatus/chamberAMC13Errors";
196 
197  std::string strSrcVFATOcc = "GEM/Digis/occ";
198  std::string strSrcVFATStatusW = "GEM/DAQStatus/vfat_statusWarnSum";
199  std::string strSrcVFATStatusE = "GEM/DAQStatus/vfat_statusErrSum";
200 
201  store->setCurrentFolder(strDirSummary_);
202 
203  MonitorElement *h2SrcStatusA = store->get(strSrcStatusA);
204  MonitorElement *h2SrcStatusE = store->get(strSrcStatusE);
205  MonitorElement *h2SrcStatusW = store->get(strSrcStatusW);
206  MonitorElement *h2SrcStatusEVFAT = store->get(strSrcStatusEVFAT);
207  MonitorElement *h2SrcStatusWVFAT = store->get(strSrcStatusWVFAT);
208  MonitorElement *h2SrcStatusEOH = store->get(strSrcStatusEOH);
209  MonitorElement *h2SrcStatusWOH = store->get(strSrcStatusWOH);
210  MonitorElement *h2SrcStatusEAMC = store->get(strSrcStatusEAMC);
211  MonitorElement *h2SrcStatusWAMC = store->get(strSrcStatusWAMC);
212  MonitorElement *h2SrcStatusEAMC13 = store->get(strSrcStatusEAMC13);
213 
214  std::string strTitleSummary = "summary";
215 
216  getGeometryInfo(store, h2SrcStatusE);
217 
218  if (h2SrcStatusA != nullptr && h2SrcStatusE != nullptr && h2SrcStatusW != nullptr) {
219  MonitorElement *h2Sum = nullptr;
220  createSummaryHist(store, h2SrcStatusE, h2Sum);
221  createTableWatchingSummary();
222 
223  std::vector<MonitorElement *> listOccPlots(listLayer_.size() + 1); // The index starts at 1
224  for (const auto &strSuffix : listLayer_) {
225  if (mapIdxLayer_.find(strSuffix) == mapIdxLayer_.end())
226  continue;
227  auto nIdxLayer = mapIdxLayer_[strSuffix];
228  MonitorElement *h2SrcVFATOcc = store->get(strSrcVFATOcc + strSuffix);
229  if (h2SrcVFATOcc == nullptr)
230  continue;
231  listOccPlots[nIdxLayer] = h2SrcVFATOcc;
232  }
233 
234  fReportSummary = refineSummaryHistogram(strTitleSummary,
235  h2Sum,
236  listOccPlots,
237  h2SrcStatusA,
238  h2SrcStatusE,
239  h2SrcStatusW,
240  h2SrcStatusEVFAT,
241  h2SrcStatusWVFAT,
242  h2SrcStatusEOH,
243  h2SrcStatusWOH,
244  h2SrcStatusEAMC,
245  h2SrcStatusWAMC,
246  h2SrcStatusEAMC13,
247  nLumiCurr);
248 
249  for (const auto &strSuffix : listLayer_) {
250  if (mapIdxLayer_.find(strSuffix) == mapIdxLayer_.end())
251  continue;
252  auto nIdxLayer = mapIdxLayer_[strSuffix];
253  MonitorElement *h2SrcVFATOcc = store->get(strSrcVFATOcc + strSuffix);
254  MonitorElement *h2SrcVFATStatusW = store->get(strSrcVFATStatusW + strSuffix);
255  MonitorElement *h2SrcVFATStatusE = store->get(strSrcVFATStatusE + strSuffix);
256  if (h2SrcVFATOcc == nullptr || h2SrcVFATStatusW == nullptr || h2SrcVFATStatusE == nullptr)
257  continue;
258 
259  MonitorElement *h2SumVFAT = nullptr;
260  createSummaryVFAT(store, h2SrcVFATStatusE, strSuffix, h2SumVFAT);
261  refineSummaryVFAT(strSuffix, h2SumVFAT, h2SrcVFATOcc, h2SrcVFATStatusE, h2SrcVFATStatusW, nLumiCurr, nIdxLayer);
262  TString strNewTitle = h2SrcVFATStatusE->getTitle();
263  h2SumVFAT->setTitle((const char *)strNewTitle.ReplaceAll("errors", "errors/warnings"));
264  h2SumVFAT->setXTitle(h2SrcVFATStatusE->getAxisTitle(1));
265  h2SumVFAT->setYTitle(h2SrcVFATStatusE->getAxisTitle(2));
266 
267  createLumiFuncHist(store, strSuffix, nIdxLayer, nLumiCurr);
268  }
269  }
270 
271  for (const auto &strSuffix : listLayer_) {
272  if (mapIdxLayer_.find(strSuffix) == mapIdxLayer_.end())
273  continue;
274  //auto nNumChamber = mapNumChPerChamber_[mapIdxLayer_[strSuffix]];
275  Int_t nNumChamber = 36;
276  createInactiveChannelFracHist(store, strSuffix, nNumChamber);
277  }
278 
279  store->bookFloat("reportSummary")->Fill(fReportSummary);
280 }
281 
283  if (bIsStatusChambersInit_)
284  return;
285 
286  for (const auto &[nIdxLayer, nNumCh] : mapNumChPerChamber_) {
287  for (Int_t i = 1; i <= nNumCh; i++) {
288  mapStatusChambersSummary_[{nIdxLayer, i}] = std::vector<StatusInfo>();
289  mapNumStatusChambersSummary_[{nIdxLayer, i}] = NumStatus();
290  for (Int_t j = 1; j <= nNumVFATs_; j++) {
291  mapStatusVFATsSummary_[{nIdxLayer, i, j}] = std::vector<StatusInfo>();
292  mapNumStatusVFATsSummary_[{nIdxLayer, i, j}] = NumStatus();
293  }
294  }
295  }
296 
297  bIsStatusChambersInit_ = true;
298 }
299 
301  Int_t nBinX = h2Src->getNbinsX(), nBinY = h2Src->getNbinsY();
302 
303  for (Int_t i = 1; i <= nBinX; i++) {
304  h2Dst->setBinLabel(i, h2Src->getTH2F()->GetXaxis()->GetBinLabel(i), 1);
305  }
306  for (Int_t i = 1; i <= nBinY; i++) {
307  h2Dst->setBinLabel(i, h2Src->getTH2F()->GetYaxis()->GetBinLabel(i), 2);
308  }
309  h2Dst->setTitle(h2Src->getTitle());
310  h2Dst->setXTitle(h2Src->getAxisTitle(1));
311  h2Dst->setYTitle(h2Src->getAxisTitle(2));
312 }
313 
315  listLayer_.clear();
316  mapIdxLayer_.clear();
317  mapNumChPerChamber_.clear();
318 
319  if (h2Src != nullptr) { // For online and offline
320  Int_t nBinY = h2Src->getNbinsY();
321  listLayer_.push_back("");
322 
323  for (Int_t i = 1; i <= nBinY; i++) {
324  std::string strLabelFull = h2Src->getTH2F()->GetYaxis()->GetBinLabel(i);
325  Int_t nBinXActual = (Int_t)(h2Src->getBinContent(0, i) + 0.5);
326  auto nPos = strLabelFull.find(';');
327  auto strLayer = strLabelFull.substr(nPos + 1);
328  listLayer_.push_back(strLayer);
329  mapIdxLayer_[strLayer] = i;
330  mapNumChPerChamber_[i] = nBinXActual;
331  }
332  } else { // For others (validation and...?)
333  listLayer_.push_back("");
334  if (store->get("GEM/Digis/occupancy_GE11-M-L1/occ_GE11-M-01L1-S") != nullptr) {
335  listLayer_.push_back("_GE11-P-L2");
336  listLayer_.push_back("_GE11-P-L1");
337  listLayer_.push_back("_GE11-M-L1");
338  listLayer_.push_back("_GE11-M-L2");
339  mapIdxLayer_["_GE11-P-L2"] = 1;
340  mapIdxLayer_["_GE11-P-L1"] = 2;
341  mapIdxLayer_["_GE11-M-L1"] = 3;
342  mapIdxLayer_["_GE11-M-L2"] = 4;
343  mapNumChPerChamber_[1] = 36;
344  mapNumChPerChamber_[2] = 36;
345  mapNumChPerChamber_[3] = 36;
346  mapNumChPerChamber_[4] = 36;
347  }
348  // FIXME: How about GE21 and ME0?
349  }
350 }
351 
353  //store->setCurrentFolder(strDirSummary_);
354 
355  Int_t nBinX = h2Src->getNbinsX(), nBinY = h2Src->getNbinsY();
356  h2Sum = store->book2D("reportSummaryMap", "", nBinX, 0.5, nBinX + 0.5, nBinY, 0.5, nBinY + 0.5);
357  h2Sum->setTitle("Summary plot");
358  h2Sum->setXTitle("Chamber");
359  h2Sum->setYTitle("Layer");
360 
361  for (Int_t i = 1; i <= nBinX; i++)
362  h2Sum->setBinLabel(i, h2Src->getTH2F()->GetXaxis()->GetBinLabel(i), 1);
363  for (Int_t i = 1; i <= nBinY; i++)
364  h2Sum->setBinLabel(i, listLayer_[i].substr(1), 2);
365 }
366 
368  MonitorElement *h2Src,
369  std::string strSuffix,
370  MonitorElement *&h2Sum) {
371  //store->setCurrentFolder(strDirStatus_);
372  //store->setCurrentFolder(strDirSummary_);
373 
374  Int_t nBinX = h2Src->getNbinsX(), nBinY = h2Src->getNbinsY();
375  h2Sum = store->book2D("vfat_statusSummary" + strSuffix, "", nBinX, 0.5, nBinX + 0.5, nBinY, -0.5, nBinY - 0.5);
376  copyLabels(h2Src, h2Sum);
377 }
378 
380  std::string strName, Int_t nIdxX, Int_t nIdxY, Float_t fAll, Float_t fNumOcc, Float_t fNumErr, Float_t fNumWarn) {
381  if (fNumErr > fCutErr_ * fAll) // The error status criterion
382  return nCodeError_;
383  else if (fNumErr > fCutLowErr_ * fAll) // The low-error status criterion
384  return nCodeLowError_;
385  else if (fNumWarn > fCutWarn_ * fAll) // The warning status criterion
386  return nCodeWarning_;
387  else if (fNumOcc > 0)
388  return nCodeFine_;
389 
390  return 0;
391 }
392 
393 // FIXME: Need more study about how to summarize
395  MonitorElement *h2Sum,
396  std::vector<MonitorElement *> &listOccPlots,
397  MonitorElement *h2SrcStatusA,
398  MonitorElement *h2SrcStatusE,
399  MonitorElement *h2SrcStatusW,
400  MonitorElement *h2SrcStatusEVFAT,
401  MonitorElement *h2SrcStatusWVFAT,
402  MonitorElement *h2SrcStatusEOH,
403  MonitorElement *h2SrcStatusWOH,
404  MonitorElement *h2SrcStatusEAMC,
405  MonitorElement *h2SrcStatusWAMC,
406  MonitorElement *h2SrcStatusEAMC13,
407  Int_t nLumiCurr) {
408  Int_t nBinY = h2Sum->getNbinsY();
409  Int_t nAllBin = 0, nFineBin = 0;
410  for (Int_t j = 1; j <= nBinY; j++) {
411  Int_t nBinX = (Int_t)(h2SrcStatusE->getBinContent(0, j) + 0.5);
412  auto h2SrcOcc = listOccPlots[j];
413  Int_t nBinYOcc = 0;
414  if (h2SrcOcc != nullptr) {
415  nBinYOcc = h2SrcOcc->getNbinsY();
416  }
417 
418  h2Sum->setBinContent(0, j, nBinX);
419  for (Int_t i = 1; i <= nBinX; i++) {
420  Float_t fOcc = 0;
421  for (Int_t r = 1; r <= nBinYOcc; r++) {
422  fOcc += h2SrcOcc->getBinContent(i, r);
423  }
424 
425  Float_t fStatusAll = h2SrcStatusA->getBinContent(i, j);
426  Float_t fStatusErr = h2SrcStatusE->getBinContent(i, j);
427  Float_t fStatusWarn = h2SrcStatusW->getBinContent(i, j);
428  Float_t fStatusErrVFAT = h2SrcStatusEVFAT != nullptr ? h2SrcStatusEVFAT->getBinContent(i, j) : 0;
429  Float_t fStatusWarnVFAT = h2SrcStatusWVFAT != nullptr ? h2SrcStatusWVFAT->getBinContent(i, j) : 0;
430  Float_t fStatusErrOH = h2SrcStatusEOH != nullptr ? h2SrcStatusEOH->getBinContent(i, j) : 0;
431  Float_t fStatusWarnOH = h2SrcStatusWOH != nullptr ? h2SrcStatusWOH->getBinContent(i, j) : 0;
432  Float_t fStatusErrAMC = h2SrcStatusEAMC != nullptr ? h2SrcStatusEAMC->getBinContent(i, j) : 0;
433  Float_t fStatusWarnAMC = h2SrcStatusWAMC != nullptr ? h2SrcStatusWAMC->getBinContent(i, j) : 0;
434  Float_t fStatusErrAMC13 = h2SrcStatusEAMC13 != nullptr ? h2SrcStatusEAMC13->getBinContent(i, j) : 0;
435  NumStatus numStatus(fStatusAll,
436  fOcc,
437  fStatusErrVFAT,
438  fStatusWarnVFAT,
439  fStatusErrOH,
440  fStatusWarnOH,
441  fStatusErrAMC,
442  fStatusWarnAMC,
443  fStatusErrAMC13);
444  UpdateStatusChamber(j, i, nLumiCurr, numStatus);
445 
446  Int_t nRes = assessOneBin(strName, i, j, fStatusAll, fOcc, fStatusErr, fStatusWarn);
447  if (nRes == 1)
448  nFineBin++;
449 
450  h2Sum->setBinContent(i, j, (Float_t)nRes);
451  nAllBin++;
452  }
453  }
454 
455  return ((Float_t)nFineBin) / nAllBin;
456 }
457 
459  MonitorElement *h2Sum,
460  MonitorElement *h2SrcOcc,
461  MonitorElement *h2SrcStatusE,
462  MonitorElement *h2SrcStatusW,
463  Int_t nLumiCurr,
464  Int_t nIdxLayer) {
465  Int_t nBinY = h2Sum->getNbinsY();
466  for (Int_t j = 1; j <= nBinY; j++) {
467  Int_t nBinX = h2Sum->getNbinsX();
468  for (Int_t i = 1; i <= nBinX; i++) {
469  Float_t fOcc = h2SrcOcc->getBinContent(i, j);
470  Float_t fStatusErr = h2SrcStatusE->getBinContent(i, j);
471  Float_t fStatusWarn = h2SrcStatusW->getBinContent(i, j);
472  Float_t fStatusAll = fOcc + fStatusErr + fStatusWarn;
473  NumStatus numStatus(fStatusAll, fOcc, fStatusErr, fStatusWarn, 0, 0, 0, 0, 0);
474  UpdateStatusChamber(nIdxLayer, i, j, nLumiCurr, numStatus);
475 
476  Int_t nRes = assessOneBin(strName, i, j, fStatusAll, fOcc, fStatusErr, fStatusWarn);
477  h2Sum->setBinContent(i, j, (Float_t)nRes);
478  }
479  }
480 
481  return 0;
482 }
483 
484 Int_t GEMDQMHarvester::UpdateStatusChamber(Int_t nIdxLayer, Int_t nIdxCh, Int_t nLumiCurr, NumStatus numStatus) {
485  if (!bIsStatusChambersInit_)
486  return 0;
487  if (0 >= nIdxCh || nIdxCh > mapNumChPerChamber_[nIdxLayer])
488  return 0;
489  auto &listStatus = mapStatusChambersSummary_[{nIdxLayer, nIdxCh}];
490  auto &numStatusPrev = mapNumStatusChambersSummary_[{nIdxLayer, nIdxCh}];
491  return UpdateStatusChamber(listStatus, numStatusPrev, nLumiCurr, numStatus);
492 }
493 
495  Int_t nIdxLayer, Int_t nIdxCh, Int_t nIdxVFAT, Int_t nLumiCurr, NumStatus numStatus) {
496  if (!bIsStatusChambersInit_)
497  return 0;
498  if (0 >= nIdxCh || nIdxCh > mapNumChPerChamber_[nIdxLayer])
499  return 0;
500  if (0 >= nIdxVFAT || nIdxVFAT > nNumVFATs_)
501  return 0;
502  auto &listStatus = mapStatusVFATsSummary_[{nIdxLayer, nIdxCh, nIdxVFAT}];
503  auto &numStatusPrev = mapNumStatusVFATsSummary_[{nIdxLayer, nIdxCh, nIdxVFAT}];
504  return UpdateStatusChamber(listStatus, numStatusPrev, nLumiCurr, numStatus);
505 }
506 
507 Int_t GEMDQMHarvester::UpdateStatusChamber(std::vector<StatusInfo> &listStatus,
508  NumStatus &numStatus,
509  Int_t nLumiCurr,
510  NumStatus numStatusNew) {
511  // First of all, the current lumi section will be assessed, of which the result will be stored in nStatus
512  Int_t nStatus = 0;
513 
514  Float_t fNumAddErrVFAT = numStatusNew.fNumErrVFAT_ - numStatus.fNumErrVFAT_;
515  Float_t fNumAddWarnVFAT = numStatusNew.fNumWarnVFAT_ - numStatus.fNumWarnVFAT_;
516  Float_t fNumAddErrOH = numStatusNew.fNumErrOH_ - numStatus.fNumErrOH_;
517  Float_t fNumAddWarnOH = numStatusNew.fNumWarnOH_ - numStatus.fNumWarnOH_;
518  Float_t fNumAddErrAMC = numStatusNew.fNumErrAMC_ - numStatus.fNumErrAMC_;
519  Float_t fNumAddWarnAMC = numStatusNew.fNumWarnAMC_ - numStatus.fNumWarnAMC_;
520  Float_t fNumAddErrAMC13 = numStatusNew.fNumErrAMC13_ - numStatus.fNumErrAMC13_;
521 
522  numStatus.fNumTotal_ = numStatusNew.fNumTotal_;
523  numStatus.fNumOcc_ = numStatusNew.fNumOcc_;
524  numStatus.fNumErrVFAT_ = numStatusNew.fNumErrVFAT_;
525  numStatus.fNumWarnVFAT_ = numStatusNew.fNumWarnVFAT_;
526  numStatus.fNumErrOH_ = numStatusNew.fNumErrOH_;
527  numStatus.fNumWarnOH_ = numStatusNew.fNumWarnOH_;
528  numStatus.fNumErrAMC_ = numStatusNew.fNumErrAMC_;
529  numStatus.fNumWarnAMC_ = numStatusNew.fNumWarnAMC_;
530  numStatus.fNumErrAMC13_ = numStatusNew.fNumErrAMC13_;
531 
532  nStatus = (numStatusNew.fNumOcc_ > 0 ? 1 << nBitOcc_ : 0) | (fNumAddErrAMC13 > 0 ? 1 << nBitErrAMC13_ : 0) |
533  (fNumAddErrAMC > 0 ? 1 << nBitErrAMC_ : 0) | (fNumAddWarnAMC > 0 ? 1 << nBitWarnAMC_ : 0) |
534  (fNumAddErrOH > 0 ? 1 << nBitErrOH_ : 0) | (fNumAddWarnOH > 0 ? 1 << nBitWarnOH_ : 0) |
535  (fNumAddErrVFAT > 0 ? 1 << nBitErrVFAT_ : 0) | (fNumAddWarnVFAT > 0 ? 1 << nBitWarnVFAT_ : 0);
536 
537  // Only used in the next if statement; See statusLast
538  StatusInfo statusNew;
539  statusNew.nLumiStart = nLumiCurr;
540  statusNew.nLumiEnd = nLumiCurr;
541  statusNew.nStatus = nStatus;
542 
543  if (listStatus.empty()) {
544  listStatus.push_back(statusNew);
545  } else {
546  auto &statusLastPre = listStatus.back();
547  if (statusLastPre.nStatus == nStatus) {
548  statusLastPre.nLumiEnd = nLumiCurr;
549  } else {
550  listStatus.push_back(statusNew);
551  }
552  }
553 
554  return 0;
555 }
556 
558  std::string strSuffix,
559  Int_t nIdxLayer,
560  Int_t nLumiCurr) {
561  auto &nNumCh = mapNumChPerChamber_[nIdxLayer];
562 
563  MonitorElement *h2Summary;
564 
565  //Int_t nLumiCurrLowRes = ( ( nLumiCurr - 1 ) / nResolutionLumi_ ) * nResolutionLumi_;
566  Int_t nNumBinLumi = ((nLumiCurr - 1) / nResolutionLumi_) + 1;
567  Int_t nMaxBin = 0;
568 
569  // Creating or Summoning the corresponding histogram
570  if (mapHistLumiFunc_.find(nIdxLayer) == mapHistLumiFunc_.end()) {
571  store->setCurrentFolder(strDirSummary_);
572  h2Summary = store->book2S("chamberStatus_inLumi" + strSuffix,
573  "Chamber status on lumi-block " + strSuffix.substr(1),
574  nMaxLumi_ / nResolutionLumi_,
575  1.0,
576  (Float_t)(nMaxLumi_ + 1),
577  //nNumBinLumi, 1.0, (Float_t)( nLumiCurr + 1 ),
578  nNumCh,
579  0.5,
580  nNumCh + 0.5);
581  mapHistLumiFunc_[nIdxLayer] = h2Summary;
582 
583  h2Summary->setXTitle("Luminosity block");
584  h2Summary->setYTitle("Chamber");
585  for (Int_t i = 1; i <= nNumCh; i++) {
586  h2Summary->setBinLabel(i, Form("%i", i), 2);
587  }
588  } else {
589  h2Summary = mapHistLumiFunc_[nIdxLayer];
590  }
591 
592  for (Int_t nIdxCh = 1; nIdxCh <= nNumCh; nIdxCh++) {
593  auto &listStatus = mapStatusChambersSummary_[{nIdxLayer, nIdxCh}];
594 
595  Int_t nIdxStatus = 0;
596  for (Int_t nIdxLumi = 0; nIdxLumi < nNumBinLumi; nIdxLumi++) {
597  // Lumis covered by these values (nLumiStart <=, <= nLumiEnd) are counted for the current bin
598  Int_t nLumiStart = 1 + nIdxLumi * nResolutionLumi_;
599  Int_t nLumiEnd = (1 + nIdxLumi) * nResolutionLumi_;
600  if (nLumiEnd > nLumiCurr)
601  nLumiEnd = nLumiCurr;
602 
603  Int_t nStatusSum = 0;
604  while (true) { // No worries, nIdxStatus must increase and reach at listStatus.size()
605  // True: It was too past so that
606  // the lumi range of listStatus[ nIdxStatus ] is out of the coverage of the current bin
607  if (listStatus[nIdxStatus].nLumiEnd < nLumiStart) {
608  nIdxStatus++;
609  if (nIdxStatus >= (int)listStatus.size()) {
610  break; // For safety
611  }
612  continue;
613  }
614 
615  nStatusSum = listStatus[nIdxStatus].nStatus;
616 
617  // True: This is the last item of listStatus which is covered by the current bin
618  if (nIdxStatus + 1 >= (int)listStatus.size() || listStatus[nIdxStatus].nLumiEnd >= nLumiEnd) {
619  break;
620  }
621 
622  nIdxStatus++;
623  if (nIdxStatus >= (int)listStatus.size()) {
624  break; // For safety
625  }
626  }
627 
628  nStatusSum &= ~(1 << nBitOcc_); // No need of displaying the digi occupancy
629  h2Summary->setBinContent(nIdxLumi + 1, nIdxCh, nStatusSum);
630  if (nMaxBin < nIdxLumi + 1)
631  nMaxBin = nIdxLumi + 1;
632  }
633  }
634 
635  for (Int_t nX = 1; nX <= nMaxBin; nX++) {
636  h2Summary->setBinContent(nX, 0, 1);
637  }
638 }
639 
641  char cRegion;
642  char cChType = (nIdxCh % 2 == 0 ? 'L' : 'S');
643  Int_t nLayer;
644 
645  if (strSuffix.find("-M-") != std::string::npos)
646  cRegion = 'M';
647  else if (strSuffix.find("-P-") != std::string::npos)
648  cRegion = 'P';
649  else
650  return "";
651 
652  if (strSuffix.find("-L1") != std::string::npos)
653  nLayer = 1;
654  else if (strSuffix.find("-L2") != std::string::npos)
655  nLayer = 2;
656  else
657  return "";
658 
659  return Form(
660  "GEM/Digis/occupancy_GE11-%c-L%i/occ_GE11-%c-%02iL%i-%c", cRegion, nLayer, cRegion, nIdxCh, nLayer, cChType);
661 }
662 
663 // FIXME: The naming convention of GE21 could be changed to be different from GE11
665  char cRegion;
666  char cChType = (nIdxCh % 2 == 0 ? 'L' : 'S');
667  Int_t nLayer;
668 
669  if (strSuffix.find("-M-") != std::string::npos)
670  cRegion = 'M';
671  else if (strSuffix.find("-P-") != std::string::npos)
672  cRegion = 'P';
673  else
674  return "";
675 
676  if (strSuffix.find("-L1") != std::string::npos)
677  nLayer = 1;
678  else if (strSuffix.find("-L2") != std::string::npos)
679  nLayer = 2;
680  else
681  return "";
682 
683  return Form(
684  "GEM/Digis/occupancy_GE21-%c-L%i/occ_GE21-%c-%02iL%i-%c", cRegion, nLayer, cRegion, nIdxCh, nLayer, cChType);
685 }
686 
687 std::string getNameChamberOccNull(std::string strSuffix, Int_t nIdxChamber) {
688  return ""; // For an initialization
689 }
690 
692  std::string strSuffix,
693  Int_t nNumChamber) {
694  std::string strTitle = "The fraction of inactive channels in " + strSuffix.substr(1);
695  MonitorElement *h2InactiveChannel =
696  store->book1D("inactive_frac_chamber" + strSuffix, strTitle, nNumChamber, 0.5, nNumChamber + 0.5);
697  h2InactiveChannel->setXTitle("Chamber");
698  h2InactiveChannel->setYTitle("Fraction of inactive channels");
699  for (Int_t i = 1; i <= nNumChamber; i++) {
700  h2InactiveChannel->setBinLabel(i, Form("%i", i), 1);
701  }
702 
703  std::string (*funcNameCh)(std::string, Int_t) = getNameChamberOccNull;
704 
705  if (strSuffix.find("_GE11") != std::string::npos) {
706  funcNameCh = getNameChamberOccGE11;
707  } else if (strSuffix.find("_GE21") != std::string::npos) {
708  funcNameCh = getNameChamberOccGE21;
709  }
710 
711  for (Int_t nIdxCh = 1; nIdxCh <= nNumChamber; nIdxCh++) {
712  std::string strNameCh = funcNameCh(strSuffix, nIdxCh);
713  MonitorElement *h2SrcChamberOcc = store->get(strNameCh);
714  if (h2SrcChamberOcc == nullptr) {
715  // FIXME: It's about sending a message
716  continue;
717  }
718 
719  Int_t nNumBinX = h2SrcChamberOcc->getNbinsX();
720  Int_t nNumBinY = h2SrcChamberOcc->getNbinsY();
721  Int_t nNumAllChannel = nNumBinX * nNumBinY;
722  auto *histData = h2SrcChamberOcc->getTH2F();
723  auto *pdData = histData->GetArray();
724  Int_t nNumChannelInactive = 0;
725  for (Int_t j = 1; j <= nNumBinY; j++)
726  for (Int_t i = 1; i <= nNumBinX; i++) {
727  if (pdData[j * (nNumBinX + 2) + i] <= 0) {
728  nNumChannelInactive++;
729  }
730  }
731  h2InactiveChannel->setBinContent(nIdxCh, ((Double_t)nNumChannelInactive) / nNumAllChannel);
732  }
733 }
734 
virtual void setTitle(const std::string &title)
set (ie. change) histogram/profile title
std::map< std::string, int > mapIdxLayer_
LuminosityBlockNumber_t luminosityBlock() const
MonitorElement * bookFloat(TString const &name, FUNC onbooking=NOOP())
Definition: DQMStore.h:80
void createSummaryVFAT(edm::Service< DQMStore > &store, MonitorElement *h2Src, std::string strSuffix, MonitorElement *&h2Sum)
MonitorElement * book2S(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:254
void createInactiveChannelFracHist(edm::Service< DQMStore > &store, std::string strSuffix, Int_t nNumChamber)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void setCurrentFolder(std::string const &fullpath) override
Definition: DQMStore.h:646
virtual std::string getAxisTitle(int axis=1) const
get x-, y- or z-axis title (axis=1, 2, 3 respectively)
~GEMDQMHarvester() override
std::string getNameChamberOccGE21(std::string strSuffix, Int_t nIdxCh)
Float_t refineSummaryHistogram(std::string strName, MonitorElement *h2Sum, std::vector< MonitorElement *> &listOccPlots, MonitorElement *h2SrcStatusA, MonitorElement *h2SrcStatusE, MonitorElement *h2SrcStatusW, MonitorElement *h2SrcStatusEVFAT, MonitorElement *h2SrcStatusWVFAT, MonitorElement *h2SrcStatusEOH, MonitorElement *h2SrcStatusWOH, MonitorElement *h2SrcStatusEAMC, MonitorElement *h2SrcStatusWAMC, MonitorElement *h2SrcStatusEAMC13, Int_t nLumiCurr)
void copyLabels(MonitorElement *h2Src, MonitorElement *h2Dst)
void dqmEndLuminosityBlock(DQMStore::IBooker &, DQMStore::IGetter &, edm::LuminosityBlock const &iLumi, edm::EventSetup const &) override
std::map< IdChamber, std::vector< StatusInfo > > mapStatusChambersSummary_
std::map< IdVFAT, NumStatus > mapNumStatusVFATsSummary_
void createTableWatchingSummary()
std::string getNameChamberOccNull(std::string strSuffix, Int_t nIdxChamber)
std::vector< std::string > listLayer_
void Fill(long long x)
virtual TH2F * getTH2F() const
std::map< IdVFAT, std::vector< StatusInfo > > mapStatusVFATsSummary_
void drawSummaryHistogram(edm::Service< DQMStore > &store, Int_t nLumiCurr)
virtual void setXTitle(std::string const &title)
std::tuple< int, int > IdChamber
std::vector< std::vector< Float_t > > TableStatusOcc
std::string getNameChamberOccGE11(std::string strSuffix, Int_t nIdxCh)
Bool_t bIsStatusChambersInit_
NumStatus(Float_t fNumTotal=0, Float_t fNumOcc=0, Float_t fNumErrVFAT=0, Float_t fNumWarnVFAT=0, Float_t fNumErrOH=0, Float_t fNumWarnOH=0, Float_t fNumErrAMC=0, Float_t fNumWarnAMC=0, Float_t fNumErrAMC13=0)
std::map< int, MonitorElement * > mapHistLumiFunc_
Int_t assessOneBin(std::string strName, Int_t nIdxX, Int_t nIdxY, Float_t fAll, Float_t fNumOcc, Float_t fNumErr, Float_t fNumWarn)
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 int getNbinsY() const
get # of bins in Y-axis
void getGeometryInfo(edm::Service< DQMStore > &store, MonitorElement *h2Src)
virtual std::string getTitle() const
get MonitorElement title
virtual void setYTitle(std::string const &title)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
virtual void setBinContent(int binx, double content)
set content of bin (1-D)
LuminosityBlockID id() const
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
GEMDQMHarvester(const edm::ParameterSet &)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Int_t UpdateStatusChamber(Int_t nIdxLayer, Int_t nIdxCh, Int_t nLumiCurr, NumStatus numStatus)
virtual MonitorElement * get(std::string const &fullpath) const
Definition: DQMStore.cc:673
HLT enums.
std::map< IdChamber, NumStatus > mapNumStatusChambersSummary_
std::vector< std::vector< Int_t > > TableStatusNum
virtual int getNbinsX() const
get # of bins in X-axis
void createSummaryHist(edm::Service< DQMStore > &store, MonitorElement *h2Src, MonitorElement *&h2Sum)
Int_t refineSummaryVFAT(std::string strName, MonitorElement *h2Sum, MonitorElement *h2SrcOcc, MonitorElement *h2SrcStatusE, MonitorElement *h2SrcStatusW, Int_t nLumiCurr, Int_t nIdxLayer)
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
std::map< int, int > mapNumChPerChamber_
void createLumiFuncHist(edm::Service< DQMStore > &store, std::string strSuffix, Int_t nIdxLayer, Int_t nLumiCurr)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::tuple< int, int, int > IdVFAT
virtual double getBinContent(int binx) const
get content of bin (1-D)
void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) override