4 // script to correct the multiplicity spectrum + helpers
11 const Int_t kBinLimits[] = { 42, 57, 60 };
12 const Int_t kTrustLimits[] = { 26, 42, 54 };
15 //const Int_t kBinLimits[] = { 43, 67, 83 };
16 //const Int_t kTrustLimits[] = { 33, 57, 73 };
19 //const Int_t kBinLimits[] = { 60, 120, 60 };
20 //const Int_t kTrustLimits[] = { 26, 70, 54 };
24 gSystem->Load("libPWG0base");
25 AliMultiplicityCorrection::SetQualityRegions(kFALSE);
28 const char* GetMultLabel(Int_t etaR = -1, Bool_t trueM = kTRUE)
33 TString tmpStr((trueM) ? "True " : "Measured ");
37 tmpStr += "multiplicity (full phase space)";
40 tmpStr += Form("multiplicity in |#eta| < %.1f", (etaR+1)* 0.5);
41 return Form("%s", tmpStr.Data());
44 void draw(const char* fileName = "multiplicity.root", const char* folder = "Multiplicity")
48 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection(folder, folder);
50 TFile::Open(fileName);
51 mult->LoadHistograms();
52 mult->DrawHistograms();
54 TH2* hist = (TH2*) gROOT->FindObject("fCorrelation2_zy");
55 canvas = new TCanvas("c1", "c1", 600, 500);
56 canvas->SetTopMargin(0.05);
57 hist->SetStats(kFALSE);
59 hist->SetTitle(";true multiplicity in |#eta| < 1.5;measured multiplicity in |#eta| < 1.5");
60 hist->GetYaxis()->SetTitleOffset(1.1);
61 gPad->SetRightMargin(0.12);
64 canvas->SaveAs("responsematrix.eps");
69 gSystem->Load("libTree");
70 gSystem->Load("libVMC");
72 gSystem->Load("libSTEERBase");
73 gSystem->Load("libESD.so");
74 gSystem->Load("libAOD.so");
75 gSystem->Load("libANALYSIS");
76 gSystem->Load("libANALYSISalice");
77 gSystem->Load("libPWG0base");
80 void LoadAndInitialize(void* multVoid, void* esdVoid, void* multTriggerVoid, Int_t histID, Bool_t fullPhaseSpace, Int_t* geneLimits)
82 AliMultiplicityCorrection* mult = (AliMultiplicityCorrection*) multVoid;
83 AliMultiplicityCorrection* esd = (AliMultiplicityCorrection*) esdVoid;
84 AliMultiplicityCorrection* multTrigger = (AliMultiplicityCorrection*) multTriggerVoid;
86 for (Int_t i=0; i<3; i++)
87 geneLimits[i] = kBinLimits[i];
98 Double_t newBinsEta05[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
99 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
100 20.5, 22.5, 24.5, 26.5, 28.5, 30.5, 34.5, 38.5, 42.5, 50.5,
107 Double_t newBinsEta05[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
108 10.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
109 20.5, 22.5, 24.5, 26.5, 28.5, 30.5, 34.5, 38.5, 42.5, 50.5,
116 Double_t* newBinsEta05 = new Double_t[bins05+1];
118 //newBinsEta05[0] = -0.5;
119 //newBinsEta05[1] = 0.5;
120 //newBinsEta05[2] = 1.5;
121 //newBinsEta05[3] = 2.5;
123 for (Int_t i=0; i<bins05+1; i++)
124 newBinsEta05[i] = -0.5 + i*2;
125 //newBinsEta05[i] = 4.5 + (i-4)*2;
129 Double_t newBinsEta10[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
130 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
131 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5,
132 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, 39.5,
133 40.5, 42.5, 44.5, 46.5, 48.5, 50.5, 52.5, 54.5, 56.5, 58.5,
134 60.5, 65.5, 70.5, 100.5 };
136 geneLimits[0] = bins05;
137 geneLimits[1] = bins10;
138 geneLimits[2] = bins10;
145 Double_t newBinsEta05[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
146 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
147 20.5, 22.5, 24.5, 26.5, 28.5, 30.5, 32.5, 34.5, 36.5, 38.5,
148 40.5, 45.5, 50.5, 55.5, 60.5, 100.5 };
150 Double_t newBinsEta10[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
151 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
152 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5,
153 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, 39.5,
154 40.5, 42.5, 44.5, 46.5, 48.5, 50.5, 52.5, 54.5, 56.5, 58.5,
155 60.5, 62.5, 64.5, 66.5, 68.5, 70.5, 72.5, 74.5, 76.5, 78.5,
156 80.5, 85.5, 90.5, 100.5 };
158 geneLimits[0] = bins05;
159 geneLimits[1] = bins10;
160 geneLimits[2] = bins10;
164 if (!is900GeV && !is2360TeV)
167 Double_t newBinsEta05[] = { -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
168 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
169 20.5, 22.5, 24.5, 26.5, 28.5, 30.5, 32.5, 34.5, 36.5, 38.5,
170 40.5, 45.5, 50.5, 55.5, 60.5, 100.5 };
173 Double_t newBinsEta10[] = {
174 -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
175 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5,
176 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5,
177 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, 39.5,
178 40.5, 41.5, 42.5, 43.5, 44.5, 45.5, 46.5, 47.5, 48.5, 49.5,
179 50.5, 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5,
180 60.5, 62.5, 64.5, 66.5, 68.5, 70.5, 72.5, 74.5, 76.5, 78.5,
181 80.5, 82.5, 84.5, 86.5, 88.5, 90.5, 92.5, 94.5, 96.5, 98.5,
182 100.5, 105.5, 110.5, 115.5, 120.5 };
184 geneLimits[0] = bins05;
185 geneLimits[1] = bins10;
186 geneLimits[2] = bins10;
189 esd->RebinGenerated(bins05, newBinsEta05, bins10, newBinsEta10, bins10, newBinsEta10);
190 mult->RebinGenerated(bins05, newBinsEta05, bins10, newBinsEta10, bins10, newBinsEta10);
191 multTrigger->RebinGenerated(bins05, newBinsEta05, bins10, newBinsEta10, bins10, newBinsEta10);
194 for (Int_t hID = ((histID == -1) ? 0 : histID); hID <= ((histID == -1) ? 2 : histID); hID++)
196 TH2F* hist = esd->GetMultiplicityESD(hID);
198 mult->SetMultiplicityESD(hID, hist);
199 mult->SetTriggeredEvents(hID, esd->GetTriggeredEvents(hID));
201 // insert trigger efficiency in flat response matrix
202 for (Int_t evType = AliMultiplicityCorrection::kTrVtx; evType <= AliMultiplicityCorrection::kNSD; evType++)
203 mult->SetMultiplicityMC(hID, evType, multTrigger->GetMultiplicityMC(hID, evType));
205 mult->SetNoVertexEvents(hID, multTrigger->GetNoVertexEvents(hID));
206 mult->FixTriggerEfficiencies(10);
208 // small hack to get around charge conservation for full phase space ;-)
211 TH1* corr = mult->GetCorrelation(histID + 4);
213 for (Int_t i=2; i<=corr->GetNbinsX(); i+=2)
214 for (Int_t j=1; j<=corr->GetNbinsY(); ++j)
216 corr->SetBinContent(i, j, corr->GetBinContent(i-1, j));
217 corr->SetBinError(i, j, corr->GetBinError(i-1, j));
223 void correct(const char* fileNameMC = "multiplicityMC.root", const char* folder = "Multiplicity", const char* fileNameESD = "multiplicityESD.root", Bool_t chi2 = 1, Int_t histID = 1, Bool_t fullPhaseSpace = kFALSE, Float_t beta = -25, Int_t eventType = 2 /* AliMultiplicityCorrection::kTrVtx */, const char* targetFile = "unfolded.root", const char* folderESD = "Multiplicity", Bool_t calcBias = kFALSE)
227 Int_t geneLimits[] = { 0, 0, 0 };
229 AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open(fileNameMC, folder);
230 AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open(fileNameESD, folderESD);
231 AliMultiplicityCorrection* multTrigger = AliMultiplicityCorrection::Open("multiplicityTrigger.root");
233 LoadAndInitialize(mult, esd, multTrigger, histID, fullPhaseSpace, geneLimits);
235 //AliUnfolding::SetDebug(1);
237 for (Int_t hID = ((histID == -1) ? 0 : histID); hID <= ((histID == -1) ? 2 : histID); hID++)
239 AliUnfolding::SetNbins(kBinLimits[hID], geneLimits[hID]);
241 TH2F* hist2 = esd->GetMultiplicityMC(hID, eventType);
247 //Float_t regParamPol0[] = { 2, 2, 10 }; // TPCITS
248 Float_t regParamPol0[] = { 5, 15, 25 }; // SPD
249 Float_t regParamPol1[] = { 0.15, 0.25, 0.5 };
253 Float_t regParamPol0[] = { 10, 12, 40 };
254 Float_t regParamPol1[] = { 0.25, 0.25, 2 };
258 Float_t regParamPol0[] = { 1, 25, 10 };
259 Float_t regParamPol1[] = { 0.15, 0.5, 0.5 };
260 AliUnfolding::SetSkipBinsBegin(3);
263 Int_t reg = AliUnfolding::kPol0;
265 reg = AliUnfolding::kPol1;
267 Float_t regParam = TMath::Abs(beta);
271 regParam = regParamPol1[hID];
273 regParam = regParamPol0[hID];
275 AliUnfolding::SetChi2Regularization(reg, regParam);
277 //AliUnfolding::SetChi2Regularization(AliUnfolding::kLog, 1000000);
278 //AliUnfolding::SetChi2Regularization(AliUnfolding::kRatio, 10);
279 //TVirtualFitter::SetDefaultFitter("Minuit2");
281 //AliUnfolding::SetCreateOverflowBin(kFALSE);
282 //mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0); //mult->SetCreateBigBin(kFALSE);
283 //mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0, 125); mult->SetCreateBigBin(kFALSE);
284 // AliUnfolding::SetChi2Regularization(AliUnfolding::kEntropy, beta);
285 //mult->SetRegularizationParameters(AliMultiplicityCorrection::kLog, 1e5);
290 TH1* mcCompare = hist2->ProjectionY("mcmchist", 1, hist2->GetNbinsX());
292 mult->ApplyMinuitFit(hID, fullPhaseSpace, AliMultiplicityCorrection::kMB, 0, kTRUE, mcCompare);
293 mult->SetMultiplicityESDCorrected(hID, (TH1F*) mcCompare);
299 if (is900GeV) // from data
301 // background subtraction
302 Int_t background = 0;
304 //background = 1091 + 4398; // MB1 for run 104824 - 52 (SPD)
305 //background = 1087 + 4398; // MB1 for run 104824 - 52 (TPCITS)
307 background = 417 + 1758; // MB1 for run 104867 - 92 (SPD)
308 //background = 1162+422; // MB1 for run 104892 (TPCITS)
309 //background = 5830 + 1384; // MB1 for run 104824,25,45,52,67,92 (TPC runs) (TPCITS)
311 //background = 20 + 0; // V0AND for run 104824 - 52
312 //background = 10 + 0; // V0AND for run 104867 - 92
314 Printf("NOTE: Subtracting %d background events", background);
315 gSystem->Sleep(1000);
317 zeroBin = mult->GetTriggeredEvents(hID)->GetBinContent(1) - background - mult->GetMultiplicityESD(hID)->Integral(0, 2, 1, 1);
322 Float_t fractionZeroBin = (multTrigger->GetTriggeredEvents(hID)->GetBinContent(1) - multTrigger->GetMultiplicityESD(hID)->Integral(0, 2, 1, 1)) / multTrigger->GetMultiplicityESD(hID)->Integral(1, 1, 1, mult->GetMultiplicityESD(hID)->GetNbinsY());
323 zeroBin = fractionZeroBin * mult->GetMultiplicityESD(hID)->Integral(1, 1, 1, mult->GetMultiplicityESD(hID)->GetNbinsY());
325 Printf("Zero bin from MC: Estimating %d events with trigger but without vertex", zeroBin);
326 gSystem->Sleep(1000);
330 AliUnfolding::SetSkip0BinInChi2(kTRUE);
333 //mult->SetVertexRange(3, 4);
334 mult->ApplyMinuitFit(hID, fullPhaseSpace, eventType, zeroBin, kFALSE, 0, calcBias);
340 //mult->GetMultiplicityESD(hID)->SetBinContent(1, 1, 0);
341 //for (Int_t bin=1; bin<=mult->GetCorrelation(hID)->GetNbinsY(); bin++)
342 // mult->GetCorrelation(hID)->SetBinContent(1, bin, 1, 0);
343 AliUnfolding::SetChi2Regularization(AliUnfolding::kNone, 0);
344 mult->ApplyBayesianMethod(hID, fullPhaseSpace, eventType, 1, beta, 0, kTRUE);
345 //mult->ApplyBayesianMethod(hID, fullPhaseSpace, eventType, 1, 5, 0, kFALSE);
349 Printf("Writing result to %s", targetFile);
350 TFile* file = TFile::Open(targetFile, "RECREATE");
351 mult->SaveHistograms("Multiplicity");
358 for (hID = ((histID == -1) ? 0 : histID); hID <= ((histID == -1) ? 2 : histID); hID++)
360 TH2F* hist2 = esd->GetMultiplicityMC(hID, eventType);
361 TH1* mcCompare = hist2->ProjectionY("mcmchist", 1, hist2->GetNbinsX());
362 mult->DrawComparison(Form("%s_%d_%f", (chi2) ? "MinuitChi2" : "Bayesian", hID, beta), hID, fullPhaseSpace, kTRUE, mcCompare, kFALSE, eventType);
364 Printf("<n> = %f", mult->GetMultiplicityESDCorrected(hID)->GetMean());
368 void correctAll(Int_t eventType)
370 const char* suffix = "";
373 case 0: suffix = "trvtx"; break;
374 case 1: suffix = "mb"; break;
375 case 2: suffix = "inel"; break;
376 case 3: suffix = "nsd"; break;
379 correct("multiplicityMC.root", "Multiplicity", "multiplicityESD.root", 1, -1, 0, -1, eventType, TString(Form("chi2a_%s.root", suffix)));
380 correct("multiplicityMC.root", "Multiplicity", "multiplicityESD.root", 1, -1, 0, 1, eventType, TString(Form("chi2b_%s.root", suffix)));
381 correct("multiplicityMC.root", "Multiplicity", "multiplicityESD.root", 0, -1, 0, 40, eventType, TString(Form("bayes_%s.root", suffix)));
385 else if (eventType == 2)
389 void drawAll(Bool_t showUA5 = kFALSE)
391 const char* files[] = { "chi2a_nsd.root", "chi2b_nsd.root", "bayes_nsd.root" };
392 drawAll(files, showUA5);
397 const char* files[] = { "chi2a_inel.root", "chi2b_inel.root", "bayes_inel.root" };
403 const char* files[] = { "chi2a_mb.root", "chi2b_mb.root", "bayes_mb.root" };
407 void drawAll(const char** files, Bool_t showUA5 = kFALSE, Bool_t normalize = kFALSE)
411 Int_t colors[] = { 1, 2, 4 };
413 c = new TCanvas(Form("c%d", gRandom->Uniform(100)), "c", 1800, 600);
416 l = new TLegend(0.6, 0.6, 0.99, 0.99);
421 for (Int_t hID=0; hID<3; hID++)
423 c->cd(hID+1)->SetLogy();
426 for (Int_t i=0; i<3; i++)
428 TFile::Open(files[i]);
430 hist = (TH1*) gFile->Get(Form("Multiplicity/fMultiplicityESDCorrected%d", hID));
432 Float_t average0 = hist->GetMean();
433 hist2 = (TH1*) hist->Clone("temp");
434 hist2->SetBinContent(1, 0);
435 Float_t average1 = hist2->GetMean();
436 Printf("%d: <N> = %.2f <N>/(eta) = %.2f | without 0: <N> = %.2f <N>/(eta) = %.2f", hID, average0, average0 / ((hID+1) - 0.4 * (hID / 2)), average1, average1 / ((hID+1) - 0.4 * (hID / 2)));
438 hist->SetLineColor(colors[i]);
441 hist->GetXaxis()->SetRangeUser(0, kBinLimits[hID]);
444 Float_t max = hist->GetMaximum() * 1.5;
449 hist->GetYaxis()->SetRangeUser(min, max);
450 hist->SetTitle(";unfolded multiplicity;events");
454 l->AddEntry(hist, files[i]);
457 if (hist->Integral() <= 0)
461 hist->Scale(1.0 / hist->Integral());
463 AliPWG0Helper::NormalizeToBinWidth(hist);
465 hist->DrawCopy((i == 0) ? "" : "SAME");
468 hist0 = (TH1*) hist->Clone("hist0");
473 line = new TLine(kTrustLimits[hID], hist0->GetMinimum(), kTrustLimits[hID], hist0->GetMaximum());
474 line->SetLineWidth(3);
484 TGraphErrors *gre = new TGraphErrors(23);
485 gre->SetName("Graph");
486 gre->SetTitle("UA5");
487 gre->SetFillColor(1);
488 gre->SetMarkerStyle(24);
489 gre->SetPoint(0,0,0.15);
490 gre->SetPointError(0,0.5,0.01);
491 gre->SetPoint(1,1,0.171);
492 gre->SetPointError(1,0.5,0.007);
493 gre->SetPoint(2,2,0.153);
494 gre->SetPointError(2,0.5,0.007);
495 gre->SetPoint(3,3,0.124);
496 gre->SetPointError(3,0.5,0.006);
497 gre->SetPoint(4,4,0.099);
498 gre->SetPointError(4,0.5,0.005);
499 gre->SetPoint(5,5,0.076);
500 gre->SetPointError(5,0.5,0.005);
501 gre->SetPoint(6,6,0.057);
502 gre->SetPointError(6,0.5,0.004);
503 gre->SetPoint(7,7,0.043);
504 gre->SetPointError(7,0.5,0.004);
505 gre->SetPoint(8,8,0.032);
506 gre->SetPointError(8,0.5,0.003);
507 gre->SetPoint(9,9,0.024);
508 gre->SetPointError(9,0.5,0.003);
509 gre->SetPoint(10,10,0.018);
510 gre->SetPointError(10,0.5,0.002);
511 gre->SetPoint(11,11,0.013);
512 gre->SetPointError(11,0.5,0.002);
513 gre->SetPoint(12,12,0.01);
514 gre->SetPointError(12,0.5,0.002);
515 gre->SetPoint(13,13,0.007);
516 gre->SetPointError(13,0.5,0.001);
517 gre->SetPoint(14,14,0.005);
518 gre->SetPointError(14,0.5,0.001);
519 gre->SetPoint(15,15,0.004);
520 gre->SetPointError(15,0.5,0.001);
521 gre->SetPoint(16,16,0.0027);
522 gre->SetPointError(16,0.5,0.0009);
523 gre->SetPoint(17,17,0.0021);
524 gre->SetPointError(17,0.5,0.0008);
525 gre->SetPoint(18,18,0.0015);
526 gre->SetPointError(18,0.5,0.0007);
527 gre->SetPoint(19,19,0.0011);
528 gre->SetPointError(19,0.5,0.0006);
529 gre->SetPoint(20,20,0.0008);
530 gre->SetPointError(20,0.5,0.0005);
531 gre->SetPoint(21,22,0.00065);
532 gre->SetPointError(21,1,0.0003);
533 gre->SetPoint(22,27.5,0.00013);
534 gre->SetPointError(22,3.5,7.1e-05);
536 for (Int_t i=0; i<gre->GetN(); i++)
538 gre->GetY()[i] *= hist0->Integral();
539 gre->GetEY()[i] *= hist0->Integral();
544 ratio = (TGraphErrors*) gre->Clone("ratio");
546 for (Int_t i=0; i<gre->GetN(); i++)
548 //Printf("%f %d", hist0->GetBinContent(hist0->FindBin(ratio->GetX()[i])), hist0->FindBin(ratio->GetX()[i]));
549 Int_t bin = hist0->FindBin(gre->GetX()[i]);
550 if (hist0->GetBinContent(bin) > 0)
552 ratio->GetEY()[i] = TMath::Sqrt((ratio->GetEY()[i] / ratio->GetY()[i])**2 + (hist0->GetBinError(bin) / hist0->GetBinContent(bin))**2);
553 ratio->GetY()[i] /= hist0->GetBinContent(bin);
554 ratio->GetEY()[i] *= ratio->GetY()[i];
562 ratio->GetYaxis()->SetRangeUser(0.5, 1.5);
565 c->SaveAs("draw_all.png");
568 TH1* GetChi2Bias(Float_t alpha = -5)
572 AliMultiplicityCorrection::EventType eventType = AliMultiplicityCorrection::kMB;
575 correct("multiplicityMC.root", "Multiplicity", "multiplicityESD.root", 1, hID, 0, alpha, eventType, "nobias.root", "Multiplicity", kFALSE);
577 correct("multiplicityMC.root", "Multiplicity", "multiplicityESD.root", 1, hID, 0, alpha, eventType, "withbias.root", "Multiplicity", kTRUE);
579 // without bias calculation
580 mult = AliMultiplicityCorrection::Open("nobias.root");
581 baseold = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("baseold");
583 // with bias calculation
584 mult = AliMultiplicityCorrection::Open("withbias.root");
585 base = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("base");
587 // relative error plots
588 ratio1 = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("hist1");
590 ratio1->SetTitle(";unfolded multiplicity;relative error");
592 ratio2 = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("hist1");
595 for (Int_t t = 0; t<baseold->GetNbinsX(); t++)
597 Printf("Bin %d; Content: %f; Chi2 Error: %f; Bias: %f; In percent: %.2f %.2f", t+1, base->GetBinContent(t+1), baseold->GetBinError(t+1), base->GetBinError(t+1), (base->GetBinContent(t+1) > 0) ? 100.0 * baseold->GetBinError(t+1) / base->GetBinContent(t+1) : -1, (base->GetBinContent(t+1) > 0) ? 100.0 * base->GetBinError(t+1) / base->GetBinContent(t+1) : -1);
598 if (base->GetBinContent(t+1) <= 0)
600 ratio1->SetBinContent(t+1, baseold->GetBinError(t+1) / base->GetBinContent(t+1));
601 ratio2->SetBinContent(t+1, base->GetBinError(t+1) / base->GetBinContent(t+1));
604 //new TCanvas; base->Draw(); gPad->SetLogy();
607 ratio1->GetYaxis()->SetRangeUser(0, 1);
608 ratio1->GetXaxis()->SetRangeUser(0, 50);
610 ratio2->SetLineColor(2);
611 ratio2->Draw("SAME");
616 void CheckBayesianBias()
620 const char* fileNameMC = "multiplicityMC.root";
621 const char* folder = "Multiplicity";
622 const char* fileNameESD = "multiplicityESD.root";
623 const char* folderESD = "Multiplicity";
625 AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open(fileNameMC, folder);
626 AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open(fileNameESD, folderESD);
628 const Int_t kMaxBins = 35;
629 AliUnfolding::SetNbins(kMaxBins, kMaxBins);
630 //AliUnfolding::SetDebug(1);
634 TH2F* hist = esd->GetMultiplicityESD(hID);
635 mult->SetMultiplicityESD(hID, hist);
637 // without bias calculation
638 mult->ApplyBayesianMethod(hID, kFALSE, 0, 1, 10, 0, 1);
639 baseold = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("baseold");
641 // with bias calculation
642 mult->ApplyBayesianMethod(hID, kFALSE, 0, 1, 10, 0, 2);
643 base = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("base");
645 TH1* hist1 = new TH1F("hist1", "", 100, 0, 20);
646 TH1* hist2 = new TH1F("hist2", "", 100, 0, 20);
648 for (Int_t t = 0; t<kMaxBins; t++)
650 Printf("Bin %d; Content: %f; Randomization Error: %f; Bias: %f; In percent: %.2f %.2f", t+1, base->GetBinContent(t+1), baseold->GetBinError(t+1), base->GetBinError(t+1), (base->GetBinContent(t+1) > 0) ? 100.0 * baseold->GetBinError(t+1) / base->GetBinContent(t+1) : -1, (base->GetBinContent(t+1) > 0) ? 100.0 * base->GetBinError(t+1) / base->GetBinContent(t+1) : -1);
652 hist1->Fill((base->GetBinContent(t+1) > 0) ? 100.0 * baseold->GetBinError(t+1) / base->GetBinContent(t+1) : -1);
653 hist2->Fill((base->GetBinContent(t+1) > 0) ? 100.0 * base->GetBinError(t+1) / base->GetBinContent(t+1) : -1);
658 hist2->SetLineColor(2);
662 void DrawUnfoldingLimit(Int_t hID, Float_t min, Float_t max)
664 line = new TLine(kTrustLimits[hID], min, kTrustLimits[hID], max);
665 line->SetLineWidth(2);
669 void DataScan(Int_t hID, Bool_t redo = kTRUE)
671 // makes a set of unfolded spectra and compares
672 // don't forget FindUnfoldedLimit in plots.C
678 const char* fileNameMC = "multiplicityMC.root";
679 const char* folder = "Multiplicity";
680 const char* fileNameESD = "multiplicityESD.root";
681 const char* folderESD = "Multiplicity";
682 const Int_t kMaxBins = kBinLimits[hID];
684 AliMultiplicityCorrection::EventType eventType = AliMultiplicityCorrection::kTrVtx;
685 Bool_t evaluteBias = kFALSE;
687 Int_t referenceCase = 2; // all results are shown as ratio to this case
690 AliUnfolding::RegularizationType regBegin = AliUnfolding::kPol0;
691 AliUnfolding::RegularizationType regEnd = AliUnfolding::kPol1;
692 Float_t regParamBegin[] = { 0, 1, 0.2, 3 };
693 Float_t regParamEnd[] = { 0, 11, 0.5, 31 };
694 Float_t regParamStep[] = { 0, 2, 2, TMath::Sqrt(10) };
697 Int_t iterBegin = 40;
703 AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open(fileNameMC, folder);
704 AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open(fileNameESD, folderESD);
706 mult->SetMultiplicityESD(hID, esd->GetMultiplicityESD(hID));
708 // insert trigger efficiency in flat response matrix
709 AliMultiplicityCorrection* multTrigger = AliMultiplicityCorrection::Open("multiplicityTrigger.root");
710 for (Int_t evType = AliMultiplicityCorrection::kTrVtx; evType <= AliMultiplicityCorrection::kNSD; evType++)
711 mult->SetMultiplicityMC(hID, evType, multTrigger->GetMultiplicityMC(hID, evType));
713 mult->SetNoVertexEvents(hID, multTrigger->GetNoVertexEvents(hID));
714 mult->FixTriggerEfficiencies(10);
716 Float_t fraction0Generated = multTrigger->GetFraction0Generated(hID);
719 mult->SetMultiplicityMC(hID, eventType, esd->GetMultiplicityMC(hID, eventType));
721 AliUnfolding::SetNbins(kMaxBins, kMaxBins);
722 //AliUnfolding::SetDebug(1);
726 for (AliUnfolding::RegularizationType reg = regBegin; reg <= regEnd; reg++)
728 for (Float_t regParam = regParamBegin[reg]; regParam < regParamEnd[reg]; regParam *= regParamStep[reg])
731 labels.Add(new TObjString(Form("#chi^{2} Reg %d #beta = %.2f", (Int_t) reg, regParam)));
736 AliUnfolding::SetChi2Regularization(reg, regParam);
738 mult->ApplyMinuitFit(hID, kFALSE, eventType, fraction0Generated, kFALSE, 0, evaluteBias);
740 file = TFile::Open(Form("datascan_%d.root", count), "RECREATE");
741 mult->SaveHistograms();
746 for (Int_t iter = iterBegin; iter <= iterEnd; iter += iterStep)
749 labels.Add(new TObjString(Form("Bayesian Iter = %d", iter)));
754 mult->ApplyBayesianMethod(hID, kFALSE, eventType, 1, iter, 0, kTRUE);
756 file = TFile::Open(Form("datascan_%d.root", count), "RECREATE");
757 mult->SaveHistograms();
761 // 1) all distributions
763 // 3) ratio to ref point
766 c = new TCanvas("c", "c", 1200, 800);
771 // get reference point
772 mult = AliMultiplicityCorrection::Open(Form("datascan_%d.root", referenceCase));
775 refPoint = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("refPoint");
777 legend = new TLegend(0.5, 0.5, 0.99, 0.99);
778 legend->SetFillColor(0);
780 TH1* residualSum = new TH1F("residualSum", ";;residual squared sum", count + 1, 0.5, count + 1.5);
782 Int_t allowedCount = count;
786 mult = AliMultiplicityCorrection::Open(Form("datascan_%d.root", count++));
789 if (count > allowedCount+1)
792 hist = (TH1*) mult->GetMultiplicityESDCorrected(hID);
793 hist->SetLineColor((count-1) % 4 + 1);
794 hist->SetLineStyle((count-1) / 4 + 1);
795 hist->GetXaxis()->SetRangeUser(0, kMaxBins);
796 hist->GetYaxis()->SetRangeUser(0.1, hist->GetMaximum() * 1.5);
797 hist->SetStats(kFALSE);
800 legend->AddEntry(hist->Clone(), labels.At(count-1)->GetName());
803 hist->DrawCopy((count == 1) ? "HIST" : "HISTSAME");
805 DrawUnfoldingLimit(hID, 0.1, hist->GetMaximum());
809 TH2* mcHist2d = mult->GetMultiplicityMC(hID, eventType);
810 mcHist = mcHist2d->ProjectionY("mcmchist", 1, mcHist2d->GetNbinsX());
813 mcHist->SetMarkerStyle(24);
814 mcHist->Draw("P SAME");
817 // calculate ratio using only the error on the mc bin
818 ratio = (TH1*) hist->Clone("ratio");
819 for (Int_t bin=1; bin<=ratio->GetNbinsX(); bin++)
821 if (mcHist->GetBinContent(bin) <= 0)
823 ratio->SetBinContent(bin, hist->GetBinContent(bin) / mcHist->GetBinContent(bin));
824 ratio->SetBinError(bin, mcHist->GetBinError(bin) / mcHist->GetBinContent(bin) * ratio->GetBinContent(bin));
827 ratio->GetYaxis()->SetRangeUser(0.5, 1.5);
828 ratio->GetYaxis()->SetTitle("Ratio unfolded / MC");
829 ratio->DrawCopy((count == 1) ? "HIST" : "HISTSAME");
831 DrawUnfoldingLimit(hID, 0.5, 1.5);
835 // calculate ratio using no errors for now
836 ratio = (TH1*) hist->Clone("ratio");
837 for (Int_t bin=1; bin<=ratio->GetNbinsX(); bin++)
839 if (refPoint->GetBinContent(bin) <= 0)
841 ratio->SetBinContent(bin, hist->GetBinContent(bin) / refPoint->GetBinContent(bin));
842 ratio->SetBinError(bin, 0);
845 ratio->GetYaxis()->SetRangeUser(0.5, 1.5);
846 ratio->GetYaxis()->SetTitle("Ratio unfolded / unfolded reference case");
847 ratio->DrawCopy((count == 1) ? "" : "SAME");
849 DrawUnfoldingLimit(hID, 0.5, 1.5);
852 ratio = (TH1*) hist->Clone("ratio");
853 for (Int_t bin=1; bin<=ratio->GetNbinsX(); bin++)
855 if (ratio->GetBinContent(bin) <= 0)
857 ratio->SetBinContent(bin, ratio->GetBinError(bin) / ratio->GetBinContent(bin));
858 ratio->SetBinError(bin, 0);
860 ratio->GetYaxis()->SetRangeUser(0, 1);
861 ratio->GetYaxis()->SetTitle("Relative error");
862 ratio->DrawCopy((count == 1) ? "" : "SAME");
864 DrawUnfoldingLimit(hID, 0, 1);
868 residuals = mult->GetResiduals(hID, AliMultiplicityCorrection::kTrVtx, sum);
869 residuals->SetStats(0);
870 residuals->GetXaxis()->SetRangeUser(0, kMaxBins);
871 residuals->SetStats(kFALSE);
872 residuals->SetLineColor((count-1) % 4 + 1);
873 residuals->SetLineStyle((count-1) / 4 + 1);
874 residuals->GetYaxis()->SetRangeUser(-5, 5);
875 residuals->DrawCopy((count == 1) ? "" : "SAME");
877 residualSum->Fill(count, sum);
878 residualSum->GetXaxis()->SetBinLabel(count, labels.At(count-1)->GetName());
886 void DrawBayesianIterations(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", Int_t histID = 1, Int_t eventType = 0 /* AliMultiplicityCorrection::kTrVtx */)
890 const char* folder = "Multiplicity";
892 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection(folder, folder);
893 TFile::Open(fileNameMC);
894 mult->LoadHistograms();
896 AliMultiplicityCorrection* esd = new AliMultiplicityCorrection(folder, folder);
897 TFile::Open(fileNameESD);
898 esd->LoadHistograms();
900 TH2F* hist = esd->GetMultiplicityESD(histID);
901 TH2F* hist2 = esd->GetMultiplicityMC(histID, eventType);
903 mult->SetMultiplicityESD(histID, hist);
904 mult->SetMultiplicityMC(histID, eventType, hist2);
906 TH1* mcCompare = hist2->ProjectionY("mcmchist", 1, hist2->GetNbinsX());
907 //mcCompare->Scale(1.0 / mcCompare->Integral());
909 TH1* esdHist = (TH1*) hist->ProjectionY("myesd", 1, 1)->Clone("myesd");
910 //esdHist->Scale(1.0 / esdHist->Integral());
912 c = new TCanvas("c", "c", 1200, 600);
916 gPad->SetLeftMargin(0.12);
917 gPad->SetTopMargin(0.05);
918 gPad->SetRightMargin(0.05);
923 mcCompare->GetXaxis()->SetRangeUser(0, 80);
924 mcCompare->SetStats(0);
925 mcCompare->SetFillColor(5);
926 mcCompare->SetLineColor(5);
927 mcCompare->SetTitle(Form(";%s;Entries", GetMultLabel(1)));
928 mcCompare->GetYaxis()->SetRangeUser(2, esdHist->GetMaximum() * 2);
929 mcCompare->GetYaxis()->SetTitleOffset(1.3);
930 mcCompare->Draw("HIST");
931 esdHist->SetMarkerStyle(5);
932 esdHist->Draw("P HIST SAME");
935 gPad->SetTopMargin(0.05);
936 gPad->SetRightMargin(0.05);
940 trueMeasuredRatio = (TH1*) mcCompare->Clone("trueMeasuredRatio");
941 trueMeasuredRatio->Divide(esdHist);
942 trueMeasuredRatio->SetStats(0);
943 trueMeasuredRatio->SetTitle(Form(";%s;Ratio", GetMultLabel(1)));
944 trueMeasuredRatio->GetYaxis()->SetTitleOffset(1.3);
945 trueMeasuredRatio->GetYaxis()->SetRangeUser(0, 2);
946 // ROOT displays all values > 2 at 2 which looks weird
947 for (Int_t i=1; i<=trueMeasuredRatio->GetNbinsX(); i++)
948 if (trueMeasuredRatio->GetBinContent(i) > 2)
949 trueMeasuredRatio->SetBinContent(i, 0);
950 trueMeasuredRatio->SetMarkerStyle(5);
951 trueMeasuredRatio->Draw("P");
953 Int_t colors[] = {1, 2, 4, 6};
955 legend = new TLegend(0.15, 0.13, 0.5, 0.5);
956 legend->SetFillColor(0);
957 legend->SetTextSize(0.04);
959 legend->AddEntry(mcCompare, "True", "F");
960 legend->AddEntry(esdHist, "Measured", "P");
962 legend2 = new TLegend(0.15, 0.13, 0.5, 0.4);
963 legend2->SetFillColor(0);
964 legend2->SetTextSize(0.04);
966 legend2->AddEntry(trueMeasuredRatio, "Measured", "P");
968 Int_t iters[] = {1, 3, 10, -1};
969 for (Int_t i = 0; i<4; i++)
971 Int_t iter = iters[i];
972 mult->ApplyBayesianMethod(histID, kFALSE, eventType, 1, iter, 0, 0);
973 corr = mult->GetMultiplicityESDCorrected(histID);
974 corr->Scale(1.0 / corr->Integral());
975 corr->Scale(mcCompare->Integral());
976 corr->GetXaxis()->SetRangeUser(0, 80);
977 //corr->SetMarkerStyle(20+iter);
978 corr->SetLineColor(colors[i]);
979 corr->SetLineStyle(i+1);
980 corr->SetLineWidth(2);
983 corr->DrawCopy("SAME HIST");
986 clone = (TH1*) corr->Clone("clone");
987 clone->Divide(mcCompare, corr);
988 clone->GetYaxis()->SetRangeUser(0, 2);
989 clone->DrawCopy("SAME HIST");
991 legend->AddEntry((TH1*) corr->Clone(), (iter > -1) ? Form("%d iteration%s", iter, (iter == 1) ? "" : "s") : "Convergence", "L");
992 legend2->AddEntry((TH1*) corr->Clone(), (iter > -1) ? Form("%d iteration%s", iter, (iter == 1) ? "" : "s") : "Convergence", "L");
1001 c->SaveAs("bayesian_iterations.eps");
1004 void CompareChi2Bayesian(Int_t histID = 2, const char* chi2File = "chi2.root", const char* bayesianFile = "bayesian.root", const char* label1 = "Chi2", const char* label2 = "Bayesian", const char* mcFile = 0, Float_t simpleCorrect = 0)
1006 const char* folder = "Multiplicity";
1010 AliMultiplicityCorrection* chi2 = new AliMultiplicityCorrection(folder, folder);
1011 TFile::Open(chi2File);
1012 chi2->LoadHistograms();
1014 AliMultiplicityCorrection* bayesian = new AliMultiplicityCorrection(folder, folder);
1015 TFile::Open(bayesianFile);
1016 bayesian->LoadHistograms();
1018 histRAW = chi2->GetMultiplicityESD(histID)->ProjectionY("raw", 1, chi2->GetMultiplicityESD(histID)->GetNbinsX());
1019 histRAW->Scale(1.0 / histRAW->Integral());
1021 histC = chi2->GetMultiplicityESDCorrected(histID);
1022 histB = bayesian->GetMultiplicityESDCorrected(histID);
1024 c = new TCanvas("CompareChi2Bayesian", "CompareChi2Bayesian", 800, 600);
1025 c->SetRightMargin(0.05);
1026 c->SetTopMargin(0.05);
1031 histC->SetTitle(";N;P(N)");
1032 histC->SetStats(kFALSE);
1033 histC->GetXaxis()->SetRangeUser(0, 100);
1035 histC->SetLineColor(1);
1036 histB->SetLineColor(2);
1037 histRAW->SetLineColor(3);
1039 histC->DrawCopy("HISTE");
1040 histB->DrawCopy("HISTE SAME");
1041 histRAW->DrawCopy("SAME");
1043 legend = new TLegend(0.2, 0.2, 0.4, 0.4);
1044 legend->SetFillColor(0);
1046 legend->AddEntry(histC, label1);
1047 legend->AddEntry(histB, label2);
1048 legend->AddEntry(histRAW, "raw ESD");
1051 if (simpleCorrect > 0)
1054 graph->SetMarkerStyle(25);
1055 graph->SetFillColor(0);
1056 for (Int_t bin=1; bin<=histRAW->GetNbinsX(); bin++)
1057 graph->SetPoint(graph->GetN(), histRAW->GetXaxis()->GetBinCenter(bin) * simpleCorrect, histRAW->GetBinContent(bin));
1059 graph->Draw("PSAME");
1060 legend->AddEntry(graph, "weighting");
1062 // now create histogram from graph and normalize
1063 histGraph = (TH1*) histRAW->Clone();
1065 for (Int_t bin=1; bin<=histGraph->GetNbinsX(); bin++)
1068 for (j=1; j<graph->GetN(); j++)
1069 if (graph->GetX()[j] > histGraph->GetXaxis()->GetBinCenter(bin))
1071 if (j == graph->GetN())
1073 if (histGraph->GetXaxis()->GetBinCenter(bin) - graph->GetX()[j] < graph->GetX()[j-1] - histGraph->GetXaxis()->GetBinCenter(bin))
1075 histGraph->SetBinContent(bin, graph->GetY()[j]);
1078 Printf("Integral = %f", histGraph->Integral());
1079 histGraph->Scale(1.0 / histGraph->Integral());
1081 histGraph->SetLineColor(6);
1082 histGraph->DrawCopy("SAME");
1083 legend->AddEntry(histGraph, "weighting normalized");
1088 AliMultiplicityCorrection* mc = new AliMultiplicityCorrection(folder, folder);
1089 TFile::Open(mcFile);
1090 mc->LoadHistograms();
1092 histMC = mc->GetMultiplicityVtx(histID)->ProjectionY("mc", 1, mc->GetMultiplicityVtx(histID)->GetNbinsX());
1094 histMC->Scale(1.0 / histMC->Integral());
1096 histMC->Draw("HISTE SAME");
1097 histMC->SetLineColor(4);
1098 legend->AddEntry(histMC, "MC");
1103 c->SaveAs(Form("%s.png", c->GetName()));
1104 c->SaveAs(Form("%s.eps", c->GetName()));
1111 c = new TCanvas("CompareChi2BayesianRatio", "CompareChi2BayesianRatio", 800, 600);
1112 c->SetRightMargin(0.05);
1113 c->SetTopMargin(0.05);
1117 for (Int_t bin=1; bin<=histC->GetNbinsX(); bin++)
1119 if (histMC->GetBinContent(bin) > 0)
1121 histC->SetBinContent(bin, histC->GetBinContent(bin) / histMC->GetBinContent(bin));
1122 histB->SetBinContent(bin, histB->GetBinContent(bin) / histMC->GetBinContent(bin));
1127 histGraph->SetBinContent(bin, histGraph->GetBinContent(bin) / histMC->GetBinContent(bin));
1128 histGraph->SetBinError(bin, 0);
1133 histC->SetBinError(bin, 0);
1134 histB->SetBinError(bin, 0);
1138 histC->GetYaxis()->SetRangeUser(0.5, 2);
1139 histC->GetYaxis()->SetTitle("Unfolded / MC");
1141 histC->Draw("HIST");
1142 histB->Draw("HIST SAME");
1145 histGraph->Draw("HIST SAME");
1149 if (simpleCorrect > 0)
1151 graph2 = new TGraph;
1152 graph2->SetMarkerStyle(25);
1153 graph2->SetFillColor(0);
1154 for (Int_t i=0; i<graph->GetN(); i++)
1156 Float_t mcValue = histMC->GetBinContent(histMC->FindBin(graph->GetX()[i]));
1157 Float_t mcError = histMC->GetBinError(histMC->FindBin(graph->GetX()[i]));
1159 graph2->SetPoint(graph2->GetN(), graph->GetX()[i], graph->GetY()[i] / mcValue);
1161 graph2->Draw("PSAME");
1165 c->SaveAs(Form("%s.png", c->GetName()));
1166 c->SaveAs(Form("%s.eps", c->GetName()));
1170 void CompareMC(Int_t histID, Int_t eventType, const char* file1, const char* file2, const char* label1, const char* label2)
1172 const char* folder = "Multiplicity";
1176 AliMultiplicityCorrection* mc1 = new AliMultiplicityCorrection(folder, folder);
1178 mc1->LoadHistograms();
1179 histMC1 = mc1->GetMultiplicityMC(histID, eventType)->ProjectionY("mc1", 1, mc1->GetMultiplicityMC(histID, eventType)->GetNbinsX());
1180 histMC1->Scale(1.0 / histMC1->Integral());
1182 AliMultiplicityCorrection* mc2 = new AliMultiplicityCorrection(folder, folder);
1184 mc2->LoadHistograms();
1185 histMC2 = mc2->GetMultiplicityMC(histID, eventType)->ProjectionY("mc2", 1, mc2->GetMultiplicityMC(histID, eventType)->GetNbinsX());
1186 histMC2->Scale(1.0 / histMC2->Integral());
1188 c = new TCanvas("CompareMC", "CompareMC", 800, 600);
1189 c->SetRightMargin(0.05);
1190 c->SetTopMargin(0.05);
1193 histMC1->SetTitle(";N;P(N)");
1194 histMC1->SetStats(kFALSE);
1195 histMC1->GetXaxis()->SetRangeUser(0, 100);
1197 histMC1->SetLineColor(1);
1198 histMC2->SetLineColor(2);
1201 histMC2->Draw("SAME");
1203 legend = new TLegend(0.2, 0.2, 0.4, 0.4);
1204 legend->SetFillColor(0);
1206 legend->AddEntry(histMC1, label1);
1207 legend->AddEntry(histMC2, label2);
1211 c->SaveAs(Form("%s.gif", c->GetName()));
1212 c->SaveAs(Form("%s.eps", c->GetName()));
1215 void* fit2Step(const char* fileNameMC = "multiplicityMC_2M.root", const char* fileNameESD = "multiplicityMC_1M_3.root", Int_t histID = 3, Bool_t fullPhaseSpace = kFALSE)
1217 gSystem->Load("libPWG0base");
1219 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1221 TFile::Open(fileNameMC);
1222 mult->LoadHistograms("Multiplicity");
1224 TFile::Open(fileNameESD);
1225 TH2F* hist = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityESD%d", histID));
1226 TH2F* hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityVtx%d", ((fullPhaseSpace) ? 4 : histID)));
1227 //hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityINEL%d", histID));
1229 mult->SetMultiplicityESD(histID, hist);
1231 // small hack to get around charge conservation for full phase space ;-)
1234 TH1* corr = mult->GetCorrelation(histID + 4);
1236 for (Int_t i=2; i<=corr->GetNbinsX(); i+=2)
1237 for (Int_t j=1; j<=corr->GetNbinsY(); ++j)
1239 corr->SetBinContent(i, j, corr->GetBinContent(i-1, j));
1240 corr->SetBinError(i, j, corr->GetBinError(i-1, j));
1244 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1245 mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
1246 mult->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, hist2->ProjectionY("mymchist"));
1248 TH1* result = (TH1*) mult->GetMultiplicityESDCorrected((fullPhaseSpace) ? 4 : histID))->Clone("firstresult");
1250 mult->SetRegularizationParameters(AliMultiplicityCorrection::kEntropy, 100000);
1251 mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE, result);
1252 mult->DrawComparison("MinuitChi2_Step2", histID, fullPhaseSpace, kTRUE, hist2->ProjectionY("mymchist"));
1257 const char* GetRegName(Int_t type)
1261 case AliMultiplicityCorrection::kNone: return "None"; break;
1262 case AliMultiplicityCorrection::kPol0: return "Pol0"; break;
1263 case AliMultiplicityCorrection::kPol1: return "Pol1"; break;
1264 case AliMultiplicityCorrection::kCurvature: return "TotalCurvature"; break;
1265 case AliMultiplicityCorrection::kEntropy: return "Reduced cross-entropy"; break;
1266 case AliMultiplicityCorrection::kLog : return "Log"; break;
1271 const char* GetEventTypeName(Int_t type)
1275 case AliMultiplicityCorrection::kTrVtx: return "trigger, vertex"; break;
1276 case AliMultiplicityCorrection::kMB: return "minimum bias"; break;
1277 case AliMultiplicityCorrection::kINEL: return "inelastic"; break;
1282 void EvaluateBayesianMethodIterationsSmoothing(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", const char* targetDir = "bayesian", Int_t histID = 1)
1284 gSystem->mkdir(targetDir);
1286 gSystem->Load("libPWG0base");
1288 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1289 TFile::Open(fileNameMC);
1290 mult->LoadHistograms("Multiplicity");
1292 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
1293 TFile::Open(fileNameESD);
1294 multESD->LoadHistograms("Multiplicity");
1295 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
1297 Int_t count = 0; // just to order the saved images...
1299 TFile* graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir), "RECREATE");
1301 Int_t colors[] = {1, 2, 3, 4, 6};
1302 Int_t markers[] = {20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 3, 4, 5, 6};
1304 for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kTrVtx; ++type)
1305 //for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kINEL; ++type)
1308 tmp.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));
1310 TCanvas* canvas = new TCanvas(tmp, tmp, 800, 600);
1312 for (Int_t i = 1; i <= 5; i++)
1314 Int_t iterArray[5] = {2, 5, 10, 20, -1};
1315 Int_t iter = iterArray[i-1];
1317 TGraph* fitResultsMC[3];
1318 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1320 fitResultsMC[region] = new TGraph;
1321 fitResultsMC[region]->SetTitle(Form("%d iterations - reg. %d", iter, region+1));
1322 fitResultsMC[region]->GetXaxis()->SetTitle("smoothing parameter #alpha");
1323 fitResultsMC[region]->GetYaxis()->SetTitle(Form("P_{1} in region %d", region));
1324 fitResultsMC[region]->SetName(Form("%s_MC_%d", tmp.Data(), i * AliMultiplicityCorrection::kQualityRegions + region - 2));
1325 fitResultsMC[region]->SetFillColor(0);
1326 //fitResultsMC[region]->SetMarkerStyle(markers[(i-1) * AliMultiplicityCorrection::kQualityRegions + region]);
1327 fitResultsMC[region]->SetMarkerStyle(markers[i-1]);
1328 fitResultsMC[region]->SetLineColor(colors[i-1]);
1329 fitResultsMC[region]->SetMarkerColor(colors[i-1]);
1332 TGraph* fitResultsRes = new TGraph;
1333 fitResultsRes->SetTitle(Form("%d iterations", iter));
1334 fitResultsRes->SetName(Form("%s_Res_%d", tmp.Data(), i));
1335 fitResultsRes->GetXaxis()->SetTitle("smoothing parameter");
1336 fitResultsRes->GetYaxis()->SetTitle("P_{2}");
1338 fitResultsRes->SetFillColor(0);
1339 fitResultsRes->SetMarkerStyle(markers[i-1]);
1340 fitResultsRes->SetMarkerColor(colors[i-1]);
1341 fitResultsRes->SetLineColor(colors[i-1]);
1343 for (Float_t weight = 0.0; weight < 1.01; weight += 0.2)
1346 Float_t residuals = 0;
1348 mult->ApplyBayesianMethod(histID, kFALSE, type, weight, iter, 0, kFALSE);
1349 mult->DrawComparison(Form("%s/BayesianIterSmooth_%03d_%d_%d_%f", targetDir, count++, type, iter, weight), histID, kFALSE, kTRUE, multESD->GetMultiplicityMC(histID, type)->ProjectionY());
1350 mult->GetComparisonResults(&chi2MC, 0, &residuals);
1352 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1353 fitResultsMC[region]->SetPoint(fitResultsMC[region]->GetN(), weight, mult->GetQuality(region));
1355 fitResultsRes->SetPoint(fitResultsRes->GetN(), weight, residuals);
1359 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1360 fitResultsMC[region]->Write();
1362 fitResultsRes->Write();
1369 void EvaluateDrawResult(const char* targetDir, Int_t type = 0, Bool_t plotRes = kTRUE)
1371 gSystem->Load("libPWG0base");
1374 TFile* graphFile = 0;
1377 name = "EvaluateChi2Method";
1378 graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir));
1382 name.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));
1383 graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir));
1386 TCanvas* canvas = new TCanvas(name, name, 800, 500);
1392 canvas->SetTopMargin(0.05);
1396 TLegend* legend = new TLegend(0.8, 0.15, 0.98, 0.98);
1397 legend->SetFillColor(0);
1401 Float_t xMin = 1e20;
1404 Float_t yMin = 1e20;
1407 Float_t yMinRegion[3];
1408 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
1409 yMinRegion[i] = 1e20;
1411 TString xaxis, yaxis;
1415 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
1416 TGraph* res = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
1421 xaxis = mc->GetXaxis()->GetTitle();
1422 yaxis = mc->GetYaxis()->GetTitle();
1429 xMin = TMath::Min(xMin, mc->GetXaxis()->GetXmin());
1430 yMin = TMath::Min(yMin, mc->GetYaxis()->GetXmin());
1432 xMax = TMath::Max(xMax, mc->GetXaxis()->GetXmax());
1433 yMax = TMath::Max(yMax, mc->GetYaxis()->GetXmax());
1437 xMin = TMath::Min(xMin, res->GetXaxis()->GetXmin());
1438 yMin = TMath::Min(yMin, res->GetYaxis()->GetXmin());
1440 xMax = TMath::Max(xMax, res->GetXaxis()->GetXmax());
1441 yMax = TMath::Max(yMax, res->GetYaxis()->GetXmax());
1444 for (Int_t i=0; i<mc->GetN(); ++i)
1445 yMinRegion[(count-1) % 3] = TMath::Min(yMinRegion[(count-1) % 3], mc->GetY()[i]);
1450 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
1451 Printf("Minimum for region %d is %f", i, yMinRegion[i]);
1455 xaxis = "smoothing parameter";
1457 else if (type == -1)
1459 xaxis = "weight parameter";
1462 //yaxis = "P_{1} (2 <= t <= 150)";
1464 printf("%f %f %f %f\n", xMin, xMax, yMin, yMax);
1466 TGraph* dummy = new TGraph;
1467 dummy->SetPoint(0, xMin, yMin);
1468 dummy->SetPoint(1, xMax, yMax);
1469 dummy->SetTitle(Form(";%s;%s", xaxis.Data(), yaxis.Data()));
1471 dummy->SetMarkerColor(0);
1473 dummy->GetYaxis()->SetMoreLogLabels(1);
1479 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
1480 TGraph* res = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
1482 //printf("%s_MC_%d %p %p\n", name.Data(), count, mc, res);
1487 printf("Loaded %d sucessful.\n", count);
1491 legend->AddEntry(mc, Form("Eq. (%d) - reg. %d", 10 + (count-1) / 3, 1+ (count-1) % 3));
1494 legend->AddEntry(mc);
1496 mc->Draw("SAME PC");
1500 legend->AddEntry(res);
1501 res->Draw("SAME PC");
1509 canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
1510 canvas->SaveAs(Form("%s/%s.eps", targetDir, canvas->GetName()));
1513 void EvaluateDrawResultRegions(const char* targetDir, Int_t type = 0)
1518 TFile* graphFile = 0;
1521 name = "EvaluateChi2Method";
1522 graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir));
1526 name.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));
1527 graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir));
1530 TCanvas* canvas = new TCanvas(name, name, 1200, 800);
1531 //canvas->Divide(1, AliMultiplicityCorrection::kQualityRegions, 0, 0);
1532 canvas->SetTopMargin(0);
1533 canvas->SetBottomMargin(0);
1534 canvas->SetRightMargin(0.05);
1535 canvas->Range(0, 0, 1, 1);
1538 pad[3] = new TPad(Form("%s_pad1", name.Data()), "", 0, 0, 0.5, 0.5); pad[3]->SetTopMargin(0); pad[3]->SetBottomMargin(0.15);
1539 pad[1] = new TPad(Form("%s_pad2", name.Data()), "", 0, 0.5, 0.5, 1); pad[1]->SetBottomMargin(0);
1540 pad[0] = new TPad(Form("%s_pad3", name.Data()), "", 0.5, 0, 1, 0.5); pad[0]->SetTopMargin(0); pad[0]->SetBottomMargin(0.15);
1541 pad[2] = new TPad(Form("%s_pad4", name.Data()), "", 0.5, 0.5, 1, 1); pad[2]->SetBottomMargin(0);
1543 Float_t yMinRegion[3];
1544 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
1545 yMinRegion[i] = 1e20;
1547 for (Int_t region = 0; region <= AliMultiplicityCorrection::kQualityRegions; region++)
1550 pad[region]->Draw();
1552 pad[region]->SetRightMargin(0.05);
1556 pad[region]->SetLogx();
1558 pad[region]->SetLogy();
1560 pad[region]->SetGridx();
1561 pad[region]->SetGridy();
1563 TLegend* legend = new TLegend(0.5, 0.4, 0.85, 0.85);
1564 legend->SetFillColor(0);
1565 //legend->SetNColumns(3);
1566 legend->SetTextSize(0.06);
1569 Float_t xMin = 1e20;
1572 Float_t yMin = 1e20;
1575 TString xaxis, yaxis;
1583 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
1587 if (TString(mc->GetTitle()).Contains(Form("reg. %d", region)) == kFALSE)
1590 for (Int_t i=0; i<mc->GetN(); ++i)
1591 yMinRegion[(count-1) % 3] = TMath::Min(yMinRegion[(count-1) % 3], mc->GetY()[i]);
1595 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
1600 xaxis = mc->GetXaxis()->GetTitle();
1601 yaxis = mc->GetYaxis()->GetTitle();
1605 xMin = TMath::Min(xMin, mc->GetXaxis()->GetXmin());
1606 yMin = TMath::Min(yMin, TMath::MinElement(mc->GetN(), mc->GetY()));
1608 xMax = TMath::Max(xMax, mc->GetXaxis()->GetXmax());
1609 yMax = TMath::Max(yMax, mc->GetYaxis()->GetXmax());
1611 //Printf("%f %f %f %f", xMin, xMax, yMin, yMax);
1616 xaxis = "Smoothing parameter #alpha";
1618 else if (type == -1)
1620 xaxis = "Weight parameter #beta";
1625 yaxis = Form("Q_{1} in region %d ", region); // (2 <= t <= 150)";
1630 printf("%f %f %f %f\n", xMin, xMax, yMin, yMax);
1649 TH1* dummy = new TH2F("dummy", "dummy", 100, xMin, xMax, 100, yMin * 0.9, yMax * 1.1);
1650 dummy->SetTitle(Form(";%s;%s", xaxis.Data(), yaxis.Data()));
1652 if (region == 0 && type != -1)
1653 dummy->GetYaxis()->SetMoreLogLabels(1);
1654 dummy->SetLabelSize(0.06, "xy");
1655 dummy->SetTitleSize(0.06, "xy");
1656 dummy->GetXaxis()->SetTitleOffset(1.2);
1657 dummy->GetYaxis()->SetTitleOffset(0.8);
1671 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
1672 if (mc && TString(mc->GetTitle()).Contains(Form("reg. %d", region)) == kFALSE)
1676 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
1680 //printf("Loaded %d sucessful.\n", count);
1684 //legend->AddEntry(mc, Form("Eq. (%d) - reg. %d", 10 + (count-1) / 3, 1+ (count-1) % 3));
1685 //legend->AddEntry(mc, Form("Eq. (7.%d)", 11 + (count-1) / 3));
1686 const char* names[] = { "Const", "Linear", "Log" };
1687 legend->AddEntry(mc, names[(count-1) / 3], "PL");
1691 TString label(mc->GetTitle());
1692 TString newLabel(label(0, label.Index(" ")));
1693 //Printf("%s", newLabel.Data());
1694 if (newLabel.Atoi() == -1)
1696 newLabel = "Convergence";
1699 newLabel = label(0, label.Index("iterations") + 10);
1701 legend->AddEntry(mc, newLabel, "PL");
1704 mc->Draw("SAME PC");
1712 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
1713 Printf("Minimum for region %d is %f", i, yMinRegion[i]);
1716 canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
1717 canvas->SaveAs(Form("%s/%s.eps", targetDir, canvas->GetName()));
1720 void EvaluateChi2Method(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", const char* targetDir = "chi2compare", Int_t histID = 1)
1722 gSystem->mkdir(targetDir);
1724 gSystem->Load("libPWG0base");
1726 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1728 TFile::Open(fileNameMC);
1729 mult->LoadHistograms("Multiplicity");
1731 TFile::Open(fileNameESD);
1732 TH2F* hist = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityESD%d", histID));
1733 TH2F* hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityVtx%d", histID));
1735 mult->SetMultiplicityESD(histID, hist);
1737 Int_t count = 0; // just to order the saved images...
1738 Int_t colors[] = {1, 2, 4, 3};
1739 Int_t markers[] = {20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 3};
1741 TGraph* fitResultsRes = 0;
1743 TFile* graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir), "RECREATE");
1745 //for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kPol0; type <= AliMultiplicityCorrection::kLog; ++type)
1746 //for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kEntropy; type <= AliMultiplicityCorrection::kEntropy; ++type)
1747 for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kPol1; type <= AliMultiplicityCorrection::kPol1; ++type)
1749 TGraph* fitResultsMC[3];
1750 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1752 fitResultsMC[region] = new TGraph;
1753 fitResultsMC[region]->SetTitle(Form("Eq. (%d) - reg. %d", type+9, region+1));
1754 fitResultsMC[region]->GetXaxis()->SetTitle("weight parameter #alpha");
1755 fitResultsMC[region]->GetYaxis()->SetTitle(Form("P_{1} in region %d", region));
1756 fitResultsMC[region]->SetName(Form("EvaluateChi2Method_MC_%d", type * AliMultiplicityCorrection::kQualityRegions + region - 2));
1757 fitResultsMC[region]->SetFillColor(0);
1758 //fitResultsMC[region]->SetMarkerStyle(markers[(type-1) * AliMultiplicityCorrection::kQualityRegions + region]);
1759 //fitResultsMC[region]->SetLineColor(colors[region]);
1760 fitResultsMC[region]->SetMarkerStyle(markers[type-1]);
1761 fitResultsMC[region]->SetMarkerColor(colors[type-1]);
1762 fitResultsMC[region]->SetLineColor(colors[type-1]);
1765 fitResultsRes = new TGraph;
1766 fitResultsRes->SetTitle(Form("%s residual chi2", GetRegName(type)));
1767 fitResultsRes->SetName(Form("EvaluateChi2Method_Res_%d", type));
1768 fitResultsRes->GetXaxis()->SetTitle("Weight Parameter");
1770 fitResultsRes->SetFillColor(0);
1771 fitResultsRes->SetMarkerStyle(markers[type-1]);
1772 fitResultsRes->SetMarkerColor(colors[type-1]);
1773 fitResultsRes->SetLineColor(colors[type-1]);
1775 for (Int_t i=0; i<15; ++i)
1777 Float_t weight = TMath::Power(TMath::Sqrt(10), i+1);
1778 //Float_t weight = TMath::Power(10, i+2);
1780 //if (type == AliMultiplicityCorrection::kEntropy) weight = 1e4 * (i+1) * 1.5;
1783 Float_t residuals = 0;
1784 Float_t chi2Limit = 0;
1787 runName.Form("MinuitChi2_%02d_%d_%f", count++, type, weight);
1789 mult->SetRegularizationParameters(type, weight);
1790 Int_t status = mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx);
1791 mult->DrawComparison(Form("%s/%s", targetDir, runName.Data()), histID, kFALSE, kTRUE, hist2->ProjectionY("mymc", 1, hist2->GetNbinsX()));
1794 printf("MINUIT did not succeed. Skipping...\n");
1798 mult->GetComparisonResults(&chi2MC, 0, &residuals);
1799 TH1* result = mult->GetMultiplicityESDCorrected(histID);
1800 result->SetName(runName);
1803 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1804 fitResultsMC[region]->SetPoint(fitResultsMC[region]->GetN(), weight, mult->GetQuality(region));
1806 fitResultsRes->SetPoint(fitResultsRes->GetN(), weight, residuals);
1810 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1811 fitResultsMC[region]->Write();
1812 fitResultsRes->Write();
1818 void EvaluateChi2MethodAll()
1820 EvaluateChi2Method("multiplicityMC_3M.root", "multiplicityMC_3M.root", "eval-3M-3M");
1821 EvaluateChi2Method("multiplicityMC_2M.root", "multiplicityMC_1M_3.root", "eval-2M-1M");
1822 EvaluateChi2Method("multiplicityMC_3M.root", "multiplicityMC_3M_NBD.root", "eval-3M-NBD");
1823 EvaluateChi2Method("multiplicityMC_2M_smoothed.root", "multiplicityMC_1M_3.root", "eval-2MS-1M");
1824 EvaluateChi2Method("multiplicityMC_2M_smoothed.root", "multiplicityMC_3M_NBD.root", "eval-2MS-NBD");
1827 void EvaluateBayesianMethodAll()
1829 EvaluateBayesianMethod("multiplicityMC_3M.root", "multiplicityMC_3M.root", "eval-3M-3M");
1830 EvaluateBayesianMethod("multiplicityMC_2M.root", "multiplicityMC_1M_3.root", "eval-2M-1M");
1831 EvaluateBayesianMethod("multiplicityMC_3M.root", "multiplicityMC_3M_NBD.root", "eval-3M-NBD");
1832 EvaluateBayesianMethod("multiplicityMC_2M_smoothed.root", "multiplicityMC_1M_3.root", "eval-2MS-1M");
1833 EvaluateBayesianMethod("multiplicityMC_2M_smoothed.root", "multiplicityMC_3M_NBD.root", "eval-2MS-NBD");
1836 void CompareMethods(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityMC.root", const char* targetDir, Int_t histID = 3)
1838 gSystem->mkdir(targetDir);
1840 gSystem->Load("libPWG0base");
1842 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1844 TFile::Open(fileNameMC);
1845 mult->LoadHistograms("Multiplicity");
1847 TFile::Open(fileNameESD);
1848 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
1849 multESD->LoadHistograms("Multiplicity");
1851 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
1853 TCanvas* canvas = new TCanvas("CompareMethods", "CompareMethods", 1200, 1200);
1854 canvas->Divide(3, 3);
1858 for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kTrVtx; ++type)
1860 TH1* mc = multESD->GetMultiplicityMC(histID, type)->ProjectionY("mymc");
1863 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1864 mult->ApplyMinuitFit(histID, kFALSE, type);
1865 mult->DrawComparison(Form("%s/CompareMethods_%d_MinuitChi2", targetDir, type), histID, kFALSE, kTRUE, mc);
1866 TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone("chi2Result");
1868 mult->ApplyBayesianMethod(histID, kFALSE, type, 0.1);
1869 mult->DrawComparison(Form("%s/CompareMethods_%d_Bayesian", targetDir, type), histID, kFALSE, kTRUE, mc);
1870 TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone("bayesResult");
1872 mc->GetXaxis()->SetRangeUser(0, 150);
1873 chi2Result->GetXaxis()->SetRangeUser(0, 150);
1875 /* // skip errors for now
1876 for (Int_t i=1; i<=chi2Result->GetNbinsX(); ++i)
1878 chi2Result->SetBinError(i, 0);
1879 bayesResult->SetBinError(i, 0);
1882 canvas->cd(++count);
1883 mc->SetFillColor(kYellow);
1885 chi2Result->SetLineColor(kRed);
1886 chi2Result->DrawCopy("SAME");
1887 bayesResult->SetLineColor(kBlue);
1888 bayesResult->DrawCopy("SAME");
1891 canvas->cd(count + 3);
1892 chi2ResultRatio = (TH1*) chi2Result->Clone("chi2ResultRatio");
1893 bayesResultRatio = (TH1*) bayesResult->Clone("bayesResultRatio");
1894 chi2ResultRatio->Divide(chi2Result, mc, 1, 1, "");
1895 bayesResultRatio->Divide(bayesResult, mc, 1, 1, "");
1897 chi2ResultRatio->GetYaxis()->SetRangeUser(0.5, 1.5);
1899 chi2ResultRatio->DrawCopy("HIST");
1900 bayesResultRatio->DrawCopy("SAME HIST");
1902 canvas->cd(count + 6);
1903 chi2Result->Divide(chi2Result, bayesResult, 1, 1, "");
1904 chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
1905 chi2Result->DrawCopy("HIST");
1908 canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
1909 canvas->SaveAs(Form("%s/%s.C", targetDir, canvas->GetName()));
1912 void StatisticsPlot(const char* fileNameMC = "multiplicityMC_2M.root", Int_t histID = 3)
1914 gSystem->Load("libPWG0base");
1916 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1918 TFile::Open(fileNameMC);
1919 mult->LoadHistograms("Multiplicity");
1921 const char* files[] = { "multiplicityMC_100k_1.root", "multiplicityMC_200k.root", "multiplicityMC_400k.root", "multiplicityMC_600k.root", "multiplicityMC_800k.root" };
1923 TGraph* fitResultsChi2[3];
1924 TGraph* fitResultsBayes[3];
1926 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1928 fitResultsChi2[region] = new TGraph;
1929 fitResultsChi2[region]->SetTitle(";Nevents;Chi2");
1930 fitResultsChi2[region]->SetName(Form("fitResultsChi2_%d", region));
1931 fitResultsChi2[region]->SetMarkerStyle(20+region);
1933 fitResultsBayes[region] = new TGraph;
1934 fitResultsBayes[region]->SetTitle(";Nevents;Chi2");
1935 fitResultsBayes[region]->SetName(Form("fitResultsBayes_%d", region));
1936 fitResultsBayes[region]->SetMarkerStyle(20+region);
1937 fitResultsBayes[region]->SetMarkerColor(2);
1940 TGraph* fitResultsChi2Limit = new TGraph; fitResultsChi2Limit->SetTitle(";Nevents;Multiplicity reach");
1941 TGraph* fitResultsBayesLimit = new TGraph; fitResultsBayesLimit->SetTitle(";Nevents;Multiplicity reach");
1942 TGraph* fitResultsChi2Res = new TGraph; fitResultsChi2Res->SetTitle(";Nevents;Chi2");
1943 TGraph* fitResultsBayesRes = new TGraph; fitResultsBayesRes->SetTitle(";Nevents;Chi2");
1945 fitResultsChi2Limit->SetName("fitResultsChi2Limit");
1946 fitResultsBayesLimit->SetName("fitResultsBayesLimit");
1947 fitResultsChi2Res->SetName("fitResultsChi2Res");
1948 fitResultsBayesRes->SetName("fitResultsBayesRes");
1950 TCanvas* canvas = new TCanvas("StatisticsPlot", "StatisticsPlot", 1200, 600);
1951 canvas->Divide(5, 2);
1956 TFile* file = TFile::Open("StatisticsPlot.root", "RECREATE");
1959 for (Int_t i=0; i<5; ++i)
1961 TFile::Open(files[i]);
1962 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
1963 multESD->LoadHistograms("Multiplicity");
1965 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
1966 Int_t nEntries = multESD->GetMultiplicityESD(histID)->GetEntries();
1967 TH1* mc = multESD->GetMultiplicityMC(histID, AliMultiplicityCorrection::kTrVtx)->ProjectionY(Form("mc_%d", i));
1969 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1970 mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx);
1971 mult->DrawComparison(Form("StatisticsPlot_%d_MinuitChi2", i), histID, kFALSE, kTRUE, mc);
1973 Int_t chi2MCLimit = 0;
1974 Float_t chi2Residuals = 0;
1975 mult->GetComparisonResults(0, &chi2MCLimit, &chi2Residuals);
1976 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1978 fitResultsChi2[region]->SetPoint(fitResultsChi2[region]->GetN(), nEntries, mult->GetQuality(region));
1979 min = TMath::Min(min, mult->GetQuality(region));
1980 max = TMath::Max(max, mult->GetQuality(region));
1982 fitResultsChi2Limit->SetPoint(fitResultsChi2Limit->GetN(), nEntries, chi2MCLimit);
1983 fitResultsChi2Res->SetPoint(fitResultsChi2Res->GetN(), nEntries, chi2Residuals);
1985 TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("chi2Result_%d", i));
1987 mult->ApplyBayesianMethod(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100, 0, kFALSE);
1988 mult->DrawComparison(Form("StatisticsPlot_%d_Bayesian", i), histID, kFALSE, kTRUE, mc);
1989 TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("bayesResult_%d", i));
1990 mult->GetComparisonResults(0, &chi2MCLimit, &chi2Residuals);
1991 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1993 fitResultsBayes[region]->SetPoint(fitResultsBayes[region]->GetN(), nEntries, mult->GetQuality(region));
1994 min = TMath::Min(min, mult->GetQuality(region));
1995 max = TMath::Max(max, mult->GetQuality(region));
1997 fitResultsBayesLimit->SetPoint(fitResultsBayesLimit->GetN(), nEntries, chi2MCLimit);
1998 fitResultsBayesRes->SetPoint(fitResultsBayesRes->GetN(), nEntries, chi2Residuals);
2000 mc->GetXaxis()->SetRangeUser(0, 150);
2001 chi2Result->GetXaxis()->SetRangeUser(0, 150);
2003 // skip errors for now
2004 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
2006 chi2Result->SetBinError(j, 0);
2007 bayesResult->SetBinError(j, 0);
2011 mc->SetFillColor(kYellow);
2013 chi2Result->SetLineColor(kRed);
2014 chi2Result->DrawCopy("SAME");
2015 bayesResult->SetLineColor(kBlue);
2016 bayesResult->DrawCopy("SAME");
2020 chi2Result->Divide(chi2Result, mc, 1, 1, "B");
2021 bayesResult->Divide(bayesResult, mc, 1, 1, "B");
2023 // skip errors for now
2024 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
2026 chi2Result->SetBinError(j, 0);
2027 bayesResult->SetBinError(j, 0);
2030 chi2Result->SetTitle("Ratios;Npart;unfolded measured/MC");
2031 chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
2033 chi2Result->DrawCopy("");
2034 bayesResult->DrawCopy("SAME");
2036 TFile* file = TFile::Open("StatisticsPlot.root", "UPDATE");
2038 chi2Result->Write();
2039 bayesResult->Write();
2043 canvas->SaveAs(Form("%s.gif", canvas->GetName()));
2044 canvas->SaveAs(Form("%s.C", canvas->GetName()));
2046 TCanvas* canvas2 = new TCanvas("StatisticsPlot2", "StatisticsPlot2", 800, 400);
2047 canvas2->Divide(2, 1);
2051 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
2053 fitResultsChi2[region]->GetYaxis()->SetRangeUser(0.5 * min, 1.5 * max);
2054 fitResultsChi2[region]->Draw(((region == 0) ? "AP" : "P SAME"));
2056 fitResultsBayes[region]->Draw("P SAME");
2062 fitResultsChi2Limit->SetMarkerStyle(20);
2063 fitResultsChi2Limit->GetYaxis()->SetRangeUser(0.9 * TMath::Min(fitResultsChi2Limit->GetYaxis()->GetXmin(), fitResultsBayesLimit->GetYaxis()->GetXmin()), 1.1 * TMath::Max(fitResultsChi2Limit->GetYaxis()->GetXmax(), fitResultsBayesLimit->GetYaxis()->GetXmax()));
2064 fitResultsChi2Limit->Draw("AP");
2066 fitResultsBayesLimit->SetMarkerStyle(3);
2067 fitResultsBayesLimit->SetMarkerColor(2);
2068 fitResultsBayesLimit->Draw("P SAME");
2070 canvas2->SaveAs(Form("%s.gif", canvas2->GetName()));
2071 canvas2->SaveAs(Form("%s.C", canvas2->GetName()));
2073 TFile* file = TFile::Open("StatisticsPlot.root", "UPDATE");
2075 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
2077 fitResultsChi2[region]->Write();
2078 fitResultsBayes[region]->Write();
2080 fitResultsChi2Limit->Write();
2081 fitResultsBayesLimit->Write();
2082 fitResultsChi2Res->Write();
2083 fitResultsBayesRes->Write();
2087 void StartingConditions(const char* fileNameMC = "multiplicityMC.root", Int_t histID = 1)
2091 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2093 TFile::Open(fileNameMC);
2094 mult->LoadHistograms("Multiplicity");
2096 const char* files[] = { "multiplicityESD.root", "multiplicityESD_100k_1.root", "multiplicityESD_100k_2.root", "multiplicityESD_100k_1.root", "multiplicityESD_100k_2.root" }
2098 // this one we try to unfold
2099 TFile::Open(files[0]);
2100 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
2101 multESD->LoadHistograms("Multiplicity");
2102 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
2103 TH1* mc = multESD->GetMultiplicityMC(histID, AliMultiplicityCorrection::kTrVtx)->ProjectionY("mc", 1, 1);
2105 TGraph* fitResultsChi2 = new TGraph;
2106 fitResultsChi2->SetTitle(";Input Dist ID;Chi2");
2107 TGraph* fitResultsBayes = new TGraph;
2108 fitResultsBayes->SetTitle(";Input Dist ID;Chi2");
2109 TGraph* fitResultsChi2Limit = new TGraph;
2110 fitResultsChi2Limit->SetTitle(";Input Dist ID;Multiplicity reach");
2111 TGraph* fitResultsBayesLimit = new TGraph;
2112 fitResultsBayesLimit->SetTitle(";Input Dist ID;Multiplicity reach");
2114 TCanvas* canvas = new TCanvas("StartingConditions", "StartingConditions", 1200, 600);
2115 canvas->Divide(8, 2);
2117 TCanvas* canvas3 = new TCanvas("StartingConditions3", "StartingConditions3", 1000, 400);
2118 canvas3->Divide(2, 1);
2124 TH1* firstBayesian = 0;
2125 TH1* startCond = multESD->GetMultiplicityESD(histID)->ProjectionY("startCond");
2127 TLegend* legend = new TLegend(0.7, 0.7, 1, 1);
2129 TFile* file = TFile::Open("StartingConditions.root", "RECREATE");
2133 for (Int_t i=0; i<8; ++i)
2137 startCond = (TH1*) mc->Clone("startCond2");
2141 TFile::Open(files[i-1]);
2142 AliMultiplicityCorrection* multESD2 = new AliMultiplicityCorrection("MultiplicityESD2", "MultiplicityESD2");
2143 multESD2->LoadHistograms("Multiplicity");
2144 startCond = multESD2->GetMultiplicityESD(histID)->ProjectionY("startCond");
2148 func = new TF1("nbd", "exp(log([0]) + TMath::LnGamma([2]+x) - TMath::LnGamma([2]) - TMath::LnGamma(x+1) + log([1] / ([1]+[2])) * x + log(1.0 + [1]/[2]) * -[2])", 0, 50);
2150 func->SetParNames("scaling", "averagen", "k");
2151 func->SetParLimits(0, 1e-3, 1e10);
2152 func->SetParLimits(1, 0.001, 1000);
2153 func->SetParLimits(2, 0.001, 1000);
2155 func->SetParameters(1, 10, 2);
2156 for (Int_t j=2; j<=startCond->GetNbinsX(); j++)
2157 startCond->SetBinContent(j, func->Eval(j-1));
2161 for (Int_t j=1; j<=startCond->GetNbinsX(); j++)
2162 startCond->SetBinContent(j, 1);
2165 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol0, 1e5);
2166 mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, kFALSE, startCond);
2167 //mult->DrawComparison(Form("StartingConditions_%d_MinuitChi2", i), histID, kFALSE, kTRUE, mc);
2170 Int_t chi2MCLimit = 0;
2171 mult->GetComparisonResults(&chi2MC, &chi2MCLimit, 0);
2172 fitResultsChi2->SetPoint(fitResultsChi2->GetN(), i, chi2MC);
2173 fitResultsChi2Limit->SetPoint(fitResultsChi2Limit->GetN(), i, chi2MCLimit);
2174 min = TMath::Min(min, chi2MC);
2175 max = TMath::Max(max, chi2MC);
2177 TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("chi2Result_%d", i));
2179 firstChi = (TH1*) chi2Result->Clone("firstChi");
2181 mult->ApplyBayesianMethod(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 10, startCond);
2182 //mult->DrawComparison(Form("StartingConditions_%d_Bayesian", i), histID, kFALSE, kTRUE, mc);
2183 TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("bayesResult_%d", i));
2185 firstBayesian = (TH1*) bayesResult->Clone("firstBayesian");
2187 mult->GetComparisonResults(&chi2MC, &chi2MCLimit, 0);
2188 fitResultsBayes->SetPoint(fitResultsBayes->GetN(), i, chi2MC);
2189 fitResultsBayesLimit->SetPoint(fitResultsBayesLimit->GetN(), i, chi2MCLimit);
2191 TFile* file = TFile::Open("StartingConditions.root", "UPDATE");
2192 chi2Result->Write();
2193 bayesResult->Write();
2196 min = TMath::Min(min, chi2MC);
2197 max = TMath::Max(max, chi2MC);
2198 mc->GetXaxis()->SetRangeUser(0, 150);
2199 chi2Result->GetXaxis()->SetRangeUser(0, 150);
2201 // skip errors for now
2202 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
2204 chi2Result->SetBinError(j, 0);
2205 bayesResult->SetBinError(j, 0);
2209 TH1* tmp = (TH1*) chi2Result->Clone("tmp");
2210 tmp->SetTitle("Difference to best initial conditions;Npart;Ratio");
2211 tmp->Divide(firstChi);
2212 tmp->GetYaxis()->SetRangeUser(0.5, 1.5);
2213 tmp->GetXaxis()->SetRangeUser(0, 200);
2214 tmp->SetLineColor(i+1);
2215 legend->AddEntry(tmp, Form("%d", i));
2216 tmp->DrawCopy((i > 0) ? "SAME HIST" : "HIST");
2219 tmp = (TH1*) bayesResult->Clone("tmp");
2220 tmp->SetTitle("Difference to best initial conditions;Npart;Ratio");
2221 tmp->Divide(firstBayesian);
2222 tmp->SetLineColor(i+1);
2223 tmp->GetYaxis()->SetRangeUser(0.5, 1.5);
2224 tmp->GetXaxis()->SetRangeUser(0, 200);
2225 tmp->DrawCopy((i > 0) ? "SAME HIST" : "HIST");
2228 mc->SetFillColor(kYellow);
2230 chi2Result->SetLineColor(kRed);
2231 chi2Result->DrawCopy("SAME");
2232 bayesResult->SetLineColor(kBlue);
2233 bayesResult->DrawCopy("SAME");
2237 chi2Result->Divide(chi2Result, mc, 1, 1, "B");
2238 bayesResult->Divide(bayesResult, mc, 1, 1, "B");
2240 // skip errors for now
2241 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
2243 chi2Result->SetBinError(j, 0);
2244 bayesResult->SetBinError(j, 0);
2247 chi2Result->SetTitle("Ratios;Npart;unfolded measured/MC");
2248 chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
2250 chi2Result->DrawCopy("");
2251 bayesResult->DrawCopy("SAME");
2257 canvas->SaveAs(Form("%s.gif", canvas->GetName()));
2259 TCanvas* canvas2 = new TCanvas("StartingConditions2", "StartingConditions2", 800, 400);
2260 canvas2->Divide(2, 1);
2263 fitResultsChi2->SetMarkerStyle(20);
2264 fitResultsChi2->GetYaxis()->SetRangeUser(0.5 * min, 1.5 * max);
2265 fitResultsChi2->Draw("AP");
2267 fitResultsBayes->SetMarkerStyle(3);
2268 fitResultsBayes->SetMarkerColor(2);
2269 fitResultsBayes->Draw("P SAME");
2274 fitResultsChi2Limit->SetMarkerStyle(20);
2275 fitResultsChi2Limit->GetYaxis()->SetRangeUser(0.9 * TMath::Min(fitResultsChi2Limit->GetYaxis()->GetXmin(), fitResultsBayesLimit->GetYaxis()->GetXmin()), 1.1 * TMath::Max(fitResultsChi2Limit->GetYaxis()->GetXmax(), fitResultsBayesLimit->GetYaxis()->GetXmax()));
2276 fitResultsChi2Limit->Draw("AP");
2278 fitResultsBayesLimit->SetMarkerStyle(3);
2279 fitResultsBayesLimit->SetMarkerColor(2);
2280 fitResultsBayesLimit->Draw("P SAME");
2282 canvas2->SaveAs(Form("%s.gif", canvas2->GetName()));
2283 canvas3->SaveAs(Form("%s.gif", canvas3->GetName()));
2286 void Merge(Int_t n, const char** files, const char* output)
2288 // const char* files[] = { "multiplicityMC_100k_1.root", "multiplicityMC_100k_2.root", "multiplicityMC_100k_3.root", "multiplicityMC_100k_4.root", "multiplicityMC_100k_5.root", "multiplicityMC_100k_6.root", "multiplicityMC_100k_7.root", "multiplicityMC_100k_8.root" };
2291 gSystem->Load("libPWG0base");
2293 AliMultiplicityCorrection** data = new AliMultiplicityCorrection*[n];
2295 for (Int_t i=0; i<n; ++i)
2297 TString name("Multiplicity");
2299 name.Form("Multiplicity%d", i);
2301 TFile::Open(files[i]);
2302 Printf("Loading from file %s", files[i]);
2303 data[i] = new AliMultiplicityCorrection(name, name);
2304 data[i]->LoadHistograms("Multiplicity");
2309 data[0]->Merge(&list);
2311 //data[0]->DrawHistograms();
2313 TFile::Open(output, "RECREATE");
2314 data[0]->SaveHistograms();
2318 void testMethod(Int_t caseNo, const char* fileName = "multiplicityMC.root")
2322 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2324 TFile::Open(fileName);
2325 mult->LoadHistograms("Multiplicity");
2331 TF1* func = new TF1("nbd", "exp(log([0]) + TMath::LnGamma([2]+x) - TMath::LnGamma([2]) - TMath::LnGamma(x+1) + log([1] / ([1]+[2])) * x + log(1.0 + [1]/[2]) * -[2])", 0, 200);
2332 //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])", 0, 200);
2333 func->SetParNames("scaling", "averagen", "k");
2338 case 0: func = new TF1("flat", "1000"); break;
2339 case 1: func = new TF1("flat", "501-x"); break;
2340 case 2: func = new TF1("flat", "1000 * 1/(x+1)"); break;
2341 case 3: func = new TF1("flat", "1000 * TMath::Landau(x, 10, 5)"); break;
2342 case 4: func->SetParameters(2e5, 15, 2); break;
2343 case 5: func->SetParameters(1, 13, 7); break;
2344 case 6: func->SetParameters(1e7, 30, 4); break;
2345 case 7: func->SetParameters(1e7, 30, 2); break; // ***
2346 case 8: func = new TF1("testlaszlo", "10*1000*x*exp(-0.1*x)"); break;
2354 mult->SetGenMeasFromFunc(func, 1);
2356 TFile::Open("out.root", "RECREATE");
2357 mult->SaveHistograms();
2359 new TCanvas; mult->GetMultiplicityESD(1)->ProjectionY()->DrawCopy();
2360 new TCanvas; mult->GetMultiplicityVtx(1)->ProjectionY("mc", 1, mult->GetMultiplicityVtx(1)->GetNbinsX())->DrawCopy();
2362 //mult->ApplyBayesianMethod(2, kFALSE);
2363 //mult->ApplyMinuitFit(2, kFALSE);
2364 //mult->ApplyGaussianMethod(2, kFALSE);
2365 //mult->ApplyLaszloMethod(2, kFALSE, AliMultiplicityCorrection::kTrVtx);
2368 void smoothCorrelationMap(const char* fileName = "multiplicity.root", Int_t corrMatrix = 1)
2370 gSystem->Load("libPWG0base");
2372 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2374 TFile::Open(fileName);
2375 mult->LoadHistograms("Multiplicity");
2377 // empty under/overflow bins in x, otherwise Project3D takes them into account
2378 TH3* corr = mult->GetCorrelation(corrMatrix);
2379 for (Int_t j=1; j<=corr->GetYaxis()->GetNbins(); ++j)
2381 for (Int_t k=1; k<=corr->GetZaxis()->GetNbins(); ++k)
2383 corr->SetBinContent(0, j, k, 0);
2384 corr->SetBinContent(corr->GetXaxis()->GetNbins()+1, j, k, 0);
2388 TH2* proj = (TH2*) corr->Project3D("zy");
2390 // normalize correction for given nPart
2391 for (Int_t i=1; i<=proj->GetNbinsX(); ++i)
2393 Double_t sum = proj->Integral(i, i, 1, proj->GetNbinsY());
2397 for (Int_t j=1; j<=proj->GetNbinsY(); ++j)
2400 proj->SetBinContent(i, j, proj->GetBinContent(i, j) / sum);
2401 proj->SetBinError(i, j, proj->GetBinError(i, j) / sum);
2406 proj->DrawCopy("COLZ");
2408 TH1* scaling = proj->ProjectionY("scaling", 1, 1);
2410 scaling->SetMarkerStyle(3);
2411 //scaling->GetXaxis()->SetRangeUser(0, 50);
2412 TH1* mean = (TH1F*) scaling->Clone("mean");
2413 TH1* width = (TH1F*) scaling->Clone("width");
2415 TF1* lognormal = new TF1("lognormal", "[0]*exp(-(log(x)-[1])^2/(2*[2]^2))/(x*[2]*TMath::Sqrt(2*TMath::Pi()))", 0.01, 500);
2416 lognormal->SetParNames("scaling", "mean", "sigma");
2417 lognormal->SetParameters(1, 1, 1);
2418 lognormal->SetParLimits(0, 1, 1);
2419 lognormal->SetParLimits(1, 0, 100);
2420 lognormal->SetParLimits(2, 1e-3, 1);
2422 TF1* nbd = 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])", 0, 50);
2423 nbd->SetParNames("scaling", "averagen", "k");
2424 nbd->SetParameters(1, 13, 5);
2425 nbd->SetParLimits(0, 1, 1);
2426 nbd->SetParLimits(1, 1, 100);
2427 nbd->SetParLimits(2, 1, 1e8);
2429 TF1* poisson = new TF1("poisson", "[0] * exp(-(x+[2])) * (x+[2])**[1] / TMath::Factorial([1])", 0.01, 50);
2430 poisson->SetParNames("scaling", "k", "deltax");
2431 poisson->SetParameters(1, 1, 0);
2432 poisson->SetParLimits(0, 0, 10);
2433 poisson->SetParLimits(1, 0.01, 100);
2434 poisson->SetParLimits(2, 0, 10);
2436 TF1* mygaus = new TF1("mygaus", "[0] * exp(-(x-[1])**2 / 2 / [2] - [3] * log(x + [4]) / [5])", 0.01, 50);
2437 mygaus->SetParNames("scaling", "mean", "width", "scale2log", "logmean", "logwidth");
2438 mygaus->SetParameters(1, 0, 1, 1, 0, 1);
2439 mygaus->SetParLimits(2, 1e-5, 10);
2440 mygaus->SetParLimits(4, 1, 1);
2441 mygaus->SetParLimits(5, 1e-5, 10);
2443 //TF1* sqrt = new TF1("sqrt", "[0] + [1] * sqrt((x + [3]) * [2])", 0, 50);
2444 TF1* sqrt = new TF1("sqrt", "[0] + (x + [1])**[2]", 0, 50);
2445 sqrt->SetParNames("ydelta", "exp", "xdelta");
2446 sqrt->SetParameters(0, 0, 1);
2447 sqrt->SetParLimits(1, 0, 10);
2449 const char* fitWith = "gaus";
2451 for (Int_t i=1; i<=80; ++i)
2453 printf("Fitting %d...\n", i);
2455 TH1* hist = proj->ProjectionY(Form("proj%d", i), i, i, "e");
2457 //hist->GetXaxis()->SetRangeUser(0, 50);
2458 //lognormal->SetParameter(0, hist->GetMaximum());
2459 hist->Fit(fitWith, "0 M", "");
2461 TF1* func = hist->GetListOfFunctions()->FindObject(fitWith);
2463 if (0 && (i % 5 == 0))
2467 func->Clone()->Draw("SAME");
2471 scaling->SetBinContent(i, func->GetParameter(0));
2472 mean->SetBinContent(i, func->GetParameter(1));
2473 width->SetBinContent(i, func->GetParameter(2));
2475 scaling->SetBinError(i, func->GetParError(0));
2476 mean->SetBinError(i, func->GetParError(1));
2477 width->SetBinError(i, func->GetParError(2));
2480 TF1* log = new TF1("log", "[0] + [1] * log([2] * x)", 0.01, 500);
2481 log->SetParameters(0, 1, 1);
2482 log->SetParLimits(1, 0, 100);
2483 log->SetParLimits(2, 1e-3, 10);
2485 TF1* over = new TF1("over", "[0] + [1] / (x+[2])", 0.01, 500);
2486 over->SetParameters(0, 1, 0);
2487 //over->SetParLimits(0, 0, 100);
2488 over->SetParLimits(1, 1e-3, 10);
2489 over->SetParLimits(2, 0, 100);
2491 c1 = new TCanvas("fitparams", "fitparams", 1200, 400);
2497 //TF1* scalingFit = new TF1("mypol0", "[0]");
2498 TF1* scalingFit = over;
2499 scaling->Fit(scalingFit, "", "", 3, 140);
2500 scalingFit->SetRange(0, 200);
2501 scalingFit->Draw("SAME");
2506 //TF1* meanFit = log;
2507 TF1* meanFit = new TF1("mypol1", "[0]+[1]*x");
2508 mean->Fit(meanFit, "", "", 3, 140);
2509 meanFit->SetRange(0, 200);
2510 meanFit->Draw("SAME");
2515 //TF1* widthFit = over;
2516 TF1* widthFit = new TF1("mypol", "[0]+[1]*TMath::Sqrt([2]*x)");
2517 widthFit->SetParLimits(2, 1e-5, 1e5);
2518 width->Fit(widthFit, "", "", 5, 140);
2519 widthFit->SetRange(0, 200);
2520 widthFit->Draw("SAME");
2522 // build new correction matrix
2523 TH2* new = (TH2*) proj->Clone("new");
2526 for (Int_t i=1; i<=new->GetXaxis()->GetNbins(); i+=1)
2528 TF1* func = (TF1*) gROOT->FindObject(fitWith);
2529 x = new->GetXaxis()->GetBinCenter(i);
2533 func->SetParameters(scalingFit->Eval(x), meanFit->Eval(x), widthFit->Eval(x));
2534 printf("%f %f %f %f\n", x, scalingFit->Eval(x), meanFit->Eval(x), widthFit->Eval(x));
2536 for (Int_t j=1; j<=new->GetYaxis()->GetNbins(); j+=1)
2540 // leave bins 1..20 untouched
2541 new->SetBinContent(i, j, corr->Integral(1, corr->GetNbinsX(), i, i, j, j));
2545 y = new->GetYaxis()->GetBinCenter(j);
2548 if (func->Eval(y) > 1e-4)
2549 new->SetBinContent(i, j, func->Eval(y));
2554 // fill 0 multiplicity bins, this cannot be done with the function because it does not accept 0
2555 // we take the values from the old response matrix
2556 //for (Int_t i=1; i<=new->GetXaxis()->GetNbins(); i+=1)
2557 // new->SetBinContent(i, 1, proj->GetBinContent(i, 1));
2559 //for (Int_t j=1; j<=new->GetYaxis()->GetNbins(); j+=1)
2560 // new->SetBinContent(1, j, proj->GetBinContent(1, j));
2562 // normalize correction for given nPart
2563 for (Int_t i=1; i<=new->GetNbinsX(); ++i)
2565 Double_t sum = new->Integral(i, i, 1, proj->GetNbinsY());
2569 for (Int_t j=1; j<=new->GetNbinsY(); ++j)
2572 new->SetBinContent(i, j, new->GetBinContent(i, j) / sum);
2573 new->SetBinError(i, j, new->GetBinError(i, j) / sum);
2580 TH2* diff = (TH2*) new->Clone("diff");
2581 diff->Add(proj, -1);
2585 diff->SetMinimum(-0.05);
2586 diff->SetMaximum(0.05);
2590 for (Int_t i=1; i<=new->GetNbinsX(); ++i)
2591 for (Int_t j=1; j<=new->GetNbinsY(); ++j)
2592 corr->SetBinContent(corr->GetXaxis()->GetNbins() / 2 + 1, i, j, new->GetBinContent(i, j));
2595 corr->Project3D("zy")->Draw("COLZ");
2597 TFile::Open("out.root", "RECREATE");
2598 mult->SaveHistograms();
2600 TH1* proj1 = proj->ProjectionY("proj1", 36, 36);
2601 TH1* proj2 = new->ProjectionY("proj2", 36, 36);
2602 proj2->SetLineColor(2);
2606 proj2->Draw("SAME");
2609 void buildCorrelationMap(const char* fileName = "multiplicityMC_2M.root", Int_t corrMatrix = 3)
2611 gSystem->Load("libPWG0base");
2613 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2615 TFile::Open(fileName);
2616 mult->LoadHistograms("Multiplicity");
2618 TH3F* new = mult->GetCorrelation(corrMatrix);
2621 TF1* func = new TF1("func", "gaus(0)");
2623 Int_t vtxBin = new->GetNbinsX() / 2;
2628 for (Int_t i=1; i<=new->GetYaxis()->GetNbins(); i+=1)
2630 Float_t x = new->GetYaxis()->GetBinCenter(i);
2631 func->SetParameters(1, x * 0.8, sigma);
2632 //func->SetParameters(1, x, sigma);
2634 for (Int_t j=1; j<=new->GetZaxis()->GetNbins(); j+=1)
2636 Float_t y = new->GetYaxis()->GetBinCenter(j);
2639 if (TMath::Abs(y-x*0.8) < sigma)
2640 new->SetBinContent(vtxBin, i, j, func->Eval(y));
2642 // test only bin 40 has smearing
2644 // new->SetBinContent(vtxBin, i, j, (i == j));
2649 new->Project3D("zy")->DrawCopy("COLZ");
2651 TFile* file = TFile::Open("out.root", "RECREATE");
2652 mult->SetCorrelation(corrMatrix, new);
2653 mult->SaveHistograms();
2657 void GetCrossSections(const char* fileName)
2659 gSystem->Load("libPWG0base");
2661 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2663 TFile::Open(fileName);
2664 mult->LoadHistograms("Multiplicity");
2666 TH1* xSection2 = mult->GetCorrelation(3)->Project3D("y")->Clone("xSection2");
2668 xSection2->Scale(1.0 / xSection2->Integral());
2670 TH1* xSection15 = mult->GetCorrelation(2)->Project3D("y")->Clone("xSection15");
2671 xSection15->Sumw2();
2672 xSection15->Scale(1.0 / xSection15->Integral());
2674 TFile::Open("crosssection.root", "RECREATE");
2676 xSection15->Write();
2680 void AnalyzeSpeciesTree(const char* fileName)
2683 // prints statistics about fParticleSpecies
2686 gSystem->Load("libPWG0base");
2688 TFile::Open(fileName);
2689 TNtuple* fParticleSpecies = (TNtuple*) gFile->Get("fParticleSpecies");
2691 const Int_t nFields = 8;
2693 for (Int_t i=0; i<nFields; i++)
2696 for (Int_t i=0; i<fParticleSpecies->GetEntries(); i++)
2698 fParticleSpecies->GetEvent(i);
2700 Float_t* f = fParticleSpecies->GetArgs();
2702 for (Int_t j=0; j<nFields; j++)
2703 totals[j] += f[j+1];
2706 for (Int_t i=0; i<nFields; i++)
2707 Printf("%d --> %ld", i, totals[i]);
2710 void BuildResponseFromTree(const char* fileName, const char* target)
2713 // builds several response matrices with different particle ratios (systematic study)
2714 // particle-species study
2716 // WARNING doesn't work uncompiled, see test.C
2720 TFile::Open(fileName);
2721 TNtuple* fParticleSpecies = (TNtuple*) gFile->Get("fParticleSpecies");
2723 TFile* file = TFile::Open(target, "RECREATE");
2726 Int_t tracks = 0; // control variables
2728 Int_t secondaries = 0;
2729 Int_t doubleCount = 0;
2731 for (Int_t num = 0; num < 7; num++)
2736 name.Form("Multiplicity_%d", num);
2737 AliMultiplicityCorrection* fMultiplicity = new AliMultiplicityCorrection(name, name);
2739 Float_t ratio[4]; // pi, K, p, other
2740 for (Int_t i = 0; i < 4; i++)
2758 for (Int_t i=0; i<fParticleSpecies->GetEntries(); i++)
2760 fParticleSpecies->GetEvent(i);
2763 Float_t* f = fParticleSpecies->GetArgs();
2768 for (Int_t j = 0; j < 4; j++)
2776 for (Int_t k=0; k<f[j+1]; k++)
2778 if (ratio[j] < 1 && gRandom->Uniform() < ratio[j])
2782 else if (ratio[j] > 1)
2785 if (gRandom->Uniform() < ratio[j] - 1)
2797 for (Int_t k=0; k<f[j+1+4]; k++)
2799 if (ratio[j] < 1 && gRandom->Uniform() < ratio[j])
2803 else if (ratio[j] > 1)
2806 if (gRandom->Uniform() < ratio[j] - 1)
2815 // add the ones w/o label
2819 // secondaries are already part of meas!
2820 secondaries += f[10];
2822 // double counted are already part of meas!
2823 doubleCount += f[11];
2825 // ones w/o label are added without weighting to allow comparison to default analysis. however this is only valid when their fraction is low enough!
2828 //Printf("%.f %.f %.f %.f %.f", f[5], f[6], f[7], f[8], f[9]);
2830 fMultiplicity->FillCorrection(f[0], gene, gene, gene, gene, meas, meas, meas);
2831 // HACK all as kND = 1
2832 fMultiplicity->FillGenerated(f[0], kTRUE, kTRUE, 1, gene, gene, gene, gene);
2833 fMultiplicity->FillMeasured(f[0], meas, meas, meas);
2836 //fMultiplicity->DrawHistograms();
2838 TFile* file = TFile::Open(target, "UPDATE");
2839 fMultiplicity->SaveHistograms();
2844 Printf("%d total tracks, %d w/o label = %.2f %%, %d double counted = %.2f %%, secondaries = %.2f %%", tracks, noLabel, 100.0 * noLabel / tracks, doubleCount, 100.0 * doubleCount / tracks, 100.0 * secondaries / tracks);
2845 if ((Float_t) noLabel / tracks > 0.02)
2846 Printf("WARNING: More than 2%% of tracks without label, this might bias the study!");
2851 void ParticleRatioStudy()
2855 for (Int_t num = 0; num < 7; num++)
2858 target.Form("chi2a_inel_species_%d.root", num);
2860 correct("compositions.root", Form("Multiplicity_%d", num), "multiplicityESD.root", 1, -1, 0, -1, 2, target);
2864 void MergeCrossSection(Int_t xsectionID, const char* output = "multiplicityMC_xsection.root")
2866 const char* files[] = { "multiplicitySD.root", "multiplicityDD.root", "multiplicityND.root" };
2870 TFile::Open(output, "RECREATE");
2873 AliMultiplicityCorrection* data[3];
2876 Float_t ref_SD = -1;
2877 Float_t ref_DD = -1;
2878 Float_t ref_ND = -1;
2880 Float_t error_SD = -1;
2881 Float_t error_DD = -1;
2882 Float_t error_ND = -1;
2884 gROOT->ProcessLine(gSystem->ExpandPathName(".L $ALICE_ROOT/PWG0/dNdEta/drawSystematics.C"));
2885 GetRelativeFractions(xsectionID, ref_SD, ref_DD, ref_ND, error_SD, error_DD, error_ND);
2887 for (Int_t i=0; i<3; ++i)
2890 name.Form("Multiplicity");
2892 name.Form("Multiplicity_%d", i);
2894 TFile::Open(files[i]);
2895 data[i] = new AliMultiplicityCorrection(name, name);
2896 data[i]->LoadHistograms("Multiplicity");
2899 // TODO is the under/overflow bin scaled as well? --> seems like, verify anyway!
2901 // calculating relative
2902 Float_t sd = data[0]->GetMultiplicityINEL(0)->Integral(0, data[0]->GetMultiplicityINEL(0)->GetNbinsX()+1);
2903 Float_t dd = data[1]->GetMultiplicityINEL(0)->Integral(0, data[1]->GetMultiplicityINEL(0)->GetNbinsX()+1);
2904 Float_t nd = data[2]->GetMultiplicityINEL(0)->Integral(0, data[2]->GetMultiplicityINEL(0)->GetNbinsX()+1);
2905 Float_t total = nd + dd + sd;
2911 Printf("Ratios in the correction map are: ND=%f, DD=%f, SD=%f", nd, dd, sd);
2914 ratio[0] = ref_SD / sd;
2915 ratio[1] = ref_DD / dd;
2916 ratio[2] = ref_ND / nd;
2918 Printf("SD=%.2f, DD=%.2f, ND=%.2f",ratio[0], ratio[1], ratio[2]);
2920 for (Int_t i=0; i<3; ++i)
2923 for (Int_t j=0; j<AliMultiplicityCorrection::kMCHists; j++)
2925 data[i]->GetMultiplicityVtx(j)->Scale(ratio[i]);
2926 data[i]->GetMultiplicityMB(j)->Scale(ratio[i]);
2927 data[i]->GetMultiplicityINEL(j)->Scale(ratio[i]);
2928 data[i]->GetMultiplicityNSD(j)->Scale(ratio[i]);
2931 for (Int_t j=0; j<AliMultiplicityCorrection::kESDHists; j++)
2933 data[i]->GetMultiplicityESD(j)->Scale(ratio[i]);
2934 data[i]->GetTriggeredEvents(j)->Scale(ratio[i]);
2935 data[i]->GetNoVertexEvents(j)->Scale(ratio[i]);
2938 for (Int_t j=0; j<AliMultiplicityCorrection::kCorrHists; j++)
2939 data[i]->GetCorrelation(j)->Scale(ratio[i]);
2945 printf("Case %d, %s: Entries in response matrix: SD: %.2f DD: %.2f ND: %.2f", xsectionID, data[0]->GetName(), data[0]->GetCorrelation(0)->Integral(), data[1]->GetCorrelation(0)->Integral(), data[2]->GetCorrelation(0)->Integral());
2947 data[0]->Merge(&list);
2949 Printf(" Total: %.2f", data[0]->GetCorrelation(0)->Integral());
2951 TFile::Open(output, "RECREATE");
2952 data[0]->SaveHistograms();
2957 for (Int_t i=0; i<3; ++i)
2961 void Rebin(const char* fileName = "multiplicityMC_3M.root", Int_t corrMatrix = 3)
2963 // rebins MC axis of correlation map, MC and histogram for corrected (for evaluation of effect of regularization)
2964 // rebin does not exist for 3D hists, so we convert to 2D and then back to 3D (loosing the vertex information)
2966 Printf("WARNING: Vertex information is lost in this process. Use result only for evaluation of errors.");
2968 gSystem->Load("libPWG0base");
2970 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2972 TFile::Open(fileName);
2973 mult->LoadHistograms("Multiplicity");
2975 // rebin correlation
2976 TH3* old = mult->GetCorrelation(corrMatrix);
2978 // empty under/overflow bins in x, otherwise Project3D takes them into account
2979 for (Int_t y=1; y<=old->GetYaxis()->GetNbins(); ++y)
2981 for (Int_t z=1; z<=old->GetZaxis()->GetNbins(); ++z)
2983 old->SetBinContent(0, y, z, 0);
2984 old->SetBinContent(old->GetXaxis()->GetNbins()+1, y, z, 0);
2988 TH2* response = (TH2*) old->Project3D("zy");
2989 response->RebinX(2);
2991 TH3F* new = new TH3F(old->GetName(), old->GetTitle(),
2992 old->GetXaxis()->GetNbins(), old->GetXaxis()->GetBinLowEdge(1), old->GetXaxis()->GetBinUpEdge(old->GetXaxis()->GetNbins()),
2993 old->GetYaxis()->GetNbins() / 2, old->GetYaxis()->GetBinLowEdge(1), old->GetYaxis()->GetBinUpEdge(old->GetYaxis()->GetNbins()),
2994 old->GetZaxis()->GetNbins(), old->GetZaxis()->GetBinLowEdge(1), old->GetZaxis()->GetBinUpEdge(old->GetZaxis()->GetNbins()));
2997 Int_t vtxBin = new->GetNbinsX() / 2;
3001 for (Int_t i=1; i<=new->GetYaxis()->GetNbins(); i+=1)
3002 for (Int_t j=1; j<=new->GetZaxis()->GetNbins(); j+=1)
3003 new->SetBinContent(vtxBin, i, j, response->GetBinContent(i, j));
3005 // rebin MC + hist for corrected
3006 for (AliMultiplicityCorrection::EventType eventType = AliMultiplicityCorrection::kTrVtx; eventType <= AliMultiplicityCorrection::kINEL; eventType++)
3007 mult->GetMultiplicityMC(corrMatrix, eventType)->RebinY(2);
3009 mult->GetMultiplicityESDCorrected(corrMatrix)->Rebin(2);
3011 // recreate measured from correlation matrix to get rid of vertex shift effect
3012 TH2* newMeasured = (TH2*) old->Project3D("zx");
3013 TH2* esd = mult->GetMultiplicityESD(corrMatrix);
3016 // transfer from TH2D to TH2F
3017 for (Int_t i=0; i<=new->GetXaxis()->GetNbins()+1; i+=1)
3018 for (Int_t j=0; j<=new->GetYaxis()->GetNbins()+1; j+=1)
3019 esd->SetBinContent(i, j, newMeasured->GetBinContent(i, j));
3022 new->Project3D("zy")->DrawCopy("COLZ");
3024 TFile* file = TFile::Open("out.root", "RECREATE");
3025 mult->SetCorrelation(corrMatrix, new);
3026 mult->SaveHistograms();
3030 void EvaluateRegularizationEffect(Int_t step, const char* fileNameRebinned = "multiplicityMC_3M_rebinned.root", const char* fileNameNormal = "multiplicityMC_3M.root", Int_t histID = 3)
3032 // due to some static members in AliMultiplicityCorrection, the session has to be restarted after changing the number of parameters, to be fixed
3033 // that is why this is done in 2 steps
3035 gSystem->Load("libPWG0base");
3037 Bool_t fullPhaseSpace = kFALSE;
3041 // first step: unfold without regularization and rebinned histogram ("N=M")
3042 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
3043 TFile::Open(fileNameRebinned);
3044 mult->LoadHistograms();
3046 mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0, 125);
3047 mult->SetCreateBigBin(kFALSE);
3049 mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
3050 mult->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, mult->GetMultiplicityVtx(histID)->ProjectionY("mymchist"));
3052 TFile* file = TFile::Open("EvaluateRegularizationEffect1.root", "RECREATE");
3053 mult->SaveHistograms();
3058 // second step: unfold with regularization and normal histogram
3059 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
3060 TFile::Open(fileNameNormal);
3061 mult2->LoadHistograms();
3063 mult2->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 1e4);
3064 mult2->SetCreateBigBin(kTRUE);
3065 mult2->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
3066 mult2->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, mult2->GetMultiplicityVtx(histID)->ProjectionY("mymchist"));
3068 TH1* result2 = mult2->GetMultiplicityESDCorrected(histID);
3070 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
3071 TFile* file = TFile::Open("EvaluateRegularizationEffect1.root");
3072 mult->LoadHistograms();
3074 TH1* result1 = mult->GetMultiplicityESDCorrected(histID);
3077 TCanvas* canvas = new TCanvas("EvaluateRegularizationEffect", "EvaluateRegularizationEffect", 1000, 800);
3078 canvas->Divide(2, 2);
3081 result1->SetLineColor(1);
3082 result1->DrawCopy();
3083 result2->SetLineColor(2);
3084 result2->DrawCopy("SAME");
3088 result1->Scale(1.0 / result1->Integral());
3089 result2->Scale(1.0 / result2->Integral());
3092 result1->DrawCopy();
3093 result2->DrawCopy("SAME");
3096 TH1* diff = (TH1*) result1->Clone("diff");
3097 diff->Add(result2, -1);
3100 diff->DrawCopy("HIST");
3103 diff->Divide(result1);
3104 diff->GetYaxis()->SetRangeUser(-0.3, 0.3);
3105 diff->DrawCopy("HIST");
3108 for (Int_t i=1; i<=diff->GetNbinsX(); i++)
3109 chi2 += diff->GetBinContent(i) * diff->GetBinContent(i);
3111 Printf("Chi2 is %e", chi2);
3113 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
3117 void MergeDistributions()
3121 const char* dir1 = "run000104824-52_pass4";
3122 const char* dir2 = "run000104867_90_92_pass4";
3124 for (Int_t evType = 0; evType < 2; evType++)
3126 Printf("%d", evType);
3128 const char* evTypeStr = ((evType == 0) ? "inel" : "nsd");
3130 const char* id = "chi2a";
3131 //const char* id = "bayes";
3134 suffix.Form("/all/spd/%s_", id);
3136 suffix.Form("/v0and/spd/%s_", id);
3138 TString file1, file2;
3139 file1.Form("%s%s%%s.root", dir1, suffix.Data());
3140 file2.Form("%s%s%%s.root", dir2, suffix.Data());
3144 const char* files[] = { Form(file1.Data(), evTypeStr), Form(file2.Data(), evTypeStr) };
3145 Merge(2, files, Form("merged/%s_%s.root", id, evTypeStr));
3149 AliMultiplicityCorrection* mult1 = AliMultiplicityCorrection::Open(Form(file1.Data(), evTypeStr));
3150 AliMultiplicityCorrection* mult2 = AliMultiplicityCorrection::Open(Form(file2.Data(), evTypeStr));
3152 AliMultiplicityCorrection* target = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
3154 for (Int_t etaRange = 0; etaRange < 3; etaRange++)
3156 hist1 = mult1->GetMultiplicityESDCorrected(etaRange);
3157 hist2 = mult2->GetMultiplicityESDCorrected(etaRange);
3158 targetHist = target->GetMultiplicityESDCorrected(etaRange);
3160 //hist1->Scale(1.0 / hist1->Integral());
3161 //hist2->Scale(1.0 / hist2->Integral());
3163 //targetHist->SetBinContent(1, hist1->GetBinContent(1) * 0.5 + hist2->GetBinContent(1) * 0.5);
3164 targetHist->SetBinContent(1, hist1->GetBinContent(1) + hist2->GetBinContent(1));
3165 for (Int_t i=1; i<=hist1->GetNbinsX(); i++)
3167 if (hist1->GetBinError(i) > 0 && hist2->GetBinError(i) > 0)
3169 Float_t w1 = 1.0 / hist1->GetBinError(i) / hist1->GetBinError(i);
3170 Float_t w2 = 1.0 / hist2->GetBinError(i) / hist2->GetBinError(i);
3172 Float_t average = (hist1->GetBinContent(i) * w1 + hist2->GetBinContent(i) * w2) / (w1 + w2);
3174 //targetHist->SetBinContent(i, average);
3175 //targetHist->SetBinError(i, TMath::Max(mult1->GetBinError(i), mult2->GetBinError(i)));
3177 targetHist->SetBinContent(i, hist1->GetBinContent(i) + hist2->GetBinContent(i));
3178 targetHist->SetBinError(i, hist1->GetBinError(i) + hist2->GetBinError(i));
3183 file = TFile::Open(Form("merged/%s_%s.root", id, evTypeStr), "RECREATE");
3184 target->SaveHistograms();
3188 const char* files2[] = { Form(file1.Data(), evTypeStr), Form(file2.Data(), evTypeStr), Form("merged/%s_%s.root", id, evTypeStr) };
3189 drawAll(files2, (evType == 1), kTRUE);
3193 void CompareDistributions(Int_t evType)
3196 gROOT->ProcessLine(gSystem->ExpandPathName(".L $ALICE_ROOT/PWG0/dNdEta/drawPlots.C"));
3198 const char* dir1 = "run000104824-52_pass4";
3199 const char* dir2 = "run000104867_90_92_pass4";
3201 const char* evTypeStr = (evType == 0) ? "inel" : "nsd";
3203 const char* suffix = "/all/spd/chi2a_";
3205 suffix = "/v0and/spd/chi2a_";
3207 TString file1, file2;
3208 file1.Form("%s%s%s.root", dir1, suffix, evTypeStr);
3209 file2.Form("%s%s%s.root", dir2, suffix, evTypeStr);
3211 for (Int_t hID = 0; hID < 3; hID++)
3212 CompareQualityHists(file1, file2, Form("Multiplicity/fMultiplicityESDCorrected%d", hID), 1, 1);
3215 void StatisticalUncertainty(Int_t methodType, Int_t etaRange, Bool_t mc = kFALSE)
3219 AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open("multiplicityMC.root");
3220 AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open("multiplicityESD.root");
3221 AliMultiplicityCorrection* multTrigger = AliMultiplicityCorrection::Open("multiplicityTrigger.root");
3223 TH1* mcHist = esd->GetMultiplicityMB(etaRange)->ProjectionY("mymc", 1, 1);
3225 Int_t geneLimits[] = { 0, 0, 0 };
3227 LoadAndInitialize(mult, esd, multTrigger, etaRange, kFALSE, geneLimits);
3229 AliUnfolding::SetNbins(kBinLimits[etaRange], geneLimits[etaRange]);
3230 AliUnfolding::SetChi2Regularization(AliUnfolding::kPol0, 5);
3231 AliUnfolding::SetBayesianParameters(1, 10);
3233 // background subtraction
3234 Int_t background = 0;
3236 //background = 1091 + 4398; // MB1 for run 104824 - 52
3237 background = 417 + 1758; // MB1 for run 104867 - 92
3239 //background = 20 + 0; // V0AND for run 104824 - 52
3240 //background = 10 + 0; // V0AND for run 104867 - 92
3242 Printf("NOTE: Subtracting %d background events", background);
3244 Int_t zeroBin = mult->GetTriggeredEvents(etaRange)->GetBinContent(1) - background - mult->GetMultiplicityESD(etaRange)->Integral(0, 2, 1, 1);
3246 TH1* errorMeasured = (TH1*) mult->StatisticalUncertainty((AliUnfolding::MethodType) methodType, etaRange, kFALSE, AliMultiplicityCorrection::kMB, zeroBin, kTRUE, kFALSE, ((mc) ? mcHist : 0))->Clone("errorMeasured");
3248 new TCanvas; errorMeasured->Draw();
3251 AliPWG0Helper::NormalizeToBinWidth(mult->GetMultiplicityESDCorrected(etaRange));
3252 mult->GetMultiplicityESDCorrected(etaRange)->Draw();
3256 AliPWG0Helper::NormalizeToBinWidth(mcHist);
3257 mcHist->Scale(mult->GetMultiplicityESDCorrected(etaRange)->Integral() / mcHist->Integral());
3258 mcHist->SetLineColor(2);
3259 mcHist->Draw("SAME");
3263 TH1* errorResponse = (TH1*) mult->StatisticalUncertainty((AliUnfolding::MethodType) methodType, etaRange, kFALSE, AliMultiplicityCorrection::kMB, zeroBin, kFALSE, kTRUE, ((mc) ? mcHist : 0))->Clone("errorResponse");
3265 TH1* errorBoth = (TH1*) mult->StatisticalUncertainty((AliUnfolding::MethodType) methodType, etaRange, kFALSE, AliMultiplicityCorrection::kMB, zeroBin, kTRUE, kTRUE, ((mc) ? mcHist : 0))->Clone("errorBoth");
3269 TH1* result = mult->GetMultiplicityESDCorrected(etaRange);
3270 DrawResultRatio(mcHist, result, "StatisticalUncertainty2.eps");
3273 TFile* file = new TFile(Form("StatisticalUncertaintySPD%s.root", (methodType == 0) ? "Chi2" : "Bayesian"), "RECREATE");
3274 errorResponse->Write();
3275 errorMeasured->Write();
3280 void ChangeResponseMatrixEfficiency(Bool_t reduceEff = kTRUE, Float_t factor = 0.01625)
3284 AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open("multiplicity.root");
3286 for (Int_t etaR = 0; etaR < 3; etaR++)
3288 TH3* corr = mult->GetCorrelation(etaR);
3289 TH3* corrOld = (TH3*) corr->Clone("corrOld");
3295 for (Int_t x=0; x<=corr->GetNbinsX()+1; x++)
3297 for (Int_t y=0; y<=corr->GetNbinsY()+1; y++)
3300 for (Int_t z=0; z<=corr->GetNbinsZ()+1; z++)
3302 Float_t tracklets = corr->GetZaxis()->GetBinCenter(z);
3304 for (Int_t n=0; n<corrOld->GetBinContent(x, y, z); n++)
3307 Float_t trackletsNew = tracklets;
3309 for (Int_t i=0; i<tracklets; i++)
3311 if (gRandom->Uniform() < factor)
3313 trackletsNew += (reduceEff) ? -1 : 1;
3314 change += (reduceEff) ? -1 : 1;
3318 corr->Fill(corr->GetXaxis()->GetBinCenter(x), corr->GetYaxis()->GetBinCenter(y), trackletsNew);
3324 Printf("%d: Changed %d out of %d total tracklets", etaR, change, total);
3327 file = TFile::Open("out.root", "RECREATE");
3328 mult->SaveHistograms();