9 #include <dqm/analysis/modules/DQMHistAnalysisTOP.h>
10 #include <boost/format.hpp>
11 #include <daq/slc/base/StringUtil.h>
33 B2DEBUG(20,
"DQMHistAnalysisTOP: Constructor done.");
37 DQMHistAnalysisTOPModule::~DQMHistAnalysisTOPModule() { }
39 void DQMHistAnalysisTOPModule::initialize()
42 B2DEBUG(20,
"DQMHistAnalysisTOP: initialized.");
44 m_c_goodHitsMean =
new TCanvas(
"TOP/c_good_hits_mean");
45 m_c_goodHitsRMS =
new TCanvas(
"TOP/c_good_hits_rms");
46 m_c_badHitsMean =
new TCanvas(
"TOP/c_bad_hits_mean");
47 m_c_badHitsRMS =
new TCanvas(
"TOP/c_bad_hits_rms");
50 for (
int i = 1; i <= 16; i++) {
51 m_c_good_hits_xy_[i] =
new TCanvas(Form(
"TOP/c2_good_hits_xy_%d", i));
52 m_c_bad_hits_xy_[i] =
new TCanvas(Form(
"TOP/c2_bad_hits_xy_%d", i));
53 m_c_good_hits_asics_[i] =
new TCanvas(Form(
"TOP/c2_good_hits_asics_%d", i));
54 m_c_bad_hits_asics_[i] =
new TCanvas(Form(
"TOP/c2_bad_hits_asics_%d", i));
57 m_h_goodHitsMean =
new TH1F(
"TOP/good_hits_mean",
"Mean of good hits per event", 16, 0.5, 16.5);
58 m_h_goodHitsRMS =
new TH1F(
"TOP/good_hits_rms",
"RMS of good hits per event", 16, 0.5, 16.5);
59 m_h_badHitsMean =
new TH1F(
"TOP/bad_hits_mean",
"Mean of bad hits per event", 16, 0.5, 16.5);
60 m_h_badHitsRMS =
new TH1F(
"TOP/bad_hits_rms",
"RMS of bad hits per event", 16, 0.5, 16.5);
62 m_h_goodHitsMean->GetXaxis()->SetTitle(
"slot number");
63 m_h_goodHitsMean->GetYaxis()->SetTitle(
"hits per event");
64 m_h_goodHitsRMS->GetXaxis()->SetTitle(
"slot number");
65 m_h_goodHitsRMS->GetYaxis()->SetTitle(
"hits per event");
67 m_h_badHitsMean->GetXaxis()->SetTitle(
"slot number");
68 m_h_badHitsMean->GetYaxis()->SetTitle(
"hits per event");
69 m_h_badHitsRMS->GetXaxis()->SetTitle(
"slot number");
70 m_h_badHitsRMS->GetYaxis()->SetTitle(
"hits per event");
72 m_h_goodHitsMean->SetStats(kFALSE);
73 m_h_goodHitsRMS->SetStats(kFALSE);
74 m_h_badHitsMean->SetStats(kFALSE);
75 m_h_badHitsRMS->SetStats(kFALSE);
77 m_h_goodHitsMean->SetMinimum(0);
78 m_h_goodHitsRMS->SetMinimum(0);
79 m_h_badHitsMean->SetMinimum(0);
80 m_h_badHitsRMS->SetMinimum(0);
82 m_line1 =
new TLine(0.5, 215, 16.5, 215);
83 m_line2 =
new TLine(0.5, 235, 16.5, 235);
84 m_line1->SetLineWidth(2);
85 m_line2->SetLineWidth(2);
86 m_line1->SetLineColor(kRed);
87 m_line2->SetLineColor(kRed);
89 m_text1 =
new TPaveText(1, 435, 10, 500,
"NB");
90 m_text1->SetFillColorAlpha(kWhite, 0);
91 m_text1->SetBorderSize(0);
93 m_text2 =
new TPaveText(0.2, 0.70, 0.50, 0.9,
"NB");
94 m_text2->SetFillColorAlpha(kWhite, 0);
95 m_text2->SetBorderSize(0);
99 void DQMHistAnalysisTOPModule::beginRun()
104 TH1* DQMHistAnalysisTOPModule::find_histo_in_canvas(TString histo_name)
106 StringList s = StringUtil::split(histo_name.Data(),
'/');
107 std::string dirname = s[0];
108 std::string hname = s[1];
109 std::string canvas_name = dirname +
"/c_" + hname;
111 auto cobj = findCanvas(canvas_name);
112 if (cobj ==
nullptr)
return nullptr;
114 TIter nextkey(((TCanvas*)cobj)->GetListOfPrimitives());
116 while ((obj =
dynamic_cast<TObject*
>(nextkey()))) {
117 if (obj->IsA()->InheritsFrom(
"TH1")) {
118 if (obj->GetName() == histo_name)
119 return dynamic_cast<TH1*
>(obj);
125 void DQMHistAnalysisTOPModule::event()
127 for (
int i = 1; i <= 16; i++) {
128 string hname1 = str(format(
"TOP/good_hits_per_event%1%") % (i));;
129 string hname2 = str(format(
"TOP/bad_hits_per_event%1%") % (i));;
130 TH1* h1 = findHist(hname1);
131 TH1* h2 = findHist(hname2);
135 m_h_goodHitsMean->SetBinContent(i, h1->GetMean());
136 m_h_goodHitsRMS->SetBinContent(i, h1->GetRMS());
138 m_h_goodHitsMean->SetBinContent(i, 0);
139 m_h_goodHitsRMS->SetBinContent(i, 0);
142 m_h_badHitsMean->SetBinContent(i, h2->GetMean());
143 m_h_badHitsRMS->SetBinContent(i, h2->GetRMS());
145 m_h_badHitsMean->SetBinContent(i, 0);
146 m_h_badHitsRMS->SetBinContent(i, 0);
150 TH2F* hraw = (TH2F*)findHist(
"TOP/window_vs_slot");
152 double totalraw(0.0);
153 double totalbadraw(0.0);
155 totalraw = hraw->GetEntries();
156 for (
int i = 1; i <= 16; i++) {
157 for (
int j = 1; j <= 512; j++) {
158 double nhraw = hraw->GetBinContent(i, j);
159 if (j < 215 || j > 235) totalbadraw += nhraw ;
163 if (totalraw > 0) exRatio = totalbadraw * 1.0 / totalraw;
166 m_text1->AddText(Form(
"Ratio of entries outside of red lines: %.2f %%", exRatio * 100.0));
167 if (exRatio > 0.01) {
168 m_text1->AddText(
">1% bad, report to TOP experts!");
170 m_text1->AddText(
"<0.1% good, 0.1-1% recoverable.");
175 TCanvas* c1 = findCanvas(
"TOP/c_hitsPerEvent");
178 c1->SetName(
"TOP/c_hitsPerEvent_top");
184 TCanvas* c2 = findCanvas(
"TOP/c_window_vs_slot");
187 if (exRatio > 0.01) c2->Pad()->SetFillColor(kRed);
188 else c2->Pad()->SetFillColor(kWhite);
194 TH1F* hBoolEvtMonitor = (TH1F*)findHist(
"TOP/BoolEvtMonitor");
195 double badRatio(0.0);
198 if (hBoolEvtMonitor != NULL) {
199 totalEvts = hBoolEvtMonitor->GetEntries();
200 totalBadEvts = hBoolEvtMonitor->GetBinContent(2);
202 if (totalEvts > 0) badRatio = totalBadEvts * 1.0 / totalEvts;
205 m_text2->AddText(Form(
"fraction of deviating hits: %.4f %%", badRatio * 100.0));
207 TCanvas* c3 = findCanvas(
"TOP/c_BoolEvtMonitor");
210 if (badRatio > 0.0001) c3->Pad()->SetFillColor(kRed);
211 else c3->Pad()->SetFillColor(kWhite);
216 double Ntotal_good_hits_xy(0.0);
217 double Ntotal_bad_hits_xy(0.0);
218 double Ntotal_good_hits_asics(0.0);
219 double Ntotal_bad_hits_asics(0.0);
220 for (
int module = 1; module <= 16; module++) {
221 string hnameTmp1 = str(format(
"TOP/good_hits_xy_%1%") % (module));;
222 TH1* h2DTmp1 = findHist(hnameTmp1);
223 if (h2DTmp1 != NULL) Ntotal_good_hits_xy += h2DTmp1->Integral();
225 string hnameTmp2 = str(format(
"TOP/bad_hits_xy_%1%") % (module));;
226 TH1* h2DTmp2 = findHist(hnameTmp2);
227 if (h2DTmp2 != NULL) Ntotal_bad_hits_xy += h2DTmp2->Integral();
229 string hnameTmp3 = str(format(
"TOP/good_hits_asics_%1%") % (module));;
230 TH1* h2DTmp3 = findHist(hnameTmp3);
231 if (h2DTmp3 != NULL) Ntotal_good_hits_asics += h2DTmp3->Integral();
233 string hnameTmp4 = str(format(
"TOP/bad_hits_asics_%1%") % (module));;
234 TH1* h2DTmp4 = findHist(hnameTmp4);
235 if (h2DTmp4 != NULL) Ntotal_bad_hits_asics += h2DTmp4->Integral();
239 for (
int i = 1; i <= 16; i++) {
240 m_c_good_hits_xy_[i]->Clear();
241 m_c_good_hits_xy_[i]->cd();
242 TH2F* h2Dscale_xy = (TH2F*)findHist(Form(
"TOP/good_hits_xy_%d", i));
243 if (h2Dscale_xy != NULL && Ntotal_good_hits_xy > 0) {
244 h2Dscale_xy->GetZaxis()->SetRangeUser(0, Ntotal_good_hits_xy / 2500.0);
247 m_c_good_hits_xy_[i]->Modified();
251 for (
int i = 1; i <= 16; i++) {
252 m_c_bad_hits_xy_[i]->Clear();
253 m_c_bad_hits_xy_[i]->cd();
254 TH2F* h2Dscale_xy = (TH2F*)findHist(Form(
"TOP/bad_hits_xy_%d", i));
255 if (h2Dscale_xy != NULL && Ntotal_bad_hits_xy > 0) {
256 h2Dscale_xy->GetZaxis()->SetRangeUser(0, Ntotal_bad_hits_xy / 250.0);
259 m_c_bad_hits_xy_[i]->Modified();
262 for (
int i = 1; i <= 16; i++) {
263 m_c_good_hits_asics_[i]->Clear();
264 m_c_good_hits_asics_[i]->cd();
265 TH2F* h2Dscale_asics = (TH2F*)findHist(Form(
"TOP/good_hits_asics_%d", i));
266 if (h2Dscale_asics != NULL && Ntotal_good_hits_asics > 0) {
267 h2Dscale_asics->GetZaxis()->SetRangeUser(0, Ntotal_good_hits_asics / 2500.0);
268 h2Dscale_asics->Draw();
270 m_c_good_hits_asics_[i]->Modified();
273 for (
int i = 1; i <= 16; i++) {
274 m_c_bad_hits_asics_[i]->Clear();
275 m_c_bad_hits_asics_[i]->cd();
276 TH2F* h2Dscale_asics = (TH2F*)findHist(Form(
"TOP/bad_hits_asics_%d", i));
277 if (h2Dscale_asics != NULL && Ntotal_bad_hits_asics > 0) {
278 h2Dscale_asics->GetZaxis()->SetRangeUser(0, Ntotal_bad_hits_asics / 250.0);
279 h2Dscale_asics->Draw();
281 m_c_bad_hits_asics_[i]->Modified();
284 m_c_goodHitsMean->Clear();
285 m_c_goodHitsMean->cd();
286 m_h_goodHitsMean->Draw();
287 m_c_goodHitsMean->Modified();
289 m_c_goodHitsRMS->Clear();
290 m_c_goodHitsRMS->cd();
291 m_h_goodHitsRMS->Draw();
292 m_c_goodHitsRMS->Modified();
294 m_c_badHitsMean->Clear();
295 m_c_badHitsMean->cd();
296 m_h_badHitsMean->Draw();
297 m_c_badHitsMean->Modified();
299 m_c_badHitsRMS->Clear();
300 m_c_badHitsRMS->cd();
301 m_h_badHitsRMS->Draw();
302 m_c_badHitsRMS->Modified();
305 void DQMHistAnalysisTOPModule::endRun()
307 B2DEBUG(20,
"DQMHistAnalysisTOP : endRun called");
311 void DQMHistAnalysisTOPModule::terminate()
313 B2DEBUG(20,
"terminate called");
The base class for the histogram analysis module.
Class for TOP histogram analysis.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.