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  for (unsigned int i = 0; i < trendOrder.size(); i++) {
276  int xBin = i < 4 ? 1 : 2;
277  int yBin = i % 4 + 1;
278  float numDeadROCs = 0.;
279  float numFilledROCs = 0.;
280  float fracFilledROCs = 1.;
281  unsigned int lastTrendBin = 0;
282  int numEmptyBins = 0;
283  float sumOf5Bins = 0.;
284  std::vector<float> last5TrendBinsValue = {0., 0., 0., 0., 0.};
285  if (runOnEndLumi_) { //Online case
286  TH1* tempProfile = deadROCTrends_[trendOrder[i]]->getTH1();
287 
288  // Old strategy: simply pick the last bin value (deadROCTrend: 1 bin every 10 LS)
289  //nROCs = tempProfile->GetBinContent(tempProfile->FindLastBinAbove());
290 
291  // New strategy, check last 5 bins and decide
292  lastTrendBin = lumiSec / 10;
293  if (lastTrendBin >= 5) {
294  // Fill vector with value of last 5 bins of deadROCTrend
295  for (unsigned int n = 0; n < 5; n++)
296  last5TrendBinsValue[n] = tempProfile->GetBinContent(lastTrendBin - 5 + n + 1);
297  } else {
298  // Fill vector with bins from 1 to last available bin
299  for (unsigned int n = 0; n < lastTrendBin; n++)
300  last5TrendBinsValue[n] = tempProfile->GetBinContent(n + 1);
301  }
302 
303  for (unsigned int n = 0; n < 5; n++)
304  if (last5TrendBinsValue[n] == 0)
305  numEmptyBins++;
306  if (numEmptyBins == 0) {
307  // If the last 5 bins are filled: take the median value (to suppress effect of peaks)
308  std::sort(last5TrendBinsValue.begin(), last5TrendBinsValue.end());
309  numDeadROCs = last5TrendBinsValue[2];
310  } else if (numEmptyBins != 5) {
311  //If there are some empty bins: take the average of the non-empty bins
312  for (unsigned int n = 0; n < 5; n++)
313  sumOf5Bins += last5TrendBinsValue[n];
314  numDeadROCs = sumOf5Bins / (5 - numEmptyBins);
315  }
316 
317  } else { //Offline case
318  TH1* tempProfile = deadROCTrends_[offline]->getTH1();
319  numDeadROCs = tempProfile->GetBinContent(i + 1);
320  }
321  // Filled ROCs = Total number - dead ROCs
322  numFilledROCs = nRocsPerTrend[i] - numDeadROCs;
323  //Fill with fraction of filled ROCs (with digis)
324  fracFilledROCs = numFilledROCs / nRocsPerTrend[i];
325  deadROCSummary->setBinContent(xBin, yBin, fracFilledROCs);
326  deadROCSummary->setBinContent(2, 3, -1);
327  deadROCSummary->setBinContent(2, 4, -1);
328  }
329 
330  //Sum of non-negative bins for the reportSummary
331  float sumOfNonNegBins = 0.;
332  //Now we will use the other summary maps to create the overall map.
333  //For now we only want to do this offline
334  if (!runOnEndLumi_) {
335  for (int i = 0; i < 12; i++) { // !??!?!? xAxisLabels_.size() ?!?!
336  if (summaryMap_["Grand"] == nullptr) {
337  edm::LogWarning("SiPixelPhase1Summary") << "Grand summary does not exist!";
338  break;
339  }
340  for (int j = 0; j < 4; j++) { // !??!?!? yAxisLabels_.size() ?!?!?!
341  summaryMap_["Grand"]->setBinContent(
342  i + 1,
343  j + 1,
344  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.
345  for (auto const& mapInfo : summaryPlotName_) { //Check summary maps
346  auto name = mapInfo.first;
347  if (summaryMap_[name] == nullptr) {
348  edm::LogWarning("SiPixelPhase1Summary") << "Summary " << name << " does not exist!";
349  continue;
350  }
351  if (summaryMap_["Grand"]->getBinContent(i + 1, j + 1) > summaryMap_[name]->getBinContent(i + 1, j + 1))
352  summaryMap_["Grand"]->setBinContent(i + 1, j + 1, summaryMap_[name]->getBinContent(i + 1, j + 1));
353  }
354  if (summaryMap_["Grand"]->getBinContent(i + 1, j + 1) > -0.1)
355  sumOfNonNegBins += summaryMap_["Grand"]->getBinContent(i + 1, j + 1);
356  }
357  }
358  reportSummary->Fill(sumOfNonNegBins / 40.); // The average of the 40 useful bins in the summary map.
359  }
360 
361  //Fill the new overall map
362  // if (!runOnEndLumi_) return;
363  else { //Do this for online only
364  for (int i = 0; i < 2; i++) {
365  if (summaryMap_["Grand"] == nullptr) {
366  edm::LogWarning("SiPixelPhase1Summary") << "Grand summary does not exist!";
367  break;
368  }
369  for (int j = 0; j < 4; j++) { // !??!?!? yAxisLabels_.size() ?!?!?!
370  //Ignore the bins without detectors in them
371  if (i == 1 && j > 1) {
372  summaryMap_["Grand"]->setBinContent(i + 1, j + 1, -1);
373  } else {
374  //Copy dead ROC Summary into Online Pixel Summary
375  summaryMap_["Grand"]->setBinContent(i + 1, j + 1, deadROCSummary->getBinContent(i + 1, j + 1));
376 
377  sumOfNonNegBins += summaryMap_["Grand"]->getBinContent(i + 1, j + 1);
378  }
379  }
380  }
381  reportSummary->Fill(sumOfNonNegBins / 6.); // The average of the 6 useful bins in the summary map.
382  }
383 }
384 //------------------------------------------------------------------
385 // Fill the trend plots
386 //------------------------------------------------------------------
388  // 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.
389  if (lumiSec % 10 != 0)
390  return;
391 
392  if (runOnEndLumi_) {
393  MonitorElement* nClustersAll = iGetter.get("PixelPhase1/Phase1_MechanicalView/num_clusters_per_Lumisection_PXAll");
394  if (nClustersAll == nullptr) {
395  edm::LogWarning("SiPixelPhase1Summary") << "All pixel cluster trend plot not available!!";
396  return;
397  }
398  if (nClustersAll->getTH1()->GetBinContent(lumiSec) < 100)
399  return;
400  }
401 
402  std::string histName;
403 
404  //Find the total number of filled bins and hi efficiency bins
405  std::vector<trendPlots> trendOrder = {layer1, layer2, layer3, layer4, ring1, ring2};
406  std::vector<int> nFilledROCs(trendOrder.size(), 0);
407  std::vector<int> hiEffROCs(trendOrder.size(), 0);
408  std::vector<int> nRocsPerTrend = {1536, 3584, 5632, 8192, 4224, 6528};
409  std::vector<string> trendNames = {};
410 
411  for (auto it : {1, 2, 3, 4}) {
412  histName = "PXBarrel/digi_occupancy_per_SignedModuleCoord_per_SignedLadderCoord_PXLayer_" + std::to_string(it);
413  trendNames.push_back(histName);
414  }
415  for (auto it : {1, 2}) {
416  histName = "PXForward/digi_occupancy_per_SignedDiskCoord_per_SignedBladePanelCoord_PXRing_" + std::to_string(it);
417  trendNames.push_back(histName);
418  }
419  //Loop over layers. This will also do the rings, but we'll skip the ring calculation for
420  for (unsigned int trendIt = 0; trendIt < trendOrder.size(); trendIt++) {
421  iGetter.cd();
422  histName = "PixelPhase1/Phase1_MechanicalView/" + trendNames[trendIt];
423  MonitorElement* tempLayerME = iGetter.get(histName);
424  if (tempLayerME == nullptr)
425  continue;
426  float lowEffValue = 0.25 * (tempLayerME->getTH1()->Integral() / nRocsPerTrend[trendIt]);
427  for (int i = 1; i <= tempLayerME->getTH1()->GetXaxis()->GetNbins(); i++) {
428  for (int j = 1; j <= tempLayerME->getTH1()->GetYaxis()->GetNbins(); j++) {
429  if (tempLayerME->getBinContent(i, j) > 0.)
430  nFilledROCs[trendIt]++;
431  if (tempLayerME->getBinContent(i, j) > lowEffValue)
432  hiEffROCs[trendIt]++;
433  }
434  }
435  if (runOnEndLumi_) {
436  tempLayerME->Reset(); //If we're doing online monitoring, reset the digi maps.
437  }
438  } // Close layers/ring loop
439 
440  if (!runOnEndLumi_) { //offline
441  for (unsigned int i = 0; i < trendOrder.size(); i++) {
442  deadROCTrends_[offline]->Fill(i, nRocsPerTrend[i] - nFilledROCs[i]);
443  ineffROCTrends_[offline]->Fill(i, nFilledROCs[i] - hiEffROCs[i]);
444  }
445  } else { //online
446  for (unsigned int i = 0; i < trendOrder.size(); i++) {
447  deadROCTrends_[trendOrder[i]]->Fill(lumiSec - 1, nRocsPerTrend[i] - nFilledROCs[i]);
448  ineffROCTrends_[trendOrder[i]]->Fill(lumiSec - 1, nFilledROCs[i] - hiEffROCs[i]);
449  }
450  }
451 
452  if (!runOnEndLumi_)
453  return; // The following only occurs in the online
454  //Reset some MEs every 10LS here
455  for (auto it : {1, 2, 3, 4}) { //PXBarrel
456  histName = "PixelPhase1/Phase1_MechanicalView/PXBarrel/clusterposition_zphi_PXLayer_" + std::to_string(it);
457  MonitorElement* toReset = iGetter.get(histName);
458  if (toReset != nullptr) {
459  toReset->Reset();
460  }
461  }
462  for (auto it : {"-3", "-2", "-1", "+1", "+2", "+3"}) { //PXForward
463  histName = "PixelPhase1/Phase1_MechanicalView/PXForward/clusterposition_xy_PXDisk_" + std::string(it);
464  MonitorElement* toReset = iGetter.get(histName);
465  if (toReset != nullptr) {
466  toReset->Reset();
467  }
468  }
469 }
470 
471 //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:399
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:212
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)