4 // plots for the note about multplicity measurements
7 #if !defined(__CINT__) || defined(__MAKECINT__)
19 #include <TStopwatch.h>
23 #include <TPaveText.h>
27 #include "AliMultiplicityCorrection.h"
28 #include "AliCorrection.h"
29 #include "AliCorrectionMatrix3D.h"
33 const char* correctionFile = "multiplicityMC_2M.root";
34 const char* measuredFile = "multiplicityMC_1M_3.root";
36 Int_t displayRange = 200; // axis range
37 Int_t ratioRange = 151; // range to calculate difference
38 Int_t longDisplayRange = 200;
40 const char* correctionFileTPC = "multiplicityMC_TPC_1.4M.root";
41 const char* measuredFileTPC = "multiplicityMC_TPC_0.6M.root";
42 Int_t etaRangeTPC = 1;
46 correctionFile = correctionFileTPC;
47 measuredFile = measuredFileTPC;
48 etaRange = etaRangeTPC;
51 longDisplayRange = 100;
54 void Smooth(TH1* hist, Int_t windowWidth = 20)
56 TH1* clone = (TH1*) hist->Clone("clone");
57 for (Int_t bin=2; bin<=clone->GetNbinsX(); ++bin)
59 Int_t min = TMath::Max(2, bin-windowWidth);
60 Int_t max = TMath::Min(clone->GetNbinsX(), bin+windowWidth);
61 Float_t average = clone->Integral(min, max) / (max - min + 1);
63 hist->SetBinContent(bin, average);
64 hist->SetBinError(bin, 0);
70 void responseMatrixPlot()
72 gSystem->Load("libPWG0base");
74 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
76 TFile::Open(correctionFile);
77 mult->LoadHistograms("Multiplicity");
79 TH1* hist = mult->GetCorrelation(etaRange)->Project3D("zy");
80 hist->SetStats(kFALSE);
82 hist->SetTitle(";true multiplicity;measured multiplicity;Entries");
83 hist->GetXaxis()->SetRangeUser(0, longDisplayRange);
84 hist->GetYaxis()->SetRangeUser(0, longDisplayRange);
86 TCanvas* canvas = new TCanvas("c1", "c1", 800, 600);
87 canvas->SetRightMargin(0.15);
88 canvas->SetTopMargin(0.05);
93 canvas->SaveAs("responsematrix.eps");
96 TCanvas* DrawResultRatio(TH1* mcHist, TH1* result, TString epsName)
98 // normalize unfolded result to mc hist
99 result->Scale(1.0 / result->Integral(2, 200));
100 result->Scale(mcHist->Integral(2, 200));
102 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 600);
103 canvas->Range(0, 0, 1, 1);
105 TPad* pad1 = new TPad(Form("%s_pad1", epsName.Data()), "", 0, 0.5, 0.98, 0.98);
108 TPad* pad2 = new TPad(Form("%s_pad2", epsName.Data()), "", 0, 0.02, 0.98, 0.5);
111 pad1->SetRightMargin(0.05);
112 pad2->SetRightMargin(0.05);
114 // no border between them
115 pad1->SetBottomMargin(0);
116 pad2->SetTopMargin(0);
120 mcHist->GetXaxis()->SetLabelSize(0.06);
121 mcHist->GetYaxis()->SetLabelSize(0.06);
122 mcHist->GetXaxis()->SetTitleSize(0.06);
123 mcHist->GetYaxis()->SetTitleSize(0.06);
124 mcHist->GetYaxis()->SetTitleOffset(0.6);
126 mcHist->GetXaxis()->SetRangeUser(0, displayRange);
128 mcHist->SetTitle(";true multiplicity;Entries");
129 mcHist->SetStats(kFALSE);
131 mcHist->DrawCopy("HIST E");
134 result->SetLineColor(2);
135 result->DrawCopy("SAME HISTE");
137 TLegend* legend = new TLegend(0.6, 0.65, 0.95, 0.9);
138 legend->AddEntry(mcHist, "true distribution");
139 legend->AddEntry(result, "unfolded distribution");
140 legend->SetFillColor(0);
144 pad2->SetBottomMargin(0.15);
148 TH1* ratio = (TH1*) mcHist->Clone("ratio");
150 ratio->Divide(ratio, result, 1, 1, "");
151 ratio->GetYaxis()->SetTitle("Ratio (true / unfolded)");
152 ratio->GetYaxis()->SetRangeUser(0.55, 1.45);
156 // get average of ratio
158 for (Int_t i=2; i<=ratioRange; ++i)
160 sum += TMath::Abs(ratio->GetBinContent(i) - 1);
164 printf("Average (2..%d) of |ratio - 1| is %f\n", ratioRange, sum);
166 TLine* line = new TLine(0, 1, displayRange, 1);
167 line->SetLineWidth(2);
170 line = new TLine(0, 1.1, displayRange, 1.1);
171 line->SetLineWidth(2);
172 line->SetLineStyle(2);
174 line = new TLine(0, 0.9, displayRange, 0.9);
175 line->SetLineWidth(2);
176 line->SetLineStyle(2);
181 canvas->SaveAs(epsName);
186 TCanvas* Draw2ResultRatio(TH1* mcHist, TH1* result1, TH1* result2, TString epsName)
188 // draws the 3 plots in the upper plot
189 // draws the ratio between result1 and result2 in the lower plot
191 // normalize unfolded result to mc hist
192 result1->Scale(1.0 / result1->Integral(2, 200));
193 result1->Scale(mcHist->Integral(2, 200));
194 result2->Scale(1.0 / result2->Integral(2, 200));
195 result2->Scale(mcHist->Integral(2, 200));
197 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 600);
198 canvas->Range(0, 0, 1, 1);
200 TPad* pad1 = new TPad(Form("%s_pad1", epsName.Data()), "", 0, 0.5, 0.98, 0.98);
203 TPad* pad2 = new TPad(Form("%s_pad2", epsName.Data()), "", 0, 0.02, 0.98, 0.5);
206 pad1->SetRightMargin(0.05);
207 pad2->SetRightMargin(0.05);
209 // no border between them
210 pad1->SetBottomMargin(0);
211 pad2->SetTopMargin(0);
215 mcHist->GetXaxis()->SetLabelSize(0.06);
216 mcHist->GetYaxis()->SetLabelSize(0.06);
217 mcHist->GetXaxis()->SetTitleSize(0.06);
218 mcHist->GetYaxis()->SetTitleSize(0.06);
219 mcHist->GetYaxis()->SetTitleOffset(0.6);
221 mcHist->GetXaxis()->SetRangeUser(0, displayRange);
223 mcHist->SetTitle(";true multiplicity;Entries");
224 mcHist->SetStats(kFALSE);
226 mcHist->DrawCopy("HIST E");
229 result1->SetLineColor(2);
230 result1->DrawCopy("SAME HISTE");
232 result2->SetLineColor(4);
233 result2->DrawCopy("SAME HISTE");
235 TLegend* legend = new TLegend(0.55, 0.6, 0.95, 0.9);
236 legend->AddEntry(mcHist, "true distribution");
237 legend->AddEntry(result1, "unfolded distribution (syst)");
238 legend->AddEntry(result2, "unfolded distribution (normal)");
239 legend->SetFillColor(0);
243 pad2->SetBottomMargin(0.15);
245 result1->GetXaxis()->SetLabelSize(0.06);
246 result1->GetYaxis()->SetLabelSize(0.06);
247 result1->GetXaxis()->SetTitleSize(0.06);
248 result1->GetYaxis()->SetTitleSize(0.06);
249 result1->GetYaxis()->SetTitleOffset(0.6);
251 result1->GetXaxis()->SetRangeUser(0, displayRange);
253 result1->SetTitle(";true multiplicity;Entries");
254 result1->SetStats(kFALSE);
258 TH1* ratio = (TH1*) result1->Clone("ratio");
260 ratio->Divide(ratio, result2, 1, 1, "");
261 ratio->GetYaxis()->SetTitle("Ratio (syst / normal)");
262 ratio->GetYaxis()->SetRangeUser(0.55, 1.45);
266 // get average of ratio
268 for (Int_t i=2; i<=ratioRange; ++i)
270 sum += TMath::Abs(ratio->GetBinContent(i) - 1);
274 printf("Average (2..%d) of |ratio - 1| is %f\n", ratioRange, sum);
276 TLine* line = new TLine(0, 1, displayRange, 1);
277 line->SetLineWidth(2);
280 line = new TLine(0, 1.1, displayRange, 1.1);
281 line->SetLineWidth(2);
282 line->SetLineStyle(2);
284 line = new TLine(0, 0.9, displayRange, 0.9);
285 line->SetLineWidth(2);
286 line->SetLineStyle(2);
291 canvas->SaveAs(epsName);
296 TCanvas* DrawRatio(TH1* result, Int_t nResultSyst, TH1** resultSyst, TString epsName, Bool_t firstMarker = kFALSE, const char** legendStrings = 0, Bool_t errors = kFALSE)
298 // compares n results with first results. E.g. one gained with the default response, another with a changed one to study
299 // a systematic effect
302 result->Scale(1.0 / result->Integral(2, 200));
304 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 400);
305 canvas->SetTopMargin(0.05);
306 canvas->SetRightMargin(0.05);
308 result->GetXaxis()->SetRangeUser(0, displayRange);
309 result->GetYaxis()->SetRangeUser(0.55, 1.45);
310 result->SetStats(kFALSE);
312 // to get the axis how we want it
313 TH1* dummy = (TH1*) result->Clone("dummy");
315 dummy->SetTitle(";true multiplicity;Ratio");
319 Int_t colors[] = {1, 2, 4, 6, 7, 8, 9, 10};
321 TLegend* legend = new TLegend(0.2, 0.75, 0.35, 0.95);
322 legend->SetFillColor(0);
324 for (Int_t n=0; n<nResultSyst; ++n)
326 resultSyst[n]->Scale(1.0 / resultSyst[n]->Integral(2, 200));
329 TH1* ratio = (TH1*) result->Clone("ratio");
330 ratio->Divide(ratio, resultSyst[n], 1, 1, "");
331 ratio->GetXaxis()->SetRangeUser(1, displayRange);
334 ratio->SetMarkerStyle(5);
336 ratio->SetLineColor(colors[n / 2]);
338 ratio->SetLineStyle(2);
340 TString drawStr("SAME HIST");
341 if (n == 0 && firstMarker)
346 ratio->DrawCopy(drawStr);
348 if (legendStrings && legendStrings[n])
349 legend->AddEntry(ratio, legendStrings[n]);
351 // get average of ratio
353 for (Int_t i=2; i<=ratioRange; ++i)
354 sum += TMath::Abs(ratio->GetBinContent(i) - 1);
357 printf("%d) Average (2..%d) of |ratio - 1| is %f\n", n, ratioRange, sum);
363 TLine* line = new TLine(0, 1, displayRange, 1);
364 line->SetLineWidth(2);
367 line = new TLine(0, 1.1, displayRange, 1.1);
368 line->SetLineWidth(2);
369 line->SetLineStyle(2);
371 line = new TLine(0, 0.9, displayRange, 0.9);
372 line->SetLineWidth(2);
373 line->SetLineStyle(2);
376 canvas->SaveAs(epsName);
377 canvas->SaveAs(Form("%s.gif", epsName.Data()));
382 TCanvas* DrawRatio(Int_t nResultSyst, TH1** mc, TH1** result, TString epsName, Bool_t smooth = kFALSE, Bool_t dashed = kFALSE)
384 // draws the ratios of each mc to the corresponding result
386 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 400);
387 canvas->SetRightMargin(0.05);
388 canvas->SetTopMargin(0.05);
390 for (Int_t n=0; n<nResultSyst; ++n)
393 result[n]->Scale(1.0 / result[n]->Integral(2, 200));
394 mc[n]->Scale(1.0 / mc[n]->Integral(2, 200));
396 result[n]->GetXaxis()->SetRangeUser(0, displayRange);
397 result[n]->SetStats(kFALSE);
400 TH1* ratio = (TH1*) result[n]->Clone("ratio");
401 ratio->Divide(mc[n], ratio, 1, 1, "B");
403 // SetRangeUser(1, ...) would be the same, but the 0 should be still on the axis...
404 ratio->SetBinContent(1, 1); ratio->SetBinError(1, 0);
409 ratio->SetTitle(Form(";true multiplicity;Ratio (true / unfolded)%s", ((smooth) ? " (smoothed)" : "")));
410 ratio->GetYaxis()->SetRangeUser(0.55, 1.45);
414 ratio->SetLineColor((n/2)+1);
415 ratio->SetLineStyle((n%2)+1);
418 ratio->SetLineColor(n+1);
420 ratio->DrawCopy((n == 0) ? "HIST" : "SAME HIST");
422 // get average of ratio
424 for (Int_t i=2; i<=ratioRange; ++i)
425 sum += TMath::Abs(ratio->GetBinContent(i) - 1);
428 printf("%d) Average (2..%d) of |ratio - 1| is %f\n", n, ratioRange, sum);
431 TLine* line = new TLine(0, 1, displayRange, 1);
432 line->SetLineWidth(2);
435 line = new TLine(0, 1.1, displayRange, 1.1);
436 line->SetLineWidth(2);
437 line->SetLineStyle(2);
439 line = new TLine(0, 0.9, displayRange, 0.9);
440 line->SetLineWidth(2);
441 line->SetLineStyle(2);
446 canvas->SaveAs(epsName);
447 canvas->SaveAs(Form("%s.gif", epsName.Data()));
452 TCanvas* DrawRatioDeduct(TH1* mcBase, TH1* resultBase, Int_t nResultSyst, TH1** mc, TH1** result, TString epsName)
454 // draws the ratios of each mc to the corresponding result
455 // deducts from each ratio the ratio of mcBase / resultBase
458 resultBase->Scale(1.0 / resultBase->Integral(2, 200));
459 mcBase->Scale(1.0 / mcBase->Integral(2, 200));
462 TH1* ratioBase = (TH1*) resultBase->Clone("ratioBase");
463 ratioBase->Divide(mcBase, ratioBase, 1, 1, "B");
465 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 400);
466 canvas->SetRightMargin(0.05);
467 canvas->SetTopMargin(0.05);
469 for (Int_t n=0; n<nResultSyst; ++n)
472 result[n]->Scale(1.0 / result[n]->Integral(2, 200));
473 mc[n]->Scale(1.0 / mc[n]->Integral(2, 200));
475 result[n]->GetXaxis()->SetRangeUser(0, displayRange);
476 result[n]->SetStats(kFALSE);
479 TH1* ratio = (TH1*) result[n]->Clone("ratio");
480 ratio->Divide(mc[n], ratio, 1, 1, "B");
481 ratio->Add(ratioBase, -1);
483 ratio->SetTitle(";true multiplicity;Ratio_{syst} (t/u) - Ratio (t/u)");
484 ratio->GetYaxis()->SetRangeUser(-1, 1);
485 ratio->SetLineColor(n+1);
486 ratio->DrawCopy((n == 0) ? "HIST" : "SAME HIST");
488 // get average of ratio
490 for (Int_t i=2; i<=ratioRange; ++i)
491 sum += TMath::Abs(ratio->GetBinContent(i));
494 printf("%d) Average (2..%d) of |ratio - ratioBase| is %f\n", n, ratioRange, sum);
497 TLine* line = new TLine(0, 0, displayRange, 0);
498 line->SetLineWidth(2);
501 line = new TLine(0, 0.1, displayRange, 0.1);
502 line->SetLineWidth(2);
503 line->SetLineStyle(2);
505 line = new TLine(0, -0.1, displayRange, -0.1);
506 line->SetLineWidth(2);
507 line->SetLineStyle(2);
512 canvas->SaveAs(epsName);
513 canvas->SaveAs(Form("%s.gif", epsName.Data()));
518 TCanvas* DrawRatioDeductSmooth(TH1* mcBase, TH1* resultBase, Int_t nResultSyst, TH1** mc, TH1** result, TString epsName)
520 // draws the ratios of each mc to the corresponding result
521 // deducts from each ratio the ratio of mcBase / resultBase
522 // smoothens the ratios by a sliding window
525 resultBase->Scale(1.0 / resultBase->Integral(2, 200));
526 mcBase->Scale(1.0 / mcBase->Integral(2, 200));
529 TH1* ratioBase = (TH1*) resultBase->Clone("ratioBase");
530 ratioBase->Divide(mcBase, ratioBase, 1, 1, "B");
532 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 400);
533 canvas->SetRightMargin(0.05);
534 canvas->SetTopMargin(0.05);
536 for (Int_t n=0; n<nResultSyst; ++n)
539 result[n]->Scale(1.0 / result[n]->Integral(2, 200));
540 mc[n]->Scale(1.0 / mc[n]->Integral(2, 200));
542 result[n]->GetXaxis()->SetRangeUser(0, displayRange);
543 result[n]->SetStats(kFALSE);
546 TH1* ratio = (TH1*) result[n]->Clone("ratio");
547 ratio->Divide(mc[n], ratio, 1, 1, "B");
548 ratio->Add(ratioBase, -1);
550 //new TCanvas; ratio->DrawCopy();
552 ratio->SetBinContent(1, 0); ratio->SetBinError(1, 0);
556 //ratio->SetLineColor(1); ratio->DrawCopy("SAME");
559 ratio->SetTitle(";true multiplicity;Ratio_{syst} (t/u) - Ratio (t/u) (smoothed)");
560 ratio->GetYaxis()->SetRangeUser(-0.3, 0.3);
561 ratio->SetLineColor((n / 2)+1);
562 ratio->SetLineStyle((n % 2)+1);
563 ratio->DrawCopy((n == 0) ? "HIST" : "SAME HIST");
565 // get average of ratio
567 for (Int_t i=2; i<=150; ++i)
568 sum += TMath::Abs(ratio->GetBinContent(i));
571 printf("%d) Average (2..150) of |ratio - ratioBase| is %f\n", n, sum);
574 TLine* line = new TLine(0, 0, displayRange, 0);
575 line->SetLineWidth(2);
578 line = new TLine(0, 0.1, displayRange, 0.1);
579 line->SetLineWidth(2);
580 line->SetLineStyle(2);
582 line = new TLine(0, -0.1, displayRange, -0.1);
583 line->SetLineWidth(2);
584 line->SetLineStyle(2);
589 canvas->SaveAs(epsName);
590 canvas->SaveAs(Form("%s.gif", epsName.Data()));
595 void DrawResiduals(TH1* measured, TH1* unfoldedFolded, const char* epsName)
598 unfoldedFolded->Scale(1.0 / unfoldedFolded->Integral(2, 200));
599 unfoldedFolded->Scale(measured->Integral(2, 200));
601 TCanvas* canvas = new TCanvas(epsName, epsName, 800, 600);
602 canvas->Range(0, 0, 1, 1);
604 TPad* pad1 = new TPad(Form("%s_pad1", epsName), "", 0, 0.5, 0.98, 0.98);
609 TPad* pad2 = new TPad(Form("%s_pad2", epsName), "", 0, 0.02, 0.98, 0.5);
614 TPad* pad3 = new TPad(Form("%s_pad3", epsName), "", 0.15, 0.5, 0.35, 0.75);
617 pad3->SetRightMargin(0.05);
618 pad3->SetTopMargin(0.05);
621 pad1->SetRightMargin(0.05);
622 pad2->SetRightMargin(0.05);
624 // no border between them
625 pad1->SetBottomMargin(0);
626 pad2->SetTopMargin(0);
630 measured->GetXaxis()->SetLabelSize(0.06);
631 measured->GetYaxis()->SetLabelSize(0.06);
632 measured->GetXaxis()->SetTitleSize(0.06);
633 measured->GetYaxis()->SetTitleSize(0.06);
634 measured->GetYaxis()->SetTitleOffset(0.6);
636 measured->GetXaxis()->SetRangeUser(0, 150);
638 measured->SetTitle(";measured multiplicity;Entries");
639 measured->SetStats(kFALSE);
641 measured->DrawCopy("HIST");
644 unfoldedFolded->SetMarkerStyle(5);
645 unfoldedFolded->SetMarkerColor(2);
646 unfoldedFolded->SetLineColor(0);
647 unfoldedFolded->DrawCopy("SAME P");
649 TLegend* legend = new TLegend(0.6, 0.65, 0.95, 0.9);
650 legend->AddEntry(measured, "measured distribution");
651 legend->AddEntry(unfoldedFolded, "R #otimes unfolded distribution");
652 legend->SetFillColor(0);
656 pad2->SetBottomMargin(0.15);
660 TH1* residual = (TH1*) measured->Clone("residual");
661 unfoldedFolded->Sumw2();
663 residual->Add(unfoldedFolded, -1);
666 TH1* residualHist = new TH1F("residualHist", ";", 15, -3, 3);
668 for (Int_t i=1; i<=residual->GetNbinsX(); ++i)
670 if (measured->GetBinError(i) > 0)
672 residual->SetBinContent(i, residual->GetBinContent(i) / measured->GetBinError(i));
673 residual->SetBinError(i, 1);
675 residualHist->Fill(residual->GetBinContent(i));
679 residual->SetBinContent(i, 0);
680 residual->SetBinError(i, 0);
684 residual->GetYaxis()->SetTitle("Residuals 1/e (M - R #otimes U)");
685 residual->GetYaxis()->SetRangeUser(-4.5, 4.5);
686 residual->DrawCopy();
688 TLine* line = new TLine(-0.5, 0, 150.5, 0);
689 line->SetLineWidth(2);
693 residualHist->SetStats(kFALSE);
694 residualHist->GetXaxis()->SetLabelSize(0.08);
695 residualHist->Fit("gaus");
696 residualHist->Draw();
699 canvas->SaveAs(canvas->GetName());
701 //const char* epsName2 = "proj.eps";
702 //TCanvas* canvas = new TCanvas(epsName2, epsName2, 800, 600);
703 //canvas->SetGridx();
704 //canvas->SetGridy();
706 //canvas->SaveAs(canvas->GetName());
709 void bayesianExample()
714 gSystem->Load("libPWG0base");
716 TFile::Open(correctionFile);
717 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
718 mult->LoadHistograms("Multiplicity");
720 TFile::Open(measuredFile);
721 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
722 mult2->LoadHistograms("Multiplicity");
724 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
726 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100);
728 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
729 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
731 //mult->DrawComparison("bayesianExample", etaRange, kFALSE, kTRUE, mcHist, kTRUE);
732 DrawResultRatio(mcHist, result, "bayesianExample.eps");
734 //Printf("KolmogorovTest says PROB = %f", mcHist->KolmogorovTest(result, "D"));
735 //Printf("Chi2Test says PROB = %f", mcHist->Chi2Test(result));
737 // draw residual plot
739 // TODO take out efficiency correction if other than AliMultiplicityCorrection::kTrVtx
740 TH2* convoluted = mult->CalculateMultiplicityESD(result, etaRange);
741 TH1* convolutedProj = convoluted->ProjectionY("convolutedProj", -1, -1, "e");
743 TH1* measured = mult2->GetMultiplicityESD(etaRange)->ProjectionY("measured");
745 DrawResiduals(measured, convolutedProj, "bayesianResiduals.eps");
751 void chi2FluctuationResult()
753 gSystem->Load("libPWG0base");
755 TFile::Open(correctionFile);
756 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
757 mult->LoadHistograms("Multiplicity");
759 TFile::Open(measuredFile);
760 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
761 mult2->LoadHistograms("Multiplicity");
763 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
764 mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0);
765 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
767 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
768 //TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
770 mult->DrawComparison("MinuitChi2", etaRange, kFALSE, kTRUE, mcHist, kTRUE);
772 TCanvas* canvas = (TCanvas*) gROOT->FindObject("MinuitChi2_DrawComparison_3");
773 canvas->SaveAs("chi2FluctuationResult.eps");
781 gSystem->Load("libPWG0base");
783 TFile::Open(correctionFile);
784 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
785 mult->LoadHistograms("Multiplicity");
787 TFile::Open(measuredFile);
788 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
789 mult2->LoadHistograms("Multiplicity");
791 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
792 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
793 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
795 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
796 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
798 DrawResultRatio(mcHist, result, "chi2Example.eps");
804 void chi2ExampleTPC()
809 gSystem->Load("libPWG0base");
811 TFile::Open(correctionFileTPC);
812 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
813 mult->LoadHistograms("Multiplicity");
815 TFile::Open(measuredFileTPC);
816 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
817 mult2->LoadHistograms("Multiplicity");
819 mult->SetMultiplicityESD(etaRangeTPC, mult2->GetMultiplicityESD(etaRangeTPC));
820 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
821 mult->ApplyMinuitFit(etaRangeTPC, kFALSE, AliMultiplicityCorrection::kTrVtx);
823 TH1* mcHist = mult2->GetMultiplicityVtx(etaRangeTPC)->ProjectionY("mymc");
824 TH1* result = mult->GetMultiplicityESDCorrected(etaRangeTPC);
826 DrawResultRatio(mcHist, result, "chi2ExampleTPC.eps");
834 gSystem->Load("libPWG0base");
835 TFile::Open("multiplicityMC_3M.root");
837 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
838 mult->LoadHistograms("Multiplicity");
840 TFile::Open("multiplicityMC_3M_NBD.root");
841 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
842 mult2->LoadHistograms("Multiplicity");
844 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
845 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1.0, 100);
847 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
850 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
852 //mult->DrawComparison("bayesianNBD", etaRange, kFALSE, kTRUE, mcHist);
853 DrawResultRatio(mcHist, result, "bayesianNBD.eps");
856 void minimizationNBD()
858 gSystem->Load("libPWG0base");
859 TFile::Open("multiplicityMC_3M.root");
861 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
862 mult->LoadHistograms("Multiplicity");
864 TFile::Open("multiplicityMC_3M_NBD.root");
865 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
866 mult2->LoadHistograms("Multiplicity");
868 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
869 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
870 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
872 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
875 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
877 //mult->DrawComparison("minimizationNBD", etaRange, kFALSE, kTRUE, mcHist);
878 DrawResultRatio(mcHist, result, "minimizationNBD.eps");
881 void minimizationInfluenceAlpha()
883 gSystem->Load("libPWG0base");
885 TFile::Open(measuredFile);
886 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
887 mult2->LoadHistograms("Multiplicity");
889 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
890 mcHist->Scale(1.0 / mcHist->Integral());
891 mcHist->GetXaxis()->SetRangeUser(0, 200);
892 mcHist->SetStats(kFALSE);
893 mcHist->SetTitle(";true multiplicity;P_{N}");
895 TCanvas* canvas = new TCanvas("minimizationInfluenceAlpha", "minimizationInfluenceAlpha", 1000, 300);
896 canvas->Divide(3, 1);
898 TFile::Open("eval-2M-1M/EvaluateChi2MethodDetail.root");
900 TH1* hist1 = (TH1*) gFile->Get("MinuitChi2_00_2_100.000000");
901 TH1* hist2 = (TH1*) gFile->Get("MinuitChi2_03_2_100000.000000");
902 TH1* hist3 = (TH1*) gFile->Get("MinuitChi2_06_2_100000000.000000");
904 mcHist->Rebin(2); mcHist->Scale(0.5);
905 hist1->Rebin(2); hist1->Scale(0.5);
906 hist2->Rebin(2); hist2->Scale(0.5);
907 hist3->Rebin(2); hist3->Scale(0.5);
909 mcHist->GetXaxis()->SetRangeUser(0, 200);
914 hist1->SetMarkerStyle(5);
915 hist1->SetMarkerColor(2);
916 hist1->Draw("SAME PE");
921 hist2->SetMarkerStyle(5);
922 hist2->SetMarkerColor(2);
923 hist2->Draw("SAME PE");
928 hist3->SetMarkerStyle(5);
929 hist3->SetMarkerColor(2);
930 hist3->Draw("SAME PE");
932 canvas->SaveAs("minimizationInfluenceAlpha.eps");
937 gSystem->Load("libPWG0base");
939 TFile::Open(correctionFile);
940 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
941 mult->LoadHistograms("Multiplicity");
943 TH1* fCurrentESD = mult->GetMultiplicityVtx(etaRange)->ProjectionY();
944 fCurrentESD->Sumw2();
945 fCurrentESD->Scale(1.0 / fCurrentESD->Integral());
947 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])");
948 func->SetParNames("scaling", "averagen", "k");
949 func->SetParLimits(0, 0.001, fCurrentESD->GetMaximum() * 1000);
950 func->SetParLimits(1, 0.001, 1000);
951 func->SetParLimits(2, 0.001, 1000);
952 func->SetParameters(fCurrentESD->GetMaximum() * 100, 10, 2);
954 TF1* lognormal = new TF1("lognormal", "[0]*exp(-(log(x)-[1])^2/(2*[2]^2))/(x*[2]*TMath::Sqrt(2*TMath::Pi()))", 0.01, 500);
955 lognormal->SetParNames("scaling", "mean", "sigma");
956 lognormal->SetParameters(1, 1, 1);
957 lognormal->SetParLimits(0, 0, 10);
958 lognormal->SetParLimits(1, 0, 100);
959 lognormal->SetParLimits(2, 1e-3, 10);
961 TCanvas* canvas = new TCanvas("c1", "c1", 700, 400);
962 fCurrentESD->SetStats(kFALSE);
963 fCurrentESD->GetYaxis()->SetTitleOffset(1.3);
964 fCurrentESD->SetTitle(";true multiplicity (N);P_{N}");
965 fCurrentESD->Draw("HIST");
966 fCurrentESD->GetXaxis()->SetRangeUser(0, 200);
967 fCurrentESD->Fit(func, "W0", "", 0, 50);
968 func->SetRange(0, 100);
970 printf("chi2 = %f\n", func->GetChisquare());
972 fCurrentESD->Fit(lognormal, "W0", "", 0.01, 100);
973 lognormal->SetLineColor(2);
974 lognormal->SetLineStyle(2);
975 lognormal->SetRange(0, 100);
976 lognormal->Draw("SAME");
978 canvas->SaveAs("NBDFit.eps");
981 void DifferentSamples()
983 // data generated by runMultiplicitySelector.C DifferentSamples
985 const char* name = "DifferentSamples";
987 TFile* file = TFile::Open(Form("%s.root", name));
989 TCanvas* canvas = new TCanvas(name, name, 800, 600);
990 canvas->Divide(2, 2);
992 for (Int_t i=0; i<4; ++i)
995 gPad->SetTopMargin(0.05);
996 gPad->SetRightMargin(0.05);
997 TH1* chi2Result = (TH1*) file->Get(Form("chi2Result_%d", i));
998 TH1* bayesResult = (TH1*) file->Get(Form("bayesResult_%d", i));
999 TH1* mc = (TH1*) file->Get(Form("mc_%d", i));
1002 chi2Result->Divide(chi2Result, mc, 1, 1, "");
1003 bayesResult->Divide(bayesResult, mc, 1, 1, "");
1005 chi2Result->SetTitle(";true multiplicity;unfolded measured/MC");
1006 chi2Result->GetXaxis()->SetRangeUser(0, 150);
1007 chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
1008 chi2Result->GetYaxis()->SetTitleOffset(1.2);
1009 chi2Result->SetLineColor(1);
1010 chi2Result->SetStats(kFALSE);
1012 bayesResult->SetStats(kFALSE);
1013 bayesResult->SetLineColor(2);
1015 chi2Result->DrawCopy("HIST");
1016 bayesResult->DrawCopy("SAME HIST");
1018 TLine* line = new TLine(0, 1, 150, 1);
1022 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1025 void StartingConditions()
1027 // data generated by runMultiplicitySelector.C StartingConditions
1029 const char* name = "StartingConditions";
1031 TFile* file = TFile::Open(Form("%s.root", name));
1033 TCanvas* canvas = new TCanvas(name, name, 800, 400);
1034 canvas->Divide(2, 1);
1036 TH1* mc = (TH1*) file->Get("mc");
1038 mc->Scale(1.0 / mc->Integral());
1040 //Int_t marker[] = {24, 25, 26, 27, 28, 2, 3, 4, 5};
1042 TLegend* legend = new TLegend(0.6, 0.7, 0.95, 0.95);
1043 legend->SetFillColor(0);
1045 const char* names[] = { "True", "Measured 1", "Measured 2", "Measured 3", "NBD", "Flat" };
1047 for (Int_t i=0; i<6; ++i)
1053 TH1* chi2Result = (TH1*) file->Get(Form("chi2Result_%d", id));
1054 TH1* bayesResult = (TH1*) file->Get(Form("bayesResult_%d", id));
1056 chi2Result->Divide(chi2Result, mc, 1, 1, "");
1057 bayesResult->Divide(bayesResult, mc, 1, 1, "");
1059 chi2Result->SetTitle("a) #chi^{2} minimization;true multiplicity;unfolded / MC");
1060 chi2Result->GetXaxis()->SetRangeUser(0, 150);
1061 chi2Result->GetYaxis()->SetRangeUser(0.8, 1.2);
1062 chi2Result->GetYaxis()->SetTitleOffset(1.5);
1063 //chi2Result->SetMarkerStyle(marker[i]);
1064 chi2Result->SetLineColor(i+1);
1065 chi2Result->SetMarkerColor(i+1);
1066 chi2Result->SetStats(kFALSE);
1068 bayesResult->SetTitle("b) Bayesian method;true multiplicity;unfolded / MC");
1069 bayesResult->GetXaxis()->SetRangeUser(0, 150);
1070 bayesResult->GetYaxis()->SetRangeUser(0.8, 1.2);
1071 bayesResult->GetYaxis()->SetTitleOffset(1.5);
1072 bayesResult->SetStats(kFALSE);
1073 //bayesResult->SetLineColor(2);
1074 bayesResult->SetLineColor(i+1);
1077 gPad->SetLeftMargin(0.12);
1078 chi2Result->DrawCopy((i == 0) ? "HIST" : "HIST SAME");
1081 gPad->SetLeftMargin(0.12);
1082 bayesResult->DrawCopy((i == 0) ? "HIST" : "HIST SAME");
1084 //TLine* line = new TLine(0, 1, 150, 1);
1087 legend->AddEntry(chi2Result, names[i]);
1092 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1095 void StatisticsPlot()
1097 const char* name = "StatisticsPlot";
1099 TFile* file = TFile::Open(Form("%s.root", name));
1101 TCanvas* canvas = new TCanvas(name, name, 600, 400);
1103 TGraph* fitResultsChi2 = (TGraph*) file->Get("fitResultsChi2");
1104 fitResultsChi2->SetTitle(";number of measured events;P_{1}");
1105 fitResultsChi2->GetYaxis()->SetRangeUser(0, 2);
1106 fitResultsChi2->Draw("AP");
1108 TF1* f = new TF1("f", "[0]/x", 1, 1e4);
1109 fitResultsChi2->Fit(f);
1111 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1116 const char* plotname = "chi2Result";
1118 name = "StatisticsPlotRatios";
1119 canvas = new TCanvas(name, name, 600, 400);
1121 for (Int_t i=0; i<5; ++i)
1123 mc[i] = (TH1*) file->Get(Form("mc_%d", i));
1124 result[i] = (TH1*) file->Get(Form("%s_%d", plotname, i));
1126 result[i]->SetLineColor(i+1);
1127 result[i]->Draw(((i == 0) ? "" : "SAME"));
1131 void SystematicLowEfficiency()
1133 gSystem->Load("libPWG0base");
1135 TFile::Open(correctionFile);
1136 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1137 mult->LoadHistograms("Multiplicity");
1139 // calculate result with systematic effect
1140 TFile::Open("multiplicityMC_100k_1_loweff.root");
1141 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1142 mult2->LoadHistograms("Multiplicity");
1144 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1145 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1146 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
1148 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
1149 TH1* result1 = (TH1*) mult->GetMultiplicityESDCorrected(etaRange)->Clone("result1");
1151 DrawResultRatio(mcHist, result1, "SystematicLowEfficiencyLow.eps");
1153 // calculate normal result
1154 TFile::Open("multiplicityMC_100k_1.root");
1155 mult2->LoadHistograms("Multiplicity");
1157 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1158 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
1160 TH1* result2 = (TH1*) mult->GetMultiplicityESDCorrected(etaRange)->Clone("result2");
1162 DrawResultRatio(mcHist, result2, "SystematicLowEfficiencyOK.eps");
1164 Draw2ResultRatio(mcHist, result1, result2, "SystematicLowEfficiency.eps");
1167 void SystematicMisalignment()
1169 gSystem->Load("libPWG0base");
1171 TFile::Open(correctionFile);
1172 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1173 mult->LoadHistograms("Multiplicity");
1175 TFile::Open("multiplicityMC_100k_fullmis.root");
1176 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1177 mult2->LoadHistograms("Multiplicity");
1179 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1180 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1181 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
1183 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
1184 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
1186 DrawResultRatio(mcHist, result, "SystematicMisalignment.eps");
1189 void SystematicMisalignmentTPC()
1191 gSystem->Load("libPWG0base");
1195 TFile::Open(correctionFile);
1196 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1197 mult->LoadHistograms("Multiplicity");
1199 TFile::Open("multiplicityMC_TPC_100k_fullmis.root");
1200 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1201 mult2->LoadHistograms("Multiplicity");
1203 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1204 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1205 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
1207 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
1208 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
1210 DrawResultRatio(mcHist, result, "SystematicMisalignmentTPC.eps");
1213 void EfficiencySpecies()
1215 gSystem->Load("libPWG0base");
1217 Int_t marker[] = {24, 25, 26};
1218 Int_t color[] = {1, 2, 4};
1221 const char* fileName[] = { "multiplicityMC_400k_syst.root", "multiplicityMC_TPC_4kfiles_syst.root" };
1222 Float_t etaRange[] = {0.49, 0.9};
1223 const char* titles[] = { "SPD Tracklets", "TPC Tracks" };
1225 TCanvas* canvas = new TCanvas("EfficiencySpecies", "EfficiencySpecies", 1000, 500);
1226 canvas->Divide(2, 1);
1228 for (Int_t loop=0; loop<2; ++loop)
1230 Printf("%s", fileName[loop]);
1232 AliCorrection* correction[4];
1238 gPad->SetRightMargin(0.05);
1239 //gPad->SetTopMargin(0.05);
1241 TLegend* legend = new TLegend(0.7, 0.4, 0.85, 0.6);
1242 legend->SetFillColor(0);
1243 legend->SetEntrySeparation(0.2);
1248 TFile* file = TFile::Open(fileName[loop]);
1251 Printf("Could not open %s", fileName[loop]);
1255 for (Int_t i=0; i<3; ++i)
1257 Printf("correction %d", i);
1259 TString name; name.Form("correction_%d", i);
1260 correction[i] = new AliCorrection(name, name);
1261 correction[i]->LoadHistograms();
1263 TH3* gene = correction[i]->GetTrackCorrection()->GetGeneratedHistogram();
1264 TH3* meas = correction[i]->GetTrackCorrection()->GetMeasuredHistogram();
1267 gene->GetXaxis()->SetRangeUser(-3.9, 3.9);
1268 meas->GetXaxis()->SetRangeUser(-3.9, 3.9);
1270 // 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)
1271 /*for (Int_t x = 1; x <= gene->GetNbinsX(); x++)
1272 for (Int_t z = 1; z <= gene->GetNbinsZ(); z++)
1274 gene->SetBinContent(x, 0, z, 0);
1275 gene->SetBinContent(x, gene->GetNbinsY()+1, z, 0);
1276 meas->SetBinContent(x, 0, z, 0);
1277 meas->SetBinContent(x, gene->GetNbinsY()+1, z, 0);
1281 gene->GetYaxis()->SetRangeUser(-etaRange[loop], etaRange[loop]);
1282 meas->GetYaxis()->SetRangeUser(-etaRange[loop], etaRange[loop]);
1284 TH1* genePt = gene->Project3D(Form("z_%d", i));
1285 TH1* measPt = meas->Project3D(Form("z_%d", i));
1290 TH1* effPt = (TH1*) genePt->Clone(Form("effPt_%d", i));
1292 effPt->Divide(measPt, genePt, 1, 1, "B");
1295 for (bin=20; bin>=1; bin--)
1297 if (effPt->GetBinContent(bin) < 0.5)
1301 Printf("Eff. below 50%% at bin %d, i.e. %.3f GeV/c", bin, effPt->GetXaxis()->GetBinUpEdge(bin));
1303 Float_t fraction = genePt->Integral(1, bin) / genePt->Integral();
1304 Printf("%.4f of the particles are below that momentum", fraction);
1306 below += genePt->Integral(1, bin);
1307 total += genePt->Integral();
1309 effPt->SetLineColor(color[i]);
1310 effPt->SetMarkerColor(color[i]);
1311 effPt->SetMarkerStyle(marker[i]);
1313 effPt->GetXaxis()->SetRangeUser(0.06, 1);
1314 effPt->GetYaxis()->SetRangeUser(0, 1);
1316 effPt->GetYaxis()->SetTitleOffset(1.2);
1318 effPt->SetStats(kFALSE);
1319 effPt->SetTitle(titles[loop]);
1320 effPt->GetYaxis()->SetTitle("Efficiency");
1322 effPt->DrawCopy((i == 0) ? "" : "SAME");
1324 legend->AddEntry(effPt, ((i == 0) ? "#pi^{#pm}" : ((i == 1) ? "K^{#pm}" : "p,#bar{p}")));
1327 Printf("In total %.4f of the particles are below their effective pt cut off", (Float_t) below / total);
1332 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1335 void ParticleSpeciesComparison1(Bool_t chi2 = kTRUE, const char* fileNameMC = "multiplicityMC_400k_syst_species.root", const char* fileNameESD = "multiplicityMC_100k_syst.root")
1337 gSystem->Load("libPWG0base");
1339 TFile::Open(fileNameESD);
1340 TH2F* hist = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityESD%d", etaRange));
1341 TH2F* hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityVtx%d", etaRange));
1345 // loop over cases (normal, enhanced/reduced ratios)
1347 for (Int_t i = 0; i<nMax; ++i)
1350 folder.Form("Multiplicity_%d", i);
1352 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection(folder, folder);
1354 TFile::Open(fileNameMC);
1355 mult->LoadHistograms();
1357 mult->SetMultiplicityESD(etaRange, hist);
1361 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 1e4);
1362 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kFALSE);
1363 //mult->DrawComparison(Form("ParticleSpeciesComparison_MinuitChi2_%d", i), etaRange, kFALSE, kTRUE, hist2->ProjectionY("mymchist"));
1367 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100);
1368 //mult->DrawComparison(Form("ParticleSpeciesComparison_Bayesian_%d", i), etaRange, kFALSE, kTRUE, hist2->ProjectionY("mymchist2"));
1371 //Float_t averageRatio = 0;
1372 //mult->GetComparisonResults(0, 0, 0, &averageRatio);
1374 results[i] = (TH1*) mult->GetMultiplicityESDCorrected(etaRange)->Clone(Form("result_%d", i));
1376 //Printf("Case %d. Average ratio is %f", i, averageRatio);
1379 DrawResultRatio(hist2->ProjectionY("mymchist", -1, -1, "e"), results[0], "ParticleSpeciesComparison1_1.eps");
1381 TH1* mc = hist2->ProjectionY("mymchist2", -1, -1, "e");
1383 for (Int_t i=1; i<=results[0]->GetNbinsX(); i++)
1385 results[0]->SetBinError(i, 0);
1386 mc->SetBinError(i, 0);
1389 const char* legendStrings[] = { "#pi^{#pm}", 0, "K^{#pm}", 0, "p,#bar{p}", 0 };
1391 DrawRatio(results[0], nMax-1, results+1, "ParticleSpeciesComparison1_2.eps", kFALSE, legendStrings);
1393 //not valid: draw chi2 uncertainty on top!
1394 /*TFile::Open("bayesianUncertainty_400k_100k_syst.root");
1395 TH1* errorHist = (TH1*) gFile->Get("errorBoth");
1396 errorHist->SetLineColor(1);
1397 errorHist->SetLineWidth(2);
1398 TH1* errorHist2 = (TH1*) errorHist->Clone("errorHist2");
1399 for (Int_t i=1; i<=errorHist->GetNbinsX(); i++)
1401 errorHist->SetBinContent(i, errorHist->GetBinContent(i) + 1);
1402 errorHist2->SetBinContent(i, 1 - errorHist2->GetBinContent(i));
1405 errorHist->DrawCopy("SAME");
1406 errorHist2->DrawCopy("SAME");*/
1408 //canvas->SaveAs(canvas->GetName());
1410 DrawRatio(mc, nMax, results, "ParticleSpeciesComparison1_3.eps", kTRUE, 0);
1412 //errorHist->DrawCopy("SAME");
1413 //errorHist2->DrawCopy("SAME");
1415 //canvas2->SaveAs(canvas2->GetName());
1418 /*void ParticleSpeciesComparison2()
1420 gSystem->Load("libPWG0base");
1422 const char* fileNameMC = "multiplicityMC_400k_syst.root";
1423 const char* fileNameESD = "out.root"; // based on multiplicityMC_100k_syst.root
1426 TFile::Open(fileNameMC);
1427 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1428 mult->LoadHistograms();
1433 // loop over cases (normal, enhanced/reduced ratios)
1435 for (Int_t i = 0; i<nMax; ++i)
1438 folder.Form("Multiplicity_%d", i);
1440 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection(folder, folder);
1442 TFile::Open(fileNameESD);
1443 mult2->LoadHistograms();
1445 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1449 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 1e4);
1450 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kFALSE);
1451 //mult->DrawComparison(Form("ParticleSpeciesComparison_MinuitChi2_%d", i), etaRange, kFALSE, kTRUE, hist2->ProjectionY("mymchist"));
1455 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100);
1456 //mult->DrawComparison(Form("ParticleSpeciesComparison_Bayesian_%d", i), etaRange, kFALSE, kTRUE, hist2->ProjectionY("mymchist2"));
1459 //Float_t averageRatio = 0;
1460 //mult->GetComparisonResults(0, 0, 0, &averageRatio);
1462 results[i] = (TH1*) mult->GetMultiplicityESDCorrected(etaRange)->Clone(Form("result_%d", i));
1464 TH2F* hist2 = mult2->GetMultiplicityVtx(etaRange);
1465 mc[i] = (TH1*) hist2->ProjectionY(Form("mymchist_%d", i), -1, -1, "e");
1467 //TString fileName; fileName.Form("ParticleSpeciesComparison2_%d.eps", i);
1468 //DrawResultRatio(hist2->ProjectionY("mymchist", -1, -1, "e"), results[i], fileName);
1470 //Printf("Case %d. Average ratio is %f", i, averageRatio);
1473 DrawRatio(nMax, mc, results, "ParticleSpeciesComparison2.eps");
1476 TH1* Invert(TH1* eff)
1478 // calculate corr = 1 / eff
1480 TH1* corr = (TH1*) eff->Clone(Form("%s_invert", eff->GetName()));
1483 for (Int_t i=1; i<=eff->GetNbinsX(); i++)
1485 if (eff->GetBinContent(i) > 0)
1487 corr->SetBinContent(i, 1.0 / eff->GetBinContent(i));
1488 corr->SetBinError(i, eff->GetBinError(i) / eff->GetBinContent(i) * corr->GetBinContent(i));
1495 void TriggerVertexCorrection()
1498 // plots the correction performed on the unfolded spectrum to gain the spectrum for the full inelastic sample
1501 gSystem->Load("libPWG0base");
1503 TFile::Open(correctionFile);
1504 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1505 mult->LoadHistograms("Multiplicity");
1507 TH1* corrINEL = Invert(mult->GetEfficiency(etaRange, AliMultiplicityCorrection::kINEL));
1508 TH1* corrMB = Invert(mult->GetEfficiency(etaRange, AliMultiplicityCorrection::kMB));
1510 TCanvas* canvas = new TCanvas("TriggerVertexCorrection", "TriggerVertexCorrection", 800, 600);
1512 corrINEL->SetStats(kFALSE);
1513 corrINEL->GetXaxis()->SetRangeUser(0, 30);
1514 corrINEL->GetYaxis()->SetRangeUser(0, 5);
1515 corrINEL->SetTitle(";true multiplicity;correction factor");
1516 corrINEL->SetMarkerStyle(22);
1517 corrINEL->Draw("PE");
1519 corrMB->SetStats(kFALSE);
1520 corrMB->SetLineColor(2);
1521 corrMB->SetMarkerStyle(25);
1522 corrMB->SetMarkerColor(2);
1523 corrMB->Draw("SAME PE");
1525 TLegend* legend = new TLegend(0.3, 0.5, 0.85, 0.65);
1526 legend->SetFillColor(0);
1527 legend->AddEntry(corrINEL, "correction to inelastic sample");
1528 legend->AddEntry(corrMB, "correction to minimum bias sample");
1532 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1535 void StatisticalUncertainty(Int_t methodType, Bool_t mc = kFALSE)
1537 gSystem->Load("libPWG0base");
1539 TFile::Open(correctionFile);
1540 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1541 mult->LoadHistograms("Multiplicity");
1543 TFile::Open(measuredFile);
1544 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1545 mult2->LoadHistograms("Multiplicity");
1547 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1549 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
1551 TH1* errorResponse = (TH1*) mult->StatisticalUncertainty((AliMultiplicityCorrection::MethodType) methodType, etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kFALSE, kTRUE, ((mc) ? mcHist : 0))->Clone("errorResponse");
1553 TH1* errorMeasured = (TH1*) mult->StatisticalUncertainty((AliMultiplicityCorrection::MethodType) methodType, etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kTRUE, kFALSE, ((mc) ? mcHist : 0))->Clone("errorMeasured");
1554 TH1* errorBoth = (TH1*) mult->StatisticalUncertainty((AliMultiplicityCorrection::MethodType) methodType, etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kTRUE, kTRUE, ((mc) ? mcHist : 0))->Clone("errorBoth");
1558 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
1559 DrawResultRatio(mcHist, result, "StatisticalUncertainty2.eps");
1562 TCanvas* canvas = new TCanvas("StatisticalUncertainty", "StatisticalUncertainty", 600, 400);
1565 canvas->SetRightMargin(0.05);
1566 canvas->SetTopMargin(0.05);
1568 errorResponse->SetLineColor(1);
1569 errorResponse->GetXaxis()->SetRangeUser(0, 200);
1570 errorResponse->GetYaxis()->SetRangeUser(0, 0.3);
1571 errorResponse->SetStats(kFALSE);
1572 errorResponse->SetTitle(";true multiplicity;Uncertainty");
1574 errorResponse->Draw();
1576 errorMeasured->SetLineColor(2);
1577 errorMeasured->Draw("SAME");
1579 errorBoth->SetLineColor(4);
1580 errorBoth->Draw("SAME");
1582 Printf("Average errorResponse: %f", errorResponse->Integral(2, 150) / 149);
1583 Printf("Average errorMeasured: %f", errorMeasured->Integral(2, 150) / 149);
1584 Printf("Average errorBoth: %f", errorBoth->Integral(2, 150) / 149);
1586 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1588 TFile* file = new TFile(Form("%s.root", canvas->GetName()), "RECREATE");
1589 errorResponse->Write();
1590 errorMeasured->Write();
1595 void StatisticalUncertaintyCompare(const char* det = "SPD")
1597 TFile* file1 = TFile::Open(Form("StatisticalUncertainty%sBayesian.root", det));
1598 TH1* errorResponse = (TH1*) file1->Get("errorResponse");
1599 TH1* errorMeasured = (TH1*) file1->Get("errorMeasured");
1600 TH1* errorBoth = (TH1*) file1->Get("errorBoth");
1603 str.Form("StatisticalUncertaintyCompare%s", det);
1605 TCanvas* canvas = new TCanvas(str, str, 600, 400);
1608 canvas->SetRightMargin(0.05);
1609 canvas->SetTopMargin(0.05);
1611 errorResponse->SetLineColor(1);
1612 errorResponse->GetXaxis()->SetRangeUser(1, (strcmp(det, "TPC") ? 200 : 100));
1613 errorResponse->GetYaxis()->SetRangeUser(0, 0.3);
1614 errorResponse->SetStats(kFALSE);
1615 errorResponse->GetYaxis()->SetTitleOffset(1.2);
1616 errorResponse->SetTitle(";true multiplicity;#sigma(U-T)/T");
1618 errorResponse->Draw();
1620 errorMeasured->SetLineColor(2);
1621 errorMeasured->Draw("SAME");
1623 errorBoth->SetLineColor(4);
1624 errorBoth->Draw("SAME");
1626 TFile* file2 = TFile::Open(Form("StatisticalUncertainty%sChi2.root", det));
1627 TH1* errorBoth2 = (TH1*) file2->Get("errorBoth");
1629 errorBoth2->SetLineColor(4);
1630 errorBoth2->SetLineStyle(2);
1631 errorBoth2->Draw("SAME");
1633 TLegend* legend = new TLegend(0.2, 0.6, 0.6, 0.9);
1634 legend->SetFillColor(0);
1635 legend->AddEntry(errorResponse, "response matrix (Bayesian)");
1636 legend->AddEntry(errorMeasured, "measured (Bayesian)");
1637 legend->AddEntry(errorBoth, "both (Bayesian)");
1638 legend->AddEntry(errorBoth2, "both (#chi^{2} minimization)");
1641 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1644 void EfficiencyComparison(Int_t eventType = 2, Bool_t uncertainty = kTRUE)
1646 const char* files[] = { "multiplicityMC_400k_syst_nd.root", "multiplicityMC_400k_syst_sd.root", "multiplicityMC_400k_syst_dd.root", "multiplicityMC_400k_syst_xsection.root" };
1648 gSystem->Load("libPWG0base");
1650 TCanvas* canvas = new TCanvas("EfficiencyComparison", "EfficiencyComparison", 800, 500);
1653 canvas->SetRightMargin(0.05);
1654 canvas->SetTopMargin(0.05);
1656 AliMultiplicityCorrection* data[4];
1659 Int_t markers[] = { 24, 25, 26, 5 };
1660 Int_t colors[] = { 1, 2, 3, 4 };
1662 TLegend* legend = new TLegend(0.45, 0.45, 0.9, 0.7);
1663 legend->SetFillColor(0);
1667 for (Int_t i=0; i<4; ++i)
1670 name.Form("Multiplicity_%d", i);
1672 TFile::Open(files[i]);
1673 data[i] = new AliMultiplicityCorrection(name, name);
1677 data[i]->LoadHistograms("Multiplicity");
1680 data[i]->LoadHistograms("Multiplicity_0");
1682 TH1* eff = (TH1*) data[i]->GetEfficiency(etaRange, (AliMultiplicityCorrection::EventType) eventType)->Clone(Form("eff_%d", i));
1685 eff->GetXaxis()->SetRangeUser(0, 15);
1686 eff->GetYaxis()->SetRangeUser(0, 1.1);
1687 eff->SetStats(kFALSE);
1688 eff->SetTitle(";true multiplicity;Efficiency");
1689 eff->SetLineColor(colors[i]);
1690 eff->SetMarkerColor(colors[i]);
1691 eff->SetMarkerStyle(markers[i]);
1695 for (Int_t bin=1; bin<=eff->GetNbinsX(); bin++)
1696 eff->SetBinError(bin, 0);
1698 // loop over cross section combinations
1699 for (Int_t j=1; j<7; ++j)
1701 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multtmp", "Multtmp");
1702 mult->LoadHistograms(Form("Multiplicity_%d", j));
1704 TH1* eff2 = mult->GetEfficiency(etaRange, (AliMultiplicityCorrection::EventType) eventType);
1706 for (Int_t bin=1; bin<=eff->GetNbinsX(); bin++)
1708 // TODO we could also do asymmetric errors here
1709 Float_t deviation = TMath::Abs(eff->GetBinContent(bin) - eff2->GetBinContent(bin));
1711 eff->SetBinError(bin, TMath::Max(eff->GetBinError(bin), (Double_t) deviation));
1715 for (Int_t bin=1; bin<=20; bin++)
1716 if (eff->GetBinContent(bin) > 0)
1717 Printf("Bin %d: Error: %.2f", bin, 100.0 * eff->GetBinError(bin) / eff->GetBinContent(bin));
1720 effError = (TH1*) eff->Clone("effError");
1723 for (Int_t bin=2; bin<=eff->GetNbinsX(); bin++)
1724 if (eff->GetBinContent(bin) > 0)
1725 effError->SetBinContent(bin, 10.0 * eff->GetBinError(bin) / eff->GetBinContent(bin));
1727 effError->SetLineColor(1);
1728 effError->SetMarkerStyle(1);
1729 effError->DrawCopy("SAME HIST");
1733 eff->SetBinContent(1, 0);
1734 eff->SetBinError(1, 0);
1742 eff->DrawCopy("SAME P");
1744 legend->AddEntry(eff, (((i == 0) ? "non diffractive" : ((i == 1) ? "single diffractive" : ((i == 2) ? "double diffractive" : "Pythia combined")))));
1748 legend->AddEntry(effError, "relative syst. uncertainty #times 10");
1752 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1755 void ModelDependencyPlot()
1757 gSystem->Load("libPWG0base");
1759 TFile::Open("multiplicityMC_3M.root");
1760 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1761 mult->LoadHistograms("Multiplicity");
1763 TH2* proj = (TH2*) mult->GetCorrelation(3)->Project3D("zy");
1765 TCanvas* canvas = new TCanvas("ModelDependencyPlot", "ModelDependencyPlot", 800, 400);
1768 //canvas->SetRightMargin(0.05);
1769 //canvas->SetTopMargin(0.05);
1771 canvas->Divide(2, 1);
1776 Int_t selectedMult = 30;
1777 Int_t yMax = 200000;
1779 TH1* full = proj->ProjectionX("full");
1780 TH1* selected = proj->ProjectionY("selected", proj->GetXaxis()->FindBin(selectedMult), proj->GetXaxis()->FindBin(selectedMult));
1782 full->SetStats(kFALSE);
1783 full->GetXaxis()->SetRangeUser(0, 200);
1784 full->GetYaxis()->SetRangeUser(5, yMax);
1785 full->SetTitle(";multiplicity");
1787 selected->SetLineColor(0);
1788 selected->SetMarkerColor(2);
1789 selected->SetMarkerStyle(7);
1792 selected->Draw("SAME P");
1794 TLegend* legend = new TLegend(0.5, 0.65, 0.85, 0.85);
1795 legend->SetFillColor(0);
1796 legend->AddEntry(full, "true");
1797 legend->AddEntry(selected, "measured");
1800 TLine* line = new TLine(selectedMult, 5, selectedMult, yMax);
1801 line->SetLineWidth(2);
1807 full = proj->ProjectionY("full2");
1808 selected = proj->ProjectionX("selected2", proj->GetYaxis()->FindBin(selectedMult), proj->GetYaxis()->FindBin(selectedMult));
1810 full->SetStats(kFALSE);
1811 full->GetXaxis()->SetRangeUser(0, 200);
1812 full->GetYaxis()->SetRangeUser(5, yMax);
1813 full->SetTitle(";multiplicity");
1815 full->SetLineColor(0);
1816 full->SetMarkerColor(2);
1817 full->SetMarkerStyle(7);
1820 selected->Draw("SAME");
1824 line = new TLine(selectedMult, 5, selectedMult, yMax);
1825 line->SetLineWidth(2);
1828 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
1831 void SystematicpTSpectrum()
1833 gSystem->Load("libPWG0base");
1835 TFile::Open("multiplicityMC_400k_syst_ptspectrum.root");
1836 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1837 mult->LoadHistograms("Multiplicity");
1839 TFile::Open("multiplicityMC_100k_syst.root");
1840 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1841 mult2->LoadHistograms("Multiplicity");
1843 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1844 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1845 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
1847 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
1848 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
1850 DrawResultRatio(mcHist, result, "SystematicpTSpectrum.eps");
1854 /*void covMatrix(Bool_t mc = kTRUE)
1856 gSystem->Load("libPWG0base");
1858 TFile::Open(correctionFile);
1859 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1860 mult->LoadHistograms("Multiplicity");
1862 TFile::Open(measuredFile);
1863 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
1864 mult2->LoadHistograms("Multiplicity");
1866 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
1868 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
1870 mult->BayesianStatisticsEffect(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, kTRUE, kTRUE, 1, 100, ((mc) ? mcHist : 0));
1873 Double_t FitPtFunc(Double_t *x, Double_t *par)
1877 Float_t val1 = par[1] + par[2] * xx + par[3] * xx * xx;
1878 Float_t val2 = TMath::Exp(par[4] + par[5] * xx);
1880 const Float_t kTransitionWidth = 0;
1883 if (xx < par[0] - kTransitionWidth)
1887 /*else if (xx < par[0] + kTransitionWidth)
1889 // smooth transition
1890 Float_t factor = (xx - par[0] + kTransitionWidth) / kTransitionWidth / 2;
1891 return (1 - factor) * val1 + factor * val2;
1899 void FitPtNew(const char* fileName = "TruePt14TeV.root")
1901 gSystem->Load("libANALYSIS");
1902 gSystem->Load("libPWG0base");
1904 TFile::Open(fileName);
1906 TH1* genePt = (TH1*) gFile->Get("fHistPt");
1909 // normalize by bin width
1910 for (Int_t x=1; x<genePt->GetNbinsX(); x++)
1911 genePt->SetBinContent(x, genePt->GetBinContent(x) / genePt->GetBinWidth(x));
1913 genePt->GetXaxis()->SetRangeUser(0.05, 2.0);
1915 genePt->Scale(1.0 / genePt->Integral());
1917 TF1* func = new TF1("func", "[0]*TMath::Exp([1]*x*x)", 0.001, 100);
1918 //func->SetLineColor(2);
1919 func->SetParameters(1, -1);
1921 genePt->SetMarkerStyle(25);
1922 genePt->SetTitle("");
1923 genePt->SetStats(kFALSE);
1924 genePt->GetYaxis()->SetRangeUser(1e-4, genePt->GetMaximum() * 1.2);
1925 //func->Draw("SAME");
1927 genePt->Fit(func, "0", "", 0.05, 1);
1930 genePt->DrawCopy("P");
1931 func->SetRange(0.02, 8);
1932 func->DrawCopy("SAME");
1936 void FitPt(const char* fileName = "firstplots100k_truept.root")
1938 gSystem->Load("libPWG0base");
1940 TFile::Open(fileName);
1943 // merge corrections
1944 AliCorrection* correction[4];
1947 for (Int_t i=0; i<4; ++i)
1949 Printf("correction %d", i);
1951 TString name; name.Form("correction_%d", i);
1952 correction[i] = new AliCorrection(name, name);
1953 correction[i]->LoadHistograms();
1956 list.Add(correction[i]);
1959 correction[0]->Merge(&list);
1961 TH3* gene = correction[0]->GetTrackCorrection()->GetGeneratedHistogram();
1963 // limit vtx, eta axis
1964 gene->GetXaxis()->SetRangeUser(-5.9, 5.9);
1965 gene->GetYaxis()->SetRangeUser(-1.99, 0.99);
1967 TH1* genePt = gene->Project3D("z");*/
1968 TH1* genePt = (TH1*) gFile->Get("fdNdpTTrue");
1970 genePt = (TH1*) gFile->Get("fHistPt");
1974 //genePt->Scale(1.0 / genePt->Integral());
1976 // normalize by bin width
1977 for (Int_t x=1; x<genePt->GetNbinsX(); x++)
1978 genePt->SetBinContent(x, genePt->GetBinContent(x) / genePt->GetBinWidth(x));
1980 /// genePt->GetXaxis()->GetBinCenter(x));
1982 genePt->GetXaxis()->SetRangeUser(0, 7.9);
1983 //genePt->GetYaxis()->SetTitle("a.u.");
1985 //TF1* func = new TF1("func", "[0]*TMath::Exp([1]*x*x)", 0.001, 100);
1986 TF1* func = new TF1("func", "[0]*TMath::Exp([1]*x)+[2]/(1+(x*[4])**[3])", 0.001, 100);
1987 //func->SetLineColor(2);
1988 func->SetParameters(1, -1, 1, 1, 1);
1989 func->SetParLimits(3, 1, 10);
1990 func->SetParLimits(4, 0, 10);
1992 //TF1* func = new TF1("func", "[1]*x**[0]", 0.001, 100);
1994 //TF1* func = new TF1("func", &FitPtFunc, 0, 2, 6);
1995 //func->SetParameters(0.3, -2.34909e-01, 1.54394e+01, -3.04134e+01, 1.41912e+00, -2.79284e+00);
1996 //func->FixParameter(0, 0.314);
1997 //func->SetParLimits(0, 0.1, 0.3);
1999 genePt->SetMarkerStyle(25);
2000 genePt->SetTitle("");
2001 genePt->SetStats(kFALSE);
2002 genePt->GetYaxis()->SetRangeUser(1e-4, genePt->GetMaximum() * 1.2);
2003 //func->Draw("SAME");
2005 // fit only exp. part
2006 func->SetParameters(1, -1);
2007 func->FixParameter(2, 0);
2008 func->FixParameter(3, 1);
2009 func->FixParameter(4, 1);
2010 genePt->Fit(func, "0", "", 0.2, 1);
2013 genePt->DrawCopy("P");
2014 func->SetRange(0.02, 8);
2015 func->DrawCopy("SAME");
2018 // now fix exp. parameters and fit second part
2019 Double_t param0 = func->GetParameter(0);
2020 Double_t param1 = func->GetParameter(1);
2021 func->SetParameters(0, -1, 1, 1, 1);
2022 func->FixParameter(0, 0);
2023 func->FixParameter(1, -1);
2024 func->ReleaseParameter(2);
2025 func->ReleaseParameter(3);
2026 func->ReleaseParameter(4);
2027 func->SetParLimits(3, 1, 10);
2028 func->SetParLimits(4, 0, 10);
2030 genePt->Fit(func, "0", "", 1.5, 4);
2033 genePt->DrawCopy("P");
2034 func->SetRange(0.02, 8);
2035 func->DrawCopy("SAME");
2039 func->SetParameter(0, param0);
2040 func->SetParameter(1, param1);
2041 func->ReleaseParameter(0);
2042 func->ReleaseParameter(1);
2045 genePt->DrawCopy("P");
2046 func->SetRange(0.02, 5);
2047 func->DrawCopy("SAME");
2050 genePt->Fit(func, "0", "", 0.2, 4);
2052 TCanvas* canvas = new TCanvas("FitPt", "FitPt", 800, 400);
2053 canvas->Divide(2, 1);
2058 gPad->SetLeftMargin(0.13);
2059 gPad->SetRightMargin(0.05);
2060 gPad->SetTopMargin(0.05);
2062 genePt->GetXaxis()->SetRangeUser(0, 4.9);
2063 genePt->GetYaxis()->SetRangeUser(1e-2, 1e4);
2064 genePt->GetYaxis()->SetTitleOffset(1.4);
2065 genePt->GetXaxis()->SetTitleOffset(1.1);
2066 genePt->DrawCopy("P");
2067 func->SetRange(0.02, 5);
2068 func->DrawCopy("SAME");
2073 TH1* genePtClone = (TH1*) genePt->Clone("genePtClone");
2074 genePtClone->Reset();
2075 genePtClone->DrawCopy("P");
2079 gPad->SetLeftMargin(0.13);
2080 gPad->SetRightMargin(0.05);
2081 gPad->SetTopMargin(0.05);
2083 func->DrawCopy("SAME");
2086 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
2088 TH1* first = (TH1*) func->GetHistogram()->Clone("first");
2090 TCanvas* canvas2 = new TCanvas("FitPt2", "FitPt2", 600, 400);
2092 TFile* file = TFile::Open("ptspectrum_fit.root", "RECREATE");
2094 for (Int_t param=0; param<5; param++)
2096 for (Int_t sign=0; sign<2; sign++)
2098 TF1* func2 = (TF1*) func->Clone(Form("func_%d_%d", param, sign)); // new TF1(Form("func_%d_%d", param, sign), &FitPtFunc, 0, 2, 6);
2099 func2->SetParameters(func->GetParameters());
2100 //TF1* func2 = (TF1*) func->Clone(); // SetParameter after this does not work
2102 Float_t factor = ((sign == 0) ? 0.9 : 1.1);
2103 func2->SetParameter(param, func2->GetParameter(param) * factor);
2107 func2->SetLineWidth(1);
2108 func2->SetLineColor(2);
2109 func2->DrawCopy("SAME");
2112 TH1* second = func2->GetHistogram();
2113 second->Divide(first);
2114 second->SetLineColor(param + 1);
2115 second->GetYaxis()->SetRangeUser(0, 2);
2116 second->DrawCopy((param == 0 && sign == 0) ? "" : "SAME");
2117 second->Clone(Form("ptspectrum_%d_%d", param, sign))->Write();
2121 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
2122 canvas2->SaveAs(Form("%s.eps", canvas2->GetName()));
2127 void DrawSystematicpT()
2129 TFile* file = TFile::Open("SystematicpT.root");
2131 TH1* mcHist2 = (TH1*) file->Get("mymc_unity");
2132 TH1* result2 = (TH1*) file->Get("result_unity");
2139 for (Int_t id=0; id<nParams*2; ++id)
2141 mcHist[id] = (TH1*) file->Get(Form("mymc_%d_%d.root", id / 2, id % 2));
2142 result[id] = (TH1*) file->Get(Form("result_%d_%d.root", id / 2, id % 2));
2145 DrawResultRatio(mcHist2, result2, "SystematicpT_OK.eps");
2147 //DrawRatioDeduct(mcHist2, result2, nParams*2, mcHist, result, "SystematicpT_Summary.eps");
2149 DrawRatio(nParams*2, mcHist, result, "SystematicpT_Ratios.eps", kTRUE, kTRUE);
2151 //DrawRatioDeductSmooth(mcHist2, result2, nParams*2, mcHist, result, "SystematicpT_Summary.eps");
2153 // does not make sense: mc is different
2154 //Draw2ResultRatio(mcHist, result1, result2, "SystematicpT.eps");
2157 void SystematicpT(Bool_t chi2 = 1)
2159 gSystem->Load("libPWG0base");
2161 TFile::Open("ptspectrum900.root");
2162 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2163 mult->LoadHistograms("Multiplicity");
2165 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
2172 for (Int_t param=0; param<nParams; param++)
2174 for (Int_t sign=0; sign<2; sign++)
2176 // calculate result with systematic effect
2177 TFile::Open(Form("ptspectrum100_%d_%d.root", param, sign));
2178 mult2->LoadHistograms("Multiplicity");
2180 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
2184 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
2185 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
2188 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100, 0);
2190 Int_t id = param * 2 + sign;
2192 mcHist[id] = mult2->GetMultiplicityVtx(etaRange)->ProjectionY(Form("mymc_%d_%d.root", param, sign));
2193 result[id] = (TH1*) mult->GetMultiplicityESDCorrected(etaRange)->Clone(Form("result_%d_%d.root", param, sign));
2195 TString tmp; tmp.Form("SystematicpT_%d_%d.eps", param, sign);
2196 DrawResultRatio(mcHist[id], result[id], tmp);
2200 // calculate normal result
2201 TFile::Open("ptspectrum100_1.root");
2202 mult2->LoadHistograms("Multiplicity");
2203 TH1* mcHist2 = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc_unity");
2205 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
2209 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
2212 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100);
2214 TH1* result2 = (TH1*) mult->GetMultiplicityESDCorrected(etaRange)->Clone("result_unity");
2216 TFile* file = TFile::Open("SystematicpT.root", "RECREATE");
2219 for (Int_t id=0; id<nParams*2; ++id)
2221 mcHist[id]->Write();
2222 result[id]->Write();
2229 void DrawSystematicpT2()
2231 //displayRange = 200;
2234 TFile* file = TFile::Open("SystematicpT2.root");
2235 TH1* mcHist = (TH1*) file->Get("mymc");
2237 result[0] = (TH1*) file->Get("result_unity");
2239 for (Int_t id=0; id<nParams*2; ++id)
2240 result[id+1] = (TH1*) file->Get(Form("result_%d_%d", id / 2, id % 2));
2242 DrawResultRatio((TH1*) mcHist->Clone(), (TH1*) result[0]->Clone(), "SystematicpT_OK.eps");
2243 DrawRatio(mcHist, nParams*2+1, result, "SystematicpT_Ratios_MC.eps", kTRUE);
2244 DrawRatio(result[0], nParams*2, result+1, "SystematicpT_Ratios.eps");
2247 void SystematicpT2(Bool_t tpc = kTRUE, Bool_t chi2 = kTRUE)
2249 gSystem->Load("libPWG0base");
2254 TFile::Open("multiplicityMC_TPC_0.6M_syst_pt_unity.root");
2257 TFile::Open("ptspectrum100_1.root");
2259 AliMultiplicityCorrection* measured = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2260 measured->LoadHistograms("Multiplicity");
2261 TH1* mcHist = measured->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
2267 // -1 = unity change, 0...4 parameters
2268 for (Int_t id=-1; id<nParams*2; id++)
2270 Int_t param = id / 2;
2271 Int_t sign = id % 2;
2279 idStr.Form("%d_%d", param, sign);
2281 // calculate result with systematic effect
2284 TFile::Open(Form("multiplicityMC_TPC_1.3M_syst_pt_%s.root", idStr.Data()));
2287 TFile::Open(Form("ptspectrum900_%s.root", idStr.Data()));
2289 AliMultiplicityCorrection* response = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
2290 response->LoadHistograms("Multiplicity");
2292 response->SetMultiplicityESD(etaRange, measured->GetMultiplicityESD(etaRange));
2296 response->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
2297 response->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
2300 response->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100, 0);
2302 result[id+1] = (TH1*) response->GetMultiplicityESDCorrected(etaRange)->Clone(Form("result_%s", idStr.Data()));
2304 TString tmp; tmp.Form("SystematicpT_%s.eps", idStr.Data());
2305 DrawResultRatio(mcHist, result[id+1], tmp);
2308 TFile* file = TFile::Open("SystematicpT2.root", "RECREATE");
2310 for (Int_t id=0; id<nParams*2+1; ++id)
2311 result[id]->Write();
2314 DrawSystematicpT2();
2317 void SystematicpTCutOff(Bool_t chi2 = kTRUE)
2319 // only needed for TPC
2322 gSystem->Load("libPWG0base");
2324 TFile::Open("multiplicityMC_TPC_1.3M_syst_pt_unity.root");
2325 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2326 mult->LoadHistograms("Multiplicity");
2328 TFile::Open("multiplicityMC_TPC_0.6M_syst_pt_unity.root");
2329 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
2330 mult2->LoadHistograms("Multiplicity");
2333 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
2337 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
2338 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
2341 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100);
2343 TH1* mcHist = mult2->GetMultiplicityVtx(etaRange)->ProjectionY("mymc");
2344 TH1* result1 = (TH1*) mult->GetMultiplicityESDCorrected(etaRange)->Clone("result1");
2348 // change of pt spectrum (down)
2349 TFile::Open("multiplicityMC_TPC_1.3M_syst_pt_red.root");
2350 AliMultiplicityCorrection* mult3 = new AliMultiplicityCorrection("Multiplicity3", "Multiplicity3");
2351 mult3->LoadHistograms("Multiplicity");
2352 mult3->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
2355 mult3->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
2356 mult3->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
2359 mult3->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100);
2360 syst[0] = (TH1*) mult3->GetMultiplicityESDCorrected(etaRange)->Clone("result2");
2362 // change of pt spectrum (up)
2363 TFile::Open("multiplicityMC_TPC_1.3M_syst_pt_inc.root");
2364 AliMultiplicityCorrection* mult4 = new AliMultiplicityCorrection("Multiplicity4", "Multiplicity4");
2365 mult4->LoadHistograms("Multiplicity");
2366 mult4->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
2369 mult4->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
2370 mult4->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx);
2373 mult4->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100);
2374 syst[1] = (TH1*) mult4->GetMultiplicityESDCorrected(etaRange)->Clone("result3");
2376 DrawRatio(result1, 2, syst, "SystematicpTCutOff.eps", kFALSE, 0, kTRUE);
2378 Draw2ResultRatio(mcHist, result1, syst[0], "SystematicpTCutOff1.eps");
2379 Draw2ResultRatio(mcHist, result1, syst[1], "SystematicpTCutOff2.eps");
2382 TH1* SystematicsSummary(Bool_t tpc = 1)
2387 const char** names = 0;
2388 Int_t colors[] = { 1, 2, 3, 4, 6, 7, 8 };
2389 Int_t markers[] = { 20, 21, 22, 23, 24, 25, 26 };
2391 for (Int_t i=0; i<nEffects; ++i)
2392 effects[i] = new TH1F("SystematicsSummary", ";true multiplicity;Effect", 201, -0.5, 200.5);
2398 const char* namesTPC[] = { "Unfolding method (#chi^{2})", "Rel. cross-section", "Particle composition", "p_{t} cut off", "Track selection", "Secondaries", "p_{t} spectrum" };
2402 TFile* file = TFile::Open("StatisticalUncertaintyTPCChi2.root");
2403 TH1* hist = (TH1*) file->Get("errorBoth");
2405 // smooth a bit, but skip 0 bin
2406 effects[0]->SetBinContent(2, hist->GetBinContent(2));
2407 for (Int_t i=3; i<=200; ++i)
2408 effects[0]->SetBinContent(i, (hist->GetBinContent(i) + hist->GetBinContent(i+1)) / 2);
2410 // relative x-section
2411 effects[1]->SetBinContent(2, 0.005);
2412 effects[1]->SetBinContent(3, 0.0025);
2413 effects[1]->SetBinContent(4, 0.0025);
2415 // particle composition
2416 for (Int_t i=2; i<=101; ++i)
2420 effects[2]->SetBinContent(i, 0.01);
2424 effects[2]->SetBinContent(i, 0.02);
2427 effects[2]->SetBinContent(i, 0.02 + 0.08 / 25 * (i - 76));
2430 // pt cut off (only tpc)
2431 for (Int_t i=2; i<=101; ++i)
2435 effects[3]->SetBinContent(i, 0.05);
2439 effects[3]->SetBinContent(i, 0.01);
2442 effects[3]->SetBinContent(i, 0.01 + 0.1 / 30 * (i - 51));
2445 // track selection (only tpc)
2446 for (Int_t i=2; i<=101; ++i)
2447 effects[4]->SetBinContent(i, 0.03);
2450 for (Int_t i=2; i<=101; ++i)
2451 effects[5]->SetBinContent(i, 0.01);
2454 for (Int_t i=2; i<=101; ++i)
2458 effects[6]->SetBinContent(i, 0.05);
2462 effects[6]->SetBinContent(i, 0.02);
2465 effects[6]->SetBinContent(i, 0.02 + 0.13 / 25 * (i - 51));
2474 const char* namesSPD[] = { "Unfolding Method (#chi^{2})", "Rel. cross-section", "Particle composition", "Secondaries", "p_{t} spectrum"};
2478 TFile* file = TFile::Open("StatisticalUncertaintySPDChi2.root");
2479 TH1* hist = (TH1*) file->Get("errorBoth");
2481 // smooth a bit, but skip 0 bin
2482 effects[0]->SetBinContent(2, hist->GetBinContent(2));
2483 for (Int_t i=3; i<=201; ++i)
2484 effects[0]->SetBinContent(i, (hist->GetBinContent(i) + hist->GetBinContent(i+1)) / 2);
2486 // relative x-section
2487 effects[1]->SetBinContent(2, 0.01);
2488 effects[1]->SetBinContent(3, 0.005);
2490 // particle composition
2491 for (Int_t i=2; i<=201; ++i)
2495 effects[2]->SetBinContent(i, 0.3);
2499 effects[2]->SetBinContent(i, 0.05);
2503 effects[2]->SetBinContent(i, 0.02);
2507 effects[2]->SetBinContent(i, 0.02 + 0.04 / 30 * (i - 121));
2510 effects[2]->SetBinContent(i, 0.06 + 0.1 / 30 * (i - 151));
2514 for (Int_t i=2; i<=201; ++i)
2515 effects[3]->SetBinContent(i, 0.01);
2518 for (Int_t i=2; i<=201; ++i)
2522 effects[4]->SetBinContent(i, 1);
2526 effects[4]->SetBinContent(i, 0.03);
2530 effects[4]->SetBinContent(i, 0.03 + 0.07 / 30 * (i - 121));
2533 effects[4]->SetBinContent(i, 0.1);
2537 TCanvas* canvas = new TCanvas("SystematicsSummary.eps", "SystematicsSummary.eps", 800, 400);
2538 canvas->SetRightMargin(0.25);
2539 canvas->SetTopMargin(0.05);
2540 TLegend* legend = new TLegend(0.2, 0.4, 0.5, 0.4 + 0.5 * nEffects / 7);
2541 legend->SetFillColor(0);
2543 for (Int_t i=0; i<nEffects; ++i)
2545 TH1* current = (TH1*) effects[i]->Clone(Form("current_%d", i));
2547 for (Int_t j=0; j<nEffects-i; ++j)
2548 current->Add(effects[j]);*/
2550 current->SetLineColor(colors[i]);
2551 //current->SetFillColor(colors[i]);
2552 current->SetMarkerColor(colors[i]);
2553 //current->SetMarkerStyle(markers[i]);
2555 current->SetStats(kFALSE);
2556 current->GetYaxis()->SetRangeUser(0, 0.4);
2557 current->GetXaxis()->SetRangeUser(0, displayRange);
2558 current->DrawCopy(((i == 0) ? "" : "SAME"));
2559 legend->AddEntry(current, names[i]);
2561 TLatex* text = new TLatex(displayRange+5, current->GetBinContent(displayRange+1), names[i]);
2562 text->SetTextColor(colors[i]);
2566 // add total in square
2567 TH1* total = (TH1*) effects[0]->Clone("total");
2570 for (Int_t i=0; i<nEffects; ++i)
2572 //Printf("%d %f", i, effects[i]->GetBinContent(20));
2573 effects[i]->Multiply(effects[i]);
2574 total->Add(effects[i]);
2577 for (Int_t i=1; i<=total->GetNbinsX(); ++i)
2578 if (total->GetBinContent(i) > 0)
2579 total->SetBinContent(i, TMath::Min(sqrt(total->GetBinContent(i)), 1.0));
2581 //Printf("%f", total->GetBinContent(20));
2583 total->SetMarkerStyle(3);
2584 total->SetMarkerColor(1);
2585 legend->AddEntry(total, "total");
2586 total->DrawCopy("SAME P");
2590 canvas->SaveAs(canvas->GetName());
2595 void finalPlot(Bool_t tpc = kTRUE, Bool_t chi2 = kTRUE, Bool_t small = kFALSE)
2597 gSystem->Load("libPWG0base");
2603 Printf("WARNING: Bayesian set. This is only for test!");
2606 TH1* error = SystematicsSummary(tpc);
2608 TFile::Open(correctionFile);
2609 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2610 mult->LoadHistograms("Multiplicity");
2612 TFile::Open(measuredFile);
2613 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity2", "Multiplicity2");
2614 mult2->LoadHistograms("Multiplicity");
2616 mult->SetMultiplicityESD(etaRange, mult2->GetMultiplicityESD(etaRange));
2620 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
2621 mult->ApplyMinuitFit(etaRange, kFALSE, AliMultiplicityCorrection::kINEL);
2624 mult->ApplyBayesianMethod(etaRange, kFALSE, AliMultiplicityCorrection::kINEL, 1, 100, 0, kFALSE);
2626 TH1* mcHist = mult2->GetMultiplicityINEL(etaRange)->ProjectionY("mymc");
2627 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
2629 DrawResultRatio(mcHist, result, "finalPlotCheck.eps");
2632 result->Scale(1.0 / result->Integral(2, 200));
2634 result->GetXaxis()->SetRangeUser(0, ((tpc) ? displayRange : 200));
2635 result->SetBinContent(1, 0); result->SetBinError(1, 0);
2636 result->SetTitle(";true multiplicity;Probability");
2637 result->SetLineColor(1);
2638 result->SetStats(kFALSE);
2640 TH1* systError = (TH1*) result->Clone("systError");
2641 for (Int_t i=2; i<=systError->GetNbinsX(); ++i)
2642 systError->SetBinError(i, systError->GetBinContent(i) * error->GetBinContent(i));
2644 // change error drawing style
2645 systError->SetFillColor(15);
2647 TCanvas* canvas = new TCanvas("finalPlot.eps", "finalPlot.eps", (small) ? 600 : 800, 400);
2648 canvas->SetRightMargin(0.05);
2649 canvas->SetTopMargin(0.05);
2651 systError->Draw("E2 ][");
2652 result->DrawCopy("SAME E ][");
2655 //TPaveText* text = new TPaveText(10, 1e-3, 50, 1e-4, "B");
2656 TPaveText* text = new TPaveText(0.15, 0.2, 0.5, 0.4, "B NDC");
2657 text->SetFillColor(0);
2658 text->SetTextAlign(12);
2659 text->AddText("Systematic errors summed quadratically");
2660 text->AddText("0.6 million minimum bias events");
2661 text->AddText("corrected to inelastic events");
2664 TPaveText* text2 = new TPaveText(0.4, 0.7, 0.6, 0.85, "B NDC");
2665 text2->SetFillColor(0);
2666 text2->SetTextAlign(12);
2667 text2->AddText("#sqrt{s} = 14 TeV");
2670 text2->AddText("|#eta| < 0.9");
2673 text2->AddText("|#eta| < 2.0");
2674 text2->AddText("simulated data (PYTHIA)");
2679 TText* text3 = new TText(0.75, 0.6, "TPC - full tracking");
2685 TText* text3 = new TText(0.75, 0.6, "SPD - Tracklets");
2691 TPad* pad = new TPad("pad", "pad", 0.8, 0.7, 0.9, 0.9);
2694 TImage* img = TImage::Open("$HOME/alice.png");
2695 img->SetImageQuality(TAttImage::kImgBest);
2700 /* TText* text = new TText(10, 1e-4, "Systematic errors summed quadratically");
2701 text->SetTextSize(0.04);
2702 text->DrawText(10, 5e-5, "0.6 #cdot 10^{6} minimum bias events");
2703 text->DrawText(10, 3e-5, "TPC tracks in |#eta| < 0.9");
2704 text->DrawText(10, 1e-5, "corrected to ineleastic events in |#eta| < 0.9");
2708 canvas->SaveAs(canvas->GetName());
2711 void BlobelUnfoldingExample()
2713 const Int_t kSize = 20;
2715 TMatrixD matrix(kSize, kSize);
2716 for (Int_t x=0; x<kSize; x++)
2718 for (Int_t y=0; y<kSize; y++)
2722 if (x == 0 || x == kSize -1)
2724 matrix(x, y) = 0.75;
2729 else if (TMath::Abs(x - y) == 1)
2731 matrix(x, y) = 0.25;
2738 TMatrixD inverted(matrix);
2743 TH1F* inputDist = new TH1F("inputDist", ";t;#tilde{T}(t)", kSize, -0.5, (Float_t) kSize - 0.5);
2744 TVectorD inputDistVector(kSize);
2745 TH1F* unfolded = inputDist->Clone("unfolded");
2746 TH1F* measuredIdealDist = inputDist->Clone("measuredIdealDist");
2747 measuredIdealDist->SetTitle(";m;#tilde{M}(m)");
2748 TH1F* measuredDist = measuredIdealDist->Clone("measuredDist");
2750 TF1* gaus = new TF1("func", "gaus(0)", -0.5, kSize);
2751 // norm: 1/(sqrt(2pi)sigma)
2752 gaus->SetParameters(10000 / sqrt(2 * TMath::Pi()) / ((Float_t) kSize / 8), (Float_t) kSize / 2, (Float_t) kSize / 8);
2755 for (Int_t x=1; x<=inputDist->GetNbinsX(); x++)
2757 Float_t value = gaus->Eval(inputDist->GetBinCenter(x));
2758 inputDist->SetBinContent(x, value);
2759 inputDistVector(x-1) = value;
2762 TVectorD measuredDistIdealVector = matrix * inputDistVector;
2764 for (Int_t x=1; x<=measuredIdealDist->GetNbinsX(); x++)
2765 measuredIdealDist->SetBinContent(x, measuredDistIdealVector(x-1));
2767 measuredDist->FillRandom(measuredIdealDist, 10000);
2769 // fill error matrix before scaling
2770 TMatrixD covarianceMatrixMeasured(kSize, kSize);
2771 for (Int_t x=1; x<=unfolded->GetNbinsX(); x++)
2772 covarianceMatrixMeasured(x-1, x-1) = TMath::Sqrt(measuredDist->GetBinContent(x));
2774 TMatrixD covarianceMatrix = inverted * covarianceMatrixMeasured * inverted;
2775 //covarianceMatrix.Print();
2777 TVectorD measuredDistVector(kSize);
2778 for (Int_t x=1; x<=measuredDist->GetNbinsX(); x++)
2779 measuredDistVector(x-1) = measuredDist->GetBinContent(x);
2781 TVectorD unfoldedVector = inverted * measuredDistVector;
2782 for (Int_t x=1; x<=unfolded->GetNbinsX(); x++)
2783 unfolded->SetBinContent(x, unfoldedVector(x-1));
2785 TCanvas* canvas = new TCanvas("BlobelUnfoldingExample", "BlobelUnfoldingExample", 1000, 500);
2786 canvas->SetTopMargin(0.05);
2787 canvas->Divide(2, 1);
2790 canvas->cd(1)->SetLeftMargin(0.15);
2791 canvas->cd(1)->SetRightMargin(0.05);
2792 measuredDist->GetYaxis()->SetTitleOffset(1.7);
2793 measuredDist->SetStats(0);
2794 measuredDist->DrawCopy();
2798 canvas->cd(2)->SetLeftMargin(0.15);
2799 canvas->cd(2)->SetRightMargin(0.05);
2800 unfolded->GetYaxis()->SetTitleOffset(1.7);
2801 unfolded->SetStats(0);
2802 unfolded->DrawCopy();
2805 canvas->SaveAs("BlobelUnfoldingExample.eps");
2810 TH1* fCurrentESD = new TH1F("mult", "mult", 501, -0.5, 500.5);
2811 fCurrentESD->Sumw2();
2813 // Open the input stream
2815 in.open("e735data.txt");
2822 //Printf("%f %f %f", x, y, ye);
2823 fCurrentESD->SetBinContent(fCurrentESD->FindBin(x), y);
2824 fCurrentESD->SetBinError(fCurrentESD->FindBin(x), ye);
2829 //new TCanvas; fCurrentESD->DrawCopy(); gPad->SetLogy();
2831 fCurrentESD->Scale(1.0 / fCurrentESD->Integral());
2833 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])");
2834 func->SetParNames("scaling", "averagen", "k");
2835 func->SetParLimits(0, 0.001, fCurrentESD->GetMaximum() * 1000);
2836 func->SetParLimits(1, 0.001, 1000);
2837 func->SetParLimits(2, 0.001, 1000);
2838 func->SetParameters(fCurrentESD->GetMaximum() * 100, 10, 2);
2840 TF1* lognormal = new TF1("lognormal", "[0]*exp(-(log(x)-[1])^2/(2*[2]^2))/(x*[2]*TMath::Sqrt(2*TMath::Pi()))", 0.01, 500);
2841 lognormal->SetParNames("scaling", "mean", "sigma");
2842 lognormal->SetParameters(1, 1, 1);
2843 lognormal->SetParLimits(0, 0, 10);
2844 lognormal->SetParLimits(1, 0, 100);
2845 lognormal->SetParLimits(2, 1e-3, 10);
2847 TCanvas* canvas = new TCanvas("c1", "c1", 700, 400);
2848 fCurrentESD->SetStats(kFALSE);
2849 fCurrentESD->GetYaxis()->SetTitleOffset(1.3);
2850 fCurrentESD->SetTitle(";true multiplicity (N);P_{N}");
2851 fCurrentESD->Draw("");
2852 fCurrentESD->GetXaxis()->SetRangeUser(0, 250);
2853 fCurrentESD->Fit(func, "0", "", 0, 150);
2854 func->SetRange(0, 250);
2856 printf("chi2 = %f\n", func->GetChisquare());
2858 fCurrentESD->Fit(lognormal, "0", "", 0.01, 150);
2859 lognormal->SetLineColor(2);
2860 lognormal->SetLineStyle(2);
2861 lognormal->SetRange(0, 250);
2862 lognormal->Draw("SAME");
2866 canvas->SaveAs("E735Fit.eps");