CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DTOccupancyTest.cc
Go to the documentation of this file.
1 
2 
3 /*
4  * See header file for a description of this class.
5  *
6  * $Date: 2010/01/05 10:15:46 $
7  * $Revision: 1.15 $
8  * \author G. Cerminara - University and INFN Torino
9  */
10 
11 
14 
24 
25 #include "TMath.h"
26 
27 using namespace edm;
28 using namespace std;
29 
30 
31 
32 
34  LogVerbatim ("DTDQM|DTMonitorClient|DTOccupancyTest") << "[DTOccupancyTest]: Constructor";
35 
36  // Get the DQM service
37  dbe = Service<DQMStore>().operator->();
38 
39  lsCounter = 0;
40 
41  writeRootFile = ps.getUntrackedParameter<bool>("writeRootFile", false);
42  if(writeRootFile) {
43  rootFile = new TFile("DTOccupancyTest.root","RECREATE");
44  ntuple = new TNtuple("OccupancyNtuple", "OccupancyNtuple", "ls:wh:st:se:lay1MeanCell:lay1RMS:lay2MeanCell:lay2RMS:lay3MeanCell:lay3RMS:lay4MeanCell:lay4RMS:lay5MeanCell:lay5RMS:lay6MeanCell:lay6RMS:lay7MeanCell:lay7RMS:lay8MeanCell:lay8RMS:lay9MeanCell:lay9RMS:lay10MeanCell:lay10RMS:lay11MeanCell:lay11RMS:lay12MeanCell:lay12RMS");
45  }
46 
47  // switch on the mode for running on test pulses (different top folder)
48  tpMode = ps.getUntrackedParameter<bool>("testPulseMode", false);
49 
50  runOnAllHitsOccupancies = ps.getUntrackedParameter<bool>("runOnAllHitsOccupancies", true);
51  runOnNoiseOccupancies = ps.getUntrackedParameter<bool>("runOnNoiseOccupancies", false);
52  runOnInTimeOccupancies = ps.getUntrackedParameter<bool>("runOnInTimeOccupancies", false);
53 
54 }
55 
56 
57 
58 
60  LogVerbatim ("DTDQM|DTMonitorClient|DTOccupancyTest") << " destructor called" << endl;
61 
62 
63 }
64 
65 
66 
67 
69  LogVerbatim ("DTDQM|DTMonitorClient|DTOccupancyTest") << "[DTOccupancyTest]: BeginJob";
70 
71  // Event counter
72  nevents = 0;
73 
74  // Book the summary histos
75  // - one summary per wheel
76  for(int wh = -2; wh <= 2; ++wh) { // loop over wheels
77  bookHistos(wh, string("Occupancies"), "OccupancySummary");
78  }
79 
80  dbe->setCurrentFolder(topFolder());
81  string title = "Occupancy Summary";
82  if(tpMode) {
83  title = "Test Pulse Occupancy Summary";
84  }
85  // - global summary with alarms
86  summaryHisto = dbe->book2D("OccupancySummary",title.c_str(),12,1,13,5,-2,3);
87  summaryHisto->setAxisTitle("sector",1);
88  summaryHisto->setAxisTitle("wheel",2);
89 
90  // - global summary with percentages
91  glbSummaryHisto = dbe->book2D("OccupancyGlbSummary",title.c_str(),12,1,13,5,-2,3);
92  glbSummaryHisto->setAxisTitle("sector",1);
93  glbSummaryHisto->setAxisTitle("wheel",2);
94 
95 
96  // assign the name of the input histogram
97  if(runOnAllHitsOccupancies) {
98  nameMonitoredHisto = "OccupancyAllHits_perCh";
99  } else if(runOnNoiseOccupancies) {
100  nameMonitoredHisto = "OccupancyNoise_perCh";
101  } else if(runOnInTimeOccupancies) {
102  nameMonitoredHisto = "OccupancyInTimeHits_perCh";
103  } else { // default is AllHits histo
104  nameMonitoredHisto = "OccupancyAllHits_perCh";
105  }
106 
107 }
108 
109 
110 
111 
112 void DTOccupancyTest::beginRun(const edm::Run& run, const EventSetup& context){
113 
114  LogVerbatim ("DTDQM|DTMonitorClient|DTOccupancyTest") << "[DTOccupancyTest]: BeginRun";
115 
116  // Get the geometry
117  context.get<MuonGeometryRecord>().get(muonGeom);
118 
119 }
120 
121 
122 
123 
125  LogVerbatim ("DTDQM|DTMonitorClient|DTOccupancyTest") <<"[DTOccupancyTest]: Begin of LS transition";
126 }
127 
128 
129 
130 
131 void DTOccupancyTest::analyze(const Event& e, const EventSetup& context) {
132  nevents++;
133 // if(nevents%1000)
134 // LogVerbatim ("DTDQM|DTMonitorClient|DTOccupancyTest") << "[DTOccupancyTest]: "<<nevents<<" events";
135 }
136 
137 
138 
139 
140 void DTOccupancyTest::endLuminosityBlock(LuminosityBlock const& lumiSeg, EventSetup const& context) {
141  LogVerbatim ("DTDQM|DTMonitorClient|DTOccupancyTest")
142  <<"[DTOccupancyTest]: End of LS transition, performing the DQM client operation";
143  lsCounter++;
144 
145 
146 
147  // Reset the global summary
148  summaryHisto->Reset();
149  glbSummaryHisto->Reset();
150 
151  // Get all the DT chambers
152  vector<DTChamber*> chambers = muonGeom->chambers();
153 
154  for(vector<DTChamber*>::const_iterator chamber = chambers.begin();
155  chamber != chambers.end(); ++chamber) { // Loop over all chambers
156  DTChamberId chId = (*chamber)->id();
157 
158  MonitorElement * chamberOccupancyHisto = dbe->get(getMEName(nameMonitoredHisto, chId));
159 
160  // Run the tests on the plot for the various granularities
161  if(chamberOccupancyHisto != 0) {
162  // Get the 2D histo
163  TH2F* histo = chamberOccupancyHisto->getTH2F();
164  float chamberPercentage = 1.;
165  int result = runOccupancyTest(histo, chId, chamberPercentage);
166  int sector = chId.sector();
167 
168  if(sector == 13) {
169  sector = 4;
170  float resultSect4 = wheelHistos[chId.wheel()]->getBinContent(sector, chId.station());
171  if(resultSect4 > result) {
172  result = (int)resultSect4;
173  }
174  } else if(sector == 14) {
175  sector = 10;
176  float resultSect10 = wheelHistos[chId.wheel()]->getBinContent(sector, chId.station());
177  if(resultSect10 > result) {
178  result = (int)resultSect10;
179  }
180  }
181 
182  // the 2 MB4 of Sect 4 and 10 count as half a chamber
183  if((sector == 4 || sector == 10) && chId.station() == 4)
184  chamberPercentage = chamberPercentage/2.;
185 
186  wheelHistos[chId.wheel()]->setBinContent(sector, chId.station(),result);
187  if(result > summaryHisto->getBinContent(sector, chId.wheel()+3)) {
188  summaryHisto->setBinContent(sector, chId.wheel()+3, result);
189  }
190  glbSummaryHisto->Fill(sector, chId.wheel(), chamberPercentage*1./4.);
191  } else {
192  LogVerbatim ("DTDQM|DTMonitorClient|DTOccupancyTest") << "[DTOccupancyTest] ME: "
193  << getMEName(nameMonitoredHisto, chId) << " not found!" << endl;
194  }
195 
196  }
197 
198  // Fill the global summary
199  // Check for entire sectors off and report them on the global summary
200  //FIXME: TODO
201 
202  if(writeRootFile) ntuple->AutoSave("SaveSelf");
203 
204 }
205 
206 
208 
209  LogVerbatim ("DTDQM|DTMonitorClient|DTOccupancyTest") << "[DTOccupancyTest] endjob called!";
210  if(writeRootFile) {
211  rootFile->cd();
212  ntuple->Write();
213  rootFile->Close();
214  }
215 }
216 
217 
218 
219 // --------------------------------------------------
220 void DTOccupancyTest::bookHistos(const int wheelId, string folder, string histoTag) {
221  // Set the current folder
222  stringstream wheel; wheel << wheelId;
223  dbe->setCurrentFolder(topFolder());
224 
225  // build the histo name
226  string histoName = histoTag + "_W" + wheel.str();
227 
228 
229  LogVerbatim ("DTDQM|DTMonitorClient|DTOccupancyTest") <<"[DTOccupancyTest]: booking wheel histo:"
230  << histoName
231  << " (tag "
232  << histoTag
233  << ") in: "
234  << topFolder() + "Wheel"+ wheel.str() + "/" + folder << endl;
235 
236  string histoTitle = "Occupancy summary WHEEL: "+wheel.str();
237  if(tpMode) {
238  histoTitle = "TP Occupancy summary WHEEL: "+wheel.str();
239  }
240  wheelHistos[wheelId] = dbe->book2D(histoName,histoTitle,12,1,13,4,1,5);
241  wheelHistos[wheelId]->setBinLabel(1,"MB1",2);
242  wheelHistos[wheelId]->setBinLabel(2,"MB2",2);
243  wheelHistos[wheelId]->setBinLabel(3,"MB3",2);
244  wheelHistos[wheelId]->setBinLabel(4,"MB4",2);
245  wheelHistos[wheelId]->setAxisTitle("sector",1);
246 }
247 
248 
249 
250 string DTOccupancyTest::getMEName(string histoTag, const DTChamberId& chId) {
251 
252  stringstream wheel; wheel << chId.wheel();
253  stringstream station; station << chId.station();
254  stringstream sector; sector << chId.sector();
255 
256 
257  string folderRoot = topFolder() + "Wheel" + wheel.str() +
258  "/Sector" + sector.str() +
259  "/Station" + station.str() + "/";
260 
261  string folder = "Occupancies/";
262 
263  // build the histo name
264  string histoName = histoTag
265  + "_W" + wheel.str()
266  + "_St" + station.str()
267  + "_Sec" + sector.str();
268 
269  string histoname = folderRoot + histoName;
270 
271  return histoname;
272 }
273 
274 
275 
276 
277 // Run a test on the occupancy of the chamber
278 // Return values:
279 // 0 -> all ok
280 // 1 -> # consecutive dead channels > N
281 // 2 -> dead layer
282 // 3 -> dead SL
283 // 4 -> dead chamber
285  float& chamberPercentage) {
286  int nBinsX = histo->GetNbinsX();
287 
288  // Reset the error flags
289  bool failSL = false;
290  bool failLayer = false;
291  bool failCells = false;
292 
293  // Check that the chamber has digis
294  if(histo->Integral() == 0) {
295  chamberPercentage = 0;
296  return 4;
297  }
298 
299  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << "--- Occupancy test for chamber: " << chId << endl;
300  // set the # of SLs
301  int nSL = 3;
302  if(chId.station() == 4) nSL = 2;
303 
304  //
305  float values[28];
306  if(writeRootFile) {
307  values[0] = lsCounter;
308  values[1] = chId.wheel();
309  values[2] = chId.station();
310  values[3] = chId.sector();
311  }
312 
313  // Compute the average occupancy per layer and its RMS
314  // we also look of the layer with the smallest RMS in order to find a reference value
315  // for the cell occupancy
316  double totalChamberOccupp = 0;
317  double squaredLayerOccupSum = 0;
318 
319  map<DTLayerId, pair<double, double> > averageCellOccupAndRMS;
320  map<DTLayerId, double> layerOccupancyMap;
321 
322  int index = 3;
323  for(int slay = 1; slay <= 3; ++slay) { // loop over SLs
324  // Skip layer 2 on MB4
325  if(chId.station() == 4 && slay == 2) {
326  if(writeRootFile) {
327  values[12] = -1;
328  values[13] = -1;
329  values[14] = -1;
330  values[15] = -1;
331  values[16] = -1;
332  values[17] = -1;
333  values[18] = -1;
334  values[19] = -1;
335  }
336  index = 19;
337  continue;
338  }
339  // check the SL occupancy
340  int binYlow = ((slay-1)*4)+1;
341  int binYhigh = binYlow+3;
342  double slInteg = histo->Integral(1,nBinsX,binYlow,binYhigh);
343  if(slInteg == 0) {
344  chamberPercentage = 1.-1./(float)nSL;
345  return 3;
346  }
347 
348  for(int lay = 1; lay <= 4; ++lay) { // loop over layers
349  DTLayerId layID(chId,slay,lay);
350 
351  int binY = binYlow+(lay-1);
352 
353  double layerInteg = histo->Integral(1,nBinsX,binY,binY);
354  squaredLayerOccupSum += layerInteg*layerInteg;
355  totalChamberOccupp+= layerInteg;
356 
357  layerOccupancyMap[layID] = layerInteg;
358 
359  // We look for the distribution of hits within the layer
360  int nWires = muonGeom->layer(layID)->specificTopology().channels();
361  int firstWire = muonGeom->layer(layID)->specificTopology().firstChannel();
362  double layerSquaredSum = 0;
363  // reset the alert bit in the plot (used by render plugins)
364  histo->SetBinContent(nBinsX+1,binY,0.);
365 
366  for(int cell = firstWire; cell != (nWires+firstWire); ++cell) { // loop over cells
367  double cellOccup = histo->GetBinContent(cell,binY);
368  layerSquaredSum+=cellOccup*cellOccup;
369  }
370 
371 
372 
373  // compute the average cell occpuancy and RMS
374  double averageCellOccup = layerInteg/nWires;
375  double averageSquaredCellOccup = layerSquaredSum/nWires;
376  double rmsCellOccup = sqrt(averageSquaredCellOccup - averageCellOccup*averageCellOccup);
377  averageCellOccupAndRMS[layID] = make_pair(averageCellOccup, rmsCellOccup);
378  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " " << layID
379  << " average cell occ.: " << averageCellOccup
380  << " RMS: " << rmsCellOccup << endl;
381  if(writeRootFile) {
382  index++;
383  values[index] = averageCellOccup;
384  index++;
385  values[index] = rmsCellOccup;
386  }
387  }
388  }
389 
390 
391  if(writeRootFile) ntuple->Fill(values);
392 
393 // double averageLayerOcc = totalChamberOccupp/(nSL*4);
394 // double averageSquaredLayeroccup = squaredLayerOccupSum/(nSL*4);
395 // double layerOccupRMS = sqrt(averageSquaredLayeroccup - averageLayerOcc*averageLayerOcc);
396 
397  double minCellRMS = 99999999;
398  double referenceCellOccup = -1;
399 
401 
402  // find the cell reference value
403  for(map<DTLayerId, pair<double, double> >::const_iterator layAndValues = averageCellOccupAndRMS.begin();
404  layAndValues != averageCellOccupAndRMS.end(); layAndValues++) {
405  DTLayerId lid = (*layAndValues).first;
406 
407  double rms = (*layAndValues).second.second;
408  double lOcc = layerOccupancyMap[lid]; // FIXME: useless
409  double avCellOcc = (*layAndValues).second.first;
410  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " " << lid << " tot. occ: " << lOcc
411  << " average cell occ: " << avCellOcc
412  << " RMS: " << rms << endl;
413 
414  if(avCellOcc != 0) {
415  DTOccupancyPoint point(avCellOcc, rms, lid);
416  builder.addPoint(point);
417  } else {
418  if(monitoredLayers.find(lid) == monitoredLayers.end()) monitoredLayers.insert(lid);
419  }
420  }
421 
422  builder.buildClusters();
423  referenceCellOccup = builder.getBestCluster().averageMean();
424  minCellRMS = builder.getBestCluster().averageRMS();
425 
426 // set<DTLayerId> bestLayers getLayerIDs()
427 
428  double safeFactor = 3.;
429 // if(minCellRMS > referenceCellOccup) safeFactor = 5;
430 
431  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " Reference cell occup.: " << referenceCellOccup
432  << " RMS: " << minCellRMS << endl;
433 
434  // Set a warning for particularly high RMS: noise can "mask" dead channels
435 // bool rmsWarning = false;
436 // if(layerOccupRMS > averageLayerOcc) {
437 // cout << " Warning RMS is too big: monitoring all layers" << endl;
438 // rmsWarning = true;
439 // }
440 
441  int nFailingSLs = 0;
442 
443  // Check the layer occupancy
444  for(int slay = 1; slay <= 3; ++slay) { // loop over SLs
445  // Skip layer 2 on MB4
446  if(chId.station() == 4 && slay == 2) continue;
447 
448  int binYlow = ((slay-1)*4)+1;
449 // int binYhigh = binYlow+3;
450 
451 
452  int nFailingLayers = 0;
453 
454  for(int lay = 1; lay <= 4; ++lay) { // loop over layers
455  DTLayerId layID(chId,slay,lay);
456  int nWires = muonGeom->layer(layID)->specificTopology().channels();
457  int firstWire = muonGeom->layer(layID)->specificTopology().firstChannel();
458  int binY = binYlow+(lay-1);
459 
460  // compute the integral of the layer occupancy
461  double layerInteg = histo->Integral(1,nBinsX,binY,binY);
462 
463  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " layer: " << layID << " integral: " << layerInteg << endl;
464 
465  // Check if in the list of layers which are monitored
466  bool alreadyMonitored = false;
467  if(monitoredLayers.find(layID) != monitoredLayers.end()) alreadyMonitored = true;
468 
469 
470  if(layerInteg == 0) { // layer is dead (no need to go further
471  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " fail layer: no entries" << endl;
472  // Add it to the list of of monitored layers
473  if(!alreadyMonitored) monitoredLayers.insert(layID);
474  nFailingLayers++;
475  failLayer = true;
476  histo->SetBinContent(nBinsX+1,binY,-1.);
477  // go to next layer
478  continue;
479  }
480 
481 
482 
483 // double avCellOccInLayer = averageCellOccupAndRMS[layID].first;
484 // double cellOccupRMS = averageCellOccupAndRMS[layID].second;
485 // if(monitoredLayers.find(layID) != monitoredLayers.end() ||
486 // layerInteg == 0 ||
487 // layerInteg < (averageLayerOcc - 3*layerOccupRMS) ||
488 // cellOccupRMS > avCellOccInLayer ||
489 // avCellOccInLayer < referenceCellOccup/3.) { // check the layer
490 
491  if(alreadyMonitored || builder.isProblematic(layID)) { // check the layer
492 
493  // Add it to the list of of monitored layers
494  if(monitoredLayers.find(layID) == monitoredLayers.end()) monitoredLayers.insert(layID);
495 
496 // if(layerInteg != 0) { // check # of dead cells
497  int totalDeadCells = 0;
498  int nDeadCellsInARow = 1;
499  int nDeadCellsInARowMax = 0;
500  int nCellsZeroCount = 0;
501  bool previousIsDead = false;
502 
503  int interDeadCells = 0;
504  for(int cell = firstWire; cell != (nWires+firstWire); ++cell) { // loop over cells
505  double cellOccup = histo->GetBinContent(cell,binY);
506  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " cell occup: " << cellOccup;
507  if(cellOccup == 0 || cellOccup < (referenceCellOccup-safeFactor*sqrt(referenceCellOccup))) {
508  if(cellOccup == 0) nCellsZeroCount++;
509  totalDeadCells++;
510  if(previousIsDead) nDeadCellsInARow++;
511  previousIsDead = true;
512  interDeadCells = 0;
513  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " below reference" << endl;
514  } else {
515  previousIsDead = false;
516  interDeadCells++;
517 
518  // 3 cells not dead between a group of dead cells don't break the count
519  if(interDeadCells > 3) {
520  if(nDeadCellsInARow > nDeadCellsInARowMax) nDeadCellsInARowMax = nDeadCellsInARow;
521  nDeadCellsInARow = 1;
522  }
523  }
524  }
525  if(nDeadCellsInARow > nDeadCellsInARowMax) nDeadCellsInARowMax = nDeadCellsInARow;
526  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " # wires: " << nWires
527  << " # cells 0 count: " << nCellsZeroCount
528  << " # dead cells in a row: " << nDeadCellsInARowMax
529  << " total # of dead cells: " << totalDeadCells;
530 
531 
532  // Count dead cells
533 // if(TMath::Erf(referenceCellOccup/sqrt(referenceCellOccup)) > 2./3. &&
534 // nDeadCellsInARowMax > nWires/3.
535 // && nDeadCellsInARowMax < 2*nWires/3.) {
536 // cout << " -> fail cells!" << endl;
537 
538 // failCells = true;
539 // histo->SetBinContent(nBinsX+1,binY,-1.);
540 // } else
541  if((TMath::Erfc(referenceCellOccup/sqrt(referenceCellOccup)) < 10./(double)nWires &&
542  nDeadCellsInARowMax>= 10.) ||
543  (TMath::Erfc(referenceCellOccup/sqrt(referenceCellOccup)) < 0.5 &&
544  totalDeadCells > nWires/2.)) {
545  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " -> fail layer!" << endl;
546  nFailingLayers++;
547  failLayer = true;
548  histo->SetBinContent(nBinsX+1,binY,-1.);
549  } else if(referenceCellOccup > 10 &&
550  nCellsZeroCount > nWires/3. &&
551  (double)nCellsZeroCount/(double)nWires >
552  2.*TMath::Erfc(referenceCellOccup/sqrt(referenceCellOccup))) {
553  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " -> would fail cells!" << endl;
554  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " # of cells with 0 count: " << nCellsZeroCount
555  << " # wires: " << nWires
556  << " erfc: "
557  << TMath::Erfc(referenceCellOccup/sqrt(referenceCellOccup))
558  << endl;
559 // failCells = true;
560 // histo->SetBinContent(nBinsX+1,binY,-1.);
561  }
562 
563 // } else { // all layer is dead
564 // LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest") << " fail layer: no entries" << endl;
565 // nFailingLayers++;
566 // failLayer = true;
567 // histo->SetBinContent(nBinsX+1,binY,-1.);
568 // }
569  }
570  }
571  // Check if the whole layer is off
572  if( nFailingLayers == 4) {
573  nFailingSLs++;
574  failSL = true;
575  }
576  }
577 
578  // All the chamber is off
579  if(nFailingSLs == nSL) {
580  chamberPercentage = 0;
581  return 4;
582  } else {
583  chamberPercentage = 1.-(float)nFailingSLs/(float)nSL;
584  }
585 
586  // FIXME add check on cells
587  if(failSL) return 3;
588  if(failLayer) return 2;
589  if(failCells) return 1;
590 
591  return 0;
592 }
593 
594 
596  if(tpMode) return string("DT/10-TestPulses/");
597  return string("DT/01-Digi/");
598 }
DTOccupancyCluster getBestCluster() const
get the cluster correspondig to &quot;normal&quot; cell occupancy.
T getUntrackedParameter(std::string const &, T const &) const
void analyze(const edm::Event &event, const edm::EventSetup &context)
Analyze.
int runOccupancyTest(TH2F *histo, const DTChamberId &chId, float &chamberPercentage)
static char chambers[TOTALCHAMBERS][20]
Definition: ReadPGInfo.cc:243
void beginJob()
BeginJob.
tuple histo
Definition: trackerHits.py:12
virtual ~DTOccupancyTest()
Destructor.
void beginLuminosityBlock(edm::LuminosityBlock const &lumiSeg, edm::EventSetup const &context)
dictionary map
Definition: Association.py:160
void bookHistos()
Definition: Histogram.h:33
double averageRMS() const
average RMS of the cell occpuancy distributions of the layers in the cluster
DTOccupancyTest(const edm::ParameterSet &ps)
Constructor.
void endJob()
Endjob.
T sqrt(T t)
Definition: SSEVec.h:28
tuple result
Definition: query.py:137
std::string getMEName(std::string histoTag, const DTChamberId &chId)
Get the ME name.
void beginRun(edm::Run const &run, edm::EventSetup const &context)
BeginRun.
int nevents
void endLuminosityBlock(edm::LuminosityBlock const &lumiSeg, edm::EventSetup const &context)
DQM Client Diagnostic.
#define LogTrace(id)
double averageMean() const
average cell occupancy of the layers in the cluster
void addPoint(const DTOccupancyPoint &point)
Add an occupancy point for a given layer.
void buildClusters()
build the clusters
void bookHistos(const int wheelId, std::string folder, std::string histoTag)
book the summary histograms
const T & get() const
Definition: EventSetup.h:55
int sector() const
Definition: DTChamberId.h:63
bool isProblematic(DTLayerId layerId) const
std::string topFolder() const
int station() const
Return the station number.
Definition: DTChamberId.h:53
TH2F * getTH2F(void) const
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:47
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5
Definition: Run.h:31