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