2 // plots for the note about multplicity measurements
5 const char* correctionFile = "multiplicityMC_2M.root";
6 const char* measuredFile = "multiplicityMC_1M_3.root";
9 const char* correctionFileTPC = "multiplicityMC_TPC_1.4M.root";
10 const char* measuredFileTPC = "multiplicityMC_TPC_0.6M.root";
11 Int_t etaRangeTPC = 1;
15 correctionFile = correctionFileTPC;
16 measuredFile = measuredFileTPC;
17 etaRange = etaRangeTPC;
20 void responseMatrixPlot()
22 gSystem->Load("libPWG0base");
24 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
26 TFile::Open(correctionFile);
27 mult->LoadHistograms("Multiplicity");
29 TH1* hist = mult->GetCorrelation(etaRange)->Project3D("zy");
30 hist->SetStats(kFALSE);
32 hist->SetTitle(";true multiplicity;measured multiplicity;Entries");
33 hist->GetXaxis()->SetRangeUser(0, 200);
34 hist->GetYaxis()->SetRangeUser(0, 200);
36 TCanvas* canvas = new TCanvas("c1", "c1", 800, 600);
37 canvas->SetRightMargin(0.15);
38 canvas->SetTopMargin(0.05);
43 canvas->SaveAs("responsematrix.eps");
46 TCanvas* DrawResultRatio(TH1* mcHist, TH1* result, TString epsName)
48 // normalize unfolded result to mc hist
49 result->Scale(1.0 / result->Integral(2, 200));
50 result->Scale(mcHist->Integral(2, 200));
52 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 600);
53 canvas->Range(0, 0, 1, 1);
55 TPad* pad1 = new TPad(Form("%s_pad1", epsName), "", 0, 0.5, 0.98, 0.98);
58 TPad* pad2 = new TPad(Form("%s_pad2", epsName), "", 0, 0.02, 0.98, 0.5);
61 pad1->SetRightMargin(0.05);
62 pad2->SetRightMargin(0.05);
64 // no border between them
65 pad1->SetBottomMargin(0);
66 pad2->SetTopMargin(0);
70 mcHist->GetXaxis()->SetLabelSize(0.06);
71 mcHist->GetYaxis()->SetLabelSize(0.06);
72 mcHist->GetXaxis()->SetTitleSize(0.06);
73 mcHist->GetYaxis()->SetTitleSize(0.06);
74 mcHist->GetYaxis()->SetTitleOffset(0.6);
76 mcHist->GetXaxis()->SetRangeUser(0, 200);
78 mcHist->SetTitle(";true multiplicity;Entries");
79 mcHist->SetStats(kFALSE);
81 mcHist->DrawCopy("HIST E");
84 result->SetLineColor(2);
85 result->DrawCopy("SAME HISTE");
87 TLegend* legend = new TLegend(0.6, 0.65, 0.95, 0.9);
88 legend->AddEntry(mcHist, "true distribution");
89 legend->AddEntry(result, "unfolded distribution");
90 legend->SetFillColor(0);
94 pad2->SetBottomMargin(0.15);
98 TH1* ratio = (TH1*) mcHist->Clone("ratio");
100 ratio->Divide(ratio, result, 1, 1, "");
101 ratio->GetYaxis()->SetTitle("Ratio (true / unfolded)");
102 ratio->GetYaxis()->SetRangeUser(0.55, 1.45);
106 // get average of ratio
108 for (Int_t i=2; i<=150; ++i)
110 sum += TMath::Abs(ratio->GetBinContent(i) - 1);
114 printf("Average (2..150) of |ratio - 1| is %f\n", sum);
116 TLine* line = new TLine(0, 1, 200, 1);
117 line->SetLineWidth(2);
120 line = new TLine(0, 1.1, 200, 1.1);
121 line->SetLineWidth(2);
122 line->SetLineStyle(2);
124 line = new TLine(0, 0.9, 200, 0.9);
125 line->SetLineWidth(2);
126 line->SetLineStyle(2);
131 canvas->SaveAs(epsName);
136 TCanvas* Draw2ResultRatio(TH1* mcHist, TH1* result1, TH1* result2, TString epsName)
138 // draws the 3 plots in the upper plot
139 // draws the ratio between result1 and result2 in the lower plot
141 // normalize unfolded result to mc hist
142 result1->Scale(1.0 / result1->Integral(2, 200));
143 result1->Scale(mcHist->Integral(2, 200));
144 result2->Scale(1.0 / result2->Integral(2, 200));
145 result2->Scale(mcHist->Integral(2, 200));
147 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 600);
148 canvas->Range(0, 0, 1, 1);
150 TPad* pad1 = new TPad(Form("%s_pad1", epsName), "", 0, 0.5, 0.98, 0.98);
153 TPad* pad2 = new TPad(Form("%s_pad2", epsName), "", 0, 0.02, 0.98, 0.5);
156 pad1->SetRightMargin(0.05);
157 pad2->SetRightMargin(0.05);
159 // no border between them
160 pad1->SetBottomMargin(0);
161 pad2->SetTopMargin(0);
165 mcHist->GetXaxis()->SetLabelSize(0.06);
166 mcHist->GetYaxis()->SetLabelSize(0.06);
167 mcHist->GetXaxis()->SetTitleSize(0.06);
168 mcHist->GetYaxis()->SetTitleSize(0.06);
169 mcHist->GetYaxis()->SetTitleOffset(0.6);
171 mcHist->GetXaxis()->SetRangeUser(0, 150);
173 mcHist->SetTitle(";true multiplicity;Entries");
174 mcHist->SetStats(kFALSE);
176 mcHist->DrawCopy("HIST E");
179 result1->SetLineColor(2);
180 result1->DrawCopy("SAME HISTE");
182 result2->SetLineColor(4);
183 result2->DrawCopy("SAME HISTE");
185 TLegend* legend = new TLegend(0.55, 0.6, 0.95, 0.9);
186 legend->AddEntry(mcHist, "true distribution");
187 legend->AddEntry(result1, "unfolded distribution (syst)");
188 legend->AddEntry(result2, "unfolded distribution (normal)");
189 legend->SetFillColor(0);
193 pad2->SetBottomMargin(0.15);
195 result1->GetXaxis()->SetLabelSize(0.06);
196 result1->GetYaxis()->SetLabelSize(0.06);
197 result1->GetXaxis()->SetTitleSize(0.06);
198 result1->GetYaxis()->SetTitleSize(0.06);
199 result1->GetYaxis()->SetTitleOffset(0.6);
201 result1->GetXaxis()->SetRangeUser(0, 150);
203 result1->SetTitle(";true multiplicity;Entries");
204 result1->SetStats(kFALSE);
208 TH1* ratio = (TH1*) result1->Clone("ratio");
210 ratio->Divide(ratio, result2, 1, 1, "");
211 ratio->GetYaxis()->SetTitle("Ratio (syst / normal)");
212 ratio->GetYaxis()->SetRangeUser(0.55, 1.45);
216 // get average of ratio
218 for (Int_t i=2; i<=150; ++i)
220 sum += TMath::Abs(ratio->GetBinContent(i) - 1);
224 printf("Average (2..150) of |ratio - 1| is %f\n", sum);
226 TLine* line = new TLine(0, 1, 150, 1);
227 line->SetLineWidth(2);
230 line = new TLine(0, 1.1, 150, 1.1);
231 line->SetLineWidth(2);
232 line->SetLineStyle(2);
234 line = new TLine(0, 0.9, 150, 0.9);
235 line->SetLineWidth(2);
236 line->SetLineStyle(2);
241 canvas->SaveAs(epsName);
246 TCanvas* DrawRatio(TH1* result, Int_t nResultSyst, TH1** resultSyst, TString epsName, Bool_t firstMarker = kFALSE)
248 // compares n results with first results. E.g. one gained with the default response, another with a changed one to study
249 // a systematic effect
252 result->Scale(1.0 / result->Integral(2, 200));
254 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 400);
256 result->GetXaxis()->SetRangeUser(0, 150);
257 result->SetStats(kFALSE);
259 for (Int_t n=0; n<nResultSyst; ++n)
261 resultSyst[n]->Scale(1.0 / resultSyst[n]->Integral(2, 200));
264 TH1* ratio = (TH1*) result->Clone("ratio");
265 ratio->Divide(ratio, resultSyst[n], 1, 1, "B");
266 ratio->SetTitle(";true multiplicity;Ratio");
267 ratio->GetYaxis()->SetRangeUser(0.55, 1.45);
270 ratio->SetMarkerStyle(5);
272 ratio->SetLineColor(n+1);
274 ratio->DrawCopy((n == 0) ? ((firstMarker) ? "P" : "HIST") : "SAME HIST");
276 // get average of ratio
278 for (Int_t i=2; i<=150; ++i)
279 sum += TMath::Abs(ratio->GetBinContent(i) - 1);
282 printf("%d) Average (2..150) of |ratio - 1| is %f\n", n, sum);
285 TLine* line = new TLine(0, 1, 150, 1);
286 line->SetLineWidth(2);
289 line = new TLine(0, 1.1, 150, 1.1);
290 line->SetLineWidth(2);
291 line->SetLineStyle(2);
293 line = new TLine(0, 0.9, 150, 0.9);
294 line->SetLineWidth(2);
295 line->SetLineStyle(2);
300 canvas->SaveAs(epsName);
301 canvas->SaveAs(Form("%s.gif", epsName.Data()));
306 TCanvas* DrawRatio(Int_t nResultSyst, TH1** mc, TH1** result, TString epsName)
308 // draws the ratios of each mc to the corresponding result
310 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 400);
312 for (Int_t n=0; n<nResultSyst; ++n)
315 result[n]->Scale(1.0 / result[n]->Integral(2, 200));
316 mc[n]->Scale(1.0 / mc[n]->Integral(2, 200));
318 result[n]->GetXaxis()->SetRangeUser(0, 150);
319 result[n]->SetStats(kFALSE);
322 TH1* ratio = (TH1*) result[n]->Clone("ratio");
323 ratio->Divide(mc[n], ratio, 1, 1, "B");
324 ratio->SetTitle(";true multiplicity;Ratio (true / unfolded)");
325 ratio->GetYaxis()->SetRangeUser(0.55, 1.45);
327 ratio->SetLineColor(n+1);
329 ratio->DrawCopy((n == 0) ? "HIST" : "SAME HIST");
331 // get average of ratio
333 for (Int_t i=2; i<=150; ++i)
334 sum += TMath::Abs(ratio->GetBinContent(i) - 1);
337 printf("%d) Average (2..150) of |ratio - 1| is %f\n", n, sum);
340 TLine* line = new TLine(0, 1, 150, 1);
341 line->SetLineWidth(2);
344 line = new TLine(0, 1.1, 150, 1.1);
345 line->SetLineWidth(2);
346 line->SetLineStyle(2);
348 line = new TLine(0, 0.9, 150, 0.9);
349 line->SetLineWidth(2);
350 line->SetLineStyle(2);
355 canvas->SaveAs(epsName);
356 canvas->SaveAs(Form("%s.gif", epsName.Data()));
361 TCanvas* DrawRatioDeduct(TH1* mcBase, TH1* resultBase, Int_t nResultSyst, TH1** mc, TH1** result, TString epsName)
363 // draws the ratios of each mc to the corresponding result
364 // deducts from each ratio the ratio of mcBase / resultBase
367 resultBase->Scale(1.0 / resultBase->Integral(2, 200));
368 mcBase->Scale(1.0 / mcBase->Integral(2, 200));
371 TH1* ratioBase = (TH1*) resultBase->Clone("ratioBase");
372 ratioBase->Divide(mcBase, ratioBase, 1, 1, "B");
374 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 400);
375 canvas->SetRightMargin(0.05);
376 canvas->SetTopMargin(0.05);
378 for (Int_t n=0; n<nResultSyst; ++n)
381 result[n]->Scale(1.0 / result[n]->Integral(2, 200));
382 mc[n]->Scale(1.0 / mc[n]->Integral(2, 200));
384 result[n]->GetXaxis()->SetRangeUser(0, 150);
385 result[n]->SetStats(kFALSE);
388 TH1* ratio = (TH1*) result[n]->Clone("ratio");
389 ratio->Divide(mc[n], ratio, 1, 1, "B");
390 ratio->Add(ratioBase, -1);
392 ratio->SetTitle(";true multiplicity;Ratio_{syst} (t/u) - Ratio (t/u)");
393 ratio->GetYaxis()->SetRangeUser(-1, 1);
394 ratio->SetLineColor(n+1);
395 ratio->DrawCopy((n == 0) ? "HIST" : "SAME HIST");
397 // get average of ratio
399 for (Int_t i=2; i<=150; ++i)
400 sum += TMath::Abs(ratio->GetBinContent(i));
403 printf("%d) Average (2..150) of |ratio - ratioBase| is %f\n", n, sum);
406 TLine* line = new TLine(0, 0, 150, 0);
407 line->SetLineWidth(2);
410 line = new TLine(0, 0.1, 150, 0.1);
411 line->SetLineWidth(2);
412 line->SetLineStyle(2);
414 line = new TLine(0, -0.1, 150, -0.1);
415 line->SetLineWidth(2);
416 line->SetLineStyle(2);
421 canvas->SaveAs(epsName);
422 canvas->SaveAs(Form("%s.gif", epsName.Data()));
427 void Smooth(TH1* hist, Int_t windowWidth = 20)
429 TH1* clone = (TH1*) hist->Clone("clone");
430 for (Int_t bin=3; bin<=clone->GetNbinsX(); ++bin)
432 Int_t min = TMath::Max(3, bin-windowWidth);
433 Int_t max = TMath::Min(clone->GetNbinsX(), bin+windowWidth);
434 Float_t average = clone->Integral(min, max) / (max - min + 1);
436 hist->SetBinContent(bin, average);
437 hist->SetBinError(bin, 0);
443 TCanvas* DrawRatioDeductSmooth(TH1* mcBase, TH1* resultBase, Int_t nResultSyst, TH1** mc, TH1** result, TString epsName)
445 // draws the ratios of each mc to the corresponding result
446 // deducts from each ratio the ratio of mcBase / resultBase
447 // smoothens the ratios by a sliding window
450 resultBase->Scale(1.0 / resultBase->Integral(2, 200));
451 mcBase->Scale(1.0 / mcBase->Integral(2, 200));
454 TH1* ratioBase = (TH1*) resultBase->Clone("ratioBase");
455 ratioBase->Divide(mcBase, ratioBase, 1, 1, "B");
457 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 400);
458 canvas->SetRightMargin(0.05);
459 canvas->SetTopMargin(0.05);
461 for (Int_t n=0; n<nResultSyst; ++n)
464 result[n]->Scale(1.0 / result[n]->Integral(2, 200));
465 mc[n]->Scale(1.0 / mc[n]->Integral(2, 200));
467 result[n]->GetXaxis()->SetRangeUser(0, 150);
468 result[n]->SetStats(kFALSE);
471 TH1* ratio = (TH1*) result[n]->Clone("ratio");
472 ratio->Divide(mc[n], ratio, 1, 1, "B");
473 ratio->Add(ratioBase, -1);
475 new TCanvas; ratio->DrawCopy();
477 ratio->SetLineColor(1);
478 ratio->DrawCopy("SAME");
481 ratio->SetTitle(";true multiplicity;Ratio_{syst} (t/u) - Ratio (t/u)");
482 ratio->GetYaxis()->SetRangeUser(-1, 1);
483 ratio->SetLineColor(n+1);
484 ratio->DrawCopy((n == 0) ? "HIST" : "SAME HIST");
486 // get average of ratio
488 for (Int_t i=2; i<=150; ++i)
489 sum += TMath::Abs(ratio->GetBinContent(i));
492 printf("%d) Average (2..150) of |ratio - ratioBase| is %f\n", n, sum);
495 TLine* line = new TLine(0, 0, 150, 0);
496 line->SetLineWidth(2);
499 line = new TLine(0, 0.1, 150, 0.1);
500 line->SetLineWidth(2);
501 line->SetLineStyle(2);
503 line = new TLine(0, -0.1, 150, -0.1);
504 line->SetLineWidth(2);
505 line->SetLineStyle(2);
510 canvas->SaveAs(epsName);
511 canvas->SaveAs(Form("%s.gif", epsName.Data()));
516 void DrawResiduals(TH1* measured, TH1* unfoldedFolded, const char* epsName)
519 unfoldedFolded->Scale(1.0 / unfoldedFolded->Integral(2, 200));
520 unfoldedFolded->Scale(measured->Integral(2, 200));
522 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 600);
523 canvas->Range(0, 0, 1, 1);
525 TPad* pad1 = new TPad(Form("%s_pad1", epsName), "", 0, 0.5, 0.98, 0.98);
530 TPad* pad2 = new TPad(Form("%s_pad2", epsName), "", 0, 0.02, 0.98, 0.5);
535 TPad* pad3 = new TPad(Form("%s_pad3", epsName), "", 0.15, 0.5, 0.35, 0.75);
538 pad3->SetRightMargin(0.05);
539 pad3->SetTopMargin(0.05);
542 pad1->SetRightMargin(0.05);
543 pad2->SetRightMargin(0.05);
545 // no border between them
546 pad1->SetBottomMargin(0);
547 pad2->SetTopMargin(0);
551 measured->GetXaxis()->SetLabelSize(0.06);
552 measured->GetYaxis()->SetLabelSize(0.06);
553 measured->GetXaxis()->SetTitleSize(0.06);
554 measured->GetYaxis()->SetTitleSize(0.06);
555 measured->GetYaxis()->SetTitleOffset(0.6);
557 measured->GetXaxis()->SetRangeUser(0, 150);
559 measured->SetTitle(";measured multiplicity;Entries");
560 measured->SetStats(kFALSE);
562 measured->DrawCopy("HIST");
565 unfoldedFolded->SetMarkerStyle(5);
566 unfoldedFolded->SetMarkerColor(2);
567 unfoldedFolded->SetLineColor(0);
568 unfoldedFolded->DrawCopy("SAME P");
570 TLegend* legend = new TLegend(0.6, 0.65, 0.95, 0.9);
571 legend->AddEntry(measured, "measured distribution");
572 legend->AddEntry(unfoldedFolded, "R #otimes unfolded distribution");
573 legend->SetFillColor(0);
577 pad2->SetBottomMargin(0.15);
581 TH1* residual = (TH1*) measured->Clone("residual");
582 unfoldedFolded->Sumw2();
584 residual->Add(unfoldedFolded, -1);
587 TH1* residualHist = new TH1F("residualHist", ";", 15, -3, 3);
589 for (Int_t i=1; i<=residual->GetNbinsX(); ++i)
591 if (measured->GetBinError(i) > 0)
593 residual->SetBinContent(i, residual->GetBinContent(i) / measured->GetBinError(i));
594 residual->SetBinError(i, 1);
596 residualHist->Fill(residual->GetBinContent(i));
600 residual->SetBinContent(i, 0);
601 residual->SetBinError(i, 0);
605 residual->GetYaxis()->SetTitle("Residuals 1/e (M - R #otimes U)");
606 residual->GetYaxis()->SetRangeUser(-4.5, 4.5);
607 residual->DrawCopy();
609 TLine* line = new TLine(-0.5, 0, 150.5, 0);
610 line->SetLineWidth(2);
614 residualHist->SetStats(kFALSE);
615 residualHist->GetXaxis()->SetLabelSize(0.08);
616 residualHist->Fit("gaus");
617 residualHist->Draw();
620 canvas->SaveAs(canvas->GetName());
622 //const char* epsName2 = "proj.eps";
623 //TCanvas* canvas = new TCanvas(epsName2, epsName2, 800, 600);
624 //canvas->SetGridx();
625 //canvas->SetGridy();
627 //canvas->SaveAs(canvas->GetName());
630 void bayesianExample()
635 gSystem->Load("libPWG0base");
637 TFile::Open(correctionFile);
638 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
639 mult->LoadHistograms("Multiplicity");
641 TFile::Open(measuredFile);
642 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
643 mult2->LoadHistograms("Multiplicity");
645 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
647 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100);
649 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
650 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
652 //mult->DrawComparison("bayesianExample", etaRange, kFALSE, kTRUE, mcHist, kTRUE);
653 DrawResultRatio(mcHist, result, "bayesianExample.eps");
655 // draw residual plot
657 // TODO take out efficiency correction if other than AliMultiplicityCorrection::kTrVtx
658 TH2* convoluted = mult->CalculateMultiplicityESD(result, etaRange);
659 TH1* convolutedProj = convoluted->ProjectionY("convolutedProj", -1, -1, "e");
661 TH1* measured = mult2->GetMultiplicityESD(etaRange)->ProjectionY("measured");
663 DrawResiduals(measured, convolutedProj, "bayesianResiduals.eps");
669 void chi2FluctuationResult()
671 gSystem->Load("libPWG0base");
673 TFile::Open(correctionFile);
674 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
675 mult->LoadHistograms("Multiplicity");
677 TFile::Open(measuredFile);
678 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
679 mult2->LoadHistograms("Multiplicity");
681 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
682 mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0);
683 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
685 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
686 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
688 mult->DrawComparison("MinuitChi2", etaRange, kFALSE, kTRUE, mcHist, kTRUE);
690 TCanvas* canvas = (TCanvas*) gROOT->FindObject("MinuitChi2_DrawComparison_3");
691 canvas->SaveAs("chi2FluctuationResult.eps");
699 gSystem->Load("libPWG0base");
701 TFile::Open(correctionFile);
702 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
703 mult->LoadHistograms("Multiplicity");
705 TFile::Open(measuredFile);
706 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
707 mult2->LoadHistograms("Multiplicity");
709 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
710 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
711 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
713 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
714 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
716 DrawResultRatio(mcHist, result, "chi2Example.eps");
722 void chi2ExampleTPC()
727 gSystem->Load("libPWG0base");
729 TFile::Open(correctionFileTPC);
730 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
731 mult->LoadHistograms("Multiplicity");
733 TFile::Open(measuredFileTPC);
734 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
735 mult2->LoadHistograms("Multiplicity");
737 mult->SetMultiplicityESD(etaRangeTPC, mult2->GetMultiplicityESD(etaRangeTPC));
738 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
739 mult->ApplyMinuitFit(etaRangeTPC, kFALSE, AliMultiplicityCorrection::kTrVtx);
741 TH1* mcHist = mult2->GetMultiplicityVtx(etaRangeTPC)->ProjectionY("mymc");
742 TH1* result = mult->GetMultiplicityESDCorrected(etaRangeTPC);
744 DrawResultRatio(mcHist, result, "chi2ExampleTPC.eps");
752 gSystem->Load("libPWG0base");
753 TFile::Open("multiplicityMC_3M.root");
755 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
756 mult->LoadHistograms("Multiplicity");
758 TFile::Open("multiplicityMC_3M_NBD.root");
759 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
760 mult2->LoadHistograms("Multiplicity");
762 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
763 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1.0, 100);
765 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
768 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
770 //mult->DrawComparison("bayesianNBD", etaRange, kFALSE, kTRUE, mcHist);
771 DrawResultRatio(mcHist, result, "bayesianNBD.eps");
774 void minimizationNBD()
776 gSystem->Load("libPWG0base");
777 TFile::Open("multiplicityMC_3M.root");
779 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
780 mult->LoadHistograms("Multiplicity");
782 TFile::Open("multiplicityMC_3M_NBD.root");
783 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
784 mult2->LoadHistograms("Multiplicity");
786 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
787 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
788 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
790 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
793 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
795 //mult->DrawComparison("minimizationNBD", etaRange, kFALSE, kTRUE, mcHist);
796 DrawResultRatio(mcHist, result, "minimizationNBD.eps");
799 void minimizationInfluenceAlpha()
801 gSystem->Load("libPWG0base");
803 TFile::Open(measuredFile);
804 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
805 mult2->LoadHistograms("Multiplicity");
807 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
808 mcHist->Scale(1.0 / mcHist->Integral());
809 mcHist->GetXaxis()->SetRangeUser(0, 200);
810 mcHist->SetStats(kFALSE);
811 mcHist->SetTitle(";true multiplicity;P_{N}");
813 TCanvas* canvas = new TCanvas("minimizationInfluenceAlpha", "minimizationInfluenceAlpha", 1000, 300);
814 canvas->Divide(3, 1);
816 TFile::Open("eval-2M-1M/EvaluateChi2MethodDetail.root");
818 TH1* hist1 = gFile->Get("MinuitChi2_00_2_100.000000");
819 TH1* hist2 = gFile->Get("MinuitChi2_03_2_100000.000000");
820 TH1* hist3 = gFile->Get("MinuitChi2_06_2_100000000.000000");
822 mcHist->Rebin(2); mcHist->Scale(0.5);
823 hist1->Rebin(2); hist1->Scale(0.5);
824 hist2->Rebin(2); hist2->Scale(0.5);
825 hist3->Rebin(2); hist3->Scale(0.5);
827 mcHist->GetXaxis()->SetRangeUser(0, 200);
832 hist1->SetMarkerStyle(5);
833 hist1->SetMarkerColor(2);
834 hist1->Draw("SAME PE");
839 hist2->SetMarkerStyle(5);
840 hist2->SetMarkerColor(2);
841 hist2->Draw("SAME PE");
846 hist3->SetMarkerStyle(5);
847 hist3->SetMarkerColor(2);
848 hist3->Draw("SAME PE");
850 canvas->SaveAs("minimizationInfluenceAlpha.eps");
855 gSystem->Load("libPWG0base");
857 TFile::Open(correctionFile);
858 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
859 mult->LoadHistograms("Multiplicity");
861 TH1* fCurrentESD = mult->GetMultiplicityVtx(etaRange)->ProjectionY();
862 fCurrentESD->Sumw2();
863 fCurrentESD->Scale(1.0 / fCurrentESD->Integral());
865 TF1* func = new TF1("nbd", "[0] * TMath::Binomial([2]+TMath::Nint(x)-1, [2]-1) * pow([1] / ([1]+[2]), TMath::Nint(x)) * pow(1 + [1]/[2], -[2])");
866 func->SetParNames("scaling", "averagen", "k");
867 func->SetParLimits(0, 0.001, fCurrentESD->GetMaximum() * 1000);
868 func->SetParLimits(1, 0.001, 1000);
869 func->SetParLimits(2, 0.001, 1000);
870 func->SetParameters(fCurrentESD->GetMaximum() * 100, 10, 2);
872 TF1* lognormal = new TF1("lognormal", "[0]*exp(-(log(x)-[1])^2/(2*[2]^2))/(x*[2]*TMath::Sqrt(2*TMath::Pi()))", 0.01, 500);
873 lognormal->SetParNames("scaling", "mean", "sigma");
874 lognormal->SetParameters(1, 1, 1);
875 lognormal->SetParLimits(0, 0, 10);
876 lognormal->SetParLimits(1, 0, 100);
877 lognormal->SetParLimits(2, 1e-3, 10);
879 TCanvas* canvas = new TCanvas("c1", "c1", 700, 400);
880 fCurrentESD->SetStats(kFALSE);
881 fCurrentESD->GetYaxis()->SetTitleOffset(1.3);
882 fCurrentESD->SetTitle(";true multiplicity (N);P_{N}");
883 fCurrentESD->Draw("HIST");
884 fCurrentESD->GetXaxis()->SetRangeUser(0, 200);
885 fCurrentESD->Fit(func, "W0", "", 0, 50);
886 func->SetRange(0, 100);
888 printf("chi2 = %f\n", func->GetChisquare());
890 fCurrentESD->Fit(lognormal, "W0", "", 0.01, 100);
891 lognormal->SetLineColor(2);
892 lognormal->SetLineStyle(2);
893 lognormal->SetRange(0, 100);
894 lognormal->Draw("SAME");
896 canvas->SaveAs("NBDFit.eps");
899 void DifferentSamples()
901 // data generated by runMultiplicitySelector.C DifferentSamples
903 const char* name = "DifferentSamples";
905 TFile* file = TFile::Open(Form("%s.root", name));
907 TCanvas* canvas = new TCanvas(name, name, 800, 600);
908 canvas->Divide(2, 2);
910 for (Int_t i=0; i<4; ++i)
913 gPad->SetTopMargin(0.05);
914 gPad->SetRightMargin(0.05);
915 TH1* chi2Result = (TH1*) file->Get(Form("chi2Result_%d", i));
916 TH1* bayesResult = (TH1*) file->Get(Form("bayesResult_%d", i));
917 TH1* mc = (TH1*) file->Get(Form("mc_%d", i));
920 chi2Result->Divide(chi2Result, mc, 1, 1, "");
921 bayesResult->Divide(bayesResult, mc, 1, 1, "");
923 chi2Result->SetTitle(";true multiplicity;unfolded measured/MC");
924 chi2Result->GetXaxis()->SetRangeUser(0, 150);
925 chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
926 chi2Result->GetYaxis()->SetTitleOffset(1.2);
927 chi2Result->SetLineColor(1);
928 chi2Result->SetStats(kFALSE);
930 bayesResult->SetStats(kFALSE);
931 bayesResult->SetLineColor(2);
933 chi2Result->DrawCopy("HIST");
934 bayesResult->DrawCopy("SAME HIST");
936 TLine* line = new TLine(0, 1, 150, 1);
940 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
943 void StartingConditions()
945 // data generated by runMultiplicitySelector.C StartingConditions
947 const char* name = "StartingConditions";
949 TFile* file = TFile::Open(Form("%s.root", name));
951 TCanvas* canvas = new TCanvas(name, name, 800, 400);
952 canvas->Divide(2, 1);
954 TH1* mc = (TH1*) file->Get("mc");
956 mc->Scale(1.0 / mc->Integral());
958 Int_t marker[] = {24, 25, 26, 27, 28, 2, 3, 4, 5};
960 for (Int_t i=0; i<6; ++i)
966 TH1* chi2Result = (TH1*) file->Get(Form("chi2Result_%d", id));
967 TH1* bayesResult = (TH1*) file->Get(Form("bayesResult_%d", id));
969 chi2Result->Divide(chi2Result, mc, 1, 1, "");
970 bayesResult->Divide(bayesResult, mc, 1, 1, "");
972 chi2Result->SetTitle("a) #chi^{2} minimization;true multiplicity;unfolded / MC");
973 chi2Result->GetXaxis()->SetRangeUser(0, 150);
974 chi2Result->GetYaxis()->SetRangeUser(0.8, 1.2);
975 chi2Result->GetYaxis()->SetTitleOffset(1.5);
976 //chi2Result->SetMarkerStyle(marker[i]);
977 chi2Result->SetLineColor(i+1);
978 chi2Result->SetStats(kFALSE);
980 bayesResult->SetTitle("b) Bayesian method;true multiplicity;unfolded / MC");
981 bayesResult->GetXaxis()->SetRangeUser(0, 150);
982 bayesResult->GetYaxis()->SetRangeUser(0.8, 1.2);
983 bayesResult->GetYaxis()->SetTitleOffset(1.5);
984 bayesResult->SetStats(kFALSE);
985 bayesResult->SetLineColor(2);
986 bayesResult->SetLineColor(i+1);
989 gPad->SetLeftMargin(0.12);
990 chi2Result->DrawCopy((i == 0) ? "HIST" : "HIST SAME");
993 gPad->SetLeftMargin(0.12);
994 bayesResult->DrawCopy((i == 0) ? "HIST" : "HIST SAME");
996 //TLine* line = new TLine(0, 1, 150, 1);
1000 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1003 void StatisticsPlot()
1005 const char* name = "StatisticsPlot";
1007 TFile* file = TFile::Open(Form("%s.root", name));
1009 TCanvas* canvas = new TCanvas(name, name, 600, 400);
1011 TGraph* fitResultsChi2 = file->Get("fitResultsChi2");
1012 fitResultsChi2->SetTitle(";number of measured events;P_{1}");
1013 fitResultsChi2->GetYaxis()->SetRangeUser(0, 2);
1014 fitResultsChi2->Draw("AP");
1016 TF1* f = new TF1("f", "[0]/x", 1, 1e4);
1017 fitResultsChi2->Fit(f);
1019 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1024 const char* plotname = "chi2Result";
1026 const char* name = "StatisticsPlotRatios";
1028 TCanvas* canvas = new TCanvas(name, name, 600, 400);
1030 for (Int_t i=0; i<5; ++i)
1032 mc[i] = (TH1*) file->Get(Form("mc_%d", i));
1033 result[i] = (TH1*) file->Get(Form("%s_%d", plotname, i));
1035 result[i]->SetLineColor(i+1);
1036 result[i]->Draw(((i == 0) ? "" : "SAME"));
1040 void SystematicLowEfficiency()
1042 gSystem->Load("libPWG0base");
1044 TFile::Open(correctionFile);
1045 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1046 mult->LoadHistograms("Multiplicity");
1048 // calculate result with systematic effect
1049 TFile::Open("multiplicityMC_100k_1_loweff.root");
1050 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1051 mult2->LoadHistograms("Multiplicity");
1053 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1054 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1055 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
1057 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
1058 TH1* result1 = mult->GetMultiplicityESDCorrected(etaRange)->Clone("result1");
1060 DrawResultRatio(mcHist, result1, "SystematicLowEfficiencyLow.eps");
1062 // calculate normal result
1063 TFile::Open("multiplicityMC_100k_1.root");
1064 mult2->LoadHistograms("Multiplicity");
1066 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1067 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
1069 TH1* result2 = mult->GetMultiplicityESDCorrected(etaRange)->Clone("result2");
1071 DrawResultRatio(mcHist, result2, "SystematicLowEfficiencyOK.eps");
1073 Draw2ResultRatio(mcHist, result1, result2, "SystematicLowEfficiency.eps");
1076 void SystematicMisalignment()
1078 gSystem->Load("libPWG0base");
1080 TFile::Open(correctionFile);
1081 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1082 mult->LoadHistograms("Multiplicity");
1084 TFile::Open("multiplicityMC_100k_fullmis.root");
1085 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1086 mult2->LoadHistograms("Multiplicity");
1088 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1089 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1090 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
1092 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
1093 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
1095 DrawResultRatio(mcHist, result, "SystematicMisalignment.eps");
1098 void EfficiencySpecies(const char* fileName = "multiplicityMC_400k_syst.root")
1100 gSystem->Load("libPWG0base");
1102 TFile::Open(fileName);
1103 AliCorrection* correction[4];
1105 TCanvas* canvas = new TCanvas("EfficiencySpeciesSPD", "EfficiencySpeciesSPD", 600, 400);
1108 canvas->SetRightMargin(0.05);
1109 canvas->SetTopMargin(0.05);
1111 TLegend* legend = new TLegend(0.7, 0.4, 0.85, 0.6);
1112 legend->SetFillColor(0);
1114 Int_t marker[] = {24, 25, 26};
1115 Int_t color[] = {1, 2, 4};
1120 for (Int_t i=0; i<3; ++i)
1122 Printf("correction %d", i);
1124 TString name; name.Form("correction_%d", i);
1125 correction[i] = new AliCorrection(name, name);
1126 correction[i]->LoadHistograms();
1128 TH3* gene = correction[i]->GetTrackCorrection()->GetGeneratedHistogram();
1129 TH3* meas = correction[i]->GetTrackCorrection()->GetMeasuredHistogram();
1132 gene->GetXaxis()->SetRangeUser(-3.9, 3.9);
1133 meas->GetXaxis()->SetRangeUser(-3.9, 3.9);
1135 // empty over/underflow bin in eta, setting range to +-2 is not enough because this is the maximum range, Project3D takes them into account then (might be a bug)
1136 /*for (Int_t x = 1; x <= gene->GetNbinsX(); x++)
1137 for (Int_t z = 1; z <= gene->GetNbinsZ(); z++)
1139 gene->SetBinContent(x, 0, z, 0);
1140 gene->SetBinContent(x, gene->GetNbinsY()+1, z, 0);
1141 meas->SetBinContent(x, 0, z, 0);
1142 meas->SetBinContent(x, gene->GetNbinsY()+1, z, 0);
1146 gene->GetYaxis()->SetRangeUser(-0.49, 0.49);
1147 meas->GetYaxis()->SetRangeUser(-0.49, 0.49);
1149 TH1* genePt = gene->Project3D(Form("z_%d", i));
1150 TH1* measPt = meas->Project3D(Form("z_%d", i));
1155 effPt = (TH1*) genePt->Clone(Form("effPt_%d", i));
1157 effPt->Divide(measPt, genePt, 1, 1, "B");
1160 for (bin=20; bin>=1; bin--)
1162 if (effPt->GetBinContent(bin) < 0.5)
1166 Printf("Eff. below 50%% at bin %d, i.e. %.3f GeV/c", bin, effPt->GetXaxis()->GetBinUpEdge(bin));
1168 Float_t fraction = genePt->Integral(1, bin) / genePt->Integral();
1169 Printf("%.4f of the particles are below that momentum", fraction);
1171 below += genePt->Integral(1, bin);
1172 total += genePt->Integral();
1174 effPt->SetLineColor(color[i]);
1175 effPt->SetMarkerColor(color[i]);
1176 effPt->SetMarkerStyle(marker[i]);
1178 effPt->GetXaxis()->SetRangeUser(0, 1);
1179 effPt->GetYaxis()->SetRangeUser(0, 1);
1181 effPt->SetStats(kFALSE);
1182 effPt->SetTitle("");
1183 effPt->GetYaxis()->SetTitle("Efficiency");
1185 effPt->DrawCopy((i == 0) ? "" : "SAME");
1187 legend->AddEntry(effPt, ((i == 0) ? "#pi" : ((i == 1) ? "K" : "p")));
1190 Printf("In total %.4f of the particles are below their pt cut off", (Float_t) below / total);
1194 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1197 void ParticleSpeciesComparison1()
1199 gSystem->Load("libPWG0base");
1201 const char* fileNameMC = "multiplicityMC_400k_syst_species.root";
1202 const char* fileNameESD = "multiplicityMC_100k_syst.root";
1205 TFile::Open(fileNameESD);
1206 TH2F* hist = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityESD%d", etaRange));
1207 TH2F* hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityVtx%d", etaRange));
1211 // loop over cases (normal, enhanced/reduced ratios)
1213 for (Int_t i = 0; i<nMax; ++i)
1216 folder.Form("Multiplicity_%d", i);
1218 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection(folder, folder);
1220 TFile::Open(fileNameMC);
1221 mult->LoadHistograms();
1223 mult->SetMultiplicityESD(etaRange, hist);
1227 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 1e4);
1228 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kFALSE);
1229 //mult->DrawComparison(Form("ParticleSpeciesComparison_MinuitChi2_%d", i), etaRange, kFALSE, kTRUE, hist2->ProjectionY("mymchist"));
1233 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100);
1234 //mult->DrawComparison(Form("ParticleSpeciesComparison_Bayesian_%d", i), etaRange, kFALSE, kTRUE, hist2->ProjectionY("mymchist2"));
1237 //Float_t averageRatio = 0;
1238 //mult->GetComparisonResults(0, 0, 0, &averageRatio);
1240 results[i] = (TH1*) mult->GetMultiplicityESDCorrected(etaRange)->Clone(Form("result_%d", i));
1242 //Printf("Case %d. Average ratio is %f", i, averageRatio);
1245 DrawResultRatio(hist2->ProjectionY("mymchist", -1, -1, "e"), results[0], "ParticleSpeciesComparison1_1.eps");
1247 TH1* mc = hist2->ProjectionY("mymchist2", -1, -1, "e");
1249 for (Int_t i=1; i<=results[0]->GetNbinsX(); i++)
1251 results[0]->SetBinError(i, 0);
1252 mc->SetBinError(i, 0);
1255 TCanvas* canvas = DrawRatio(results[0], nMax-1, results+1, "ParticleSpeciesComparison1_2.eps");
1257 TFile::Open("bayesianUncertainty_400k_100k_syst.root");
1258 TH1* errorHist = (TH1*) gFile->Get("errorBoth");
1259 errorHist->SetLineColor(1);
1260 errorHist->SetLineWidth(2);
1261 TH1* errorHist2 = (TH1*) errorHist->Clone("errorHist2");
1262 for (Int_t i=1; i<=errorHist->GetNbinsX(); i++)
1264 errorHist->SetBinContent(i, errorHist->GetBinContent(i) + 1);
1265 errorHist2->SetBinContent(i, 1 - errorHist2->GetBinContent(i));
1268 errorHist->DrawCopy("SAME");
1269 errorHist2->DrawCopy("SAME");
1271 canvas->SaveAs(canvas->GetName());
1273 TCanvas* canvas2 = DrawRatio(mc, nMax, results, "ParticleSpeciesComparison1_3.eps", kTRUE);
1275 errorHist->DrawCopy("SAME");
1276 errorHist2->DrawCopy("SAME");
1278 canvas2->SaveAs(canvas2->GetName());
1281 void ParticleSpeciesComparison2()
1283 gSystem->Load("libPWG0base");
1285 const char* fileNameMC = "multiplicityMC_400k_syst.root";
1286 const char* fileNameESD = "out.root"; // based on multiplicityMC_100k_syst.root
1289 TFile::Open(fileNameMC);
1290 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1291 mult->LoadHistograms();
1296 // loop over cases (normal, enhanced/reduced ratios)
1298 for (Int_t i = 0; i<nMax; ++i)
1301 folder.Form("Multiplicity_%d", i);
1303 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection(folder, folder);
1305 TFile::Open(fileNameESD);
1306 mult2->LoadHistograms();
1308 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1312 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 1e4);
1313 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kFALSE);
1314 //mult->DrawComparison(Form("ParticleSpeciesComparison_MinuitChi2_%d", i), etaRange, kFALSE, kTRUE, hist2->ProjectionY("mymchist"));
1318 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100);
1319 //mult->DrawComparison(Form("ParticleSpeciesComparison_Bayesian_%d", i), etaRange, kFALSE, kTRUE, hist2->ProjectionY("mymchist2"));
1322 //Float_t averageRatio = 0;
1323 //mult->GetComparisonResults(0, 0, 0, &averageRatio);
1325 results[i] = (TH1*) mult->GetMultiplicityESDCorrected(etaRange)->Clone(Form("result_%d", i));
1327 TH2F* hist2 = mult2->GetMultiplicityVtx(etaRange);
1328 mc[i] = (TH1*) hist2->ProjectionY(Form("mymchist_%d", i), -1, -1, "e");
1330 //TString fileName; fileName.Form("ParticleSpeciesComparison2_%d.eps", i);
1331 //DrawResultRatio(hist2->ProjectionY("mymchist", -1, -1, "e"), results[i], fileName);
1333 //Printf("Case %d. Average ratio is %f", i, averageRatio);
1336 DrawRatio(nMax, mc, results, "ParticleSpeciesComparison2.eps");
1339 TH1* Invert(TH1* eff)
1341 // calculate corr = 1 / eff
1343 TH1* corr = (TH1*) eff->Clone(Form("%s_invert", eff->GetName()));
1346 for (Int_t i=1; i<=eff->GetNbinsX(); i++)
1348 if (eff->GetBinContent(i) > 0)
1350 corr->SetBinContent(i, 1.0 / eff->GetBinContent(i));
1351 corr->SetBinError(i, eff->GetBinError(i) / eff->GetBinContent(i) * corr->GetBinContent(i));
1358 void TriggerVertexCorrection()
1361 // plots the correction performed on the unfolded spectrum to gain the spectrum for the full inelastic sample
1364 gSystem->Load("libPWG0base");
1366 TFile::Open(correctionFile);
1367 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1368 mult->LoadHistograms("Multiplicity");
1370 TH1* corrINEL = Invert(mult->GetEfficiency(etaRange, AliMultiplicityCorrection::kINEL));
1371 TH1* corrMB = Invert(mult->GetEfficiency(etaRange, AliMultiplicityCorrection::kMB));
1373 TCanvas* canvas = new TCanvas("TriggerVertexCorrection", "TriggerVertexCorrection", 800, 600);
1375 corrINEL->SetStats(kFALSE);
1376 corrINEL->GetXaxis()->SetRangeUser(0, 30);
1377 corrINEL->GetYaxis()->SetRangeUser(0, 5);
1378 corrINEL->SetTitle(";true multiplicity;correction factor");
1379 corrINEL->SetMarkerStyle(22);
1380 corrINEL->Draw("PE");
1382 corrMB->SetStats(kFALSE);
1383 corrMB->SetLineColor(2);
1384 corrMB->SetMarkerStyle(25);
1385 corrMB->SetMarkerColor(2);
1386 corrMB->Draw("SAME PE");
1388 TLegend* legend = new TLegend(0.3, 0.5, 0.85, 0.65);
1389 legend->SetFillColor(0);
1390 legend->AddEntry(corrINEL, "correction to inelastic sample");
1391 legend->AddEntry(corrMB, "correction to minimum bias sample");
1395 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1398 void bayesianUncertainty(Bool_t mc = kFALSE)
1400 gSystem->Load("libPWG0base");
1402 TFile::Open(correctionFile);
1403 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1404 mult->LoadHistograms("Multiplicity");
1406 TFile::Open(measuredFile);
1407 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1408 mult2->LoadHistograms("Multiplicity");
1410 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1412 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
1414 TH1* errorResponse = mult->BayesianStatisticsEffect(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kFALSE, kTRUE, 1, 100, ((mc) ? mcHist : 0))->Clone("errorResponse");
1415 TH1* errorMeasured = mult->BayesianStatisticsEffect(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kTRUE, kFALSE, 1, 100, ((mc) ? mcHist : 0))->Clone("errorMeasured");
1416 TH1* errorBoth = mult->BayesianStatisticsEffect(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kTRUE, kTRUE, 1, 100, ((mc) ? mcHist : 0))->Clone("errorBoth");
1420 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
1421 DrawResultRatio(mcHist, result, "bayesianUncertainty2.eps");
1424 TCanvas* canvas = new TCanvas("bayesianUncertainty", "bayesianUncertainty", 600, 400);
1427 canvas->SetRightMargin(0.05);
1428 canvas->SetTopMargin(0.05);
1430 errorResponse->SetLineColor(1);
1431 errorResponse->GetXaxis()->SetRangeUser(0, 200);
1432 errorResponse->GetYaxis()->SetRangeUser(0, 0.3);
1433 errorResponse->SetStats(kFALSE);
1434 errorResponse->SetTitle(";true multiplicity;Uncertainty");
1436 errorResponse->Draw();
1438 errorMeasured->SetLineColor(2);
1439 errorMeasured->Draw("SAME");
1441 errorBoth->SetLineColor(3);
1442 errorBoth->Draw("SAME");
1444 Printf("Average errorResponse: %f", errorResponse->Integral(2, 150) / 149);
1445 Printf("Average errorMeasured: %f", errorMeasured->Integral(2, 150) / 149);
1446 Printf("Average errorBoth: %f", errorBoth->Integral(2, 150) / 149);
1448 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1450 TFile* file = new TFile(Form("%s.root", canvas->GetName()), "RECREATE");
1451 errorResponse->Write();
1452 errorMeasured->Write();
1457 void EfficiencyComparison(Int_t eventType = 2)
1459 const char* files[] = { "multiplicityMC_400k_syst_nd.root", "multiplicityMC_400k_syst_sd.root", "multiplicityMC_400k_syst_dd.root", "multiplicityMC_400k_syst_xsection.root" };
1461 gSystem->Load("libPWG0base");
1463 TCanvas* canvas = new TCanvas("EfficiencyComparison", "EfficiencyComparison", 800, 500);
1466 canvas->SetRightMargin(0.05);
1467 canvas->SetTopMargin(0.05);
1469 AliMultiplicityCorrection* data[4];
1472 Int_t markers[] = { 24, 25, 26, 5 };
1473 Int_t colors[] = { 1, 2, 3, 4 };
1475 TLegend* legend = new TLegend(0.45, 0.45, 0.9, 0.7);
1476 legend->SetFillColor(0);
1480 for (Int_t i=0; i<4; ++i)
1483 name.Form("Multiplicity_%d", i);
1485 TFile::Open(files[i]);
1486 data[i] = new AliMultiplicityCorrection(name, name);
1490 data[i]->LoadHistograms("Multiplicity");
1493 data[i]->LoadHistograms("Multiplicity_0");
1495 TH1* eff = (TH1*) data[i]->GetEfficiency(3, eventType)->Clone(Form("eff_%d", i));
1498 eff->GetXaxis()->SetRangeUser(0, 15);
1499 eff->GetYaxis()->SetRangeUser(0, 1.1);
1500 eff->SetStats(kFALSE);
1501 eff->SetTitle(";true multiplicity;Efficiency");
1502 eff->SetLineColor(colors[i]);
1503 eff->SetMarkerColor(colors[i]);
1504 eff->SetMarkerStyle(markers[i]);
1508 for (Int_t bin=1; bin<=eff->GetNbinsX(); bin++)
1509 eff->SetBinError(bin, 0);
1511 // loop over cross section combinations
1512 for (Int_t j=1; j<7; ++j)
1514 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multtmp", "Multtmp");
1515 mult->LoadHistograms(Form("Multiplicity_%d", j));
1517 TH1* eff2 = mult->GetEfficiency(3, eventType);
1519 for (Int_t bin=1; bin<=eff->GetNbinsX(); bin++)
1521 // TODO we could also do assymetric errors here
1522 Float_t deviation = 10.0 * TMath::Abs(eff->GetBinContent(bin) - eff2->GetBinContent(bin));
1524 eff->SetBinError(bin, TMath::Max(eff->GetBinError(bin), deviation));
1528 for (Int_t bin=1; bin<=20; bin++)
1529 if (eff->GetBinContent(bin) > 0)
1530 Printf("Bin %d: Error: %.2f", bin, 100.0 * eff->GetBinError(bin) / eff->GetBinContent(bin));
1532 effError = (TH1*) eff2->Clone("effError");
1535 for (Int_t bin=2; bin<=eff->GetNbinsX(); bin++)
1536 if (eff->GetBinContent(bin) > 0)
1537 effError->SetBinContent(bin, eff->GetBinError(bin) / eff->GetBinContent(bin));
1539 effError->DrawCopy("SAME HIST");
1542 eff->SetBinContent(1, 0);
1543 eff->SetBinError(1, 0);
1551 eff->DrawCopy("SAME P");
1553 legend->AddEntry(eff, (((i == 0) ? "non diffractive" : ((i == 1) ? "single diffractive" : ((i == 2) ? "double diffractive" : "Pythia combined")))));
1556 legend->AddEntry(effError, "relative syst. uncertainty #times 10");
1560 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1563 void ModelDependencyPlot()
1565 gSystem->Load("libPWG0base");
1567 TFile::Open("multiplicityMC_3M.root");
1568 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1569 mult->LoadHistograms("Multiplicity");
1571 TH2* proj = (TH2*) mult->GetCorrelation(3)->Project3D("zy");
1573 TCanvas* canvas = new TCanvas("ModelDependencyPlot", "ModelDependencyPlot", 800, 400);
1576 //canvas->SetRightMargin(0.05);
1577 //canvas->SetTopMargin(0.05);
1579 canvas->Divide(2, 1);
1584 Int_t selectedMult = 30;
1585 Int_t yMax = 200000;
1587 TH1* full = proj->ProjectionX("full");
1588 TH1* selected = proj->ProjectionY("selected", proj->GetXaxis()->FindBin(selectedMult), proj->GetXaxis()->FindBin(selectedMult));
1590 full->SetStats(kFALSE);
1591 full->GetXaxis()->SetRangeUser(0, 200);
1592 full->GetYaxis()->SetRangeUser(5, yMax);
1593 full->SetTitle(";multiplicity");
1595 selected->SetLineColor(0);
1596 selected->SetMarkerColor(2);
1597 selected->SetMarkerStyle(7);
1600 selected->Draw("SAME P");
1602 TLegend* legend = new TLegend(0.5, 0.65, 0.85, 0.85);
1603 legend->SetFillColor(0);
1604 legend->AddEntry(full, "true");
1605 legend->AddEntry(selected, "measured");
1608 TLine* line = new TLine(selectedMult, 5, selectedMult, yMax);
1609 line->SetLineWidth(2);
1615 TH1* full = proj->ProjectionY("full2");
1616 TH1* selected = proj->ProjectionX("selected2", proj->GetYaxis()->FindBin(selectedMult), proj->GetYaxis()->FindBin(selectedMult));
1618 full->SetStats(kFALSE);
1619 full->GetXaxis()->SetRangeUser(0, 200);
1620 full->GetYaxis()->SetRangeUser(5, yMax);
1621 full->SetTitle(";multiplicity");
1623 full->SetLineColor(0);
1624 full->SetMarkerColor(2);
1625 full->SetMarkerStyle(7);
1628 selected->Draw("SAME");
1632 TLine* line = new TLine(selectedMult, 5, selectedMult, yMax);
1633 line->SetLineWidth(2);
1636 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1639 void SystematicpTSpectrum()
1641 gSystem->Load("libPWG0base");
1643 TFile::Open("multiplicityMC_400k_syst_ptspectrum.root");
1644 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1645 mult->LoadHistograms("Multiplicity");
1647 TFile::Open("multiplicityMC_100k_syst.root");
1648 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1649 mult2->LoadHistograms("Multiplicity");
1651 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1652 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1653 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
1655 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
1656 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
1658 DrawResultRatio(mcHist, result, "SystematicpTSpectrum.eps");
1662 /*void covMatrix(Bool_t mc = kTRUE)
1664 gSystem->Load("libPWG0base");
1666 TFile::Open(correctionFile);
1667 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1668 mult->LoadHistograms("Multiplicity");
1670 TFile::Open(measuredFile);
1671 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1672 mult2->LoadHistograms("Multiplicity");
1674 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1676 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
1678 mult->BayesianStatisticsEffect(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kTRUE, kTRUE, 1, 100, ((mc) ? mcHist : 0));
1681 Double_t FitPtFunc(Double_t *x, Double_t *par)
1685 Float_t val1 = par[1] + par[2] * xx + par[3] * xx * xx;
1686 Float_t val2 = TMath::Exp(par[4] + par[5] * xx);
1688 const Float_t kTransitionWidth = 0;
1691 if (xx < par[0] - kTransitionWidth)
1695 /*else if (xx < par[0] + kTransitionWidth)
1697 // smooth transition
1698 Float_t factor = (xx - par[0] + kTransitionWidth) / kTransitionWidth / 2;
1699 return (1 - factor) * val1 + factor * val2;
1707 void FitPt(const char* fileName = "firstplots100k_truept.root")
1709 gSystem->Load("libPWG0base");
1711 TFile::Open(fileName);
1714 // merge corrections
1715 AliCorrection* correction[4];
1718 for (Int_t i=0; i<4; ++i)
1720 Printf("correction %d", i);
1722 TString name; name.Form("correction_%d", i);
1723 correction[i] = new AliCorrection(name, name);
1724 correction[i]->LoadHistograms();
1727 list.Add(correction[i]);
1730 correction[0]->Merge(&list);
1732 TH3* gene = correction[0]->GetTrackCorrection()->GetGeneratedHistogram();
1734 // limit vtx, eta axis
1735 gene->GetXaxis()->SetRangeUser(-5.9, 5.9);
1736 gene->GetYaxis()->SetRangeUser(-1.99, 0.99);
1738 TH1* genePt = gene->Project3D("z");*/
1739 TH1* genePt = (TH1*) gFile->Get("fdNdpTTrue");
1742 //genePt->Scale(1.0 / genePt->Integral());
1744 // normalize by bin width
1745 for (Int_t x=1; x<genePt->GetNbinsX(); x++)
1746 genePt->SetBinContent(x, genePt->GetBinContent(x) / genePt->GetBinWidth(x));
1748 /// genePt->GetXaxis()->GetBinCenter(x));
1750 genePt->GetXaxis()->SetRangeUser(0, 7.9);
1751 genePt->GetYaxis()->SetTitle("a.u.");
1753 TF1* func = new TF1("func", "[0]*TMath::Exp([1]*x)+[2]/(1+(x*[4])**[3])", 0.001, 100);
1754 //func->SetLineColor(2);
1755 func->SetParameters(1, -1, 1, 1, 1);
1756 func->SetParLimits(3, 1, 10);
1757 func->SetParLimits(4, 0, 10);
1759 //TF1* func = new TF1("func", "[1]*x**[0]", 0.001, 100);
1761 //TF1* func = new TF1("func", &FitPtFunc, 0, 2, 6);
1762 //func->SetParameters(0.3, -2.34909e-01, 1.54394e+01, -3.04134e+01, 1.41912e+00, -2.79284e+00);
1763 //func->FixParameter(0, 0.314);
1764 //func->SetParLimits(0, 0.1, 0.3);
1766 genePt->SetMarkerStyle(25);
1767 genePt->SetTitle("");
1768 genePt->SetStats(kFALSE);
1769 genePt->GetYaxis()->SetRangeUser(1e-4, genePt->GetMaximum() * 1.2);
1770 //func->Draw("SAME");
1772 // fit only exp. part
1773 func->SetParameters(1, -1);
1774 func->FixParameter(2, 0);
1775 func->FixParameter(3, 1);
1776 func->FixParameter(4, 1);
1777 genePt->Fit(func, "0", "", 0.2, 1);
1780 genePt->DrawCopy("P");
1781 func->SetRange(0.02, 8);
1782 func->DrawCopy("SAME");
1785 // now fix exp. parameters and fit second part
1786 Double_t param0 = func->GetParameter(0);
1787 Double_t param1 = func->GetParameter(1);
1788 func->SetParameters(0, -1, 1, 1, 1);
1789 func->FixParameter(0, 0);
1790 func->FixParameter(1, -1);
1791 func->ReleaseParameter(2);
1792 func->ReleaseParameter(3);
1793 func->ReleaseParameter(4);
1794 func->SetParLimits(3, 1, 10);
1795 func->SetParLimits(4, 0, 10);
1797 genePt->Fit(func, "0", "", 1.5, 4);
1800 genePt->DrawCopy("P");
1801 func->SetRange(0.02, 8);
1802 func->DrawCopy("SAME");
1806 func->SetParameter(0, param0);
1807 func->SetParameter(1, param1);
1808 func->ReleaseParameter(0);
1809 func->ReleaseParameter(1);
1812 genePt->DrawCopy("P");
1813 func->SetRange(0.02, 8);
1814 func->DrawCopy("SAME");
1817 genePt->Fit(func, "0", "", 0.2, 4);
1819 TCanvas* canvas = new TCanvas("FitPt", "FitPt", 600, 400);
1822 canvas->SetRightMargin(0.05);
1823 canvas->SetTopMargin(0.05);
1825 genePt->DrawCopy("P");
1826 func->SetRange(0.02, 8);
1827 func->DrawCopy("SAME");
1830 TH1* first = (TH1*) func->GetHistogram()->Clone("first");
1832 TCanvas* canvas2 = new TCanvas("FitPt2", "FitPt2", 600, 400);
1834 TFile* file = TFile::Open("ptspectrum_fit.root", "RECREATE");
1836 for (Int_t param=0; param<5; param++)
1838 for (Int_t sign=0; sign<2; sign++)
1840 TF1* func2 = (TF1*) func->Clone(Form("func_%d_%d", param, sign)); // new TF1(Form("func_%d_%d", param, sign), &FitPtFunc, 0, 2, 6);
1841 func2->SetParameters(func->GetParameters());
1842 //TF1* func2 = (TF1*) func->Clone(); // SetParameter after this does not work
1844 Float_t factor = ((sign == 0) ? 0.9 : 1.1);
1845 func2->SetParameter(param, func2->GetParameter(param) * factor);
1849 func2->SetLineWidth(1);
1850 func2->SetLineColor(param + 2);
1851 func2->DrawCopy("SAME");
1854 TH1* second = func2->GetHistogram();
1855 second->Divide(first);
1856 second->SetLineColor(param + 1);
1857 second->GetYaxis()->SetRangeUser(0, 2);
1858 second->DrawCopy((param == 0 && sign == 0) ? "" : "SAME");
1859 second->Clone(Form("ptspectrum_%d_%d", param, sign))->Write();
1863 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1870 gSystem->Load("libPWG0base");
1872 TFile::Open("ptspectrum400.root");
1873 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1874 mult->LoadHistograms("Multiplicity");
1876 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1883 for (Int_t param=0; param<nParams; param++)
1885 for (Int_t sign=0; sign<2; sign++)
1887 // calculate result with systematic effect
1888 TFile* file = TFile::Open(Form("ptspectrum100_%d_%d.root", param, sign));
1889 mult2->LoadHistograms("Multiplicity");
1891 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1893 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100, 0);
1894 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1895 //mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
1897 Int_t id = param * 2 + sign;
1899 mcHist[id] = mult2->GetMultiplicityVtx(etaRange)->ProjectionY(Form("mymc_%d_%d.root", param, sign));
1900 result[id] = (TH1*) mult->GetMultiplicityESDCorrected(etaRange)->Clone(Form("result_%d_%d.root", param, sign));
1902 TString tmp; tmp.Form("SystematicpT_%d_%d.eps", param, sign);
1903 DrawResultRatio(mcHist[id], result[id], tmp);
1907 // calculate normal result
1908 TFile::Open("ptspectrum100_1.root");
1909 mult2->LoadHistograms("Multiplicity");
1910 TH1* mcHist2 = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc2");
1912 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1914 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100);
1915 //mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
1917 TH1* result2 = mult->GetMultiplicityESDCorrected(etaRange)->Clone("result2");
1919 DrawResultRatio(mcHist2, result2, "SystematicpT_OK.eps");
1921 DrawRatioDeduct(mcHist2, result2, nParams*2, mcHist, result, "SystematicpT_Summary.eps");
1923 TCanvas* canvas = DrawRatio(nParams*2, mcHist, result, "SystematicpT_Ratios.eps");
1925 TFile::Open("bayesianUncertainty_pt_400_100.root");
1926 TH1* errorHist = (TH1*) gFile->Get("errorBoth");
1927 errorHist->SetLineColor(1);
1928 errorHist->SetLineWidth(2);
1929 TH1* errorHist2 = (TH1*) errorHist->Clone("errorHist2");
1930 for (Int_t i=1; i<=errorHist->GetNbinsX(); i++)
1932 errorHist->SetBinContent(i, errorHist->GetBinContent(i) + 1);
1933 errorHist2->SetBinContent(i, 1 - errorHist2->GetBinContent(i));
1936 errorHist->DrawCopy("SAME");
1937 errorHist2->DrawCopy("SAME");
1939 canvas->SaveAs(canvas->GetName());
1941 DrawRatioDeductSmooth(mcHist2, result2, nParams*2, mcHist, result, "SystematicpT_Summary.eps");
1943 // does not make sense: mc is different
1944 //Draw2ResultRatio(mcHist, result1, result2, "SystematicpT.eps");