CMS 3D CMS Logo

L1TOccupancyClient.cc
Go to the documentation of this file.
2 
9 #include <cstdio>
10 #include <sstream>
11 #include <cmath>
12 #include <vector>
13 #include <TMath.h>
14 #include <climits>
15 #include <TFile.h>
16 #include <TDirectory.h>
17 #include <TProfile.h>
18 
19 using namespace std;
20 using namespace edm;
21 
22 //____________________________________________________________________________
23 // Function: L1TOccupancyClient
24 // Description: This is the constructor, basic variable initialization
25 // Inputs:
26 // * const edm::ParameterSet& ps = Parameter for this analyzer
27 //____________________________________________________________________________
29  // Get parameters
30  parameters_ = ps;
31  verbose_ = ps.getParameter<bool>("verbose");
32  tests_ = ps.getParameter<std::vector<ParameterSet> >("testParams");
33 
34  if (verbose_) {
35  cout << "[L1TOccupancyClient:] Called constructor" << endl;
36  }
37 }
38 
39 //____________________________________________________________________________
40 // Function: ~L1TOccupancyClient
41 // Description: This is the destructor, basic variable deletion
42 //____________________________________________________________________________
44  if (verbose_) {
45  cout << "[L1TOccupancyClient:] Called destructor" << endl;
46  }
47 }
48 
49 //____________________________________________________________________________
50 // Function: beginRun
51 // Description: This is will be run at the begining of each run
52 // Inputs:
53 // * const Run& r = Run information
54 // * const EventSetup& context = Event Setup information
55 //____________________________________________________________________________
57  hservice_ = new L1TOccupancyClientHistogramService(parameters_, ibooker, verbose_);
58 
59  if (verbose_) {
60  cout << "[L1TOccupancyClient:] Called beginRun" << endl;
61 
62  // In verbose mode we will produce an extra output file with several tests
63  file_ = TFile::Open("DQM_L1TOccupancyClient_Snapshots_LS.root", "RECREATE");
64  }
65 
66  ibooker.setCurrentFolder("L1T/L1TOccupancy/");
67  //dbe_->setCurrentFolder("L1T/L1TOccupancy/Results");
68  //dbe_->setCurrentFolder("L1T/L1TOccupancy/BadCellValues");
69  //dbe_->setCurrentFolder("L1T/L1TOccupancy/Certification");
70 
71  // Loop over all tests in defined
72  for (vector<ParameterSet>::iterator it = tests_.begin(); it != tests_.end(); it++) {
73  // If the test algorithm is XYSymmetry we create the necessary histograms
74  if ((*it).getUntrackedParameter<string>("algoName", "XYSymmetry") == "XYSymmetry") {
75  // Getting Parameters for the test
76  string testName = (*it).getParameter<string>("testName");
77  ParameterSet algoParameters = (*it).getParameter<ParameterSet>("algoParams");
78  string histPath = algoParameters.getParameter<string>("histPath");
79 
80  if (verbose_) {
81  cout << "[L1TOccupancyClient:] Monitored histogram path: " << histPath << endl;
82 
83  // Creating verbose file directory structure
84  // test_name/test_name_Results,
85  // test_name/test_name_Histos
86  // TDirectory *td = file_->mkdir(testName.c_str() ,testName.c_str());
87  //FIXME: sub never used gcc361 warning
88  //TDirectory *sub = td ->mkdir((testName+"_Results").c_str(),string("_Results").c_str());
89 
90  //sub = td->mkdir((testName+"_Histos").c_str() ,(testName+"_Histos").c_str());
91  //sub = td->mkdir((testName+"_Histos_AllLS").c_str(),(testName+"_Histos_AllLS").c_str());
92  }
93 
94  // Load histograms in service instance
95  if (hservice_->loadHisto(igetter, testName, histPath)) {
96  // Mask channels specified in python file
97  hservice_->setMaskedBins(testName, algoParameters.getParameter<vector<ParameterSet> >("maskedAreas"));
98 
99  // Book MonitorElements
100  // * Test results
101  ibooker.setCurrentFolder("L1T/L1TOccupancy/Results");
102  string title = testName;
103  MonitorElement* m = ibooker.book2D(title.c_str(), hservice_->getDifferentialHistogram(testName));
104  m->setTitle(title);
105  m->Reset();
106  meResults[title] = m;
107 
108  // * Which cells are masked as bad
109  ibooker.setCurrentFolder("L1T/L1TOccupancy/HistogramDiff");
110  title = testName;
111  m = ibooker.book2D(title.c_str(), hservice_->getDifferentialHistogram(testName));
112  m->Reset();
113  m->setTitle(title);
114  meDifferential[title] = m;
115 
116  // * Fraction of bad cells
117  ibooker.setCurrentFolder("L1T/L1TOccupancy/Certification");
118  title = testName;
119  m = ibooker.book1D(title.c_str(), title.c_str(), 2500, -.5, 2500. - .5);
120  m->setTitle(title);
121  meCertification[title] = m;
122 
123  mValidTests.push_back(&(*it));
124  }
125  }
126  }
127 }
128 
129 //____________________________________________________________________________
130 // Function: endRun
131 // Description: This is will be run at the end of each run
132 // Inputs:
133 // * const Run& r = Run information
134 // * const EventSetup& context = Event Setup information
135 //____________________________________________________________________________
137  book(ibooker, igetter);
138 
139  if (verbose_) {
140  cout << "[L1TOccupancyClient:] Called endRun()" << endl;
141  }
142 
143  // Loop over every test in python
144  for (std::vector<ParameterSet*>::iterator it = mValidTests.begin(); it != mValidTests.end(); it++) {
145  ParameterSet& test = (**it);
146  string algo_name = test.getUntrackedParameter<string>("algoName", "XYSymmetry");
147  string test_name = test.getParameter<string>("testName");
148 
149  if (verbose_) {
150  cout << "[L1TOccupancyClient:] Starting calculations for: " << algo_name << " on: " << test_name << endl;
151  }
152 
153  if (algo_name == "XYSymmetry") {
154  ParameterSet ps = (**it).getParameter<ParameterSet>("algoParams");
155  string histPath = ps.getParameter<string>("histPath");
156 
157  vector<pair<int, double> > deadChannels;
158  vector<pair<int, double> > statDev;
159  bool enoughStats = false;
160 
161  // Make final block
162  hservice_->updateHistogramEndRun(test_name);
163 
164  // Perform the test
165  double dead = xySymmetry(ps, test_name, deadChannels, statDev, enoughStats);
166  stringstream str;
167  str << test_name << "_cumu_LS_EndRun";
168 
169  if (verbose_) {
170  TH2F* cumulative_save = (TH2F*)hservice_->getDifferentialHistogram(test_name)->Clone(str.str().c_str());
171 
172  cumulative_save->SetTitle(str.str().c_str());
173 
174  TDirectory* td = file_->GetDirectory(test_name.c_str());
175 
176  td->cd(string(test_name + "_Histos_AllLS").c_str());
177 
178  cumulative_save->Write();
179  }
180  // If we have enough statistics, we can write test result
181  if (enoughStats) {
182  // Make the result histogram
183  printDeadChannels(deadChannels, meResults[test_name]->getTH2F(), statDev, test_name);
184 
185  if (verbose_) {
186  TH2F* cumulative_save = (TH2F*)hservice_->getDifferentialHistogram(test_name)->Clone(str.str().c_str());
187  cumulative_save->SetTitle(str.str().c_str());
188  TDirectory* td = file_->GetDirectory(("DQM_L1TOccupancyClient_Snapshots_LS.root:/" + test_name).c_str());
189  td->cd(string(test_name + "_Histos").c_str());
190  cumulative_save->Write();
191 
192  // save the result histo
193  TH2F* h2f = meResults[test_name]->getTH2F();
194  stringstream str2;
195  str2 << test_name << "_result_LS_EndRun";
196  TH2F* dead_save = (TH2F*)h2f->Clone(str2.str().c_str());
197 
198  td->cd(string(test_name + "_Results").c_str());
199  dead_save->SetTitle(str2.str().c_str());
200  dead_save->Write();
201  }
202 
203  // Updating test results
204  meDifferential[test_name]->Reset();
205  meDifferential[test_name]->getTH2F()->Add(hservice_->getDifferentialHistogram(test_name));
206 
207  vector<int> lsCertification = hservice_->getLSCertification(test_name);
208 
209  // Fill fraction of dead channels
210  for (unsigned int i = 0; i < lsCertification.size(); i++) {
211  int bin = meCertification[test_name]->getTH1()->FindBin(lsCertification[i]);
212  meCertification[test_name]->getTH1()->SetBinContent(bin, 1 - dead);
213  }
214 
215  // Reset differential histo
216  hservice_->resetHisto(test_name);
217 
218  if (verbose_) {
219  cout << "Now we have enough statstics for " << test_name << endl;
220  }
221 
222  } else {
223  if (verbose_) {
224  cout << "we don't have enough statstics for " << test_name << endl;
225  }
226 
227  // Getting LS which this test monitored
228  vector<int> lsCertification = hservice_->getLSCertification(test_name);
229 
230  // Fill fraction of dead channels
231  for (unsigned int i = 0; i < lsCertification.size(); i++) {
232  int bin = meCertification[test_name]->getTH1()->FindBin(lsCertification[i]);
233  meCertification[test_name]->getTH1()->SetBinContent(bin, -1);
234  }
235  }
236  } else {
237  if (verbose_) {
238  cout << "No valid algorithm" << std::endl;
239  }
240  }
241  }
242 
243  if (verbose_) {
244  file_->Close();
245  }
246 
247  delete hservice_;
248 }
249 
250 //____________________________________________________________________________
251 // Function: endLuminosityBlock
252 // Description: This is will be run at the end of each luminosity block
253 // Inputs:
254 // * const LuminosityBlock& lumiSeg = Luminosity Block information
255 // * const EventSetup& context = Event Setup information
256 //____________________________________________________________________________
258  DQMStore::IGetter& igetter,
259  const edm::LuminosityBlock& lumiSeg,
260  const edm::EventSetup& c) {
261  book(ibooker, igetter);
262 
263  int eventLS = lumiSeg.id().luminosityBlock();
264 
265  if (verbose_) {
266  cout << "[L1TOccupancyClient:] Called endLuminosityBlock()" << endl;
267  cout << "[L1TOccupancyClient:] Lumisection: " << eventLS << endl;
268  }
269 
270  // Loop over every test in python
271  for (std::vector<ParameterSet*>::const_iterator it = mValidTests.begin(); it != mValidTests.end(); it++) {
272  ParameterSet& test = (**it);
273  string algo_name = test.getUntrackedParameter<string>("algoName", "XYSymmetry");
274  string test_name = test.getParameter<string>("testName");
275 
276  if (verbose_) {
277  cout << "[L1TOccupancyClient:] Starting calculations for " << algo_name << " on:" << test_name << endl;
278  }
279 
280  if (algo_name == "XYSymmetry") {
281  ParameterSet ps = (**it).getParameter<ParameterSet>("algoParams");
282  string histPath = ps.getParameter<string>("histPath");
283 
284  vector<pair<int, double> > deadChannels;
285  vector<pair<int, double> > statDev;
286  bool enoughStats = false;
287 
288  // Update histo's data with data of this LS
289  hservice_->updateHistogramEndLS(igetter, test_name, histPath, eventLS);
290 
291  // Perform the test
292  double dead = xySymmetry(ps, test_name, deadChannels, statDev, enoughStats);
293  stringstream str;
294  str << test_name << "_cumu_LS_" << eventLS;
295 
296  if (verbose_) {
297  TH2F* cumulative_save = (TH2F*)hservice_->getDifferentialHistogram(test_name)->Clone(str.str().c_str());
298  cumulative_save->SetTitle(str.str().c_str());
299  TDirectory* td = file_->GetDirectory(test_name.c_str());
300  td->cd(string(test_name + "_Histos_AllLS").c_str());
301  cumulative_save->Write();
302  }
303 
304  // If we have enough statistics, we can write test result
305  if (enoughStats) {
306  // Make the result histogram
307  printDeadChannels(deadChannels, meResults[test_name]->getTH2F(), statDev, test_name);
308 
309  if (verbose_) {
310  TH2F* cumulative_save = (TH2F*)hservice_->getDifferentialHistogram(test_name)->Clone(str.str().c_str());
311  cumulative_save->SetTitle(str.str().c_str());
312  TDirectory* td = file_->GetDirectory(("DQM_L1TOccupancyClient_Snapshots_LS.root:/" + test_name).c_str());
313  td->cd(string(test_name + "_Histos").c_str());
314  cumulative_save->Write();
315 
316  // save the result histo
317  TH2F* h2f = meResults[test_name]->getTH2F();
318  stringstream str2;
319  str2 << test_name << "_result_LS_" << eventLS;
320  TH2F* dead_save = (TH2F*)h2f->Clone(str2.str().c_str());
321 
322  td->cd(string(test_name + "_Results").c_str());
323  dead_save->SetTitle(str2.str().c_str());
324  dead_save->Write();
325  }
326 
327  // Updating test results
328  meDifferential[test_name]->Reset();
329  meDifferential[test_name]->getTH2F()->Add(hservice_->getDifferentialHistogram(test_name));
330 
331  vector<int> lsCertification = hservice_->getLSCertification(test_name);
332 
333  // Fill fraction of dead channels
334  for (unsigned int i = 0; i < lsCertification.size(); i++) {
335  int bin = meCertification[test_name]->getTH1()->FindBin(lsCertification[i]);
336  meCertification[test_name]->getTH1()->SetBinContent(bin, 1 - dead);
337  }
338 
339  // Reset differential histo
340  hservice_->resetHisto(test_name);
341 
342  if (verbose_) {
343  cout << "Now we have enough statstics for " << test_name << endl;
344  }
345 
346  } else {
347  if (verbose_) {
348  cout << "we don't have enough statstics for " << test_name << endl;
349  }
350  }
351  } else {
352  if (verbose_) {
353  cout << "No valid algorithm" << std::endl;
354  }
355  }
356  }
357 }
358 
359 //____________________________________________________________________________
360 // Function: analyze
361 // Description: This is will be run for every event
362 // Inputs:
363 // * const Event& e = Event information
364 // * const EventSetup& context = Event Setup information
365 //____________________________________________________________________________
366 //void L1TOccupancyClient::analyze(const Event& e, const EventSetup& context){}
367 
368 //____________________________________________________________________________
369 // Function: xySymmetry
370 // Description: This method preforms the XY Symmetry test
371 // Inputs:
372 // * ParameterSet ps = Parameters for the test
373 // * std::string test_name = Test name of the test to be executed
374 // * std::vector< pair<int,double> >& deadChannels = Vector of
375 // * std::vector< pair<int,double> >& statDev =
376 // * bool& enoughStats =
377 // Outputs:
378 // * double = fraction of bins that failed test, DeadChannels in vector, in: ParameterSet of test parameters
379 //____________________________________________________________________________
381  string iTestName,
382  vector<pair<int, double> >& deadChannels,
383  vector<pair<int, double> >& statDev,
384  bool& enoughStats) {
385  // Getting differential histogram for this this thes
386  TH2F* diffHist = hservice_->getDifferentialHistogram(iTestName);
387 
388  int pAxis = ps.getUntrackedParameter<int>("axis", 1);
389  int pAverageMode = ps.getUntrackedParameter<int>("averageMode", 2); // 1=arith. mean, 2=median
390  int nBinsX = diffHist->GetNbinsX(); // actual number of bins x
391  int nBinsY = diffHist->GetNbinsY(); // actual number of bins y
392 
393  // Axis==1 : Means symmetry axis is vertical
394  if (pAxis == 1) {
395  int maxBinStrip, centralBinStrip; // x-coordinate of strips
396 
397  maxBinStrip = nBinsX;
398 
399  // If takeCenter=true determine central bin of the pAxis
400  // If takeCenter=false determine the bin to use based user input
401  if (ps.getUntrackedParameter<bool>("takeCenter", true)) {
402  centralBinStrip = nBinsX / 2 + 1;
403  } else {
404  double pAxisSymmetryValue = ps.getParameter<double>("axisSymmetryValue");
405  getBinCoordinateOnAxisWithValue(diffHist, pAxisSymmetryValue, centralBinStrip, 1);
406  }
407 
408  // Assuming odd number of strips --> first comparison is middle strip to itself
409  int upBinStrip = centralBinStrip;
410  int lowBinStrip = centralBinStrip;
411 
412  // If even number decrease lowBinstrip by one
413  if (nBinsX % 2 == 0) {
414  lowBinStrip--;
415  }
416 
417  // Do we have enough statistics? Min(Max(strip_i,strip_j))>threshold
418  std::unique_ptr<double[]> maxAvgs(new double[maxBinStrip - upBinStrip + 1]);
419 
420  int nActualStrips = 0; //number of strips that are not fully masked
421  for (int i = 0, j = upBinStrip, k = lowBinStrip; j <= maxBinStrip; i++, j++, k--) {
422  double avg1 = getAvrg(diffHist, iTestName, pAxis, nBinsY, j, pAverageMode);
423  double avg2 = getAvrg(diffHist, iTestName, pAxis, nBinsY, k, pAverageMode);
424 
425  // Protection for when both strips are masked
426  if (!hservice_->isStripMasked(iTestName, j, pAxis) && !hservice_->isStripMasked(iTestName, k, pAxis)) {
427  maxAvgs[i] = TMath::Max(avg1, avg2);
428  nActualStrips++;
429  }
430  }
431 
432  vector<double> defaultMu0up;
433  defaultMu0up.push_back(13.7655);
434  defaultMu0up.push_back(184.742);
435  defaultMu0up.push_back(50735.3);
436  defaultMu0up.push_back(-97.6793);
437 
438  TF1 tf("myFunc", "[0]*(TMath::Log(x*[1]+[2]))+[3]", 10., 11000.);
439  vector<double> params = ps.getUntrackedParameter<vector<double> >("params_mu0_up", defaultMu0up);
440  for (unsigned int i = 0; i < params.size(); i++) {
441  tf.SetParameter(i, params[i]);
442  }
443  int statsup = (int)tf.Eval(hservice_->getNBinsHistogram(iTestName));
444 
445  vector<double> defaultMu0low;
446  defaultMu0low.push_back(2.19664);
447  defaultMu0low.push_back(1.94546);
448  defaultMu0low.push_back(-99.3263);
449  defaultMu0low.push_back(19.388);
450 
451  params = ps.getUntrackedParameter<vector<double> >("params_mu0_low", defaultMu0low);
452  for (unsigned int i = 0; i < params.size(); i++) {
453  tf.SetParameter(i, params[i]);
454  }
455  int statslow = (int)tf.Eval(hservice_->getNBinsHistogram(iTestName));
456 
457  if (verbose_) {
458  cout << "nbins: " << hservice_->getNBinsHistogram(iTestName) << endl;
459  cout << "statsup= " << statsup << ", statslow= " << statslow << endl;
460  }
461 
462  enoughStats = TMath::MinElement(nActualStrips, maxAvgs.get()) > TMath::Max(statsup, statslow);
463  if (verbose_) {
464  cout << "stats: " << TMath::MinElement(nActualStrips, maxAvgs.get())
465  << ", statsAvg: " << diffHist->GetEntries() / hservice_->getNBinsHistogram(iTestName)
466  << ", threshold: " << TMath::Max(statsup, statslow) << endl;
467  }
468 
469  //if enough statistics
470  //make the test
471  if (enoughStats) {
472  for (; upBinStrip <= maxBinStrip; upBinStrip++, lowBinStrip--) {
473  double avg = getAvrg(diffHist, iTestName, pAxis, nBinsY, upBinStrip, pAverageMode);
474  compareWithStrip(
475  diffHist, iTestName, lowBinStrip, nBinsY, pAxis, avg, ps, deadChannels); //compare with lower side
476 
477  avg = getAvrg(diffHist, iTestName, pAxis, nBinsY, lowBinStrip, pAverageMode);
478  compareWithStrip(
479  diffHist, iTestName, upBinStrip, nBinsY, pAxis, avg, ps, deadChannels); //compare with upper side
480  }
481  }
482  }
483 
484  // pAxis==2 : Means symetry pAxis is horizontal
485  else if (pAxis == 2) {
486  int maxBinStrip, centralBinStrip; //x-coordinate of strips
487 
488  maxBinStrip = nBinsY;
489 
490  // Determine center of diagram: either with set pAxis or middle of diagram
491  if (ps.getUntrackedParameter<bool>("takeCenter", true)) {
492  centralBinStrip = nBinsY / 2 + 1;
493  } else {
494  double pAxisSymmetryValue = ps.getParameter<double>("axisSymmetryValue");
495  getBinCoordinateOnAxisWithValue(diffHist, pAxisSymmetryValue, centralBinStrip, 2);
496  }
497 
498  //assuming odd number of strips --> first comparison is middle strip to itself
499  int lowBinStrip = centralBinStrip, upBinStrip = centralBinStrip;
500 
501  //if even number
502  if (nBinsX % 2 == 0) {
503  //decrease lowBinstrip by one
504  lowBinStrip--;
505  }
506 
507  //do we have enough statistics? Min(Max(strip_i,strip_j))>threshold
508  std::unique_ptr<double[]> maxAvgs(new double[maxBinStrip - upBinStrip + 1]);
509  int nActualStrips = 0;
510  for (int i = 0, j = upBinStrip, k = lowBinStrip; j <= maxBinStrip; i++, j++, k--) {
511  double avg1 = getAvrg(diffHist, iTestName, pAxis, nBinsX, j, pAverageMode);
512  double avg2 = getAvrg(diffHist, iTestName, pAxis, nBinsX, k, pAverageMode);
513  if (!hservice_->isStripMasked(iTestName, j, pAxis) && !hservice_->isStripMasked(iTestName, k, pAxis)) {
514  maxAvgs[i] = TMath::Max(avg1, avg2);
515  nActualStrips++;
516  }
517  }
518 
519  vector<double> defaultMu0up;
520  defaultMu0up.push_back(13.7655);
521  defaultMu0up.push_back(184.742);
522  defaultMu0up.push_back(50735.3);
523  defaultMu0up.push_back(-97.6793);
524 
525  vector<double> params = ps.getUntrackedParameter<std::vector<double> >("params_mu0_up", defaultMu0up);
526  TF1 tf("myFunc", "[0]*(TMath::Log(x*[1]+[2]))+[3]", 10., 11000.);
527  for (unsigned int i = 0; i < params.size(); i++) {
528  tf.SetParameter(i, params[i]);
529  }
530  int statsup = (int)tf.Eval(hservice_->getNBinsHistogram(iTestName));
531 
532  vector<double> defaultMu0low;
533  defaultMu0low.push_back(2.19664);
534  defaultMu0low.push_back(1.94546);
535  defaultMu0low.push_back(-99.3263);
536  defaultMu0low.push_back(19.388);
537 
538  params = ps.getUntrackedParameter<std::vector<double> >("params_mu0_low", defaultMu0low);
539  for (unsigned int i = 0; i < params.size(); i++) {
540  tf.SetParameter(i, params[i]);
541  }
542  int statslow = (int)tf.Eval(hservice_->getNBinsHistogram(iTestName));
543  if (verbose_) {
544  cout << "statsup= " << statsup << ", statslow= " << statslow << endl;
545  }
546  enoughStats = TMath::MinElement(nActualStrips, maxAvgs.get()) > TMath::Max(statsup, statslow);
547  if (verbose_) {
548  cout << "stats: " << TMath::MinElement(nActualStrips, maxAvgs.get())
549  << ", statsAvg: " << diffHist->GetEntries() / hservice_->getNBinsHistogram(iTestName)
550  << ", threshold: " << TMath::Max(statsup, statslow) << endl;
551  }
552 
553  //if we have enough statistics
554  //make the test
555  if (enoughStats) {
556  for (; upBinStrip <= maxBinStrip; upBinStrip++, lowBinStrip--) {
557  double avg = getAvrg(diffHist, iTestName, pAxis, nBinsX, upBinStrip, pAverageMode);
558  compareWithStrip(
559  diffHist, iTestName, lowBinStrip, nBinsX, pAxis, avg, ps, deadChannels); //compare with lower side
560 
561  avg = getAvrg(diffHist, iTestName, pAxis, nBinsX, lowBinStrip, pAverageMode);
562  compareWithStrip(
563  diffHist, iTestName, upBinStrip, nBinsX, pAxis, avg, ps, deadChannels); //compare with upper side
564  }
565  }
566  } else {
567  if (verbose_) {
568  cout << "Invalid axis" << endl;
569  }
570  }
571 
572  return (deadChannels.size() - hservice_->getNBinsMasked(iTestName)) * 1.0 / hservice_->getNBinsHistogram(iTestName);
573 }
574 
575 //____________________________________________________________________________
576 // Function: getAvrg
577 // Description: Calculate strip average with method iAvgMode, where strip is
578 // prependicular to iAxis at bin iBinStrip of histogram iHist
579 // Inputs:
580 // * TH2F* iHist = Histogram to be tested
581 // * string iTestName = Name of the test
582 // * int iAxis = Axis prependicular to plot symmetry
583 // * int iNBins = Number of bins in the strip
584 // * int iBinStrip = Bin corresponding to the strip in iAxis
585 // * int iAvgMode = Type of average mode 1) Average 2) Median
586 // Outputs:
587 // * double = Average of input strip
588 //____________________________________________________________________________
589 double L1TOccupancyClient::getAvrg(TH2F* iHist, string iTestName, int iAxis, int iNBins, int iBinStrip, int iAvgMode) {
590  double avg = 0.0;
591  TH1D* proj = nullptr;
592  TH2F* histo = new TH2F(*iHist);
593 
594  std::vector<double> values;
595  int marked;
596 
597  if (iAxis == 1) {
598  switch (iAvgMode) {
599  // arithmetic average
600  case 1:
601  marked = hservice_->maskBins(iTestName, histo, iBinStrip, iAxis);
602  proj = histo->ProjectionX();
603  avg = proj->GetBinContent(iBinStrip) / (iNBins - marked);
604  break;
605 
606  // median
607  case 2:
608  marked = hservice_->maskBins(iTestName, histo, iBinStrip, iAxis);
609  proj = histo->ProjectionY("_py", iBinStrip, iBinStrip);
610  for (int i = 0; i < iNBins; i++) {
611  values.push_back(proj->GetBinContent(i + 1));
612  }
613  avg = TMath::Median(iNBins, &values[0]);
614  break;
615  default:
616  if (verbose_) {
617  cout << "Invalid averaging mode!" << endl;
618  }
619  break;
620  }
621  } else if (iAxis == 2) {
622  switch (iAvgMode) {
623  // arithmetic average
624  case 1:
625  marked = hservice_->maskBins(iTestName, histo, iBinStrip, iAxis);
626  proj = histo->ProjectionY();
627  avg = proj->GetBinContent(iBinStrip) / (iNBins - marked);
628  break;
629  // median
630  case 2:
631  marked = hservice_->maskBins(iTestName, histo, iBinStrip, iAxis);
632  proj = histo->ProjectionX("_px", iBinStrip, iBinStrip);
633  for (int i = 0; i < iNBins; i++) {
634  values.push_back(proj->GetBinContent(i + 1));
635  }
636 
637  avg = TMath::Median(iNBins, &values[0]);
638  break;
639  default:
640  if (verbose_) {
641  cout << "invalid averaging mode!" << endl;
642  }
643  break;
644  }
645  } else {
646  if (verbose_) {
647  cout << "invalid axis" << endl;
648  }
649  }
650  delete proj;
651  delete histo;
652  return avg;
653 }
654 
655 //____________________________________________________________________________
656 // Function: printDeadChannels
657 // Description:
658 // Inputs:
659 // * vector< pair<int,double> > iDeadChannels = List of bin that are masked of failed tthe test
660 // * TH2F* oHistDeadChannels = Histogram where test results should be printed
661 // * vector< pair<int,double> > statDev = ???
662 // * string iTestName = Name of the test
663 //____________________________________________________________________________
664 void L1TOccupancyClient::printDeadChannels(const vector<pair<int, double> >& iDeadChannels,
665  TH2F* oHistDeadChannels,
666  const vector<std::pair<int, double> >& statDev,
667  string iTestName) {
668  // Reset the dead channels histogram
669  oHistDeadChannels->Reset();
670  if (verbose_) {
671  cout << "suspect or masked channels of " << iTestName << ": ";
672  }
673 
674  int x, y, z;
675 
676  // put all bad (value=1) and masked (value=-1) cells in histo
677  for (std::vector<pair<int, double> >::const_iterator it = iDeadChannels.begin(); it != iDeadChannels.end(); it++) {
678  int bin = (*it).first;
679  oHistDeadChannels->GetBinXYZ(bin, x, y, z);
680 
681  if (hservice_->isMasked(iTestName, x, y)) {
682  oHistDeadChannels->SetBinContent(bin, -1);
683  if (verbose_) {
684  printf("(%4i,%4i) Masked\n", x, y);
685  }
686  } else {
687  oHistDeadChannels->SetBinContent(bin, 1);
688  if (verbose_) {
689  printf("(%4i,%4i) Failed test\n", x, y);
690  }
691  }
692  }
693 
694  if (verbose_) {
695  cout << "total number of suspect channels: " << (iDeadChannels.size() - (hservice_->getNBinsMasked(iTestName)))
696  << endl;
697  }
698 }
699 
700 //____________________________________________________________________________
701 // Function: compareWithStrip
702 // Description: Evaluates statistical compatibility of a strip (cell by cell) against a given average
703 // Inputs:
704 // * TH2F* iHist = Histogram to be tested
705 // * string iTestName = Which test to apply
706 // * int iBinStrip = Bin Coordinate (in bin units) of the stripo
707 // * int iNBins = Number of Bins in the strip
708 // * int iAxis = Which Axis is prependicular to the plot symmetry.
709 // * double iAvg = Average of the strip
710 // * ParameterSet iPS = Parameters for the test
711 // * vector<pair<int,double> >& oChannels = Output of bin that are masked or failed the test
712 // Outputs:
713 // * int = Number of dead channels
714 //____________________________________________________________________________
716  string iTestName,
717  int iBinStrip,
718  int iNBins,
719  int iAxis,
720  double iAvg,
721  const ParameterSet& iPS,
722  vector<pair<int, double> >& oChannels) {
723  int dead = 0;
724 
725  //
726  if (iAxis == 1) {
727  // Get and set parameters for working curves
728  TF1* fmuup = new TF1("fmuup", "TMath::Log(TMath::PoissonI(x,[0])/TMath::PoissonI(x,[1]))", -10000., 10000.);
729  TF1* fmulow = new TF1("fmulow", "TMath::Log(TMath::PoissonI(x,[0])/TMath::PoissonI(x,[1]))", -10000., 10000.);
730  fmuup->SetParameter(0, iAvg * iPS.getUntrackedParameter<double>("factorup", 2.0));
731  fmuup->SetParameter(1, iAvg);
732  fmulow->SetParameter(0, iAvg * iPS.getUntrackedParameter<double>("factorlow", 0.1));
733  fmulow->SetParameter(1, iAvg);
734 
735  TF1* fchi = new TF1("fchi", "[0]*x**2+[1]*x+[2]", 0., 1500.);
736 
737  // Evaluate sigma up
738  vector<double> defaultChi2up;
739  defaultChi2up.push_back(5.45058e-05);
740  defaultChi2up.push_back(0.268756);
741  defaultChi2up.push_back(-11.7515);
742 
743  vector<double> params = iPS.getUntrackedParameter<vector<double> >("params_chi2_up", defaultChi2up);
744  for (unsigned int i = 0; i < params.size(); i++) {
745  fchi->SetParameter(i, params[i]);
746  }
747  double sigma_up = fchi->Eval(iAvg);
748 
749  // Evaluate sigma low
750  vector<double> defaultChi2low;
751  defaultChi2low.push_back(4.11095e-05);
752  defaultChi2low.push_back(0.577451);
753  defaultChi2low.push_back(-10.378);
754 
755  params = iPS.getUntrackedParameter<vector<double> >("params_chi2_low", defaultChi2low);
756  for (unsigned int i = 0; i < params.size(); i++) {
757  fchi->SetParameter(i, params[i]);
758  }
759  double sigma_low = fchi->Eval(iAvg);
760 
761  if (verbose_) {
762  cout << "binstrip= " << iBinStrip << ", sigmaup= " << sigma_up << ", sigmalow= " << sigma_low << endl;
763  }
764 
765  for (int i = 1; i <= iNBins; i++) {
766  if (verbose_) {
767  cout << " " << i << " binContent: up:" << fmuup->Eval(iHist->GetBinContent(iBinStrip, i))
768  << " low: " << fmulow->Eval(iHist->GetBinContent(iBinStrip, i)) << endl;
769  }
770 
771  // Evaluate chi2 for cells
772  double muup = fmuup->Eval(iHist->GetBinContent(iBinStrip, i));
773  double mulow = fmulow->Eval(iHist->GetBinContent(iBinStrip, i));
774 
775  // If channel is masked -> set it to value -1
776  if (hservice_->isMasked(iTestName, iBinStrip, i)) {
777  oChannels.push_back(pair<int, double>(iHist->GetBin(iBinStrip, i), -1.0));
778  }
779  //else perform test
780  else if (muup > sigma_up || mulow > sigma_low ||
781  ((fabs(muup) == std::numeric_limits<double>::infinity()) &&
782  (fabs(mulow) == std::numeric_limits<double>::infinity()))) {
783  dead++;
784  oChannels.push_back(
785  pair<int, double>(iHist->GetBin(iBinStrip, i), abs(iHist->GetBinContent(iBinStrip, i) - iAvg) / iAvg));
786  }
787  }
788  }
789  //
790  else if (iAxis == 2) {
791  //get and set parameters for working curves
792  TF1* fmuup = new TF1("fmuup", "TMath::Log(TMath::PoissonI(x,[0])/TMath::PoissonI(x,[1]))", -10000., 10000.);
793  TF1* fmulow = new TF1("fmulow", "TMath::Log(TMath::PoissonI(x,[0])/TMath::PoissonI(x,[1]))", -10000., 10000.);
794  fmuup->SetParameter(0, iAvg * iPS.getUntrackedParameter<double>("factorup", 2.0));
795  fmuup->SetParameter(1, iAvg);
796  fmulow->SetParameter(0, iAvg * iPS.getUntrackedParameter<double>("factorlow", 0.1));
797  fmulow->SetParameter(1, iAvg);
798 
799  TF1* fchi = new TF1("fchi", "[0]*x**2+[1]*x+[2]", 0., 1500.);
800 
801  // Evaluate sigma up
802  vector<double> defaultChi2up;
803  defaultChi2up.push_back(5.45058e-05);
804  defaultChi2up.push_back(0.268756);
805  defaultChi2up.push_back(-11.7515);
806 
807  vector<double> params = iPS.getUntrackedParameter<vector<double> >("params_chi2_up", defaultChi2up);
808  for (unsigned int i = 0; i < params.size(); i++) {
809  fchi->SetParameter(i, params[i]);
810  }
811  double sigma_up = fchi->Eval(iAvg);
812 
813  // Evaluate sigma low
814  vector<double> defaultChi2low;
815  defaultChi2low.push_back(4.11095e-05);
816  defaultChi2low.push_back(0.577451);
817  defaultChi2low.push_back(-10.378);
818 
819  params = iPS.getUntrackedParameter<vector<double> >("params_chi2_low", defaultChi2low);
820  for (unsigned int i = 0; i < params.size(); i++) {
821  fchi->SetParameter(i, params[i]);
822  }
823  double sigma_low = fchi->Eval(iAvg);
824 
825  if (verbose_) {
826  cout << "binstrip= " << iBinStrip << ", sigmaup= " << sigma_up << ", sigmalow= " << sigma_low << endl;
827  }
828 
829  for (int i = 1; i <= iNBins; i++) {
830  if (verbose_) {
831  cout << " " << i << " binContent: up:" << fmuup->Eval(iHist->GetBinContent(i, iBinStrip))
832  << " low: " << fmulow->Eval(iHist->GetBinContent(i, iBinStrip)) << endl;
833  }
834 
835  //evaluate chi2 for cells
836  double muup = fmuup->Eval(iHist->GetBinContent(i, iBinStrip));
837  double mulow = fmulow->Eval(iHist->GetBinContent(i, iBinStrip));
838 
839  //if channel is masked -> set it to value -1
840  if (hservice_->isMasked(iTestName, i, iBinStrip)) {
841  oChannels.push_back(pair<int, double>(iHist->GetBin(iBinStrip, i), -1.0));
842  }
843  //else perform test
844  else if (muup > sigma_up || mulow > sigma_low ||
845  ((fabs(muup) == std::numeric_limits<double>::infinity()) &&
846  (fabs(mulow) == std::numeric_limits<double>::infinity()))) {
847  dead++;
848  oChannels.push_back(
849  pair<int, double>(iHist->GetBin(i, iBinStrip), abs(iHist->GetBinContent(i, iBinStrip) - iAvg) / iAvg));
850  }
851  }
852  } else {
853  if (verbose_) {
854  cout << "invalid axis" << endl;
855  }
856  }
857 
858  return dead;
859 }
860 
861 //____________________________________________________________________________
862 // Function: getBinCoordinateOnAxisWithValue
863 // Description: Returns the bin global bin number with the iValue in the iAxis
864 // Inputs:
865 // * TH2F* iHist = Histogram to be tested
866 // * double iValue = Value to be evaluated in the histogram iHist
867 // * int& oBinCoordinate = (output) bin number (X or Y) for iValue
868 // * int iAxis = Axis to be used
869 //____________________________________________________________________________
870 void L1TOccupancyClient::getBinCoordinateOnAxisWithValue(TH2F* iHist, double iValue, int& oBinCoordinate, int iAxis) {
871  int nBinsX = iHist->GetNbinsX(); //actual number of bins x
872  int nBinsY = iHist->GetNbinsY(); //actual number of bins y
873 
874  if (iAxis == 1) {
875  int global = iHist->GetXaxis()->FindFixBin(iValue);
876 
877  // If parameter exceeds axis' value: set to maximum number of bins in x-axis
878  if (global > nBinsX * nBinsY) {
879  global = iHist->GetXaxis()->GetLast();
880  }
881 
882  // Get coordinates of bin
883  int y, z;
884  iHist->GetBinXYZ(global, oBinCoordinate, y, z);
885  } else if (iAxis == 2) {
886  int global = iHist->GetYaxis()->FindFixBin(iValue);
887 
888  // If parameter exceeds axis' value: set to maximum number of bins in x-axis
889  if (global > nBinsX * nBinsY) {
890  global = iHist->GetYaxis()->GetLast();
891  }
892 
893  // Get coordinates of bin
894  int x, z;
895  iHist->GetBinXYZ(global, x, oBinCoordinate, z);
896  }
897 }
898 
899 //define this as a plug-in
LuminosityBlockNumber_t luminosityBlock() const
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
void getBinCoordinateOnAxisWithValue(TH2F *h2f, double content, int &coord, int axis)
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
void printDeadChannels(const std::vector< std::pair< int, double > > &deadChannels, TH2F *h2f, const std::vector< std::pair< int, double > > &statDev, std::string test_name)
double getAvrg(TH2F *h2f, std::string test, int axis, int nBins, int binStrip, int avrgMode)
double xySymmetry(const edm::ParameterSet &ps, std::string test_name, std::vector< std::pair< int, double > > &deadChannels, std::vector< std::pair< int, double > > &statDev, bool &enoughStats)
void dqmEndJob(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter) override
T getUntrackedParameter(std::string const &, T const &) const
void book(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter)
const double infinity
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
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:221
void dqmEndLuminosityBlock(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, const edm::LuminosityBlock &lumiSeg, const edm::EventSetup &c) override
HLT enums.
float x
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
#define str(s)
int compareWithStrip(TH2F *histo, std::string test, int binStrip, int nBins, int axis, double avg, const edm::ParameterSet &ps, std::vector< std::pair< int, double > > &deadChannels)
L1TOccupancyClient(const edm::ParameterSet &ps)
Constructor.
~L1TOccupancyClient() override
Destructor.