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 TIter nextckey(gROOT->GetListOfCanvases());
113 auto cobj = find_canvas(canvas_name);
114 if (cobj ==
nullptr)
return nullptr;
116 TIter nextkey(((TCanvas*)cobj)->GetListOfPrimitives());
118 while ((obj =
dynamic_cast<TObject*
>(nextkey()))) {
119 if (obj->IsA()->InheritsFrom(
"TH1")) {
120 if (obj->GetName() == histo_name)
121 return dynamic_cast<TH1*
>(obj);
127 void DQMHistAnalysisTOPModule::event()
129 for (
int i = 1; i <= 16; i++) {
130 string hname1 = str(format(
"TOP/good_hits_per_event%1%") % (i));;
131 string hname2 = str(format(
"TOP/bad_hits_per_event%1%") % (i));;
132 TH1* h1 = findHist(hname1);
133 TH1* h2 = findHist(hname2);
137 m_h_goodHitsMean->SetBinContent(i, h1->GetMean());
138 m_h_goodHitsRMS->SetBinContent(i, h1->GetRMS());
140 m_h_goodHitsMean->SetBinContent(i, 0);
141 m_h_goodHitsRMS->SetBinContent(i, 0);
144 m_h_badHitsMean->SetBinContent(i, h2->GetMean());
145 m_h_badHitsRMS->SetBinContent(i, h2->GetRMS());
147 m_h_badHitsMean->SetBinContent(i, 0);
148 m_h_badHitsRMS->SetBinContent(i, 0);
152 TH2F* hraw = (TH2F*)findHist(
"TOP/window_vs_slot");
154 double totalraw(0.0);
155 double totalbadraw(0.0);
157 totalraw = hraw->GetEntries();
158 for (
int i = 1; i <= 16; i++) {
159 for (
int j = 1; j <= 512; j++) {
160 double nhraw = hraw->GetBinContent(i, j);
161 if (j < 215 || j > 235) totalbadraw += nhraw ;
165 if (totalraw > 0) exRatio = totalbadraw * 1.0 / totalraw;
168 m_text1->AddText(Form(
"Ratio of entries outside of red lines: %.2f %%", exRatio * 100.0));
169 if (exRatio > 0.01) {
170 m_text1->AddText(
">1% bad, report to TOP experts!");
172 m_text1->AddText(
"<0.1% good, 0.1-1% recoverable.");
177 TCanvas* c1 = find_canvas(
"TOP/c_hitsPerEvent");
180 c1->SetName(
"TOP/c_hitsPerEvent_top");
186 TCanvas* c2 = find_canvas(
"TOP/c_window_vs_slot");
189 if (exRatio > 0.01) c2->Pad()->SetFillColor(kRed);
190 else c2->Pad()->SetFillColor(kWhite);
196 TH1F* hBoolEvtMonitor = (TH1F*)findHist(
"TOP/BoolEvtMonitor");
197 double badRatio(0.0);
200 if (hBoolEvtMonitor != NULL) {
201 totalEvts = hBoolEvtMonitor->GetEntries();
202 totalBadEvts = hBoolEvtMonitor->GetBinContent(2);
204 if (totalEvts > 0) badRatio = totalBadEvts * 1.0 / totalEvts;
207 m_text2->AddText(Form(
"fraction of deviating hits: %.4f %%", badRatio * 100.0));
209 TCanvas* c3 = find_canvas(
"TOP/c_BoolEvtMonitor");
212 if (badRatio > 0.0001) c3->Pad()->SetFillColor(kRed);
213 else c3->Pad()->SetFillColor(kWhite);
218 double Ntotal_good_hits_xy(0.0);
219 double Ntotal_bad_hits_xy(0.0);
220 double Ntotal_good_hits_asics(0.0);
221 double Ntotal_bad_hits_asics(0.0);
222 for (
int module = 1; module <= 16; module++) {
223 string hnameTmp1 = str(format(
"TOP/good_hits_xy_%1%") % (module));;
224 TH1* h2DTmp1 = findHist(hnameTmp1);
225 if (h2DTmp1 != NULL) Ntotal_good_hits_xy += h2DTmp1->Integral();
227 string hnameTmp2 = str(format(
"TOP/bad_hits_xy_%1%") % (module));;
228 TH1* h2DTmp2 = findHist(hnameTmp2);
229 if (h2DTmp2 != NULL) Ntotal_bad_hits_xy += h2DTmp2->Integral();
231 string hnameTmp3 = str(format(
"TOP/good_hits_asics_%1%") % (module));;
232 TH1* h2DTmp3 = findHist(hnameTmp3);
233 if (h2DTmp3 != NULL) Ntotal_good_hits_asics += h2DTmp3->Integral();
235 string hnameTmp4 = str(format(
"TOP/bad_hits_asics_%1%") % (module));;
236 TH1* h2DTmp4 = findHist(hnameTmp4);
237 if (h2DTmp4 != NULL) Ntotal_bad_hits_asics += h2DTmp4->Integral();
241 for (
int i = 1; i <= 16; i++) {
242 m_c_good_hits_xy_[i]->Clear();
243 m_c_good_hits_xy_[i]->cd();
244 TH2F* h2Dscale_xy = (TH2F*)findHist(Form(
"TOP/good_hits_xy_%d", i));
245 if (h2Dscale_xy != NULL && Ntotal_good_hits_xy > 0) {
246 h2Dscale_xy->GetZaxis()->SetRangeUser(0, Ntotal_good_hits_xy / 2500.0);
249 m_c_good_hits_xy_[i]->Modified();
253 for (
int i = 1; i <= 16; i++) {
254 m_c_bad_hits_xy_[i]->Clear();
255 m_c_bad_hits_xy_[i]->cd();
256 TH2F* h2Dscale_xy = (TH2F*)findHist(Form(
"TOP/bad_hits_xy_%d", i));
257 if (h2Dscale_xy != NULL && Ntotal_bad_hits_xy > 0) {
258 h2Dscale_xy->GetZaxis()->SetRangeUser(0, Ntotal_bad_hits_xy / 250.0);
261 m_c_bad_hits_xy_[i]->Modified();
264 for (
int i = 1; i <= 16; i++) {
265 m_c_good_hits_asics_[i]->Clear();
266 m_c_good_hits_asics_[i]->cd();
267 TH2F* h2Dscale_asics = (TH2F*)findHist(Form(
"TOP/good_hits_asics_%d", i));
268 if (h2Dscale_asics != NULL && Ntotal_good_hits_asics > 0) {
269 h2Dscale_asics->GetZaxis()->SetRangeUser(0, Ntotal_good_hits_asics / 2500.0);
270 h2Dscale_asics->Draw();
272 m_c_good_hits_asics_[i]->Modified();
275 for (
int i = 1; i <= 16; i++) {
276 m_c_bad_hits_asics_[i]->Clear();
277 m_c_bad_hits_asics_[i]->cd();
278 TH2F* h2Dscale_asics = (TH2F*)findHist(Form(
"TOP/bad_hits_asics_%d", i));
279 if (h2Dscale_asics != NULL && Ntotal_bad_hits_asics > 0) {
280 h2Dscale_asics->GetZaxis()->SetRangeUser(0, Ntotal_bad_hits_asics / 250.0);
281 h2Dscale_asics->Draw();
283 m_c_bad_hits_asics_[i]->Modified();
286 m_c_goodHitsMean->Clear();
287 m_c_goodHitsMean->cd();
288 m_h_goodHitsMean->Draw();
289 m_c_goodHitsMean->Modified();
291 m_c_goodHitsRMS->Clear();
292 m_c_goodHitsRMS->cd();
293 m_h_goodHitsRMS->Draw();
294 m_c_goodHitsRMS->Modified();
296 m_c_badHitsMean->Clear();
297 m_c_badHitsMean->cd();
298 m_h_badHitsMean->Draw();
299 m_c_badHitsMean->Modified();
301 m_c_badHitsRMS->Clear();
302 m_c_badHitsRMS->cd();
303 m_h_badHitsRMS->Draw();
304 m_c_badHitsRMS->Modified();
307 void DQMHistAnalysisTOPModule::endRun()
309 B2DEBUG(20,
"DQMHistAnalysisTOP : endRun called");
313 void DQMHistAnalysisTOPModule::terminate()
315 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.