Belle II Software  release-08-00-10
DQMHistAnalysisSVDEfficiency.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 //+
9 // File : DQMHistAnalysisSVDEfficiency.cc
10 // Description : module for DQM histogram analysis of SVD sensors efficiencies
11 //-
12 
13 
14 #include <dqm/analysis/modules/DQMHistAnalysisSVDEfficiency.h>
15 #include <vxd/geometry/GeoCache.h>
16 
17 #include <TROOT.h>
18 #include <TStyle.h>
19 #include <TString.h>
20 
21 using namespace std;
22 using namespace Belle2;
23 
24 //-----------------------------------------------------------------
25 // Register the Module
26 //-----------------------------------------------------------------
27 REG_MODULE(DQMHistAnalysisSVDEfficiency);
28 
29 //-----------------------------------------------------------------
30 // Implementation
31 //-----------------------------------------------------------------
32 
33 DQMHistAnalysisSVDEfficiencyModule::DQMHistAnalysisSVDEfficiencyModule()
35  m_effUstatus(good),
36  m_effVstatus(good)
37 {
38  //Parameter definition
39  B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: Constructor done.");
40 
41  setDescription("DQM Analysis Module that computes the average SVD sensor efficiency.");
42 
43  addParam("RefHistoFile", m_refFileName, "Reference histogram file name", std::string("SVDrefHisto.root"));
44  addParam("effLevel_Error", m_effError, "Efficiency error (%) level (red)", double(0.9));
45  addParam("effLevel_Warning", m_effWarning, "Efficiency WARNING (%) level (orange)", double(0.94));
46  addParam("statThreshold", m_statThreshold, "minimal number of tracks per sensor to set green/red alert", double(100));
47  addParam("samples3", m_3Samples, "if True 3 samples histograms analysis is performed", bool(false));
48  addParam("PVPrefix", m_pvPrefix, "PV Prefix", std::string("SVD:"));
49 }
50 
52 
54 {
55  B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: initialize");
56 
57  B2DEBUG(10, " black = " << kBlack);
58  B2DEBUG(10, " green = " << kGreen);
59  B2DEBUG(10, " yellow = " << kYellow);
60  B2DEBUG(10, " Red = " << kRed);
61 
62  //build the legend
63  m_legProblem = new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
64  m_legProblem->AddText("ERROR!");
65  m_legProblem->AddText("at least one sensor with:");
66  m_legProblem->AddText(Form("efficiency < %1.0f%%", m_effError * 100));
67  m_legProblem->SetFillColor(kRed);
68  m_legWarning = new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
69  m_legWarning->AddText("WARNING!");
70  m_legWarning->AddText("at least one sensor with:");
71  m_legWarning->AddText(Form("%1.0f%% < efficiency < %1.0f%%", m_effError * 100, m_effWarning * 100));
72  m_legWarning->SetFillColor(kYellow);
73  m_legNormal = new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
74  m_legNormal->AddText("EFFICIENCY WITHIN LIMITS");
75  m_legNormal->AddText(Form("efficiency > %1.0f%%", m_effWarning * 100));
76  m_legNormal->SetFillColor(kGreen);
77  m_legNormal->SetBorderSize(0.);
78  m_legNormal->SetLineColor(kBlack);
79  m_legEmpty = new TPaveText(11, findBinY(4, 3) - 2, 16, findBinY(4, 3));
80  m_legEmpty->AddText("Not enough statistics,");
81  m_legEmpty->AddText("check again in a few minutes");
82  m_legEmpty->SetFillColor(kBlack);
83  m_legEmpty->SetTextColor(kWhite);
84  m_legEmpty->SetBorderSize(0.);
85  m_legEmpty->SetLineColor(kBlack);
86 
87 
89 
90  //collect the list of all SVD Modules in the geometry here
91  std::vector<VxdID> sensors = geo.getListOfSensors();
92  for (VxdID& aVxdID : sensors) {
93  VXD::SensorInfoBase info = geo.getSensorInfo(aVxdID);
94  // B2INFO("VXD " << aVxdID);
95  if (info.getType() != VXD::SensorInfoBase::SVD) continue;
96  m_SVDModules.push_back(aVxdID); // reorder, sort would be better
97  }
98  std::sort(m_SVDModules.begin(), m_SVDModules.end()); // back to natural order
99 
100  //find nEvents testing if histograms are present
101  TH1* hnEvnts = findHist("SVDExpReco/SVDDQM_nEvents");
102  if (hnEvnts == NULL) {
103  B2INFO("no events, nothing to do here");
104  return;
105  }
106  TString runID = TString((hnEvnts->GetTitle())).Remove(0, 21);
107  B2INFO("runID = " << runID);
108 
109  gROOT->cd();
110  m_cEfficiencyU = new TCanvas("SVDAnalysis/c_SVDEfficiencyU");
111  m_cEfficiencyV = new TCanvas("SVDAnalysis/c_SVDEfficiencyV");
112  m_cEfficiencyErrU = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrU");
113  m_cEfficiencyErrV = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrV");
114 
115  m_hEfficiency = new SVDSummaryPlots("SVDEfficiency@view", Form("Summary of SVD efficiencies (%%), @view/@side Side %s",
116  runID.Data()));
117  m_hEfficiencyErr = new SVDSummaryPlots("SVDEfficiencyErr@view", Form("Summary of SVD efficiencies errors (%%), @view/@side Side %s",
118  runID.Data()));
119 
120 
121  if (m_3Samples) {
122  m_cEfficiencyU3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyU3Samples");
123  m_cEfficiencyV3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyV3Samples");
124  m_cEfficiencyErrU3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrU3Samples");
125  m_cEfficiencyErrV3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrV3Samples");
126 
127  m_hEfficiency3Samples = new SVDSummaryPlots("SVD3Efficiency@view",
128  Form("Summary of SVD efficiencies (%%), @view/@side Side for 3 samples %s", runID.Data()));
129  m_hEfficiencyErr3Samples = new SVDSummaryPlots("SVD3EfficiencyErr@view",
130  Form("Summary of SVD efficiencies errors (%%), @view/@side Side for 3 samples %s", runID.Data()));
131  }
132 
133  //register limits for EPICS
134  registerEpicsPV(m_pvPrefix + "efficiencyLimits", "effLimits");
135 }
136 
138 {
139  B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: beginRun called.");
140  if (m_cEfficiencyU)
141  m_cEfficiencyU->Clear();
142  if (m_cEfficiencyV)
143  m_cEfficiencyV->Clear();
144  if (m_cEfficiencyErrU)
145  m_cEfficiencyErrU->Clear();
146  if (m_cEfficiencyErrV)
147  m_cEfficiencyErrV->Clear();
148 
149  if (m_3Samples) {
151  m_cEfficiencyU3Samples->Clear();
153  m_cEfficiencyV3Samples->Clear();
155  m_cEfficiencyErrU3Samples->Clear();
157  m_cEfficiencyErrV3Samples->Clear();
158  }
159 
160  //Retrieve limits from EPICS
161  double effErrorLo = 0.;
163 
164  B2DEBUG(10, " SVD efficiency thresholds taken from EPICS configuration file:");
165  B2DEBUG(10, " EFFICIENCY: normal > " << m_effWarning << " > warning > " << m_effError << " > error with minimum statistics of " <<
167 }
168 
170 {
171  B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: event called.");
172 
173  //find nEvents
174  TH1* hnEvnts = findHist("SVDExpReco/SVDDQM_nEvents", true);
175  if (hnEvnts == NULL) {
176  B2INFO("no events, nothing to do here");
177  return;
178  } else {
179  B2DEBUG(10, "SVDExpReco/SVDDQM_nEvents found");
180  }
181 
182  gStyle->SetOptStat(0);
183  gStyle->SetPaintTextFormat("2.1f");
184 
185  m_hEfficiency->getHistogram(0)->Reset();
186  m_hEfficiency->getHistogram(1)->Reset();
187  m_hEfficiency->getHistogram(0)->SetStats(0);
188  m_hEfficiency->getHistogram(1)->SetStats(0);
189  m_hEfficiencyErr->getHistogram(0)->Reset();
190  m_hEfficiencyErr->getHistogram(1)->Reset();
191  m_hEfficiencyErr->getHistogram(0)->SetStats(0);
192  m_hEfficiencyErr->getHistogram(1)->SetStats(0);
193 
194 
195  Float_t effU = -1;
196  Float_t effV = -1;
197  Float_t erreffU = -1;
198  Float_t erreffV = -1;
199 
200  // Efficiency for the U side
201  TH2F* found_tracksU = (TH2F*)findHist("SVDEfficiency/TrackHitsU");
202  TH2F* matched_clusU = (TH2F*)findHist("SVDEfficiency/MatchedHitsU");
203 
204  if (matched_clusU == NULL || found_tracksU == NULL) {
205  B2INFO("Histograms needed for Efficiency computation are not found");
206  m_cEfficiencyU->SetFillColor(kRed);
207  } else {
208  B2DEBUG(10, "U-side Before loop on sensors, size :" << m_SVDModules.size());
209  m_effUstatus = good;
210  for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
211  B2DEBUG(10, "module " << i << "," << m_SVDModules[i]);
212  int bin = found_tracksU->FindBin(m_SVDModules[i].getLadderNumber(), findBinY(m_SVDModules[i].getLayerNumber(),
213  m_SVDModules[i].getSensorNumber()));
214  float numU = matched_clusU->GetBinContent(bin);
215  float denU = found_tracksU->GetBinContent(bin);
216  if (denU > 0)
217  effU = numU / denU;
218  else
219  effU = -1;
220  B2DEBUG(10, "effU = " << numU << "/" << denU << " = " << effU);
221  m_hEfficiency->fill(m_SVDModules[i], 1, effU * 100);
222  if (effU == -1)
223  erreffU = -1;
224  else
225  erreffU = std::sqrt(effU * (1 - effU) / denU);
226  m_hEfficiencyErr->fill(m_SVDModules[i], 1, erreffU * 100);
227 
228  if (denU < m_statThreshold) {
229  m_effUstatus = std::max(lowStat, m_effUstatus);
230  } else if (effU > m_effWarning) {
231  m_effUstatus = std::max(good, m_effUstatus);
232  } else if ((effU <= m_effWarning) && (effU > m_effError)) {
233  m_effUstatus = std::max(warning, m_effUstatus);
234  } else if ((effU <= m_effError)) {
235  m_effUstatus = std::max(error, m_effUstatus);
236  }
237  B2DEBUG(10, "Status is " << m_effUstatus);
238  }
239  }
240 
241  //Efficiency for the V side
242  TH2F* found_tracksV = (TH2F*)findHist("SVDEfficiency/TrackHitsV");
243  TH2F* matched_clusV = (TH2F*)findHist("SVDEfficiency/MatchedHitsV");
244 
245  if (matched_clusV == NULL || found_tracksV == NULL) {
246  B2INFO("Histograms needed for Efficiency computation are not found");
247  m_cEfficiencyV->SetFillColor(kRed);
248  } else {
249  B2DEBUG(10, "V-side Before loop on sensors, size :" << m_SVDModules.size());
250  m_effVstatus = good;
251  for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
252  B2DEBUG(10, "module " << i << "," << m_SVDModules[i]);
253  int bin = found_tracksV->FindBin(m_SVDModules[i].getLadderNumber(), findBinY(m_SVDModules[i].getLayerNumber(),
254  m_SVDModules[i].getSensorNumber()));
255  float numV = matched_clusV->GetBinContent(bin);
256  float denV = found_tracksV->GetBinContent(bin);
257  if (denV > 0)
258  effV = numV / denV;
259  else
260  effV = -1;
261 
262  B2DEBUG(10, "effV = " << numV << "/" << denV << " = " << effV);
263  m_hEfficiency->fill(m_SVDModules[i], 0, effV * 100);
264  if (effV == -1)
265  erreffV = -1;
266  else
267  erreffV = std::sqrt(effV * (1 - effV) / denV);
268 
269  m_hEfficiencyErr->fill(m_SVDModules[i], 0, erreffV * 100);
270 
271  if (denV < m_statThreshold) {
272  m_effVstatus = std::max(lowStat, m_effVstatus);
273  } else if (effV > m_effWarning) {
274  m_effVstatus = std::max(good, m_effVstatus);
275  } else if ((effV <= m_effWarning) && (effV > m_effError)) {
276  m_effVstatus = std::max(warning, m_effVstatus);
277  } else if ((effV <= m_effError)) {
278  m_effVstatus = std::max(error, m_effVstatus);
279  }
280  B2DEBUG(10, "Status is " << m_effVstatus);
281  }
282  }
283 
284  // update summary for U side
285  m_cEfficiencyU->cd();
286  m_hEfficiency->getHistogram(1)->Draw("text");
287 
288  switch (m_effUstatus) {
289  case good: {
290  m_cEfficiencyU->SetFillColor(kGreen);
291  m_cEfficiencyU->SetFrameFillColor(10);
292  m_legNormal->Draw("same");
293  break;
294  }
295  case error: {
296  m_cEfficiencyU->SetFillColor(kRed);
297  m_cEfficiencyU->SetFrameFillColor(10);
298  m_legProblem->Draw("same");
299  break;
300  }
301  case warning: {
302  m_cEfficiencyU->SetFillColor(kYellow);
303  m_cEfficiencyU->SetFrameFillColor(10);
304  m_legWarning->Draw("same");
305  break;
306  }
307  case lowStat: {
308  m_cEfficiencyU->SetFillColor(kGray);
309  m_cEfficiencyU->SetFrameFillColor(10);
310  m_legEmpty->Draw("same");
311  break;
312  }
313  default: {
314  B2INFO("effUstatus not set properly: " << m_effUstatus);
315  break;
316  }
317  }
318 // setEpicsPV("EfficiencyUAlarm", alarm);
319 
320  m_cEfficiencyU->Draw("text");
321  m_cEfficiencyU->Update();
322  m_cEfficiencyU->Modified();
323  m_cEfficiencyU->Update();
324 
325  // update summary for V side
326  m_cEfficiencyV->cd();
327  m_hEfficiency->getHistogram(0)->Draw("text");
328 
329  switch (m_effVstatus) {
330  case good: {
331  m_cEfficiencyV->SetFillColor(kGreen);
332  m_cEfficiencyV->SetFrameFillColor(10);
333  m_legNormal->Draw("same");
334  break;
335  }
336  case error: {
337  m_cEfficiencyV->SetFillColor(kRed);
338  m_cEfficiencyV->SetFrameFillColor(10);
339  m_legProblem->Draw("same");
340  break;
341  }
342  case warning: {
343  m_cEfficiencyV->SetFillColor(kYellow);
344  m_cEfficiencyV->SetFrameFillColor(10);
345  m_legWarning->Draw("same");
346  break;
347  }
348  case lowStat: {
349  m_cEfficiencyV->SetFillColor(kGray);
350  m_cEfficiencyV->SetFrameFillColor(10);
351  m_legEmpty->Draw("same");
352  break;
353  }
354  default: {
355  B2INFO("effVstatus not set properly: " << m_effVstatus);
356  break;
357  }
358  }
359 
360  m_cEfficiencyV->Draw();
361  m_cEfficiencyV->Update();
362  m_cEfficiencyV->Modified();
363  m_cEfficiencyV->Update();
364 
365  m_cEfficiencyErrU->cd();
366  m_hEfficiencyErr->getHistogram(1)->Draw("colztext");
367  m_cEfficiencyErrU->Draw();
368  m_cEfficiencyErrU->Update();
369  m_cEfficiencyErrU->Modified();
370  m_cEfficiencyErrU->Update();
371 
372  m_cEfficiencyErrV->cd();
373  m_hEfficiencyErr->getHistogram(0)->Draw("colztext");
374  m_cEfficiencyErrV->Draw();
375  m_cEfficiencyErrV->Update();
376  m_cEfficiencyErrV->Modified();
377  m_cEfficiencyErrV->Update();
378 
379  if (m_3Samples) {
381  m_hEfficiency3Samples->getHistogram(0)->Reset();
382  m_hEfficiency3Samples->getHistogram(1)->Reset();
385 
386  // Efficiency for the U side - 3 samples
387  TH2F* found3_tracksU = (TH2F*)findHist("SVDEfficiency/TrackHits3U");
388  TH2F* matched3_clusU = (TH2F*)findHist("SVDEfficiency/MatchedHits3U");
389 
390  if (matched3_clusU == NULL || found3_tracksU == NULL) {
391  B2INFO("Histograms needed for Efficiency computation are not found");
392  m_cEfficiencyU3Samples->SetFillColor(kRed);
393  } else {
394  B2DEBUG(10, "U-side Before loop on sensors, size :" << m_SVDModules.size());
395  m_effUstatus = good;
396  for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
397  B2DEBUG(10, "module " << i << "," << m_SVDModules[i]);
398  int bin = found3_tracksU->FindBin(m_SVDModules[i].getLadderNumber(), findBinY(m_SVDModules[i].getLayerNumber(),
399  m_SVDModules[i].getSensorNumber()));
400  float numU = matched3_clusU->GetBinContent(bin);
401  float denU = found3_tracksU->GetBinContent(bin);
402  if (denU > 0)
403  effU = numU / denU;
404  else
405  effU = -1;
406  B2DEBUG(10, "effU = " << numU << "/" << denU << " = " << effU);
407 
408  m_hEfficiency3Samples->fill(m_SVDModules[i], 1, effU * 100);
409  if (effU == -1)
410  erreffU = -1;
411  else
412  erreffU = std::sqrt(effU * (1 - effU) / denU);
413  m_hEfficiencyErr3Samples->fill(m_SVDModules[i], 1, erreffU * 100);
414 
415  if (denU < m_statThreshold) {
416  m_effUstatus = std::max(lowStat, m_effUstatus);
417  } else if (effU > m_effWarning) {
418  m_effUstatus = std::max(good, m_effUstatus);
419  } else if ((effU <= m_effWarning) && (effU > m_effError)) {
420  m_effUstatus = std::max(warning, m_effUstatus);
421  } else if ((effU <= m_effError)) {
422  m_effUstatus = std::max(error, m_effUstatus);
423  }
424  B2DEBUG(10, "Status is " << m_effUstatus);
425  }
426  }
427 
428  //Efficiency for the V side - 3 samples
429  TH2F* found3_tracksV = (TH2F*)findHist("SVDEfficiency/TrackHits3V");
430  TH2F* matched3_clusV = (TH2F*)findHist("SVDEfficiency/MatchedHits3V");
431 
432  if (matched3_clusV == NULL || found3_tracksV == NULL) {
433  B2INFO("Histograms needed for Efficiency computation are not found");
434  m_cEfficiencyV3Samples->SetFillColor(kRed);
435  } else {
436  B2DEBUG(10, "V-side Before loop on sensors, size :" << m_SVDModules.size());
437  m_effVstatus = good;
438  for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
439  B2DEBUG(10, "module " << i << "," << m_SVDModules[i]);
440  int bin = found3_tracksV->FindBin(m_SVDModules[i].getLadderNumber(), findBinY(m_SVDModules[i].getLayerNumber(),
441  m_SVDModules[i].getSensorNumber()));
442  float numV = matched3_clusV->GetBinContent(bin);
443  float denV = found3_tracksV->GetBinContent(bin);
444  if (denV > 0)
445  effV = numV / denV;
446  else
447  effV = -1;
448 
449  B2DEBUG(10, "effV = " << numV << "/" << denV << " = " << effV);
450  m_hEfficiency3Samples->fill(m_SVDModules[i], 0, effV * 100);
451  if (effV == -1)
452  erreffV = -1;
453  else
454  erreffV = std::sqrt(effV * (1 - effV) / denV);
455 
456  m_hEfficiencyErr3Samples->fill(m_SVDModules[i], 0, erreffV * 100);
457 
458  if (denV < m_statThreshold) {
459  m_effVstatus = std::max(lowStat, m_effVstatus);
460  } else if (effV > m_effWarning) {
461  m_effVstatus = std::max(good, m_effVstatus);
462  } else if ((effV <= m_effWarning) && (effV > m_effError)) {
463  m_effVstatus = std::max(warning, m_effVstatus);
464  } else if ((effV <= m_effError)) {
465  m_effVstatus = std::max(error, m_effVstatus);
466  }
467  B2DEBUG(10, "Status is " << m_effVstatus);
468  }
469  }
470 
471  // update summary for U side
473  m_hEfficiency3Samples->getHistogram(1)->Draw("text");
474 
475  switch (m_effUstatus) {
476  case good: {
477  m_cEfficiencyU3Samples->SetFillColor(kGreen);
478  m_cEfficiencyU3Samples->SetFrameFillColor(10);
479  m_legNormal->Draw("same");
480  break;
481  }
482  case error: {
483  m_cEfficiencyU3Samples->SetFillColor(kRed);
484  m_cEfficiencyU3Samples->SetFrameFillColor(10);
485  m_legProblem->Draw("same");
486  break;
487  }
488  case warning: {
489  m_cEfficiencyU3Samples->SetFillColor(kYellow);
490  m_cEfficiencyU3Samples->SetFrameFillColor(10);
491  m_legWarning->Draw("same");
492  break;
493  }
494  case lowStat: {
495  m_cEfficiencyU3Samples->SetFillColor(kGray);
496  m_cEfficiencyU3Samples->SetFrameFillColor(10);
497  m_legEmpty->Draw("same");
498  break;
499  }
500  default: {
501  B2INFO("effUstatus not set properly: " << m_effUstatus);
502  break;
503  }
504  }
505 
506  m_cEfficiencyU3Samples->Draw("text");
507  m_cEfficiencyU3Samples->Update();
508  m_cEfficiencyU3Samples->Modified();
509  m_cEfficiencyU3Samples->Update();
510 
511  // update summary for V side
513  m_hEfficiency3Samples->getHistogram(0)->Draw("text");
514 
515  switch (m_effVstatus) {
516  case good: {
517  m_cEfficiencyV3Samples->SetFillColor(kGreen);
518  m_cEfficiencyV3Samples->SetFrameFillColor(10);
519  m_legNormal->Draw("same");
520  break;
521  }
522  case error: {
523  m_cEfficiencyV3Samples->SetFillColor(kRed);
524  m_cEfficiencyV3Samples->SetFrameFillColor(10);
525  m_legProblem->Draw("same");
526  break;
527  }
528  case warning: {
529  m_cEfficiencyV3Samples->SetFillColor(kYellow);
530  m_cEfficiencyV3Samples->SetFrameFillColor(10);
531  m_legWarning->Draw("same");
532  break;
533  }
534  case lowStat: {
535  m_cEfficiencyV3Samples->SetFillColor(kGray);
536  m_cEfficiencyV3Samples->SetFrameFillColor(10);
537  m_legEmpty->Draw("same");
538  break;
539  }
540  default: {
541  B2INFO("effVstatus not set properly: " << m_effVstatus);
542  break;
543  }
544  }
545 
546  m_cEfficiencyV3Samples->Draw();
547  m_cEfficiencyV3Samples->Update();
548  m_cEfficiencyV3Samples->Modified();
549  m_cEfficiencyV3Samples->Update();
550 
552  m_hEfficiencyErr3Samples->getHistogram(1)->Draw("colztext");
554  m_cEfficiencyErrU3Samples->Update();
555  m_cEfficiencyErrU3Samples->Modified();
556  m_cEfficiencyErrU3Samples->Update();
557 
559  m_hEfficiencyErr3Samples->getHistogram(0)->Draw("colztext");
561  m_cEfficiencyErrV3Samples->Update();
562  m_cEfficiencyErrV3Samples->Modified();
563  m_cEfficiencyErrV3Samples->Update();
564  }
565 }
566 
568 {
569  B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: endRun called");
570 }
571 
573 {
574  B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: terminate called");
575 
576  delete m_refFile;
577  delete m_legProblem;
578  delete m_legWarning;
579  delete m_legNormal;
580  delete m_legEmpty;
581 
582  delete m_hEfficiency;
583  delete m_cEfficiencyU;
584  delete m_cEfficiencyV;
585  delete m_hEfficiencyErr;
586  delete m_cEfficiencyErrU;
587  delete m_cEfficiencyErrV;
588 
589  if (m_3Samples) {
590  delete m_hEfficiency3Samples;
591  delete m_cEfficiencyU3Samples;
592  delete m_cEfficiencyV3Samples;
596  }
597 }
598 
599 // return y coordinate in TH2F histogram for specified sensor
600 Int_t DQMHistAnalysisSVDEfficiencyModule::findBinY(Int_t layer, Int_t sensor)
601 {
602  if (layer == 3)
603  return sensor; //2 -> 1,2
604  if (layer == 4)
605  return 2 + 1 + sensor; //6 -> 4,5,6
606  if (layer == 5)
607  return 6 + 1 + sensor; // 11 -> 8, 9, 10, 11
608  if (layer == 6)
609  return 11 + 1 + sensor; // 17 -> 13, 14, 15, 16, 17
610  else
611  return -1;
612 }
613 
The base class for the histogram analysis module.
int registerEpicsPV(std::string pvname, std::string keyname="", bool update_pvs=true)
EPICS related Functions.
static TH1 * findHist(const std::string &histname, bool onlyIfUpdated=false)
Get histogram from list (no other search).
bool requestLimitsFromEpicsPVs(chid id, double &lowerAlarm, double &lowerWarn, double &upperWarn, double &upperAlarm)
Get Alarm Limits from EPICS PV.
SVDSummaryPlots * m_hEfficiency3Samples
efficiency histo for 3 samples
TCanvas * m_cEfficiencyErrV3Samples
efficiency V error plot canvas for 3 samples
TPaveText * m_legEmpty
efficiency plot legend, empty
double m_statThreshold
minimal number of tracks per sensor to set green or red frame
TCanvas * m_cEfficiencyErrU
efficiency U error plot canvas
Int_t findBinY(Int_t layer, Int_t sensor)
find Y bin corresponding to sensor, efficiency plot
std::vector< VxdID > m_SVDModules
IDs of all SVD Modules to iterate over.
effStatus m_effUstatus
number representing the status of the efficiency U side
SVDSummaryPlots * m_hEfficiencyErr3Samples
efficiency error histo for 3 samples
std::string m_pvPrefix
string prefix for EPICS PVs
double m_effWarning
warning level of the efficiency
double m_effError
error level of the efficiency
void terminate() override final
This method is called at the end of the event processing.
TPaveText * m_legWarning
efficiency plot legend, warning
void event() override final
This method is called for each event.
bool m_3Samples
if true enable 3 samples histograms analysis
TCanvas * m_cEfficiencyU3Samples
efficiency U plot canvas for 3 samples
void endRun() override final
This method is called if the current run ends.
TCanvas * m_cEfficiencyErrU3Samples
efficiency U error plot canvas for 3 samples
effStatus m_effVstatus
number representing the status of the efficiency V side
void beginRun() override final
Called when entering a new run.
TPaveText * m_legNormal
efficiency plot legend, normal
TCanvas * m_cEfficiencyV3Samples
efficiency V plot canvas for 3 samples
TCanvas * m_cEfficiencyErrV
efficiency V error plot canvas
TPaveText * m_legProblem
efficiency plot legend, problem
SVDSummaryPlots * m_hEfficiencyErr
efficiency error histo
TFile * m_refFile
The pointer to the reference file.
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
class to summarize SVD quantities per sensor and side
void fill(int layer, int ladder, int sensor, int view, float value)
fill the histogram for
TH2F * getHistogram(int view)
get a reference to the histogram for
Class to faciliate easy access to sensor information of the VXD like coordinate transformations or pi...
Definition: GeoCache.h:39
const std::vector< VxdID > getListOfSensors() const
Get list of all sensors.
Definition: GeoCache.cc:59
const SensorInfoBase & getSensorInfo(Belle2::VxdID id) const
Return a referecne to the SensorInfo of a given SensorID.
Definition: GeoCache.cc:67
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition: GeoCache.cc:214
Base class to provide Sensor Information for PXD and SVD.
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:33
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
Abstract base class for different kinds of events.