1 #include "AliAnalysisMultPbTrackHistoManager.h"
10 #include "TDatabasePDG.h"
11 #include "AliPhysicsSelection.h"
12 #include "AliESDtrackCuts.h"
13 #include "AliAnalysisMultPbCentralitySelector.h"
18 AliAnalysisMultPbTrackHistoManager * hManData = 0;
19 AliAnalysisMultPbTrackHistoManager * hManCorr = 0;
20 TH2D * hEvStatData = 0;
21 TH2D * hEvStatCorr = 0;
23 const Int_t kHistoFitCompoments = 3;
24 TH1D * gHistoCompoments[kHistoFitCompoments];
26 void LoadLibs( Bool_t debug=0);
27 void LoadData(TString dataFolder, TString correctionFolder);
29 void CheckSecondaries(Double_t & fracWeak, Double_t &fracMaterial);
31 void ShowAcceptanceInVzSlices() ;
32 TH1D * GetRatioIntegratedFractions (TH1 * hNum, TH1 * hDenum) ;
33 TH1D * GetCumulativeHisto (TH1 * h) ;
34 static Double_t HistoSum(const double * x, const double* p);
35 TF1 * GetFunctionHistoSum() ;
36 TF1 * GetMTExp(Float_t norm=68, Float_t t=25) ;
37 TF1 * GetHagedorn(Float_t norm=68, Float_t pt0=25, Float_t n=13) ;
38 TF1 * GetLevy(Double_t temp=0.1, Double_t n=7, Double_t norm=10, const char * name="fLevy") ;
39 void PrintCanvas(TCanvas* c,const TString formats) ;
42 Bool_t doPrint=kFALSE;// disable PrintCanvas
45 Float_t etaMin = -0.5;
50 void correct(TString dataFolder = "./output/LHC10g2d_130844_V0M_bin_10/", TString correctionFolder = "./output/LHC10g2a_130844_V0M_bin_10/",
51 Float_t zminl=-10, Float_t zmaxl=10, Float_t etaMinl = -0.5, Float_t etaMaxl=0.5, Float_t npart=381.3) {
59 // Load stuff and set some styles
61 LoadData(dataFolder,correctionFolder);
63 // ShowAcceptanceInVzSlices();
66 // TODO add some cool printout for cuts and centrality selection
70 Double_t fractionWeak = 1, fractionMaterial=1;
71 CheckSecondaries(fractionWeak, fractionMaterial);
72 cout << "Rescaling secondaries correction, weak: " << fractionWeak << ", material: " << fractionMaterial <<endl;
76 // FIXME: Gen should be projected including overflow in z?
77 #if defined CORRECT_1D
78 TH1D * hDataPt = (TH1D*) hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRec, etaMin,etaMax,zmin,zmax)->Clone("hDataPt");
79 TH1D * hMCPtGen = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, etaMin,etaMax,zmin,zmax); //FIXME: che si fa qui?
80 //zTH1D * hMCPtGen = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, etaMin,etaMax,zmin,zmax);
81 TH1D * hMCPtRec = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRec, etaMin,etaMax,zmin,zmax);
82 TH1D * hMCPtPri = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim, etaMin,etaMax,zmin,zmax);
83 TH1D * hMCPtSeM = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat, etaMin,etaMax,zmin,zmax);
84 TH1D * hMCPtSeW = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak, etaMin,etaMax,zmin,zmax);
85 TH1D * hMCPtFak = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecFake, etaMin,etaMax,zmin,zmax);
86 #elif defined CORRECT_2D
87 TH1 * hDataPt = (TH2D*) hManData->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRec, etaMin,etaMax)->Clone("hDataPt");
88 TH1 * hMCPtGen = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoGen, etaMin,etaMax);
89 TH1 * hMCPtRec = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRec, etaMin,etaMax);
90 TH1 * hMCPtPri = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim, etaMin,etaMax);
91 TH1 * hMCPtSeM = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat, etaMin,etaMax);
92 TH1 * hMCPtSeW = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak, etaMin,etaMax);
93 TH1 * hMCPtFak = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRecFake, etaMin,etaMax);
96 // hMCPtRec->Draw("same");
98 TCanvas * cMC = new TCanvas ("cMC", "Monte Carlo");
101 // hMCPtSeW->Add(hMCPtSeM);
102 // hMCPtSeW->Divide(hMCPtRec);
106 hMCPtRec ->Draw("same");
107 hMCPtPri ->Draw("same");
108 hMCPtSeM ->Draw("same");
109 hMCPtSeW ->Draw("same");
110 hMCPtFak ->Draw("same");
112 hMCPtGen ->GetXaxis()->SetRangeUser(0,4.5);
113 hMCPtGen ->GetYaxis()->SetRangeUser(0.1,1e4);
115 TLegend * lMC = new TLegend(0.505034, 0.59965, 0.877517, 0.926573,"Monte Carlo");
116 lMC->AddEntry( hMCPtGen, "Generated");
117 lMC->AddEntry( hMCPtRec, "All Rec");
118 lMC->AddEntry( hMCPtPri, "Rec Primaries");
119 lMC->AddEntry( hMCPtSeM, "Rec Sec. Material");
120 lMC->AddEntry( hMCPtSeW, "Rec Sec. Weak");
121 lMC->AddEntry( hMCPtFak, "Rec Fakes");
125 cout << "Fake/All Rec = " << hMCPtFak->Integral()/hMCPtRec->Integral() << endl;
126 cout << "SM/All Rec = " << hMCPtSeM->Integral()/hMCPtRec->Integral() << endl;
127 cout << "SW/All Rec = " << hMCPtSeW->Integral()/hMCPtRec->Integral() << endl;
130 // Compute efficiency and subtract secondaries and fakes after rescaling to data
131 // PRIM_DATA = ALL_DATA - SEC_MC/ALL_MC*ALL_DATA - FAK_MC/ALL_MC*ALL_DATA
132 // TRUE_DATA = PRIM_DATA * GEN_MC/PRIM_MC
135 TH1D * hEffPt = (TH1D*) hMCPtPri->Clone("hEffPt");
136 hEffPt->Divide(hMCPtPri,hMCPtGen,1,1,"B");
138 TH1D * hCorSeM = (TH1D*) hMCPtSeM->Clone("hCorSeM");
139 hCorSeM->Divide(hMCPtSeM,hMCPtRec,1,1,"B");
140 hCorSeM->Scale(fractionMaterial);// rescale material correction
141 hCorSeM->Multiply(hDataPt);
143 TH1D * hCorSeW = (TH1D*) hMCPtSeW->Clone("hCorSeW");
144 hCorSeW->Divide(hMCPtSeW,hMCPtRec,1,1,"B");
145 hCorSeW->Scale(fractionWeak);// rescale weak correction
146 hCorSeW->Multiply(hDataPt);
148 TH1D * hCorFak = (TH1D*) hMCPtFak->Clone("hCorFak");
149 hCorFak->Divide(hMCPtFak,hMCPtRec,1,1,"B");
150 hCorFak->Multiply(hDataPt);
152 TH1D * hCorrected = (TH1D*) hDataPt->Clone("hCorrected");
153 hCorrected->Add(hCorSeM,-1);
154 hCorrected->Add(hCorSeW,-1);
155 hCorrected->Add(hCorFak,-1);
156 hCorrected->Divide(hEffPt);
157 hCorrected->SetMarkerStyle(kOpenStar);
160 TCanvas * cCorrections = new TCanvas("cCorrections", "cCorrections");
164 // hCorSeM->SetLineColor(kRed);
165 // hCorSeM->SetMarkerColor(kRed);
166 // hMCPtSeM->Draw("same");
167 // hCorSeW->Draw("same");
168 // hCorSeW->SetLineColor(kRed);
169 // hCorSeW->SetMarkerColor(kRed);
170 // hMCPtSeW->Draw("same");
175 TCanvas * cdata = new TCanvas ("cData", "Data");
179 Int_t minProj = hDataPt->GetYaxis()->FindBin(zmin);
180 Int_t maxProj = hDataPt->GetYaxis()->FindBin(zmax-0.0001);
182 cout << minProj << "-" << maxProj << endl;
184 // This correction accounts for the vertex cut;
186 hDataPt = ((TH2D*)hDataPt )->ProjectionX("_px",minProj,maxProj,"E");
187 hCorrected = ((TH2D*)hCorrected)->ProjectionX("_px",minProj,maxProj,"E");
188 hMCPtGen = ((TH2D*)hMCPtGen )->ProjectionX("_px",minProj,maxProj,"E");
190 Float_t vertexCutCorrection =
191 hManCorr->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoGen)->Integral(-1,-1) /
192 hManCorr->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoGen)->Integral(minProj,maxProj) ;
193 // cout << vertexCutCorrection << " " << hMCPtGen->Integral(-1,-1) << " " << hMCPtPri->Integral() << endl;
194 // vertexCutCorrection /= hMCPtGen->Integral(-1,-1);
195 vertexCutCorrection = 1; // FIXME
196 cout << "Vertex cut correction " << vertexCutCorrection << " (Efficiency " << 1./vertexCutCorrection << ")" << endl;
198 hDataPt ->Scale(1.,"width");
199 hCorrected ->Scale(vertexCutCorrection,"width");
200 hMCPtGen ->Scale(1.,"width");
204 hDataPt ->GetXaxis()->SetRangeUser(0,4.5);
205 hDataPt ->GetYaxis()->SetRangeUser(0.1,1e4);
206 hCorrected->SetLineColor(kBlack);
207 hCorrected->SetMarkerColor(kBlack);
208 hCorrected->Draw("same");
209 hMCPtGen->DrawClone("same");
211 //TF1 * f = GetHagedorn();
212 hCorrected->Fit(f,"", "same");
213 hCorrected->Fit(f,"IME", "same",0,2);
214 cout << "dN/deta (function) = " << f->Integral(0,100) << " +- " << f->IntegralError(0,100) << endl;
215 cout << "dN/deta (data>0.15) = " << hCorrected->Integral(3,-1,"width") << endl;//
216 cout << "dN/deta (func+data) = " << f->Integral(0,0.1) + hCorrected->Integral(3,-1,"width") << endl;//
217 cout << "dN/deta (func 0.15+data) = " << f->Integral(0,0.15) + hCorrected->Integral(4,-1,"width") << endl;//
218 cout << "Generated dN/deta (correction) = " << hMCPtGen->Integral("width") << endl;
219 cout << "Generated dN/deta (correction, <0.13) = " << hMCPtGen->Integral(1,2,"width") << endl;
220 cout << "-------" << endl;
221 Double_t errorData = 0;
222 Float_t dNdeta = (f->Integral(0,0.1) + hCorrected->IntegralAndError(3,-1,errorData, "width")) / (etaMax-etaMin);
223 Float_t dNdetaE = TMath::Sqrt(f->IntegralError(0,0.1)*f->IntegralError(0,0.1) + errorData*errorData) / (etaMax-etaMin);
224 cout << "dN/deta " << dNdeta << " +- " << dNdetaE << endl;
225 cout << "(dN/deta)/Npart " << dNdeta/npart << " +- " << dNdetaE/npart << endl;
227 // FIXME: comment this out
228 TH1D * hDataGen = hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, etaMin,etaMax,zmin,zmax);
229 cout << "Generated dN/deta (data) = " << hDataGen->Integral("width") << endl;
230 hDataGen->Draw("same");
231 TLegend * l = new TLegend(0.520134, 0.676573, 0.885906, 0.923077,"137161, p1+++");
232 l->AddEntry(hDataPt, "Raw data");
233 l->AddEntry(hCorrected, "Corrected data");
234 l->AddEntry(hMCPtGen, "Monte Carlo (generated)");
235 l->AddEntry(f, "Levy Fit");
239 void CheckSecondaries(Double_t &fracWeak, Double_t &fracMaterial) {
240 // Returns the fraction you need to rescale the secondaries from weak decays for.
243 TH1D * hDataDCA = hManData->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec );
244 // TH1D * hMCDCAGen = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoGen );
245 TH1D * hMCDCARec = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec );
246 TH1D * hMCDCAPri = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim );
247 TH1D * hMCDCASW = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak );
248 TH1D * hMCDCASM = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat );
249 TH1D * hMCDCAFak = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecFake );
252 TCanvas * cCumulative = new TCanvas("cDCAculumative","DCA cumulative distributions");
254 GetCumulativeHisto(hMCDCAPri )->Draw();
255 GetRatioIntegratedFractions(hMCDCASW, hMCDCARec )->Draw("same");
256 GetRatioIntegratedFractions(hMCDCASM, hMCDCARec )->Draw("same");
257 GetRatioIntegratedFractions(hMCDCAPri,hMCDCARec )->Draw("same");
260 TCanvas * c1 = new TCanvas("cDCAFit", "Fit to the DCA distributions");
264 // hMCDCARec ->Draw("same");
265 // hMCDCAPri ->Draw("same");
266 // hMCDCASW ->Draw("same");
267 // hMCDCASM ->Draw("same");
268 // hMCDCAFak ->Draw("same");
271 // Fit the DCA distribution. Uses a TF1 made by summing histograms
272 TH1D * hMCPrimSMFak = (TH1D*) hMCDCAPri->Clone("hMCPrimSMFak");
273 // hMCPrimSMFak->Add(hMCDCASM);
274 hMCPrimSMFak->Add(hMCDCAFak);
276 // Set the components which are used in HistoSum, the static
277 // function for GetFunctionHistoSum
278 gHistoCompoments[0] = (TH1D*) hMCPrimSMFak->Clone();
279 gHistoCompoments[1] = (TH1D*) hMCDCASW->Clone();
280 gHistoCompoments[2] = (TH1D*) hMCDCASM->Clone();
281 TF1 * fHistos = GetFunctionHistoSum();
282 fHistos->SetParameters(1,1,1);
283 //fHistos->FixParameter(2,1);
284 fHistos->SetLineColor(kRed);
287 // hDataDCA->Fit(fHistos,"","",0,200);
288 // Rescale the components and draw to see how it looks like
289 hMCPrimSMFak->Scale(fHistos->GetParameter(0));
290 hMCDCASW ->Scale(fHistos->GetParameter(1));
291 hMCDCASM ->Scale(fHistos->GetParameter(2));
292 hMCPrimSMFak->Draw("same");
293 hMCDCASW ->Draw("same");
294 hMCDCASM ->Draw("same");
295 fHistos->Draw("same");
296 // compute scaling factors
297 fracWeak = fHistos->GetParameter(1)/fHistos->GetParameter(0);
298 fracMaterial = fHistos->GetParameter(2)/fHistos->GetParameter(0);
304 // compares various distributions in data and in MC
305 TCanvas * c1 = new TCanvas("cVz", "Vertex Z distribution");
307 TH1D * hData = hManData->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec );
308 TH1D * hCorr = hManCorr->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec );
309 hData->SetLineColor (kBlack);
310 hData->SetMarkerColor(kBlack);
311 hData->SetMarkerStyle(kFullCircle);
312 hCorr->SetLineColor (kRed);
313 hCorr->SetMarkerColor(kRed);
314 hCorr->SetMarkerStyle(kOpenSquare);
315 TLegend * l = new TLegend(0.575503, 0.70979, 0.86745, 0.917832);
316 l->AddEntry(hData, "Data");
317 l->AddEntry(hCorr, "MC");
323 TCanvas * c2 = new TCanvas("cEta", "Eta distribution");
325 hData = hManData->GetHistoEta(AliAnalysisMultPbTrackHistoManager::kHistoRec );
326 hCorr = hManCorr->GetHistoEta(AliAnalysisMultPbTrackHistoManager::kHistoRec );
327 hData->SetLineColor (kBlack);
328 hData->SetMarkerColor(kBlack);
329 hData->SetMarkerStyle(kFullCircle);
330 hCorr->SetLineColor (kRed);
331 hCorr->SetMarkerColor(kRed);
332 hCorr->SetMarkerStyle(kOpenSquare);
333 l = new TLegend(0.575503, 0.70979, 0.86745, 0.917832);
334 l->AddEntry(hData, "Data");
335 l->AddEntry(hCorr, "MC");
340 TCanvas * c3 = new TCanvas("cMult", "Multiplicity distribution");
342 hData = hManData->GetHistoMult(AliAnalysisMultPbTrackHistoManager::kHistoRec );
343 hCorr = hManCorr->GetHistoMult(AliAnalysisMultPbTrackHistoManager::kHistoRec );
344 hData->SetLineColor (kBlack);
345 hData->SetMarkerColor(kBlack);
346 hData->SetMarkerStyle(kFullCircle);
347 hCorr->SetLineColor (kRed);
348 hCorr->SetMarkerColor(kRed);
349 hCorr->SetMarkerStyle(kOpenSquare);
350 l = new TLegend(0.575503, 0.70979, 0.86745, 0.917832);
351 l->AddEntry(hData, "Data");
352 l->AddEntry(hCorr, "MC");
359 void LoadLibs( Bool_t debug) {
361 gSystem->Load("libVMC");
362 gSystem->Load("libTree");
363 gSystem->Load("libSTEERBase");
364 gSystem->Load("libESD");
365 gSystem->Load("libAOD");
366 gSystem->Load("libANALYSIS");
367 gSystem->Load("libANALYSISalice");
368 gSystem->Load("libCORRFW");
369 gSystem->Load("libMinuit");
370 gSystem->Load("libPWG2Spectra");
371 gSystem->Load("libPWG0base");
373 gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/PWG0/multPbPb"));
374 gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/PWG1/background"));
375 // Load helper classes
376 // TODO: replace this by a list of TOBJStrings
377 TString taskName("$ALICE_ROOT/PWG0/multPbPb/AliAnalysisTaskMultPbTracks.cxx+");
378 TString histoManName("$ALICE_ROOT/PWG0/multPbPb/AliAnalysisMultPbTrackHistoManager.cxx+");
379 TString centrName("$ALICE_ROOT/PWG0/multPbPb/AliAnalysisMultPbCentralitySelector.cxx+");
380 TString listName("$ALICE_ROOT/PWG1/background/AliHistoListWrapper.cxx+");
382 gSystem->ExpandPathName(taskName);
383 gSystem->ExpandPathName(histoManName);
384 gSystem->ExpandPathName(centrName);
385 gSystem->ExpandPathName(listName);
388 gROOT->LoadMacro(listName +(debug?"+g":""));
389 gROOT->LoadMacro(histoManName+(debug?"+g":""));
390 gROOT->LoadMacro(centrName +(debug?"+g":""));
391 gROOT->LoadMacro(taskName +(debug?"+g":""));
394 gROOT->LoadMacro("/Users/mfloris/Work/ALICE/ANALYSIS/HistoFitter/fcn.cxx+g");
395 gROOT->LoadMacro("/Users/mfloris/Work/ALICE/ANALYSIS/HistoFitter/AliHistoFitter.cxx+g");
403 hManData->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetLineColor(kBlack);
404 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetLineColor(kRed );
405 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetLineColor(kRed );
406 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetLineColor(kGreen);
407 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetLineColor(kBlue );
408 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetLineColor(kBlue );
409 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetLineColor(kCyan );
411 hManData->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerColor(kBlack);
412 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetMarkerColor(kRed );
413 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerColor(kRed );
414 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetMarkerColor(kGreen);
415 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetMarkerColor(kBlue );
416 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetMarkerColor(kBlue );
417 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetMarkerColor(kCyan );
419 hManData->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerStyle(kFullCircle);
420 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetMarkerStyle(kFullSquare);
421 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerStyle(kOpenSquare);
422 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetMarkerStyle(kOpenSquare);
423 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetMarkerStyle(kOpenSquare);
424 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetMarkerStyle(kOpenCircle);
425 hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetMarkerStyle(kOpenSquare);
427 hManData->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetLineColor(kBlack);
428 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetLineColor(kRed );
429 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetLineColor(kRed );
430 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetLineColor(kGreen);
431 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetLineColor(kBlue );
432 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetLineColor(kBlue-7 );
433 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetLineColor(kCyan );
435 hManData->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerColor(kBlack);
436 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetMarkerColor(kRed );
437 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerColor(kRed );
438 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetMarkerColor(kGreen);
439 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetMarkerColor(kBlue );
440 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetMarkerColor(kBlue-7 );
441 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetMarkerColor(kCyan );
443 hManData->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerStyle(kFullCircle);
444 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetMarkerStyle(kFullSquare);
445 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerStyle(kOpenSquare);
446 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetMarkerStyle(kOpenSquare);
447 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetMarkerStyle(kOpenSquare);
448 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetMarkerStyle(kOpenSquare);
449 hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetMarkerStyle(kOpenSquare);
454 void LoadData(TString dataFolder, TString correctionFolder){
456 // Get histo manager for data and MC + stat histos
457 TFile * fData = new TFile(dataFolder+"/multPbPbtracks.root");
458 TFile * fCorr = new TFile(correctionFolder+"/multPbPbtracks.root");
459 TFile * fStatData = new TFile(dataFolder+"/event_stat.root");
460 TFile * fStatCorr = new TFile(correctionFolder+"/event_stat.root");
462 hManData = (AliAnalysisMultPbTrackHistoManager*) fData->Get("histoManager");
463 hManCorr = (AliAnalysisMultPbTrackHistoManager*) fCorr->Get("histoManager");
464 AliESDtrackCuts * cutsData = (AliESDtrackCuts*) fData->Get("AliESDtrackCuts");
465 AliESDtrackCuts * cutsCorr = (AliESDtrackCuts*) fCorr->Get("AliESDtrackCuts");
466 if (cutsData != cutsCorr) {
467 cout << "ERROR: MC and data do not have the same cuts" << endl;
471 hEvStatData = (TH2D*) fStatData->Get("fHistStatistics");
472 hEvStatCorr = (TH2D*) fStatCorr->Get("fHistStatistics");
474 AliAnalysisMultPbCentralitySelector * centrData = (AliAnalysisMultPbCentralitySelector*) fData->Get("Cuts");
476 cout << "ERROR: cannot read centrality data" << endl;
480 Int_t irowGoodTrigger = 1;
481 if (hEvStatCorr && hEvStatData) {
482 // hManData->ScaleHistos(75351.36/1.015);// Nint for run 104892 estimated correcting for the trigger efficiency, multiplied for the physics selection efficiency which I'm not correcting for the time being
483 // hManData->ScaleHistos(hEvStatData->GetBinContent(AliPhysicsSelection::kStatAccepted,irowGoodTrigger));
484 // hManCorr->ScaleHistos(hEvStatCorr->GetBinContent(AliPhysicsSelection::kStatAccepted,irowGoodTrigger));
485 // hManData->ScaleHistos(hManData->GetHistoStats()->GetBinContent(AliAnalysisMultPbTrackHistoManager::kStatVtx));
486 // hManCorr->ScaleHistos(hManCorr->GetHistoStats()->GetBinContent(AliAnalysisMultPbTrackHistoManager::kStatVtx));
487 TH1D* hvzData = hManData->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec);
488 TH1D* hvzCorr = hManCorr->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoRec);
489 hManData->ScaleHistos(hvzData->Integral(hvzData->FindBin(zmin),hvzData->FindBin(zmax-0.001)));
490 hManCorr->ScaleHistos(hvzCorr->Integral(hvzCorr->FindBin(zmin),hvzCorr->FindBin(zmax-0.001)));
492 cout << "WARNING!!! ARBITRARY SCALING" << endl;
493 hManData->ScaleHistos(1000);
494 hManCorr->ScaleHistos(1000);
498 TF1 * GetHagedorn(Float_t norm, Float_t pt0, Float_t n) {
501 Double_t mass = TDatabasePDG::Instance()->GetParticle("pi+")->Mass();
503 f=new TF1("fHagedorn",Form("(x/sqrt(x*x+%f*%f))*x*[0]*( 1 + x/[1] )^(-[2])",mass,mass),0,10);
504 f->SetParameters(norm, pt0, n);
505 f->SetParLimits(1, 0.01, 10);
506 f->SetParNames("norm", "pt0", "n");
513 TF1 * GetMTExp(Float_t norm, Float_t t) {
516 Double_t mass = TDatabasePDG::Instance()->GetParticle("pi+")->Mass();
518 f=new TF1("fMTExp",Form("(x/sqrt(x*x+%f*%f))*x*[0]*exp(-sqrt(x*x+%f*%f)/[1])",mass,mass,mass,mass),0,10);
519 f->SetParameters(norm, t);
520 // f->SetParLimits(1, 0.01);
521 f->SetParNames("norm", "T");
528 TF1 * GetLevy(Double_t temp, Double_t n, Double_t norm, const char * name) {
531 Double_t mass = TDatabasePDG::Instance()->GetParticle("pi+")->Mass();
534 sprintf(formula,"(x/sqrt(x*x+[3]*[3]))*x*( [0]*([1]-1)*([1]-2) )/( [1]*[2]*( [1]*[2]+[3]*([1]-2) ) ) * ( 1 + (sqrt([3]*[3]+x*x) -[3])/([1]*[2]) )^(-[1])");
535 TF1* f=new TF1(name,formula,0,10);
536 f->SetParameters(norm, n, temp,mass);
537 f->SetParLimits(2, 0.01, 10);
538 f->SetParNames("norm (dN/dy)", "n", "T", "mass");
539 f->FixParameter(3,mass);
547 TH1D * GetCumulativeHisto (TH1 * h) {
548 // Returns a cumulative histogram
549 // FIXME: put this method in a tools class
550 TH1D * hInt = (TH1D*) h->Clone(TString(h->GetName())+"_Int");
552 Float_t integral = h->Integral(-1,-1); // Consider under/over flow!
553 Int_t nbin = h->GetNbinsX();
554 for(Int_t ibin = 1; ibin <= nbin; ibin++){
555 Double_t content = h->Integral(-1,ibin) / integral;
556 hInt->SetBinContent(ibin, content);
561 TH1D * GetRatioIntegratedFractions (TH1 * hNum, TH1 * hDenum) {
562 // Returns the the ratio of integrated histograms
563 // FIXME: put this method in a tools class
564 TH1D * hRatio = (TH1D*) hNum->Clone(TString(hNum->GetName())+hDenum->GetName()+"_RatioIntegrated");
566 Int_t nbin = hNum->GetNbinsX();
567 for(Int_t ibin = 1; ibin <= nbin; ibin++){
568 Double_t content = hNum->Integral(-1,ibin) / hDenum->Integral(-1,ibin);// consider underflow
569 hRatio->SetBinContent(ibin, content);
574 void ShowAcceptanceInVzSlices() {
575 TCanvas * cvz = new TCanvas("cvz","acc #times eff vs vz");
576 for(Int_t ivz = -10; ivz < -6; ivz+=2){
578 Bool_t first = kTRUE;
579 TH1D * hMCPtPri = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim , etaMin,etaMax,ivz,ivz+2);
580 TH1D * hMCPtGen = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, etaMin,etaMax,ivz,ivz+2);
581 TH1D * hMCPtPriD = hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim , etaMin,etaMax,ivz,ivz+2);
582 TH1D * hMCPtGenD = hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, etaMin,etaMax,ivz,ivz+2);
584 TH1D * hEff = (TH1D*)hMCPtPri->Clone(Form("hEff_vz_%d_%d",ivz,ivz+2));
585 hEff->Divide(hMCPtPri,hMCPtGen,1,1,"B");
586 TH1D * hEffD = (TH1D*)hMCPtPriD->Clone(Form("hEffD_vz_%d_%d",ivz,ivz+2));
587 hEffD->Divide(hMCPtPriD,hMCPtGenD,1,1,"B");
588 hEffD->SetLineColor(kRed);
589 cout << "ivz " << ivz << endl;
592 cout << "First" << endl;
596 // hMCPtPri->Draw("same");
599 cout << "Same" << endl;
602 // hMCPtGen->Draw("");
603 // hMCPtPri->Draw("same");
606 // cvz->WaitPrimitive();
609 //hManCorr->GetHistoVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim )->Draw();
610 // hManCorr->GetHistoVz(AliAnalysisMultPbTrackHistoManager::kHistoRec )->Draw("");
611 // hManCorr->GetHistoVz(AliAnalysisMultPbTrackHistoManager::kHistoGen )->Draw("same");
616 TF1 * GetFunctionHistoSum() {
618 TF1 * f = new TF1 ("fHistoSum",HistoSum,0,50,kHistoFitCompoments);
619 f->SetParNames("Primaries+Fakes", "Sec. Weak decays","Sec. Material");
625 static Double_t HistoSum(const double * x, const double* p){
626 // This function uses a global array of histograms, rescaled by some
627 // parameters, to define a function
628 // The array is called gHistoCompoments
629 // The size of the arrays is given by the global constant kHistoFitCompoments
633 for(Int_t icomp = 0; icomp < kHistoFitCompoments; icomp++){
634 // value += gHistoCompoments[icomp]-Interpolate(xx) * p[icomp];
635 Int_t ibin = gHistoCompoments[icomp]->FindBin(xx);
636 value += gHistoCompoments[icomp]->GetBinContent(ibin) * p[icomp];
643 void PrintCanvas(TCanvas* c,const TString formats) {
644 // print a canvas in every of the given comma-separated formats
645 // ensure the canvas is updated
648 gSystem->ProcessEvents();
649 TObjArray * arr = formats.Tokenize(",");
650 TIterator * iter = arr->MakeIterator();
651 TObjString * element = 0;
652 TString name =c ->GetName();
653 name.ReplaceAll(" ","_");
654 name.ReplaceAll("+","Plus");
655 name.ReplaceAll("-","");
656 while ((element = (TObjString*) iter->Next())) {
657 c->Print(name+ "."+element->GetString());