10 #include <dqm/analysis/modules/DQMHistAnalysisARICHMonObj.h>
13 #include <dqm/analysis/modules/DQMHistAnalysis.h>
37 DQMHistAnalysisARICHMonObjModule::DQMHistAnalysisARICHMonObjModule()
41 setDescription(
"Example module for making MonitoringObject in DQMHistAnalysis module");
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);
87 TGaxis::SetMaxDigits(3);
88 gStyle->SetPalette(1);
89 gStyle->SetOptStat(0);
93 TH1* chHit =
findHist(
"ARICH/chHit");
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");
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;}
119 pp1->SetTitle(
"Number of hits / APD / event");
120 pp1->SetOption(
"colz");
123 pp2->SetMaximum(0.1 / 36.);
124 pp2->SetMinimum(0.0001 / 36.);
125 pp2->SetTitle(
"Number of hits / channel / event");
128 pflash->SetTitle(
"Number of flash (>40 hits) / event");
131 if (hitsPerEvent) nevt = hitsPerEvent->GetEntries();
139 pp1->SetMaximum(0.1);
141 pp1->SetMinimum(0.0001);
142 pp2->SetMaximum(0.1 / 36.);
150 pp1->GetXaxis()->SetTickLength(0);
151 pp1->GetYaxis()->SetTickLength(0);
155 TH1F* flash = (TH1F*)hapdHitPerEvent->ProjectionX(
"flash", 40, 144);
157 if (nevt)
m_hapdHist->Scale(1. /
float(nevt));
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);
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);
183 double trkevt = nevt > 0 ? tracks2D->GetEntries() / nevt : 0;
184 int ntracks = tracks2D->GetEntries();
188 if (ntracks == 0) comment =
"No arich tracks in file.";
189 if (theta->GetEntries() == 0) comment.append(
" No cherenkov photons available");
192 tracks2D->SetTitle(TString::Format(
"Track distribution (avg %f trk/evt)", trkevt));
193 tracks2D->Draw(
"colz");
197 double sigbkg[8] = {0};
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);
222 sigbkg[1] = f1->GetParameter(0) > 0 ? nphot * f1->GetParError(0) / f1->GetParameter(0) : 0.;
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;
231 sigbkg[1] /
float(ntracks) / theta->GetBinWidth(1));
233 sigbkg[3] /
float(ntracks) / theta->GetBinWidth(1));
236 std::cout << sigbkg[0] <<
" " << sigbkg[1] / float(ntracks) / theta->GetBinWidth(1) << std::endl;
241 TH1F* thetaCl = (TH1F*)theta->Clone(
"thetaCl");
242 thetaCl->SetLineColor(16);
243 thetaCl->SetLineWidth(2);
244 thetaCl->SetTitle(
"");
246 gStyle->SetOptTitle(0);
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());
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));}
258 hmir->SetLineColor(2); hmir->Draw(
"sames hist");
259 leg[iplot]->AddEntry(hmir, TString::Format(
"mirror %d", i));
265 gStyle->SetOptTitle(1);
269 if (chDigit != NULL && nevt) chDigit->Scale(1. / nevt);
271 chHit->Scale(1. / nevt);
272 flash->Scale(1. / nevt);
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,
281 TH1F* occ =
new TH1F(
"arich_occ",
"nhits / nevt for all channels; nhits/nevt;# of chn", 500, 0, 0.005);
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++;
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));
300 for (
int i = 0; i < hapdDigit->GetNbinsX(); i++) {
301 if (hapdDigit->GetBinContent(i + 1) == 0) ndeadHapd++;
320 hotCh->Draw(
"colz text");
322 deadCh->Draw(
"colz text");
324 hotCh1->Draw(
"colz text");
326 falseCh->Draw(
"colz text");
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);
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);
348 bits->SetLineWidth(2);
349 bits->SetLineColor(2);
350 bits->SetOption(
"hist");
351 bits->SetFillStyle(3010);
352 bits->SetFillColor(3);
356 hitsPerTrack->SetLineWidth(2);
357 hitsPerTrack->SetLineColor(2);
358 hitsPerTrack->SetOption(
"hist");
361 hitsPerEvent->SetLineWidth(2);
362 hitsPerEvent->SetLineColor(2);
363 hitsPerEvent->SetOption(
"hist");
367 if (bits) { bits->Draw(); bits->GetYaxis()->SetTitleOffset(0.5); }
369 if (theta) theta->Draw();
371 if (hitsPerTrack) hitsPerTrack->Draw();
373 if (hitsPerEvent) hitsPerEvent->Draw();
375 if (thetaPhi != NULL) thetaPhi->Draw(
"colz");
379 m_monObj->
setVariable(
"hitsPerEvent", hitsPerEvent ? hitsPerEvent->GetMean() : 0, hitsPerEvent ? hitsPerEvent->GetMeanError() : -1);
382 B2DEBUG(20,
"DQMHistAnalysisARICHMonObj : endRun called");
388 B2DEBUG(20,
"terminate called");
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 ~DQMHistAnalysisARICHMonObjModule()
Destructor.
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.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
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.
Abstract base class for different kinds of events.