]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG0/multiplicity/correct.C
Corrected cast
[u/mrichter/AliRoot.git] / PWG0 / multiplicity / correct.C
CommitLineData
0ab29cfa 1/* $Id$ */
2
3//
dca331bb 4// script to correct the multiplicity spectrum + helpers
0ab29cfa 5//
6
0b4bfd98 7void SetTPC()
0a173978 8{
9 gSystem->Load("libPWG0base");
0b4bfd98 10 AliMultiplicityCorrection::SetQualityRegions(kFALSE);
11}
0a173978 12
69b09e3b 13const char* GetMultLabel(Int_t etaR = -1, Bool_t trueM = kTRUE)
14{
15 if (etaR == -1)
16 etaR = etaRange;
17
18 TString tmpStr((trueM) ? "True " : "Measured ");
19
20 if (etaR == 4)
21 {
22 tmpStr += "multiplicity (full phase space)";
23 }
24 else
25 tmpStr += Form("multiplicity in |#eta| < %.1f", (etaR+1)* 0.5);
26 return Form("%s", tmpStr.Data());
27}
28
2440928d 29void draw(const char* fileName = "multiplicity.root", const char* folder = "Multiplicity")
0b4bfd98 30{
2440928d 31 loadlibs();
0a173978 32
0b4bfd98 33 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection(folder, folder);
0a173978 34
0b4bfd98 35 TFile::Open(fileName);
36 mult->LoadHistograms();
0a173978 37 mult->DrawHistograms();
447c325d 38
f3eb27f6 39 TH2* hist = (TH2*) gROOT->FindObject("fCorrelation2_zy");
447c325d 40 canvas = new TCanvas("c1", "c1", 600, 500);
f3eb27f6 41 canvas->SetTopMargin(0.05);
447c325d 42 hist->SetStats(kFALSE);
43 hist->Draw("COLZ");
f3eb27f6 44 hist->SetTitle(";true multiplicity in |#eta| < 1.5;measured multiplicity in |#eta| < 1.5");
447c325d 45 hist->GetYaxis()->SetTitleOffset(1.1);
f3eb27f6 46 gPad->SetRightMargin(0.12);
447c325d 47 gPad->SetLogz();
48
f3eb27f6 49 canvas->SaveAs("responsematrix.eps");
0ab29cfa 50}
51
0f67a57c 52void loadlibs()
9ca6be09 53{
0f67a57c 54 gSystem->Load("libTree");
55 gSystem->Load("libVMC");
56
57 gSystem->Load("libSTEERBase");
58 gSystem->Load("libANALYSIS");
2440928d 59 gSystem->Load("libANALYSISalice");
9ca6be09 60 gSystem->Load("libPWG0base");
0f67a57c 61}
9ca6be09 62
69b09e3b 63void 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")
0f67a57c 64{
65 loadlibs();
0a0f4adb 66
69b09e3b 67 AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open(fileNameMC, folder);
68 AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open(fileNameESD, folderESD);
b3b260d1 69
70fdd197 70 //AliUnfolding::SetNbins(150, 150);
71 //AliUnfolding::SetNbins(65, 65);
72 //AliUnfolding::SetNbins(35, 35);
73 //AliUnfolding::SetDebug(1);
f3eb27f6 74
70fdd197 75 for (Int_t hID = ((histID == -1) ? 0 : histID); hID <= ((histID == -1) ? 2 : histID); hID++)
447c325d 76 {
70fdd197 77 switch (hID)
78 {
79 case 0: AliUnfolding::SetNbins(35, 35); break;
80 case 1: AliUnfolding::SetNbins(60, 60); break;
81 case 2: AliUnfolding::SetNbins(70, 70); beta *= 3; break;
82 }
83
b3b260d1 84 TH2F* hist = esd->GetMultiplicityESD(hID);
85 TH2F* hist2 = esd->GetMultiplicityMC(hID, eventType);
86
7dcf959e 87 mult->SetMultiplicityESD(hID, hist);
b3b260d1 88
89 // small hack to get around charge conservation for full phase space ;-)
90 if (fullPhaseSpace)
91 {
92 TH1* corr = mult->GetCorrelation(histID + 4);
93
94 for (Int_t i=2; i<=corr->GetNbinsX(); i+=2)
95 for (Int_t j=1; j<=corr->GetNbinsY(); ++j)
96 {
97 corr->SetBinContent(i, j, corr->GetBinContent(i-1, j));
98 corr->SetBinError(i, j, corr->GetBinError(i-1, j));
99 }
100 }
101
102 if (chi2)
103 {
104 AliUnfolding::SetChi2Regularization(AliUnfolding::kPol0, beta);
70fdd197 105 //AliUnfolding::SetCreateOverflowBin(kFALSE);
b3b260d1 106 //mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0); //mult->SetCreateBigBin(kFALSE);
107 //mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0, 125); mult->SetCreateBigBin(kFALSE);
70fdd197 108 // AliUnfolding::SetChi2Regularization(AliUnfolding::kEntropy, beta);
b3b260d1 109 //mult->SetRegularizationParameters(AliMultiplicityCorrection::kLog, 1e5);
110
111 //mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kTRUE, mcCompare);
112 //mult->SetMultiplicityESDCorrected(histID, (TH1F*) mcCompare);
113
70fdd197 114 mult->ApplyMinuitFit(hID, fullPhaseSpace, eventType, kFALSE, 0, kFALSE); //hist2->ProjectionY("mymchist"));
b3b260d1 115 //mult->ApplyNBDFit(histID, fullPhaseSpace, eventType);
116 }
117 else
118 {
119 mult->ApplyBayesianMethod(hID, fullPhaseSpace, eventType, 1, 10, 0, kTRUE);
70fdd197 120 //mult->ApplyBayesianMethod(hID, fullPhaseSpace, eventType, 1, 5, 0, kFALSE);
b3b260d1 121 }
122
123 mult->SetMultiplicityMC(hID, eventType, hist2);
dd701109 124 }
69b09e3b 125
126 Printf("Writing result to %s", targetFile);
127 TFile* file = TFile::Open(targetFile, "RECREATE");
144ff489 128 mult->SaveHistograms();
129 file->Write();
130 file->Close();
0a0f4adb 131
b3b260d1 132 for (hID = ((histID == -1) ? 0 : histID); hID <= ((histID == -1) ? 2 : histID); hID++)
133 {
134 TH2F* hist2 = esd->GetMultiplicityMC(hID, eventType);
135 TH1* mcCompare = hist2->ProjectionY("mcmchist", 1, hist2->GetNbinsX());
136 mult->DrawComparison(Form("%s_%d", (chi2) ? "MinuitChi2" : "Bayesian", hID), hID, fullPhaseSpace, kTRUE, mcCompare);
137 }
69b09e3b 138}
139
70fdd197 140TH1* GetChi2Bias(Float_t alpha)
141{
142 loadlibs();
143
144 const char* fileNameMC = "multiplicityMC.root";
145 const char* folder = "Multiplicity";
146 const char* fileNameESD = "multiplicityESD.root";
147 const char* folderESD = "Multiplicity";
148
149 AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open(fileNameMC, folder);
150 AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open(fileNameESD, folderESD);
151
152 //Int_t hID = 0; const Int_t kMaxBins = 35;
153 //Int_t hID = 1; const Int_t kMaxBins = 60;
154 Int_t hID = 2; const Int_t kMaxBins = 70;
155 AliUnfolding::SetNbins(kMaxBins, kMaxBins);
156 //AliUnfolding::SetDebug(1);
157 //AliUnfolding::SetChi2Regularization(AliUnfolding::kPol0, 50);
158 AliUnfolding::SetChi2Regularization(AliUnfolding::kPol0, alpha);
159
160 TH2F* hist = esd->GetMultiplicityESD(hID);
161 mult->SetMultiplicityESD(hID, hist);
162
163 // without bias calculation
164 mult->ApplyMinuitFit(hID, kFALSE, 0, kFALSE);
165 baseold = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("baseold");
166
167 // with bias calculation
168 mult->ApplyMinuitFit(hID, kFALSE, 0, kFALSE, 0, kTRUE);
169 base = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("base");
170
171 // relative error plots
172 ratio1 = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("hist1");
173 ratio1->SetStats(0);
174 ratio1->SetTitle(";unfolded multiplicity;relative error");
175 ratio1->Reset();
176 ratio2 = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("hist1");
177 ratio2->Reset();
178
179 for (Int_t t = 0; t<kMaxBins; t++)
180 {
181 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);
182 if (base->GetBinContent(t+1) <= 0)
183 continue;
184 ratio1->SetBinContent(t+1, baseold->GetBinError(t+1) / base->GetBinContent(t+1));
185 ratio2->SetBinContent(t+1, base->GetBinError(t+1) / base->GetBinContent(t+1));
186 }
187
188 //new TCanvas; base->Draw(); gPad->SetLogy();
189
190 new TCanvas;
191 ratio1->GetYaxis()->SetRangeUser(0, 1);
192 ratio1->GetXaxis()->SetRangeUser(0, kMaxBins);
193 ratio1->Draw();
194 ratio2->SetLineColor(2);
195 ratio2->Draw("SAME");
196
197 return base;
198}
199
200void CheckBayesianBias()
201{
202 loadlibs();
203
204 const char* fileNameMC = "multiplicityMC.root";
205 const char* folder = "Multiplicity";
206 const char* fileNameESD = "multiplicityESD.root";
207 const char* folderESD = "Multiplicity";
208
209 AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open(fileNameMC, folder);
210 AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open(fileNameESD, folderESD);
211
212 const Int_t kMaxBins = 35;
213 AliUnfolding::SetNbins(kMaxBins, kMaxBins);
214 //AliUnfolding::SetDebug(1);
215
216 Int_t hID = 0;
217
218 TH2F* hist = esd->GetMultiplicityESD(hID);
219 mult->SetMultiplicityESD(hID, hist);
220
221 // without bias calculation
222 mult->ApplyBayesianMethod(hID, kFALSE, 0, 1, 10, 0, 1);
223 baseold = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("baseold");
224
225 // with bias calculation
226 mult->ApplyBayesianMethod(hID, kFALSE, 0, 1, 10, 0, 2);
227 base = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("base");
228
229 TH1* hist1 = new TH1F("hist1", "", 100, 0, 20);
230 TH1* hist2 = new TH1F("hist2", "", 100, 0, 20);
231
232 for (Int_t t = 0; t<kMaxBins; t++)
233 {
234 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);
235
236 hist1->Fill((base->GetBinContent(t+1) > 0) ? 100.0 * baseold->GetBinError(t+1) / base->GetBinContent(t+1) : -1);
237 hist2->Fill((base->GetBinContent(t+1) > 0) ? 100.0 * base->GetBinError(t+1) / base->GetBinContent(t+1) : -1);
238 }
239
240 new TCanvas;
241 hist1->Draw();
242 hist2->SetLineColor(2);
243 hist2->Draw("SAME");
244}
245
246void DataScan(Bool_t redo = kTRUE)
247{
248 // makes a set of unfolded spectra and compares
249 // don't forget FindUnfoldedLimit in plots.C
250
251 loadlibs();
252
253 // files...
254 Bool_t mc = kTRUE;
255 const char* fileNameMC = "multiplicityMC.root";
256 const char* folder = "Multiplicity";
257 const char* fileNameESD = "multiplicityESD.root";
258 const char* folderESD = "Multiplicity";
259 Int_t hID = 0; const Int_t kMaxBins = 35;
260 //Int_t hID = 1; const Int_t kMaxBins = 60;
261 //Int_t hID = 2; const Int_t kMaxBins = 70;
262 AliMultiplicityCorrection::EventType eventType = AliMultiplicityCorrection::kTrVtx;
263 Bool_t evaluteBias = kFALSE;
264
265 Int_t referenceCase = 2; // all results are shown as ratio to this case
266
267 // chi2 range
268 AliUnfolding::RegularizationType regBegin = AliUnfolding::kPol0;
269 AliUnfolding::RegularizationType regEnd = AliUnfolding::kPol0;
270 Float_t regParamBegin[] = { 0, 1, 10 };
271 Float_t regParamEnd[] = { 0, 40, 101 };
272 Float_t regParamStep[] = { 0, TMath::Sqrt(10), TMath::Sqrt(10) };
273
274 // bayesian range
275 Int_t iterBegin = 5;
276 Int_t iterEnd = 21;
277 Int_t iterStep = 5;
278
279 TList labels;
280
281 AliMultiplicityCorrection* mult = AliMultiplicityCorrection::Open(fileNameMC, folder);
282 AliMultiplicityCorrection* esd = AliMultiplicityCorrection::Open(fileNameESD, folderESD);
283
284 mult->SetMultiplicityESD(hID, esd->GetMultiplicityESD(hID));
285
286 if (mc)
287 mult->SetMultiplicityMC(hID, eventType, esd->GetMultiplicityMC(hID, eventType));
288
289 AliUnfolding::SetNbins(kMaxBins, kMaxBins);
290 //AliUnfolding::SetDebug(1);
291
292 Int_t count = -1;
293
294 for (AliUnfolding::RegularizationType reg = regBegin; reg <= regEnd; reg++)
295 {
296 for (Float_t regParam = regParamBegin[reg]; regParam < regParamEnd[reg]; regParam *= regParamStep[reg])
297 {
298 count++;
299 labels.Add(new TObjString(Form("#chi^{2} Reg %d #beta = %.2f", (Int_t) reg, regParam)));
300
301 if (!redo)
302 continue;
303
304 AliUnfolding::SetChi2Regularization(reg, regParam);
305
306 mult->ApplyMinuitFit(hID, kFALSE, eventType, kFALSE, 0, evaluteBias);
307
308 file = TFile::Open(Form("datascan_%d.root", count), "RECREATE");
309 mult->SaveHistograms();
310 file->Close();
311 }
312 }
313
314 for (Int_t iter = iterBegin; iter <= iterEnd; iter += iterStep)
315 {
316 count++;
317 labels.Add(new TObjString(Form("Bayesian Iter = %d", iter)));
318
319 if (!redo)
320 continue;
321
322 mult->ApplyBayesianMethod(hID, kFALSE, eventType, 1, iter, 0, kTRUE);
323
324 file = TFile::Open(Form("datascan_%d.root", count), "RECREATE");
325 mult->SaveHistograms();
326 file->Close();
327 }
328
329 // 1) all distributions
330 // 2) ratio to MC
331 // 3) ratio to ref point
332 // 4) relative error
333 // 5) residuals
334 c = new TCanvas("c", "c", 1200, 800);
335 c->Divide(3, 2);
336
337 c->cd(1)->SetLogy();
338
339 // get reference point
340 mult = AliMultiplicityCorrection::Open(Form("datascan_%d.root", referenceCase));
341 if (!mult)
342 return;
343 refPoint = (TH1*) mult->GetMultiplicityESDCorrected(hID)->Clone("refPoint");
344
345 legend = new TLegend(0.5, 0.5, 0.99, 0.99);
346 legend->SetFillColor(0);
347
348 TH1* residualSum = new TH1F("residualSum", ";;residual squared sum", count + 1, 0.5, count + 1.5);
349
350 count = 0;
351 while (1)
352 {
353 mult = AliMultiplicityCorrection::Open(Form("datascan_%d.root", count++));
354 if (!mult)
355 break;
356
357 hist = (TH1*) mult->GetMultiplicityESDCorrected(hID);
358 hist->SetLineColor((count-1) % 4 + 1);
359 hist->SetLineStyle((count-1) / 4 + 1);
360 hist->GetXaxis()->SetRangeUser(0, kMaxBins);
361 hist->SetStats(kFALSE);
362 hist->SetTitle("");
363
364 legend->AddEntry(hist->Clone(), labels.At(count-1)->GetName());
365
366 c->cd(1);
367 hist->DrawCopy((count == 1) ? "HIST" : "HISTSAME");
368
369 if (mc)
370 {
371 TH2* mcHist2d = mult->GetMultiplicityMC(hID, eventType);
372 mcHist = mcHist2d->ProjectionY("mcmchist", 1, mcHist2d->GetNbinsX());
373
374 c->cd(1);
375 mcHist->SetMarkerStyle(24);
376 mcHist->Draw("P SAME");
377
378 c->cd(2);
379 // calculate ratio using only the error on the mc bin
380 ratio = (TH1*) hist->Clone("ratio");
381 for (Int_t bin=1; bin<=ratio->GetNbinsX(); bin++)
382 {
383 if (mcHist->GetBinContent(bin) <= 0)
384 continue;
385 ratio->SetBinContent(bin, hist->GetBinContent(bin) / mcHist->GetBinContent(bin));
386 ratio->SetBinError(bin, mcHist->GetBinError(bin) / mcHist->GetBinContent(bin) * ratio->GetBinContent(bin));
387 }
388
389 ratio->GetYaxis()->SetRangeUser(0.5, 1.5);
390 ratio->GetYaxis()->SetTitle("Ratio unfolded / MC");
391 ratio->DrawCopy((count == 1) ? "HIST" : "HISTSAME");
392 }
393
394 c->cd(3);
395 // calculate ratio using no errors for now
396 ratio = (TH1*) hist->Clone("ratio");
397 for (Int_t bin=1; bin<=ratio->GetNbinsX(); bin++)
398 {
399 if (refPoint->GetBinContent(bin) <= 0)
400 continue;
401 ratio->SetBinContent(bin, hist->GetBinContent(bin) / refPoint->GetBinContent(bin));
402 ratio->SetBinError(bin, 0);
403 }
404
405 ratio->GetYaxis()->SetRangeUser(0.5, 1.5);
406 ratio->GetYaxis()->SetTitle("Ratio unfolded / unfolded reference case");
407 ratio->DrawCopy((count == 1) ? "" : "SAME");
408
409 c->cd(4);
410 ratio = (TH1*) hist->Clone("ratio");
411 for (Int_t bin=1; bin<=ratio->GetNbinsX(); bin++)
412 {
413 if (ratio->GetBinContent(bin) <= 0)
414 continue;
415 ratio->SetBinContent(bin, ratio->GetBinError(bin) / ratio->GetBinContent(bin));
416 ratio->SetBinError(bin, 0);
417 }
418 ratio->GetYaxis()->SetRangeUser(0, 1);
419 ratio->GetYaxis()->SetTitle("Relative error");
420 ratio->DrawCopy((count == 1) ? "" : "SAME");
421
422 c->cd(5);
423 Float_t sum;
424 residuals = mult->GetResiduals(hID, AliMultiplicityCorrection::kTrVtx, sum);
425 residuals->SetStats(0);
426 residuals->GetXaxis()->SetRangeUser(0, kMaxBins);
427 residuals->SetStats(kFALSE);
428 residuals->SetLineColor((count-1) % 4 + 1);
429 residuals->SetLineStyle((count-1) / 4 + 1);
430 residuals->GetYaxis()->SetRangeUser(-5, 5);
431 residuals->DrawCopy((count == 1) ? "" : "SAME");
432
433 residualSum->Fill(count, sum);
434 residualSum->GetXaxis()->SetBinLabel(count, labels.At(count-1)->GetName());
435 }
436
437 c->cd(6);
438 residualSum->Draw();
439 legend->Draw();
440}
441
69b09e3b 442void DrawBayesianIterations(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", Int_t histID = 1, Int_t eventType = 0 /* AliMultiplicityCorrection::kTrVtx */)
443{
444 loadlibs();
445
446 const char* folder = "Multiplicity";
447
448 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection(folder, folder);
449 TFile::Open(fileNameMC);
450 mult->LoadHistograms();
451
452 AliMultiplicityCorrection* esd = new AliMultiplicityCorrection(folder, folder);
453 TFile::Open(fileNameESD);
454 esd->LoadHistograms();
455
456 TH2F* hist = esd->GetMultiplicityESD(histID);
457 TH2F* hist2 = esd->GetMultiplicityMC(histID, eventType);
458
459 mult->SetMultiplicityESD(histID, hist);
460 mult->SetMultiplicityMC(histID, eventType, hist2);
461
462 TH1* mcCompare = hist2->ProjectionY("mcmchist", 1, hist2->GetNbinsX());
463 //mcCompare->Scale(1.0 / mcCompare->Integral());
464
465 TH1* esdHist = (TH1*) hist->ProjectionY("myesd", 1, 1)->Clone("myesd");
466 //esdHist->Scale(1.0 / esdHist->Integral());
467
468 c = new TCanvas("c", "c", 1200, 600);
469 c->Divide(2, 1);
470
471 c->cd(1);
472 gPad->SetLeftMargin(0.12);
473 gPad->SetTopMargin(0.05);
474 gPad->SetRightMargin(0.05);
475 gPad->SetLogy();
476 gPad->SetGridx();
477 gPad->SetGridy();
478
479 mcCompare->GetXaxis()->SetRangeUser(0, 80);
480 mcCompare->SetStats(0);
481 mcCompare->SetFillColor(5);
482 mcCompare->SetLineColor(5);
483 mcCompare->SetTitle(Form(";%s;Entries", GetMultLabel(1)));
484 mcCompare->GetYaxis()->SetRangeUser(2, esdHist->GetMaximum() * 2);
485 mcCompare->GetYaxis()->SetTitleOffset(1.3);
486 mcCompare->Draw("HIST");
487 esdHist->SetMarkerStyle(5);
488 esdHist->Draw("P HIST SAME");
489
490 c->cd(2);
491 gPad->SetTopMargin(0.05);
492 gPad->SetRightMargin(0.05);
493 gPad->SetGridx();
494 gPad->SetGridy();
495
496 trueMeasuredRatio = (TH1*) mcCompare->Clone("trueMeasuredRatio");
497 trueMeasuredRatio->Divide(esdHist);
498 trueMeasuredRatio->SetStats(0);
499 trueMeasuredRatio->SetTitle(Form(";%s;Ratio", GetMultLabel(1)));
500 trueMeasuredRatio->GetYaxis()->SetTitleOffset(1.3);
501 trueMeasuredRatio->GetYaxis()->SetRangeUser(0, 2);
502 // ROOT displays all values > 2 at 2 which looks weird
503 for (Int_t i=1; i<=trueMeasuredRatio->GetNbinsX(); i++)
504 if (trueMeasuredRatio->GetBinContent(i) > 2)
505 trueMeasuredRatio->SetBinContent(i, 0);
506 trueMeasuredRatio->SetMarkerStyle(5);
507 trueMeasuredRatio->Draw("P");
508
509 Int_t colors[] = {1, 2, 4, 6};
510
511 legend = new TLegend(0.15, 0.13, 0.5, 0.5);
512 legend->SetFillColor(0);
513 legend->SetTextSize(0.04);
514
515 legend->AddEntry(mcCompare, "True", "F");
516 legend->AddEntry(esdHist, "Measured", "P");
517
518 legend2 = new TLegend(0.15, 0.13, 0.5, 0.4);
519 legend2->SetFillColor(0);
520 legend2->SetTextSize(0.04);
521
522 legend2->AddEntry(trueMeasuredRatio, "Measured", "P");
523
524 Int_t iters[] = {1, 3, 10, -1};
525 for (Int_t i = 0; i<4; i++)
526 {
527 Int_t iter = iters[i];
528 mult->ApplyBayesianMethod(histID, kFALSE, eventType, 1, iter, 0, 0);
529 corr = mult->GetMultiplicityESDCorrected(histID);
530 corr->Scale(1.0 / corr->Integral());
531 corr->Scale(mcCompare->Integral());
532 corr->GetXaxis()->SetRangeUser(0, 80);
533 //corr->SetMarkerStyle(20+iter);
534 corr->SetLineColor(colors[i]);
535 corr->SetLineStyle(i+1);
536 corr->SetLineWidth(2);
537
538 c->cd(1);
539 corr->DrawCopy("SAME HIST");
540
541 c->cd(2);
542 clone = (TH1*) corr->Clone("clone");
543 clone->Divide(mcCompare, corr);
544 clone->GetYaxis()->SetRangeUser(0, 2);
545 clone->DrawCopy("SAME HIST");
546
547 legend->AddEntry((TH1*) corr->Clone(), (iter > -1) ? Form("%d iteration%s", iter, (iter == 1) ? "" : "s") : "Convergence", "L");
548 legend2->AddEntry((TH1*) corr->Clone(), (iter > -1) ? Form("%d iteration%s", iter, (iter == 1) ? "" : "s") : "Convergence", "L");
549 }
550
551 c->cd(1);
552 legend->Draw();
553
554 c->cd(2);
555 legend2->Draw();
556
557 c->SaveAs("bayesian_iterations.eps");
0a0f4adb 558}
559
f3eb27f6 560void 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)
0a0f4adb 561{
562 const char* folder = "Multiplicity";
563
564 loadlibs();
565
566 AliMultiplicityCorrection* chi2 = new AliMultiplicityCorrection(folder, folder);
567 TFile::Open(chi2File);
568 chi2->LoadHistograms();
569
570 AliMultiplicityCorrection* bayesian = new AliMultiplicityCorrection(folder, folder);
571 TFile::Open(bayesianFile);
572 bayesian->LoadHistograms();
573
f3eb27f6 574 histRAW = chi2->GetMultiplicityESD(histID)->ProjectionY("raw", 1, chi2->GetMultiplicityESD(histID)->GetNbinsX());
575 histRAW->Scale(1.0 / histRAW->Integral());
576
0a0f4adb 577 histC = chi2->GetMultiplicityESDCorrected(histID);
578 histB = bayesian->GetMultiplicityESDCorrected(histID);
579
580 c = new TCanvas("CompareChi2Bayesian", "CompareChi2Bayesian", 800, 600);
581 c->SetRightMargin(0.05);
582 c->SetTopMargin(0.05);
583 c->SetLogy();
f3eb27f6 584 c->SetGridx();
585 c->SetGridy();
0a0f4adb 586
587 histC->SetTitle(";N;P(N)");
588 histC->SetStats(kFALSE);
589 histC->GetXaxis()->SetRangeUser(0, 100);
590
591 histC->SetLineColor(1);
592 histB->SetLineColor(2);
f3eb27f6 593 histRAW->SetLineColor(3);
0a0f4adb 594
51f6de65 595 histC->DrawCopy("HISTE");
596 histB->DrawCopy("HISTE SAME");
f3eb27f6 597 histRAW->DrawCopy("SAME");
0a0f4adb 598
599 legend = new TLegend(0.2, 0.2, 0.4, 0.4);
600 legend->SetFillColor(0);
601
f3eb27f6 602 legend->AddEntry(histC, label1);
603 legend->AddEntry(histB, label2);
604 legend->AddEntry(histRAW, "raw ESD");
0a0f4adb 605
51f6de65 606 histGraph = 0;
f3eb27f6 607 if (simpleCorrect > 0)
608 {
609 graph = new TGraph;
610 graph->SetMarkerStyle(25);
611 graph->SetFillColor(0);
612 for (Int_t bin=1; bin<=histRAW->GetNbinsX(); bin++)
613 graph->SetPoint(graph->GetN(), histRAW->GetXaxis()->GetBinCenter(bin) * simpleCorrect, histRAW->GetBinContent(bin));
614
615 graph->Draw("PSAME");
616 legend->AddEntry(graph, "weighting");
617
618 // now create histogram from graph and normalize
619 histGraph = (TH1*) histRAW->Clone();
620 histGraph->Reset();
621 for (Int_t bin=1; bin<=histGraph->GetNbinsX(); bin++)
622 {
623 Int_t j=1;
624 for (j=1; j<graph->GetN(); j++)
625 if (graph->GetX()[j] > histGraph->GetXaxis()->GetBinCenter(bin))
626 break;
627 if (j == graph->GetN())
628 continue;
629 if (histGraph->GetXaxis()->GetBinCenter(bin) - graph->GetX()[j] < graph->GetX()[j-1] - histGraph->GetXaxis()->GetBinCenter(bin))
630 j--;
631 histGraph->SetBinContent(bin, graph->GetY()[j]);
632 }
633
634 Printf("Integral = %f", histGraph->Integral());
635 histGraph->Scale(1.0 / histGraph->Integral());
636
637 histGraph->SetLineColor(6);
638 histGraph->DrawCopy("SAME");
639 legend->AddEntry(histGraph, "weighting normalized");
640 }
641
642 if (mcFile)
0a0f4adb 643 {
644 AliMultiplicityCorrection* mc = new AliMultiplicityCorrection(folder, folder);
645 TFile::Open(mcFile);
646 mc->LoadHistograms();
647
648 histMC = mc->GetMultiplicityVtx(histID)->ProjectionY("mc", 1, mc->GetMultiplicityVtx(histID)->GetNbinsX());
f3eb27f6 649 histMC->Sumw2();
0a0f4adb 650 histMC->Scale(1.0 / histMC->Integral());
651
51f6de65 652 histMC->Draw("HISTE SAME");
0a0f4adb 653 histMC->SetLineColor(4);
654 legend->AddEntry(histMC, "MC");
655 }
656
657 legend->Draw();
658
f3eb27f6 659 c->SaveAs(Form("%s.png", c->GetName()));
660 c->SaveAs(Form("%s.eps", c->GetName()));
661
662 if (!mcFile)
663 return;
664
665 // build ratios
666
667 c = new TCanvas("CompareChi2BayesianRatio", "CompareChi2BayesianRatio", 800, 600);
668 c->SetRightMargin(0.05);
669 c->SetTopMargin(0.05);
670 c->SetGridx();
671 c->SetGridy();
672
673 for (Int_t bin=1; bin<=histC->GetNbinsX(); bin++)
674 {
675 if (histMC->GetBinContent(bin) > 0)
676 {
677 histC->SetBinContent(bin, histC->GetBinContent(bin) / histMC->GetBinContent(bin));
678 histB->SetBinContent(bin, histB->GetBinContent(bin) / histMC->GetBinContent(bin));
51f6de65 679
680 /*
681 if (histGraph)
682 {
683 histGraph->SetBinContent(bin, histGraph->GetBinContent(bin) / histMC->GetBinContent(bin));
684 histGraph->SetBinError(bin, 0);
685 }
686 */
f3eb27f6 687
688 // TODO errors?
689 histC->SetBinError(bin, 0);
690 histB->SetBinError(bin, 0);
f3eb27f6 691 }
692 }
693
694 histC->GetYaxis()->SetRangeUser(0.5, 2);
695 histC->GetYaxis()->SetTitle("Unfolded / MC");
696
697 histC->Draw("HIST");
698 histB->Draw("HIST SAME");
51f6de65 699 /*
700 if (histGraph)
701 histGraph->Draw("HIST SAME");
702 */
f3eb27f6 703
704 /*
705 if (simpleCorrect > 0)
706 {
707 graph2 = new TGraph;
708 graph2->SetMarkerStyle(25);
709 graph2->SetFillColor(0);
710 for (Int_t i=0; i<graph->GetN(); i++)
711 {
712 Float_t mcValue = histMC->GetBinContent(histMC->FindBin(graph->GetX()[i]));
713 Float_t mcError = histMC->GetBinError(histMC->FindBin(graph->GetX()[i]));
714 if (mcValue > 0)
715 graph2->SetPoint(graph2->GetN(), graph->GetX()[i], graph->GetY()[i] / mcValue);
716 }
717 graph2->Draw("PSAME");
718 }
719 */
720
721 c->SaveAs(Form("%s.png", c->GetName()));
722 c->SaveAs(Form("%s.eps", c->GetName()));
723}
724
725
726void CompareMC(Int_t histID, Int_t eventType, const char* file1, const char* file2, const char* label1, const char* label2)
727{
728 const char* folder = "Multiplicity";
729
730 loadlibs();
731
732 AliMultiplicityCorrection* mc1 = new AliMultiplicityCorrection(folder, folder);
733 TFile::Open(file1);
734 mc1->LoadHistograms();
735 histMC1 = mc1->GetMultiplicityMC(histID, eventType)->ProjectionY("mc1", 1, mc1->GetMultiplicityMC(histID, eventType)->GetNbinsX());
736 histMC1->Scale(1.0 / histMC1->Integral());
737
738 AliMultiplicityCorrection* mc2 = new AliMultiplicityCorrection(folder, folder);
739 TFile::Open(file2);
740 mc2->LoadHistograms();
741 histMC2 = mc2->GetMultiplicityMC(histID, eventType)->ProjectionY("mc2", 1, mc2->GetMultiplicityMC(histID, eventType)->GetNbinsX());
742 histMC2->Scale(1.0 / histMC2->Integral());
743
744 c = new TCanvas("CompareMC", "CompareMC", 800, 600);
745 c->SetRightMargin(0.05);
746 c->SetTopMargin(0.05);
747 c->SetLogy();
748
749 histMC1->SetTitle(";N;P(N)");
750 histMC1->SetStats(kFALSE);
751 histMC1->GetXaxis()->SetRangeUser(0, 100);
752
753 histMC1->SetLineColor(1);
754 histMC2->SetLineColor(2);
755
756 histMC1->Draw();
757 histMC2->Draw("SAME");
758
759 legend = new TLegend(0.2, 0.2, 0.4, 0.4);
760 legend->SetFillColor(0);
761
762 legend->AddEntry(histMC1, label1);
763 legend->AddEntry(histMC2, label2);
764
765 legend->Draw();
766
0a0f4adb 767 c->SaveAs(Form("%s.gif", c->GetName()));
768 c->SaveAs(Form("%s.eps", c->GetName()));
447c325d 769}
770
771void* fit2Step(const char* fileNameMC = "multiplicityMC_2M.root", const char* fileNameESD = "multiplicityMC_1M_3.root", Int_t histID = 3, Bool_t fullPhaseSpace = kFALSE)
772{
773 gSystem->Load("libPWG0base");
774
775 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
776
777 TFile::Open(fileNameMC);
778 mult->LoadHistograms("Multiplicity");
779
780 TFile::Open(fileNameESD);
781 TH2F* hist = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityESD%d", histID));
782 TH2F* hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityVtx%d", ((fullPhaseSpace) ? 4 : histID)));
783 //hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityINEL%d", histID));
784
785 mult->SetMultiplicityESD(histID, hist);
786
787 // small hack to get around charge conservation for full phase space ;-)
788 if (fullPhaseSpace)
789 {
790 TH1* corr = mult->GetCorrelation(histID + 4);
791
792 for (Int_t i=2; i<=corr->GetNbinsX(); i+=2)
793 for (Int_t j=1; j<=corr->GetNbinsY(); ++j)
794 {
795 corr->SetBinContent(i, j, corr->GetBinContent(i-1, j));
796 corr->SetBinError(i, j, corr->GetBinError(i-1, j));
797 }
798 }
799
800 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
801 mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
802 mult->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, hist2->ProjectionY("mymchist"));
803
804 TH1* result = (TH1*) mult->GetMultiplicityESDCorrected((fullPhaseSpace) ? 4 : histID))->Clone("firstresult");
805
806 mult->SetRegularizationParameters(AliMultiplicityCorrection::kEntropy, 100000);
807 mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE, result);
808 mult->DrawComparison("MinuitChi2_Step2", histID, fullPhaseSpace, kTRUE, hist2->ProjectionY("mymchist"));
0a173978 809
810 return mult;
811}
cfc19dd5 812
813const char* GetRegName(Int_t type)
814{
815 switch (type)
816 {
817 case AliMultiplicityCorrection::kNone: return "None"; break;
818 case AliMultiplicityCorrection::kPol0: return "Pol0"; break;
819 case AliMultiplicityCorrection::kPol1: return "Pol1"; break;
820 case AliMultiplicityCorrection::kCurvature: return "TotalCurvature"; break;
821 case AliMultiplicityCorrection::kEntropy: return "Reduced cross-entropy"; break;
0b4bfd98 822 case AliMultiplicityCorrection::kLog : return "Log"; break;
dd701109 823 }
824 return 0;
825}
826
827const char* GetEventTypeName(Int_t type)
828{
829 switch (type)
830 {
831 case AliMultiplicityCorrection::kTrVtx: return "trigger, vertex"; break;
832 case AliMultiplicityCorrection::kMB: return "minimum bias"; break;
833 case AliMultiplicityCorrection::kINEL: return "inelastic"; break;
cfc19dd5 834 }
835 return 0;
836}
837
69b09e3b 838void EvaluateBayesianMethodIterationsSmoothing(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", const char* targetDir = "bayesian", Int_t histID = 1)
447c325d 839{
840 gSystem->mkdir(targetDir);
841
842 gSystem->Load("libPWG0base");
843
844 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
845 TFile::Open(fileNameMC);
846 mult->LoadHistograms("Multiplicity");
847
848 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
849 TFile::Open(fileNameESD);
850 multESD->LoadHistograms("Multiplicity");
851 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
852
853 Int_t count = 0; // just to order the saved images...
854
855 TFile* graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir), "RECREATE");
856
69b09e3b 857 Int_t colors[] = {1, 2, 3, 4, 6};
858 Int_t markers[] = {20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 3, 4, 5, 6};
0b4bfd98 859
860 for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kTrVtx; ++type)
861 //for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kINEL; ++type)
447c325d 862 {
863 TString tmp;
864 tmp.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));
865
866 TCanvas* canvas = new TCanvas(tmp, tmp, 800, 600);
867
0f67a57c 868 for (Int_t i = 1; i <= 5; i++)
447c325d 869 {
69b09e3b 870 Int_t iterArray[5] = {2, 5, 10, 20, -1};
0b4bfd98 871 Int_t iter = iterArray[i-1];
872
873 TGraph* fitResultsMC[3];
874 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
875 {
876 fitResultsMC[region] = new TGraph;
69b09e3b 877 fitResultsMC[region]->SetTitle(Form("%d iterations - reg. %d", iter, region+1));
0b4bfd98 878 fitResultsMC[region]->GetXaxis()->SetTitle("smoothing parameter #alpha");
879 fitResultsMC[region]->GetYaxis()->SetTitle(Form("P_{1} in region %d", region));
880 fitResultsMC[region]->SetName(Form("%s_MC_%d", tmp.Data(), i * AliMultiplicityCorrection::kQualityRegions + region - 2));
881 fitResultsMC[region]->SetFillColor(0);
0f67a57c 882 //fitResultsMC[region]->SetMarkerStyle(markers[(i-1) * AliMultiplicityCorrection::kQualityRegions + region]);
69b09e3b 883 fitResultsMC[region]->SetMarkerStyle(markers[i-1]);
884 fitResultsMC[region]->SetLineColor(colors[i-1]);
885 fitResultsMC[region]->SetMarkerColor(colors[i-1]);
0b4bfd98 886 }
887
447c325d 888 TGraph* fitResultsRes = new TGraph;
889 fitResultsRes->SetTitle(Form("%d iterations", iter));
890 fitResultsRes->SetName(Form("%s_Res_%d", tmp.Data(), i));
891 fitResultsRes->GetXaxis()->SetTitle("smoothing parameter");
892 fitResultsRes->GetYaxis()->SetTitle("P_{2}");
893
447c325d 894 fitResultsRes->SetFillColor(0);
69b09e3b 895 fitResultsRes->SetMarkerStyle(markers[i-1]);
896 fitResultsRes->SetMarkerColor(colors[i-1]);
897 fitResultsRes->SetLineColor(colors[i-1]);
447c325d 898
899 for (Float_t weight = 0.0; weight < 1.01; weight += 0.2)
900 {
901 Float_t chi2MC = 0;
902 Float_t residuals = 0;
903
0b4bfd98 904 mult->ApplyBayesianMethod(histID, kFALSE, type, weight, iter, 0, kFALSE);
447c325d 905 mult->DrawComparison(Form("%s/BayesianIterSmooth_%03d_%d_%d_%f", targetDir, count++, type, iter, weight), histID, kFALSE, kTRUE, multESD->GetMultiplicityMC(histID, type)->ProjectionY());
906 mult->GetComparisonResults(&chi2MC, 0, &residuals);
907
0b4bfd98 908 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
909 fitResultsMC[region]->SetPoint(fitResultsMC[region]->GetN(), weight, mult->GetQuality(region));
910
447c325d 911 fitResultsRes->SetPoint(fitResultsRes->GetN(), weight, residuals);
912 }
913
0b4bfd98 914 graphFile->cd();
915 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
916 fitResultsMC[region]->Write();
917
447c325d 918 fitResultsRes->Write();
919 }
920 }
0b4bfd98 921
922 graphFile->Close();
447c325d 923}
924
925void EvaluateDrawResult(const char* targetDir, Int_t type = 0, Bool_t plotRes = kTRUE)
926{
927 gSystem->Load("libPWG0base");
928
929 TString name;
930 TFile* graphFile = 0;
931 if (type == -1)
932 {
933 name = "EvaluateChi2Method";
934 graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir));
935 }
936 else
937 {
938 name.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));
939 graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir));
940 }
941
942 TCanvas* canvas = new TCanvas(name, name, 800, 500);
943 if (type == -1)
0b4bfd98 944 {
447c325d 945 canvas->SetLogx();
0b4bfd98 946 canvas->SetLogy();
947 }
948 canvas->SetTopMargin(0.05);
949 canvas->SetGridx();
950 canvas->SetGridy();
447c325d 951
0b4bfd98 952 TLegend* legend = new TLegend(0.8, 0.15, 0.98, 0.98);
447c325d 953 legend->SetFillColor(0);
954
955 Int_t count = 1;
956
957 Float_t xMin = 1e20;
958 Float_t xMax = 0;
959
960 Float_t yMin = 1e20;
961 Float_t yMax = 0;
962
0b4bfd98 963 Float_t yMinRegion[3];
964 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
965 yMinRegion[i] = 1e20;
966
447c325d 967 TString xaxis, yaxis;
968
969 while (1)
970 {
971 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
972 TGraph* res = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
973
0b4bfd98 974 if (!mc)
447c325d 975 break;
976
977 xaxis = mc->GetXaxis()->GetTitle();
978 yaxis = mc->GetYaxis()->GetTitle();
979
980 mc->Print();
447c325d 981
0b4bfd98 982 if (res)
983 res->Print();
447c325d 984
0b4bfd98 985 xMin = TMath::Min(xMin, mc->GetXaxis()->GetXmin());
986 yMin = TMath::Min(yMin, mc->GetYaxis()->GetXmin());
447c325d 987
0b4bfd98 988 xMax = TMath::Max(xMax, mc->GetXaxis()->GetXmax());
989 yMax = TMath::Max(yMax, mc->GetYaxis()->GetXmax());
990
991 if (plotRes && res)
447c325d 992 {
0b4bfd98 993 xMin = TMath::Min(xMin, res->GetXaxis()->GetXmin());
994 yMin = TMath::Min(yMin, res->GetYaxis()->GetXmin());
447c325d 995
0b4bfd98 996 xMax = TMath::Max(xMax, res->GetXaxis()->GetXmax());
997 yMax = TMath::Max(yMax, res->GetYaxis()->GetXmax());
447c325d 998 }
0b4bfd98 999
1000 for (Int_t i=0; i<mc->GetN(); ++i)
1001 yMinRegion[(count-1) % 3] = TMath::Min(yMinRegion[(count-1) % 3], mc->GetY()[i]);
1002
1003 count++;
447c325d 1004 }
1005
0b4bfd98 1006 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
1007 Printf("Minimum for region %d is %f", i, yMinRegion[i]);
1008
447c325d 1009 if (type >= 0)
1010 {
1011 xaxis = "smoothing parameter";
1012 }
1013 else if (type == -1)
1014 {
1015 xaxis = "weight parameter";
0b4bfd98 1016 xMax *= 5;
447c325d 1017 }
0b4bfd98 1018 //yaxis = "P_{1} (2 <= t <= 150)";
447c325d 1019
1020 printf("%f %f %f %f\n", xMin, xMax, yMin, yMax);
1021
1022 TGraph* dummy = new TGraph;
1023 dummy->SetPoint(0, xMin, yMin);
1024 dummy->SetPoint(1, xMax, yMax);
1025 dummy->SetTitle(Form(";%s;%s", xaxis.Data(), yaxis.Data()));
1026
1027 dummy->SetMarkerColor(0);
1028 dummy->Draw("AP");
0b4bfd98 1029 dummy->GetYaxis()->SetMoreLogLabels(1);
447c325d 1030
1031 count = 1;
1032
1033 while (1)
1034 {
1035 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
1036 TGraph* res = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
1037
0b4bfd98 1038 //printf("%s_MC_%d %p %p\n", name.Data(), count, mc, res);
447c325d 1039
0b4bfd98 1040 if (!mc)
447c325d 1041 break;
1042
1043 printf("Loaded %d sucessful.\n", count);
1044
44466df2 1045 if (type == -1)
447c325d 1046 {
44466df2 1047 legend->AddEntry(mc, Form("Eq. (%d) - reg. %d", 10 + (count-1) / 3, 1+ (count-1) % 3));
447c325d 1048 }
44466df2 1049 else
447c325d 1050 legend->AddEntry(mc);
1051
1052 mc->Draw("SAME PC");
1053
0b4bfd98 1054 if (plotRes && res)
447c325d 1055 {
1056 legend->AddEntry(res);
1057 res->Draw("SAME PC");
1058 }
1059
1060 count++;
1061 }
1062
1063 legend->Draw();
1064
1065 canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
1066 canvas->SaveAs(Form("%s/%s.eps", targetDir, canvas->GetName()));
1067}
1068
0f67a57c 1069void EvaluateDrawResultRegions(const char* targetDir, Int_t type = 0)
1070{
69b09e3b 1071 loadlibs();
0f67a57c 1072
1073 TString name;
1074 TFile* graphFile = 0;
1075 if (type == -1)
1076 {
1077 name = "EvaluateChi2Method";
1078 graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir));
1079 }
1080 else
1081 {
1082 name.Form("EvaluateBayesianMethodIterationsSmoothing_%s", GetEventTypeName(type));
1083 graphFile = TFile::Open(Form("%s/EvaluateBayesianMethodIterationsSmoothing.root", targetDir));
1084 }
1085
69b09e3b 1086 TCanvas* canvas = new TCanvas(name, name, 1200, 800);
0f67a57c 1087 //canvas->Divide(1, AliMultiplicityCorrection::kQualityRegions, 0, 0);
69b09e3b 1088 canvas->SetTopMargin(0);
1089 canvas->SetBottomMargin(0);
1090 canvas->SetRightMargin(0.05);
0f67a57c 1091 canvas->Range(0, 0, 1, 1);
1092
69b09e3b 1093 TPad* pad[4];
1094 pad[3] = new TPad(Form("%s_pad1", name.Data()), "", 0, 0, 0.5, 0.5); pad[3]->SetTopMargin(0); pad[3]->SetBottomMargin(0.15);
1095 pad[1] = new TPad(Form("%s_pad2", name.Data()), "", 0, 0.5, 0.5, 1); pad[1]->SetBottomMargin(0);
1096 pad[0] = new TPad(Form("%s_pad3", name.Data()), "", 0.5, 0, 1, 0.5); pad[0]->SetTopMargin(0); pad[0]->SetBottomMargin(0.15);
1097 pad[2] = new TPad(Form("%s_pad4", name.Data()), "", 0.5, 0.5, 1, 1); pad[2]->SetBottomMargin(0);
0f67a57c 1098
1099 Float_t yMinRegion[3];
1100 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
1101 yMinRegion[i] = 1e20;
1102
69b09e3b 1103 for (Int_t region = 0; region <= AliMultiplicityCorrection::kQualityRegions; region++)
0f67a57c 1104 {
1105 canvas->cd();
69b09e3b 1106 pad[region]->Draw();
1107 pad[region]->cd();
1108 pad[region]->SetRightMargin(0.05);
1109
0f67a57c 1110 if (type == -1)
1111 {
69b09e3b 1112 pad[region]->SetLogx();
0f67a57c 1113 }
69b09e3b 1114 pad[region]->SetLogy();
1115
1116 pad[region]->SetGridx();
1117 pad[region]->SetGridy();
0f67a57c 1118
69b09e3b 1119 TLegend* legend = new TLegend(0.5, 0.4, 0.85, 0.85);
0f67a57c 1120 legend->SetFillColor(0);
69b09e3b 1121 //legend->SetNColumns(3);
1122 legend->SetTextSize(0.06);
0f67a57c 1123 Int_t count = 0;
1124
1125 Float_t xMin = 1e20;
1126 Float_t xMax = 0;
1127
1128 Float_t yMin = 1e20;
1129 Float_t yMax = 0;
1130
1131 TString xaxis, yaxis;
1132
1133 while (1)
1134 {
1135 count++;
1136
69b09e3b 1137 if (region > 0)
1138 {
1139 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
1140 if (!mc)
1141 break;
1142
1143 if (TString(mc->GetTitle()).Contains(Form("reg. %d", region)) == kFALSE)
1144 continue;
1145
1146 for (Int_t i=0; i<mc->GetN(); ++i)
1147 yMinRegion[(count-1) % 3] = TMath::Min(yMinRegion[(count-1) % 3], mc->GetY()[i]);
1148 }
1149 else
1150 {
1151 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
1152 if (!mc)
1153 break;
1154 }
0f67a57c 1155
1156 xaxis = mc->GetXaxis()->GetTitle();
1157 yaxis = mc->GetYaxis()->GetTitle();
1158
69b09e3b 1159 //mc->Print();
0f67a57c 1160
1161 xMin = TMath::Min(xMin, mc->GetXaxis()->GetXmin());
69b09e3b 1162 yMin = TMath::Min(yMin, TMath::MinElement(mc->GetN(), mc->GetY()));
0f67a57c 1163
1164 xMax = TMath::Max(xMax, mc->GetXaxis()->GetXmax());
1165 yMax = TMath::Max(yMax, mc->GetYaxis()->GetXmax());
69b09e3b 1166
1167 //Printf("%f %f %f %f", xMin, xMax, yMin, yMax);
0f67a57c 1168 }
1169
1170 if (type >= 0)
1171 {
69b09e3b 1172 xaxis = "Smoothing parameter #alpha";
0f67a57c 1173 }
1174 else if (type == -1)
1175 {
69b09e3b 1176 xaxis = "Weight parameter #beta";
1177 //xMax *= 5;
1178 }
1179 if (region > 0)
1180 {
1181 yaxis = Form("Q_{1} in region %d ", region); // (2 <= t <= 150)";
0f67a57c 1182 }
69b09e3b 1183 else
1184 yaxis = "Q_{2} ";
0f67a57c 1185
1186 printf("%f %f %f %f\n", xMin, xMax, yMin, yMax);
1187
69b09e3b 1188 if (region > 0)
1189 {
1190 if (type == -1)
1191 {
1192 yMin = 0.534622;
1193 yMax = 19.228941;
1194 }
1195 else
1196 {
1197 yMin = 0.759109;
1198 yMax = 10;
1199 }
1200 }
1201
1202 if (type != -1)
1203 xMax = 1.0;
1204
1205 TH1* dummy = new TH2F("dummy", "dummy", 100, xMin, xMax, 100, yMin * 0.9, yMax * 1.1);
0f67a57c 1206 dummy->SetTitle(Form(";%s;%s", xaxis.Data(), yaxis.Data()));
1207
69b09e3b 1208 if (region == 0 && type != -1)
1209 dummy->GetYaxis()->SetMoreLogLabels(1);
1210 dummy->SetLabelSize(0.06, "xy");
1211 dummy->SetTitleSize(0.06, "xy");
1212 dummy->GetXaxis()->SetTitleOffset(1.2);
1213 dummy->GetYaxis()->SetTitleOffset(0.8);
1214 dummy->SetStats(0);
1215
1216 dummy->DrawCopy();
1217
0f67a57c 1218
1219 count = 0;
1220
1221 while (1)
1222 {
1223 count++;
1224
69b09e3b 1225 if (region > 0)
1226 {
1227 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_MC_%d", name.Data(), count));
1228 if (mc && TString(mc->GetTitle()).Contains(Form("reg. %d", region)) == kFALSE)
1229 continue;
1230 }
1231 else
1232 TGraph* mc = (TGraph*) graphFile->Get(Form("%s_Res_%d", name.Data(), count));
1233
0f67a57c 1234 if (!mc)
1235 break;
69b09e3b 1236 //printf("Loaded %d sucessful.\n", count);
0f67a57c 1237
1238 if (type == -1)
1239 {
69b09e3b 1240 //legend->AddEntry(mc, Form("Eq. (%d) - reg. %d", 10 + (count-1) / 3, 1+ (count-1) % 3));
1241 //legend->AddEntry(mc, Form("Eq. (7.%d)", 11 + (count-1) / 3));
1242 const char* names[] = { "Const", "Linear", "Log" };
1243 legend->AddEntry(mc, names[(count-1) / 3], "PL");
0f67a57c 1244 }
1245 else
69b09e3b 1246 {
1247 TString label(mc->GetTitle());
1248 TString newLabel(label(0, label.Index(" ")));
1249 //Printf("%s", newLabel.Data());
1250 if (newLabel.Atoi() == -1)
1251 {
1252 newLabel = "Convergence";
1253 }
1254 else
1255 newLabel = label(0, label.Index("iterations") + 10);
1256
1257 legend->AddEntry(mc, newLabel, "PL");
1258 }
0f67a57c 1259
1260 mc->Draw("SAME PC");
1261
69b09e3b 1262 }
0f67a57c 1263
69b09e3b 1264 if (region == 2)
1265 legend->Draw();
0f67a57c 1266 }
1267
1268 for (Int_t i=0; i<AliMultiplicityCorrection::kQualityRegions; ++i)
1269 Printf("Minimum for region %d is %f", i, yMinRegion[i]);
1270
1271 canvas->Modified();
1272 canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
1273 canvas->SaveAs(Form("%s/%s.eps", targetDir, canvas->GetName()));
1274}
1275
69b09e3b 1276void EvaluateChi2Method(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityESD.root", const char* targetDir = "chi2compare", Int_t histID = 1)
dd701109 1277{
1278 gSystem->mkdir(targetDir);
1279
cfc19dd5 1280 gSystem->Load("libPWG0base");
1281
1282 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1283
1284 TFile::Open(fileNameMC);
1285 mult->LoadHistograms("Multiplicity");
1286
1287 TFile::Open(fileNameESD);
1288 TH2F* hist = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityESD%d", histID));
1289 TH2F* hist2 = (TH2F*) gFile->Get(Form("Multiplicity/fMultiplicityVtx%d", histID));
1290
1291 mult->SetMultiplicityESD(histID, hist);
1292
dd701109 1293 Int_t count = 0; // just to order the saved images...
69b09e3b 1294 Int_t colors[] = {1, 2, 4, 3};
1295 Int_t markers[] = {20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 3};
dd701109 1296
447c325d 1297 TGraph* fitResultsRes = 0;
1298
1299 TFile* graphFile = TFile::Open(Form("%s/EvaluateChi2Method.root", targetDir), "RECREATE");
cfc19dd5 1300
69b09e3b 1301 //for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kPol0; type <= AliMultiplicityCorrection::kLog; ++type)
1302 //for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kEntropy; type <= AliMultiplicityCorrection::kEntropy; ++type)
1303 for (AliMultiplicityCorrection::RegularizationType type = AliMultiplicityCorrection::kPol1; type <= AliMultiplicityCorrection::kPol1; ++type)
cfc19dd5 1304 {
0b4bfd98 1305 TGraph* fitResultsMC[3];
1306 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1307 {
1308 fitResultsMC[region] = new TGraph;
44466df2 1309 fitResultsMC[region]->SetTitle(Form("Eq. (%d) - reg. %d", type+9, region+1));
0b4bfd98 1310 fitResultsMC[region]->GetXaxis()->SetTitle("weight parameter #alpha");
1311 fitResultsMC[region]->GetYaxis()->SetTitle(Form("P_{1} in region %d", region));
1312 fitResultsMC[region]->SetName(Form("EvaluateChi2Method_MC_%d", type * AliMultiplicityCorrection::kQualityRegions + region - 2));
1313 fitResultsMC[region]->SetFillColor(0);
69b09e3b 1314 //fitResultsMC[region]->SetMarkerStyle(markers[(type-1) * AliMultiplicityCorrection::kQualityRegions + region]);
1315 //fitResultsMC[region]->SetLineColor(colors[region]);
1316 fitResultsMC[region]->SetMarkerStyle(markers[type-1]);
1317 fitResultsMC[region]->SetMarkerColor(colors[type-1]);
1318 fitResultsMC[region]->SetLineColor(colors[type-1]);
0b4bfd98 1319 }
1320
447c325d 1321 fitResultsRes = new TGraph;
1322 fitResultsRes->SetTitle(Form("%s residual chi2", GetRegName(type)));
1323 fitResultsRes->SetName(Form("EvaluateChi2Method_Res_%d", type));
1324 fitResultsRes->GetXaxis()->SetTitle("Weight Parameter");
cfc19dd5 1325
cfc19dd5 1326 fitResultsRes->SetFillColor(0);
69b09e3b 1327 fitResultsRes->SetMarkerStyle(markers[type-1]);
1328 fitResultsRes->SetMarkerColor(colors[type-1]);
1329 fitResultsRes->SetLineColor(colors[type-1]);
cfc19dd5 1330
69b09e3b 1331 for (Int_t i=0; i<15; ++i)
447c325d 1332 {
69b09e3b 1333 Float_t weight = TMath::Power(TMath::Sqrt(10), i+1);
447c325d 1334 //Float_t weight = TMath::Power(10, i+2);
cfc19dd5 1335
447c325d 1336 //if (type == AliMultiplicityCorrection::kEntropy) weight = 1e4 * (i+1) * 1.5;
cfc19dd5 1337
cfc19dd5 1338 Float_t chi2MC = 0;
1339 Float_t residuals = 0;
447c325d 1340 Float_t chi2Limit = 0;
1341
1342 TString runName;
1343 runName.Form("MinuitChi2_%02d_%d_%f", count++, type, weight);
cfc19dd5 1344
1345 mult->SetRegularizationParameters(type, weight);
447c325d 1346 Int_t status = mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx);
69b09e3b 1347 mult->DrawComparison(Form("%s/%s", targetDir, runName.Data()), histID, kFALSE, kTRUE, hist2->ProjectionY("mymc", 1, hist2->GetNbinsX()));
447c325d 1348 if (status != 0)
1349 {
1350 printf("MINUIT did not succeed. Skipping...\n");
1351 continue;
1352 }
1353
dd701109 1354 mult->GetComparisonResults(&chi2MC, 0, &residuals);
447c325d 1355 TH1* result = mult->GetMultiplicityESDCorrected(histID);
1356 result->SetName(runName);
1357 result->Write();
cfc19dd5 1358
0b4bfd98 1359 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1360 fitResultsMC[region]->SetPoint(fitResultsMC[region]->GetN(), weight, mult->GetQuality(region));
1361
cfc19dd5 1362 fitResultsRes->SetPoint(fitResultsRes->GetN(), weight, residuals);
cfc19dd5 1363 }
1364
447c325d 1365 graphFile->cd();
0b4bfd98 1366 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1367 fitResultsMC[region]->Write();
447c325d 1368 fitResultsRes->Write();
cfc19dd5 1369 }
1370
447c325d 1371 graphFile->Close();
dd701109 1372}
1373
1374void EvaluateChi2MethodAll()
1375{
1376 EvaluateChi2Method("multiplicityMC_3M.root", "multiplicityMC_3M.root", "eval-3M-3M");
1377 EvaluateChi2Method("multiplicityMC_2M.root", "multiplicityMC_1M_3.root", "eval-2M-1M");
1378 EvaluateChi2Method("multiplicityMC_3M.root", "multiplicityMC_3M_NBD.root", "eval-3M-NBD");
1379 EvaluateChi2Method("multiplicityMC_2M_smoothed.root", "multiplicityMC_1M_3.root", "eval-2MS-1M");
1380 EvaluateChi2Method("multiplicityMC_2M_smoothed.root", "multiplicityMC_3M_NBD.root", "eval-2MS-NBD");
1381}
1382
1383void EvaluateBayesianMethodAll()
1384{
1385 EvaluateBayesianMethod("multiplicityMC_3M.root", "multiplicityMC_3M.root", "eval-3M-3M");
1386 EvaluateBayesianMethod("multiplicityMC_2M.root", "multiplicityMC_1M_3.root", "eval-2M-1M");
1387 EvaluateBayesianMethod("multiplicityMC_3M.root", "multiplicityMC_3M_NBD.root", "eval-3M-NBD");
1388 EvaluateBayesianMethod("multiplicityMC_2M_smoothed.root", "multiplicityMC_1M_3.root", "eval-2MS-1M");
1389 EvaluateBayesianMethod("multiplicityMC_2M_smoothed.root", "multiplicityMC_3M_NBD.root", "eval-2MS-NBD");
1390}
1391
447c325d 1392void CompareMethods(const char* fileNameMC = "multiplicityMC.root", const char* fileNameESD = "multiplicityMC.root", const char* targetDir, Int_t histID = 3)
dd701109 1393{
1394 gSystem->mkdir(targetDir);
1395
1396 gSystem->Load("libPWG0base");
1397
1398 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1399
1400 TFile::Open(fileNameMC);
1401 mult->LoadHistograms("Multiplicity");
1402
1403 TFile::Open(fileNameESD);
1404 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
1405 multESD->LoadHistograms("Multiplicity");
1406
1407 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
1408
447c325d 1409 TCanvas* canvas = new TCanvas("CompareMethods", "CompareMethods", 1200, 1200);
1410 canvas->Divide(3, 3);
dd701109 1411
1412 Int_t count = 0;
1413
447c325d 1414 for (AliMultiplicityCorrection::EventType type = AliMultiplicityCorrection::kTrVtx; type <= AliMultiplicityCorrection::kTrVtx; ++type)
dd701109 1415 {
447c325d 1416 TH1* mc = multESD->GetMultiplicityMC(histID, type)->ProjectionY("mymc");
1417 mc->Sumw2();
dd701109 1418
447c325d 1419 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
dd701109 1420 mult->ApplyMinuitFit(histID, kFALSE, type);
1421 mult->DrawComparison(Form("%s/CompareMethods_%d_MinuitChi2", targetDir, type), histID, kFALSE, kTRUE, mc);
1422 TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone("chi2Result");
1423
1424 mult->ApplyBayesianMethod(histID, kFALSE, type, 0.1);
1425 mult->DrawComparison(Form("%s/CompareMethods_%d_Bayesian", targetDir, type), histID, kFALSE, kTRUE, mc);
1426 TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone("bayesResult");
1427
1428 mc->GetXaxis()->SetRangeUser(0, 150);
1429 chi2Result->GetXaxis()->SetRangeUser(0, 150);
1430
447c325d 1431/* // skip errors for now
dd701109 1432 for (Int_t i=1; i<=chi2Result->GetNbinsX(); ++i)
1433 {
1434 chi2Result->SetBinError(i, 0);
1435 bayesResult->SetBinError(i, 0);
447c325d 1436 }*/
dd701109 1437
1438 canvas->cd(++count);
1439 mc->SetFillColor(kYellow);
1440 mc->DrawCopy();
1441 chi2Result->SetLineColor(kRed);
1442 chi2Result->DrawCopy("SAME");
1443 bayesResult->SetLineColor(kBlue);
1444 bayesResult->DrawCopy("SAME");
1445 gPad->SetLogy();
1446
1447 canvas->cd(count + 3);
447c325d 1448 chi2ResultRatio = (TH1*) chi2Result->Clone("chi2ResultRatio");
1449 bayesResultRatio = (TH1*) bayesResult->Clone("bayesResultRatio");
1450 chi2ResultRatio->Divide(chi2Result, mc, 1, 1, "");
1451 bayesResultRatio->Divide(bayesResult, mc, 1, 1, "");
dd701109 1452
447c325d 1453 chi2ResultRatio->GetYaxis()->SetRangeUser(0.5, 1.5);
dd701109 1454
447c325d 1455 chi2ResultRatio->DrawCopy("HIST");
1456 bayesResultRatio->DrawCopy("SAME HIST");
dd701109 1457
447c325d 1458 canvas->cd(count + 6);
1459 chi2Result->Divide(chi2Result, bayesResult, 1, 1, "");
1460 chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
1461 chi2Result->DrawCopy("HIST");
dd701109 1462 }
1463
1464 canvas->SaveAs(Form("%s/%s.gif", targetDir, canvas->GetName()));
1465 canvas->SaveAs(Form("%s/%s.C", targetDir, canvas->GetName()));
1466}
1467
447c325d 1468void StatisticsPlot(const char* fileNameMC = "multiplicityMC_2M.root", Int_t histID = 3)
dd701109 1469{
1470 gSystem->Load("libPWG0base");
1471
1472 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1473
1474 TFile::Open(fileNameMC);
1475 mult->LoadHistograms("Multiplicity");
1476
447c325d 1477 const char* files[] = { "multiplicityMC_100k_1.root", "multiplicityMC_200k.root", "multiplicityMC_400k.root", "multiplicityMC_600k.root", "multiplicityMC_800k.root" };
dd701109 1478
0b4bfd98 1479 TGraph* fitResultsChi2[3];
1480 TGraph* fitResultsBayes[3];
1481
1482 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1483 {
1484 fitResultsChi2[region] = new TGraph;
1485 fitResultsChi2[region]->SetTitle(";Nevents;Chi2");
1486 fitResultsChi2[region]->SetName(Form("fitResultsChi2_%d", region));
1487 fitResultsChi2[region]->SetMarkerStyle(20+region);
1488
1489 fitResultsBayes[region] = new TGraph;
1490 fitResultsBayes[region]->SetTitle(";Nevents;Chi2");
1491 fitResultsBayes[region]->SetName(Form("fitResultsBayes_%d", region));
1492 fitResultsBayes[region]->SetMarkerStyle(20+region);
1493 fitResultsBayes[region]->SetMarkerColor(2);
1494 }
1495
447c325d 1496 TGraph* fitResultsChi2Limit = new TGraph; fitResultsChi2Limit->SetTitle(";Nevents;Multiplicity reach");
1497 TGraph* fitResultsBayesLimit = new TGraph; fitResultsBayesLimit->SetTitle(";Nevents;Multiplicity reach");
0b4bfd98 1498 TGraph* fitResultsChi2Res = new TGraph; fitResultsChi2Res->SetTitle(";Nevents;Chi2");
1499 TGraph* fitResultsBayesRes = new TGraph; fitResultsBayesRes->SetTitle(";Nevents;Chi2");
447c325d 1500
447c325d 1501 fitResultsChi2Limit->SetName("fitResultsChi2Limit");
1502 fitResultsBayesLimit->SetName("fitResultsBayesLimit");
0b4bfd98 1503 fitResultsChi2Res->SetName("fitResultsChi2Res");
1504 fitResultsBayesRes->SetName("fitResultsBayesRes");
dd701109 1505
1506 TCanvas* canvas = new TCanvas("StatisticsPlot", "StatisticsPlot", 1200, 600);
1507 canvas->Divide(5, 2);
1508
1509 Float_t min = 1e10;
1510 Float_t max = 0;
1511
447c325d 1512 TFile* file = TFile::Open("StatisticsPlot.root", "RECREATE");
1513 file->Close();
1514
dd701109 1515 for (Int_t i=0; i<5; ++i)
1516 {
1517 TFile::Open(files[i]);
1518 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
1519 multESD->LoadHistograms("Multiplicity");
1520
1521 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
1522 Int_t nEntries = multESD->GetMultiplicityESD(histID)->GetEntries();
447c325d 1523 TH1* mc = multESD->GetMultiplicityMC(histID, AliMultiplicityCorrection::kTrVtx)->ProjectionY(Form("mc_%d", i));
dd701109 1524
447c325d 1525 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 10000);
dd701109 1526 mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx);
1527 mult->DrawComparison(Form("StatisticsPlot_%d_MinuitChi2", i), histID, kFALSE, kTRUE, mc);
1528
dd701109 1529 Int_t chi2MCLimit = 0;
0b4bfd98 1530 Float_t chi2Residuals = 0;
1531 mult->GetComparisonResults(0, &chi2MCLimit, &chi2Residuals);
1532 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1533 {
1534 fitResultsChi2[region]->SetPoint(fitResultsChi2[region]->GetN(), nEntries, mult->GetQuality(region));
1535 min = TMath::Min(min, mult->GetQuality(region));
1536 max = TMath::Max(max, mult->GetQuality(region));
1537 }
dd701109 1538 fitResultsChi2Limit->SetPoint(fitResultsChi2Limit->GetN(), nEntries, chi2MCLimit);
0b4bfd98 1539 fitResultsChi2Res->SetPoint(fitResultsChi2Res->GetN(), nEntries, chi2Residuals);
dd701109 1540
447c325d 1541 TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("chi2Result_%d", i));
dd701109 1542
0b4bfd98 1543 mult->ApplyBayesianMethod(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 100, 0, kFALSE);
dd701109 1544 mult->DrawComparison(Form("StatisticsPlot_%d_Bayesian", i), histID, kFALSE, kTRUE, mc);
447c325d 1545 TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("bayesResult_%d", i));
0b4bfd98 1546 mult->GetComparisonResults(0, &chi2MCLimit, &chi2Residuals);
1547 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1548 {
1549 fitResultsBayes[region]->SetPoint(fitResultsBayes[region]->GetN(), nEntries, mult->GetQuality(region));
1550 min = TMath::Min(min, mult->GetQuality(region));
1551 max = TMath::Max(max, mult->GetQuality(region));
1552 }
dd701109 1553 fitResultsBayesLimit->SetPoint(fitResultsBayesLimit->GetN(), nEntries, chi2MCLimit);
0b4bfd98 1554 fitResultsBayesRes->SetPoint(fitResultsBayesRes->GetN(), nEntries, chi2Residuals);
dd701109 1555
dd701109 1556 mc->GetXaxis()->SetRangeUser(0, 150);
1557 chi2Result->GetXaxis()->SetRangeUser(0, 150);
1558
1559 // skip errors for now
1560 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
1561 {
1562 chi2Result->SetBinError(j, 0);
1563 bayesResult->SetBinError(j, 0);
1564 }
1565
1566 canvas->cd(i+1);
1567 mc->SetFillColor(kYellow);
1568 mc->DrawCopy();
1569 chi2Result->SetLineColor(kRed);
1570 chi2Result->DrawCopy("SAME");
1571 bayesResult->SetLineColor(kBlue);
1572 bayesResult->DrawCopy("SAME");
1573 gPad->SetLogy();
1574
1575 canvas->cd(i+6);
1576 chi2Result->Divide(chi2Result, mc, 1, 1, "B");
1577 bayesResult->Divide(bayesResult, mc, 1, 1, "B");
1578
1579 // skip errors for now
1580 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
1581 {
1582 chi2Result->SetBinError(j, 0);
1583 bayesResult->SetBinError(j, 0);
1584 }
1585
1586 chi2Result->SetTitle("Ratios;Npart;unfolded measured/MC");
1587 chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
1588
1589 chi2Result->DrawCopy("");
1590 bayesResult->DrawCopy("SAME");
447c325d 1591
1592 TFile* file = TFile::Open("StatisticsPlot.root", "UPDATE");
1593 mc->Write();
1594 chi2Result->Write();
1595 bayesResult->Write();
1596 file->Close();
dd701109 1597 }
1598
1599 canvas->SaveAs(Form("%s.gif", canvas->GetName()));
1600 canvas->SaveAs(Form("%s.C", canvas->GetName()));
1601
1602 TCanvas* canvas2 = new TCanvas("StatisticsPlot2", "StatisticsPlot2", 800, 400);
1603 canvas2->Divide(2, 1);
1604
1605 canvas2->cd(1);
dd701109 1606
0b4bfd98 1607 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1608 {
1609 fitResultsChi2[region]->GetYaxis()->SetRangeUser(0.5 * min, 1.5 * max);
1610 fitResultsChi2[region]->Draw(((region == 0) ? "AP" : "P SAME"));
1611
1612 fitResultsBayes[region]->Draw("P SAME");
1613 }
dd701109 1614
1615 gPad->SetLogy();
1616
1617 canvas2->cd(2);
1618 fitResultsChi2Limit->SetMarkerStyle(20);
1619 fitResultsChi2Limit->GetYaxis()->SetRangeUser(0.9 * TMath::Min(fitResultsChi2Limit->GetYaxis()->GetXmin(), fitResultsBayesLimit->GetYaxis()->GetXmin()), 1.1 * TMath::Max(fitResultsChi2Limit->GetYaxis()->GetXmax(), fitResultsBayesLimit->GetYaxis()->GetXmax()));
1620 fitResultsChi2Limit->Draw("AP");
1621
1622 fitResultsBayesLimit->SetMarkerStyle(3);
1623 fitResultsBayesLimit->SetMarkerColor(2);
1624 fitResultsBayesLimit->Draw("P SAME");
1625
1626 canvas2->SaveAs(Form("%s.gif", canvas2->GetName()));
1627 canvas2->SaveAs(Form("%s.C", canvas2->GetName()));
447c325d 1628
1629 TFile* file = TFile::Open("StatisticsPlot.root", "UPDATE");
0b4bfd98 1630
1631 for (Int_t region=0; region<AliMultiplicityCorrection::kQualityRegions; ++region)
1632 {
1633 fitResultsChi2[region]->Write();
1634 fitResultsBayes[region]->Write();
1635 }
447c325d 1636 fitResultsChi2Limit->Write();
1637 fitResultsBayesLimit->Write();
0b4bfd98 1638 fitResultsChi2Res->Write();
1639 fitResultsBayesRes->Write();
447c325d 1640 file->Close();
dd701109 1641}
1642
69b09e3b 1643void StartingConditions(const char* fileNameMC = "multiplicityMC.root", Int_t histID = 1)
dd701109 1644{
69b09e3b 1645 loadlibs();
dd701109 1646
1647 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1648
1649 TFile::Open(fileNameMC);
1650 mult->LoadHistograms("Multiplicity");
1651
69b09e3b 1652 const char* files[] = { "multiplicityESD.root", "multiplicityESD_100k_1.root", "multiplicityESD_100k_2.root", "multiplicityESD_100k_1.root", "multiplicityESD_100k_2.root" }
dd701109 1653
1654 // this one we try to unfold
1655 TFile::Open(files[0]);
1656 AliMultiplicityCorrection* multESD = new AliMultiplicityCorrection("MultiplicityESD", "MultiplicityESD");
1657 multESD->LoadHistograms("Multiplicity");
1658 mult->SetMultiplicityESD(histID, multESD->GetMultiplicityESD(histID));
69b09e3b 1659 TH1* mc = multESD->GetMultiplicityMC(histID, AliMultiplicityCorrection::kTrVtx)->ProjectionY("mc", 1, 1);
dd701109 1660
1661 TGraph* fitResultsChi2 = new TGraph;
1662 fitResultsChi2->SetTitle(";Input Dist ID;Chi2");
1663 TGraph* fitResultsBayes = new TGraph;
1664 fitResultsBayes->SetTitle(";Input Dist ID;Chi2");
1665 TGraph* fitResultsChi2Limit = new TGraph;
1666 fitResultsChi2Limit->SetTitle(";Input Dist ID;Multiplicity reach");
1667 TGraph* fitResultsBayesLimit = new TGraph;
1668 fitResultsBayesLimit->SetTitle(";Input Dist ID;Multiplicity reach");
1669
1670 TCanvas* canvas = new TCanvas("StartingConditions", "StartingConditions", 1200, 600);
1671 canvas->Divide(8, 2);
1672
1673 TCanvas* canvas3 = new TCanvas("StartingConditions3", "StartingConditions3", 1000, 400);
1674 canvas3->Divide(2, 1);
1675
1676 Float_t min = 1e10;
1677 Float_t max = 0;
1678
1679 TH1* firstChi = 0;
1680 TH1* firstBayesian = 0;
1681 TH1* startCond = multESD->GetMultiplicityESD(histID)->ProjectionY("startCond");
1682
1683 TLegend* legend = new TLegend(0.7, 0.7, 1, 1);
1684
447c325d 1685 TFile* file = TFile::Open("StartingConditions.root", "RECREATE");
1686 mc->Write();
1687 file->Close();
1688
dd701109 1689 for (Int_t i=0; i<8; ++i)
1690 {
1691 if (i == 0)
1692 {
1693 startCond = (TH1*) mc->Clone("startCond2");
1694 }
1695 else if (i < 6)
1696 {
1697 TFile::Open(files[i-1]);
1698 AliMultiplicityCorrection* multESD2 = new AliMultiplicityCorrection("MultiplicityESD2", "MultiplicityESD2");
1699 multESD2->LoadHistograms("Multiplicity");
1700 startCond = multESD2->GetMultiplicityESD(histID)->ProjectionY("startCond");
1701 }
1702 else if (i == 6)
1703 {
69b09e3b 1704 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);
1705
dd701109 1706 func->SetParNames("scaling", "averagen", "k");
1707 func->SetParLimits(0, 1e-3, 1e10);
1708 func->SetParLimits(1, 0.001, 1000);
1709 func->SetParLimits(2, 0.001, 1000);
1710
1711 func->SetParameters(1, 10, 2);
1712 for (Int_t j=2; j<=startCond->GetNbinsX(); j++)
1713 startCond->SetBinContent(j, func->Eval(j-1));
1714 }
1715 else if (i == 7)
1716 {
1717 for (Int_t j=1; j<=startCond->GetNbinsX(); j++)
1718 startCond->SetBinContent(j, 1);
1719 }
1720
69b09e3b 1721 mult->SetRegularizationParameters(AliMultiplicityCorrection::kPol0, 1e5);
dd701109 1722 mult->ApplyMinuitFit(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, kFALSE, startCond);
69b09e3b 1723 //mult->DrawComparison(Form("StartingConditions_%d_MinuitChi2", i), histID, kFALSE, kTRUE, mc);
dd701109 1724
1725 Float_t chi2MC = 0;
1726 Int_t chi2MCLimit = 0;
1727 mult->GetComparisonResults(&chi2MC, &chi2MCLimit, 0);
1728 fitResultsChi2->SetPoint(fitResultsChi2->GetN(), i, chi2MC);
1729 fitResultsChi2Limit->SetPoint(fitResultsChi2Limit->GetN(), i, chi2MCLimit);
1730 min = TMath::Min(min, chi2MC);
1731 max = TMath::Max(max, chi2MC);
1732
447c325d 1733 TH1* chi2Result = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("chi2Result_%d", i));
dd701109 1734 if (!firstChi)
1735 firstChi = (TH1*) chi2Result->Clone("firstChi");
1736
69b09e3b 1737 mult->ApplyBayesianMethod(histID, kFALSE, AliMultiplicityCorrection::kTrVtx, 1, 10, startCond);
1738 //mult->DrawComparison(Form("StartingConditions_%d_Bayesian", i), histID, kFALSE, kTRUE, mc);
447c325d 1739 TH1* bayesResult = (TH1*) mult->GetMultiplicityESDCorrected(histID)->Clone(Form("bayesResult_%d", i));
dd701109 1740 if (!firstBayesian)
1741 firstBayesian = (TH1*) bayesResult->Clone("firstBayesian");
1742
1743 mult->GetComparisonResults(&chi2MC, &chi2MCLimit, 0);
1744 fitResultsBayes->SetPoint(fitResultsBayes->GetN(), i, chi2MC);
1745 fitResultsBayesLimit->SetPoint(fitResultsBayesLimit->GetN(), i, chi2MCLimit);
1746
447c325d 1747 TFile* file = TFile::Open("StartingConditions.root", "UPDATE");
1748 chi2Result->Write();
1749 bayesResult->Write();
1750 file->Close();
1751
dd701109 1752 min = TMath::Min(min, chi2MC);
1753 max = TMath::Max(max, chi2MC);
1754 mc->GetXaxis()->SetRangeUser(0, 150);
1755 chi2Result->GetXaxis()->SetRangeUser(0, 150);
1756
1757 // skip errors for now
1758 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
1759 {
1760 chi2Result->SetBinError(j, 0);
1761 bayesResult->SetBinError(j, 0);
1762 }
1763
1764 canvas3->cd(1);
1765 TH1* tmp = (TH1*) chi2Result->Clone("tmp");
1766 tmp->SetTitle("Difference to best initial conditions;Npart;Ratio");
1767 tmp->Divide(firstChi);
1768 tmp->GetYaxis()->SetRangeUser(0.5, 1.5);
1769 tmp->GetXaxis()->SetRangeUser(0, 200);
1770 tmp->SetLineColor(i+1);
1771 legend->AddEntry(tmp, Form("%d", i));
1772 tmp->DrawCopy((i > 0) ? "SAME HIST" : "HIST");
1773
1774 canvas3->cd(2);
1775 tmp = (TH1*) bayesResult->Clone("tmp");
1776 tmp->SetTitle("Difference to best initial conditions;Npart;Ratio");
1777 tmp->Divide(firstBayesian);
1778 tmp->SetLineColor(i+1);
1779 tmp->GetYaxis()->SetRangeUser(0.5, 1.5);
1780 tmp->GetXaxis()->SetRangeUser(0, 200);
1781 tmp->DrawCopy((i > 0) ? "SAME HIST" : "HIST");
1782
1783 canvas->cd(i+1);
1784 mc->SetFillColor(kYellow);
1785 mc->DrawCopy();
1786 chi2Result->SetLineColor(kRed);
1787 chi2Result->DrawCopy("SAME");
1788 bayesResult->SetLineColor(kBlue);
1789 bayesResult->DrawCopy("SAME");
1790 gPad->SetLogy();
1791
1792 canvas->cd(i+9);
1793 chi2Result->Divide(chi2Result, mc, 1, 1, "B");
1794 bayesResult->Divide(bayesResult, mc, 1, 1, "B");
1795
1796 // skip errors for now
1797 for (Int_t j=0; j<=chi2Result->GetNbinsX(); ++j)
1798 {
1799 chi2Result->SetBinError(j, 0);
1800 bayesResult->SetBinError(j, 0);
1801 }
1802
1803 chi2Result->SetTitle("Ratios;Npart;unfolded measured/MC");
1804 chi2Result->GetYaxis()->SetRangeUser(0.5, 1.5);
1805
1806 chi2Result->DrawCopy("");
1807 bayesResult->DrawCopy("SAME");
1808 }
1809
1810 canvas3->cd(1);
1811 legend->Draw();
1812
cfc19dd5 1813 canvas->SaveAs(Form("%s.gif", canvas->GetName()));
dd701109 1814
1815 TCanvas* canvas2 = new TCanvas("StartingConditions2", "StartingConditions2", 800, 400);
1816 canvas2->Divide(2, 1);
1817
1818 canvas2->cd(1);
1819 fitResultsChi2->SetMarkerStyle(20);
1820 fitResultsChi2->GetYaxis()->SetRangeUser(0.5 * min, 1.5 * max);
1821 fitResultsChi2->Draw("AP");
1822
1823 fitResultsBayes->SetMarkerStyle(3);
1824 fitResultsBayes->SetMarkerColor(2);
1825 fitResultsBayes->Draw("P SAME");
1826
1827 gPad->SetLogy();
1828
1829 canvas2->cd(2);
1830 fitResultsChi2Limit->SetMarkerStyle(20);
1831 fitResultsChi2Limit->GetYaxis()->SetRangeUser(0.9 * TMath::Min(fitResultsChi2Limit->GetYaxis()->GetXmin(), fitResultsBayesLimit->GetYaxis()->GetXmin()), 1.1 * TMath::Max(fitResultsChi2Limit->GetYaxis()->GetXmax(), fitResultsBayesLimit->GetYaxis()->GetXmax()));
1832 fitResultsChi2Limit->Draw("AP");
1833
1834 fitResultsBayesLimit->SetMarkerStyle(3);
1835 fitResultsBayesLimit->SetMarkerColor(2);
1836 fitResultsBayesLimit->Draw("P SAME");
1837
1838 canvas2->SaveAs(Form("%s.gif", canvas2->GetName()));
1839 canvas3->SaveAs(Form("%s.gif", canvas3->GetName()));
cfc19dd5 1840}
1841
1842void Merge(Int_t n, const char** files, const char* output)
1843{
447c325d 1844 // 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" };
1845
1846
cfc19dd5 1847 gSystem->Load("libPWG0base");
1848
1849 AliMultiplicityCorrection** data = new AliMultiplicityCorrection*[n];
1850 TList list;
1851 for (Int_t i=0; i<n; ++i)
1852 {
1853 TString name("Multiplicity");
1854 if (i > 0)
1855 name.Form("Multiplicity%d", i);
1856
1857 TFile::Open(files[i]);
1858 data[i] = new AliMultiplicityCorrection(name, name);
1859 data[i]->LoadHistograms("Multiplicity");
1860 if (i > 0)
1861 list.Add(data[i]);
1862 }
1863
1864 data[0]->Merge(&list);
1865
447c325d 1866 //data[0]->DrawHistograms();
cfc19dd5 1867
1868 TFile::Open(output, "RECREATE");
1869 data[0]->SaveHistograms();
1870 gFile->Close();
1871}
1872
1873void testMethod(Int_t caseNo, const char* fileName = "multiplicityMC.root")
1874{
69b09e3b 1875 loadlibs();
cfc19dd5 1876
1877 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1878
1879 TFile::Open(fileName);
1880 mult->LoadHistograms("Multiplicity");
1881
1882 TF1* func = 0;
1883
1884 if (caseNo >= 4)
1885 {
69b09e3b 1886 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);
1887 //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);
cfc19dd5 1888 func->SetParNames("scaling", "averagen", "k");
1889 }
1890
1891 switch (caseNo)
1892 {
0b4bfd98 1893 case 0: func = new TF1("flat", "1000"); break;
cfc19dd5 1894 case 1: func = new TF1("flat", "501-x"); break;
1895 case 2: func = new TF1("flat", "1000 * 1/(x+1)"); break;
1896 case 3: func = new TF1("flat", "1000 * TMath::Landau(x, 10, 5)"); break;
69b09e3b 1897 case 4: func->SetParameters(2e5, 15, 2); break;
447c325d 1898 case 5: func->SetParameters(1, 13, 7); break;
dd701109 1899 case 6: func->SetParameters(1e7, 30, 4); break;
0b4bfd98 1900 case 7: func->SetParameters(1e7, 30, 2); break; // ***
dd701109 1901 case 8: func = new TF1("testlaszlo", "10*1000*x*exp(-0.1*x)"); break;
cfc19dd5 1902
1903 default: return;
1904 }
1905
447c325d 1906 new TCanvas;
1907 func->Draw();
1908
69b09e3b 1909 mult->SetGenMeasFromFunc(func, 1);
cfc19dd5 1910
dd701109 1911 TFile::Open("out.root", "RECREATE");
1912 mult->SaveHistograms();
1913
69b09e3b 1914 new TCanvas; mult->GetMultiplicityESD(1)->ProjectionY()->DrawCopy();
1915 new TCanvas; mult->GetMultiplicityVtx(1)->ProjectionY("mc", 1, mult->GetMultiplicityVtx(1)->GetNbinsX())->DrawCopy();
0b4bfd98 1916
dd701109 1917 //mult->ApplyBayesianMethod(2, kFALSE);
1918 //mult->ApplyMinuitFit(2, kFALSE);
cfc19dd5 1919 //mult->ApplyGaussianMethod(2, kFALSE);
447c325d 1920 //mult->ApplyLaszloMethod(2, kFALSE, AliMultiplicityCorrection::kTrVtx);
dd701109 1921}
1922
70fdd197 1923void smoothCorrelationMap(const char* fileName = "multiplicity.root", Int_t corrMatrix = 1)
dd701109 1924{
1925 gSystem->Load("libPWG0base");
1926
1927 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
1928
1929 TFile::Open(fileName);
1930 mult->LoadHistograms("Multiplicity");
1931
1932 // empty under/overflow bins in x, otherwise Project3D takes them into account
1933 TH3* corr = mult->GetCorrelation(corrMatrix);
1934 for (Int_t j=1; j<=corr->GetYaxis()->GetNbins(); ++j)
1935 {
1936 for (Int_t k=1; k<=corr->GetZaxis()->GetNbins(); ++k)
1937 {
1938 corr->SetBinContent(0, j, k, 0);
1939 corr->SetBinContent(corr->GetXaxis()->GetNbins()+1, j, k, 0);
1940 }
1941 }
1942
1943 TH2* proj = (TH2*) corr->Project3D("zy");
1944
1945 // normalize correction for given nPart
1946 for (Int_t i=1; i<=proj->GetNbinsX(); ++i)
1947 {
1948 Double_t sum = proj->Integral(i, i, 1, proj->GetNbinsY());
1949 if (sum <= 0)
1950 continue;
1951
1952 for (Int_t j=1; j<=proj->GetNbinsY(); ++j)
1953 {
1954 // npart sum to 1
1955 proj->SetBinContent(i, j, proj->GetBinContent(i, j) / sum);
1956 proj->SetBinError(i, j, proj->GetBinError(i, j) / sum);
1957 }
1958 }
1959
1960 new TCanvas;
447c325d 1961 proj->DrawCopy("COLZ");
dd701109 1962
1963 TH1* scaling = proj->ProjectionY("scaling", 1, 1);
1964 scaling->Reset();
1965 scaling->SetMarkerStyle(3);
1966 //scaling->GetXaxis()->SetRangeUser(0, 50);
1967 TH1* mean = (TH1F*) scaling->Clone("mean");
1968 TH1* width = (TH1F*) scaling->Clone("width");
1969
1970 TF1* lognormal = new TF1("lognormal", "[0]*exp(-(log(x)-[1])^2/(2*[2]^2))/(x*[2]*TMath::Sqrt(2*TMath::Pi()))", 0.01, 500);
1971 lognormal->SetParNames("scaling", "mean", "sigma");
1972 lognormal->SetParameters(1, 1, 1);
1973 lognormal->SetParLimits(0, 1, 1);
1974 lognormal->SetParLimits(1, 0, 100);
1975 lognormal->SetParLimits(2, 1e-3, 1);
1976
1977 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);
1978 nbd->SetParNames("scaling", "averagen", "k");
1979 nbd->SetParameters(1, 13, 5);
1980 nbd->SetParLimits(0, 1, 1);
1981 nbd->SetParLimits(1, 1, 100);
1982 nbd->SetParLimits(2, 1, 1e8);
1983
1984 TF1* poisson = new TF1("poisson", "[0] * exp(-(x+[2])) * (x+[2])**[1] / TMath::Factorial([1])", 0.01, 50);
1985 poisson->SetParNames("scaling", "k", "deltax");
1986 poisson->SetParameters(1, 1, 0);
1987 poisson->SetParLimits(0, 0, 10);
1988 poisson->SetParLimits(1, 0.01, 100);
1989 poisson->SetParLimits(2, 0, 10);
1990
1991 TF1* mygaus = new TF1("mygaus", "[0] * exp(-(x-[1])**2 / 2 / [2] - [3] * log(x + [4]) / [5])", 0.01, 50);
1992 mygaus->SetParNames("scaling", "mean", "width", "scale2log", "logmean", "logwidth");
1993 mygaus->SetParameters(1, 0, 1, 1, 0, 1);
1994 mygaus->SetParLimits(2, 1e-5, 10);
1995 mygaus->SetParLimits(4, 1, 1);
1996 mygaus->SetParLimits(5, 1e-5, 10);
1997
1998 //TF1* sqrt = new TF1("sqrt", "[0] + [1] * sqrt((x + [3]) * [2])", 0, 50);
1999 TF1* sqrt = new TF1("sqrt", "[0] + (x + [1])**[2]", 0, 50);
2000 sqrt->SetParNames("ydelta", "exp", "xdelta");
2001 sqrt->SetParameters(0, 0, 1);
2002 sqrt->SetParLimits(1, 0, 10);
2003
2004 const char* fitWith = "gaus";
2005
70fdd197 2006 for (Int_t i=1; i<=80; ++i)
dd701109 2007 {
2008 printf("Fitting %d...\n", i);
2009
2010 TH1* hist = proj->ProjectionY(Form("proj%d", i), i, i, "e");
447c325d 2011
dd701109 2012 //hist->GetXaxis()->SetRangeUser(0, 50);
2013 //lognormal->SetParameter(0, hist->GetMaximum());
2014 hist->Fit(fitWith, "0 M", "");
2015
2016 TF1* func = hist->GetListOfFunctions()->FindObject(fitWith);
2017
447c325d 2018 if (0 && (i % 5 == 0))
dd701109 2019 {
447c325d 2020 pad = new TCanvas;
dd701109 2021 hist->Draw();
2022 func->Clone()->Draw("SAME");
447c325d 2023 pad->SetLogy();
dd701109 2024 }
2025
70fdd197 2026 scaling->SetBinContent(i, func->GetParameter(0));
2027 mean->SetBinContent(i, func->GetParameter(1));
2028 width->SetBinContent(i, func->GetParameter(2));
2029
2030 scaling->SetBinError(i, func->GetParError(0));
2031 mean->SetBinError(i, func->GetParError(1));
2032 width->SetBinError(i, func->GetParError(2));
dd701109 2033 }
2034
2035 TF1* log = new TF1("log", "[0] + [1] * log([2] * x)", 0.01, 500);
2036 log->SetParameters(0, 1, 1);
2037 log->SetParLimits(1, 0, 100);
2038 log->SetParLimits(2, 1e-3, 10);
2039
2040 TF1* over = new TF1("over", "[0] + [1] / (x+[2])", 0.01, 500);
2041 over->SetParameters(0, 1, 0);
2042 //over->SetParLimits(0, 0, 100);
2043 over->SetParLimits(1, 1e-3, 10);
2044 over->SetParLimits(2, 0, 100);
2045
2046 c1 = new TCanvas("fitparams", "fitparams", 1200, 400);
2047 c1->Divide(3, 1);
2048
2049 c1->cd(1);
2050 scaling->Draw("P");
2051
2052 //TF1* scalingFit = new TF1("mypol0", "[0]");
2053 TF1* scalingFit = over;
447c325d 2054 scaling->Fit(scalingFit, "", "", 3, 140);
2055 scalingFit->SetRange(0, 200);
2056 scalingFit->Draw("SAME");
70fdd197 2057
dd701109 2058 c1->cd(2);
2059 mean->Draw("P");
2060
2061 //TF1* meanFit = log;
2062 TF1* meanFit = new TF1("mypol1", "[0]+[1]*x");
447c325d 2063 mean->Fit(meanFit, "", "", 3, 140);
2064 meanFit->SetRange(0, 200);
2065 meanFit->Draw("SAME");
dd701109 2066
2067 c1->cd(3);
2068 width->Draw("P");
2069
2070 //TF1* widthFit = over;
447c325d 2071 TF1* widthFit = new TF1("mypol", "[0]+[1]*TMath::Sqrt([2]*x)");
2072 widthFit->SetParLimits(2, 1e-5, 1e5);
2073 width->Fit(widthFit, "", "", 5, 140);
2074 widthFit->SetRange(0, 200);
2075 widthFit->Draw("SAME");
70fdd197 2076
dd701109 2077 // build new correction matrix
2078 TH2* new = (TH2*) proj->Clone("new");
2079 new->Reset();
2080 Float_t x, y;
2081 for (Int_t i=1; i<=new->GetXaxis()->GetNbins(); i+=1)
2082 {
2083 TF1* func = (TF1*) gROOT->FindObject(fitWith);
2084 x = new->GetXaxis()->GetBinCenter(i);
2085 //if (i == 1)
2086 // x = 0.1;
2087 x++;
2088 func->SetParameters(scalingFit->Eval(x), meanFit->Eval(x), widthFit->Eval(x));
2089 printf("%f %f %f %f\n", x, scalingFit->Eval(x), meanFit->Eval(x), widthFit->Eval(x));
2090
2091 for (Int_t j=1; j<=new->GetYaxis()->GetNbins(); j+=1)
2092 {
447c325d 2093 if (i < 11)
dd701109 2094 {
2095 // leave bins 1..20 untouched
2096 new->SetBinContent(i, j, corr->Integral(1, corr->GetNbinsX(), i, i, j, j));
2097 }
2098 else
2099 {
2100 y = new->GetYaxis()->GetBinCenter(j);
2101 if (j == 1)
2102 y = 0.1;
2103 if (func->Eval(y) > 1e-4)
2104 new->SetBinContent(i, j, func->Eval(y));
2105 }
2106 }
2107 }
2108
2109 // fill 0 multiplicity bins, this cannot be done with the function because it does not accept 0
2110 // we take the values from the old response matrix
2111 //for (Int_t i=1; i<=new->GetXaxis()->GetNbins(); i+=1)
2112 // new->SetBinContent(i, 1, proj->GetBinContent(i, 1));
2113
2114 //for (Int_t j=1; j<=new->GetYaxis()->GetNbins(); j+=1)
2115 // new->SetBinContent(1, j, proj->GetBinContent(1, j));
2116
2117 // normalize correction for given nPart
2118 for (Int_t i=1; i<=new->GetNbinsX(); ++i)
2119 {
2120 Double_t sum = new->Integral(i, i, 1, proj->GetNbinsY());
2121 if (sum <= 0)
2122 continue;
2123
2124 for (Int_t j=1; j<=new->GetNbinsY(); ++j)
2125 {
2126 // npart sum to 1
2127 new->SetBinContent(i, j, new->GetBinContent(i, j) / sum);
2128 new->SetBinError(i, j, new->GetBinError(i, j) / sum);
2129 }
2130 }
2131
2132 new TCanvas;
2133 new->Draw("COLZ");
2134
2135 TH2* diff = (TH2*) new->Clone("diff");
2136 diff->Add(proj, -1);
2137
2138 new TCanvas;
2139 diff->Draw("COLZ");
2140 diff->SetMinimum(-0.05);
2141 diff->SetMaximum(0.05);
2142
2143 corr->Reset();
2144
2145 for (Int_t i=1; i<=new->GetNbinsX(); ++i)
2146 for (Int_t j=1; j<=new->GetNbinsY(); ++j)
70fdd197 2147 corr->SetBinContent(corr->GetXaxis()->GetNbins() / 2 + 1, i, j, new->GetBinContent(i, j));
dd701109 2148
2149 new TCanvas;
2150 corr->Project3D("zy")->Draw("COLZ");
2151
2152 TFile::Open("out.root", "RECREATE");
2153 mult->SaveHistograms();
2154
2155 TH1* proj1 = proj->ProjectionY("proj1", 36, 36);
2156 TH1* proj2 = new->ProjectionY("proj2", 36, 36);
2157 proj2->SetLineColor(2);
2158
2159 new TCanvas;
2160 proj1->Draw();
2161 proj2->Draw("SAME");
cfc19dd5 2162}
447c325d 2163
0b4bfd98 2164void buildCorrelationMap(const char* fileName = "multiplicityMC_2M.root", Int_t corrMatrix = 3)
2165{
2166 gSystem->Load("libPWG0base");
2167
2168 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2169
2170 TFile::Open(fileName);
2171 mult->LoadHistograms("Multiplicity");
2172
2173 TH3F* new = mult->GetCorrelation(corrMatrix);
2174 new->Reset();
2175
2176 TF1* func = new TF1("func", "gaus(0)");
2177
2178 Int_t vtxBin = new->GetNbinsX() / 2;
2179 if (vtxBin == 0)
2180 vtxBin = 1;
2181
2182 Float_t sigma = 2;
2183 for (Int_t i=1; i<=new->GetYaxis()->GetNbins(); i+=1)
2184 {
2185 Float_t x = new->GetYaxis()->GetBinCenter(i);
2186 func->SetParameters(1, x * 0.8, sigma);
2187 //func->SetParameters(1, x, sigma);
2188
2189 for (Int_t j=1; j<=new->GetZaxis()->GetNbins(); j+=1)
2190 {
2191 Float_t y = new->GetYaxis()->GetBinCenter(j);
2192
2193 // cut at 1 sigma
2194 if (TMath::Abs(y-x*0.8) < sigma)
2195 new->SetBinContent(vtxBin, i, j, func->Eval(y));
2196
2197 // test only bin 40 has smearing
2198 //if (x != 40)
2199 // new->SetBinContent(vtxBin, i, j, (i == j));
2200 }
2201 }
2202
2203 new TCanvas;
2204 new->Project3D("zy")->DrawCopy("COLZ");
2205
2206 TFile* file = TFile::Open("out.root", "RECREATE");
2207 mult->SetCorrelation(corrMatrix, new);
2208 mult->SaveHistograms();
2209 file->Close();
2210}
2211
447c325d 2212void GetCrossSections(const char* fileName)
2213{
2214 gSystem->Load("libPWG0base");
2215
2216 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2217
2218 TFile::Open(fileName);
2219 mult->LoadHistograms("Multiplicity");
2220
2221 TH1* xSection2 = mult->GetCorrelation(3)->Project3D("y")->Clone("xSection2");
2222 xSection2->Sumw2();
2223 xSection2->Scale(1.0 / xSection2->Integral());
2224
2225 TH1* xSection15 = mult->GetCorrelation(2)->Project3D("y")->Clone("xSection15");
2226 xSection15->Sumw2();
2227 xSection15->Scale(1.0 / xSection15->Integral());
2228
2229 TFile::Open("crosssection.root", "RECREATE");
2230 xSection2->Write();
2231 xSection15->Write();
2232 gFile->Close();
2233}
0b4bfd98 2234
44466df2 2235void AnalyzeSpeciesTree(const char* fileName)
2236{
2237 //
2238 // prints statistics about fParticleSpecies
2239 //
2240
2241 gSystem->Load("libPWG0base");
2242
2243 TFile::Open(fileName);
2244 TNtuple* fParticleSpecies = (TNtuple*) gFile->Get("fParticleSpecies");
2245
2246 const Int_t nFields = 8;
2247 Long_t totals[8];
2248 for (Int_t i=0; i<nFields; i++)
2249 totals[i] = 0;
2250
2251 for (Int_t i=0; i<fParticleSpecies->GetEntries(); i++)
2252 {
2253 fParticleSpecies->GetEvent(i);
2254
2255 Float_t* f = fParticleSpecies->GetArgs();
2256
2257 for (Int_t j=0; j<nFields; j++)
2258 totals[j] += f[j+1];
2259 }
2260
2261 for (Int_t i=0; i<nFields; i++)
2262 Printf("%d --> %ld", i, totals[i]);
2263}
2264
0b4bfd98 2265void BuildResponseFromTree(const char* fileName, const char* target)
2266{
2267 //
2268 // builds several response matrices with different particle ratios (systematic study)
69b09e3b 2269 //
2270 // WARNING doesn't work uncompiled, see test.C
0b4bfd98 2271
69b09e3b 2272 loadlibs();
0b4bfd98 2273
2274 TFile::Open(fileName);
2275 TNtuple* fParticleSpecies = (TNtuple*) gFile->Get("fParticleSpecies");
2276
2277 TFile* file = TFile::Open(target, "RECREATE");
2278 file->Close();
2279
2280 Int_t tracks = 0; // control variables
2281 Int_t noLabel = 0;
6d81c2de 2282 Int_t secondaries = 0;
0b4bfd98 2283 Int_t doubleCount = 0;
2284
69b09e3b 2285 for (Int_t num = 0; num < 9; num++)
0b4bfd98 2286 {
69b09e3b 2287 TString name;
2288 name.Form("Multiplicity_%d", num);
2289 AliMultiplicityCorrection* fMultiplicity = new AliMultiplicityCorrection(name, name);
0b4bfd98 2290
2291 Float_t ratio[4]; // pi, K, p, other
2292 for (Int_t i = 0; i < 4; i++)
2293 ratio[i] = 1;
2294
2295 switch (num)
2296 {
2297 case 1 : ratio[1] = 0.5; break;
69b09e3b 2298 case 2 : ratio[1] = 1.5; break;
2299 case 3 : ratio[2] = 0.5; break;
0b4bfd98 2300 case 4 : ratio[2] = 1.5; break;
2301 case 5 : ratio[1] = 0.5; ratio[2] = 0.5; break;
2302 case 6 : ratio[1] = 1.5; ratio[2] = 1.5; break;
69b09e3b 2303 case 7 : ratio[1] = 0.5; ratio[2] = 1.5; break;
2304 case 8 : ratio[1] = 1.5; ratio[2] = 0.5; break;
0b4bfd98 2305 }
2306
2307 for (Int_t i=0; i<fParticleSpecies->GetEntries(); i++)
2308 {
2309 fParticleSpecies->GetEvent(i);
2310
2311 Float_t* f = fParticleSpecies->GetArgs();
2312
2313 Float_t gene = 0;
2314 Float_t meas = 0;
2315
2316 for (Int_t j = 0; j < 4; j++)
2317 {
2318 gene += ratio[j] * f[j+1];
2319 meas += ratio[j] * f[j+1+4];
2320 tracks += f[j+1+4];
2321 }
2322
2323 // add the ones w/o label
2324 tracks += f[9];
2325 noLabel += f[9];
2326
6d81c2de 2327 // secondaries are already part of meas!
2328 secondaries += f[10];
2329
2330 // double counted are already part of meas!
2331 doubleCount += f[11];
0b4bfd98 2332
6d81c2de 2333 // 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!
0b4bfd98 2334 meas += f[9];
0b4bfd98 2335
2336 //Printf("%.f %.f %.f %.f %.f", f[5], f[6], f[7], f[8], f[9]);
2337
6d81c2de 2338 fMultiplicity->FillCorrection(f[0], gene, gene, gene, gene, 0, meas, meas, meas, meas);
69b09e3b 2339 // HACK all as kND = 1
2340 fMultiplicity->FillGenerated(f[0], kTRUE, kTRUE, 1, gene, gene, gene, gene, 0);
6d81c2de 2341 fMultiplicity->FillMeasured(f[0], meas, meas, meas, meas);
0b4bfd98 2342 }
2343
2344 //fMultiplicity->DrawHistograms();
2345
2346 TFile* file = TFile::Open(target, "UPDATE");
2347 fMultiplicity->SaveHistograms();
2348 file->Close();
2349
2350 if (num == 0)
6d81c2de 2351 {
2352 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);
2353 if ((Float_t) noLabel / tracks > 0.02)
2354 Printf("WARNING: More than 2%% of tracks without label, this might bias the study!");
2355 }
0b4bfd98 2356 }
2357}
2358
69b09e3b 2359void ParticleRatioStudy()
0b4bfd98 2360{
69b09e3b 2361 loadlibs();
0b4bfd98 2362
69b09e3b 2363 for (Int_t num = 0; num < 9; num++)
2364 {
2365 TString target;
2366 target.Form("chi2_species_%d.root", num);
2367 correct("species.root", Form("Multiplicity_%d", num), "species.root", 1, 1, 0, 1e5, 0, target, "Multiplicity_0");
2368 }
2369}
2370
2371void MergeModifyCrossSection(const char* output = "multiplicityMC_xsection.root")
2372{
2373 const char* files[] = { "multiplicityMC_nd.root", "multiplicityMC_sd.root", "multiplicityMC_dd.root" };
2374
2375 loadlibs();
0b4bfd98 2376
2377 TFile::Open(output, "RECREATE");
2378 gFile->Close();
2379
69b09e3b 2380 for (Int_t num = 0; num < 7; num++)
0b4bfd98 2381 {
2382 AliMultiplicityCorrection* data[3];
2383 TList list;
2384
2385 Float_t ratio[3];
2386 switch (num)
2387 {
2388 case 0: ratio[0] = 1.0; ratio[1] = 1.0; ratio[2] = 1.0; break;
2389 case 1: ratio[0] = 1.0; ratio[1] = 1.5; ratio[2] = 1.0; break;
2390 case 2: ratio[0] = 1.0; ratio[1] = 0.5; ratio[2] = 1.0; break;
2391 case 3: ratio[0] = 1.0; ratio[1] = 1.0; ratio[2] = 1.5; break;
2392 case 4: ratio[0] = 1.0; ratio[1] = 1.0; ratio[2] = 0.5; break;
2393 case 5: ratio[0] = 1.0; ratio[1] = 1.5; ratio[2] = 1.5; break;
2394 case 6: ratio[0] = 1.0; ratio[1] = 0.5; ratio[2] = 0.5; break;
2395 default: return;
2396 }
2397
2398 for (Int_t i=0; i<3; ++i)
2399 {
2400 TString name;
2401 name.Form("Multiplicity_%d", num);
2402 if (i > 0)
2403 name.Form("Multiplicity_%d_%d", num, i);
2404
2405 TFile::Open(files[i]);
2406 data[i] = new AliMultiplicityCorrection(name, name);
2407 data[i]->LoadHistograms("Multiplicity");
2408
2409 // modify x-section
2410 for (Int_t j=0; j<AliMultiplicityCorrection::kMCHists; j++)
2411 {
2412 data[i]->GetMultiplicityVtx(j)->Scale(ratio[i]);
2413 data[i]->GetMultiplicityMB(j)->Scale(ratio[i]);
2414 data[i]->GetMultiplicityINEL(j)->Scale(ratio[i]);
69b09e3b 2415 data[i]->GetMultiplicityNSD(j)->Scale(ratio[i]);
0b4bfd98 2416 }
2417
2418 for (Int_t j=0; j<AliMultiplicityCorrection::kESDHists; j++)
2419 data[i]->GetMultiplicityESD(j)->Scale(ratio[i]);
2420
2421 for (Int_t j=0; j<AliMultiplicityCorrection::kCorrHists; j++)
2422 data[i]->GetCorrelation(j)->Scale(ratio[i]);
2423
2424 if (i > 0)
2425 list.Add(data[i]);
2426 }
2427
2428 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());
2429
2430 data[0]->Merge(&list);
2431
2432 Printf(" Total: %.2f", data[0]->GetCorrelation(3)->Integral());
2433
2434 TFile::Open(output, "UPDATE");
2435 data[0]->SaveHistograms();
2436 gFile->Close();
2437
2438 list.Clear();
2439
2440 for (Int_t i=0; i<3; ++i)
2441 delete data[i];
2442 }
2443}
44466df2 2444
2445void Rebin(const char* fileName = "multiplicityMC_3M.root", Int_t corrMatrix = 3)
2446{
2447 // rebins MC axis of correlation map, MC and histogram for corrected (for evaluation of effect of regularization)
2448 // rebin does not exist for 3D hists, so we convert to 2D and then back to 3D (loosing the vertex information)
2449
2450 Printf("WARNING: Vertex information is lost in this process. Use result only for evaluation of errors.");
2451
2452 gSystem->Load("libPWG0base");
2453
2454 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2455
2456 TFile::Open(fileName);
2457 mult->LoadHistograms("Multiplicity");
2458
2459 // rebin correlation
2460 TH3* old = mult->GetCorrelation(corrMatrix);
2461
2462 // empty under/overflow bins in x, otherwise Project3D takes them into account
2463 for (Int_t y=1; y<=old->GetYaxis()->GetNbins(); ++y)
2464 {
2465 for (Int_t z=1; z<=old->GetZaxis()->GetNbins(); ++z)
2466 {
2467 old->SetBinContent(0, y, z, 0);
2468 old->SetBinContent(old->GetXaxis()->GetNbins()+1, y, z, 0);
2469 }
2470 }
2471
2472 TH2* response = (TH2*) old->Project3D("zy");
2473 response->RebinX(2);
2474
2475 TH3F* new = new TH3F(old->GetName(), old->GetTitle(),
2476 old->GetXaxis()->GetNbins(), old->GetXaxis()->GetBinLowEdge(1), old->GetXaxis()->GetBinUpEdge(old->GetXaxis()->GetNbins()),
2477 old->GetYaxis()->GetNbins() / 2, old->GetYaxis()->GetBinLowEdge(1), old->GetYaxis()->GetBinUpEdge(old->GetYaxis()->GetNbins()),
2478 old->GetZaxis()->GetNbins(), old->GetZaxis()->GetBinLowEdge(1), old->GetZaxis()->GetBinUpEdge(old->GetZaxis()->GetNbins()));
2479 new->Reset();
2480
2481 Int_t vtxBin = new->GetNbinsX() / 2;
2482 if (vtxBin == 0)
2483 vtxBin = 1;
2484
2485 for (Int_t i=1; i<=new->GetYaxis()->GetNbins(); i+=1)
2486 for (Int_t j=1; j<=new->GetZaxis()->GetNbins(); j+=1)
2487 new->SetBinContent(vtxBin, i, j, response->GetBinContent(i, j));
2488
2489 // rebin MC + hist for corrected
2490 for (AliMultiplicityCorrection::EventType eventType = AliMultiplicityCorrection::kTrVtx; eventType <= AliMultiplicityCorrection::kINEL; eventType++)
2491 mult->GetMultiplicityMC(corrMatrix, eventType)->RebinY(2);
2492
2493 mult->GetMultiplicityESDCorrected(corrMatrix)->Rebin(2);
2494
2495 // recreate measured from correlation matrix to get rid of vertex shift effect
2496 TH2* newMeasured = (TH2*) old->Project3D("zx");
2497 TH2* esd = mult->GetMultiplicityESD(corrMatrix);
2498 esd->Reset();
2499
2500 // transfer from TH2D to TH2F
2501 for (Int_t i=0; i<=new->GetXaxis()->GetNbins()+1; i+=1)
2502 for (Int_t j=0; j<=new->GetYaxis()->GetNbins()+1; j+=1)
2503 esd->SetBinContent(i, j, newMeasured->GetBinContent(i, j));
2504
2505 new TCanvas;
2506 new->Project3D("zy")->DrawCopy("COLZ");
2507
2508 TFile* file = TFile::Open("out.root", "RECREATE");
2509 mult->SetCorrelation(corrMatrix, new);
2510 mult->SaveHistograms();
2511 file->Close();
2512}
2513
2514void EvaluateRegularizationEffect(Int_t step, const char* fileNameRebinned = "multiplicityMC_3M_rebinned.root", const char* fileNameNormal = "multiplicityMC_3M.root", Int_t histID = 3)
2515{
2516 // due to some static members in AliMultiplicityCorrection, the session has to be restarted after changing the number of parameters, to be fixed
2517 // that is why this is done in 2 steps
2518
2519 gSystem->Load("libPWG0base");
2520
2521 Bool_t fullPhaseSpace = kFALSE;
2522
2523 if (step == 1)
2524 {
2525 // first step: unfold without regularization and rebinned histogram ("N=M")
2526 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2527 TFile::Open(fileNameRebinned);
2528 mult->LoadHistograms();
2529
2530 mult->SetRegularizationParameters(AliMultiplicityCorrection::kNone, 0, 125);
2531 mult->SetCreateBigBin(kFALSE);
2532
2533 mult->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
2534 mult->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, mult->GetMultiplicityVtx(histID)->ProjectionY("mymchist"));
2535
2536 TFile* file = TFile::Open("EvaluateRegularizationEffect1.root", "RECREATE");
2537 mult->SaveHistograms();
2538 file->Close();
2539 }
2540 else if (step == 2)
2541 {
2542 // second step: unfold with regularization and normal histogram
2543 AliMultiplicityCorrection* mult2 = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2544 TFile::Open(fileNameNormal);
2545 mult2->LoadHistograms();
2546
2547 mult2->SetRegularizationParameters(AliMultiplicityCorrection::kPol1, 1e4);
2548 mult2->SetCreateBigBin(kTRUE);
2549 mult2->ApplyMinuitFit(histID, fullPhaseSpace, AliMultiplicityCorrection::kTrVtx, kFALSE);
2550 mult2->DrawComparison("MinuitChi2", histID, fullPhaseSpace, kTRUE, mult2->GetMultiplicityVtx(histID)->ProjectionY("mymchist"));
2551
2552 TH1* result2 = mult2->GetMultiplicityESDCorrected(histID);
2553
2554 AliMultiplicityCorrection* mult = new AliMultiplicityCorrection("Multiplicity", "Multiplicity");
2555 TFile* file = TFile::Open("EvaluateRegularizationEffect1.root");
2556 mult->LoadHistograms();
2557
2558 TH1* result1 = mult->GetMultiplicityESDCorrected(histID);
2559
2560 // compare results
2561 TCanvas* canvas = new TCanvas("EvaluateRegularizationEffect", "EvaluateRegularizationEffect", 1000, 800);
2562 canvas->Divide(2, 2);
2563
2564 canvas->cd(1);
2565 result1->SetLineColor(1);
2566 result1->DrawCopy();
2567 result2->SetLineColor(2);
2568 result2->DrawCopy("SAME");
2569 gPad->SetLogy();
2570
2571 result2->Rebin(2);
2572 result1->Scale(1.0 / result1->Integral());
2573 result2->Scale(1.0 / result2->Integral());
2574
2575 canvas->cd(2);
2576 result1->DrawCopy();
2577 result2->DrawCopy("SAME");
2578 gPad->SetLogy();
2579
2580 TH1* diff = (TH1*) result1->Clone("diff");
2581 diff->Add(result2, -1);
2582
2583 canvas->cd(3);
2584 diff->DrawCopy("HIST");
2585
2586 canvas->cd(4);
2587 diff->Divide(result1);
2588 diff->GetYaxis()->SetRangeUser(-0.3, 0.3);
2589 diff->DrawCopy("HIST");
2590
2591 Double_t chi2 = 0;
2592 for (Int_t i=1; i<=diff->GetNbinsX(); i++)
2593 chi2 += diff->GetBinContent(i) * diff->GetBinContent(i);
2594
2595 Printf("Chi2 is %e", chi2);
2596
2597 canvas->SaveAs(Form("%s.eps", canvas->GetName()));
2598 }
2599}