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#include <TMath.h>
21
22using namespace std;
23using namespace Belle2;
24
25//-----------------------------------------------------------------
26// Register the Module
27//-----------------------------------------------------------------
28REG_MODULE(DQMHistAnalysisSVDEfficiency);
29
30//-----------------------------------------------------------------
31// Implementation
32//-----------------------------------------------------------------
33
38{
39 //Parameter definition
40 B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: Constructor done.");
41
42 setDescription("DQM Analysis Module that computes the average SVD sensor efficiency.");
43
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("nSigma", m_nSigma, "Number of sigmas to set the DQM status, where sigma = efficiency uncertainty",
48 double(3.));
49 addParam("samples3", m_3Samples, "if True 3 samples histograms analysis is performed", bool(false));
50 addParam("PVPrefix", m_pvPrefix, "PV Prefix", std::string("SVD:"));
51}
52
57
59{
60 B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: initialize");
61
62
64
65 //collect the list of all SVD Modules in the geometry here
66 std::vector<VxdID> sensors = geo.getListOfSensors();
67 for (const auto& aVxdID : sensors) {
68 VXD::SensorInfoBase info = geo.getSensorInfo(aVxdID);
69 // B2INFO("VXD " << aVxdID);
70 if (info.getType() != VXD::SensorInfoBase::SVD) continue;
71 m_SVDModules.push_back(aVxdID); // reorder, sort would be better
72 }
73 std::sort(m_SVDModules.begin(), m_SVDModules.end()); // back to natural order
74
75
76 gROOT->cd();
77 m_cEfficiencyU = new TCanvas("SVDAnalysis/c_SVDEfficiencyU");
78 m_cEfficiencyV = new TCanvas("SVDAnalysis/c_SVDEfficiencyV");
79 m_cEfficiencyErrU = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrU");
80 m_cEfficiencyErrV = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrV");
81
82 m_cEfficiencyRPhiViewU = new TCanvas("SVDAnalysis/c_SVDEfficiencyRPhiViewU", "", 800, 800);
83 m_cEfficiencyRPhiViewV = new TCanvas("SVDAnalysis/c_SVDEfficiencyRPhiViewV", "", 800, 800);
84 m_cEfficiencyErrRPhiViewU = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrRPhiViewU", "", 800, 800);
85 m_cEfficiencyErrRPhiViewV = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrRPhiViewV", "", 800, 800);
86
87 TString hName = getHistoNameFromCanvas(m_cEfficiencyU->GetName(), "@view");
88 m_hEfficiency = new SVDSummaryPlots(hName.Data(), "Summary of SVD efficiencies (%), @view/@side Side");
89 m_hEfficiency->setStats(0);
90 if (m_setColzRange) {
91 m_hEfficiency->setMaximum(m_colzMaximum);
92 m_hEfficiency->setMinimum(m_colzMinimum);
93 }
94 hName = getHistoNameFromCanvas(m_cEfficiencyErrU->GetName(), "@view");
95 m_hEfficiencyErr = new SVDSummaryPlots(hName.Data(), "Summary of SVD efficiencies errors (%), @view/@side Side");
96 m_hEfficiencyErr->setStats(0);
97
98 if (m_3Samples) {
99 m_cEfficiencyU3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiency3SamplesU");
100 m_cEfficiencyV3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiency3SamplesV");
101 m_cEfficiencyErrU3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyErr3SamplesU");
102 m_cEfficiencyErrV3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyErr3SamplesV");
103
104 m_cEfficiencyRPhiViewU3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyRPhiView3SamplesU", "", 800, 800);
105 m_cEfficiencyRPhiViewV3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyRPhiView3SamplesV", "", 800, 800);
106 m_cEfficiencyErrRPhiViewU3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrRPhiView3SamplesU", "", 800, 800);
107 m_cEfficiencyErrRPhiViewV3Samples = new TCanvas("SVDAnalysis/c_SVDEfficiencyErrRPhiView3SamplesV", "", 800, 800);
108
109 hName = getHistoNameFromCanvas(m_cEfficiencyU3Samples->GetName(), "@view");
110 m_hEfficiency3Samples = new SVDSummaryPlots(hName.Data(), "Summary of SVD efficiencies (%), @view/@side Side for 3 samples");
111 m_hEfficiency3Samples->setStats(0);
112 if (m_setColzRange) {
115 }
116 hName = getHistoNameFromCanvas(m_cEfficiencyErrU3Samples->GetName(), "@view");
117 m_hEfficiencyErr3Samples = new SVDSummaryPlots(hName.Data(),
118 "Summary of SVD efficiencies errors (%), @view/@side Side for 3 samples");
119 m_hEfficiencyErr3Samples->setStats(0);
120 }
121
122 //register limits for EPICS
123 registerEpicsPV(m_pvPrefix + "efficiencyLimits", "effLimits");
124
125}
126
128{
129 B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: beginRun called.");
130
131 if (m_cEfficiencyU)
132 m_cEfficiencyU->Clear();
133 if (m_cEfficiencyV)
134 m_cEfficiencyV->Clear();
136 m_cEfficiencyErrU->Clear();
138 m_cEfficiencyErrV->Clear();
139
141 m_cEfficiencyRPhiViewU->Clear();
143 m_cEfficiencyRPhiViewV->Clear();
148
149 if (m_3Samples) {
151 m_cEfficiencyU3Samples->Clear();
153 m_cEfficiencyV3Samples->Clear();
158
167 }
168
169 //Retrieve limits from EPICS
170 double effErrorLo = 0.;
171 double effWarnLo = 0.;
172
173 requestLimitsFromEpicsPVs("effLimits", effErrorLo, effWarnLo, m_effWarning, m_effError);
174
175 B2DEBUG(10, " SVD efficiency thresholds taken from EPICS configuration file:");
176 B2DEBUG(10, " EFFICIENCY: normal > " << m_effWarning << " > warning > " << m_effError << " > error with minimum statistics of " <<
178
179 //build the legend
180 m_legProblem->Clear();
181 m_legProblem->AddText("ERROR!");
182 m_legProblem->AddText("at least one sensor with:");
183 m_legProblem->AddText(Form("efficiency < %1.0f%%", m_effError * 100));
184
185 m_legWarning->Clear();
186 m_legWarning->AddText("WARNING!");
187 m_legWarning->AddText("at least one sensor with:");
188 m_legWarning->AddText(Form("%1.0f%% < efficiency < %1.0f%%", m_effError * 100, m_effWarning * 100));
189
190 m_legNormal->Clear();
191 m_legNormal->AddText("EFFICIENCY WITHIN LIMITS");
192 m_legNormal->AddText(Form("efficiency > %1.0f%%", m_effWarning * 100));
193
194 m_legLowStat->Clear();
195 m_legLowStat->AddText("Not enough statistics,");
196 m_legLowStat->AddText("check again in a few minutes");
197
198 m_legEmpty->Clear();
199 m_legEmpty->AddText("Track/clusters plots are emtpy");
200
203}
204
206{
207 B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: event called.");
208
209 //find nEvents
210 TH1* hnEvnts = findHist("SVDExpReco", "SVDDQM_nEvents", true);
211 if (hnEvnts == NULL) {
212 B2INFO("no events, nothing to do here");
213 return;
214 } else {
215 B2DEBUG(10, "SVDExpReco/SVDDQM_nEvents found");
216 }
217
218 TString tmp = hnEvnts->GetTitle();
219 Int_t pos = tmp.Last('~');
220 if (pos == -1) pos = 0;
221
222 TString runID = tmp(pos, tmp.Length() - pos);
223 B2INFO("DQMHistAnalysisSVDEfficiencyModule::runID = " << runID);
224
225 gStyle->SetOptStat(0);
226 gStyle->SetPaintTextFormat("2.1f");
227
228 // do it by nhand, the interface of the SVDSummaryPlots does not allow to change the title after cstr
229 if (m_hEfficiency) {
230 m_hEfficiency->reset();
231 m_hEfficiency->setRunID(runID);
232 }
233
234 if (m_hEfficiencyErr) {
235 m_hEfficiencyErr->reset();
236 m_hEfficiencyErr->setRunID(runID);
237 }
238
239 if (m_3Samples) {
241 m_hEfficiency3Samples->reset();
242 m_hEfficiency3Samples->setRunID(runID);
243 }
244
247 m_hEfficiencyErr3Samples->setRunID(runID);
248 }
249 }
250
251 Float_t effU = -1;
252 Float_t effV = -1;
253 Float_t effMinU = 9999;
254 Float_t effMinV = 9999;
255 Float_t erreffU = -1;
256 Float_t erreffV = -1;
257
258 // Efficiency for the U and V sides
259 auto found_tracksU = findHist("SVDEfficiency/TrackHitsU");
260 auto matched_clusU = findHist("SVDEfficiency/MatchedHitsU");
261
262 auto found_tracksV = findHist("SVDEfficiency/TrackHitsV");
263 auto matched_clusV = findHist("SVDEfficiency/MatchedHitsV");
264
265 if (matched_clusU != NULL && found_tracksU != NULL && matched_clusV != NULL && found_tracksV != NULL) {
266 B2DEBUG(10, "Before loop on sensors, size :" << m_SVDModules.size());
269 for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
270 B2DEBUG(10, "module " << i << "," << m_SVDModules[i]);
271 int layer = m_SVDModules[i].getLayerNumber();
272 int ladder = m_SVDModules[i].getLadderNumber();
273 int sensor = m_SVDModules[i].getSensorNumber();
274 int bin = found_tracksU->FindBin(ladder, findBinY(layer, sensor));
275 // U-side
276 float numU = matched_clusU->GetBinContent(bin);
277 float denU = found_tracksU->GetBinContent(bin);
278 if (denU > 0) {
279 effU = numU / denU;
280 erreffU = std::sqrt(effU * (1 - effU) / denU);
281 }
282 if (effU < effMinU) effMinU = effU;
283 m_hEfficiency->fill(m_SVDModules[i], 1, effU * 100);
284 m_hEfficiencyErr->fill(m_SVDModules[i], 1, erreffU * 100);
285 B2DEBUG(10, "effU = " << numU << "/" << denU << " = " << effU << " +- " << erreffU);
286
287 // V-side
288 float numV = matched_clusV->GetBinContent(bin);
289 float denV = found_tracksV->GetBinContent(bin);
290 if (denV > 0) {
291 effV = numV / denV;
292 erreffV = std::sqrt(effV * (1 - effV) / denV);
293 }
294 if (effV < effMinV) effMinV = effV;
295 m_hEfficiency->fill(m_SVDModules[i], 0, effV * 100);
296 m_hEfficiencyErr->fill(m_SVDModules[i], 0, erreffV * 100);
297 B2DEBUG(10, "effV = " << numV << "/" << denV << " = " << effV << " +- " << erreffV);
298
299 // Efficiency is already computed, and histograms are already filled at this point
300 // Fooling the setEffStatus for 6.x.1 and 6.x.5 to avoid issue due to small statistics
301 // At this point the den value is used only for the check on statistics
302 if (layer == 6 && (sensor == 1 || sensor == 5)) {
303 if (denU < 100) denU = 100; // If everything works, U and V side have same number of tracks
304 if (denV < 100) denV = 100;
305 }
306
307 setEffStatus(denU, effU, erreffU, m_effUstatus);
308 setEffStatus(denV, effV, erreffV, m_effVstatus);
309
310 B2DEBUG(10, "Status U-side is " << m_effUstatus);
311 B2DEBUG(10, "Status V-side is " << m_effVstatus);
312 }
313 } else {
314 if (matched_clusU == NULL || found_tracksU == NULL) {
315 B2INFO("Histograms needed for U-side Efficiency computation are not found");
316 setEffStatus(-1, -1, 0, m_effUstatus);
317 }
318 if (matched_clusV == NULL || found_tracksV == NULL) {
319 B2INFO("Histograms needed for V-side Efficiency computation are not found");
320 setEffStatus(-1, -1, 0, m_effVstatus);
321 }
322 }
323
324 // update summary for U side
325 m_valueMinimum = effMinU;
327
328 // update summary for V side
329 m_valueMinimum = effMinV;
331
332 // update error summary for U side
334
335 // update error summary for V side
337
338 if (m_3Samples) {
339 effMinU = 9999;
340 effMinV = 9999;
342 m_hEfficiency3Samples->getHistogram(0)->Reset();
343 m_hEfficiency3Samples->getHistogram(1)->Reset();
344 m_hEfficiencyErr3Samples->getHistogram(0)->Reset();
345 m_hEfficiencyErr3Samples->getHistogram(1)->Reset();
346
347 // Efficiency for the U and V-side - 3 samples
348 auto found3_tracksU = findHist("SVDEfficiency/TrackHits3U");
349 auto matched3_clusU = findHist("SVDEfficiency/MatchedHits3U");
350
351 auto found3_tracksV = findHist("SVDEfficiency/TrackHits3V");
352 auto matched3_clusV = findHist("SVDEfficiency/MatchedHits3V");
353
354 if (matched3_clusU != NULL && found3_tracksU != NULL && matched3_clusV != NULL && found3_tracksV != NULL) {
355 B2DEBUG(10, "Before loop on sensors, size :" << m_SVDModules.size());
358 for (unsigned int i = 0; i < m_SVDModules.size(); i++) {
359 B2DEBUG(10, "module " << i << "," << m_SVDModules[i]);
360 int layer = m_SVDModules[i].getLayerNumber();
361 int ladder = m_SVDModules[i].getLadderNumber();
362 int sensor = m_SVDModules[i].getSensorNumber();
363 int bin = found3_tracksU->FindBin(ladder, findBinY(layer, sensor));
364 // U-side
365 float numU = matched3_clusU->GetBinContent(bin);
366 float denU = found3_tracksU->GetBinContent(bin);
367 if (denU > 0) {
368 effU = numU / denU;
369 erreffU = std::sqrt(effU * (1 - effU) / denU);
370 }
371 if (effU < effMinU) effMinU = effU;
372 m_hEfficiency3Samples->fill(m_SVDModules[i], 1, effU * 100);
373 m_hEfficiencyErr3Samples->fill(m_SVDModules[i], 1, erreffU * 100);
374 B2DEBUG(10, "effU = " << numU << "/" << denU << " = " << effU << " +- " << erreffU);
375
376 // V-side
377 float numV = matched3_clusV->GetBinContent(bin);
378 float denV = found3_tracksV->GetBinContent(bin);
379 if (denV > 0) {
380 effV = numV / denV;
381 erreffV = std::sqrt(effV * (1 - effV) / denV);
382 }
383 if (effV < effMinV) effMinV = effV;
384 m_hEfficiency3Samples->fill(m_SVDModules[i], 0, effV * 100);
385 m_hEfficiencyErr3Samples->fill(m_SVDModules[i], 0, erreffV * 100);
386 B2DEBUG(10, "effV = " << numV << "/" << denV << " = " << effV << " +- " << erreffV);
387
388 // Efficiency is already computed, and histograms are already filled at this point
389 // Fooling the setEffStatus for 6.x.1 and 6.x.5 to avoid issue due to small statistics
390 // At this point the den value is used only for the check on statistics
391 if (layer == 6 && (sensor == 1 || sensor == 5)) {
392 if (denU < 100) denU = 100; // If everything works, U and V side have the same number of tracks
393 if (denV < 100) denV = 100;
394 }
395
396 setEffStatus(denU, effU, erreffU, m_effUstatus);
397 setEffStatus(denV, effV, erreffV, m_effVstatus);
398
399 B2DEBUG(10, "Status U-side is " << m_effUstatus);
400 B2DEBUG(10, "Status V-side is " << m_effVstatus);
401 }
402 } else {
403 if (matched3_clusU == NULL || found3_tracksU == NULL) {
404 B2INFO("Histograms needed for Efficiency computation are not found");
405 setEffStatus(-1, -1, 0, m_effUstatus);
406 }
407 if (matched3_clusV == NULL || found3_tracksV == NULL) {
408 B2INFO("Histograms needed for Efficiency computation are not found");
409 setEffStatus(-1, -1, 0, m_effVstatus);
410 }
411 }
412
413 // update summary for U side for 3 samples
414 m_valueMinimum = effMinU;
416
417 // update summary for V side for 3 samples
418 m_valueMinimum = effMinV;
420
421 // update error summary for U side for 3 samples
423
424 // update error summary for V side for 3 samples
426 }
427}
428
430{
431 B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: endRun called");
432}
433
435{
436 B2DEBUG(10, "DQMHistAnalysisSVDEfficiency: terminate called");
437
438 delete m_hEfficiency;
439 delete m_cEfficiencyU;
440 delete m_cEfficiencyV;
441 delete m_hEfficiencyErr;
442 delete m_cEfficiencyErrU;
443 delete m_cEfficiencyErrV;
444
449
450 for (int i = 0; i < (int)m_laddersText.size(); i++) delete m_laddersText[i];
451 for (int i = 0; i < (int)m_sensorsText.size(); i++) delete m_sensorsText[i];
452
453 delete m_ly;
454 delete m_lx;
455 delete m_arrowx;
456 delete m_arrowy;
457
458 if (m_3Samples) {
465
470 }
471}
472
473// return y coordinate in TH2F histogram for specified sensor
474Int_t DQMHistAnalysisSVDEfficiencyModule::findBinY(Int_t layer, Int_t sensor)
475{
476 if (layer == 3)
477 return sensor; //2 -> 1,2
478 if (layer == 4)
479 return 2 + 1 + sensor; //6 -> 4,5,6
480 if (layer == 5)
481 return 6 + 1 + sensor; // 11 -> 8, 9, 10, 11
482 if (layer == 6)
483 return 11 + 1 + sensor; // 17 -> 13, 14, 15, 16, 17
484 else
485 return -1;
486}
487
488
489void DQMHistAnalysisSVDEfficiencyModule::setEffStatus(float den, float eff, float err, svdStatus& efficiencyStatus)
490{
491 if (den < 0) {
492 efficiencyStatus = std::max(noStat, efficiencyStatus);
493 } else if (den < m_statThreshold) {
494 efficiencyStatus = std::max(lowStat, efficiencyStatus);
495 } else if (eff + m_nSigma * err > m_effWarning) {
496 efficiencyStatus = std::max(good, efficiencyStatus);
497 } else if ((eff + m_nSigma * err <= m_effWarning) && (eff + m_nSigma * err > m_effError)) {
498 efficiencyStatus = std::max(warning, efficiencyStatus);
499 } else if ((eff + m_nSigma * err <= m_effError)) {
500 efficiencyStatus = std::max(error, efficiencyStatus);
501 }
502}
503
int registerEpicsPV(const std::string &pvname, const std::string &keyname="")
EPICS related Functions.
bool requestLimitsFromEpicsPVs(chid id, double &lowerAlarm, double &lowerWarn, double &upperWarn, double &upperAlarm)
Get Alarm Limits from EPICS PV.
static TH1 * findHist(const std::string &dirname, const std::string &histname="", bool onlyIfUpdated=false)
Find histogram.
TCanvas * m_cEfficiencyErrRPhiViewU
efficiency U error plot canvas
TCanvas * m_cEfficiencyErrRPhiViewV3Samples
efficiency V error plot canvas for 3 samples
SVDSummaryPlots * m_hEfficiency3Samples
efficiency histo for 3 samples
TCanvas * m_cEfficiencyErrV3Samples
efficiency V error plot canvas for 3 samples
double m_nSigma
number of sigmas to set the DQM status, where sigma = efficiency uncertainty
svdStatus m_effUstatus
number representing the status of the efficiency U side
TCanvas * m_cEfficiencyErrRPhiViewV
efficiency V error plot canvas
double m_statThreshold
minimal number of tracks per sensor to set green or red frame
TCanvas * m_cEfficiencyErrU
efficiency U error plot canvas
static Int_t findBinY(Int_t layer, Int_t sensor)
find Y bin corresponding to sensor, efficiency plot
TCanvas * m_cEfficiencyRPhiViewV3Samples
efficiency V plot canvas for 3 samples
std::vector< VxdID > m_SVDModules
IDs of all SVD Modules to iterate over.
void setEffStatus(float den, float eff, float err, svdStatus &efficiencyStatus)
set efficiency status
svdStatus m_effVstatus
number representing the status of the efficiency V 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
void terminate() override final
This method is called at the end of the event processing.
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
void beginRun() override final
Called when entering a new run.
TCanvas * m_cEfficiencyRPhiViewU
efficiency U plot canvas
TCanvas * m_cEfficiencyV3Samples
efficiency V plot canvas for 3 samples
TCanvas * m_cEfficiencyErrV
efficiency V error plot canvas
TCanvas * m_cEfficiencyRPhiViewV
efficiency V plot canvas
TCanvas * m_cEfficiencyErrRPhiViewU3Samples
efficiency U error plot canvas for 3 samples
SVDSummaryPlots * m_hEfficiencyErr
efficiency error histo
TCanvas * m_cEfficiencyRPhiViewU3Samples
efficiency U plot canvas for 3 samples
int m_colzMaximum
Maximum of the histogram.
static TString getHistoNameFromCanvas(TString cName, TString view="", TString cPrefix="c_", TString hPrefix="")
get histogram name from Canvas name
TPaveText * m_legEmpty
plot legend, empty
int m_colzMinimum
Minimum of the histogram.
void updateCanvases(SVDSummaryPlots *histo, TCanvas *canvas, TCanvas *canvasRPhi, svdStatus status, bool isU, int histoType=kOffline)
update canvases
TPaveText * m_legLowStat
plot legend, low stats
TPaveText * m_legWarning
plot legend, warning
TArrow * m_arrowx
x-axis direction
std::vector< TText * > m_sensorsText
list of sensors to write on the cancas
float m_valueMinimum
Minimum value of parameter.
TPaveText * m_legNormal
plot legend, normal
TArrow * m_arrowy
y-axis direction
std::vector< TText * > m_laddersText
list of ladders to write on the canvas
TPaveText * m_legProblem
plot legend, problem
DQMHistAnalysisSVDModule(bool panelTop=false, bool online=false, bool groupIDs=false)
Constructor.
void updateErrCanvases(SVDSummaryPlots *histo, TCanvas *canvas, TCanvas *canvasRPhi, bool isU)
update error canvases
bool m_setColzRange
set the range of the histogram in colz
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
Class to facilitate easy access to sensor information of the VXD like coordinate transformations or p...
Definition GeoCache.h:38
const std::vector< VxdID > getListOfSensors() const
Get list of all sensors.
Definition GeoCache.cc:59
const SensorInfoBase & getSensorInfo(Belle2::VxdID id) const
Return a reference 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.
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:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
Abstract base class for different kinds of events.
STL namespace.