Belle II Software  release-06-01-15
DQMHistAnalysisARICHMonObj.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 // Own include
10 #include <dqm/analysis/modules/DQMHistAnalysisARICHMonObj.h>
11 
12 //DQM
13 #include <dqm/analysis/modules/DQMHistAnalysis.h>
14 
15 #include <TF1.h>
16 #include <TH1F.h>
17 #include <TH3.h>
18 #include <TH2.h>
19 #include <TLine.h>
20 #include <TH2Poly.h>
21 #include <TText.h>
22 #include <TROOT.h>
23 #include <TLegend.h>
24 #include <iostream>
25 #include <TStyle.h>
26 #include <TGaxis.h>
27 
28 using namespace std;
29 using namespace Belle2;
30 
31 //-----------------------------------------------------------------
32 // Register module
33 //-----------------------------------------------------------------
34 
35 REG_MODULE(DQMHistAnalysisARICHMonObj);
36 
37 DQMHistAnalysisARICHMonObjModule::DQMHistAnalysisARICHMonObjModule()
39 {
40  // set module description (e.g. insert text)
41  setDescription("Example module for making MonitoringObject in DQMHistAnalysis module");
43 }
44 
46 {
47 }
48 
50 {
51  // make monitoring object related to this module (use arich as an example)
52  // if monitoring object already exists this will return pointer to it
53  m_monObj = getMonitoringObject("arich");
54 
55  // make canvases to be added to MonitoringObject
56  m_c_main = new TCanvas("arich_main", "main", 1500, 800);
57  m_c_mask = new TCanvas("arich_mask", "mask", 750, 1600);
58  m_c_mirror = new TCanvas("arich_mirror", "mirror", 1000, 1000);
59  m_c_tracks = new TCanvas("arich_tracks", "tracks", 500, 500);
60 
61  m_apdHist = new ARICHChannelHist("tmpApdHist", "tmpApdHist", 2);
62  //m_chHist = new ARICHChannelHist("tmpChHist", "tmpChHist", 0); /**<ARICH TObject to draw hit map for each channel*/
63  m_hapdHist = new ARICHChannelHist("tmpHapdHist", "tmpHapdHist", 1);
65  // add canvases to MonitoringObject
70 
71 }
72 
74 {
75 }
76 
78 {
79  // can put the analysis code here or in endRun() function
80  // for the start tests we will store output only end of run so better to put code there
81 }
82 
84 {
85 
86 
87  TGaxis::SetMaxDigits(3);
88  gStyle->SetPalette(1);
89  gStyle->SetOptStat(0);
90 
91 
92  // get existing histograms produced by DQM modules
93  TH1* chHit = findHist("ARICH/chHit");
94  TH1* bits = findHist("ARICH/bits");
95  TH1* hitsPerTrack = findHist("ARICH/hitsPerTrack");
96  TH1* theta = findHist("ARICH/theta");
97  TH2* tracks2D = (TH2*)findHist("ARICH/tracks2D");
98  TH1* hitsPerEvent = findHist("ARICH/hitsPerEvent");
99  TH2* hapdHitPerEvent = (TH2*)findHist("ARICH/hapdHitPerEvent");
100  TH2* thetaPhi = (TH2*)findHist("ARICH/thetaPhi");
101  TH3* mirrorThetaPhi = (TH3*)findHist("ARICH/mirrorThetaPhi");
102  TH1* chDigit = findHist("ARICH/chDigit");
103  TH1* hapdDigit = findHist("ARICH/hapdDigit");
104 
105  if (chHit == NULL) {m_monObj->setVariable("comment", "No arich histograms in file"); B2INFO("Histogram named chHit is not found."); return;}
106  if (chHit->GetEntries() == 0) {m_monObj->setVariable("comment", "No arich hits in histograms"); B2INFO("No arich hits in histograms."); return;}
107 
108  // set the content of main canvas
109  m_c_main->Clear(); // clear existing content
110  m_c_main->Divide(3, 2);
111  m_c_mirror->Clear(); // clear existing content
112  m_c_mirror->Divide(3, 3);
113  m_c_mask->Clear(); // clear existing content
114  m_c_mask->Divide(2, 4);
115  m_c_tracks->Clear(); // clear existing content
116 
117  //Draw 2D hit map of channels and APDs
118  pp1 = new TH2Poly();
119  pp1->SetTitle("Number of hits / APD / event");
120  pp1->SetOption("colz");
121 
122  pp2 = new TH2Poly();
123  pp2->SetMaximum(0.1 / 36.);
124  pp2->SetMinimum(0.0001 / 36.);
125  pp2->SetTitle("Number of hits / channel / event");
126 
127  pflash = new TH2Poly();
128  pflash->SetTitle("Number of flash (>40 hits) / event");
129 
130  int nevt = 0;
131  if (hitsPerEvent) nevt = hitsPerEvent->GetEntries();
132  m_apdHist->fillFromTH1(chHit);
133  // m_chHist->fillFromTH1(chHit);
134  if (nevt) {
135  m_apdHist->Scale(1. / float(nevt));
136  // m_chHist->Scale(1. / float(nevt));
137  }
138 
139  pp1->SetMaximum(0.1);
141  pp1->SetMinimum(0.0001);
142  pp2->SetMaximum(0.1 / 36.);
143  // m_chHist->setPoly(pp2);
144  // pp2->SetMinimum(0.0001 / 36.);
145 
146 
147  //TCanvas main
148  m_c_main->cd(1);
149  pp1->Draw("colz");
150  pp1->GetXaxis()->SetTickLength(0);
151  pp1->GetYaxis()->SetTickLength(0);
152  gPad->SetLogz();
153  //m_c_main->Update();
154 
155  TH1F* flash = (TH1F*)hapdHitPerEvent->ProjectionX("flash", 40, 144);
156  m_hapdHist->fillFromTH1(flash);
157  if (nevt) m_hapdHist->Scale(1. / float(nevt));
158 
160  // draw sector lines
161  double rlin = 40;
162  double rlout = 113;
163  for (int isec = 0; isec < 6; isec++) {
164  double x1 = rlin * cos(M_PI / 3.*isec);
165  double x2 = rlout * cos(M_PI / 3.*isec);
166  double y1 = rlin * sin(M_PI / 3.*isec);
167  double y2 = rlout * sin(M_PI / 3.*isec);
168  TLine* line = new TLine(x1, y1, x2, y2);
169  line->Draw();
170  x1 = rlin * cos(M_PI / 3.*isec + M_PI / 6.);
171  y1 = rlin * sin(M_PI / 3.*isec + M_PI / 6.);
172  TText* lab = new TText(x1, y1, TString::Format("S-%d", isec + 1));
173  lab->SetTextAlign(22);
174  lab->SetTextSize(0.03);
175  lab->Draw();
176  }
177 
178 
179  //TCanvas tracks
180  m_c_tracks->cd();
181  tracks2D->RebinX(4);
182  tracks2D->RebinY(4);
183  double trkevt = nevt > 0 ? tracks2D->GetEntries() / nevt : 0;
184  int ntracks = tracks2D->GetEntries();
185  m_monObj->setVariable("ntracks", ntracks ? ntracks : 0);
186  m_monObj->setVariable("ntracksPerEvent", trkevt ? trkevt : 0);
187  string comment = "";
188  if (ntracks == 0) comment = "No arich tracks in file.";
189  if (theta->GetEntries() == 0) comment.append(" No cherenkov photons available");
190  m_monObj->setVariable("comment", comment);
191 
192  tracks2D->SetTitle(TString::Format("Track distribution (avg %f trk/evt)", trkevt));
193  tracks2D->Draw("colz");
194 
195 
196  if (ntracks) {
197  double sigbkg[8] = {0};
198  //fit two gauses
199  if (theta->GetEntries() == 0) return;
200  TF1* f1 = new TF1("thcFit", "gaus(0)+gaus(3)", 0.2, 0.4);
201  f1->SetParameters(0.8 * theta->GetMaximum(), 0.323, 0.016, 0.2 * theta->GetMaximum() , 0.323, 0.13);
202  f1->FixParameter(5, 0.13);
203  f1->SetParName(0, "C");
204  f1->SetParName(1, "mean");
205  f1->SetParName(2, "sigma");
206  f1->SetParName(3, "p0");
207  f1->SetParName(4, "p1");
208  int status = theta->Fit(f1, "R");
209  double xmin = f1->GetParameter(1) - 2.*f1->GetParameter(2);
210  double xmax = f1->GetParameter(1) + 2.*f1->GetParameter(2);
211  double tmp = f1->GetParameter(3);
212  f1->SetParameter(3, 0);
213  double nphot = f1->Integral(xmin, xmax);
214  f1->SetParameter(3, tmp);
215  tmp = f1->GetParameter(0);
216  f1->SetParameter(0, 0);
217  double nbkg = f1->Integral(xmin, xmax);
218  f1->SetParameter(0, tmp);
219  if (status) return;
220 
221  sigbkg[0] = nphot;
222  sigbkg[1] = f1->GetParameter(0) > 0 ? nphot * f1->GetParError(0) / f1->GetParameter(0) : 0.;
223  sigbkg[2] = nbkg;
224  sigbkg[3] = f1->GetParameter(3) > 0 ? nbkg * f1->GetParError(3) / f1->GetParameter(3) : 0.;
225  sigbkg[4] = f1->GetParameter(1);
226  sigbkg[5] = f1->GetParError(1);
227  sigbkg[6] = f1->GetParameter(2);
228  sigbkg[7] = f1->GetParError(2);
229  if (theta->GetBinWidth(1) == 0) return;
230  m_monObj->setVariable("nsig", sigbkg[0] / float(ntracks) / theta->GetBinWidth(1),
231  sigbkg[1] / float(ntracks) / theta->GetBinWidth(1));
232  m_monObj->setVariable("nbgr", sigbkg[2] / float(ntracks) / theta->GetBinWidth(1),
233  sigbkg[3] / float(ntracks) / theta->GetBinWidth(1));
234  m_monObj->setVariable("theta", sigbkg[4], sigbkg[5]);
235  m_monObj->setVariable("sigma", sigbkg[6], sigbkg[7]);
236  std::cout << sigbkg[0] << " " << sigbkg[1] / float(ntracks) / theta->GetBinWidth(1) << std::endl;
237  }
238 
239 
240  //TCanvas mirror
241  TH1F* thetaCl = (TH1F*)theta->Clone("thetaCl");
242  thetaCl->SetLineColor(16);
243  thetaCl->SetLineWidth(2);
244  thetaCl->SetTitle("");
245  TLegend* leg[9];
246  gStyle->SetOptTitle(0);
247 
248  if (mirrorThetaPhi) {
249  for (int i = 1; i < 18 + 1; i++) {
250  TH1F* hmir = (TH1F*)mirrorThetaPhi->ProjectionZ(TString::Format("hmir_%d", i), i, i, 1, 10000);
251  hmir->SetTitle(TString::Format("mirror %d", i));
252  if (hmir->GetEntries() > 0) hmir->Scale(theta->GetEntries() / hmir->GetEntries());
253  hmir->Rebin(2);
254  hmir->SetLineWidth(2);
255  int iplot = (i - 1) / 2;
256  if ((i - 1) % 2 == 0) { m_c_mirror->cd(iplot + 1); thetaCl->Draw("hist"); hmir->SetLineColor(1); hmir->Draw("sames hist"); leg[iplot] = new TLegend(0.1, 0.75, 0.4, 0.9); leg[iplot]->AddEntry(hmir, TString::Format("mirror %d", i));}
257  else {
258  hmir->SetLineColor(2); hmir->Draw("sames hist");
259  leg[iplot]->AddEntry(hmir, TString::Format("mirror %d", i));
260  leg[iplot]->Draw();
261  }
262  }
263  }
264 
265  gStyle->SetOptTitle(1);
266 
267 
268  //chDigit
269  if (chDigit != NULL && nevt) chDigit->Scale(1. / nevt);
270  if (nevt) {
271  chHit->Scale(1. / nevt);
272  flash->Scale(1. / nevt);
273  }
274  int nhot = 0, ndead = 0;
275  TH2F* hotCh = new TH2F("arich_hot", "Number of channels in APD with >0.5% occ.", 42, 0.5, 42.5, 40, 0.5, 40.5);
276  TH2F* hotCh1 = new TH2F("arich_hot1", "Number of channels in APD with >0.5% occ. after mask", 42, 0.5, 42.5, 40, 0.5, 40.5);
277  TH2F* deadCh = new TH2F("arich_dead", "Number of channels in APD with no hits", 42, 0.5, 42.5, 40, 0.5, 40.5);
278  TH2F* falseCh = new TH2F("arich_false", "Number of wrongly masked channels in APD (masked but not dead/hot)", 42, 0.5, 42.5, 40,
279  0.5,
280  40.5);
281  TH1F* occ = new TH1F("arich_occ", "nhits / nevt for all channels; nhits/nevt;# of chn", 500, 0, 0.005);
282 
283  int ndeadHapd = 0;
284  if (chDigit != NULL) {
285  double hotlim = 0.005;
286  for (int i = 0; i < chDigit->GetNbinsX(); i++) {
287  int hapd = i / 144 + 1; int chip = (i % 144) / 36 + 1;
288  int binx = (hapd - 1) % 42 + 1; int biny = ((hapd - 1) / 42) * 4 + chip;
289  if (chDigit->GetBinContent(i + 1) > hotlim) { hotCh->Fill(binx, biny); nhot++;}
290  if (chDigit->GetBinContent(i + 1) == 0) {
291  deadCh->Fill(binx, biny);
292  if (hapdDigit->GetBinContent(hapd) != 0) ndead++;
293  }
294  if (chHit->GetBinContent(i + 1) == 0 && chDigit->GetBinContent(i + 1) < hotlim
295  && chDigit->GetBinContent(i + 1) > 0.00002) falseCh->Fill(binx, biny);
296  if (chHit->GetBinContent(i + 1) > hotlim) hotCh1->Fill(binx, biny);
297  occ->Fill(chHit->GetBinContent(i + 1));
298  }
299 
300  for (int i = 0; i < hapdDigit->GetNbinsX(); i++) {
301  if (hapdDigit->GetBinContent(i + 1) == 0) ndeadHapd++;
302  }
303  }
304  m_monObj->setVariable("nhot", nhot);
305  m_monObj->setVariable("ndead", ndead);
306  m_monObj->setVariable("ndeadHapd", ndeadHapd);
307 
308 
309  // TCanvas mask
310  m_c_mask->cd(1);
311  occ->Draw();
312  m_c_mask->cd(2);
313  pflash->Draw("colz");
314  m_c_mask->cd(3);
315  // pp2->Draw("colz");
316  //pp2->GetXaxis()->SetTickLength(0);
317  //pp2->GetYaxis()->SetTickLength(0);
318  gPad->SetLogz();
319  m_c_mask->cd(4);
320  hotCh->Draw("colz text");
321  m_c_mask->cd(5);
322  deadCh->Draw("colz text");
323  m_c_mask->cd(6);
324  hotCh1->Draw("colz text");
325  m_c_mask->cd(7);
326  falseCh->Draw("colz text");
327 
328  for (int i = 0; i < 42; i++) {
329  double x1 = i + 0.5 + 1;
330  TLine* line = new TLine(x1, 0.5, x1, 40.5);
331  m_c_mask->cd(5); line->Draw();
332  m_c_mask->cd(6); line->Draw();
333  m_c_mask->cd(7); line->Draw();
334  m_c_mask->cd(4); line->Draw();
335  }
336  for (int i = 0; i < 40; i++) {
337  double y1 = i + 0.5 + 1;
338  TLine* line = new TLine(0.5, y1, 42.5, y1);
339  if ((i + 1) % 4 == 0) line->SetLineColor(2);
340  else line->SetLineColor(15);
341  m_c_mask->cd(5); line->Draw();
342  m_c_mask->cd(6); line->Draw();
343  m_c_mask->cd(7); line->Draw();
344  m_c_mask->cd(4); line->Draw();
345  }
346 
347  if (bits) {
348  bits->SetLineWidth(2);
349  bits->SetLineColor(2);
350  bits->SetOption("hist");
351  bits->SetFillStyle(3010);
352  bits->SetFillColor(3);
353  }
354 
355  if (hitsPerTrack) {
356  hitsPerTrack->SetLineWidth(2);
357  hitsPerTrack->SetLineColor(2);
358  hitsPerTrack->SetOption("hist");
359  }
360  if (hitsPerEvent) {
361  hitsPerEvent->SetLineWidth(2);
362  hitsPerEvent->SetLineColor(2);
363  hitsPerEvent->SetOption("hist");
364  }
365  //Tcanvas main
366  m_c_main->cd(2);
367  if (bits) { bits->Draw(); bits->GetYaxis()->SetTitleOffset(0.5); }
368  m_c_main->cd(3);
369  if (theta) theta->Draw();
370  m_c_main->cd(4);
371  if (hitsPerTrack) hitsPerTrack->Draw();
372  m_c_main->cd(5);
373  if (hitsPerEvent) hitsPerEvent->Draw();
374  m_c_main->cd(6);
375  if (thetaPhi != NULL) thetaPhi->Draw("colz");
376 
377  // set values of monitoring variables (if variable already exists this will change its value, otherwise it will insert new variable)
378  // with error (also asymmetric error can be used as m_monObj->setVariable(name, value, upError, downError))
379  m_monObj->setVariable("hitsPerEvent", hitsPerEvent ? hitsPerEvent->GetMean() : 0, hitsPerEvent ? hitsPerEvent->GetMeanError() : -1);
380  // without error
381  m_monObj->setVariable("bitsMean", bits ? bits->GetMean() : 0);
382  B2DEBUG(20, "DQMHistAnalysisARICHMonObj : endRun called");
383 }
384 
386 {
387 
388  B2DEBUG(20, "terminate called");
389 }
ARICH histogram with HAPD plane 3 options for bin segmentation are available type 0 - one bin per HAP...
void fillFromTH1(TH1 *hist)
Fill the channelHist from the histogram Type 0 channelHist has to be filled with 420*144bin TH1 (each...
void setPoly(TH2Poly *poly)
Fill pure TH2Poly from ARICHChannelHist, makes bins and fills content.
virtual void initialize() override
Initialize the Module.
virtual void event() override
Event processor.
Belle2::ARICHChannelHist * m_apdHist
ARICH TObject to draw hit map for each APD.
virtual void endRun() override
End-of-run action.
virtual void terminate() override
Termination action.
MonitoringObject * m_monObj
MonitoringObject to be produced by this module.
Belle2::ARICHChannelHist * m_hapdHist
ARICH TObject to draw flash map for each hapd.
TCanvas * m_c_mask
Canvas with histograms related to channel masking.
virtual void beginRun() override
Begin run function.
TCanvas * m_c_main
Canvas with main run summary histograms.
TCanvas * m_c_mirror
Canvas with histograms related to mirrors.
TH2Poly * pp2
2D hitmap of number of hits per channel per event
TCanvas * m_c_tracks
Canvas with histograms related to tracks.
TH2Poly * pflash
2D hitmap of number of flash (>40 hits) per event
TH2Poly * pp1
2D hitmap of number of hits per APD per event
The base class for the histogram analysis module.
static TH1 * findHist(const std::string &histname)
Find histogram.
static MonitoringObject * getMonitoringObject(const std::string &histname)
Get MonitoringObject with given name (new object is created if non-existing)
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
void setVariable(const std::string &var, float val, float upErr=-1., float dwErr=-1)
set value to float variable (new variable is made if not yet existing)
void addCanvas(TCanvas *canv)
Add Canvas to monitoring object.
TH1F * hapd[6]
histogram of hits for each hapd
#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.