75 TGaxis::SetMaxDigits(3);
76 gStyle->SetPalette(1);
77 gStyle->SetOptStat(0);
81 TH1* chHit =
findHist(
"ARICH/chHit");
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");
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;}
107 pp1->SetTitle(
"Number of hits / APD / event");
108 pp1->SetOption(
"colz");
111 pp2->SetMaximum(0.1 / 36.);
112 pp2->SetMinimum(0.0001 / 36.);
113 pp2->SetTitle(
"Number of hits / channel / event");
116 pflash->SetTitle(
"Number of flash (>40 hits) / event");
119 if (hitsPerEvent) nevt = hitsPerEvent->GetEntries();
127 double signalHitsPerEvent = 0;
128 double backgroundHitsPerEvent = 0;
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;
138 pp1->SetMaximum(0.1);
140 pp1->SetMinimum(0.0001);
141 pp2->SetMaximum(0.1 / 36.);
149 pp1->GetXaxis()->SetTickLength(0);
150 pp1->GetYaxis()->SetTickLength(0);
154 TH1F* flash = (TH1F*)hapdHitPerEvent->ProjectionX(
"flash", 40, 144);
156 if (nevt)
m_hapdHist->Scale(1. /
float(nevt));
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);
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);
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);
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);
191 tracks2D->SetTitle(TString::Format(
"Track distribution (avg %f trk/evt)", trkevt));
192 tracks2D->Draw(
"colz");
196 double sigbkg[8] = {0};
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);
221 sigbkg[1] = f1->GetParameter(0) > 0 ? nphot * f1->GetParError(0) / f1->GetParameter(0) : 0.;
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;
240 TH1F* thetaCl = (TH1F*)theta->Clone(
"thetaCl");
241 thetaCl->SetLineColor(16);
242 thetaCl->SetLineWidth(2);
243 thetaCl->SetTitle(
"");
245 gStyle->SetOptTitle(0);
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());
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));}
257 hmir->SetLineColor(2); hmir->Draw(
"sames hist");
258 leg[iplot]->AddEntry(hmir, TString::Format(
"mirror %d", i));
264 gStyle->SetOptTitle(1);
268 if (chDigit != NULL && nevt) chDigit->Scale(1. / nevt);
270 chHit->Scale(1. / nevt);
271 flash->Scale(1. / nevt);
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,
280 TH1F* occ =
new TH1F(
"arich_occ",
"nhits / nevt for all channels; nhits/nevt;# of chn", 500, 0, 0.005);
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++;
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));
299 for (
int i = 0; i < hapdDigit->GetNbinsX(); i++) {
300 if (hapdDigit->GetBinContent(i + 1) == 0) ndeadHapd++;
303 m_monObj->setVariable(
"nhot", nhot);
304 m_monObj->setVariable(
"ndead", ndead);
305 m_monObj->setVariable(
"ndeadHapd", ndeadHapd);
319 hotCh->Draw(
"colz text");
321 deadCh->Draw(
"colz text");
323 hotCh1->Draw(
"colz text");
325 falseCh->Draw(
"colz text");
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);
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);
347 bits->SetLineWidth(2);
348 bits->SetLineColor(2);
349 bits->SetOption(
"hist");
350 bits->SetFillStyle(3010);
351 bits->SetFillColor(3);
355 hitsPerTrack->SetLineWidth(2);
356 hitsPerTrack->SetLineColor(2);
357 hitsPerTrack->SetOption(
"hist");
360 hitsPerEvent->SetLineWidth(2);
361 hitsPerEvent->SetLineColor(2);
362 hitsPerEvent->SetOption(
"hist");
366 if (bits) { bits->Draw(); bits->GetYaxis()->SetTitleOffset(0.5); }
368 if (theta) theta->Draw();
370 if (hitsPerTrack) hitsPerTrack->Draw();
372 if (hitsPerEvent) hitsPerEvent->Draw();
374 if (thetaPhi != NULL) thetaPhi->Draw(
"colz");
378 m_monObj->setVariable(
"hitsPerEvent", hitsPerEvent ? hitsPerEvent->GetMean() : 0, hitsPerEvent ? hitsPerEvent->GetMeanError() : -1);
380 m_monObj->setVariable(
"signalHitsPerEvent", signalHitsPerEvent);
381 m_monObj->setVariable(
"backgroundHitsPerEvent", backgroundHitsPerEvent);
384 m_monObj->setVariable(
"bitsMean", bits ? bits->GetMean() : 0);
385 B2DEBUG(20,
"DQMHistAnalysisARICHMonObj : endRun called");