Belle II Software  release-06-02-00
DQMHistAnalysisTOP.cc
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 #include <dqm/analysis/modules/DQMHistAnalysisTOP.h>
10 #include <boost/format.hpp>
11 #include <daq/slc/base/StringUtil.h>
12 #include <TClass.h>
13 #include <TH2.h>
14 #include "TROOT.h"
15 
16 using namespace std;
17 using namespace Belle2;
18 using boost::format;
19 
20 //-----------------------------------------------------------------
21 // Register the Module
22 //-----------------------------------------------------------------
23 REG_MODULE(DQMHistAnalysisTOP)
24 
25 //-----------------------------------------------------------------
26 // Implementation
27 //-----------------------------------------------------------------
28 
31 {
32  //Parameter definition
33  B2DEBUG(20, "DQMHistAnalysisTOP: Constructor done.");
34 }
35 
36 
37 DQMHistAnalysisTOPModule::~DQMHistAnalysisTOPModule() { }
38 
39 void DQMHistAnalysisTOPModule::initialize()
40 {
41  gROOT->cd();
42  B2DEBUG(20, "DQMHistAnalysisTOP: initialized.");
43 
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");
48 
49  //using c2_Name to avoid an overlap on default c_Name
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));
55  }
56 
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);
61 
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");
66 
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");
71 
72  m_h_goodHitsMean->SetStats(kFALSE);
73  m_h_goodHitsRMS->SetStats(kFALSE);
74  m_h_badHitsMean->SetStats(kFALSE);
75  m_h_badHitsRMS->SetStats(kFALSE);
76 
77  m_h_goodHitsMean->SetMinimum(0);
78  m_h_goodHitsRMS->SetMinimum(0);
79  m_h_badHitsMean->SetMinimum(0);
80  m_h_badHitsRMS->SetMinimum(0);
81 
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);
88 
89  m_text1 = new TPaveText(1, 435, 10, 500, "NB");
90  m_text1->SetFillColorAlpha(kWhite, 0);
91  m_text1->SetBorderSize(0);
92 
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);
96 }
97 
98 
99 void DQMHistAnalysisTOPModule::beginRun()
100 {
101  //B2DEBUG(20, "DQMHistAnalysisTOP: beginRun called.");
102 }
103 
104 TH1* DQMHistAnalysisTOPModule::find_histo_in_canvas(TString histo_name)
105 {
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;
110 
111  auto cobj = findCanvas(canvas_name);
112  if (cobj == nullptr) return nullptr;
113 
114  TIter nextkey(((TCanvas*)cobj)->GetListOfPrimitives());
115  TObject* obj{};
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);
120  }
121  }
122  return nullptr;
123 }
124 
125 void DQMHistAnalysisTOPModule::event()
126 {
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);
132  //TH1* h1 = find_histo_in_canvas(hname1);
133  //TH1* h2 = find_histo_in_canvas(hname2);
134  if (h1 != NULL) {
135  m_h_goodHitsMean->SetBinContent(i, h1->GetMean());
136  m_h_goodHitsRMS->SetBinContent(i, h1->GetRMS());
137  } else {
138  m_h_goodHitsMean->SetBinContent(i, 0);
139  m_h_goodHitsRMS->SetBinContent(i, 0);
140  }
141  if (h2 != NULL) {
142  m_h_badHitsMean->SetBinContent(i, h2->GetMean());
143  m_h_badHitsRMS->SetBinContent(i, h2->GetRMS());
144  } else {
145  m_h_badHitsMean->SetBinContent(i, 0);
146  m_h_badHitsRMS->SetBinContent(i, 0);
147  }
148  }
149 
150  TH2F* hraw = (TH2F*)findHist("TOP/window_vs_slot");
151  double exRatio(0.0);
152  double totalraw(0.0);
153  double totalbadraw(0.0);
154  if (hraw != NULL) {
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 ;
160  }
161  }
162  }
163  if (totalraw > 0) exRatio = totalbadraw * 1.0 / totalraw;
164 
165  m_text1->Clear();
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!");
169  } else {
170  m_text1->AddText("<0.1% good, 0.1-1% recoverable.");
171  }
172 
173  //addHist("", m_h_goodHitsMean->GetName(), m_h_goodHitsMean);
174 
175  TCanvas* c1 = findCanvas("TOP/c_hitsPerEvent");
176  //TH1* h1=find_histo_in_canvas("TOP/hitsPerEvent");
177  if (c1 != NULL) {
178  c1->SetName("TOP/c_hitsPerEvent_top");
179  }
180  //if (h1!=NULL) {
181  // h1->SetName("TOP/hitsPerEvent_top");
182  //}
183 
184  TCanvas* c2 = findCanvas("TOP/c_window_vs_slot");
185  if (c2 != NULL) {
186  c2->cd();
187  if (exRatio > 0.01) c2->Pad()->SetFillColor(kRed);
188  else c2->Pad()->SetFillColor(kWhite);
189  m_line1->Draw();
190  m_line2->Draw();
191  m_text1->Draw();
192  }
193 
194  TH1F* hBoolEvtMonitor = (TH1F*)findHist("TOP/BoolEvtMonitor");
195  double badRatio(0.0);
196  int totalBadEvts(0);
197  int totalEvts(0);
198  if (hBoolEvtMonitor != NULL) {
199  totalEvts = hBoolEvtMonitor->GetEntries();
200  totalBadEvts = hBoolEvtMonitor->GetBinContent(2);
201  }
202  if (totalEvts > 0) badRatio = totalBadEvts * 1.0 / totalEvts;
203 
204  m_text2->Clear();
205  m_text2->AddText(Form("fraction of deviating hits: %.4f %%", badRatio * 100.0));
206 
207  TCanvas* c3 = findCanvas("TOP/c_BoolEvtMonitor");
208  if (c3 != NULL) {
209  c3->cd();
210  if (badRatio > 0.0001) c3->Pad()->SetFillColor(kRed);
211  else c3->Pad()->SetFillColor(kWhite);
212  m_text2->Draw();
213  }
214 
215  //obtaining the total yield for 16 2D-plots
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();
224 
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();
228 
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();
232 
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();
236  }
237 
238  // reset the maximum z-axis of 16 2D plots: 3 times of average for good hits; 30 times of average for bad hits
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);
245  h2Dscale_xy->Draw();
246  }
247  m_c_good_hits_xy_[i]->Modified();
248  }
249 
250 
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);
257  h2Dscale_xy->Draw();
258  }
259  m_c_bad_hits_xy_[i]->Modified();
260  }
261 
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();
269  }
270  m_c_good_hits_asics_[i]->Modified();
271  }
272 
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();
280  }
281  m_c_bad_hits_asics_[i]->Modified();
282  }
283 
284  m_c_goodHitsMean->Clear();
285  m_c_goodHitsMean->cd();
286  m_h_goodHitsMean->Draw();
287  m_c_goodHitsMean->Modified();
288 
289  m_c_goodHitsRMS->Clear();
290  m_c_goodHitsRMS->cd();
291  m_h_goodHitsRMS->Draw();
292  m_c_goodHitsRMS->Modified();
293 
294  m_c_badHitsMean->Clear();
295  m_c_badHitsMean->cd();
296  m_h_badHitsMean->Draw();
297  m_c_badHitsMean->Modified();
298 
299  m_c_badHitsRMS->Clear();
300  m_c_badHitsRMS->cd();
301  m_h_badHitsRMS->Draw();
302  m_c_badHitsRMS->Modified();
303 }
304 
305 void DQMHistAnalysisTOPModule::endRun()
306 {
307  B2DEBUG(20, "DQMHistAnalysisTOP : endRun called");
308 }
309 
310 
311 void DQMHistAnalysisTOPModule::terminate()
312 {
313  B2DEBUG(20, "terminate called");
314 }
315 
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.
Definition: Module.h:650
Abstract base class for different kinds of events.