1 #include "AliAODTrack.h"
6 #include "AliSpectraAODHistoManager.h"
7 #include "AliSpectraAODEventCuts.h"
8 #include "AliSpectraAODTrackCuts.h"
14 void analysis_macro(const char * dataFile = "Pt.AOD.1._data_ptcut.root", const char * mcFile ="Pt.AOD.1._MC.root") {
16 // gSystem->Load("libTree.so");
17 // gSystem->Load("libGeom.so");
18 // gSystem->Load("libVMC.so");
19 // gSystem->Load("libPhysics.so");
20 // gSystem->Load("libSTEERBase.so");
21 // gSystem->Load("libESD.so");
22 // gSystem->Load("libAOD.so");
23 // gSystem->Load("libANALYSIS.so");
24 // gSystem->Load("libANALYSISalice.so");
25 // gSystem->Load("libANALYSIS");
26 // gSystem->Load("libANALYSISalice");
27 // gROOT->LoadMacro("$ALICE_ROOT/PWG0/CreateESDChain.C");
28 // gSystem->AddIncludePath("-I$ALICE_ROOT/include");
29 // gStyle->SetPalette(1);
30 // gStyle->SetFillColor(kWhite);
32 // gROOT->LoadMacro("AliSpectraAODTrackCuts.cxx+g");
33 // gROOT->LoadMacro("AliSpectraAODEventCuts.cxx+g");
34 // gROOT->LoadMacro("AliSpectraAODHistoManager.cxx+g");
35 // gROOT->LoadMacro("AliAnalysisTaskSpectraAOD.cxx+g");
37 const char * histoname[] =
39 // names of histos we want to draw. please observe order of histos, elsewise name will not make sense
40 "#frac{MC_{#sigma, rec}}{Data}, P^{+}",
41 "#frac{MC_{#sigma, rec}}{Data}, K^{+}",
42 "#frac{MC_{#sigma, rec}}{Data}, #pi^{+}",
43 "#frac{MC_{#sigma, rec}}{Data}, P^{-}",
44 "#frac{MC_{#sigma, rec}}{Data}, K^{-}",
45 "#frac{MC_{#sigma, rec}}{Data}, #pi^{-}",
47 "#frac{MC_{#sigma, rec, prim}}{Data}, P^{+}",
48 "#frac{MC_{#sigma, rec, prim}}{Data}, K^{+}",
49 "#frac{MC_{#sigma, rec, prim}}{Data}, #pi^{+}",
50 "#frac{MC_{#sigma, rec, prim}}{Data}, P^{-}",
51 "#frac{MC_{#sigma, rec, prim}}{Data}, K^{-}",
52 "#frac{MC_{#sigma, rec, prim}}{Data}, #pi^{-}",
54 "#frac{MC_{#sigma, rec, sec}}{Data}, P^{+}",
55 "#frac{MC_{#sigma, rec, sec}}{Data}, K^{+}",
56 "#frac{MC_{#sigma, rec, sec}}{Data}, #pi^{+}",
57 "#frac{MC_{#sigma, rec, sec}}{Data}, P^{-}",
58 "#frac{MC_{#sigma, rec, sec}}{Data}, K^{-}",
59 "#frac{MC_{#sigma, rec, sec}}{Data}, #pi^{-}",
61 "#frac{MC_{true, gen}}{MC_{#sigma, rec}}, P^{+}",
62 "#frac{MC_{true, gen}}{MC_{#sigma, rec}}, K^{+}",
63 "#frac{MC_{true, gen}}{MC_{#sigma, rec}}, #pi^{+}",
64 "#frac{MC_{true, gen}}{MC_{#sigma, rec}}, P^{-}",
65 "#frac{MC_{true, gen}}{MC_{#sigma, rec}}, K^{-}",
66 "#frac{MC_{true, gen}}{MC_{#sigma, rec}}, #pi^{-}",
68 "#frac{MC_{true, gen}}{MC_{#sigma, rec}} x Data, P^{+}",
69 "#frac{MC_{true, gen}}{MC_{#sigma, rec}} x Data, K^{+}",
70 "#frac{MC_{true, gen}}{MC_{#sigma, rec}} x Data, #pi^{+}",
71 "#frac{MC_{true, gen}}{MC_{#sigma, rec}} x Data, P^{-}",
72 "#frac{MC_{true, gen}}{MC_{#sigma, rec}} x Data, K^{-}",
73 "#frac{MC_{true, gen}}{MC_{#sigma, rec}} x Data, #pi^{-}",
82 "#frac{MC_{rec #sigma}}{MC_{true, rec}}, P^{+}",
83 "#frac{MC_{rec #sigma}}{MC_{true, rec}}, K^{+}",
84 "#frac{MC_{rec #sigma}}{MC_{true, rec}}, #pi^{+}",
85 "#frac{MC_{rec #sigma}}{MC_{true, rec}}, P^{-}",
86 "#frac{MC_{rec #sigma}}{MC_{true, rec}}, K^{-}",
87 "#frac{MC_{rec #sigma}}{MC_{true, rec}}, #pi^{-}",
89 "#frac{MC_{rec #sigma sec}}{MC_{#sigma, rec}}, P^{+}",
90 "#frac{MC_{rec #sigma sec}}{MC_{#sigma, rec}}, K^{+}",
91 "#frac{MC_{rec #sigma sec}}{MC_{#sigma, rec}}, #pi^{+}",
92 "#frac{MC_{rec #sigma sec}}{MC_{#sigma, rec}}, P^{-}",
93 "#frac{MC_{rec #sigma sec}}{MC_{#sigma, rec}}, K^{-}",
94 "#frac{MC_{rec #sigma sec}}{MC_{#sigma, rec}}, #pi^{-}",
97 const char * histotitle[] =
99 // titles of histos we want to draw. please observe order of histos, elsewise name will not make sense
100 "MC #sigma, rec / Data, P^{+}",
101 "MC #sigma, rec / Data, K^{+}",
102 "MC #sigma, rec / Data, #pi^{+}",
103 "MC #sigma, rec / Data, P^{-}",
104 "MC #sigma, rec / Data, K^{-}",
105 "MC #sigma, rec / Data, #pi^{-}",
107 "MC #sigma, rec, prim / Data, P^{+}",
108 "MC #sigma, rec, prim / Data, K^{+}",
109 "MC #sigma, rec, prim / Data, #pi^{+}",
110 "MC #sigma, rec, prim / Data, P^{-}",
111 "MC #sigma, rec, prim / Data, K^{-}",
112 "MC #sigma, rec, prim / Data, #pi^{-}",
114 "MC #sigma, rec, sec / Data, P^{+}",
115 "MC #sigma, rec, sec / Data, K^{+}",
116 "MC #sigma, rec, sec / Data, #pi^{+}",
117 "MC #sigma, rec, sec / Data, P^{-}",
118 "MC #sigma, rec, sec / Data, K^{-}",
119 "MC #sigma, rec, sec / Data, #pi^{-}",
121 "Correction factor, P^{+}",
122 "Correction factor, K^{+}",
123 "Correction factor, #pi^{+}",
124 "Correction factor, P^{-}",
125 "Correction factor, K^{-}",
126 "Correction factor, #pi^{-}",
130 "True Data, #pi^{+}",
133 "True Data, #pi^{-}",
142 "Identificaiton quality, P^{+}",
143 "Identificaiton quality, K^{+}",
144 "Identificaiton quality, #pi^{+}",
145 "Identificaiton quality, P^{-}",
146 "Identificaiton quality, K^{-}",
147 "Identificaiton quality, #pi^{-}",
149 "Contribution of secondaries, P^{+}",
150 "Contribution of secondaries, K^{+}",
151 "Contribution of secondaries, #pi^{+}",
152 "Contribution of secondaries, P^{-}",
153 "Contribution of secondaries, K^{-}",
154 "Contribution of secondaries, #pi^{-}",
157 // Open root MC file and get classes
158 cout << "Analysis Macro" << endl;
159 cout << " > Reading MC data" << endl;
160 TFile *_mc = TFile::Open(mcFile);
161 AliSpectraAODHistoManager* hman_mc = (AliSpectraAODHistoManager*) _mc->Get("SpectraHistos");
162 AliSpectraAODEventCuts* ecuts_mc = (AliSpectraAODEventCuts*) _mc->Get("Event Cuts");
163 AliSpectraAODTrackCuts* tcuts_mc = (AliSpectraAODTrackCuts*) _mc->Get("Track Cuts");
164 // print info about mc track and Event cuts
165 cout << " -- Info about MC -- "<< endl;
166 ecuts_mc->PrintCuts();
167 tcuts_mc->PrintCuts();
168 // get the mc histo's necessary to write the contamination histos from the rootfile
169 TH1F* spectrahistos_mc[30];
170 cout << " -- Reading and normalizing histograms -- " << endl;
171 for( Int_t i = 0 ; i <= AliSpectraNameSpace::kNPtSpecies ; i++ ) {
172 spectrahistos_mc[i] = dynamic_cast<TH1F*>(hman_mc->GetHistogram((AliSpectraNameSpace::AODPtHist_t)i));
173 Double_t events_mc = 1. / ecuts_mc->NumberOfEvents();
174 if(!spectrahistos_mc[i]) {
177 spectrahistos_mc[i]->Scale(events_mc, "width");
179 cout << " > Reading real data " << endl;
180 // proceed likewise for data
181 TFile *_data = TFile::Open(dataFile);
182 AliSpectraAODHistoManager* hman_data = (AliSpectraAODHistoManager*) _data->Get("SpectraHistos");
183 AliSpectraAODEventCuts* ecuts_data = (AliSpectraAODEventCuts*) _data->Get("Event Cuts");
184 AliSpectraAODTrackCuts* tcuts_data = (AliSpectraAODTrackCuts*) _data->Get("Track Cuts");
185 // print info about track and Event cuts
186 cout << " -- Info about data -- " << endl;
187 ecuts_data->PrintCuts();
188 tcuts_data->PrintCuts();
189 // get the histo's necessary to write the contamination histos from the rootfile
191 // Get the raw data distribution:
192 // 1. Get DCA vs pt histo for each particle
193 // 2. Loop over all pt bins, projecting on DCA
194 // 3. Fit the DCA data distribution with MC templates for primaries, sec. w., sec. m. (TFractionFitter)
195 // 4. Extract from the fit raw primaries vs pt in data
196 // 5. Correct for the primaries efficiency estimated in MC
197 TH1F* spectrahistos_data[30];
198 cout << " -- Reading and normalizing histograms -- " << endl;
199 for( Int_t i = 0 ; i <= AliSpectraNameSpace::kNPtSpecies ; i++ ) {
200 spectrahistos_data[i] = dynamic_cast<TH1F*>(hman_data->GetHistogram((AliSpectraNameSpace::AODPtHist_t)i));
201 if(!spectrahistos_data[i]) {
204 Double_t events_data = 1. / ecuts_data->NumberOfEvents();
205 //normalize the histos
206 spectrahistos_data[i]->Scale(events_data, "width");
208 //create output file and select it as the active file
209 TFile * output = new TFile("analysis_output.root", "RECREATE");
211 // Write the scaled data and MC histos in the output file for convenience
212 output->mkdir("Data");
214 for(Int_t ihist = 0; ihist <= AliSpectraNameSpace::kNPtSpecies; ihist++){
215 spectrahistos_data[ihist]->Write();
219 for(Int_t ihist = 0; ihist <= AliSpectraNameSpace::kNPtSpecies; ihist++){
220 spectrahistos_mc[ihist]->Write();
222 output->mkdir("ANALYSIS");
223 output->cd("ANALYSIS");
224 // perform some analysis!
225 // next loop: MC_Sigma_Rec over Rec_Data
226 TCanvas* c1 = new TCanvas("MC reconstructed over Data","MC reconstructed over Data");
228 TH1F* kRatioPtMCSigmaRecSigmaRec[6];
229 for (Int_t i = 0 ; i < 6 ; i ++ )
231 kRatioPtMCSigmaRecSigmaRec[i] = (TH1F*)(spectrahistos_mc[i])->Clone(histotitle[i]);
232 kRatioPtMCSigmaRecSigmaRec[i]->Divide(spectrahistos_data[i]);
234 kRatioPtMCSigmaRecSigmaRec[i]->SetTitle(histoname[i]);
235 kRatioPtMCSigmaRecSigmaRec[i]->GetYaxis()->SetTitle("#frac{d^{2} N}{dy dp_{T}} (c / GeV)");
236 kRatioPtMCSigmaRecSigmaRec[i]->Draw();
237 kRatioPtMCSigmaRecSigmaRec[i]->Write();
239 // next loop: MC_sigma_primaries over Rec_data
240 TCanvas* c2 = new TCanvas("MC reconstructed primaries over Data", "MC reconstructed primaries over Data");
242 TH1F* kRatioPtMCSigmaRecPrimarySigmaRec[6];
243 for (Int_t i = 0 ; i < 6 ; i ++ )
245 kRatioPtMCSigmaRecPrimarySigmaRec[i] = (TH1F*)(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtRecSigmaPrimaryProtonPlus])->Clone(histotitle[i+6]);
246 kRatioPtMCSigmaRecPrimarySigmaRec[i]->Divide(spectrahistos_data[i]);
248 kRatioPtMCSigmaRecPrimarySigmaRec[i]->SetTitle(histoname[i+6]);
249 kRatioPtMCSigmaRecPrimarySigmaRec[i]->GetYaxis()->SetTitle("#frac{d^{2} N}{dy dp_{T}} (c / GeV)");
250 kRatioPtMCSigmaRecPrimarySigmaRec[i]->Draw();
251 kRatioPtMCSigmaRecPrimarySigmaRec[i]->Write();
253 // next loop: MC_Sigma_secondaries over Rec_data
254 TCanvas* c3 = new TCanvas("MC reconstructed secondaries over Data","MC reconstructed secondaries over Data");
256 TH1F* kRatioPtMCSigmaRecSigmaRecSecondary[6];
257 for (Int_t i = 0 ; i < 6 ; i ++ )
259 kRatioPtMCSigmaRecSigmaRecSecondary[i] = (TH1F*)(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtRecSigmaSecondaryProtonPlus])->Clone(histotitle[i+12]);
260 kRatioPtMCSigmaRecSigmaRecSecondary[i]->Divide(spectrahistos_data[i]);
262 kRatioPtMCSigmaRecSigmaRecSecondary[i]->SetTitle(histoname[12+i]);
263 kRatioPtMCSigmaRecSigmaRecSecondary[i]->GetYaxis()->SetTitle("#frac{d^{2} N}{dy dp_{T}} (c / GeV)");
264 kRatioPtMCSigmaRecSigmaRecSecondary[i]->Draw();
265 kRatioPtMCSigmaRecSigmaRecSecondary[i]->Write();
268 TCanvas* c4 = new TCanvas("MC true generated over MC true reconstructed","MC true generated over MC true reconstructed");
270 TH1F* kRatioPtMCTrueMCRec[6];
271 for (Int_t i = 0 ; i < 6 ; i ++ )
273 kRatioPtMCTrueMCRec[i] = (TH1F*)(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtGenTruePrimaryProtonPlus])->Clone(histotitle[i+18]);
274 kRatioPtMCTrueMCRec[i]->Divide(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtRecSigmaPrimaryProtonPlus]);
276 kRatioPtMCTrueMCRec[i]->SetTitle(histoname[18+i]);
277 kRatioPtMCTrueMCRec[i]->GetYaxis()->SetTitle("#frac{d^{2} N}{dy dp_{T}} (c / GeV)");
278 kRatioPtMCTrueMCRec[i]->Draw();
279 kRatioPtMCTrueMCRec[i]->Write();
282 TCanvas* c5 = new TCanvas("True Data","True Data");
284 TH1F* kRatioPtTrueData[6];
285 for (Int_t i = 0 ; i < 6 ; i ++ )
287 kRatioPtTrueData[i] = (TH1F*)(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtGenTruePrimaryProtonPlus])->Clone(histotitle[i+24]);
288 kRatioPtTrueData[i]->Divide(spectrahistos_mc[i]); // Michele: Since we are correcting all contributions at once, this should be exaclty the same as in the data!
289 kRatioPtTrueData[i]->Multiply(spectrahistos_data[i]);
291 kRatioPtTrueData[i]->SetTitle(histoname[24+i]);
292 kRatioPtTrueData[i]->GetYaxis()->SetTitle("#frac{d^{2} N}{dy dp_{T}} (c / GeV)");
293 kRatioPtTrueData[i]->Draw();
294 kRatioPtTrueData[i]->Write();
297 TCanvas* c6 = new TCanvas("Raw data", "Raw data");
300 for (Int_t i = 0 ; i < 6 ; i ++ )
302 kRawData[i] = (TH1F*)(spectrahistos_data[i+AliSpectraNameSpace::kHistPtRecSigmaProtonPlus])->Clone(histotitle[i+30]);
304 kRawData[i]->SetTitle(histoname[30+i]);
305 kRawData[i]->GetYaxis()->SetTitle("#frac{d^{2} N}{dy dp_{T}} (c / GeV)");
307 kRawData[i]->Write();
310 TCanvas* c7 = new TCanvas("contamination", "contamination");
312 TH1F* kContamination[6];
313 for (Int_t i = 0 ; i < 6 ; i ++ )
315 kContamination[i] = (TH1F*)(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtRecSigmaProtonPlus])->Clone(histotitle[i+36]);
316 kContamination[i]->Divide(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtRecTrueProtonPlus]);
318 kContamination[i]->SetTitle(histoname[36+i]);
319 kContamination[i]->GetYaxis()->SetTitle("#frac{d^{2} N}{dy dp_{T}} (c / GeV)");
320 kContamination[i]->Draw();
321 kContamination[i]->Write();
324 TCanvas* c8 = new TCanvas("contamination secondary", "contamination secondary");
326 TH1F* kSecContamination[6];
327 for (Int_t i = 0 ; i < 6 ; i ++ )
329 kSecContamination[i] = (TH1F*)(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtRecSigmaSecondaryProtonPlus])->Clone(histotitle[i+42]);
330 kSecContamination[i]->Divide(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtRecSigmaProtonPlus]);
332 kSecContamination[i]->SetTitle(histoname[42+i]);
333 kSecContamination[i]->GetYaxis()->SetTitle("#frac{d^{2} N}{dy dp_{T}} (c / GeV)");
334 kSecContamination[i]->Draw();
335 kSecContamination[i]->Write();
338 TCanvas* c9 = new TCanvas("true data and generated", "true data and generated");
340 TH1F* ktrueandgenerated[6];
341 for (Int_t i = 0 ; i < 6 ; i ++ )
343 // kSecContamination[i] = (TH1F*)(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtRecSigmaSecondaryProtonPlus])->Clone(histotitle[i+42]);
344 // kSecContamination[i]->Divide(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtRecSigmaProtonPlus]);
346 // kSecContamination[i]->SetTitle(histoname[42+i]);
347 // kSecContamination[i]->GetYaxis()->SetTitle("#frac{d^{2} N}{dy dp_{T}} (c / GeV)");
348 kRatioPtTrueData[i]->Draw();
349 spectrahistos_mc[i+AliSpectraNameSpace::kHistPtGenTruePrimaryProtonPlus]->SetMarkerColor(kRed);
350 spectrahistos_mc[i+AliSpectraNameSpace::kHistPtGenTruePrimaryProtonPlus]->SetMarkerStyle(kOpenCircle);
351 spectrahistos_mc[i+AliSpectraNameSpace::kHistPtGenTruePrimaryProtonPlus]->SetLineColor(kRed);
352 spectrahistos_mc[i+AliSpectraNameSpace::kHistPtGenTruePrimaryProtonPlus]->Draw("same");
355 TLegend * leg = new TLegend(0.6,0.64,0.89,0.79); //coordinates are fractions
356 leg->AddEntry(spectrahistos_mc[i+AliSpectraNameSpace::kHistPtGenTruePrimaryProtonPlus],"Generated","p");
357 leg->AddEntry(kRatioPtTrueData[i],"Corrected","p");
361 cout << "Analysis complete" << endl;
362 cout << " - Please exit root to close and save output file " << endl;