CMS 3D CMS Logo

SiPixelPhase1Summary.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SiPixelPhase1Summary
4 // Class: SiPixelPhase1Summary
5 //
13 //
14 // Original Author: Duncan Leggat
15 // Created: 5th December 2016
16 //
17 //
19 // Framework
23 // DQM Framework
26 // Geometry
32 // DataFormats
39 //
40 #include <string>
41 #include <cstdlib>
42 #include <iostream>
43 #include <fstream>
44 #include <sstream>
45 
46 using namespace std;
47 using namespace edm;
48 
50  : DQMEDHarvester(iConfig), conf_(iConfig), firstLumi(true) {
51  LogInfo("PixelDQM") << "SiPixelPhase1Summary::SiPixelPhase1Summary: Got DQM BackEnd interface" << endl;
52  topFolderName_ = conf_.getParameter<std::string>("TopFolderName");
53  runOnEndLumi_ = conf_.getParameter<bool>("RunOnEndLumi");
54  runOnEndJob_ = conf_.getParameter<bool>("RunOnEndJob");
55 
56  std::vector<edm::ParameterSet> mapPSets = conf_.getParameter<std::vector<edm::ParameterSet> >("SummaryMaps");
57 
58  //Go through the configuration file and add in
59  for (auto const& mapPSet : mapPSets) {
60  summaryPlotName_[mapPSet.getParameter<std::string>("MapName")] = mapPSet.getParameter<std::string>("MapHist");
61  }
62  deadRocThresholds_ = conf_.getParameter<std::vector<double> >("DeadROCErrorThreshold");
63  deadRocWarnThresholds_ = conf_.getParameter<std::vector<double> >("DeadROCWarningThreshold");
64 }
65 
67  // do anything here that needs to be done at desctruction time
68  // (e.g. close files, deallocate resources etc.)
69  LogInfo("PixelDQM") << "SiPixelPhase1Summary::~SiPixelPhase1Summary: Destructor" << endl;
70 }
71 
73 
75  DQMStore::IGetter& iGetter,
76  const edm::LuminosityBlock& lumiSeg,
77  edm::EventSetup const& c) {
78  if (firstLumi) {
79  bookSummaries(iBooker);
80  bookTrendPlots(iBooker);
81  firstLumi = false;
82  }
83 
84  if (runOnEndLumi_) {
85  int lumiSec = lumiSeg.id().luminosityBlock();
86  fillTrendPlots(iBooker, iGetter, lumiSec);
87  fillSummaries(iBooker, iGetter, lumiSec);
88  }
89 
90  // iBooker.cd();
91 }
92 
93 //------------------------------------------------------------------
94 // Method called for every event
95 //------------------------------------------------------------------
97  if (firstLumi) { //Book the plots in the (maybe possible?) case that they aren't booked in the dqmEndLuminosityBlock method
98  bookSummaries(iBooker);
99  bookTrendPlots(iBooker);
100  firstLumi = false;
101  }
102  if (runOnEndJob_) {
103  if (!runOnEndLumi_)
105  iBooker,
106  iGetter); //If we're filling these plots at the end lumi step, it doesn't really make sense to also do them at the end job
107  fillSummaries(iBooker, iGetter);
108  }
109 }
110 
111 //------------------------------------------------------------------
112 // Used to book the summary plots
113 //------------------------------------------------------------------
115  iBooker.cd();
116 
117  std::vector<std::string> xAxisLabels_ = {"BMO",
118  "BMI",
119  "BPO ",
120  "BPI",
121  "HCMO_1",
122  "HCMO_2",
123  "HCMI_1",
124  "HCMI_2",
125  "HCPO_1",
126  "HCPO_2",
127  "HCPI_1",
128  "HCPI_2"}; // why not having a global variable !?!?!?!
129  std::vector<std::string> yAxisLabels_ = {
130  "1",
131  "2",
132  "3",
133  "4"}; // why not having a global variable ?!?!?!!? - I originally did, but was told not to by David Lange!
134 
135  iBooker.setCurrentFolder("PixelPhase1/Summary");
136  //Book the summary plots for the variables as described in the config file
137  for (const auto& mapInfo : summaryPlotName_) {
138  auto name = mapInfo.first;
139  summaryMap_[name] = iBooker.book2D("pixel" + name + "Summary", "Pixel " + name + " Summary", 12, 0, 12, 4, 0, 4);
140  }
141  //Make the new 6 bin ROC summary
143  iBooker.book2D("deadROCSummary", "Percentage of filled ROCs (with digis) per layer/ring", 2, 0, 2, 4, 0, 4);
144  std::vector<std::string> xAxisLabelsReduced_ = {"Barrel", "Forward"};
145  deadROCSummary->setAxisTitle("Subdetector", 1);
146  for (unsigned int i = 0; i < xAxisLabelsReduced_.size(); i++) {
147  deadROCSummary->setBinLabel(i + 1, xAxisLabelsReduced_[i]);
148  }
149 
150  //Book the summary plot
151  iBooker.setCurrentFolder("PixelPhase1/EventInfo");
152 
153  if (runOnEndLumi_) {
154  //New less granular summary plot - this is currently only done online
155  summaryMap_["Grand"] = iBooker.book2D("reportSummaryMap", "Pixel Summary Map", 2, 0, 2, 4, 0, 4);
156  summaryMap_["Grand"]->setAxisTitle("Subdetector", 1);
157  for (unsigned int i = 0; i < xAxisLabelsReduced_.size(); i++) {
158  summaryMap_["Grand"]->setBinLabel(i + 1, xAxisLabelsReduced_[i]);
159  for (unsigned int j = 0; j < 4; j++) {
160  summaryMap_["Grand"]->Fill(i, j, -1);
161  }
162  }
163  } else {
164  //Book the original summary plot, for now juts doing this one offline.
165  summaryMap_["Grand"] = iBooker.book2D("reportSummaryMap", "Pixel Summary Map", 12, 0, 12, 4, 0, 4);
166  }
167 
168  reportSummary = iBooker.bookFloat("reportSummary");
169 
170  //Now set up axis and bin labels
171  for (const auto& summaryMapEntry : summaryMap_) {
172  if (summaryMapEntry.first == "Grand")
173  continue;
174  auto summaryMap = summaryMapEntry.second;
175  for (unsigned int i = 0; i < xAxisLabels_.size(); i++) {
176  summaryMap->setBinLabel(i + 1, xAxisLabels_[i], 1);
177  }
178  for (unsigned int i = 0; i < yAxisLabels_.size(); i++) {
179  summaryMap->setBinLabel(i + 1, yAxisLabels_[i], 2);
180  }
181  summaryMap->setAxisTitle("Subdetector", 1);
182  summaryMap->setAxisTitle("Layer/disk", 2);
183  for (int i = 0; i < summaryMap->getTH1()->GetXaxis()->GetNbins(); i++) { // !??!?!? xAxisLabels_.size() ?!?!
184  for (int j = 0; j < summaryMap->getTH1()->GetYaxis()->GetNbins(); j++) { // !??!?!? yAxisLabels_.size() ?!?!?!
185  summaryMap->Fill(i, j, -1.);
186  }
187  }
188  }
189  reportSummary->Fill(-1.);
190 
191  //Reset the iBooker
192  iBooker.setCurrentFolder("PixelPhase1/");
193 }
194 
195 //------------------------------------------------------------------
196 // Used to book the trend plots
197 //------------------------------------------------------------------
199  //We need different plots depending on if we're online (runOnEndLumi) or offline (!runOnEndLumi)
200  iBooker.setCurrentFolder("PixelPhase1/");
201  std::vector<string> binAxisLabels = {"Layer 1", "Layer 2", "Layer 3", "Layer 4", "Ring 1", "Ring 2"};
202  if (runOnEndLumi_) {
203  std::vector<trendPlots> histoOrder = {layer1, layer2, layer3, layer4, ring1, ring2};
204  std::vector<string> varName = {"Layer_1", "Layer_2", "Layer_3", "Layer_4", "Ring_1", "Ring_2"};
205  std::vector<int> yMax = {1536, 3584, 5632, 8192, 4224, 6528};
206  for (unsigned int i = 0; i < histoOrder.size(); i++) {
207  string varNameStr = "deadRocTrend" + varName[i];
208  string varTitle = binAxisLabels[i] + " dead ROC trend";
209  deadROCTrends_[histoOrder[i]] = iBooker.bookProfile(varNameStr, varTitle, 500, 0., 5000, 0., yMax[i], "");
210  varNameStr = "ineffRocTrend" + varName[i];
211  varTitle = binAxisLabels[i] + " inefficient ROC trend";
212  ineffROCTrends_[histoOrder[i]] = iBooker.bookProfile(varNameStr, varTitle, 500, 0., 5000, 0., yMax[i], "");
213  deadROCTrends_[histoOrder[i]]->setAxisTitle("Lumisection", 1);
214  ineffROCTrends_[histoOrder[i]]->setAxisTitle("Lumisection", 1);
215  }
216  } else {
217  deadROCTrends_[offline] = iBooker.bookProfile("deadRocTotal", "N dead ROCs", 6, 0., 6, 0., 8192, "");
218  ineffROCTrends_[offline] = iBooker.bookProfile("ineffRocTotal", "N inefficient ROCs", 6, 0., 6, 0., 8192, "");
219  deadROCTrends_[offline]->setAxisTitle("Subdetector", 1);
220  ineffROCTrends_[offline]->setAxisTitle("Subdetector", 1);
221  for (unsigned int i = 1; i <= binAxisLabels.size(); i++) {
222  deadROCTrends_[offline]->setBinLabel(i, binAxisLabels[i - 1]);
223  ineffROCTrends_[offline]->setBinLabel(i, binAxisLabels[i - 1]);
224  }
225  }
226 }
227 
228 //------------------------------------------------------------------
229 // Fill the summary histograms
230 //------------------------------------------------------------------
232  //Firstly, we will fill the regular summary maps.
233  for (const auto& mapInfo : summaryPlotName_) {
234  auto name = mapInfo.first;
235  std::ostringstream histNameStream;
236  std::string histName;
237 
238  for (int i = 0; i < 12; i++) { // !??!?!? xAxisLabels_.size() ?!?!
239  for (int j = 0; j < 4; j++) { // !??!?!? yAxisLabels_.size() ?!?!?!
240  if (i > 3 && j == 3)
241  continue;
242  bool minus = i < 2 || (i > 3 && i < 8); // bleah !
243  int iOver2 = floor(i / 2.);
244  bool outer = (i > 3) ? iOver2 % 2 == 0 : i % 2 == 0;
245  //Complicated expression that creates the name of the histogram we are interested in.
246  histNameStream.str("");
247  histNameStream << topFolderName_.c_str() << "PX" << ((i > 3) ? "Forward" : "Barrel") << "/"
248  << ((i > 3) ? "HalfCylinder" : "Shell") << "_" << (minus ? "m" : "p") << ((outer) ? "O" : "I")
249  << "/" << ((i > 3) ? ((i % 2 == 0) ? "PXRing_1/" : "PXRing_2/") : "")
250  << summaryPlotName_[name].c_str() << "_PX" << ((i > 3) ? "Disk" : "Layer") << "_"
251  << ((i > 3) ? ((minus) ? "-" : "+") : "") << (j + 1);
252  histName = histNameStream.str();
253  MonitorElement* me = iGetter.get(histName);
254 
255  if (!me) {
256  edm::LogWarning("SiPixelPhase1Summary") << "ME " << histName << " is not available !!";
257  continue; // Ignore non-existing MEs, as this can cause the whole thing to crash
258  }
259 
260  if (summaryMap_[name] == nullptr) {
261  edm::LogWarning("SiPixelPhase1Summary") << "Summary map " << name << " is not available !!";
262  continue; // Based on reported errors it seems possible that we're trying to access a non-existant summary map, so if the map doesn't exist but we're trying to access it here we'll skip it instead.
263  }
264  if (!(me->getQReports()).empty())
265  summaryMap_[name]->setBinContent(i + 1, j + 1, (me->getQReports())[0]->getQTresult());
266  else
267  summaryMap_[name]->setBinContent(i + 1, j + 1, -1);
268  }
269  }
270  }
271 
272  //Fill the dead ROC summary
273  std::vector<trendPlots> trendOrder = {layer1, layer2, layer3, layer4, ring1, ring2};
274  std::vector<int> nRocsPerTrend = {1536, 3584, 5632, 8192, 4224, 6528};
275  std::vector<int> nDisabledRocs = {12, 128, 240, 320, 96, 120};
276  for (unsigned int i = 0; i < trendOrder.size(); i++) {
277  int xBin = i < 4 ? 1 : 2;
278  int yBin = i % 4 + 1;
279  float numDeadROCs = 0.;
280  float numFilledROCs = 0.;
281  float fracFilledROCs = 1.;
282  unsigned int lastTrendBin = 0;
283  int numEmptyBins = 0;
284  float sumOf5Bins = 0.;
285  std::vector<float> last5TrendBinsValue = {0., 0., 0., 0., 0.};
286  if (runOnEndLumi_) { //Online case
287  TH1* tempProfile = deadROCTrends_[trendOrder[i]]->getTH1();
288 
289  // Old strategy: simply pick the last bin value (deadROCTrend: 1 bin every 10 LS)
290  //nROCs = tempProfile->GetBinContent(tempProfile->FindLastBinAbove());
291 
292  // New strategy, check last 5 bins and decide
293  lastTrendBin = lumiSec / 10;
294  if (lastTrendBin >= 5) {
295  // Fill vector with value of last 5 bins of deadROCTrend
296  for (unsigned int n = 0; n < 5; n++)
297  last5TrendBinsValue[n] = tempProfile->GetBinContent(lastTrendBin - 5 + n + 1);
298  } else {
299  // Fill vector with bins from 1 to last available bin
300  for (unsigned int n = 0; n < lastTrendBin; n++)
301  last5TrendBinsValue[n] = tempProfile->GetBinContent(n + 1);
302  }
303 
304  for (unsigned int n = 0; n < 5; n++)
305  if (last5TrendBinsValue[n] == 0)
306  numEmptyBins++;
307  if (numEmptyBins == 0) {
308  // If the last 5 bins are filled: take the median value (to suppress effect of peaks)
309  std::sort(last5TrendBinsValue.begin(), last5TrendBinsValue.end());
310  numDeadROCs = last5TrendBinsValue[2];
311  } else if (numEmptyBins != 5) {
312  //If there are some empty bins: take the average of the non-empty bins
313  for (unsigned int n = 0; n < 5; n++)
314  sumOf5Bins += last5TrendBinsValue[n];
315  numDeadROCs = sumOf5Bins / (5 - numEmptyBins);
316  }
317 
318  } else { //Offline case
319  TH1* tempProfile = deadROCTrends_[offline]->getTH1();
320  numDeadROCs = tempProfile->GetBinContent(i + 1);
321  }
322  // Filled ROCs = Total number - dead ROCs
323  numFilledROCs = nRocsPerTrend[i] - numDeadROCs;
324  //Fill with fraction of filled ROCs (with digis)
325  fracFilledROCs = numFilledROCs / (nRocsPerTrend[i] - nDisabledRocs[i]);
326  if (fracFilledROCs > 1)
327  fracFilledROCs = 1;
328  deadROCSummary->setBinContent(xBin, yBin, fracFilledROCs);
329  deadROCSummary->setBinContent(2, 3, -1);
330  deadROCSummary->setBinContent(2, 4, -1);
331  }
332 
333  //Sum of non-negative bins for the reportSummary
334  float sumOfNonNegBins = 0.;
335  //Now we will use the other summary maps to create the overall map.
336  //For now we only want to do this offline
337  if (!runOnEndLumi_) {
338  for (int i = 0; i < 12; i++) { // !??!?!? xAxisLabels_.size() ?!?!
339  if (summaryMap_["Grand"] == nullptr) {
340  edm::LogWarning("SiPixelPhase1Summary") << "Grand summary does not exist!";
341  break;
342  }
343  for (int j = 0; j < 4; j++) { // !??!?!? yAxisLabels_.size() ?!?!?!
344  summaryMap_["Grand"]->setBinContent(
345  i + 1,
346  j + 1,
347  1); // This resets the map to be good. We only then set it to 0 if there has been a problem in one of the other summaries.
348  for (auto const& mapInfo : summaryPlotName_) { //Check summary maps
349  auto name = mapInfo.first;
350  if (summaryMap_[name] == nullptr) {
351  edm::LogWarning("SiPixelPhase1Summary") << "Summary " << name << " does not exist!";
352  continue;
353  }
354  if (summaryMap_["Grand"]->getBinContent(i + 1, j + 1) > summaryMap_[name]->getBinContent(i + 1, j + 1))
355  summaryMap_["Grand"]->setBinContent(i + 1, j + 1, summaryMap_[name]->getBinContent(i + 1, j + 1));
356  }
357  if (summaryMap_["Grand"]->getBinContent(i + 1, j + 1) > -0.1)
358  sumOfNonNegBins += summaryMap_["Grand"]->getBinContent(i + 1, j + 1);
359  }
360  }
361  reportSummary->Fill(sumOfNonNegBins / 40.); // The average of the 40 useful bins in the summary map.
362  }
363 
364  //Fill the new overall map
365  // if (!runOnEndLumi_) return;
366  else { //Do this for online only
367  for (int i = 0; i < 2; i++) {
368  if (summaryMap_["Grand"] == nullptr) {
369  edm::LogWarning("SiPixelPhase1Summary") << "Grand summary does not exist!";
370  break;
371  }
372  for (int j = 0; j < 4; j++) { // !??!?!? yAxisLabels_.size() ?!?!?!
373  //Ignore the bins without detectors in them
374  if (i == 1 && j > 1) {
375  summaryMap_["Grand"]->setBinContent(i + 1, j + 1, -1);
376  } else {
377  //Copy dead ROC Summary into Online Pixel Summary
378  summaryMap_["Grand"]->setBinContent(i + 1, j + 1, deadROCSummary->getBinContent(i + 1, j + 1));
379 
380  sumOfNonNegBins += summaryMap_["Grand"]->getBinContent(i + 1, j + 1);
381  }
382  }
383  }
384  reportSummary->Fill(sumOfNonNegBins / 6.); // The average of the 6 useful bins in the summary map.
385  }
386 }
387 //------------------------------------------------------------------
388 // Fill the trend plots
389 //------------------------------------------------------------------
391  // If we're running in online mode and the lumi section is not modulo 10, return. Offline running always uses lumiSec=0, so it will pass this test.
392  if (lumiSec % 10 != 0)
393  return;
394 
395  if (runOnEndLumi_) {
396  MonitorElement* nClustersAll = iGetter.get("PixelPhase1/Phase1_MechanicalView/num_clusters_per_Lumisection_PXAll");
397  if (nClustersAll == nullptr) {
398  edm::LogWarning("SiPixelPhase1Summary") << "All pixel cluster trend plot not available!!";
399  return;
400  }
401  if (nClustersAll->getTH1()->GetBinContent(lumiSec) < 100)
402  return;
403  }
404 
405  std::string histName;
406 
407  //Find the total number of filled bins and hi efficiency bins
408  std::vector<trendPlots> trendOrder = {layer1, layer2, layer3, layer4, ring1, ring2};
409  std::vector<int> nFilledROCs(trendOrder.size(), 0);
410  std::vector<int> hiEffROCs(trendOrder.size(), 0);
411  std::vector<int> nRocsPerTrend = {1536, 3584, 5632, 8192, 4224, 6528};
412  std::vector<string> trendNames = {};
413 
414  for (auto it : {1, 2, 3, 4}) {
415  histName = "PXBarrel/digi_occupancy_per_SignedModuleCoord_per_SignedLadderCoord_PXLayer_" + std::to_string(it);
416  trendNames.push_back(histName);
417  }
418  for (auto it : {1, 2}) {
419  histName = "PXForward/digi_occupancy_per_SignedDiskCoord_per_SignedBladePanelCoord_PXRing_" + std::to_string(it);
420  trendNames.push_back(histName);
421  }
422  //Loop over layers. This will also do the rings, but we'll skip the ring calculation for
423  for (unsigned int trendIt = 0; trendIt < trendOrder.size(); trendIt++) {
424  iGetter.cd();
425  histName = "PixelPhase1/Phase1_MechanicalView/" + trendNames[trendIt];
426  MonitorElement* tempLayerME = iGetter.get(histName);
427  if (tempLayerME == nullptr)
428  continue;
429  float lowEffValue = 0.25 * (tempLayerME->getTH1()->Integral() / nRocsPerTrend[trendIt]);
430  for (int i = 1; i <= tempLayerME->getTH1()->GetXaxis()->GetNbins(); i++) {
431  for (int j = 1; j <= tempLayerME->getTH1()->GetYaxis()->GetNbins(); j++) {
432  if (tempLayerME->getBinContent(i, j) > 0.)
433  nFilledROCs[trendIt]++;
434  if (tempLayerME->getBinContent(i, j) > lowEffValue)
435  hiEffROCs[trendIt]++;
436  }
437  }
438  if (runOnEndLumi_) {
439  tempLayerME->Reset(); //If we're doing online monitoring, reset the digi maps.
440  }
441  } // Close layers/ring loop
442 
443  if (!runOnEndLumi_) { //offline
444  for (unsigned int i = 0; i < trendOrder.size(); i++) {
445  deadROCTrends_[offline]->Fill(i, nRocsPerTrend[i] - nFilledROCs[i]);
446  ineffROCTrends_[offline]->Fill(i, nFilledROCs[i] - hiEffROCs[i]);
447  }
448  } else { //online
449  for (unsigned int i = 0; i < trendOrder.size(); i++) {
450  deadROCTrends_[trendOrder[i]]->Fill(lumiSec - 1, nRocsPerTrend[i] - nFilledROCs[i]);
451  ineffROCTrends_[trendOrder[i]]->Fill(lumiSec - 1, nFilledROCs[i] - hiEffROCs[i]);
452  }
453  }
454 
455  if (!runOnEndLumi_)
456  return; // The following only occurs in the online
457  //Reset some MEs every 10LS here
458  for (auto it : {1, 2, 3, 4}) { //PXBarrel
459  histName = "PixelPhase1/Phase1_MechanicalView/PXBarrel/clusterposition_zphi_PXLayer_" + std::to_string(it);
460  MonitorElement* toReset = iGetter.get(histName);
461  if (toReset != nullptr) {
462  toReset->Reset();
463  }
464  }
465  for (auto it : {"-3", "-2", "-1", "+1", "+2", "+3"}) { //PXForward
466  histName = "PixelPhase1/Phase1_MechanicalView/PXForward/clusterposition_xy_PXDisk_" + std::string(it);
467  MonitorElement* toReset = iGetter.get(histName);
468  if (toReset != nullptr) {
469  toReset->Reset();
470  }
471  }
472 }
473 
474 //define this as a plug-in
LuminosityBlockNumber_t luminosityBlock() const
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
MonitorElement * bookFloat(TString const &name, FUNC onbooking=NOOP())
Definition: DQMStore.h:80
SiPixelPhase1Summary(const edm::ParameterSet &conf)
void fillSummaries(DQMStore::IBooker &iBooker, DQMStore::IGetter &iGetter, int lumiSeg=0)
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
MonitorElement * deadROCSummary
std::map< trendPlots, MonitorElement * > ineffROCTrends_
void fillTrendPlots(DQMStore::IBooker &iBooker, DQMStore::IGetter &iGetter, int lumiSeg=0)
static std::string to_string(const XMLCh *ch)
void Fill(long long x)
virtual void Reset()
Remove all data from the ME, keept the empty histogram with all its settings.
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:408
void beginRun(edm::Run const &run, edm::EventSetup const &eSetup) override
edm::ParameterSet conf_
std::map< std::string, std::string > summaryPlotName_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void bookTrendPlots(DQMStore::IBooker &iBooker)
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)
MonitorElement * reportSummary
Log< level::Info, false > LogInfo
std::vector< double > deadRocWarnThresholds_
virtual void setBinContent(int binx, double content)
set content of bin (1-D)
LuminosityBlockID id() const
std::map< trendPlots, MonitorElement * > deadROCTrends_
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:221
void dqmEndJob(DQMStore::IBooker &iBooker, DQMStore::IGetter &iGetter) override
virtual MonitorElement * get(std::string const &fullpath) const
Definition: DQMStore.cc:712
std::map< std::string, MonitorElement * > summaryMap_
virtual TH1 * getTH1() const
HLT enums.
Log< level::Warning, false > LogWarning
void bookSummaries(DQMStore::IBooker &iBooker)
void dqmEndLuminosityBlock(DQMStore::IBooker &iBooker, DQMStore::IGetter &iGetter, edm::LuminosityBlock const &lumiSeg, edm::EventSetup const &c) override
std::vector< double > deadRocThresholds_
Definition: Run.h:45
virtual double getBinContent(int binx) const
get content of bin (1-D)
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)