11 #include <dqm/analysis/modules/DQMHistAnalysisTOP.h>
12 #include <boost/format.hpp>
13 #include <daq/slc/base/StringUtil.h>
35 B2DEBUG(20,
"DQMHistAnalysisTOP: Constructor done.");
39 DQMHistAnalysisTOPModule::~DQMHistAnalysisTOPModule() { }
41 void DQMHistAnalysisTOPModule::initialize()
44 B2DEBUG(20,
"DQMHistAnalysisTOP: initialized.");
46 m_c_goodHitsMean =
new TCanvas(
"TOP/c_good_hits_mean");
47 m_c_goodHitsRMS =
new TCanvas(
"TOP/c_good_hits_rms");
48 m_c_badHitsMean =
new TCanvas(
"TOP/c_bad_hits_mean");
49 m_c_badHitsRMS =
new TCanvas(
"TOP/c_bad_hits_rms");
51 m_h_goodHitsMean =
new TH1F(
"TOP/good_hits_mean",
"Mean of good hits per event", 16, 0.5, 16.5);
52 m_h_goodHitsRMS =
new TH1F(
"TOP/good_hits_rms",
"RMS of good hits per event", 16, 0.5, 16.5);
53 m_h_badHitsMean =
new TH1F(
"TOP/bad_hits_mean",
"Mean of bad hits per event", 16, 0.5, 16.5);
54 m_h_badHitsRMS =
new TH1F(
"TOP/bad_hits_rms",
"RMS of bad hits per event", 16, 0.5, 16.5);
56 m_h_goodHitsMean->GetXaxis()->SetTitle(
"slot number");
57 m_h_goodHitsMean->GetYaxis()->SetTitle(
"hits per event");
58 m_h_goodHitsRMS->GetXaxis()->SetTitle(
"slot number");
59 m_h_goodHitsRMS->GetYaxis()->SetTitle(
"hits per event");
61 m_h_badHitsMean->GetXaxis()->SetTitle(
"slot number");
62 m_h_badHitsMean->GetYaxis()->SetTitle(
"hits per event");
63 m_h_badHitsRMS->GetXaxis()->SetTitle(
"slot number");
64 m_h_badHitsRMS->GetYaxis()->SetTitle(
"hits per event");
66 m_h_goodHitsMean->SetStats(kFALSE);
67 m_h_goodHitsRMS->SetStats(kFALSE);
68 m_h_badHitsMean->SetStats(kFALSE);
69 m_h_badHitsRMS->SetStats(kFALSE);
71 m_h_goodHitsMean->SetMinimum(0);
72 m_h_goodHitsRMS->SetMinimum(0);
73 m_h_badHitsMean->SetMinimum(0);
74 m_h_badHitsRMS->SetMinimum(0);
76 m_line1 =
new TLine(0.5, 215, 16.5, 215);
77 m_line2 =
new TLine(0.5, 235, 16.5, 235);
78 m_line1->SetLineWidth(2);
79 m_line2->SetLineWidth(2);
80 m_line1->SetLineColor(kRed);
81 m_line2->SetLineColor(kRed);
83 m_text1 =
new TPaveText(1, 435, 10, 500,
"NB");
84 m_text1->SetFillColorAlpha(kWhite, 0);
85 m_text1->SetBorderSize(0);
87 m_text2 =
new TPaveText(0.2, 0.70, 0.50, 0.9,
"NB");
88 m_text2->SetFillColorAlpha(kWhite, 0);
89 m_text2->SetBorderSize(0);
93 void DQMHistAnalysisTOPModule::beginRun()
98 TCanvas* DQMHistAnalysisTOPModule::find_canvas(TString canvas_name)
100 TIter nextckey(gROOT->GetListOfCanvases());
101 TObject* cobj = NULL;
103 while ((cobj = (TObject*)nextckey())) {
104 if (cobj->IsA()->InheritsFrom(
"TCanvas")) {
105 if (cobj->GetName() == canvas_name)
109 return (TCanvas*)cobj;
112 TH1* DQMHistAnalysisTOPModule::find_histo_in_canvas(TString histo_name)
114 StringList s = StringUtil::split(histo_name.Data(),
'/');
115 std::string dirname = s[0];
116 std::string hname = s[1];
117 std::string canvas_name = dirname +
"/c_" + hname;
119 TIter nextckey(gROOT->GetListOfCanvases());
120 TObject* cobj = NULL;
122 while ((cobj = (TObject*)nextckey())) {
123 if (cobj->IsA()->InheritsFrom(
"TCanvas")) {
124 if (cobj->GetName() == canvas_name)
128 if (cobj == NULL)
return NULL;
130 TIter nextkey(((TCanvas*)cobj)->GetListOfPrimitives());
133 while ((obj = (TObject*)nextkey())) {
134 if (obj->IsA()->InheritsFrom(
"TH1")) {
135 if (obj->GetName() == histo_name)
142 void DQMHistAnalysisTOPModule::event()
144 for (
int i = 1; i <= 16; i++) {
145 string hname1 = str(format(
"TOP/good_hits_per_event%1%") % (i));;
146 string hname2 = str(format(
"TOP/bad_hits_per_event%1%") % (i));;
147 TH1* h1 = findHist(hname1);
148 TH1* h2 = findHist(hname2);
152 m_h_goodHitsMean->SetBinContent(i, h1->GetMean());
153 m_h_goodHitsRMS->SetBinContent(i, h1->GetRMS());
155 m_h_goodHitsMean->SetBinContent(i, 0);
156 m_h_goodHitsRMS->SetBinContent(i, 0);
159 m_h_badHitsMean->SetBinContent(i, h2->GetMean());
160 m_h_badHitsRMS->SetBinContent(i, h2->GetRMS());
162 m_h_badHitsMean->SetBinContent(i, 0);
163 m_h_badHitsRMS->SetBinContent(i, 0);
167 TH2F* hraw = (TH2F*)findHist(
"TOP/window_vs_slot");
169 double totalraw(0.0);
170 double totalbadraw(0.0);
172 totalraw = hraw->GetEntries();
173 for (
int i = 1; i <= 16; i++) {
174 for (
int j = 1; j <= 512; j++) {
175 double nhraw = hraw->GetBinContent(i, j);
176 if (j < 215 || j > 235) totalbadraw += nhraw ;
180 if (totalraw > 0) exRatio = totalbadraw * 1.0 / totalraw;
183 m_text1->AddText(Form(
"Ratio of entries outside of red lines: %.2f %%", exRatio * 100.0));
184 if (exRatio > 0.01) {
185 m_text1->AddText(
">1% bad, report to TOP experts!");
187 m_text1->AddText(
"<0.1% good, 0.1-1% recoverable.");
192 TCanvas* c1 = find_canvas(
"TOP/c_hitsPerEvent");
195 c1->SetName(
"TOP/c_hitsPerEvent_top");
201 TCanvas* c2 = find_canvas(
"TOP/c_window_vs_slot");
204 if (exRatio > 0.01) c2->Pad()->SetFillColor(kRed);
205 else c2->Pad()->SetFillColor(kWhite);
211 TH1F* hBoolEvtMonitor = (TH1F*)findHist(
"TOP/BoolEvtMonitor");
212 double badRatio(0.0);
215 if (hBoolEvtMonitor != NULL) {
216 totalEvts = hBoolEvtMonitor->GetEntries();
217 totalBadEvts = hBoolEvtMonitor->GetBinContent(2);
219 if (totalEvts > 0) badRatio = totalBadEvts * 1.0 / totalEvts;
222 m_text2->AddText(Form(
"fraction of deviating hits: %.4f %%", badRatio * 100.0));
224 TCanvas* c3 = find_canvas(
"TOP/c_BoolEvtMonitor");
227 if (badRatio > 0.0001) c3->Pad()->SetFillColor(kRed);
228 else c3->Pad()->SetFillColor(kWhite);
232 m_c_goodHitsMean->Clear();
233 m_c_goodHitsMean->cd();
234 m_h_goodHitsMean->Draw();
235 m_c_goodHitsMean->Modified();
237 m_c_goodHitsRMS->Clear();
238 m_c_goodHitsRMS->cd();
239 m_h_goodHitsRMS->Draw();
240 m_c_goodHitsRMS->Modified();
242 m_c_badHitsMean->Clear();
243 m_c_badHitsMean->cd();
244 m_h_badHitsMean->Draw();
245 m_c_badHitsMean->Modified();
247 m_c_badHitsRMS->Clear();
248 m_c_badHitsRMS->cd();
249 m_h_badHitsRMS->Draw();
250 m_c_badHitsRMS->Modified();
253 void DQMHistAnalysisTOPModule::endRun()
255 B2DEBUG(20,
"DQMHistAnalysisTOP : endRun called");
259 void DQMHistAnalysisTOPModule::terminate()
261 B2DEBUG(20,
"terminate called");