]>
Commit | Line | Data |
---|---|---|
f8416b14 | 1 | #include "AliAnalysisMultPbTrackHistoManager.h" |
2 | #include "TH2D.h" | |
3 | #include "TH1D.h" | |
4 | #include "TF1.h" | |
5 | #include "TCanvas.h" | |
6 | #include "TFile.h" | |
7 | #include "TSystem.h" | |
8 | #include "TROOT.h" | |
9 | #include <iostream> | |
10 | #include "TDatabasePDG.h" | |
11 | #include "AliPhysicsSelection.h" | |
12 | #include "AliESDtrackCuts.h" | |
2bbfd8c6 | 13 | #include "AliAnalysisMultPbCentralitySelector.h" |
4d0aa70f | 14 | #include "TLegend.h" |
f8416b14 | 15 | |
16 | using namespace std; | |
a23f7c97 | 17 | |
18 | AliAnalysisMultPbTrackHistoManager * hManData = 0; | |
19 | AliAnalysisMultPbTrackHistoManager * hManCorr = 0; | |
20 | TH2D * hEvStatData = 0; | |
21 | TH2D * hEvStatCorr = 0; | |
22 | ||
a28a49f6 | 23 | const Int_t kHistoFitCompoments = 3; |
f8416b14 | 24 | TH1D * gHistoCompoments[kHistoFitCompoments]; |
25 | ||
aa6151eb | 26 | void LoadLibs( Bool_t debug=0); |
a23f7c97 | 27 | void LoadData(TString dataFolder, TString correctionFolder); |
28 | void SetStyle(); | |
e0376287 | 29 | void CheckSecondaries(Double_t & fracWeak, Double_t &fracMaterial); |
30 | void CheckVz(); | |
a23f7c97 | 31 | void ShowAcceptanceInVzSlices() ; |
f8416b14 | 32 | TH1D * GetRatioIntegratedFractions (TH1 * hNum, TH1 * hDenum) ; |
e0376287 | 33 | TH1D * GetCumulativeHisto (TH1 * h) ; |
f8416b14 | 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") ; | |
e0376287 | 39 | void PrintCanvas(TCanvas* c,const TString formats) ; |
f8416b14 | 40 | |
e0376287 | 41 | // global switches |
42 | Bool_t doPrint=kFALSE;// disable PrintCanvas | |
f8416b14 | 43 | |
aa6151eb | 44 | #define CORRECT_2D |
f8416b14 | 45 | |
e0376287 | 46 | void correct(TString dataFolder = "./output/LHC10g2d_130844_V0M_bin_10/", TString correctionFolder = "./output/LHC10g2a_130844_V0M_bin_10/") { |
a23f7c97 | 47 | |
48 | // Load stuff and set some styles | |
49 | LoadLibs(); | |
50 | LoadData(dataFolder,correctionFolder); | |
51 | SetStyle(); | |
3b8cbf2d | 52 | // ShowAcceptanceInVzSlices(); |
53 | // return; | |
a23f7c97 | 54 | |
55 | // TODO add some cool printout for cuts and centrality selection | |
56 | ||
e0376287 | 57 | CheckVz(); |
58 | ||
59 | Double_t fractionWeak = 1, fractionMaterial=1; | |
3b8cbf2d | 60 | // CheckSecondaries(fractionWeak, fractionMaterial); |
e0376287 | 61 | cout << "Rescaling secondaries correction, weak: " << fractionWeak << ", material: " << fractionMaterial <<endl; |
a23f7c97 | 62 | |
63 | ||
64 | // Some shorthands | |
65 | // FIXME: Gen should be projected including overflow in z? | |
aa6151eb | 66 | Float_t zmin = -10; |
67 | Float_t zmax = 10; | |
68 | #if defined CORRECT_1D | |
4d0aa70f | 69 | TH1D * hDataPt = (TH1D*) hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRec, -0.5,0.5,zmin,zmax)->Clone("hDataPt"); |
70 | TH1D * hMCPtGen = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, -0.5,0.5,-22222,-22222); | |
71 | TH1D * hMCPtRec = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRec, -0.5,0.5,zmin,zmax); | |
72 | TH1D * hMCPtPri = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim, -0.5,0.5,zmin,zmax); | |
73 | TH1D * hMCPtSeM = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat, -0.5,0.5,zmin,zmax); | |
74 | TH1D * hMCPtSeW = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak, -0.5,0.5,zmin,zmax); | |
75 | TH1D * hMCPtFak = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecFake, -0.5,0.5,zmin,zmax); | |
aa6151eb | 76 | #elif defined CORRECT_2D |
77 | TH1 * hDataPt = (TH2D*) hManData->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRec, -0.5,0.5)->Clone("hDataPt"); | |
78 | TH1 * hMCPtGen = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoGen, -0.5,0.5); | |
79 | TH1 * hMCPtRec = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRec, -0.5,0.5); | |
80 | TH1 * hMCPtPri = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim, -0.5,0.5); | |
81 | TH1 * hMCPtSeM = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat, -0.5,0.5); | |
82 | TH1 * hMCPtSeW = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak, -0.5,0.5); | |
83 | TH1 * hMCPtFak = (TH2D*) hManCorr->GetHistoPtVz(AliAnalysisMultPbTrackHistoManager::kHistoRecFake, -0.5,0.5); | |
84 | #endif | |
a23f7c97 | 85 | |
86 | TCanvas * cdata = new TCanvas ("cData", "Data"); | |
e0376287 | 87 | cdata->SetLogy(); |
a23f7c97 | 88 | hDataPt->Draw(); |
89 | // hMCPtRec->Draw("same"); | |
90 | ||
91 | TCanvas * cMC = new TCanvas ("cMC", "Monte Carlo"); | |
e0376287 | 92 | cMC->SetLogy(); |
f8416b14 | 93 | cMC->cd(); |
a23f7c97 | 94 | hMCPtGen ->Draw(); |
95 | hMCPtRec ->Draw("same"); | |
96 | hMCPtPri ->Draw("same"); | |
97 | hMCPtSeM ->Draw("same"); | |
98 | hMCPtSeW ->Draw("same"); | |
99 | hMCPtFak ->Draw("same"); | |
4d0aa70f | 100 | |
101 | hMCPtGen ->GetXaxis()->SetRangeUser(0,4.5); | |
102 | hMCPtGen ->GetYaxis()->SetRangeUser(0.1,1e4); | |
103 | TLegend * lMC = new TLegend(0.505034, 0.59965, 0.877517, 0.926573,"Monte Carlo"); | |
104 | lMC->AddEntry( hMCPtGen, "Generated"); | |
105 | lMC->AddEntry( hMCPtRec, "All Rec"); | |
106 | lMC->AddEntry( hMCPtPri, "Rec Primaries"); | |
107 | lMC->AddEntry( hMCPtSeM, "Rec Sec. Material"); | |
108 | lMC->AddEntry( hMCPtSeW, "Rec Sec. Weak"); | |
109 | lMC->AddEntry( hMCPtFak, "Rec Fakes"); | |
110 | lMC->Draw(); | |
111 | ||
a23f7c97 | 112 | |
113 | cout << "Fake/All Rec = " << hMCPtFak->Integral()/hMCPtRec->Integral() << endl; | |
114 | cout << "SM/All Rec = " << hMCPtSeM->Integral()/hMCPtRec->Integral() << endl; | |
115 | cout << "SW/All Rec = " << hMCPtSeW->Integral()/hMCPtRec->Integral() << endl; | |
116 | ||
117 | ||
118 | // Compute efficiency and subtract secondaries and fakes after rescaling to data | |
119 | // PRIM_DATA = ALL_DATA - SEC_MC/ALL_MC*ALL_DATA - FAK_MC/ALL_MC*ALL_DATA | |
120 | // TRUE_DATA = PRIM_DATA * GEN_MC/PRIM_MC | |
121 | ||
4d0aa70f | 122 | |
a23f7c97 | 123 | TH1D * hEffPt = (TH1D*) hMCPtPri->Clone("hEffPt"); |
124 | hEffPt->Divide(hMCPtPri,hMCPtGen,1,1,"B"); | |
125 | ||
4d0aa70f | 126 | TH1D * hCorSeM = (TH1D*) hMCPtSeM->Clone("hCorSeM"); |
a23f7c97 | 127 | hCorSeM->Divide(hMCPtSeM,hMCPtRec,1,1,"B"); |
e0376287 | 128 | hCorSeM->Scale(fractionMaterial);// rescale material correction |
4d0aa70f | 129 | hCorSeM->Multiply(hDataPt); |
a23f7c97 | 130 | |
4d0aa70f | 131 | TH1D * hCorSeW = (TH1D*) hMCPtSeW->Clone("hCorSeW"); |
a23f7c97 | 132 | hCorSeW->Divide(hMCPtSeW,hMCPtRec,1,1,"B"); |
133 | hCorSeW->Scale(fractionWeak);// rescale weak correction | |
134 | hCorSeW->Multiply(hDataPt); | |
135 | ||
4d0aa70f | 136 | TH1D * hCorFak = (TH1D*) hMCPtFak->Clone("hCorFak"); |
a23f7c97 | 137 | hCorFak->Divide(hMCPtFak,hMCPtRec,1,1,"B"); |
138 | hCorFak->Multiply(hDataPt); | |
139 | ||
140 | TH1D * hCorrected = (TH1D*) hDataPt->Clone("hCorrected"); | |
141 | hCorrected->Add(hCorSeM,-1); | |
142 | hCorrected->Add(hCorSeW,-1); | |
143 | hCorrected->Add(hCorFak,-1); | |
144 | hCorrected->Divide(hEffPt); | |
145 | hCorrected->SetMarkerStyle(kOpenStar); | |
146 | ||
4d0aa70f | 147 | |
148 | TCanvas * cCorrections = new TCanvas("cCorrections", "cCorrections"); | |
149 | ||
150 | hEffPt->Draw(); | |
151 | // hCorSeM->Draw(); | |
152 | // hCorSeM->SetLineColor(kRed); | |
153 | // hCorSeM->SetMarkerColor(kRed); | |
154 | // hMCPtSeM->Draw("same"); | |
155 | // hCorSeW->Draw("same"); | |
156 | // hCorSeW->SetLineColor(kRed); | |
157 | // hCorSeW->SetMarkerColor(kRed); | |
158 | // hMCPtSeW->Draw("same"); | |
159 | ||
160 | ||
aa6151eb | 161 | // hDataPt->Draw(); |
162 | // return; | |
163 | ||
164 | cdata->cd(); | |
165 | #ifdef CORRECT_2D | |
166 | Int_t minProj = hDataPt->GetYaxis()->FindBin(zmin); | |
167 | Int_t maxProj = hDataPt->GetYaxis()->FindBin(zmax-0.0001); | |
168 | ||
169 | cout << minProj << "-" << maxProj << endl; | |
170 | ||
171 | // This correction accounts for the vertex cut; | |
172 | ||
173 | hDataPt = ((TH2D*)hDataPt )->ProjectionX("_px",minProj,maxProj,"E"); | |
174 | hCorrected = ((TH2D*)hCorrected)->ProjectionX("_px",minProj,maxProj,"E"); | |
175 | hMCPtGen = ((TH2D*)hMCPtGen )->ProjectionX("_px",minProj,maxProj,"E"); | |
176 | ||
177 | Float_t vertexCutCorrection = | |
178 | hManCorr->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoGen)->Integral(-1,-1) / | |
179 | hManCorr->GetHistoVzEvent(AliAnalysisMultPbTrackHistoManager::kHistoGen)->Integral(minProj,maxProj) ; | |
180 | // cout << vertexCutCorrection << " " << hMCPtGen->Integral(-1,-1) << " " << hMCPtPri->Integral() << endl; | |
181 | // vertexCutCorrection /= hMCPtGen->Integral(-1,-1); | |
182 | // vertexCutCorrection = 1; // FIXME | |
183 | cout << "Vertex cut correction " << vertexCutCorrection << " (Efficiency " << 1./vertexCutCorrection << ")" << endl; | |
184 | ||
185 | hDataPt ->Scale(1.,"width"); | |
186 | hCorrected ->Scale(vertexCutCorrection,"width"); | |
187 | hMCPtGen ->Scale(1.,"width"); | |
188 | #endif | |
189 | ||
a23f7c97 | 190 | hDataPt->Draw(); |
4d0aa70f | 191 | hDataPt ->GetXaxis()->SetRangeUser(0,4.5); |
192 | hDataPt ->GetYaxis()->SetRangeUser(0.1,1e4); | |
a23f7c97 | 193 | hCorrected->SetLineColor(kBlack); |
194 | hCorrected->SetMarkerColor(kBlack); | |
195 | hCorrected->Draw("same"); | |
196 | hMCPtGen->DrawClone("same"); | |
197 | TF1 * f = GetLevy(); | |
198 | hCorrected->Fit(f,"", "same"); | |
aa6151eb | 199 | hCorrected->Fit(f,"IME", "same",0,2); |
4d0aa70f | 200 | cout << "dN/deta (function) = " << f->Integral(0,100) << " +- " << f->IntegralError(0,100) << endl; |
201 | cout << "dN/deta (func+data) = " << f->Integral(0,0.1) + hCorrected->Integral(3,-1,"width") << endl;// | |
aa6151eb | 202 | cout << "dN/deta (func+data) = " << f->Integral(0,0.15) + hCorrected->Integral(4,-1,"width") << endl;// |
eef42d18 | 203 | cout << "Generated dN/deta (correction) = " << hMCPtGen->Integral("width") << endl; |
a23f7c97 | 204 | // FIXME: comment this out |
4d0aa70f | 205 | TH1D * hDataGen = hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, -0.5,0.5,-22222,-22222); |
eef42d18 | 206 | cout << "Generated dN/deta (data) = " << hDataGen->Integral("width") << endl; |
4d0aa70f | 207 | hDataGen->Draw("same"); |
208 | TLegend * l = new TLegend(0.520134, 0.676573, 0.885906, 0.923077,"137161, p1+++"); | |
209 | l->AddEntry(hDataPt, "Raw data"); | |
210 | l->AddEntry(hCorrected, "Corrected data"); | |
211 | l->AddEntry(hMCPtGen, "Monte Carlo (generated)"); | |
212 | l->AddEntry(f, "Levy Fit"); | |
213 | l->Draw(); | |
a23f7c97 | 214 | } |
215 | ||
e0376287 | 216 | void CheckSecondaries(Double_t &fracWeak, Double_t &fracMaterial) { |
a23f7c97 | 217 | // Returns the fraction you need to rescale the secondaries from weak decays for. |
218 | ||
219 | // Some shorthands | |
220 | TH1D * hDataDCA = hManData->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec ); | |
f8416b14 | 221 | // TH1D * hMCDCAGen = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoGen ); |
a23f7c97 | 222 | TH1D * hMCDCARec = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec ); |
223 | TH1D * hMCDCAPri = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim ); | |
224 | TH1D * hMCDCASW = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak ); | |
225 | TH1D * hMCDCASM = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat ); | |
226 | TH1D * hMCDCAFak = hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecFake ); | |
227 | ||
228 | ||
229 | TCanvas * cCumulative = new TCanvas("cDCAculumative","DCA cumulative distributions"); | |
f8416b14 | 230 | cCumulative->cd(); |
a23f7c97 | 231 | GetCumulativeHisto(hMCDCAPri )->Draw(); |
232 | GetRatioIntegratedFractions(hMCDCASW, hMCDCARec )->Draw("same"); | |
233 | GetRatioIntegratedFractions(hMCDCASM, hMCDCARec )->Draw("same"); | |
234 | GetRatioIntegratedFractions(hMCDCAPri,hMCDCARec )->Draw("same"); | |
235 | ||
236 | ||
237 | TCanvas * c1 = new TCanvas("cDCAFit", "Fit to the DCA distributions"); | |
238 | c1->SetLogy(); | |
239 | // Draw all | |
e0376287 | 240 | // hDataDCA->Draw(); |
241 | // hMCDCARec ->Draw("same"); | |
242 | // hMCDCAPri ->Draw("same"); | |
243 | // hMCDCASW ->Draw("same"); | |
244 | // hMCDCASM ->Draw("same"); | |
245 | // hMCDCAFak ->Draw("same"); | |
246 | // return; | |
a23f7c97 | 247 | |
e0376287 | 248 | // Fit the DCA distribution. Uses a TF1 made by summing histograms |
a23f7c97 | 249 | TH1D * hMCPrimSMFak = (TH1D*) hMCDCAPri->Clone("hMCPrimSMFak"); |
a28a49f6 | 250 | // hMCPrimSMFak->Add(hMCDCASM); |
a23f7c97 | 251 | hMCPrimSMFak->Add(hMCDCAFak); |
f8416b14 | 252 | |
e0376287 | 253 | // Set the components which are used in HistoSum, the static |
254 | // function for GetFunctionHistoSum | |
f8416b14 | 255 | gHistoCompoments[0] = (TH1D*) hMCPrimSMFak->Clone(); |
256 | gHistoCompoments[1] = (TH1D*) hMCDCASW->Clone(); | |
a28a49f6 | 257 | gHistoCompoments[2] = (TH1D*) hMCDCASM->Clone(); |
f8416b14 | 258 | TF1 * fHistos = GetFunctionHistoSum(); |
e0376287 | 259 | fHistos->SetParameters(1,1,1); |
260 | fHistos->SetLineColor(kRed); | |
261 | // Fit! | |
a28a49f6 | 262 | hDataDCA->Fit(fHistos,"","",0,200); |
e0376287 | 263 | // Rescale the components and draw to see how it looks like |
f8416b14 | 264 | hMCPrimSMFak->Scale(fHistos->GetParameter(0)); |
265 | hMCDCASW ->Scale(fHistos->GetParameter(1)); | |
a28a49f6 | 266 | hMCDCASM ->Scale(fHistos->GetParameter(2)); |
f8416b14 | 267 | hMCPrimSMFak->Draw("same"); |
268 | hMCDCASW ->Draw("same"); | |
a28a49f6 | 269 | hMCDCASM ->Draw("same"); |
e0376287 | 270 | // compute scaling factors |
eef42d18 | 271 | fracWeak = fHistos->GetParameter(1)/fHistos->GetParameter(0); |
272 | fracMaterial = fHistos->GetParameter(2)/fHistos->GetParameter(0); | |
f8416b14 | 273 | |
a23f7c97 | 274 | |
275 | } | |
276 | ||
e0376287 | 277 | void CheckVz() { |
278 | // compares the Vz distribution in data and in MC | |
279 | TCanvas * c1 = new TCanvas("cVz", "Vertex Z distribution"); | |
280 | c1->cd(); | |
281 | TH1D * hData = hManData->GetHistoVz(AliAnalysisMultPbTrackHistoManager::kHistoRec ); | |
282 | TH1D * hCorr = hManCorr->GetHistoVz(AliAnalysisMultPbTrackHistoManager::kHistoRec ); | |
283 | hCorr->Draw(""); | |
284 | hData->Draw("same"); | |
285 | ||
286 | } | |
287 | ||
aa6151eb | 288 | void LoadLibs( Bool_t debug) { |
a23f7c97 | 289 | |
290 | gSystem->Load("libVMC"); | |
291 | gSystem->Load("libTree"); | |
292 | gSystem->Load("libSTEERBase"); | |
293 | gSystem->Load("libESD"); | |
294 | gSystem->Load("libAOD"); | |
295 | gSystem->Load("libANALYSIS"); | |
296 | gSystem->Load("libANALYSISalice"); | |
297 | gSystem->Load("libCORRFW"); | |
298 | gSystem->Load("libMinuit"); | |
299 | gSystem->Load("libPWG2Spectra"); | |
300 | gSystem->Load("libPWG0base"); | |
301 | ||
a28a49f6 | 302 | gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/PWG0/multPbPb")); |
f8416b14 | 303 | gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/PWG1/background")); |
a23f7c97 | 304 | // Load helper classes |
305 | // TODO: replace this by a list of TOBJStrings | |
a28a49f6 | 306 | TString taskName("$ALICE_ROOT/PWG0/multPbPb/AliAnalysisTaskMultPbTracks.cxx+"); |
307 | TString histoManName("$ALICE_ROOT/PWG0/multPbPb/AliAnalysisMultPbTrackHistoManager.cxx+"); | |
308 | TString centrName("$ALICE_ROOT/PWG0/multPbPb/AliAnalysisMultPbCentralitySelector.cxx+"); | |
a23f7c97 | 309 | TString listName("$ALICE_ROOT/PWG1/background/AliHistoListWrapper.cxx+"); |
310 | ||
a28a49f6 | 311 | gSystem->ExpandPathName(taskName); |
312 | gSystem->ExpandPathName(histoManName); | |
313 | gSystem->ExpandPathName(centrName); | |
314 | gSystem->ExpandPathName(listName); | |
315 | ||
aa6151eb | 316 | |
a23f7c97 | 317 | gROOT->LoadMacro(listName +(debug?"+g":"")); |
318 | gROOT->LoadMacro(histoManName+(debug?"+g":"")); | |
319 | gROOT->LoadMacro(centrName +(debug?"+g":"")); | |
320 | gROOT->LoadMacro(taskName +(debug?"+g":"")); | |
321 | ||
322 | // Histo fitter | |
323 | gROOT->LoadMacro("/Users/mfloris/Work/ALICE/ANALYSIS/HistoFitter/fcn.cxx+g"); | |
f8416b14 | 324 | gROOT->LoadMacro("/Users/mfloris/Work/ALICE/ANALYSIS/HistoFitter/AliHistoFitter.cxx+g"); |
a23f7c97 | 325 | |
326 | ||
327 | } | |
328 | ||
329 | ||
330 | void SetStyle() { | |
331 | ||
332 | hManData->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetLineColor(kBlack); | |
333 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetLineColor(kRed ); | |
334 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetLineColor(kRed ); | |
335 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetLineColor(kGreen); | |
336 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetLineColor(kBlue ); | |
337 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetLineColor(kBlue ); | |
338 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetLineColor(kCyan ); | |
339 | ||
340 | hManData->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerColor(kBlack); | |
341 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetMarkerColor(kRed ); | |
342 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerColor(kRed ); | |
343 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetMarkerColor(kGreen); | |
344 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetMarkerColor(kBlue ); | |
345 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetMarkerColor(kBlue ); | |
346 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetMarkerColor(kCyan ); | |
347 | ||
348 | hManData->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerStyle(kFullCircle); | |
349 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetMarkerStyle(kFullSquare); | |
350 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerStyle(kOpenSquare); | |
351 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetMarkerStyle(kOpenSquare); | |
352 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetMarkerStyle(kOpenSquare); | |
353 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetMarkerStyle(kOpenCircle); | |
354 | hManCorr->GetHistoPtEtaVz(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetMarkerStyle(kOpenSquare); | |
355 | ||
356 | hManData->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetLineColor(kBlack); | |
357 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetLineColor(kRed ); | |
358 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetLineColor(kRed ); | |
359 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetLineColor(kGreen); | |
360 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetLineColor(kBlue ); | |
a28a49f6 | 361 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetLineColor(kBlue-7 ); |
a23f7c97 | 362 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetLineColor(kCyan ); |
363 | ||
364 | hManData->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerColor(kBlack); | |
365 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetMarkerColor(kRed ); | |
366 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerColor(kRed ); | |
367 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetMarkerColor(kGreen); | |
368 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetMarkerColor(kBlue ); | |
a28a49f6 | 369 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetMarkerColor(kBlue-7 ); |
a23f7c97 | 370 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetMarkerColor(kCyan ); |
371 | ||
372 | hManData->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerStyle(kFullCircle); | |
373 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoGen) ->SetMarkerStyle(kFullSquare); | |
374 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRec) ->SetMarkerStyle(kOpenSquare); | |
375 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim)->SetMarkerStyle(kOpenSquare); | |
376 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecMat) ->SetMarkerStyle(kOpenSquare); | |
377 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecSecWeak) ->SetMarkerStyle(kOpenSquare); | |
378 | hManCorr->GetHistoDCA(AliAnalysisMultPbTrackHistoManager::kHistoRecFake)->SetMarkerStyle(kOpenSquare); | |
379 | ||
380 | ||
381 | } | |
382 | ||
383 | void LoadData(TString dataFolder, TString correctionFolder){ | |
384 | ||
385 | // Get histo manager for data and MC + stat histos | |
386 | TFile * fData = new TFile(dataFolder+"multPbPbtracks.root"); | |
387 | TFile * fCorr = new TFile(correctionFolder+"multPbPbtracks.root"); | |
388 | TFile * fStatData = new TFile(dataFolder+"event_stat.root"); | |
389 | TFile * fStatCorr = new TFile(correctionFolder+"event_stat.root"); | |
390 | ||
391 | hManData = (AliAnalysisMultPbTrackHistoManager*) fData->Get("histoManager"); | |
392 | hManCorr = (AliAnalysisMultPbTrackHistoManager*) fCorr->Get("histoManager"); | |
393 | AliESDtrackCuts * cutsData = (AliESDtrackCuts*) fData->Get("AliESDtrackCuts"); | |
394 | AliESDtrackCuts * cutsCorr = (AliESDtrackCuts*) fCorr->Get("AliESDtrackCuts"); | |
395 | if (cutsData != cutsCorr) { | |
396 | cout << "ERROR: MC and data do not have the same cuts" << endl; | |
397 | // FIXME: exit here | |
398 | } | |
399 | cutsData->Print(); | |
400 | hEvStatData = (TH2D*) fStatData->Get("fHistStatistics"); | |
401 | hEvStatCorr = (TH2D*) fStatCorr->Get("fHistStatistics"); | |
402 | ||
aa6151eb | 403 | AliAnalysisMultPbCentralitySelector * centrData = (AliAnalysisMultPbCentralitySelector*) fData->Get("Cuts"); |
404 | if(!centrData) { | |
405 | cout << "ERROR: cannot read centrality data" << endl; | |
406 | } | |
407 | centrData->Print(); | |
a23f7c97 | 408 | // Normalize |
409 | Int_t irowGoodTrigger = 1; | |
410 | if (hEvStatCorr && hEvStatData) { | |
411 | // 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 | |
e0376287 | 412 | // hManData->ScaleHistos(hEvStatData->GetBinContent(AliPhysicsSelection::kStatAccepted,irowGoodTrigger)); |
413 | // hManCorr->ScaleHistos(hEvStatCorr->GetBinContent(AliPhysicsSelection::kStatAccepted,irowGoodTrigger)); | |
eef42d18 | 414 | hManData->ScaleHistos(hManData->GetHistoStats()->GetBinContent(AliAnalysisMultPbTrackHistoManager::kStatVtx)); |
415 | hManCorr->ScaleHistos(hManCorr->GetHistoStats()->GetBinContent(AliAnalysisMultPbTrackHistoManager::kStatVtx)); | |
a23f7c97 | 416 | } else { |
417 | cout << "WARNING!!! ARBITRARY SCALING" << endl; | |
418 | hManData->ScaleHistos(1000); | |
419 | hManCorr->ScaleHistos(1000); | |
420 | } | |
421 | } | |
422 | ||
f8416b14 | 423 | TF1 * GetHagedorn(Float_t norm, Float_t pt0, Float_t n) { |
a23f7c97 | 424 | |
425 | TF1 * f =0; | |
426 | Double_t mass = TDatabasePDG::Instance()->GetParticle("pi+")->Mass(); | |
427 | ||
428 | f=new TF1("fHagedorn",Form("(x/sqrt(x*x+%f*%f))*x*[0]*( 1 + x/[1] )^(-[2])",mass,mass),0,10); | |
429 | f->SetParameters(norm, pt0, n); | |
430 | f->SetParLimits(1, 0.01, 10); | |
431 | f->SetParNames("norm", "pt0", "n"); | |
432 | f->SetLineWidth(1); | |
433 | return f; | |
434 | ||
435 | ||
436 | } | |
437 | ||
f8416b14 | 438 | TF1 * GetMTExp(Float_t norm, Float_t t) { |
a23f7c97 | 439 | |
440 | TF1 * f =0; | |
441 | Double_t mass = TDatabasePDG::Instance()->GetParticle("pi+")->Mass(); | |
442 | ||
443 | 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); | |
444 | f->SetParameters(norm, t); | |
445 | // f->SetParLimits(1, 0.01); | |
446 | f->SetParNames("norm", "T"); | |
447 | f->SetLineWidth(1); | |
448 | return f; | |
449 | ||
450 | ||
451 | } | |
452 | ||
f8416b14 | 453 | TF1 * GetLevy(Double_t temp, Double_t n, Double_t norm, const char * name) { |
a23f7c97 | 454 | |
455 | char formula[500]; | |
456 | Double_t mass = TDatabasePDG::Instance()->GetParticle("pi+")->Mass(); | |
457 | ||
458 | ||
459 | 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])"); | |
460 | TF1* f=new TF1(name,formula,0,10); | |
461 | f->SetParameters(norm, n, temp,mass); | |
462 | f->SetParLimits(2, 0.01, 10); | |
463 | f->SetParNames("norm (dN/dy)", "n", "T", "mass"); | |
464 | f->FixParameter(3,mass); | |
465 | f->SetLineWidth(1); | |
466 | return f; | |
467 | ||
468 | ||
469 | } | |
470 | ||
471 | ||
472 | TH1D * GetCumulativeHisto (TH1 * h) { | |
473 | // Returns a cumulative histogram | |
474 | // FIXME: put this method in a tools class | |
f8416b14 | 475 | TH1D * hInt = (TH1D*) h->Clone(TString(h->GetName())+"_Int"); |
a23f7c97 | 476 | hInt->Reset(); |
477 | Float_t integral = h->Integral(-1,-1); // Consider under/over flow! | |
478 | Int_t nbin = h->GetNbinsX(); | |
479 | for(Int_t ibin = 1; ibin <= nbin; ibin++){ | |
480 | Double_t content = h->Integral(-1,ibin) / integral; | |
481 | hInt->SetBinContent(ibin, content); | |
482 | } | |
483 | return hInt; | |
484 | } | |
485 | ||
486 | TH1D * GetRatioIntegratedFractions (TH1 * hNum, TH1 * hDenum) { | |
487 | // Returns the the ratio of integrated histograms | |
488 | // FIXME: put this method in a tools class | |
f8416b14 | 489 | TH1D * hRatio = (TH1D*) hNum->Clone(TString(hNum->GetName())+hDenum->GetName()+"_RatioIntegrated"); |
a23f7c97 | 490 | hRatio->Reset(); |
491 | Int_t nbin = hNum->GetNbinsX(); | |
492 | for(Int_t ibin = 1; ibin <= nbin; ibin++){ | |
493 | Double_t content = hNum->Integral(-1,ibin) / hDenum->Integral(-1,ibin);// consider underflow | |
494 | hRatio->SetBinContent(ibin, content); | |
495 | } | |
496 | return hRatio; | |
497 | } | |
498 | ||
499 | void ShowAcceptanceInVzSlices() { | |
500 | TCanvas * cvz = new TCanvas("cvz","acc #times eff vs vz"); | |
e0376287 | 501 | for(Int_t ivz = -10; ivz < -6; ivz+=2){ |
502 | ivz=0;//FIXME | |
503 | Bool_t first = kTRUE; | |
504 | TH1D * hMCPtPri = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim , -0.5,0.5,ivz,ivz+2); | |
505 | TH1D * hMCPtGen = hManCorr->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, -0.5,0.5,ivz,ivz+2); | |
506 | TH1D * hMCPtPriD = hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim , -0.5,0.5,ivz,ivz+2); | |
507 | TH1D * hMCPtGenD = hManData->GetHistoPt(AliAnalysisMultPbTrackHistoManager::kHistoGen, -0.5,0.5,ivz,ivz+2); | |
a23f7c97 | 508 | // hEff= hMCPtGen; |
e0376287 | 509 | TH1D * hEff = (TH1D*)hMCPtPri->Clone(Form("hEff_vz_%d_%d",ivz,ivz+2)); |
a23f7c97 | 510 | hEff->Divide(hMCPtPri,hMCPtGen,1,1,"B"); |
e0376287 | 511 | TH1D * hEffD = (TH1D*)hMCPtPriD->Clone(Form("hEffD_vz_%d_%d",ivz,ivz+2)); |
512 | hEffD->Divide(hMCPtPriD,hMCPtGenD,1,1,"B"); | |
513 | hEffD->SetLineColor(kRed); | |
a23f7c97 | 514 | cout << "ivz " << ivz << endl; |
e0376287 | 515 | if(first) { |
516 | first=kFALSE; | |
a23f7c97 | 517 | cout << "First" << endl; |
518 | hEff->Draw(); | |
e0376287 | 519 | hEffD->Draw("same"); |
a23f7c97 | 520 | // hMCPtGen->Draw(); |
521 | // hMCPtPri->Draw("same"); | |
522 | } | |
523 | else { | |
524 | cout << "Same" << endl; | |
525 | hEff->Draw("same"); | |
e0376287 | 526 | hEffD->Draw("same"); |
a23f7c97 | 527 | // hMCPtGen->Draw(""); |
528 | // hMCPtPri->Draw("same"); | |
529 | } | |
530 | cvz->Update(); | |
531 | // cvz->WaitPrimitive(); | |
532 | } | |
533 | ||
534 | //hManCorr->GetHistoVz(AliAnalysisMultPbTrackHistoManager::kHistoRecPrim )->Draw(); | |
e0376287 | 535 | // hManCorr->GetHistoVz(AliAnalysisMultPbTrackHistoManager::kHistoRec )->Draw(""); |
536 | // hManCorr->GetHistoVz(AliAnalysisMultPbTrackHistoManager::kHistoGen )->Draw("same"); | |
a23f7c97 | 537 | |
538 | ||
539 | } | |
f8416b14 | 540 | |
541 | TF1 * GetFunctionHistoSum() { | |
542 | ||
543 | TF1 * f = new TF1 ("fHistoSum",HistoSum,0,50,kHistoFitCompoments); | |
a28a49f6 | 544 | f->SetParNames("Primaries+Fakes", "Sec. Weak decays","Sec. Material"); |
f8416b14 | 545 | f->SetNpx(1000); |
546 | return f; | |
547 | ||
548 | } | |
549 | ||
550 | static Double_t HistoSum(const double * x, const double* p){ | |
551 | // This function uses a global array of histograms, rescaled by some | |
552 | // parameters, to define a function | |
553 | // The array is called gHistoCompoments | |
554 | // The size of the arrays is given by the global constant kHistoFitCompoments | |
555 | ||
556 | Double_t xx = x[0]; | |
557 | Double_t value = 0; | |
558 | for(Int_t icomp = 0; icomp < kHistoFitCompoments; icomp++){ | |
559 | // value += gHistoCompoments[icomp]-Interpolate(xx) * p[icomp]; | |
560 | Int_t ibin = gHistoCompoments[icomp]->FindBin(xx); | |
561 | value += gHistoCompoments[icomp]->GetBinContent(ibin) * p[icomp]; | |
562 | } | |
563 | ||
564 | return value; | |
565 | ||
566 | } | |
e0376287 | 567 | |
568 | void PrintCanvas(TCanvas* c,const TString formats) { | |
569 | // print a canvas in every of the given comma-separated formats | |
570 | // ensure the canvas is updated | |
571 | if(!doPrint) return; | |
572 | c->Update(); | |
573 | gSystem->ProcessEvents(); | |
574 | TObjArray * arr = formats.Tokenize(","); | |
575 | TIterator * iter = arr->MakeIterator(); | |
576 | TObjString * element = 0; | |
577 | TString name =c ->GetName(); | |
578 | name.ReplaceAll(" ","_"); | |
579 | name.ReplaceAll("+","Plus"); | |
580 | name.ReplaceAll("-",""); | |
581 | while ((element = (TObjString*) iter->Next())) { | |
582 | c->Print(name+ "."+element->GetString()); | |
583 | } | |
584 | } |