Skip to content

Commit 572e558

Browse files
committed
Merge pull request #800 in B2/basf2 from feature/BII-9228-DQMHistAnalysisKLM2-rel6 to release/06-01
* commit 'e70f216ad7ac792348d688105381f4cbbef68dc8': Fix tests Changing histogram title Cleaning up headers + nullptr->NULL + removing Divide() from KLMDQM2 Removing redefinition of variables and removing unnecessary spaces Adding null flags + removing unnecessary libraries Initial commit for DQMHistAnalysisKLM2
2 parents 1b70e7e + e70f216 commit 572e558

File tree

5 files changed

+398
-103
lines changed

5 files changed

+398
-103
lines changed
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
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+
#pragma once
10+
11+
/* DQM headers. */
12+
#include <dqm/analysis/modules/DQMHistAnalysis.h>
13+
14+
/* KLM headers. */
15+
#include <klm/dataobjects/bklm/BKLMElementNumbers.h>
16+
#include <klm/dataobjects/eklm/EKLMElementNumbers.h>
17+
18+
19+
/* ROOT headers. */
20+
#include <TCanvas.h>
21+
#include <TH1.h>
22+
#include <TString.h>
23+
#include <TText.h>
24+
#include <TLine.h>
25+
26+
/* C++ headers. */
27+
#include <string>
28+
29+
namespace Belle2 {
30+
31+
/**
32+
* Analysis of KLM DQM histograms.
33+
*/
34+
class DQMHistAnalysisKLM2Module : public DQMHistAnalysisModule {
35+
36+
public:
37+
38+
/**
39+
* Constructor.
40+
*/
41+
DQMHistAnalysisKLM2Module();
42+
43+
/**
44+
* Destructor.
45+
*/
46+
~DQMHistAnalysisKLM2Module();
47+
48+
/**
49+
* Initializer.
50+
*/
51+
void initialize() override;
52+
53+
/**
54+
* Called when entering a new run.
55+
*/
56+
void beginRun() override;
57+
58+
/**
59+
* This method is called for each event.
60+
*/
61+
void event() override;
62+
63+
/**
64+
* This method is called if the current run ends.
65+
*/
66+
void endRun() override;
67+
68+
/**
69+
* This method is called at the end of the event processing.
70+
*/
71+
void terminate() override;
72+
73+
private:
74+
75+
76+
/**
77+
* Process histogram containing the number of hits in plane.
78+
* @param[in] histName Histogram name.
79+
* @param[in] histogram Histogram itself.
80+
*/
81+
void processPlaneHistogram(const std::string& histName, TH1* histogram);
82+
83+
84+
/** TLine for boundary in plane histograms. */
85+
TLine m_PlaneLine;
86+
87+
/** TText for names in plane histograms. */
88+
TText m_PlaneText;
89+
90+
/** Histogram from DQMInfo with run type. */
91+
TH1* m_RunType = NULL;
92+
93+
/** String with run type. */
94+
TString m_RunTypeString;
95+
96+
/** Run type flag for null runs. */
97+
bool m_IsNullRun = false;
98+
99+
/** Histogram for BKLM plane efficiency. */
100+
TH1* m_eff_bklm = NULL;
101+
102+
/** BKLM plane efficiency canvas */
103+
TCanvas* m_c_eff_bklm = NULL;
104+
105+
/** Histogram for EKLM plane efficiency. */
106+
TH1* m_eff_eklm = NULL;
107+
108+
/** EKLM plane efficiency canvas */
109+
TCanvas* m_c_eff_eklm = NULL;
110+
111+
/** Histogram for BKLM sector efficiency. */
112+
TH1* m_eff_bklm_sector = NULL;
113+
114+
/** Histogram for BKLM sector efficiency. */
115+
TCanvas* m_c_eff_bklm_sector = NULL;
116+
117+
/** Histogram for EKLM sector efficiency. */
118+
TH1* m_eff_eklm_sector = NULL;
119+
120+
/** Histogram for EKLM sector efficiency. */
121+
TCanvas* m_c_eff_eklm_sector = NULL;
122+
123+
124+
/** EKLM element numbers. */
125+
const EKLMElementNumbers* m_EklmElementNumbers;
126+
127+
128+
/*******************************************/
129+
//OTHER USEFUL VARIABLES
130+
/*******************************************/
131+
132+
/** Number of channel hit histograms per sector for BKLM. */
133+
const int m_ChannelHitHistogramsBKLM = 2;
134+
135+
/** Number of channel hit histograms per sector for EKLM. */
136+
const int m_ChannelHitHistogramsEKLM = 3;
137+
138+
};
139+
140+
}
Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
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+
/* Own header. */
10+
#include <dqm/analysis/modules/DQMHistAnalysisKLM2.h>
11+
12+
/* Belle 2 headers. */
13+
#include <klm/dataobjects/KLMChannelIndex.h>
14+
15+
/* ROOT headers. */
16+
#include <TROOT.h>
17+
18+
19+
using namespace Belle2;
20+
21+
REG_MODULE(DQMHistAnalysisKLM2)
22+
23+
DQMHistAnalysisKLM2Module::DQMHistAnalysisKLM2Module()
24+
: DQMHistAnalysisModule(),
25+
m_EklmElementNumbers{&(EKLMElementNumbers::Instance())}
26+
{
27+
m_PlaneLine.SetLineColor(kMagenta);
28+
m_PlaneLine.SetLineWidth(1);
29+
m_PlaneLine.SetLineStyle(2); // dashed
30+
m_PlaneText.SetTextAlign(22); // centered, middle
31+
m_PlaneText.SetTextColor(kMagenta);
32+
m_PlaneText.SetTextFont(42); // Helvetica regular
33+
m_PlaneText.SetTextSize(0.02); // 2% of TPad's full height
34+
}
35+
36+
DQMHistAnalysisKLM2Module::~DQMHistAnalysisKLM2Module()
37+
{
38+
}
39+
40+
void DQMHistAnalysisKLM2Module::initialize()
41+
{
42+
gROOT->cd();
43+
m_c_eff_bklm = new TCanvas("KLMEfficiencyDQM/c_eff_bklm_plane");
44+
m_c_eff_eklm = new TCanvas("KLMEfficiencyDQM/c_eff_eklm_plane");
45+
m_c_eff_bklm_sector = new TCanvas("KLMEfficiencyDQM/c_eff_bklm_sector");
46+
m_c_eff_eklm_sector = new TCanvas("KLMEfficiencyDQM/c_eff_eklm_sector");
47+
48+
m_eff_bklm = new TH1F("KLMEfficiencyDQM/eff_bklm_plane",
49+
"Plane Efficiency in BKLM",
50+
BKLMElementNumbers::getMaximalLayerGlobalNumber(), 0.5, 0.5 + BKLMElementNumbers::getMaximalLayerGlobalNumber());
51+
m_eff_bklm->GetXaxis()->SetTitle("Layer number");
52+
m_eff_bklm->SetStats(false);
53+
m_eff_bklm->SetOption("HIST");
54+
55+
m_eff_eklm = new TH1F("KLMEfficiencyDQM/eff_eklm_plane",
56+
"Plane Efficiency in EKLM",
57+
EKLMElementNumbers::getMaximalPlaneGlobalNumber(), 0.5, 0.5 + EKLMElementNumbers::getMaximalPlaneGlobalNumber());
58+
m_eff_eklm->GetXaxis()->SetTitle("Plane number");
59+
m_eff_eklm->SetStats(false);
60+
m_eff_eklm->SetOption("HIST");
61+
62+
m_eff_bklm_sector = new TH1F("KLMEfficiencyDQM/eff_bklm_sector",
63+
"Sector Efficiency in BKLM",
64+
BKLMElementNumbers::getMaximalSectorGlobalNumber(), 0.5, BKLMElementNumbers::getMaximalSectorGlobalNumber() + 0.5);
65+
m_eff_bklm_sector->GetXaxis()->SetTitle("Sector number");
66+
m_eff_bklm_sector->SetStats(false);
67+
m_eff_bklm_sector->SetOption("HIST");
68+
69+
m_eff_eklm_sector = new TH1F("KLMEfficiencyDQM/eff_eklm_sector",
70+
"Sector Efficiency in EKLM",
71+
EKLMElementNumbers::getMaximalSectorGlobalNumberKLMOrder(), 0.5, EKLMElementNumbers::getMaximalSectorGlobalNumberKLMOrder() + 0.5);
72+
m_eff_eklm_sector->GetXaxis()->SetTitle("Sector number");
73+
m_eff_eklm_sector->SetStats(false);
74+
m_eff_eklm_sector->SetOption("HIST");
75+
76+
}
77+
78+
void DQMHistAnalysisKLM2Module::terminate()
79+
{
80+
}
81+
82+
void DQMHistAnalysisKLM2Module::beginRun()
83+
{
84+
m_RunType = findHist("DQMInfo/rtype");
85+
m_RunTypeString = m_RunType ? m_RunType->GetTitle() : "";
86+
m_IsNullRun = (m_RunTypeString == "null");
87+
}
88+
89+
void DQMHistAnalysisKLM2Module::endRun()
90+
{
91+
}
92+
93+
94+
95+
void DQMHistAnalysisKLM2Module::processPlaneHistogram(
96+
const std::string& histName, TH1* histogram)
97+
{
98+
std::string name;
99+
const double histMinNDC = 0.1;
100+
const double histMaxNDC = 0.9;
101+
const double histRangeNDC = histMaxNDC - histMinNDC;
102+
103+
TCanvas* canvas = findCanvas("KLMEfficiencyDQM/c_" + histName);
104+
if (canvas == NULL) {
105+
B2ERROR("KLMDQM2 histogram canvas KLMEfficiencyDQM/c_" << histName << " is not found.");
106+
return;
107+
}
108+
canvas->Clear();
109+
canvas->cd();
110+
histogram->SetStats(false);
111+
histogram->Draw();
112+
if (histName.find("bklm") != std::string::npos) {
113+
/* First draw the vertical lines and the sector names. */
114+
const double maximalSector = BKLMElementNumbers::getMaximalSectorGlobalNumber();
115+
for (int sector = 0; sector < BKLMElementNumbers::getMaximalSectorGlobalNumber(); ++sector) {
116+
double xLineNDC = histMinNDC + (histRangeNDC * sector) / maximalSector;
117+
double xTextNDC = histMinNDC + (histRangeNDC * (sector + 0.5)) / maximalSector;
118+
double yTextNDC = histMinNDC + 0.98 * histRangeNDC;
119+
if (sector > 0)
120+
m_PlaneLine.DrawLineNDC(xLineNDC, histMinNDC, xLineNDC, histMaxNDC);
121+
name = "B";
122+
if (sector < 8)
123+
name += "B";
124+
else
125+
name += "F";
126+
name += std::to_string(sector % 8);
127+
m_PlaneText.DrawTextNDC(xTextNDC, yTextNDC, name.c_str());
128+
}
129+
130+
} else {
131+
/* First draw the vertical lines and the sector names. */
132+
const double maximalLayer = EKLMElementNumbers::getMaximalLayerGlobalNumber();
133+
for (int layerGlobal = 1; layerGlobal <= maximalLayer; ++layerGlobal) {
134+
double xLineNDC = histMinNDC + (histRangeNDC * layerGlobal) / maximalLayer;
135+
double xTextNDC = histMinNDC + (histRangeNDC * (layerGlobal - 0.5)) / maximalLayer;
136+
double yTextNDC = histMinNDC + 0.98 * histRangeNDC;
137+
if (layerGlobal < maximalLayer)
138+
m_PlaneLine.DrawLineNDC(xLineNDC, histMinNDC, xLineNDC, histMaxNDC);
139+
int section, layer;
140+
m_EklmElementNumbers->layerNumberToElementNumbers(
141+
layerGlobal, &section, &layer);
142+
if (section == EKLMElementNumbers::c_BackwardSection)
143+
name = "B";
144+
else
145+
name = "F";
146+
name += std::to_string(layer);
147+
m_PlaneText.DrawTextNDC(xTextNDC, yTextNDC, name.c_str());
148+
}
149+
canvas->Modified();
150+
canvas->Update();
151+
}
152+
}
153+
154+
void DQMHistAnalysisKLM2Module::event()
155+
{
156+
/* If KLM is not included, stop here and return. */
157+
TH1* daqInclusion = findHist("KLM/daq_inclusion");
158+
if (not(daqInclusion == NULL)) {
159+
int isKlmIncluded = daqInclusion->GetBinContent(daqInclusion->GetXaxis()->FindBin("Yes"));
160+
if (isKlmIncluded == 0)
161+
return;
162+
}
163+
164+
/* Reset efficiency histograms*/
165+
m_eff_bklm->Reset();
166+
m_eff_eklm->Reset();
167+
m_eff_bklm_sector->Reset();
168+
m_eff_eklm_sector->Reset();
169+
170+
/* Obtain plots necessary for efficiency plots */
171+
TH1F* all_ext_bklm = (TH1F*)findHist("KLMEfficiencyDQM/all_ext_hitsBKLM");
172+
TH1F* matched_hits_bklm = (TH1F*)findHist("KLMEfficiencyDQM/matched_hitsBKLM");
173+
174+
TH1F* all_ext_eklm = (TH1F*)findHist("KLMEfficiencyDQM/all_ext_hitsEKLM");
175+
TH1F* matched_hits_eklm = (TH1F*)findHist("KLMEfficiencyDQM/matched_hitsEKLM");
176+
177+
178+
TH1F* all_ext_bklm_sector = (TH1F*)findHist("KLMEfficiencyDQM/all_ext_hitsBKLMSector");
179+
TH1F* matched_hits_bklm_sector = (TH1F*)findHist("KLMEfficiencyDQM/matched_hitsBKLMSector");
180+
181+
TH1F* all_ext_eklm_sector = (TH1F*)findHist("KLMEfficiencyDQM/all_ext_hitsEKLMSector");
182+
TH1F* matched_hits_eklm_sector = (TH1F*)findHist("KLMEfficiencyDQM/matched_hitsEKLMSector");
183+
184+
/* Check if efficiency histograms exist*/
185+
if ((all_ext_bklm == NULL || matched_hits_bklm == NULL) && (m_IsNullRun == false)) {
186+
B2INFO("Histograms needed for BKLM plane efficiency computation are not found");
187+
m_c_eff_bklm->SetFillColor(kRed);
188+
}
189+
190+
if ((all_ext_eklm == NULL || matched_hits_eklm == NULL) && (m_IsNullRun == false)) {
191+
B2INFO("Histograms needed for EKLM plane efficiency computation are not found");
192+
m_c_eff_eklm->SetFillColor(kRed);
193+
}
194+
if ((all_ext_bklm_sector == NULL || matched_hits_bklm_sector == NULL) && (m_IsNullRun == false)) {
195+
B2INFO("Histograms needed for BKLM sector efficiency computation are not found");
196+
m_c_eff_bklm_sector->SetFillColor(kRed);
197+
}
198+
if ((all_ext_eklm_sector == NULL || matched_hits_eklm_sector == NULL) && (m_IsNullRun == false)) {
199+
B2INFO("Histograms needed for EKLM sector efficiency computation are not found");
200+
m_c_eff_eklm_sector->SetFillColor(kRed);
201+
}
202+
203+
/* Check if efficiency histograms exist*/
204+
m_eff_bklm->Divide(matched_hits_bklm,
205+
all_ext_bklm, 1, 1, "B");
206+
m_eff_eklm->Divide(matched_hits_eklm,
207+
all_ext_eklm, 1, 1, "B");
208+
209+
m_eff_bklm_sector->Divide(matched_hits_bklm_sector,
210+
all_ext_bklm_sector, 1, 1, "B");
211+
m_eff_eklm_sector->Divide(matched_hits_eklm_sector,
212+
all_ext_eklm_sector, 1, 1, "B");
213+
214+
/* Draw histograms onto canvases*/
215+
m_c_eff_bklm->cd();
216+
m_eff_bklm->Draw();
217+
m_c_eff_bklm->Modified();
218+
219+
m_c_eff_eklm->cd();
220+
m_eff_eklm->Draw();
221+
m_c_eff_eklm->Modified();
222+
223+
m_c_eff_bklm_sector->cd();
224+
m_eff_bklm_sector->Draw();
225+
m_c_eff_bklm_sector->Modified();
226+
227+
m_c_eff_eklm_sector->cd();
228+
m_eff_eklm_sector->Draw();
229+
m_c_eff_eklm_sector->Modified();
230+
231+
processPlaneHistogram("eff_bklm_plane", m_eff_bklm);
232+
processPlaneHistogram("eff_eklm_plane", m_eff_eklm);
233+
234+
}
235+
236+

0 commit comments

Comments
 (0)