4 // script to correct the multiplicity spectrum + helpers
9 gSystem->Load("libPWG0base");
10 AliMultiplicityCorrection::SetQualityRegions(kFALSE);
13 const char* GetMultLabel(Int_t etaR = -1, Bool_t trueM = kTRUE)
18 TString tmpStr((trueM) ? "True " : "Measured ");
22 tmpStr += "multiplicity (full phase space)";
25 tmpStr += Form("multiplicity in |#eta| < %.1f", (etaR+1)* 0.5);
26 return Form("%s", tmpStr.Data());
29 void draw(const char* fileName = "multiplicity.root", const char* folder = "Multiplicity")
33 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection(folder, folder);
35 TFile::Open(fileName);
36 mult->LoadHistograms();
37 mult->DrawHistograms();
39 TH2* hist = (TH2*) gROOT->FindObject("fCorrelation2_zy");
40 canvas = new TCanvas("c1", "c1", 600, 500);
41 canvas->SetTopMargin(0.05);
42 hist->SetStats(kFALSE);
44 hist->SetTitle(";true multiplicity in |#eta| < 1.5;measured multiplicity in |#eta| < 1.5");
45 hist->GetYaxis()->SetTitleOffset(1.1);
46 gPad->SetRightMargin(0.12);
49 canvas->SaveAs("responsematrix.eps");
54 gSystem->Load("libTree");
55 gSystem->Load("libVMC");
57 gSystem->Load("libSTEERBase");
58 gSystem->Load("libANALYSIS");
59 gSystem->Load("libANALYSISalice");
60 gSystem->Load("libPWG0base");
63 void correct(const char* fileNameMC = "multiplicityMC.root", const char* folder = "Multiplicity", const char* fileNameESD = "multiplicityESD.root", Bool_t chi2 = kFALSE, Int_t histID = 1, Bool_t fullPhaseSpace = kFALSE, Float_t beta = 1e5, Int_t eventType = 0 /* AliMultiplicityCorrection::kTrVtx */, const char* targetFile = "unfolded.root", const char* folderESD = "Multiplicity")
67 AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open(fileNameMC, folder);
68 AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open(fileNameESD, folderESD);
70 TH2F* hist = esd->GetMultiplicityESD(histID);
71 TH2F* hist2 = esd->GetMultiplicityMC(histID, eventType);
72 TH1* mcCompare = hist2->ProjectionY("mcmchist", 1, hist2->GetNbinsX());
74 mult->SetMultiplicityESD(histID, hist);
76 // small hack to get around charge conservation for full phase space ;-)
79 TH1* corr = mult->GetCorrelation(histID + 4);
81 for (Int_t i=2; i<=corr->GetNbinsX(); i+=2)
82 for (Int_t j=1; j<=corr->GetNbinsY(); ++j)
84 corr->SetBinContent(i, j, corr->GetBinContent(i-1, j));
85 corr->SetBinError(i, j, corr->GetBinError(i-1, j));
91 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol0, beta);
92 //mult->SetCreateBigBin(kFALSE);
93 //mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0); //mult->SetCreateBigBin(kFALSE);
94 //mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0, 125); mult->SetCreateBigBin(kFALSE);
95 //mult->SetRegularizationParameters(AliMultiplicityCorrection::kEntropy, 1e4);
96 //mult->SetRegularizationParameters(AliMultiplicityCorrection::kLog, 1e5);
98 //mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kTRUE, mcCompare);
99 //mult->SetMultiplicityESDCorrected(histID, (TH1F*) mcCompare);
101 mult->ApplyMinuitFit(histID, fullPhaseSpace, eventType, kFALSE); //hist2->ProjectionY("mymchist"));
105 mult->ApplyBayesianMethod(histID, fullPhaseSpace, eventType, 1, 10, 0, kTRUE);
108 mult->SetMultiplicityMC(histID, eventType, hist2);
110 Printf("Writing result to %s", targetFile);
111 TFile* file = TFile::Open(targetFile, "RECREATE");
112 mult->SaveHistograms();
116 mult->DrawComparison((chi2) ? "MinuitChi2" : "Bayesian", histID, fullPhaseSpace, kTRUE, mcCompare);
119 void DrawBayesianIterations(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", Int_t histID = 1, Int_t eventType = 0 /* AliMultiplicityCorrection::kTrVtx */)
123 const char* folder = "Multiplicity";
125 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection(folder, folder);
126 TFile::Open(fileNameMC);
127 mult->LoadHistograms();
129 AliMultiplicityCorrection* esd = new AliMultiplicityCorrection(folder, folder);
130 TFile::Open(fileNameESD);
131 esd->LoadHistograms();
133 TH2F* hist = esd->GetMultiplicityESD(histID);
134 TH2F* hist2 = esd->GetMultiplicityMC(histID, eventType);
136 mult->SetMultiplicityESD(histID, hist);
137 mult->SetMultiplicityMC(histID, eventType, hist2);
139 TH1* mcCompare = hist2->ProjectionY("mcmchist", 1, hist2->GetNbinsX());
140 //mcCompare->Scale(1.0 / mcCompare->Integral());
142 TH1* esdHist = (TH1*) hist->ProjectionY("myesd", 1, 1)->Clone("myesd");
143 //esdHist->Scale(1.0 / esdHist->Integral());
145 c = new TCanvas("c", "c", 1200, 600);
149 gPad->SetLeftMargin(0.12);
150 gPad->SetTopMargin(0.05);
151 gPad->SetRightMargin(0.05);
156 mcCompare->GetXaxis()->SetRangeUser(0, 80);
157 mcCompare->SetStats(0);
158 mcCompare->SetFillColor(5);
159 mcCompare->SetLineColor(5);
160 mcCompare->SetTitle(Form(";%s;Entries", GetMultLabel(1)));
161 mcCompare->GetYaxis()->SetRangeUser(2, esdHist->GetMaximum() * 2);
162 mcCompare->GetYaxis()->SetTitleOffset(1.3);
163 mcCompare->Draw("HIST");
164 esdHist->SetMarkerStyle(5);
165 esdHist->Draw("P HIST SAME");
168 gPad->SetTopMargin(0.05);
169 gPad->SetRightMargin(0.05);
173 trueMeasuredRatio = (TH1*) mcCompare->Clone("trueMeasuredRatio");
174 trueMeasuredRatio->Divide(esdHist);
175 trueMeasuredRatio->SetStats(0);
176 trueMeasuredRatio->SetTitle(Form(";%s;Ratio", GetMultLabel(1)));
177 trueMeasuredRatio->GetYaxis()->SetTitleOffset(1.3);
178 trueMeasuredRatio->GetYaxis()->SetRangeUser(0, 2);
179 // ROOT displays all values > 2 at 2 which looks weird
180 for (Int_t i=1; i<=trueMeasuredRatio->GetNbinsX(); i++)
181 if (trueMeasuredRatio->GetBinContent(i) > 2)
182 trueMeasuredRatio->SetBinContent(i, 0);
183 trueMeasuredRatio->SetMarkerStyle(5);
184 trueMeasuredRatio->Draw("P");
186 Int_t colors[] = {1, 2, 4, 6};
188 legend = new TLegend(0.15, 0.13, 0.5, 0.5);
189 legend->SetFillColor(0);
190 legend->SetTextSize(0.04);
192 legend->AddEntry(mcCompare, "True", "F");
193 legend->AddEntry(esdHist, "Measured", "P");
195 legend2 = new TLegend(0.15, 0.13, 0.5, 0.4);
196 legend2->SetFillColor(0);
197 legend2->SetTextSize(0.04);
199 legend2->AddEntry(trueMeasuredRatio, "Measured", "P");
201 Int_t iters[] = {1, 3, 10, -1};
202 for (Int_t i = 0; i<4; i++)
204 Int_t iter = iters[i];
205 mult->ApplyBayesianMethod(histID, kFALSE, eventType, 1, iter, 0, 0);
206 corr = mult->GetMultiplicityESDCorrected(histID);
207 corr->Scale(1.0 / corr->Integral());
208 corr->Scale(mcCompare->Integral());
209 corr->GetXaxis()->SetRangeUser(0, 80);
210 //corr->SetMarkerStyle(20+iter);
211 corr->SetLineColor(colors[i]);
212 corr->SetLineStyle(i+1);
213 corr->SetLineWidth(2);
216 corr->DrawCopy("SAME HIST");
219 clone = (TH1*) corr->Clone("clone");
220 clone->Divide(mcCompare, corr);
221 clone->GetYaxis()->SetRangeUser(0, 2);
222 clone->DrawCopy("SAME HIST");
224 legend->AddEntry((TH1*) corr->Clone(), (iter > -1) ? Form("%d iteration%s", iter, (iter == 1) ? "" : "s") : "Convergence", "L");
225 legend2->AddEntry((TH1*) corr->Clone(), (iter > -1) ? Form("%d iteration%s", iter, (iter == 1) ? "" : "s") : "Convergence", "L");
234 c->SaveAs("bayesian_iterations.eps");
237 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)
239 const char* folder = "Multiplicity";
243 AliMultiplicityCorrection* chi2 = new AliMultiplicityCorrection(folder, folder);
244 TFile::Open(chi2File);
245 chi2->LoadHistograms();
247 AliMultiplicityCorrection* bayesian = new AliMultiplicityCorrection(folder, folder);
248 TFile::Open(bayesianFile);
249 bayesian->LoadHistograms();
251 histRAW = chi2->GetMultiplicityESD(histID)->ProjectionY("raw", 1, chi2->GetMultiplicityESD(histID)->GetNbinsX());
252 histRAW->Scale(1.0 / histRAW->Integral());
254 histC = chi2->GetMultiplicityESDCorrected(histID);
255 histB = bayesian->GetMultiplicityESDCorrected(histID);
257 c = new TCanvas("CompareChi2Bayesian", "CompareChi2Bayesian", 800, 600);
258 c->SetRightMargin(0.05);
259 c->SetTopMargin(0.05);
264 histC->SetTitle(";N;P(N)");
265 histC->SetStats(kFALSE);
266 histC->GetXaxis()->SetRangeUser(0, 100);
268 histC->SetLineColor(1);
269 histB->SetLineColor(2);
270 histRAW->SetLineColor(3);
272 histC->DrawCopy("HISTE");
273 histB->DrawCopy("HISTE SAME");
274 histRAW->DrawCopy("SAME");
276 legend = new TLegend(0.2, 0.2, 0.4, 0.4);
277 legend->SetFillColor(0);
279 legend->AddEntry(histC, label1);
280 legend->AddEntry(histB, label2);
281 legend->AddEntry(histRAW, "raw ESD");
284 if (simpleCorrect > 0)
287 graph->SetMarkerStyle(25);
288 graph->SetFillColor(0);
289 for (Int_t bin=1; bin<=histRAW->GetNbinsX(); bin++)
290 graph->SetPoint(graph->GetN(), histRAW->GetXaxis()->GetBinCenter(bin) * simpleCorrect, histRAW->GetBinContent(bin));
292 graph->Draw("PSAME");
293 legend->AddEntry(graph, "weighting");
295 // now create histogram from graph and normalize
296 histGraph = (TH1*) histRAW->Clone();
298 for (Int_t bin=1; bin<=histGraph->GetNbinsX(); bin++)
301 for (j=1; j<graph->GetN(); j++)
302 if (graph->GetX()[j] > histGraph->GetXaxis()->GetBinCenter(bin))
304 if (j == graph->GetN())
306 if (histGraph->GetXaxis()->GetBinCenter(bin) - graph->GetX()[j] < graph->GetX()[j-1] - histGraph->GetXaxis()->GetBinCenter(bin))
308 histGraph->SetBinContent(bin, graph->GetY()[j]);
311 Printf("Integral = %f", histGraph->Integral());
312 histGraph->Scale(1.0 / histGraph->Integral());
314 histGraph->SetLineColor(6);
315 histGraph->DrawCopy("SAME");
316 legend->AddEntry(histGraph, "weighting normalized");
321 AliMultiplicityCorrection* mc = new AliMultiplicityCorrection(folder, folder);
323 mc->LoadHistograms();
325 histMC = mc->GetMultiplicityVtx(histID)->ProjectionY("mc", 1, mc->GetMultiplicityVtx(histID)->GetNbinsX());
327 histMC->Scale(1.0 / histMC->Integral());
329 histMC->Draw("HISTE SAME");
330 histMC->SetLineColor(4);
331 legend->AddEntry(histMC, "MC");
336 c->SaveAs(Form("%s.png", c->GetName()));
337 c->SaveAs(Form("%s.eps", c->GetName()));
344 c = new TCanvas("CompareChi2BayesianRatio", "CompareChi2BayesianRatio", 800, 600);
345 c->SetRightMargin(0.05);
346 c->SetTopMargin(0.05);
350 for (Int_t bin=1; bin<=histC->GetNbinsX(); bin++)
352 if (histMC->GetBinContent(bin) > 0)
354 histC->SetBinContent(bin, histC->GetBinContent(bin) / histMC->GetBinContent(bin));
355 histB->SetBinContent(bin, histB->GetBinContent(bin) / histMC->GetBinContent(bin));
360 histGraph->SetBinContent(bin, histGraph->GetBinContent(bin) / histMC->GetBinContent(bin));
361 histGraph->SetBinError(bin, 0);
366 histC->SetBinError(bin, 0);
367 histB->SetBinError(bin, 0);
371 histC->GetYaxis()->SetRangeUser(0.5, 2);
372 histC->GetYaxis()->SetTitle("Unfolded / MC");
375 histB->Draw("HIST SAME");
378 histGraph->Draw("HIST SAME");
382 if (simpleCorrect > 0)
385 graph2->SetMarkerStyle(25);
386 graph2->SetFillColor(0);
387 for (Int_t i=0; i<graph->GetN(); i++)
389 Float_t mcValue = histMC->GetBinContent(histMC->FindBin(graph->GetX()[i]));
390 Float_t mcError = histMC->GetBinError(histMC->FindBin(graph->GetX()[i]));
392 graph2->SetPoint(graph2->GetN(), graph->GetX()[i], graph->GetY()[i] / mcValue);
394 graph2->Draw("PSAME");
398 c->SaveAs(Form("%s.png", c->GetName()));
399 c->SaveAs(Form("%s.eps", c->GetName()));
403 void CompareMC(Int_t histID, Int_t eventType, const char* file1, const char* file2, const char* label1, const char* label2)
405 const char* folder = "Multiplicity";
409 AliMultiplicityCorrection* mc1 = new AliMultiplicityCorrection(folder, folder);
411 mc1->LoadHistograms();
412 histMC1 = mc1->GetMultiplicityMC(histID, eventType)->ProjectionY("mc1", 1, mc1->GetMultiplicityMC(histID, eventType)->GetNbinsX());
413 histMC1->Scale(1.0 / histMC1->Integral());
415 AliMultiplicityCorrection* mc2 = new AliMultiplicityCorrection(folder, folder);
417 mc2->LoadHistograms();
418 histMC2 = mc2->GetMultiplicityMC(histID, eventType)->ProjectionY("mc2", 1, mc2->GetMultiplicityMC(histID, eventType)->GetNbinsX());
419 histMC2->Scale(1.0 / histMC2->Integral());
421 c = new TCanvas("CompareMC", "CompareMC", 800, 600);
422 c->SetRightMargin(0.05);
423 c->SetTopMargin(0.05);
426 histMC1->SetTitle(";N;P(N)");
427 histMC1->SetStats(kFALSE);
428 histMC1->GetXaxis()->SetRangeUser(0, 100);
430 histMC1->SetLineColor(1);
431 histMC2->SetLineColor(2);
434 histMC2->Draw("SAME");
436 legend = new TLegend(0.2, 0.2, 0.4, 0.4);
437 legend->SetFillColor(0);
439 legend->AddEntry(histMC1, label1);
440 legend->AddEntry(histMC2, label2);
444 c->SaveAs(Form("%s.gif", c->GetName()));
445 c->SaveAs(Form("%s.eps", c->GetName()));
448 void* fit2Step(const char* fileNameMC = "multiplicityMC_2M.root", const char* fileNameESD = "multiplicityMC_1M_3.root", Int_t histID = 3, Bool_t fullPhaseSpace = kFALSE)
450 gSystem->Load("libPWG0base");
452 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
454 TFile::Open(fileNameMC);
455 mult->LoadHistograms("Multiplicity");
457 TFile::Open(fileNameESD);
458 TH2F* hist = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityESD%d", histID));
459 TH2F* hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityVtx%d", ((fullPhaseSpace) ? 4 : histID)));
460 //hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityINEL%d", histID));
462 mult->SetMultiplicityESD(histID, hist);
464 // small hack to get around charge conservation for full phase space ;-)
467 TH1* corr = mult->GetCorrelation(histID + 4);
469 for (Int_t i=2; i<=corr->GetNbinsX(); i+=2)
470 for (Int_t j=1; j<=corr->GetNbinsY(); ++j)
472 corr->SetBinContent(i, j, corr->GetBinContent(i-1, j));
473 corr->SetBinError(i, j, corr->GetBinError(i-1, j));
477 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
478 mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
479 mult->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, hist2->ProjectionY("mymchist"));
481 TH1* result = (TH1*) mult->GetMultiplicityESDCorrected((fullPhaseSpace) ? 4 : histID))->Clone("firstresult");
483 mult->SetRegularizationParameters(AliMultiplicityCorrection::kEntropy, 100000);
484 mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE, result);
485 mult->DrawComparison("MinuitChi2_Step2", histID, fullPhaseSpace, kTRUE, hist2->ProjectionY("mymchist"));
490 const char* GetRegName(Int_t type)
494 case AliMultiplicityCorrection::kNone: return "None"; break;
495 case AliMultiplicityCorrection::kPol0: return "Pol0"; break;
496 case AliMultiplicityCorrection::kPol1: return "Pol1"; break;
497 case AliMultiplicityCorrection::kCurvature: return "TotalCurvature"; break;
498 case AliMultiplicityCorrection::kEntropy: return "Reduced cross-entropy"; break;
499 case AliMultiplicityCorrection::kLog : return "Log"; break;
504 const char* GetEventTypeName(Int_t type)
508 case AliMultiplicityCorrection::kTrVtx: return "trigger, vertex"; break;
509 case AliMultiplicityCorrection::kMB: return "minimum bias"; break;
510 case AliMultiplicityCorrection::kINEL: return "inelastic"; break;
515 void EvaluateBayesianMethodIterationsSmoothing(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", const char* targetDir = "bayesian", Int_t histID = 1)
517 gSystem->mkdir(targetDir);
519 gSystem->Load("libPWG0base");
521 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
522 TFile::Open(fileNameMC);
523 mult->LoadHistograms("Multiplicity");
525 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
526 TFile::Open(fileNameESD);
527 multESD->LoadHistograms("Multiplicity");
528 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
530 Int_t count = 0; // just to order the saved images...
532 TFile* graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir), "RECREATE");
534 Int_t colors[] = {1, 2, 3, 4, 6};
535 Int_t markers[] = {20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 3, 4, 5, 6};
537 for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kTrVtx; ++type)
538 //for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kINEL; ++type)
541 tmp.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));
543 TCanvas* canvas = new TCanvas(tmp, tmp, 800, 600);
545 for (Int_t i = 1; i <= 5; i++)
547 Int_t iterArray[5] = {2, 5, 10, 20, -1};
548 Int_t iter = iterArray[i-1];
550 TGraph* fitResultsMC[3];
551 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
553 fitResultsMC[region] = new TGraph;
554 fitResultsMC[region]->SetTitle(Form("%d iterations - reg. %d", iter, region+1));
555 fitResultsMC[region]->GetXaxis()->SetTitle("smoothing parameter #alpha");
556 fitResultsMC[region]->GetYaxis()->SetTitle(Form("P_{1} in region %d", region));
557 fitResultsMC[region]->SetName(Form("%s_MC_%d", tmp.Data(), i * AliMultiplicityCorrection::kQualityRegions + region - 2));
558 fitResultsMC[region]->SetFillColor(0);
559 //fitResultsMC[region]->SetMarkerStyle(markers[(i-1) * AliMultiplicityCorrection::kQualityRegions + region]);
560 fitResultsMC[region]->SetMarkerStyle(markers[i-1]);
561 fitResultsMC[region]->SetLineColor(colors[i-1]);
562 fitResultsMC[region]->SetMarkerColor(colors[i-1]);
565 TGraph* fitResultsRes = new TGraph;
566 fitResultsRes->SetTitle(Form("%d iterations", iter));
567 fitResultsRes->SetName(Form("%s_Res_%d", tmp.Data(), i));
568 fitResultsRes->GetXaxis()->SetTitle("smoothing parameter");
569 fitResultsRes->GetYaxis()->SetTitle("P_{2}");
571 fitResultsRes->SetFillColor(0);
572 fitResultsRes->SetMarkerStyle(markers[i-1]);
573 fitResultsRes->SetMarkerColor(colors[i-1]);
574 fitResultsRes->SetLineColor(colors[i-1]);
576 for (Float_t weight = 0.0; weight < 1.01; weight += 0.2)
579 Float_t residuals = 0;
581 mult->ApplyBayesianMethod(histID, kFALSE, type, weight, iter, 0, kFALSE);
582 mult->DrawComparison(Form("%s/BayesianIterSmooth_%03d_%d_%d_%f", targetDir, count++, type, iter, weight), histID, kFALSE, kTRUE, multESD->GetMultiplicityMC(histID, type)->ProjectionY());
583 mult->GetComparisonResults(&chi2MC, 0, &residuals);
585 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
586 fitResultsMC[region]->SetPoint(fitResultsMC[region]->GetN(), weight, mult->GetQuality(region));
588 fitResultsRes->SetPoint(fitResultsRes->GetN(), weight, residuals);
592 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
593 fitResultsMC[region]->Write();
595 fitResultsRes->Write();
602 void EvaluateDrawResult(const char* targetDir, Int_t type = 0, Bool_t plotRes = kTRUE)
604 gSystem->Load("libPWG0base");
607 TFile* graphFile = 0;
610 name = "EvaluateChi2Method";
611 graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir));
615 name.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));
616 graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir));
619 TCanvas* canvas = new TCanvas(name, name, 800, 500);
625 canvas->SetTopMargin(0.05);
629 TLegend* legend = new TLegend(0.8, 0.15, 0.98, 0.98);
630 legend->SetFillColor(0);
640 Float_t yMinRegion[3];
641 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
642 yMinRegion[i] = 1e20;
644 TString xaxis, yaxis;
648 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
649 TGraph* res = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
654 xaxis = mc->GetXaxis()->GetTitle();
655 yaxis = mc->GetYaxis()->GetTitle();
662 xMin = TMath::Min(xMin, mc->GetXaxis()->GetXmin());
663 yMin = TMath::Min(yMin, mc->GetYaxis()->GetXmin());
665 xMax = TMath::Max(xMax, mc->GetXaxis()->GetXmax());
666 yMax = TMath::Max(yMax, mc->GetYaxis()->GetXmax());
670 xMin = TMath::Min(xMin, res->GetXaxis()->GetXmin());
671 yMin = TMath::Min(yMin, res->GetYaxis()->GetXmin());
673 xMax = TMath::Max(xMax, res->GetXaxis()->GetXmax());
674 yMax = TMath::Max(yMax, res->GetYaxis()->GetXmax());
677 for (Int_t i=0; i<mc->GetN(); ++i)
678 yMinRegion[(count-1) % 3] = TMath::Min(yMinRegion[(count-1) % 3], mc->GetY()[i]);
683 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
684 Printf("Minimum for region %d is %f", i, yMinRegion[i]);
688 xaxis = "smoothing parameter";
692 xaxis = "weight parameter";
695 //yaxis = "P_{1} (2 <= t <= 150)";
697 printf("%f %f %f %f\n", xMin, xMax, yMin, yMax);
699 TGraph* dummy = new TGraph;
700 dummy->SetPoint(0, xMin, yMin);
701 dummy->SetPoint(1, xMax, yMax);
702 dummy->SetTitle(Form(";%s;%s", xaxis.Data(), yaxis.Data()));
704 dummy->SetMarkerColor(0);
706 dummy->GetYaxis()->SetMoreLogLabels(1);
712 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
713 TGraph* res = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
715 //printf("%s_MC_%d %p %p\n", name.Data(), count, mc, res);
720 printf("Loaded %d sucessful.\n", count);
724 legend->AddEntry(mc, Form("Eq. (%d) - reg. %d", 10 + (count-1) / 3, 1+ (count-1) % 3));
727 legend->AddEntry(mc);
733 legend->AddEntry(res);
734 res->Draw("SAME PC");
742 canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
743 canvas->SaveAs(Form("%s/%s.eps", targetDir, canvas->GetName()));
746 void EvaluateDrawResultRegions(const char* targetDir, Int_t type = 0)
751 TFile* graphFile = 0;
754 name = "EvaluateChi2Method";
755 graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir));
759 name.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));
760 graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir));
763 TCanvas* canvas = new TCanvas(name, name, 1200, 800);
764 //canvas->Divide(1, AliMultiplicityCorrection::kQualityRegions, 0, 0);
765 canvas->SetTopMargin(0);
766 canvas->SetBottomMargin(0);
767 canvas->SetRightMargin(0.05);
768 canvas->Range(0, 0, 1, 1);
771 pad[3] = new TPad(Form("%s_pad1", name.Data()), "", 0, 0, 0.5, 0.5); pad[3]->SetTopMargin(0); pad[3]->SetBottomMargin(0.15);
772 pad[1] = new TPad(Form("%s_pad2", name.Data()), "", 0, 0.5, 0.5, 1); pad[1]->SetBottomMargin(0);
773 pad[0] = new TPad(Form("%s_pad3", name.Data()), "", 0.5, 0, 1, 0.5); pad[0]->SetTopMargin(0); pad[0]->SetBottomMargin(0.15);
774 pad[2] = new TPad(Form("%s_pad4", name.Data()), "", 0.5, 0.5, 1, 1); pad[2]->SetBottomMargin(0);
776 Float_t yMinRegion[3];
777 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
778 yMinRegion[i] = 1e20;
780 for (Int_t region = 0; region <= AliMultiplicityCorrection::kQualityRegions; region++)
785 pad[region]->SetRightMargin(0.05);
789 pad[region]->SetLogx();
791 pad[region]->SetLogy();
793 pad[region]->SetGridx();
794 pad[region]->SetGridy();
796 TLegend* legend = new TLegend(0.5, 0.4, 0.85, 0.85);
797 legend->SetFillColor(0);
798 //legend->SetNColumns(3);
799 legend->SetTextSize(0.06);
808 TString xaxis, yaxis;
816 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
820 if (TString(mc->GetTitle()).Contains(Form("reg. %d", region)) == kFALSE)
823 for (Int_t i=0; i<mc->GetN(); ++i)
824 yMinRegion[(count-1) % 3] = TMath::Min(yMinRegion[(count-1) % 3], mc->GetY()[i]);
828 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
833 xaxis = mc->GetXaxis()->GetTitle();
834 yaxis = mc->GetYaxis()->GetTitle();
838 xMin = TMath::Min(xMin, mc->GetXaxis()->GetXmin());
839 yMin = TMath::Min(yMin, TMath::MinElement(mc->GetN(), mc->GetY()));
841 xMax = TMath::Max(xMax, mc->GetXaxis()->GetXmax());
842 yMax = TMath::Max(yMax, mc->GetYaxis()->GetXmax());
844 //Printf("%f %f %f %f", xMin, xMax, yMin, yMax);
849 xaxis = "Smoothing parameter #alpha";
853 xaxis = "Weight parameter #beta";
858 yaxis = Form("Q_{1} in region %d ", region); // (2 <= t <= 150)";
863 printf("%f %f %f %f\n", xMin, xMax, yMin, yMax);
882 TH1* dummy = new TH2F("dummy", "dummy", 100, xMin, xMax, 100, yMin * 0.9, yMax * 1.1);
883 dummy->SetTitle(Form(";%s;%s", xaxis.Data(), yaxis.Data()));
885 if (region == 0 && type != -1)
886 dummy->GetYaxis()->SetMoreLogLabels(1);
887 dummy->SetLabelSize(0.06, "xy");
888 dummy->SetTitleSize(0.06, "xy");
889 dummy->GetXaxis()->SetTitleOffset(1.2);
890 dummy->GetYaxis()->SetTitleOffset(0.8);
904 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
905 if (mc && TString(mc->GetTitle()).Contains(Form("reg. %d", region)) == kFALSE)
909 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
913 //printf("Loaded %d sucessful.\n", count);
917 //legend->AddEntry(mc, Form("Eq. (%d) - reg. %d", 10 + (count-1) / 3, 1+ (count-1) % 3));
918 //legend->AddEntry(mc, Form("Eq. (7.%d)", 11 + (count-1) / 3));
919 const char* names[] = { "Const", "Linear", "Log" };
920 legend->AddEntry(mc, names[(count-1) / 3], "PL");
924 TString label(mc->GetTitle());
925 TString newLabel(label(0, label.Index(" ")));
926 //Printf("%s", newLabel.Data());
927 if (newLabel.Atoi() == -1)
929 newLabel = "Convergence";
932 newLabel = label(0, label.Index("iterations") + 10);
934 legend->AddEntry(mc, newLabel, "PL");
945 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
946 Printf("Minimum for region %d is %f", i, yMinRegion[i]);
949 canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
950 canvas->SaveAs(Form("%s/%s.eps", targetDir, canvas->GetName()));
953 void EvaluateChi2Method(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", const char* targetDir = "chi2compare", Int_t histID = 1)
955 gSystem->mkdir(targetDir);
957 gSystem->Load("libPWG0base");
959 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
961 TFile::Open(fileNameMC);
962 mult->LoadHistograms("Multiplicity");
964 TFile::Open(fileNameESD);
965 TH2F* hist = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityESD%d", histID));
966 TH2F* hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityVtx%d", histID));
968 mult->SetMultiplicityESD(histID, hist);
970 Int_t count = 0; // just to order the saved images...
971 Int_t colors[] = {1, 2, 4, 3};
972 Int_t markers[] = {20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 3};
974 TGraph* fitResultsRes = 0;
976 TFile* graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir), "RECREATE");
978 //for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kPol0; type <= AliMultiplicityCorrection::kLog; ++type)
979 //for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kEntropy; type <= AliMultiplicityCorrection::kEntropy; ++type)
980 for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kPol1; type <= AliMultiplicityCorrection::kPol1; ++type)
982 TGraph* fitResultsMC[3];
983 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
985 fitResultsMC[region] = new TGraph;
986 fitResultsMC[region]->SetTitle(Form("Eq. (%d) - reg. %d", type+9, region+1));
987 fitResultsMC[region]->GetXaxis()->SetTitle("weight parameter #alpha");
988 fitResultsMC[region]->GetYaxis()->SetTitle(Form("P_{1} in region %d", region));
989 fitResultsMC[region]->SetName(Form("EvaluateChi2Method_MC_%d", type * AliMultiplicityCorrection::kQualityRegions + region - 2));
990 fitResultsMC[region]->SetFillColor(0);
991 //fitResultsMC[region]->SetMarkerStyle(markers[(type-1) * AliMultiplicityCorrection::kQualityRegions + region]);
992 //fitResultsMC[region]->SetLineColor(colors[region]);
993 fitResultsMC[region]->SetMarkerStyle(markers[type-1]);
994 fitResultsMC[region]->SetMarkerColor(colors[type-1]);
995 fitResultsMC[region]->SetLineColor(colors[type-1]);
998 fitResultsRes = new TGraph;
999 fitResultsRes->SetTitle(Form("%s residual chi2", GetRegName(type)));
1000 fitResultsRes->SetName(Form("EvaluateChi2Method_Res_%d", type));
1001 fitResultsRes->GetXaxis()->SetTitle("Weight Parameter");
1003 fitResultsRes->SetFillColor(0);
1004 fitResultsRes->SetMarkerStyle(markers[type-1]);
1005 fitResultsRes->SetMarkerColor(colors[type-1]);
1006 fitResultsRes->SetLineColor(colors[type-1]);
1008 for (Int_t i=0; i<15; ++i)
1010 Float_t weight = TMath::Power(TMath::Sqrt(10), i+1);
1011 //Float_t weight = TMath::Power(10, i+2);
1013 //if (type == AliMultiplicityCorrection::kEntropy) weight = 1e4 * (i+1) * 1.5;
1016 Float_t residuals = 0;
1017 Float_t chi2Limit = 0;
1020 runName.Form("MinuitChi2_%02d_%d_%f", count++, type, weight);
1022 mult->SetRegularizationParameters(type, weight);
1023 Int_t status = mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx);
1024 mult->DrawComparison(Form("%s/%s", targetDir, runName.Data()), histID, kFALSE, kTRUE, hist2->ProjectionY("mymc", 1, hist2->GetNbinsX()));
1027 printf("MINUIT did not succeed. Skipping...\n");
1031 mult->GetComparisonResults(&chi2MC, 0, &residuals);
1032 TH1* result = mult->GetMultiplicityESDCorrected(histID);
1033 result->SetName(runName);
1036 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1037 fitResultsMC[region]->SetPoint(fitResultsMC[region]->GetN(), weight, mult->GetQuality(region));
1039 fitResultsRes->SetPoint(fitResultsRes->GetN(), weight, residuals);
1043 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1044 fitResultsMC[region]->Write();
1045 fitResultsRes->Write();
1051 void EvaluateChi2MethodAll()
1053 EvaluateChi2Method("multiplicityMC_3M.root", "multiplicityMC_3M.root", "eval-3M-3M");
1054 EvaluateChi2Method("multiplicityMC_2M.root", "multiplicityMC_1M_3.root", "eval-2M-1M");
1055 EvaluateChi2Method("multiplicityMC_3M.root", "multiplicityMC_3M_NBD.root", "eval-3M-NBD");
1056 EvaluateChi2Method("multiplicityMC_2M_smoothed.root", "multiplicityMC_1M_3.root", "eval-2MS-1M");
1057 EvaluateChi2Method("multiplicityMC_2M_smoothed.root", "multiplicityMC_3M_NBD.root", "eval-2MS-NBD");
1060 void EvaluateBayesianMethodAll()
1062 EvaluateBayesianMethod("multiplicityMC_3M.root", "multiplicityMC_3M.root", "eval-3M-3M");
1063 EvaluateBayesianMethod("multiplicityMC_2M.root", "multiplicityMC_1M_3.root", "eval-2M-1M");
1064 EvaluateBayesianMethod("multiplicityMC_3M.root", "multiplicityMC_3M_NBD.root", "eval-3M-NBD");
1065 EvaluateBayesianMethod("multiplicityMC_2M_smoothed.root", "multiplicityMC_1M_3.root", "eval-2MS-1M");
1066 EvaluateBayesianMethod("multiplicityMC_2M_smoothed.root", "multiplicityMC_3M_NBD.root", "eval-2MS-NBD");
1069 void CompareMethods(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityMC.root", const char* targetDir, Int_t histID = 3)
1071 gSystem->mkdir(targetDir);
1073 gSystem->Load("libPWG0base");
1075 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1077 TFile::Open(fileNameMC);
1078 mult->LoadHistograms("Multiplicity");
1080 TFile::Open(fileNameESD);
1081 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
1082 multESD->LoadHistograms("Multiplicity");
1084 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
1086 TCanvas* canvas = new TCanvas("CompareMethods", "CompareMethods", 1200, 1200);
1087 canvas->Divide(3, 3);
1091 for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kTrVtx; ++type)
1093 TH1* mc = multESD->GetMultiplicityMC(histID, type)->ProjectionY("mymc");
1096 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1097 mult->ApplyMinuitFit(histID, kFALSE, type);
1098 mult->DrawComparison(Form("%s/CompareMethods_%d_MinuitChi2", targetDir, type), histID, kFALSE, kTRUE, mc);
1099 TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone("chi2Result");
1101 mult->ApplyBayesianMethod(histID, kFALSE, type, 0.1);
1102 mult->DrawComparison(Form("%s/CompareMethods_%d_Bayesian", targetDir, type), histID, kFALSE, kTRUE, mc);
1103 TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone("bayesResult");
1105 mc->GetXaxis()->SetRangeUser(0, 150);
1106 chi2Result->GetXaxis()->SetRangeUser(0, 150);
1108 /* // skip errors for now
1109 for (Int_t i=1; i<=chi2Result->GetNbinsX(); ++i)
1111 chi2Result->SetBinError(i, 0);
1112 bayesResult->SetBinError(i, 0);
1115 canvas->cd(++count);
1116 mc->SetFillColor(kYellow);
1118 chi2Result->SetLineColor(kRed);
1119 chi2Result->DrawCopy("SAME");
1120 bayesResult->SetLineColor(kBlue);
1121 bayesResult->DrawCopy("SAME");
1124 canvas->cd(count + 3);
1125 chi2ResultRatio = (TH1*) chi2Result->Clone("chi2ResultRatio");
1126 bayesResultRatio = (TH1*) bayesResult->Clone("bayesResultRatio");
1127 chi2ResultRatio->Divide(chi2Result, mc, 1, 1, "");
1128 bayesResultRatio->Divide(bayesResult, mc, 1, 1, "");
1130 chi2ResultRatio->GetYaxis()->SetRangeUser(0.5, 1.5);
1132 chi2ResultRatio->DrawCopy("HIST");
1133 bayesResultRatio->DrawCopy("SAME HIST");
1135 canvas->cd(count + 6);
1136 chi2Result->Divide(chi2Result, bayesResult, 1, 1, "");
1137 chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
1138 chi2Result->DrawCopy("HIST");
1141 canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
1142 canvas->SaveAs(Form("%s/%s.C", targetDir, canvas->GetName()));
1145 void StatisticsPlot(const char* fileNameMC = "multiplicityMC_2M.root", Int_t histID = 3)
1147 gSystem->Load("libPWG0base");
1149 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1151 TFile::Open(fileNameMC);
1152 mult->LoadHistograms("Multiplicity");
1154 const char* files[] = { "multiplicityMC_100k_1.root", "multiplicityMC_200k.root", "multiplicityMC_400k.root", "multiplicityMC_600k.root", "multiplicityMC_800k.root" };
1156 TGraph* fitResultsChi2[3];
1157 TGraph* fitResultsBayes[3];
1159 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1161 fitResultsChi2[region] = new TGraph;
1162 fitResultsChi2[region]->SetTitle(";Nevents;Chi2");
1163 fitResultsChi2[region]->SetName(Form("fitResultsChi2_%d", region));
1164 fitResultsChi2[region]->SetMarkerStyle(20+region);
1166 fitResultsBayes[region] = new TGraph;
1167 fitResultsBayes[region]->SetTitle(";Nevents;Chi2");
1168 fitResultsBayes[region]->SetName(Form("fitResultsBayes_%d", region));
1169 fitResultsBayes[region]->SetMarkerStyle(20+region);
1170 fitResultsBayes[region]->SetMarkerColor(2);
1173 TGraph* fitResultsChi2Limit = new TGraph; fitResultsChi2Limit->SetTitle(";Nevents;Multiplicity reach");
1174 TGraph* fitResultsBayesLimit = new TGraph; fitResultsBayesLimit->SetTitle(";Nevents;Multiplicity reach");
1175 TGraph* fitResultsChi2Res = new TGraph; fitResultsChi2Res->SetTitle(";Nevents;Chi2");
1176 TGraph* fitResultsBayesRes = new TGraph; fitResultsBayesRes->SetTitle(";Nevents;Chi2");
1178 fitResultsChi2Limit->SetName("fitResultsChi2Limit");
1179 fitResultsBayesLimit->SetName("fitResultsBayesLimit");
1180 fitResultsChi2Res->SetName("fitResultsChi2Res");
1181 fitResultsBayesRes->SetName("fitResultsBayesRes");
1183 TCanvas* canvas = new TCanvas("StatisticsPlot", "StatisticsPlot", 1200, 600);
1184 canvas->Divide(5, 2);
1189 TFile* file = TFile::Open("StatisticsPlot.root", "RECREATE");
1192 for (Int_t i=0; i<5; ++i)
1194 TFile::Open(files[i]);
1195 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
1196 multESD->LoadHistograms("Multiplicity");
1198 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
1199 Int_t nEntries = multESD->GetMultiplicityESD(histID)->GetEntries();
1200 TH1* mc = multESD->GetMultiplicityMC(histID, AliMultiplicityCorrection::kTrVtx)->ProjectionY(Form("mc_%d", i));
1202 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
1203 mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx);
1204 mult->DrawComparison(Form("StatisticsPlot_%d_MinuitChi2", i), histID, kFALSE, kTRUE, mc);
1206 Int_t chi2MCLimit = 0;
1207 Float_t chi2Residuals = 0;
1208 mult->GetComparisonResults(0, &chi2MCLimit, &chi2Residuals);
1209 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1211 fitResultsChi2[region]->SetPoint(fitResultsChi2[region]->GetN(), nEntries, mult->GetQuality(region));
1212 min = TMath::Min(min, mult->GetQuality(region));
1213 max = TMath::Max(max, mult->GetQuality(region));
1215 fitResultsChi2Limit->SetPoint(fitResultsChi2Limit->GetN(), nEntries, chi2MCLimit);
1216 fitResultsChi2Res->SetPoint(fitResultsChi2Res->GetN(), nEntries, chi2Residuals);
1218 TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("chi2Result_%d", i));
1220 mult->ApplyBayesianMethod(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100, 0, kFALSE);
1221 mult->DrawComparison(Form("StatisticsPlot_%d_Bayesian", i), histID, kFALSE, kTRUE, mc);
1222 TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("bayesResult_%d", i));
1223 mult->GetComparisonResults(0, &chi2MCLimit, &chi2Residuals);
1224 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1226 fitResultsBayes[region]->SetPoint(fitResultsBayes[region]->GetN(), nEntries, mult->GetQuality(region));
1227 min = TMath::Min(min, mult->GetQuality(region));
1228 max = TMath::Max(max, mult->GetQuality(region));
1230 fitResultsBayesLimit->SetPoint(fitResultsBayesLimit->GetN(), nEntries, chi2MCLimit);
1231 fitResultsBayesRes->SetPoint(fitResultsBayesRes->GetN(), nEntries, chi2Residuals);
1233 mc->GetXaxis()->SetRangeUser(0, 150);
1234 chi2Result->GetXaxis()->SetRangeUser(0, 150);
1236 // skip errors for now
1237 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
1239 chi2Result->SetBinError(j, 0);
1240 bayesResult->SetBinError(j, 0);
1244 mc->SetFillColor(kYellow);
1246 chi2Result->SetLineColor(kRed);
1247 chi2Result->DrawCopy("SAME");
1248 bayesResult->SetLineColor(kBlue);
1249 bayesResult->DrawCopy("SAME");
1253 chi2Result->Divide(chi2Result, mc, 1, 1, "B");
1254 bayesResult->Divide(bayesResult, mc, 1, 1, "B");
1256 // skip errors for now
1257 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
1259 chi2Result->SetBinError(j, 0);
1260 bayesResult->SetBinError(j, 0);
1263 chi2Result->SetTitle("Ratios;Npart;unfolded measured/MC");
1264 chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
1266 chi2Result->DrawCopy("");
1267 bayesResult->DrawCopy("SAME");
1269 TFile* file = TFile::Open("StatisticsPlot.root", "UPDATE");
1271 chi2Result->Write();
1272 bayesResult->Write();
1276 canvas->SaveAs(Form("%s.gif", canvas->GetName()));
1277 canvas->SaveAs(Form("%s.C", canvas->GetName()));
1279 TCanvas* canvas2 = new TCanvas("StatisticsPlot2", "StatisticsPlot2", 800, 400);
1280 canvas2->Divide(2, 1);
1284 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1286 fitResultsChi2[region]->GetYaxis()->SetRangeUser(0.5 * min, 1.5 * max);
1287 fitResultsChi2[region]->Draw(((region == 0) ? "AP" : "P SAME"));
1289 fitResultsBayes[region]->Draw("P SAME");
1295 fitResultsChi2Limit->SetMarkerStyle(20);
1296 fitResultsChi2Limit->GetYaxis()->SetRangeUser(0.9 * TMath::Min(fitResultsChi2Limit->GetYaxis()->GetXmin(), fitResultsBayesLimit->GetYaxis()->GetXmin()), 1.1 * TMath::Max(fitResultsChi2Limit->GetYaxis()->GetXmax(), fitResultsBayesLimit->GetYaxis()->GetXmax()));
1297 fitResultsChi2Limit->Draw("AP");
1299 fitResultsBayesLimit->SetMarkerStyle(3);
1300 fitResultsBayesLimit->SetMarkerColor(2);
1301 fitResultsBayesLimit->Draw("P SAME");
1303 canvas2->SaveAs(Form("%s.gif", canvas2->GetName()));
1304 canvas2->SaveAs(Form("%s.C", canvas2->GetName()));
1306 TFile* file = TFile::Open("StatisticsPlot.root", "UPDATE");
1308 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1310 fitResultsChi2[region]->Write();
1311 fitResultsBayes[region]->Write();
1313 fitResultsChi2Limit->Write();
1314 fitResultsBayesLimit->Write();
1315 fitResultsChi2Res->Write();
1316 fitResultsBayesRes->Write();
1320 void StartingConditions(const char* fileNameMC = "multiplicityMC.root", Int_t histID = 1)
1324 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1326 TFile::Open(fileNameMC);
1327 mult->LoadHistograms("Multiplicity");
1329 const char* files[] = { "multiplicityESD.root", "multiplicityESD_100k_1.root", "multiplicityESD_100k_2.root", "multiplicityESD_100k_1.root", "multiplicityESD_100k_2.root" }
1331 // this one we try to unfold
1332 TFile::Open(files[0]);
1333 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
1334 multESD->LoadHistograms("Multiplicity");
1335 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
1336 TH1* mc = multESD->GetMultiplicityMC(histID, AliMultiplicityCorrection::kTrVtx)->ProjectionY("mc", 1, 1);
1338 TGraph* fitResultsChi2 = new TGraph;
1339 fitResultsChi2->SetTitle(";Input Dist ID;Chi2");
1340 TGraph* fitResultsBayes = new TGraph;
1341 fitResultsBayes->SetTitle(";Input Dist ID;Chi2");
1342 TGraph* fitResultsChi2Limit = new TGraph;
1343 fitResultsChi2Limit->SetTitle(";Input Dist ID;Multiplicity reach");
1344 TGraph* fitResultsBayesLimit = new TGraph;
1345 fitResultsBayesLimit->SetTitle(";Input Dist ID;Multiplicity reach");
1347 TCanvas* canvas = new TCanvas("StartingConditions", "StartingConditions", 1200, 600);
1348 canvas->Divide(8, 2);
1350 TCanvas* canvas3 = new TCanvas("StartingConditions3", "StartingConditions3", 1000, 400);
1351 canvas3->Divide(2, 1);
1357 TH1* firstBayesian = 0;
1358 TH1* startCond = multESD->GetMultiplicityESD(histID)->ProjectionY("startCond");
1360 TLegend* legend = new TLegend(0.7, 0.7, 1, 1);
1362 TFile* file = TFile::Open("StartingConditions.root", "RECREATE");
1366 for (Int_t i=0; i<8; ++i)
1370 startCond = (TH1*) mc->Clone("startCond2");
1374 TFile::Open(files[i-1]);
1375 AliMultiplicityCorrection* multESD2 = new AliMultiplicityCorrection("MultiplicityESD2", "MultiplicityESD2");
1376 multESD2->LoadHistograms("Multiplicity");
1377 startCond = multESD2->GetMultiplicityESD(histID)->ProjectionY("startCond");
1381 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);
1383 func->SetParNames("scaling", "averagen", "k");
1384 func->SetParLimits(0, 1e-3, 1e10);
1385 func->SetParLimits(1, 0.001, 1000);
1386 func->SetParLimits(2, 0.001, 1000);
1388 func->SetParameters(1, 10, 2);
1389 for (Int_t j=2; j<=startCond->GetNbinsX(); j++)
1390 startCond->SetBinContent(j, func->Eval(j-1));
1394 for (Int_t j=1; j<=startCond->GetNbinsX(); j++)
1395 startCond->SetBinContent(j, 1);
1398 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol0, 1e5);
1399 mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, kFALSE, startCond);
1400 //mult->DrawComparison(Form("StartingConditions_%d_MinuitChi2", i), histID, kFALSE, kTRUE, mc);
1403 Int_t chi2MCLimit = 0;
1404 mult->GetComparisonResults(&chi2MC, &chi2MCLimit, 0);
1405 fitResultsChi2->SetPoint(fitResultsChi2->GetN(), i, chi2MC);
1406 fitResultsChi2Limit->SetPoint(fitResultsChi2Limit->GetN(), i, chi2MCLimit);
1407 min = TMath::Min(min, chi2MC);
1408 max = TMath::Max(max, chi2MC);
1410 TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("chi2Result_%d", i));
1412 firstChi = (TH1*) chi2Result->Clone("firstChi");
1414 mult->ApplyBayesianMethod(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 10, startCond);
1415 //mult->DrawComparison(Form("StartingConditions_%d_Bayesian", i), histID, kFALSE, kTRUE, mc);
1416 TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("bayesResult_%d", i));
1418 firstBayesian = (TH1*) bayesResult->Clone("firstBayesian");
1420 mult->GetComparisonResults(&chi2MC, &chi2MCLimit, 0);
1421 fitResultsBayes->SetPoint(fitResultsBayes->GetN(), i, chi2MC);
1422 fitResultsBayesLimit->SetPoint(fitResultsBayesLimit->GetN(), i, chi2MCLimit);
1424 TFile* file = TFile::Open("StartingConditions.root", "UPDATE");
1425 chi2Result->Write();
1426 bayesResult->Write();
1429 min = TMath::Min(min, chi2MC);
1430 max = TMath::Max(max, chi2MC);
1431 mc->GetXaxis()->SetRangeUser(0, 150);
1432 chi2Result->GetXaxis()->SetRangeUser(0, 150);
1434 // skip errors for now
1435 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
1437 chi2Result->SetBinError(j, 0);
1438 bayesResult->SetBinError(j, 0);
1442 TH1* tmp = (TH1*) chi2Result->Clone("tmp");
1443 tmp->SetTitle("Difference to best initial conditions;Npart;Ratio");
1444 tmp->Divide(firstChi);
1445 tmp->GetYaxis()->SetRangeUser(0.5, 1.5);
1446 tmp->GetXaxis()->SetRangeUser(0, 200);
1447 tmp->SetLineColor(i+1);
1448 legend->AddEntry(tmp, Form("%d", i));
1449 tmp->DrawCopy((i > 0) ? "SAME HIST" : "HIST");
1452 tmp = (TH1*) bayesResult->Clone("tmp");
1453 tmp->SetTitle("Difference to best initial conditions;Npart;Ratio");
1454 tmp->Divide(firstBayesian);
1455 tmp->SetLineColor(i+1);
1456 tmp->GetYaxis()->SetRangeUser(0.5, 1.5);
1457 tmp->GetXaxis()->SetRangeUser(0, 200);
1458 tmp->DrawCopy((i > 0) ? "SAME HIST" : "HIST");
1461 mc->SetFillColor(kYellow);
1463 chi2Result->SetLineColor(kRed);
1464 chi2Result->DrawCopy("SAME");
1465 bayesResult->SetLineColor(kBlue);
1466 bayesResult->DrawCopy("SAME");
1470 chi2Result->Divide(chi2Result, mc, 1, 1, "B");
1471 bayesResult->Divide(bayesResult, mc, 1, 1, "B");
1473 // skip errors for now
1474 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
1476 chi2Result->SetBinError(j, 0);
1477 bayesResult->SetBinError(j, 0);
1480 chi2Result->SetTitle("Ratios;Npart;unfolded measured/MC");
1481 chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
1483 chi2Result->DrawCopy("");
1484 bayesResult->DrawCopy("SAME");
1490 canvas->SaveAs(Form("%s.gif", canvas->GetName()));
1492 TCanvas* canvas2 = new TCanvas("StartingConditions2", "StartingConditions2", 800, 400);
1493 canvas2->Divide(2, 1);
1496 fitResultsChi2->SetMarkerStyle(20);
1497 fitResultsChi2->GetYaxis()->SetRangeUser(0.5 * min, 1.5 * max);
1498 fitResultsChi2->Draw("AP");
1500 fitResultsBayes->SetMarkerStyle(3);
1501 fitResultsBayes->SetMarkerColor(2);
1502 fitResultsBayes->Draw("P SAME");
1507 fitResultsChi2Limit->SetMarkerStyle(20);
1508 fitResultsChi2Limit->GetYaxis()->SetRangeUser(0.9 * TMath::Min(fitResultsChi2Limit->GetYaxis()->GetXmin(), fitResultsBayesLimit->GetYaxis()->GetXmin()), 1.1 * TMath::Max(fitResultsChi2Limit->GetYaxis()->GetXmax(), fitResultsBayesLimit->GetYaxis()->GetXmax()));
1509 fitResultsChi2Limit->Draw("AP");
1511 fitResultsBayesLimit->SetMarkerStyle(3);
1512 fitResultsBayesLimit->SetMarkerColor(2);
1513 fitResultsBayesLimit->Draw("P SAME");
1515 canvas2->SaveAs(Form("%s.gif", canvas2->GetName()));
1516 canvas3->SaveAs(Form("%s.gif", canvas3->GetName()));
1519 void Merge(Int_t n, const char** files, const char* output)
1521 // 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" };
1524 gSystem->Load("libPWG0base");
1526 AliMultiplicityCorrection** data = new AliMultiplicityCorrection*[n];
1528 for (Int_t i=0; i<n; ++i)
1530 TString name("Multiplicity");
1532 name.Form("Multiplicity%d", i);
1534 TFile::Open(files[i]);
1535 data[i] = new AliMultiplicityCorrection(name, name);
1536 data[i]->LoadHistograms("Multiplicity");
1541 data[0]->Merge(&list);
1543 //data[0]->DrawHistograms();
1545 TFile::Open(output, "RECREATE");
1546 data[0]->SaveHistograms();
1550 void testMethod(Int_t caseNo, const char* fileName = "multiplicityMC.root")
1554 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1556 TFile::Open(fileName);
1557 mult->LoadHistograms("Multiplicity");
1563 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);
1564 //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);
1565 func->SetParNames("scaling", "averagen", "k");
1570 case 0: func = new TF1("flat", "1000"); break;
1571 case 1: func = new TF1("flat", "501-x"); break;
1572 case 2: func = new TF1("flat", "1000 * 1/(x+1)"); break;
1573 case 3: func = new TF1("flat", "1000 * TMath::Landau(x, 10, 5)"); break;
1574 case 4: func->SetParameters(2e5, 15, 2); break;
1575 case 5: func->SetParameters(1, 13, 7); break;
1576 case 6: func->SetParameters(1e7, 30, 4); break;
1577 case 7: func->SetParameters(1e7, 30, 2); break; // ***
1578 case 8: func = new TF1("testlaszlo", "10*1000*x*exp(-0.1*x)"); break;
1586 mult->SetGenMeasFromFunc(func, 1);
1588 TFile::Open("out.root", "RECREATE");
1589 mult->SaveHistograms();
1591 new TCanvas; mult->GetMultiplicityESD(1)->ProjectionY()->DrawCopy();
1592 new TCanvas; mult->GetMultiplicityVtx(1)->ProjectionY("mc", 1, mult->GetMultiplicityVtx(1)->GetNbinsX())->DrawCopy();
1594 //mult->ApplyBayesianMethod(2, kFALSE);
1595 //mult->ApplyMinuitFit(2, kFALSE);
1596 //mult->ApplyGaussianMethod(2, kFALSE);
1597 //mult->ApplyLaszloMethod(2, kFALSE, AliMultiplicityCorrection::kTrVtx);
1600 void smoothCorrelationMap(const char* fileName = "multiplicityMC.root", Int_t corrMatrix = 2)
1602 gSystem->Load("libPWG0base");
1604 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1606 TFile::Open(fileName);
1607 mult->LoadHistograms("Multiplicity");
1609 // empty under/overflow bins in x, otherwise Project3D takes them into account
1610 TH3* corr = mult->GetCorrelation(corrMatrix);
1611 for (Int_t j=1; j<=corr->GetYaxis()->GetNbins(); ++j)
1613 for (Int_t k=1; k<=corr->GetZaxis()->GetNbins(); ++k)
1615 corr->SetBinContent(0, j, k, 0);
1616 corr->SetBinContent(corr->GetXaxis()->GetNbins()+1, j, k, 0);
1620 TH2* proj = (TH2*) corr->Project3D("zy");
1622 // normalize correction for given nPart
1623 for (Int_t i=1; i<=proj->GetNbinsX(); ++i)
1625 Double_t sum = proj->Integral(i, i, 1, proj->GetNbinsY());
1629 for (Int_t j=1; j<=proj->GetNbinsY(); ++j)
1632 proj->SetBinContent(i, j, proj->GetBinContent(i, j) / sum);
1633 proj->SetBinError(i, j, proj->GetBinError(i, j) / sum);
1638 proj->DrawCopy("COLZ");
1640 TH1* scaling = proj->ProjectionY("scaling", 1, 1);
1642 scaling->SetMarkerStyle(3);
1643 //scaling->GetXaxis()->SetRangeUser(0, 50);
1644 TH1* mean = (TH1F*) scaling->Clone("mean");
1645 TH1* width = (TH1F*) scaling->Clone("width");
1647 TF1* lognormal = new TF1("lognormal", "[0]*exp(-(log(x)-[1])^2/(2*[2]^2))/(x*[2]*TMath::Sqrt(2*TMath::Pi()))", 0.01, 500);
1648 lognormal->SetParNames("scaling", "mean", "sigma");
1649 lognormal->SetParameters(1, 1, 1);
1650 lognormal->SetParLimits(0, 1, 1);
1651 lognormal->SetParLimits(1, 0, 100);
1652 lognormal->SetParLimits(2, 1e-3, 1);
1654 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);
1655 nbd->SetParNames("scaling", "averagen", "k");
1656 nbd->SetParameters(1, 13, 5);
1657 nbd->SetParLimits(0, 1, 1);
1658 nbd->SetParLimits(1, 1, 100);
1659 nbd->SetParLimits(2, 1, 1e8);
1661 TF1* poisson = new TF1("poisson", "[0] * exp(-(x+[2])) * (x+[2])**[1] / TMath::Factorial([1])", 0.01, 50);
1662 poisson->SetParNames("scaling", "k", "deltax");
1663 poisson->SetParameters(1, 1, 0);
1664 poisson->SetParLimits(0, 0, 10);
1665 poisson->SetParLimits(1, 0.01, 100);
1666 poisson->SetParLimits(2, 0, 10);
1668 TF1* mygaus = new TF1("mygaus", "[0] * exp(-(x-[1])**2 / 2 / [2] - [3] * log(x + [4]) / [5])", 0.01, 50);
1669 mygaus->SetParNames("scaling", "mean", "width", "scale2log", "logmean", "logwidth");
1670 mygaus->SetParameters(1, 0, 1, 1, 0, 1);
1671 mygaus->SetParLimits(2, 1e-5, 10);
1672 mygaus->SetParLimits(4, 1, 1);
1673 mygaus->SetParLimits(5, 1e-5, 10);
1675 //TF1* sqrt = new TF1("sqrt", "[0] + [1] * sqrt((x + [3]) * [2])", 0, 50);
1676 TF1* sqrt = new TF1("sqrt", "[0] + (x + [1])**[2]", 0, 50);
1677 sqrt->SetParNames("ydelta", "exp", "xdelta");
1678 sqrt->SetParameters(0, 0, 1);
1679 sqrt->SetParLimits(1, 0, 10);
1681 const char* fitWith = "gaus";
1683 for (Int_t i=1; i<=150; ++i)
1685 printf("Fitting %d...\n", i);
1687 TH1* hist = proj->ProjectionY(Form("proj%d", i), i, i, "e");
1689 //hist->GetXaxis()->SetRangeUser(0, 50);
1690 //lognormal->SetParameter(0, hist->GetMaximum());
1691 hist->Fit(fitWith, "0 M", "");
1693 TF1* func = hist->GetListOfFunctions()->FindObject(fitWith);
1695 if (0 && (i % 5 == 0))
1699 func->Clone()->Draw("SAME");
1703 scaling->Fill(i, func->GetParameter(0));
1704 mean->Fill(i, func->GetParameter(1));
1705 width->Fill(i, func->GetParameter(2));
1708 TF1* log = new TF1("log", "[0] + [1] * log([2] * x)", 0.01, 500);
1709 log->SetParameters(0, 1, 1);
1710 log->SetParLimits(1, 0, 100);
1711 log->SetParLimits(2, 1e-3, 10);
1713 TF1* over = new TF1("over", "[0] + [1] / (x+[2])", 0.01, 500);
1714 over->SetParameters(0, 1, 0);
1715 //over->SetParLimits(0, 0, 100);
1716 over->SetParLimits(1, 1e-3, 10);
1717 over->SetParLimits(2, 0, 100);
1719 c1 = new TCanvas("fitparams", "fitparams", 1200, 400);
1725 //TF1* scalingFit = new TF1("mypol0", "[0]");
1726 TF1* scalingFit = over;
1727 scaling->Fit(scalingFit, "", "", 3, 140);
1728 scalingFit->SetRange(0, 200);
1729 scalingFit->Draw("SAME");
1734 //TF1* meanFit = log;
1735 TF1* meanFit = new TF1("mypol1", "[0]+[1]*x");
1736 mean->Fit(meanFit, "", "", 3, 140);
1737 meanFit->SetRange(0, 200);
1738 meanFit->Draw("SAME");
1743 //TF1* widthFit = over;
1744 TF1* widthFit = new TF1("mypol", "[0]+[1]*TMath::Sqrt([2]*x)");
1745 widthFit->SetParLimits(2, 1e-5, 1e5);
1746 width->Fit(widthFit, "", "", 5, 140);
1747 widthFit->SetRange(0, 200);
1748 widthFit->Draw("SAME");
1750 // build new correction matrix
1751 TH2* new = (TH2*) proj->Clone("new");
1754 for (Int_t i=1; i<=new->GetXaxis()->GetNbins(); i+=1)
1756 TF1* func = (TF1*) gROOT->FindObject(fitWith);
1757 x = new->GetXaxis()->GetBinCenter(i);
1761 func->SetParameters(scalingFit->Eval(x), meanFit->Eval(x), widthFit->Eval(x));
1762 printf("%f %f %f %f\n", x, scalingFit->Eval(x), meanFit->Eval(x), widthFit->Eval(x));
1764 for (Int_t j=1; j<=new->GetYaxis()->GetNbins(); j+=1)
1768 // leave bins 1..20 untouched
1769 new->SetBinContent(i, j, corr->Integral(1, corr->GetNbinsX(), i, i, j, j));
1773 y = new->GetYaxis()->GetBinCenter(j);
1776 if (func->Eval(y) > 1e-4)
1777 new->SetBinContent(i, j, func->Eval(y));
1782 // fill 0 multiplicity bins, this cannot be done with the function because it does not accept 0
1783 // we take the values from the old response matrix
1784 //for (Int_t i=1; i<=new->GetXaxis()->GetNbins(); i+=1)
1785 // new->SetBinContent(i, 1, proj->GetBinContent(i, 1));
1787 //for (Int_t j=1; j<=new->GetYaxis()->GetNbins(); j+=1)
1788 // new->SetBinContent(1, j, proj->GetBinContent(1, j));
1790 // normalize correction for given nPart
1791 for (Int_t i=1; i<=new->GetNbinsX(); ++i)
1793 Double_t sum = new->Integral(i, i, 1, proj->GetNbinsY());
1797 for (Int_t j=1; j<=new->GetNbinsY(); ++j)
1800 new->SetBinContent(i, j, new->GetBinContent(i, j) / sum);
1801 new->SetBinError(i, j, new->GetBinError(i, j) / sum);
1808 TH2* diff = (TH2*) new->Clone("diff");
1809 diff->Add(proj, -1);
1813 diff->SetMinimum(-0.05);
1814 diff->SetMaximum(0.05);
1818 for (Int_t i=1; i<=new->GetNbinsX(); ++i)
1819 for (Int_t j=1; j<=new->GetNbinsY(); ++j)
1820 corr->SetBinContent(corr->GetXaxis()->GetNbins() / 2, i, j, new->GetBinContent(i, j));
1823 corr->Project3D("zy")->Draw("COLZ");
1825 TFile::Open("out.root", "RECREATE");
1826 mult->SaveHistograms();
1828 TH1* proj1 = proj->ProjectionY("proj1", 36, 36);
1829 TH1* proj2 = new->ProjectionY("proj2", 36, 36);
1830 proj2->SetLineColor(2);
1834 proj2->Draw("SAME");
1837 void buildCorrelationMap(const char* fileName = "multiplicityMC_2M.root", Int_t corrMatrix = 3)
1839 gSystem->Load("libPWG0base");
1841 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1843 TFile::Open(fileName);
1844 mult->LoadHistograms("Multiplicity");
1846 TH3F* new = mult->GetCorrelation(corrMatrix);
1849 TF1* func = new TF1("func", "gaus(0)");
1851 Int_t vtxBin = new->GetNbinsX() / 2;
1856 for (Int_t i=1; i<=new->GetYaxis()->GetNbins(); i+=1)
1858 Float_t x = new->GetYaxis()->GetBinCenter(i);
1859 func->SetParameters(1, x * 0.8, sigma);
1860 //func->SetParameters(1, x, sigma);
1862 for (Int_t j=1; j<=new->GetZaxis()->GetNbins(); j+=1)
1864 Float_t y = new->GetYaxis()->GetBinCenter(j);
1867 if (TMath::Abs(y-x*0.8) < sigma)
1868 new->SetBinContent(vtxBin, i, j, func->Eval(y));
1870 // test only bin 40 has smearing
1872 // new->SetBinContent(vtxBin, i, j, (i == j));
1877 new->Project3D("zy")->DrawCopy("COLZ");
1879 TFile* file = TFile::Open("out.root", "RECREATE");
1880 mult->SetCorrelation(corrMatrix, new);
1881 mult->SaveHistograms();
1885 void GetCrossSections(const char* fileName)
1887 gSystem->Load("libPWG0base");
1889 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1891 TFile::Open(fileName);
1892 mult->LoadHistograms("Multiplicity");
1894 TH1* xSection2 = mult->GetCorrelation(3)->Project3D("y")->Clone("xSection2");
1896 xSection2->Scale(1.0 / xSection2->Integral());
1898 TH1* xSection15 = mult->GetCorrelation(2)->Project3D("y")->Clone("xSection15");
1899 xSection15->Sumw2();
1900 xSection15->Scale(1.0 / xSection15->Integral());
1902 TFile::Open("crosssection.root", "RECREATE");
1904 xSection15->Write();
1908 void AnalyzeSpeciesTree(const char* fileName)
1911 // prints statistics about fParticleSpecies
1914 gSystem->Load("libPWG0base");
1916 TFile::Open(fileName);
1917 TNtuple* fParticleSpecies = (TNtuple*) gFile->Get("fParticleSpecies");
1919 const Int_t nFields = 8;
1921 for (Int_t i=0; i<nFields; i++)
1924 for (Int_t i=0; i<fParticleSpecies->GetEntries(); i++)
1926 fParticleSpecies->GetEvent(i);
1928 Float_t* f = fParticleSpecies->GetArgs();
1930 for (Int_t j=0; j<nFields; j++)
1931 totals[j] += f[j+1];
1934 for (Int_t i=0; i<nFields; i++)
1935 Printf("%d --> %ld", i, totals[i]);
1938 void BuildResponseFromTree(const char* fileName, const char* target)
1941 // builds several response matrices with different particle ratios (systematic study)
1943 // WARNING doesn't work uncompiled, see test.C
1947 TFile::Open(fileName);
1948 TNtuple* fParticleSpecies = (TNtuple*) gFile->Get("fParticleSpecies");
1950 TFile* file = TFile::Open(target, "RECREATE");
1953 Int_t tracks = 0; // control variables
1955 Int_t secondaries = 0;
1956 Int_t doubleCount = 0;
1958 for (Int_t num = 0; num < 9; num++)
1961 name.Form("Multiplicity_%d", num);
1962 AliMultiplicityCorrection* fMultiplicity = new AliMultiplicityCorrection(name, name);
1964 Float_t ratio[4]; // pi, K, p, other
1965 for (Int_t i = 0; i < 4; i++)
1970 case 1 : ratio[1] = 0.5; break;
1971 case 2 : ratio[1] = 1.5; break;
1972 case 3 : ratio[2] = 0.5; break;
1973 case 4 : ratio[2] = 1.5; break;
1974 case 5 : ratio[1] = 0.5; ratio[2] = 0.5; break;
1975 case 6 : ratio[1] = 1.5; ratio[2] = 1.5; break;
1976 case 7 : ratio[1] = 0.5; ratio[2] = 1.5; break;
1977 case 8 : ratio[1] = 1.5; ratio[2] = 0.5; break;
1980 for (Int_t i=0; i<fParticleSpecies->GetEntries(); i++)
1982 fParticleSpecies->GetEvent(i);
1984 Float_t* f = fParticleSpecies->GetArgs();
1989 for (Int_t j = 0; j < 4; j++)
1991 gene += ratio[j] * f[j+1];
1992 meas += ratio[j] * f[j+1+4];
1996 // add the ones w/o label
2000 // secondaries are already part of meas!
2001 secondaries += f[10];
2003 // double counted are already part of meas!
2004 doubleCount += f[11];
2006 // 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!
2009 //Printf("%.f %.f %.f %.f %.f", f[5], f[6], f[7], f[8], f[9]);
2011 fMultiplicity->FillCorrection(f[0], gene, gene, gene, gene, 0, meas, meas, meas, meas);
2012 // HACK all as kND = 1
2013 fMultiplicity->FillGenerated(f[0], kTRUE, kTRUE, 1, gene, gene, gene, gene, 0);
2014 fMultiplicity->FillMeasured(f[0], meas, meas, meas, meas);
2017 //fMultiplicity->DrawHistograms();
2019 TFile* file = TFile::Open(target, "UPDATE");
2020 fMultiplicity->SaveHistograms();
2025 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);
2026 if ((Float_t) noLabel / tracks > 0.02)
2027 Printf("WARNING: More than 2%% of tracks without label, this might bias the study!");
2032 void ParticleRatioStudy()
2036 for (Int_t num = 0; num < 9; num++)
2039 target.Form("chi2_species_%d.root", num);
2040 correct("species.root", Form("Multiplicity_%d", num), "species.root", 1, 1, 0, 1e5, 0, target, "Multiplicity_0");
2044 void MergeModifyCrossSection(const char* output = "multiplicityMC_xsection.root")
2046 const char* files[] = { "multiplicityMC_nd.root", "multiplicityMC_sd.root", "multiplicityMC_dd.root" };
2050 TFile::Open(output, "RECREATE");
2053 for (Int_t num = 0; num < 7; num++)
2055 AliMultiplicityCorrection* data[3];
2061 case 0: ratio[0] = 1.0; ratio[1] = 1.0; ratio[2] = 1.0; break;
2062 case 1: ratio[0] = 1.0; ratio[1] = 1.5; ratio[2] = 1.0; break;
2063 case 2: ratio[0] = 1.0; ratio[1] = 0.5; ratio[2] = 1.0; break;
2064 case 3: ratio[0] = 1.0; ratio[1] = 1.0; ratio[2] = 1.5; break;
2065 case 4: ratio[0] = 1.0; ratio[1] = 1.0; ratio[2] = 0.5; break;
2066 case 5: ratio[0] = 1.0; ratio[1] = 1.5; ratio[2] = 1.5; break;
2067 case 6: ratio[0] = 1.0; ratio[1] = 0.5; ratio[2] = 0.5; break;
2071 for (Int_t i=0; i<3; ++i)
2074 name.Form("Multiplicity_%d", num);
2076 name.Form("Multiplicity_%d_%d", num, i);
2078 TFile::Open(files[i]);
2079 data[i] = new AliMultiplicityCorrection(name, name);
2080 data[i]->LoadHistograms("Multiplicity");
2083 for (Int_t j=0; j<AliMultiplicityCorrection::kMCHists; j++)
2085 data[i]->GetMultiplicityVtx(j)->Scale(ratio[i]);
2086 data[i]->GetMultiplicityMB(j)->Scale(ratio[i]);
2087 data[i]->GetMultiplicityINEL(j)->Scale(ratio[i]);
2088 data[i]->GetMultiplicityNSD(j)->Scale(ratio[i]);
2091 for (Int_t j=0; j<AliMultiplicityCorrection::kESDHists; j++)
2092 data[i]->GetMultiplicityESD(j)->Scale(ratio[i]);
2094 for (Int_t j=0; j<AliMultiplicityCorrection::kCorrHists; j++)
2095 data[i]->GetCorrelation(j)->Scale(ratio[i]);
2101 printf("Case %d, %s: Entries in response matrix 3: ND: %.2f SD: %.2f DD: %.2f", num, data[0]->GetName(), data[0]->GetCorrelation(3)->Integral(), data[1]->GetCorrelation(3)->Integral(), data[2]->GetCorrelation(3)->Integral());
2103 data[0]->Merge(&list);
2105 Printf(" Total: %.2f", data[0]->GetCorrelation(3)->Integral());
2107 TFile::Open(output, "UPDATE");
2108 data[0]->SaveHistograms();
2113 for (Int_t i=0; i<3; ++i)
2118 void Rebin(const char* fileName = "multiplicityMC_3M.root", Int_t corrMatrix = 3)
2120 // rebins MC axis of correlation map, MC and histogram for corrected (for evaluation of effect of regularization)
2121 // rebin does not exist for 3D hists, so we convert to 2D and then back to 3D (loosing the vertex information)
2123 Printf("WARNING: Vertex information is lost in this process. Use result only for evaluation of errors.");
2125 gSystem->Load("libPWG0base");
2127 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2129 TFile::Open(fileName);
2130 mult->LoadHistograms("Multiplicity");
2132 // rebin correlation
2133 TH3* old = mult->GetCorrelation(corrMatrix);
2135 // empty under/overflow bins in x, otherwise Project3D takes them into account
2136 for (Int_t y=1; y<=old->GetYaxis()->GetNbins(); ++y)
2138 for (Int_t z=1; z<=old->GetZaxis()->GetNbins(); ++z)
2140 old->SetBinContent(0, y, z, 0);
2141 old->SetBinContent(old->GetXaxis()->GetNbins()+1, y, z, 0);
2145 TH2* response = (TH2*) old->Project3D("zy");
2146 response->RebinX(2);
2148 TH3F* new = new TH3F(old->GetName(), old->GetTitle(),
2149 old->GetXaxis()->GetNbins(), old->GetXaxis()->GetBinLowEdge(1), old->GetXaxis()->GetBinUpEdge(old->GetXaxis()->GetNbins()),
2150 old->GetYaxis()->GetNbins() / 2, old->GetYaxis()->GetBinLowEdge(1), old->GetYaxis()->GetBinUpEdge(old->GetYaxis()->GetNbins()),
2151 old->GetZaxis()->GetNbins(), old->GetZaxis()->GetBinLowEdge(1), old->GetZaxis()->GetBinUpEdge(old->GetZaxis()->GetNbins()));
2154 Int_t vtxBin = new->GetNbinsX() / 2;
2158 for (Int_t i=1; i<=new->GetYaxis()->GetNbins(); i+=1)
2159 for (Int_t j=1; j<=new->GetZaxis()->GetNbins(); j+=1)
2160 new->SetBinContent(vtxBin, i, j, response->GetBinContent(i, j));
2162 // rebin MC + hist for corrected
2163 for (AliMultiplicityCorrection::EventType eventType = AliMultiplicityCorrection::kTrVtx; eventType <= AliMultiplicityCorrection::kINEL; eventType++)
2164 mult->GetMultiplicityMC(corrMatrix, eventType)->RebinY(2);
2166 mult->GetMultiplicityESDCorrected(corrMatrix)->Rebin(2);
2168 // recreate measured from correlation matrix to get rid of vertex shift effect
2169 TH2* newMeasured = (TH2*) old->Project3D("zx");
2170 TH2* esd = mult->GetMultiplicityESD(corrMatrix);
2173 // transfer from TH2D to TH2F
2174 for (Int_t i=0; i<=new->GetXaxis()->GetNbins()+1; i+=1)
2175 for (Int_t j=0; j<=new->GetYaxis()->GetNbins()+1; j+=1)
2176 esd->SetBinContent(i, j, newMeasured->GetBinContent(i, j));
2179 new->Project3D("zy")->DrawCopy("COLZ");
2181 TFile* file = TFile::Open("out.root", "RECREATE");
2182 mult->SetCorrelation(corrMatrix, new);
2183 mult->SaveHistograms();
2187 void EvaluateRegularizationEffect(Int_t step, const char* fileNameRebinned = "multiplicityMC_3M_rebinned.root", const char* fileNameNormal = "multiplicityMC_3M.root", Int_t histID = 3)
2189 // due to some static members in AliMultiplicityCorrection, the session has to be restarted after changing the number of parameters, to be fixed
2190 // that is why this is done in 2 steps
2192 gSystem->Load("libPWG0base");
2194 Bool_t fullPhaseSpace = kFALSE;
2198 // first step: unfold without regularization and rebinned histogram ("N=M")
2199 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2200 TFile::Open(fileNameRebinned);
2201 mult->LoadHistograms();
2203 mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0, 125);
2204 mult->SetCreateBigBin(kFALSE);
2206 mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
2207 mult->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, mult->GetMultiplicityVtx(histID)->ProjectionY("mymchist"));
2209 TFile* file = TFile::Open("EvaluateRegularizationEffect1.root", "RECREATE");
2210 mult->SaveHistograms();
2215 // second step: unfold with regularization and normal histogram
2216 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2217 TFile::Open(fileNameNormal);
2218 mult2->LoadHistograms();
2220 mult2->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 1e4);
2221 mult2->SetCreateBigBin(kTRUE);
2222 mult2->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
2223 mult2->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, mult2->GetMultiplicityVtx(histID)->ProjectionY("mymchist"));
2225 TH1* result2 = mult2->GetMultiplicityESDCorrected(histID);
2227 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2228 TFile* file = TFile::Open("EvaluateRegularizationEffect1.root");
2229 mult->LoadHistograms();
2231 TH1* result1 = mult->GetMultiplicityESDCorrected(histID);
2234 TCanvas* canvas = new TCanvas("EvaluateRegularizationEffect", "EvaluateRegularizationEffect", 1000, 800);
2235 canvas->Divide(2, 2);
2238 result1->SetLineColor(1);
2239 result1->DrawCopy();
2240 result2->SetLineColor(2);
2241 result2->DrawCopy("SAME");
2245 result1->Scale(1.0 / result1->Integral());
2246 result2->Scale(1.0 / result2->Integral());
2249 result1->DrawCopy();
2250 result2->DrawCopy("SAME");
2253 TH1* diff = (TH1*) result1->Clone("diff");
2254 diff->Add(result2, -1);
2257 diff->DrawCopy("HIST");
2260 diff->Divide(result1);
2261 diff->GetYaxis()->SetRangeUser(-0.3, 0.3);
2262 diff->DrawCopy("HIST");
2265 for (Int_t i=1; i<=diff->GetNbinsX(); i++)
2266 chi2 += diff->GetBinContent(i) * diff->GetBinContent(i);
2268 Printf("Chi2 is %e", chi2);
2270 canvas->SaveAs(Form("%s.eps", canvas->GetName()));