Belle II Software development
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
21using namespace std;
22using namespace Belle2;
23
24//-----------------------------------------------------------------
25// Register the Module
26//-----------------------------------------------------------------
27REG_MODULE(DQMHistAnalysisSVDEfficiency);
28
29//-----------------------------------------------------------------
30// Implementation
31//-----------------------------------------------------------------
32
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 //build the legend
58 m_legProblem = new TPaveText(0.62, 0.22, 0.88, 0.35, "brNDC");
59 m_legProblem->AddText("ERROR!");
60 m_legProblem->AddText("at least one sensor with:");
61 m_legProblem->AddText(Form("efficiency < %1.0f%%", m_effError * 100));
62 m_legProblem->SetFillColor(c_ColorDefault);
63 m_legProblem->SetLineColor(kBlack);
64
65 m_legWarning = new TPaveText(0.62, 0.22, 0.88, 0.35, "brNDC");
66 m_legWarning->AddText("WARNING!");
67 m_legWarning->AddText("at least one sensor with:");
68 m_legWarning->AddText(Form("%1.0f%% < efficiency < %1.0f%%", m_effError * 100, m_effWarning * 100));
69 m_legWarning->SetFillColor(c_ColorDefault);
70 m_legWarning->SetLineColor(kBlack);
71
72 m_legNormal = new TPaveText(0.62, 0.22, 0.88, 0.35, "brNDC");
73 m_legNormal->AddText("EFFICIENCY WITHIN LIMITS");
74 m_legNormal->AddText(Form("efficiency > %1.0f%%", m_effWarning * 100));
75 m_legNormal->SetFillColor(c_ColorDefault);
76 m_legNormal->SetLineColor(kBlack);
77
78 m_legEmpty = new TPaveText(0.62, 0.22, 0.88, 0.35, "brNDC");
79 m_legEmpty->AddText("Not enough statistics,");
80 m_legEmpty->AddText("check again in a few minutes");
81 m_legEmpty->SetFillColor(c_ColorDefault);
82 m_legEmpty->SetTextColor(kWhite);
83 m_legEmpty->SetLineColor(kBlack);
84
85
87
88 //collect the list of all SVD Modules in the geometry here
89 std::vector<VxdID> sensors = geo.getListOfSensors();
90 for (VxdID& aVxdID : sensors) {
91 VXD::SensorInfoBase info = geo.getSensorInfo(aVxdID);
92 // B2INFO("VXD " << aVxdID);
93 if (info.getType() != VXD::SensorInfoBase::SVD) continue;
94 m_SVDModules.push_back(aVxdID); // reorder, sort would be better
95 }
96 std::sort(m_SVDModules.begin(), m_SVDModules.end()); // back to natural order
97
98
99 gROOT->cd();
100 m_cEfficiencyU = new TCanvas("SVDAnalysis/c_SVDEfficiencyU");
101 m_cEfficiencyV = new TCanvas("SVDAnalysis/c_SVDEfficiencyV");
102 m_cEfficiencyErrU = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrU");
103 m_cEfficiencyErrV = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrV");
104
105 m_hEfficiency = new SVDSummaryPlots("SVDEfficiency@view", "Summary of SVD efficiencies (%), @view/@side Side");
107 m_hEfficiencyErr = new SVDSummaryPlots("SVDEfficiencyErr@view", "Summary of SVD efficiencies errors (%), @view/@side Side");
109
110
111 if (m_3Samples) {
112 m_cEfficiencyU3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyU3Samples");
113 m_cEfficiencyV3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyV3Samples");
114 m_cEfficiencyErrU3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrU3Samples");
115 m_cEfficiencyErrV3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrV3Samples");
116
117 m_hEfficiency3Samples = new SVDSummaryPlots("SVD3Efficiency@view",
118 "Summary of SVD efficiencies (%), @view/@side Side for 3 samples");
120
121 m_hEfficiencyErr3Samples = new SVDSummaryPlots("SVD3EfficiencyErr@view",
122 "Summary of SVD efficiencies errors (%), @view/@side Side for 3 samples");
124
125 }
126
127 //register limits for EPICS
128 registerEpicsPV(m_pvPrefix + "efficiencyLimits", "effLimits");
129
130 //find nEvents testing if histograms are present
131 TH1* hnEvnts = findHist("SVDExpReco/SVDDQM_nEvents");
132 if (hnEvnts == NULL) {
133 B2INFO("no events, nothing to do here");
134 return;
135 }
136
137}
138
140{
141 B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: beginRun called.");
142
143 if (m_cEfficiencyU)
144 m_cEfficiencyU->Clear();
145 if (m_cEfficiencyV)
146 m_cEfficiencyV->Clear();
148 m_cEfficiencyErrU->Clear();
150 m_cEfficiencyErrV->Clear();
151
152 if (m_3Samples) {
154 m_cEfficiencyU3Samples->Clear();
156 m_cEfficiencyV3Samples->Clear();
161 }
162
163 //Retrieve limits from EPICS
164 double effErrorLo = 0.;
165 double effWarnLo = 0.;
166
167 requestLimitsFromEpicsPVs("effLimits", effErrorLo, effWarnLo, m_effWarning, m_effError);
168
169 B2DEBUG(10, " SVD efficiency thresholds taken from EPICS configuration file:");
170 B2DEBUG(10, " EFFICIENCY: normal > " << m_effWarning << " > warning > " << m_effError << " > error with minimum statistics of " <<
172}
173
175{
176 B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: event called.");
177
178 //find nEvents
179 TH1* hnEvnts = findHist("SVDExpReco/SVDDQM_nEvents", true);
180 if (hnEvnts == NULL) {
181 B2INFO("no events, nothing to do here");
182 return;
183 } else {
184 B2DEBUG(10, "SVDExpReco/SVDDQM_nEvents found");
185 }
186
187 TString tmp = hnEvnts->GetTitle();
188 Int_t pos = tmp.Last('~');
189 if (pos == -1) pos = 0;
190
191 TString runID = tmp(pos, tmp.Length() - pos);
192 B2INFO("DQMHistAnalysisSVDEfficiencyModule::runID = " << runID);
193
194 gStyle->SetOptStat(0);
195 gStyle->SetPaintTextFormat("2.1f");
196
197 // do it by nhand, the interface of the SVDSummaryPlots does not allow to change the title after cstr
198 if (m_hEfficiency) {
200 m_hEfficiency->setRunID(runID);
201 }
202
203 if (m_hEfficiencyErr) {
206 }
207
208 if (m_3Samples) {
212 }
213
217 }
218 }
219
220 Float_t effU = -1;
221 Float_t effV = -1;
222 Float_t erreffU = -1;
223 Float_t erreffV = -1;
224
225 // Efficiency for the U side
226 TH2F* found_tracksU = (TH2F*)findHist("SVDEfficiency/TrackHitsU");
227 TH2F* matched_clusU = (TH2F*)findHist("SVDEfficiency/MatchedHitsU");
228
229 if (matched_clusU == NULL || found_tracksU == NULL) {
230 B2INFO("Histograms needed for Efficiency computation are not found");
231 m_cEfficiencyU->Draw();
232 m_cEfficiencyU->cd();
233 if (m_hEfficiency)
234 m_hEfficiency->getHistogram(1)->Draw("text");
236 } else {
237 B2DEBUG(10, "U-side Before loop on sensors, size :" << m_SVDModules.size());
239 for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
240 B2DEBUG(10, "module " << i << "," << m_SVDModules[i]);
241 int bin = found_tracksU->FindBin(m_SVDModules[i].getLadderNumber(), findBinY(m_SVDModules[i].getLayerNumber(),
242 m_SVDModules[i].getSensorNumber()));
243 float numU = matched_clusU->GetBinContent(bin);
244 float denU = found_tracksU->GetBinContent(bin);
245 if (denU > 0)
246 effU = numU / denU;
247 else
248 effU = -1;
249 B2DEBUG(10, "effU = " << numU << "/" << denU << " = " << effU);
250 m_hEfficiency->fill(m_SVDModules[i], 1, effU * 100);
251 if (effU == -1)
252 erreffU = -1;
253 else
254 erreffU = std::sqrt(effU * (1 - effU) / denU);
255 m_hEfficiencyErr->fill(m_SVDModules[i], 1, erreffU * 100);
256
257 if (denU < m_statThreshold) {
258 m_effUstatus = std::max(lowStat, m_effUstatus);
259 } else if (effU > m_effWarning) {
260 m_effUstatus = std::max(good, m_effUstatus);
261 } else if ((effU <= m_effWarning) && (effU > m_effError)) {
262 m_effUstatus = std::max(warning, m_effUstatus);
263 } else if ((effU <= m_effError)) {
264 m_effUstatus = std::max(error, m_effUstatus);
265 }
266 B2DEBUG(10, "Status is " << m_effUstatus);
267 }
268 }
269
270 //Efficiency for the V side
271 TH2F* found_tracksV = (TH2F*)findHist("SVDEfficiency/TrackHitsV");
272 TH2F* matched_clusV = (TH2F*)findHist("SVDEfficiency/MatchedHitsV");
273
274 if (matched_clusV == NULL || found_tracksV == NULL) {
275 B2INFO("Histograms needed for Efficiency computation are not found");
276 m_cEfficiencyV->cd();
277 m_cEfficiencyV->Draw();
278 if (m_hEfficiency)
279 m_hEfficiency->getHistogram(0)->Draw("text");
281 } else {
282 B2DEBUG(10, "V-side Before loop on sensors, size :" << m_SVDModules.size());
284 for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
285 B2DEBUG(10, "module " << i << "," << m_SVDModules[i]);
286 int bin = found_tracksV->FindBin(m_SVDModules[i].getLadderNumber(), findBinY(m_SVDModules[i].getLayerNumber(),
287 m_SVDModules[i].getSensorNumber()));
288 float numV = matched_clusV->GetBinContent(bin);
289 float denV = found_tracksV->GetBinContent(bin);
290 if (denV > 0)
291 effV = numV / denV;
292 else
293 effV = -1;
294
295 B2DEBUG(10, "effV = " << numV << "/" << denV << " = " << effV);
296 m_hEfficiency->fill(m_SVDModules[i], 0, effV * 100);
297 if (effV == -1)
298 erreffV = -1;
299 else
300 erreffV = std::sqrt(effV * (1 - effV) / denV);
301
302 m_hEfficiencyErr->fill(m_SVDModules[i], 0, erreffV * 100);
303
304 if (denV < m_statThreshold) {
305 m_effVstatus = std::max(lowStat, m_effVstatus);
306 } else if (effV > m_effWarning) {
307 m_effVstatus = std::max(good, m_effVstatus);
308 } else if ((effV <= m_effWarning) && (effV > m_effError)) {
309 m_effVstatus = std::max(warning, m_effVstatus);
310 } else if ((effV <= m_effError)) {
311 m_effVstatus = std::max(error, m_effVstatus);
312 }
313 B2DEBUG(10, "Status is " << m_effVstatus);
314 }
315 }
316
317 // update summary for U side
318 m_cEfficiencyU->Draw();
319 m_cEfficiencyU->cd();
320 if (m_hEfficiency)
321 m_hEfficiency->getHistogram(1)->Draw("text");
322
323 switch (m_effUstatus) {
324 case good: {
326 m_legNormal->Draw();
327 break;
328 }
329 case error: {
331 m_legProblem->Draw();
332 break;
333 }
334 case warning: {
336 m_legWarning->Draw();
337 break;
338 }
339 case lowStat: {
341 m_legEmpty->Draw();
342 break;
343 }
344 default: {
345 B2INFO("effUstatus not set properly: " << m_effUstatus);
346 break;
347 }
348 }
349// setEpicsPV("EfficiencyUAlarm", alarm);
350
351 m_cEfficiencyU->Update();
352 m_cEfficiencyU->Modified();
353 m_cEfficiencyU->Update();
354
355 // update summary for V side
356 m_cEfficiencyV->cd();
357 m_cEfficiencyV->Draw();
358 if (m_hEfficiency)
359 m_hEfficiency->getHistogram(0)->Draw("text");
360
361 switch (m_effVstatus) {
362 case good: {
364 m_legNormal->Draw();
365 break;
366 }
367 case error: {
369 m_legProblem->Draw();
370 break;
371 }
372 case warning: {
374 m_legWarning->Draw();
375 break;
376 }
377 case lowStat: {
379 m_legEmpty->Draw();
380 break;
381 }
382 default: {
383 B2INFO("effVstatus not set properly: " << m_effVstatus);
384 break;
385 }
386 }
387
388 m_cEfficiencyV->Update();
389 m_cEfficiencyV->Modified();
390 m_cEfficiencyV->Update();
391
392 m_cEfficiencyErrU->cd();
394 m_hEfficiencyErr->getHistogram(1)->Draw("colztext");
395 m_cEfficiencyErrU->Draw();
396 m_cEfficiencyErrU->Update();
397 m_cEfficiencyErrU->Modified();
398 m_cEfficiencyErrU->Update();
399
400 m_cEfficiencyErrV->cd();
402 m_hEfficiencyErr->getHistogram(0)->Draw("colztext");
403 m_cEfficiencyErrV->Draw();
404 m_cEfficiencyErrV->Update();
405 m_cEfficiencyErrV->Modified();
406 m_cEfficiencyErrV->Update();
407
408 if (m_3Samples) {
414
415 // Efficiency for the U side - 3 samples
416 TH2F* found3_tracksU = (TH2F*)findHist("SVDEfficiency/TrackHits3U");
417 TH2F* matched3_clusU = (TH2F*)findHist("SVDEfficiency/MatchedHits3U");
418
419 if (matched3_clusU == NULL || found3_tracksU == NULL) {
420 B2INFO("Histograms needed for Efficiency computation are not found");
423 m_hEfficiency3Samples->getHistogram(1)->Draw("text");
425 } else {
426 B2DEBUG(10, "U-side Before loop on sensors, size :" << m_SVDModules.size());
428 for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
429 B2DEBUG(10, "module " << i << "," << m_SVDModules[i]);
430 int bin = found3_tracksU->FindBin(m_SVDModules[i].getLadderNumber(), findBinY(m_SVDModules[i].getLayerNumber(),
431 m_SVDModules[i].getSensorNumber()));
432 float numU = matched3_clusU->GetBinContent(bin);
433 float denU = found3_tracksU->GetBinContent(bin);
434 if (denU > 0)
435 effU = numU / denU;
436 else
437 effU = -1;
438 B2DEBUG(10, "effU = " << numU << "/" << denU << " = " << effU);
439
440 m_hEfficiency3Samples->fill(m_SVDModules[i], 1, effU * 100);
441 if (effU == -1)
442 erreffU = -1;
443 else
444 erreffU = std::sqrt(effU * (1 - effU) / denU);
445 m_hEfficiencyErr3Samples->fill(m_SVDModules[i], 1, erreffU * 100);
446
447 if (denU < m_statThreshold) {
448 m_effUstatus = std::max(lowStat, m_effUstatus);
449 } else if (effU > m_effWarning) {
450 m_effUstatus = std::max(good, m_effUstatus);
451 } else if ((effU <= m_effWarning) && (effU > m_effError)) {
452 m_effUstatus = std::max(warning, m_effUstatus);
453 } else if ((effU <= m_effError)) {
454 m_effUstatus = std::max(error, m_effUstatus);
455 }
456 B2DEBUG(10, "Status is " << m_effUstatus);
457 }
458 }
459
460 //Efficiency for the V side - 3 samples
461 TH2F* found3_tracksV = (TH2F*)findHist("SVDEfficiency/TrackHits3V");
462 TH2F* matched3_clusV = (TH2F*)findHist("SVDEfficiency/MatchedHits3V");
463
464 if (matched3_clusV == NULL || found3_tracksV == NULL) {
465 B2INFO("Histograms needed for Efficiency computation are not found");
468 m_hEfficiency3Samples->getHistogram(1)->Draw("text");
470 } else {
471 B2DEBUG(10, "V-side Before loop on sensors, size :" << m_SVDModules.size());
473 for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
474 B2DEBUG(10, "module " << i << "," << m_SVDModules[i]);
475 int bin = found3_tracksV->FindBin(m_SVDModules[i].getLadderNumber(), findBinY(m_SVDModules[i].getLayerNumber(),
476 m_SVDModules[i].getSensorNumber()));
477 float numV = matched3_clusV->GetBinContent(bin);
478 float denV = found3_tracksV->GetBinContent(bin);
479 if (denV > 0)
480 effV = numV / denV;
481 else
482 effV = -1;
483
484 B2DEBUG(10, "effV = " << numV << "/" << denV << " = " << effV);
485 m_hEfficiency3Samples->fill(m_SVDModules[i], 0, effV * 100);
486 if (effV == -1)
487 erreffV = -1;
488 else
489 erreffV = std::sqrt(effV * (1 - effV) / denV);
490
491 m_hEfficiencyErr3Samples->fill(m_SVDModules[i], 0, erreffV * 100);
492
493 if (denV < m_statThreshold) {
494 m_effVstatus = std::max(lowStat, m_effVstatus);
495 } else if (effV > m_effWarning) {
496 m_effVstatus = std::max(good, m_effVstatus);
497 } else if ((effV <= m_effWarning) && (effV > m_effError)) {
498 m_effVstatus = std::max(warning, m_effVstatus);
499 } else if ((effV <= m_effError)) {
500 m_effVstatus = std::max(error, m_effVstatus);
501 }
502 B2DEBUG(10, "Status is " << m_effVstatus);
503 }
504 }
505
506 // update summary for U side
510 m_hEfficiency3Samples->getHistogram(1)->Draw("text");
511
512 switch (m_effUstatus) {
513 case good: {
515 m_legNormal->Draw();
516 break;
517 }
518 case error: {
520 m_legProblem->Draw();
521 break;
522 }
523 case warning: {
525 m_legWarning->Draw();
526 break;
527 }
528 case lowStat: {
530 m_legEmpty->Draw();
531 break;
532 }
533 default: {
534 B2INFO("effUstatus not set properly: " << m_effUstatus);
535 break;
536 }
537 }
538
539 m_cEfficiencyU3Samples->Update();
540 m_cEfficiencyU3Samples->Modified();
541 m_cEfficiencyU3Samples->Update();
542
543 // update summary for V side
547 m_hEfficiency3Samples->getHistogram(0)->Draw("text");
548
549 switch (m_effVstatus) {
550 case good: {
552 m_legNormal->Draw();
553 break;
554 }
555 case error: {
557 m_legProblem->Draw();
558 break;
559 }
560 case warning: {
562 m_legWarning->Draw();
563 break;
564 }
565 case lowStat: {
567 m_legEmpty->Draw();
568 break;
569 }
570 default: {
571 B2INFO("effVstatus not set properly: " << m_effVstatus);
572 break;
573 }
574 }
575
576 m_cEfficiencyV3Samples->Update();
577 m_cEfficiencyV3Samples->Modified();
578 m_cEfficiencyV3Samples->Update();
579
582 m_hEfficiencyErr3Samples->getHistogram(1)->Draw("colztext");
585 m_cEfficiencyErrU3Samples->Modified();
587
590 m_hEfficiencyErr3Samples->getHistogram(0)->Draw("colztext");
593 m_cEfficiencyErrV3Samples->Modified();
595 }
596}
597
599{
600 B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: endRun called");
601}
602
604{
605 B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: terminate called");
606
607 delete m_refFile;
608 delete m_legProblem;
609 delete m_legWarning;
610 delete m_legNormal;
611 delete m_legEmpty;
612
613 delete m_hEfficiency;
614 delete m_cEfficiencyU;
615 delete m_cEfficiencyV;
616 delete m_hEfficiencyErr;
617 delete m_cEfficiencyErrU;
618 delete m_cEfficiencyErrV;
619
620 if (m_3Samples) {
627 }
628}
629
630// return y coordinate in TH2F histogram for specified sensor
631Int_t DQMHistAnalysisSVDEfficiencyModule::findBinY(Int_t layer, Int_t sensor)
632{
633 if (layer == 3)
634 return sensor; //2 -> 1,2
635 if (layer == 4)
636 return 2 + 1 + sensor; //6 -> 4,5,6
637 if (layer == 5)
638 return 6 + 1 + sensor; // 11 -> 8, 9, 10, 11
639 if (layer == 6)
640 return 11 + 1 + sensor; // 17 -> 13, 14, 15, 16, 17
641 else
642 return -1;
643}
644
The base class for the histogram analysis module.
void colorizeCanvas(TCanvas *canvas, EStatus status)
Helper function for Canvas colorization.
static TH1 * findHist(const std::string &histname, bool onlyIfUpdated=false)
Get histogram from list (no other search).
@ c_ColorDefault
default for non-coloring
@ c_StatusDefault
default for non-coloring
@ c_StatusTooFew
Not enough entries/event to judge.
@ c_StatusError
Analysis result: Severe issue found.
@ c_StatusWarning
Analysis result: Warning, there may be minor issues.
@ c_StatusGood
Analysis result: Good.
int registerEpicsPV(std::string pvname, std::string keyname="")
EPICS related Functions.
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 setStats(bool stats=true)
set histograms stat
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
void setRunID(const TString &runID)
set run ids in title
void reset()
Reset histograms.
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
Abstract base class for different kinds of events.
STL namespace.