10 #include <dqm/analysis/modules/DQMHistAnalysisSVDEfficiency.h>
11 #include <vxd/geometry/GeoCache.h>
31 m_effUstatus(lowStat),
35 B2DEBUG(10,
"DQMHistAnalysisSVDEfficiency: Constructor done.");
37 addParam(
"RefHistoFile", m_refFileName,
"Reference histrogram file name", std::string(
"SVDrefHisto.root"));
38 addParam(
"effLevel_Error", m_effError,
"Efficiency error (%) level (red)",
float(0.9));
39 addParam(
"effLevel_Warning", m_effWarning,
"Efficiency WARNING (%) level (orange)",
float(0.94));
40 addParam(
"statThreshold", m_statThreshold,
"minimal number of tracks per sensor to set green/red alert",
float(100));
43 DQMHistAnalysisSVDEfficiencyModule::~DQMHistAnalysisSVDEfficiencyModule() { }
45 void DQMHistAnalysisSVDEfficiencyModule::initialize()
47 B2DEBUG(10,
"DQMHistAnalysisSVDEfficiency: initialized.");
48 B2DEBUG(10,
" black = " << kBlack);
49 B2DEBUG(10,
" green = " << kGreen);
50 B2DEBUG(10,
" orange = " << kOrange);
51 B2DEBUG(10,
" Red = " << kRed);
54 if (m_refFileName !=
"") {
55 m_refFile =
new TFile(m_refFileName.data(),
"READ");
59 if (m_refFile && m_refFile->IsOpen()) {
60 B2INFO(
"SVD DQMHistAnalysis: reference root file (" << m_refFileName <<
") FOUND, reading ref histograms");
62 TH1F* ref_eff = (TH1F*)m_refFile->Get(
"refEfficiency");
64 B2WARNING(
"SVD DQMHistAnalysis: Efficiency Level Refence not found! using module parameters");
66 m_effWarning = ref_eff->GetBinContent(2);
67 m_effError = ref_eff->GetBinContent(3);
71 B2WARNING(
"SVD DQMHistAnalysis: reference root file (" << m_refFileName <<
") not found, or closed, using module parameters");
73 B2INFO(
" SVD efficiency thresholds:");
74 B2INFO(
" EFFICIENCY: normal < " << m_effWarning <<
" < warning < " << m_effError <<
" < error");
78 m_legProblem =
new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
79 m_legProblem->AddText(
"ERROR!");
80 m_legProblem->AddText(
"at least one sensor with:");
81 m_legProblem->AddText(Form(
"efficiency < %1.0f%%", m_effError * 100));
82 m_legProblem->SetFillColor(kRed);
83 m_legWarning =
new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
84 m_legWarning->AddText(
"WARNING!");
85 m_legWarning->AddText(
"at least one sensor with:");
86 m_legWarning->AddText(Form(
"%1.0f%% < efficiency < %1.0f%%", m_effError * 100, m_effWarning * 100));
87 m_legWarning->SetFillColor(kOrange);
88 m_legNormal =
new TPaveText(11, findBinY(4, 3) - 3, 16, findBinY(4, 3));
89 m_legNormal->AddText(
"EFFICIENCY WITHIN LIMITS");
90 m_legNormal->AddText(Form(
"efficiency > %1.0f%%", m_effWarning * 100));
91 m_legNormal->SetFillColor(kGreen);
92 m_legNormal->SetBorderSize(0.);
93 m_legNormal->SetLineColor(kBlack);
94 m_legEmpty =
new TPaveText(11, findBinY(4, 3) - 2, 16, findBinY(4, 3));
95 m_legEmpty->AddText(
"Not enough statistics,");
96 m_legEmpty->AddText(
"check again in a few minutes");
97 m_legEmpty->SetFillColor(kBlack);
98 m_legEmpty->SetTextColor(kWhite);
99 m_legEmpty->SetBorderSize(0.);
100 m_legEmpty->SetLineColor(kBlack);
107 for (
VxdID& aVxdID : sensors) {
110 if (info.getType() != VXD::SensorInfoBase::SVD)
continue;
111 m_SVDModules.push_back(aVxdID);
113 std::sort(m_SVDModules.begin(), m_SVDModules.end());
116 m_cEfficiencyU =
new TCanvas(
"SVDAnalysis/c_SVDEfficiencyU");
117 m_cEfficiencyV =
new TCanvas(
"SVDAnalysis/c_SVDEfficiencyV");
118 m_cEfficiencyErrU =
new TCanvas(
"SVDAnalysis/c_SVDEfficiencyErrU");
119 m_cEfficiencyErrV =
new TCanvas(
"SVDAnalysis/c_SVDEfficiencyErrV");
121 m_hEfficiency =
new SVDSummaryPlots(
"SVDEfficiency@view",
"Summary of SVD efficiencies (%), @view/@side Side");
122 m_hEfficiencyErr =
new SVDSummaryPlots(
"SVDEfficiencyErr@view",
"Summary of SVD efficiencies errors (%), @view/@side Side");
125 void DQMHistAnalysisSVDEfficiencyModule::beginRun()
127 B2DEBUG(10,
"DQMHistAnalysisSVDEfficiency: beginRun called.");
128 m_cEfficiencyU->Clear();
129 m_cEfficiencyV->Clear();
130 m_cEfficiencyErrU->Clear();
131 m_cEfficiencyErrV->Clear();
134 void DQMHistAnalysisSVDEfficiencyModule::event()
136 B2DEBUG(10,
"DQMHistAnalysisSVDEfficiency: event called.");
146 gStyle->SetOptStat(0);
147 gStyle->SetPaintTextFormat(
"2.1f");
149 m_hEfficiency->getHistogram(0)->Reset();
150 m_hEfficiency->getHistogram(1)->Reset();
151 m_hEfficiencyErr->getHistogram(0)->Reset();
152 m_hEfficiencyErr->getHistogram(1)->Reset();
156 Float_t erreffU = -1;
157 Float_t erreffV = -1;
160 TH2F* found_tracksU = (TH2F*)findHist(
"SVDEfficiency/TrackHitsU");
161 TH2F* matched_clusU = (TH2F*)findHist(
"SVDEfficiency/MatchedHitsU");
163 if (matched_clusU == NULL || found_tracksU == NULL) {
164 B2INFO(
"Histograms needed for Efficiency computation are not found");
165 m_cEfficiencyU->SetFillColor(kRed);
167 B2INFO(
"U-side Before loop on sensors, size :" << m_SVDModules.size());
168 for (
unsigned int i = 0; i < m_SVDModules.size(); i++) {
169 B2DEBUG(10,
"module " << i <<
"," << m_SVDModules[i]);
170 int bin = found_tracksU->FindBin(m_SVDModules[i].getLadderNumber(), findBinY(m_SVDModules[i].getLayerNumber(),
171 m_SVDModules[i].getSensorNumber()));
172 float numU = matched_clusU->GetBinContent(bin);
173 float denU = found_tracksU->GetBinContent(bin);
178 B2DEBUG(10,
"effU = " << numU <<
"/" << denU <<
" = " << effU);
179 m_hEfficiency->fill(m_SVDModules[i], 1, effU * 100);
183 erreffU = std::sqrt(effU * (1 - effU) / denU);
184 m_hEfficiencyErr->fill(m_SVDModules[i], 1, erreffU * 100);
186 if (denU < m_statThreshold) {
187 m_effUstatus = lowStat;
190 if ((effU - erreffU <= m_effWarning) && (effU - erreffU > m_effError)) {
191 m_effUstatus = warning;
192 }
else if ((effU - erreffU <= m_effError)) {
193 m_effUstatus = error;
194 }
else if (effU - erreffU > m_effWarning) {
202 TH2F* found_tracksV = (TH2F*)findHist(
"SVDEfficiency/TrackHitsV");
203 TH2F* matched_clusV = (TH2F*)findHist(
"SVDEfficiency/MatchedHitsV");
205 if (matched_clusV == NULL || found_tracksV == NULL) {
206 B2INFO(
"Histograms needed for Efficiency computation are not found");
207 m_cEfficiencyV->SetFillColor(kRed);
209 B2INFO(
"V-side Before loop on sensors, size :" << m_SVDModules.size());
210 for (
unsigned int i = 0; i < m_SVDModules.size(); i++) {
211 B2DEBUG(10,
"module " << i <<
"," << m_SVDModules[i]);
212 int bin = found_tracksV->FindBin(m_SVDModules[i].getLadderNumber(), findBinY(m_SVDModules[i].getLayerNumber(),
213 m_SVDModules[i].getSensorNumber()));
214 float numV = matched_clusV->GetBinContent(bin);
215 float denV = found_tracksV->GetBinContent(bin);
221 B2DEBUG(10,
"effV = " << numV <<
"/" << denV <<
" = " << effV);
222 m_hEfficiency->fill(m_SVDModules[i], 0, effV * 100);
226 erreffV = std::sqrt(effV * (1 - effV) / denV);
228 m_hEfficiencyErr->fill(m_SVDModules[i], 0, erreffV * 100);
230 if (denV < m_statThreshold) {
231 m_effVstatus = lowStat;
234 if ((effV - erreffV <= m_effWarning) && (effV - erreffV > m_effError)) {
235 m_effVstatus = warning;
236 }
else if ((effV - erreffV <= m_effError)) {
237 m_effVstatus = error;
238 }
else if (effV - erreffV > m_effWarning) {
246 m_cEfficiencyU->cd();
247 m_hEfficiency->getHistogram(1)->Draw(
"text");
249 switch (m_effUstatus) {
251 m_cEfficiencyU->SetFillColor(kGreen);
252 m_cEfficiencyU->SetFrameFillColor(10);
253 m_legNormal->Draw(
"same");
257 m_cEfficiencyU->SetFillColor(kRed);
258 m_cEfficiencyU->SetFrameFillColor(10);
259 m_legProblem->Draw(
"same");
263 m_cEfficiencyU->SetFillColor(kOrange);
264 m_cEfficiencyU->SetFrameFillColor(10);
265 m_legWarning->Draw(
"same");
269 m_cEfficiencyU->SetFillColor(kGray);
270 m_cEfficiencyU->SetFrameFillColor(10);
271 m_legEmpty->Draw(
"same");
275 B2INFO(
"effUstatus not set properly: " << m_effUstatus);
280 m_cEfficiencyU->Draw(
"text");
281 m_cEfficiencyU->Update();
282 m_cEfficiencyU->Modified();
283 m_cEfficiencyU->Update();
286 m_cEfficiencyV->cd();
287 m_hEfficiency->getHistogram(0)->Draw(
"text");
289 switch (m_effVstatus) {
291 m_cEfficiencyV->SetFillColor(kGreen);
292 m_cEfficiencyV->SetFrameFillColor(10);
293 m_legNormal->Draw(
"same");
297 m_cEfficiencyV->SetFillColor(kRed);
298 m_cEfficiencyV->SetFrameFillColor(10);
299 m_legProblem->Draw(
"same");
303 m_cEfficiencyV->SetFillColor(kOrange);
304 m_cEfficiencyV->SetFrameFillColor(10);
305 m_legWarning->Draw(
"same");
309 m_cEfficiencyV->SetFillColor(kGray);
310 m_cEfficiencyV->SetFrameFillColor(10);
311 m_legEmpty->Draw(
"same");
315 B2INFO(
"effVstatus not set properly: " << m_effVstatus);
320 m_cEfficiencyV->Draw();
321 m_cEfficiencyV->Update();
322 m_cEfficiencyV->Modified();
323 m_cEfficiencyV->Update();
325 m_cEfficiencyErrU->cd();
326 m_hEfficiencyErr->getHistogram(1)->Draw(
"colztext");
327 m_cEfficiencyErrU->Draw();
328 m_cEfficiencyErrU->Update();
329 m_cEfficiencyErrU->Modified();
330 m_cEfficiencyErrU->Update();
332 m_cEfficiencyErrV->cd();
333 m_hEfficiencyErr->getHistogram(0)->Draw(
"colztext");
334 m_cEfficiencyErrV->Draw();
335 m_cEfficiencyErrV->Update();
336 m_cEfficiencyErrV->Modified();
337 m_cEfficiencyErrV->Update();
340 void DQMHistAnalysisSVDEfficiencyModule::endRun()
342 B2DEBUG(10,
"DQMHistAnalysisSVDEfficiency: endRun called");
345 void DQMHistAnalysisSVDEfficiencyModule::terminate()
347 B2DEBUG(10,
"DQMHistAnalysisSVDEfficiency: terminate called");
354 delete m_hEfficiency;
355 delete m_cEfficiencyU;
356 delete m_cEfficiencyV;
357 delete m_hEfficiencyErr;
358 delete m_cEfficiencyErrU;
359 delete m_cEfficiencyErrV;
363 Int_t DQMHistAnalysisSVDEfficiencyModule::findBinY(Int_t layer, Int_t sensor)
368 return 2 + 1 + sensor;
370 return 6 + 1 + sensor;
372 return 11 + 1 + sensor;