]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/SPECTRA/ChargedHadrons/dNdPt/AlidNdPtAnalysisPbPbAOD.cxx
added config for ProtonFemto train
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / ChargedHadrons / dNdPt / AlidNdPtAnalysisPbPbAOD.cxx
CommitLineData
d25bcbe6 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
7* Permission to use, copy, modify and distribute this software and its *
8* documentation strictly for non-commercial purposes is hereby granted *
9* without fee, provided that the above copyright notice appears in all *
10* copies and that both the copyright notice and this permission notice *
11* appear in the supporting documentation. The authors make no claims *
12* about the suitability of this software for any purpose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
15//------------------------------------------------------------------------------
16// AlidNdPtAnalysisPbPbAOD class.
17//
18// Author: P. Luettig, 15.05.2013
19//------------------------------------------------------------------------------
20
21
22#include "AlidNdPtAnalysisPbPbAOD.h"
23
24
25using namespace std;
26
27ClassImp(AlidNdPtAnalysisPbPbAOD)
28
29// dummy constructor
30AlidNdPtAnalysisPbPbAOD::AlidNdPtAnalysisPbPbAOD() : AliAnalysisTaskSE(),
31fOutputList(0),
32// Histograms
33hPt(0),
34hMCPt(0),
35hnZvPtEtaCent(0),
36hnMCRecPrimZvPtEtaCent(0),
37hnMCGenZvPtEtaCent(0),
5747f2c6 38hnMCRecSecZvPtEtaCent(0),
d25bcbe6 39hEventStatistics(0),
40hEventStatisticsCentrality(0),
41hAllEventStatisticsCentrality(0),
fad9b70b 42hEventStatisticsCentralityTrigger(0),
d25bcbe6 43hnZvMultCent(0),
44hTriggerStatistics(0),
45hMCTrackPdgCode(0),
46hMCTrackStatusCode(0),
47hCharge(0),
48hMCCharge(0),
49hMCPdgPt(0),
50hMCHijingPrim(0),
51hAccNclsTPC(0),
52hAccCrossedRowsTPC(0),
5747f2c6 53hDCAPtAll(0),
54hDCAPtAccepted(0),
55hMCDCAPtSecondary(0),
56hMCDCAPtPrimary(0),
d25bcbe6 57//global
58bIsMonteCarlo(0),
59// event cut variables
60dCutMaxZVertex(10.),
61// track kinematic cut variables
62dCutPtMin(0.15),
63dCutPtMax(1000.),
64dCutEtaMin(-0.8),
65dCutEtaMax(0.8),
66// track quality cut variables
67bCutRequireTPCRefit(kTRUE),
68dCutMinNumberOfCrossedRows(120.),
69dCutMinRatioCrossedRowsOverFindableClustersTPC(0.8),
70dCutMaxChi2PerClusterTPC(4.),
71dCutMaxFractionSharedTPCClusters(0.4),
72dCutMaxDCAToVertexZ(3.0),
73dCutMaxDCAToVertexXY(3.0),
74bCutRequireITSRefit(kTRUE),
75dCutMaxChi2PerClusterITS(36.),
76dCutDCAToVertex2D(kFALSE),
77dCutRequireSigmaToVertex(kFALSE),
78dCutMaxDCAToVertexXYPtDepPar0(0.0182),
79dCutMaxDCAToVertexXYPtDepPar1(0.0350),
80dCutMaxDCAToVertexXYPtDepPar2(1.01),
81bCutAcceptKinkDaughters(kFALSE),
82dCutMaxChi2TPCConstrainedGlobal(36.),
83// binning for THnSparse
84fMultNbins(0),
85fPtNbins(0),
86fPtCorrNbins(0),
87fEtaNbins(0),
88fZvNbins(0),
89fCentralityNbins(0),
90fBinsMult(0),
91fBinsPt(0),
92fBinsPtCorr(0),
93fBinsEta(0),
94fBinsZv(0),
95fBinsCentrality(0)
96{
97
98 fMultNbins = 0;
99 fPtNbins = 0;
100 fPtCorrNbins = 0;
101 fEtaNbins = 0;
102 fZvNbins = 0;
103 fCentralityNbins = 0;
104 fBinsMult = 0;
105 fBinsPt = 0;
106 fBinsPtCorr = 0;
107 fBinsEta = 0;
108 fBinsEta = 0;
109 fBinsZv = 0;
110 fBinsCentrality = 0;
111
112}
113
114AlidNdPtAnalysisPbPbAOD::AlidNdPtAnalysisPbPbAOD(const char *name) : AliAnalysisTaskSE(name),
115fOutputList(0),
116// Histograms
117hPt(0),
118hMCPt(0),
119hnZvPtEtaCent(0),
120hnMCRecPrimZvPtEtaCent(0),
121hnMCGenZvPtEtaCent(0),
5747f2c6 122hnMCRecSecZvPtEtaCent(0),
d25bcbe6 123hEventStatistics(0),
124hEventStatisticsCentrality(0),
125hAllEventStatisticsCentrality(0),
fad9b70b 126hEventStatisticsCentralityTrigger(0),
d25bcbe6 127hnZvMultCent(0),
128hTriggerStatistics(0),
129hMCTrackPdgCode(0),
130hMCTrackStatusCode(0),
131hCharge(0),
132hMCCharge(0),
133hMCPdgPt(0),
134hMCHijingPrim(0),
135hAccNclsTPC(0),
136hAccCrossedRowsTPC(0),
5747f2c6 137hDCAPtAll(0),
138hDCAPtAccepted(0),
139hMCDCAPtSecondary(0),
140hMCDCAPtPrimary(0),
d25bcbe6 141//global
142bIsMonteCarlo(0),
143// event cut variables
144dCutMaxZVertex(10.),
145// track kinematic cut variables
146dCutPtMin(0.15),
147dCutPtMax(200.),
148dCutEtaMin(-0.8),
149dCutEtaMax(0.8),
150// track quality cut variables
151bCutRequireTPCRefit(kTRUE),
152dCutMinNumberOfCrossedRows(120.),
153dCutMinRatioCrossedRowsOverFindableClustersTPC(0.8),
154dCutMaxChi2PerClusterTPC(4.),
155dCutMaxFractionSharedTPCClusters(0.4),
156dCutMaxDCAToVertexZ(3.0),
157dCutMaxDCAToVertexXY(3.0),
158bCutRequireITSRefit(kTRUE),
159dCutMaxChi2PerClusterITS(36.),
160dCutDCAToVertex2D(kFALSE),
161dCutRequireSigmaToVertex(kFALSE),
162dCutMaxDCAToVertexXYPtDepPar0(0.0182),
163dCutMaxDCAToVertexXYPtDepPar1(0.0350),
164dCutMaxDCAToVertexXYPtDepPar2(1.01),
165bCutAcceptKinkDaughters(kFALSE),
166dCutMaxChi2TPCConstrainedGlobal(36.),
167// binning for THnSparse
168fMultNbins(0),
169fPtNbins(0),
170fPtCorrNbins(0),
171fEtaNbins(0),
172fZvNbins(0),
173fCentralityNbins(0),
174fBinsMult(0),
175fBinsPt(0),
176fBinsPtCorr(0),
177fBinsEta(0),
178fBinsZv(0),
179fBinsCentrality(0)
180{
181 fMultNbins = 0;
182 fPtNbins = 0;
183 fPtCorrNbins = 0;
184 fEtaNbins = 0;
185 fZvNbins = 0;
186 fCentralityNbins = 0;
187 fBinsMult = 0;
188 fBinsPt = 0;
189 fBinsPtCorr = 0;
190 fBinsEta = 0;
191 fBinsEta = 0;
192 fBinsZv = 0;
193 fBinsCentrality = 0;
194
195 DefineOutput(1, TList::Class());
196}
197
198// destructor
199AlidNdPtAnalysisPbPbAOD::~AlidNdPtAnalysisPbPbAOD()
200{
201 if(hnZvPtEtaCent) delete hnZvPtEtaCent; hnZvPtEtaCent = 0;
202 if(hPt) delete hPt; hPt = 0;
5747f2c6 203 if(hnMCRecPrimZvPtEtaCent) delete hnMCRecPrimZvPtEtaCent; hnMCRecPrimZvPtEtaCent = 0;
204 if(hnMCGenZvPtEtaCent) delete hnMCGenZvPtEtaCent; hnMCGenZvPtEtaCent = 0;
205 if(hnMCRecSecZvPtEtaCent) delete hnMCRecSecZvPtEtaCent; hnMCRecSecZvPtEtaCent = 0;
206 if(hMCPt) delete hMCPt; hMCPt = 0;
207 if(hEventStatistics) delete hEventStatistics; hEventStatistics = 0;
208 if(hEventStatisticsCentrality) delete hEventStatisticsCentrality; hEventStatisticsCentrality = 0;
209 if(hAllEventStatisticsCentrality) delete hAllEventStatisticsCentrality; hAllEventStatisticsCentrality = 0;
210 if(hnZvMultCent) delete hnZvMultCent; hnZvMultCent = 0;
211 if(hTriggerStatistics) delete hTriggerStatistics; hTriggerStatistics = 0;
212 if(hMCTrackPdgCode) delete hMCTrackPdgCode; hMCTrackPdgCode = 0;
213 if(hMCTrackStatusCode) delete hMCTrackStatusCode; hMCTrackStatusCode = 0;
214 if(hCharge) delete hCharge; hCharge = 0;
215 if(hMCCharge) delete hMCCharge; hMCCharge = 0;
216 if(hMCPdgPt) delete hMCPdgPt; hMCPdgPt = 0;
217 if(hMCHijingPrim) delete hMCHijingPrim; hMCHijingPrim = 0;
218 if(hAccNclsTPC) delete hAccNclsTPC; hAccNclsTPC = 0;
219 if(hAccCrossedRowsTPC) delete hAccCrossedRowsTPC; hAccCrossedRowsTPC = 0;
220 if(hDCAPtAll) delete hDCAPtAll; hDCAPtAll = 0;
221 if(hDCAPtAccepted) delete hDCAPtAccepted; hDCAPtAccepted = 0;
222 if(hMCDCAPtSecondary) delete hMCDCAPtSecondary; hMCDCAPtSecondary = 0;
223 if(hMCDCAPtPrimary) delete hMCDCAPtPrimary; hMCDCAPtPrimary = 0;
d25bcbe6 224}
225
226void AlidNdPtAnalysisPbPbAOD::UserCreateOutputObjects()
227{
228 // create all output histograms here
229 OpenFile(1, "RECREATE");
230
231 fOutputList = new TList();
232 fOutputList->SetOwner();
233
234 //define default binning
235 Double_t binsMultDefault[48] = {-0.5, 0.5 , 1.5 , 2.5 , 3.5 , 4.5 , 5.5 , 6.5 , 7.5 , 8.5,9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5,19.5, 20.5, 30.5, 40.5 , 50.5 , 60.5 , 70.5 , 80.5 , 90.5 , 100.5,200.5, 300.5, 400.5, 500.5, 600.5, 700.5, 800.5, 900.5, 1000.5, 2000.5, 3000.5, 4000.5, 5000.5, 6000.5, 7000.5, 8000.5, 9000.5, 10000.5 };
236 Double_t binsPtDefault[82] = {0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0, 22.0, 24.0, 26.0, 28.0, 30.0, 32.0, 34.0, 36.0, 40.0, 45.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0, 180.0, 200.0};
237 Double_t binsPtCorrDefault[37] = {0.,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.2,2.4,2.6,3.0,4.0,200.0};
238 Double_t binsEtaDefault[31] = {-1.5,-1.4,-1.3,-1.2,-1.1,-1.0,-0.9,-0.8,-0.7,-0.6,-0.5,-0.4,-0.3,-0.2,-0.1,0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5};
239 Double_t binsZvDefault[13] = {-30.,-25.,-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.,25.,30.};
240 Double_t binsCentralityDefault[12] = {0., 5., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.};
241
242 // if no binning is set, use the default
243 if (!fBinsMult) { SetBinsMult(48,binsMultDefault); }
244 if (!fBinsPt) { SetBinsPt(82,binsPtDefault); }
245 if (!fBinsPtCorr) { SetBinsPtCorr(37,binsPtCorrDefault); }
246 if (!fBinsEta) { SetBinsEta(31,binsEtaDefault); }
247 if (!fBinsZv) { SetBinsZv(13,binsZvDefault); }
248 if (!fBinsCentrality) { SetBinsCentrality(12,binsCentralityDefault); }
249
250 Int_t binsZvPtEtaCent[4]={fZvNbins-1,fPtNbins-1,fEtaNbins-1,fCentralityNbins-1};
251 Int_t binsZvMultCent[3]={fZvNbins-1,fMultNbins-1,fCentralityNbins-1};
252
253 // define Histograms
254 hnZvPtEtaCent = new THnSparseF("hnZvPtEtaCent","Zv:Pt:Eta:Centrality",4,binsZvPtEtaCent);
255 hnZvPtEtaCent->SetBinEdges(0,fBinsZv);
256 hnZvPtEtaCent->SetBinEdges(1,fBinsPt);
257 hnZvPtEtaCent->SetBinEdges(2,fBinsEta);
258 hnZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
259 hnZvPtEtaCent->GetAxis(0)->SetTitle("Zv (cm)");
260 hnZvPtEtaCent->GetAxis(1)->SetTitle("Pt (GeV/c)");
261 hnZvPtEtaCent->GetAxis(2)->SetTitle("Eta");
262 hnZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
263 hnZvPtEtaCent->Sumw2();
264
265 hnMCRecPrimZvPtEtaCent = new THnSparseF("hnMCRecPrimZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
266 hnMCRecPrimZvPtEtaCent->SetBinEdges(0,fBinsZv);
267 hnMCRecPrimZvPtEtaCent->SetBinEdges(1,fBinsPt);
268 hnMCRecPrimZvPtEtaCent->SetBinEdges(2,fBinsEta);
269 hnMCRecPrimZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
270 hnMCRecPrimZvPtEtaCent->GetAxis(0)->SetTitle("MC Zv (cm)");
271 hnMCRecPrimZvPtEtaCent->GetAxis(1)->SetTitle("MC Pt (GeV/c)");
272 hnMCRecPrimZvPtEtaCent->GetAxis(2)->SetTitle("MC Eta");
273 hnMCRecPrimZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
274 hnMCRecPrimZvPtEtaCent->Sumw2();
275
276 hnMCGenZvPtEtaCent = new THnSparseF("hnMCGenZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
277 hnMCGenZvPtEtaCent->SetBinEdges(0,fBinsZv);
278 hnMCGenZvPtEtaCent->SetBinEdges(1,fBinsPt);
279 hnMCGenZvPtEtaCent->SetBinEdges(2,fBinsEta);
280 hnMCGenZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
281 hnMCGenZvPtEtaCent->GetAxis(0)->SetTitle("MC Zv (cm)");
282 hnMCGenZvPtEtaCent->GetAxis(1)->SetTitle("MC Pt (GeV/c)");
283 hnMCGenZvPtEtaCent->GetAxis(2)->SetTitle("MC Eta");
284 hnMCGenZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
285 hnMCGenZvPtEtaCent->Sumw2();
286
5747f2c6 287 hnMCRecSecZvPtEtaCent = new THnSparseF("hnMCRecSecZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
288 hnMCRecSecZvPtEtaCent->SetBinEdges(0,fBinsZv);
289 hnMCRecSecZvPtEtaCent->SetBinEdges(1,fBinsPt);
290 hnMCRecSecZvPtEtaCent->SetBinEdges(2,fBinsEta);
291 hnMCRecSecZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
292 hnMCRecSecZvPtEtaCent->GetAxis(0)->SetTitle("MC Sec Zv (cm)");
293 hnMCRecSecZvPtEtaCent->GetAxis(1)->SetTitle("MC Sec Pt (GeV/c)");
294 hnMCRecSecZvPtEtaCent->GetAxis(2)->SetTitle("MC Sec Eta");
295 hnMCRecSecZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
296 hnMCRecSecZvPtEtaCent->Sumw2();
d25bcbe6 297
298 hPt = new TH1F("hPt","hPt",2000,0,200);
299 hPt->GetXaxis()->SetTitle("p_{T} (GeV/c)");
300 hPt->GetYaxis()->SetTitle("dN/dp_{T}");
301 hPt->Sumw2();
302
303 hMCPt = new TH1F("hMCPt","hMCPt",2000,0,200);
304 hMCPt->GetXaxis()->SetTitle("MC p_{T} (GeV/c)");
305 hMCPt->GetYaxis()->SetTitle("dN/dp_{T}");
306 hMCPt->Sumw2();
307
308 hEventStatistics = new TH1F("hEventStatistics","hEventStatistics",10,0,10);
309 hEventStatistics->GetYaxis()->SetTitle("number of events");
310 hEventStatistics->SetBit(TH1::kCanRebin);
311
312 hEventStatisticsCentrality = new TH1F("hEventStatisticsCentrality","hEventStatisticsCentrality",fCentralityNbins-1, fBinsCentrality);
313 hEventStatisticsCentrality->GetYaxis()->SetTitle("number of events");
314
315 hAllEventStatisticsCentrality = new TH1F("hAllEventStatisticsCentrality","hAllEventStatisticsCentrality",fCentralityNbins-1, fBinsCentrality);
316 hAllEventStatisticsCentrality->GetYaxis()->SetTitle("number of events");
317
fad9b70b 318 hEventStatisticsCentralityTrigger = new TH2F("hEventStatisticsCentralityTrigger","hEventStatisticsCentralityTrigger;centrality;trigger",100,0,100,3,0,3);
319 hEventStatisticsCentralityTrigger->Sumw2();
320
d25bcbe6 321 hnZvMultCent = new THnSparseF("hnZvMultCent","Zv:mult:Centrality",3,binsZvMultCent);
322 hnZvMultCent->SetBinEdges(0,fBinsZv);
323 hnZvMultCent->SetBinEdges(1,fBinsMult);
324 hnZvMultCent->SetBinEdges(2,fBinsCentrality);
325 hnZvMultCent->GetAxis(0)->SetTitle("Zv (cm)");
326 hnZvMultCent->GetAxis(1)->SetTitle("N_{acc}");
327 hnZvMultCent->GetAxis(2)->SetTitle("Centrality");
328 hnZvMultCent->Sumw2();
329
330 hTriggerStatistics = new TH1F("hTriggerStatistics","hTriggerStatistics",10,0,10);
331 hTriggerStatistics->GetYaxis()->SetTitle("number of events");
332
333 hMCTrackPdgCode = new TH1F("hMCTrackPdgCode","hMCTrackPdgCode",100,0,10);
334 hMCTrackPdgCode->GetYaxis()->SetTitle("number of tracks");
335 hMCTrackPdgCode->SetBit(TH1::kCanRebin);
336
337 hMCTrackStatusCode = new TH1F("hMCTrackStatusCode","hMCTrackStatusCode",100,0,10);
338 hMCTrackStatusCode->GetYaxis()->SetTitle("number of tracks");
339 hMCTrackStatusCode->SetBit(TH1::kCanRebin);
340
341 hCharge = new TH1F("hCharge","hCharge",30, -5, 5);
342 hCharge->GetXaxis()->SetTitle("Charge");
343 hCharge->GetYaxis()->SetTitle("number of tracks");
344
345 hMCCharge = new TH1F("hMCCharge","hMCCharge",30, -5, 5);
346 hMCCharge->GetXaxis()->SetTitle("MC Charge");
347 hMCCharge->GetYaxis()->SetTitle("number of tracks");
348
349 hMCPdgPt = new TH2F("hMCPdgPt","hMCPdgPt",fPtNbins-1, fBinsPt, 100,0,100);
350 hMCPdgPt->GetYaxis()->SetTitle("particle");
351 hMCPdgPt->GetXaxis()->SetTitle("Pt (GeV/c)");
352
353 hMCHijingPrim = new TH1F("hMCHijingPrim","hMCHijingPrim",2,0,2);
354 hMCPdgPt->GetYaxis()->SetTitle("number of particles");
355
356 hAccNclsTPC = new TH1F("hAccNclsTPC","hAccNclsTPC",160,0,159);
357 hAccNclsTPC->GetXaxis()->SetTitle("number of clusters per track after cut");
358
359 hAccCrossedRowsTPC = new TH1F("hAccCrossedRowsTPC","hAccCrossedRowsTPC",160,0,159);
360 hAccCrossedRowsTPC->GetXaxis()->SetTitle("number of crossed rows per track after cut");
361
d0483ba3 362 Int_t binsDCAxyDCAzPt[3] = { 200,200, fPtNbins-1};
fad9b70b 363 Double_t minDCAxyDCAzPt[3] = { -5, -5, 0};
364 Double_t maxDCAxyDCAzPt[3] = { 5., 5., 100};
d0483ba3 365
fad9b70b 366 hDCAPtAll = new THnSparseF("hDCAPtAll","hDCAPtAll",3, binsDCAxyDCAzPt, minDCAxyDCAzPt, maxDCAxyDCAzPt);
367 hDCAPtAccepted = new THnSparseF("hDCAPtAccepted","hDCAPtAccepted",3, binsDCAxyDCAzPt, minDCAxyDCAzPt, maxDCAxyDCAzPt);
368 hMCDCAPtSecondary = new THnSparseF("hMCDCAPtSecondary","hMCDCAPtSecondary",3, binsDCAxyDCAzPt, minDCAxyDCAzPt, maxDCAxyDCAzPt);
369 hMCDCAPtPrimary = new THnSparseF("hMCDCAPtPrimary","hMCDCAPtPrimary",3, binsDCAxyDCAzPt, minDCAxyDCAzPt, maxDCAxyDCAzPt);
d0483ba3 370
371 hDCAPtAll->SetBinEdges(2, fBinsPt);
372 hDCAPtAccepted->SetBinEdges(2, fBinsPt);
373 hMCDCAPtSecondary->SetBinEdges(2, fBinsPt);
374 hMCDCAPtPrimary->SetBinEdges(2, fBinsPt);
d25bcbe6 375
fad9b70b 376 hDCAPtAll->Sumw2();
377 hDCAPtAccepted->Sumw2();
378 hMCDCAPtSecondary->Sumw2();
379 hMCDCAPtPrimary->Sumw2();
380
381 hDCAPtAll->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
382 hDCAPtAll->GetAxis(1)->SetTitle("DCA_{z} (cm)");
383 hDCAPtAll->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
384
385 hDCAPtAccepted->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
386 hDCAPtAccepted->GetAxis(1)->SetTitle("DCA_{z} (cm)");
387 hDCAPtAccepted->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
388
389 hMCDCAPtSecondary->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
390 hMCDCAPtSecondary->GetAxis(1)->SetTitle("DCA_{z} (cm)");
391 hMCDCAPtSecondary->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
392
393 hMCDCAPtPrimary->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
394 hMCDCAPtPrimary->GetAxis(1)->SetTitle("DCA_{z} (cm)");
395 hMCDCAPtPrimary->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
396
d25bcbe6 397 // Add Histos, Profiles etc to List
398 fOutputList->Add(hnZvPtEtaCent);
399 fOutputList->Add(hPt);
400 fOutputList->Add(hnMCRecPrimZvPtEtaCent);
401 fOutputList->Add(hnMCGenZvPtEtaCent);
5747f2c6 402 fOutputList->Add(hnMCRecSecZvPtEtaCent);
d25bcbe6 403 fOutputList->Add(hMCPt);
404 fOutputList->Add(hEventStatistics);
405 fOutputList->Add(hEventStatisticsCentrality);
406 fOutputList->Add(hAllEventStatisticsCentrality);
fad9b70b 407 fOutputList->Add(hEventStatisticsCentralityTrigger);
d25bcbe6 408 fOutputList->Add(hnZvMultCent);
409 fOutputList->Add(hTriggerStatistics);
410 fOutputList->Add(hMCTrackPdgCode);
411 fOutputList->Add(hMCTrackStatusCode);
412 fOutputList->Add(hCharge);
413 fOutputList->Add(hMCCharge);
414 fOutputList->Add(hMCPdgPt);
415 fOutputList->Add(hMCHijingPrim);
416 fOutputList->Add(hAccNclsTPC);
417 fOutputList->Add(hAccCrossedRowsTPC);
5747f2c6 418 fOutputList->Add(hDCAPtAll);
419 fOutputList->Add(hDCAPtAccepted);
420 fOutputList->Add(hMCDCAPtSecondary);
421 fOutputList->Add(hMCDCAPtPrimary);
fad9b70b 422
d25bcbe6 423
424 PostData(1, fOutputList);
425}
426
427void AlidNdPtAnalysisPbPbAOD::UserExec(Option_t *option)
428{
f856053f 429
d25bcbe6 430 // Main Loop
431 // called for each event
432 hEventStatistics->Fill("all events",1);
433
434 // set ZERO pointers:
435 AliInputEventHandler *inputHandler = NULL;
436 AliAODTrack *track = NULL;
437 AliAODMCParticle *mcPart = NULL;
438 AliAODMCHeader *mcHdr = NULL;
439 AliGenHijingEventHeader *genHijingHeader = NULL;
440 AliGenPythiaEventHeader *genPythiaHeader = NULL;
441
442 Bool_t bIsEventSelectedMB = kFALSE;
443 Bool_t bIsEventSelectedSemi = kFALSE;
444 Bool_t bIsEventSelectedCentral = kFALSE;
445 Bool_t bIsEventSelected = kFALSE;
446 Bool_t bIsPrimary = kFALSE;
447 Bool_t bIsHijingParticle = kFALSE;
448 Bool_t bIsPythiaParticle = kFALSE;
449 Bool_t bEventHasATrack = kFALSE;
450 Bool_t bEventHasATrackInRange = kFALSE;
451 Int_t nTriggerFired = 0;
452
453
454 Double_t dMCTrackZvPtEtaCent[4] = {0};
455 Double_t dTrackZvPtEtaCent[4] = {0};
456
457 Double_t dMCEventZv = -100;
458 Double_t dEventZv = -100;
459 Int_t iAcceptedMultiplicity = 0;
460
461 bIsMonteCarlo = kFALSE;
462
463 AliAODEvent *eventAOD = 0x0;
464 eventAOD = dynamic_cast<AliAODEvent*>( InputEvent() );
465 if (!eventAOD) {
466 AliWarning("ERROR: eventAOD not available \n");
467 return;
468 }
469
470 // check, which trigger has been fired
471 inputHandler = (AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
472 bIsEventSelectedMB = ( inputHandler->IsEventSelected() & AliVEvent::kMB);
473 bIsEventSelectedSemi = ( inputHandler->IsEventSelected() & AliVEvent::kSemiCentral);
474 bIsEventSelectedCentral = ( inputHandler->IsEventSelected() & AliVEvent::kCentral);
475
476 if(bIsEventSelectedMB || bIsEventSelectedSemi || bIsEventSelectedCentral) hTriggerStatistics->Fill("all triggered events",1);
477 if(bIsEventSelectedMB) { hTriggerStatistics->Fill("MB trigger",1); nTriggerFired++; }
478 if(bIsEventSelectedSemi) { hTriggerStatistics->Fill("SemiCentral trigger",1); nTriggerFired++; }
479 if(bIsEventSelectedCentral) { hTriggerStatistics->Fill("Central trigger",1); nTriggerFired++; }
480 if(nTriggerFired == 0) { hTriggerStatistics->Fill("No trigger",1); }
481
482 bIsEventSelected = ( inputHandler->IsEventSelected() & GetCollisionCandidates() );
483
484 // only take tracks of events, which are triggered
485 if(nTriggerFired == 0) { return; }
486
487 // if( !bIsEventSelected || nTriggerFired>1 ) return;
488
489 // hEventStatistics->Fill("events with only coll. cand.", 1);
490
491
492
493 // check if there is a stack, if yes, then do MC loop
494 TList *list = eventAOD->GetList();
495 TClonesArray *stack = 0x0;
496 stack = (TClonesArray*)list->FindObject(AliAODMCParticle::StdBranchName());
497
498 if( stack )
499 {
500 bIsMonteCarlo = kTRUE;
501
502 mcHdr = (AliAODMCHeader*)list->FindObject(AliAODMCHeader::StdBranchName());
503
504 genHijingHeader = GetHijingEventHeader(mcHdr);
505 // genPythiaHeader = GetPythiaEventHeader(mcHdr);
506
507 if(!genHijingHeader) { return; }
508
509 // if(!genPythiaHeader) { return; }
510
511 dMCEventZv = mcHdr->GetVtxZ();
512 dMCTrackZvPtEtaCent[0] = dMCEventZv;
513 hEventStatistics->Fill("MC all events",1);
514 }
515
516 AliCentrality* aCentrality = eventAOD->GetCentrality();
517 Double_t dCentrality = aCentrality->GetCentralityPercentile("V0M");
518
519 if( dCentrality < 0 ) return;
520 hEventStatistics->Fill("after centrality selection",1);
521
522
523
524 // start with MC truth analysis
525 if(bIsMonteCarlo)
526 {
527
528 if( dMCEventZv > dCutMaxZVertex ) { return; }
529
530 dMCTrackZvPtEtaCent[0] = dMCEventZv;
531
532 hEventStatistics->Fill("MC afterZv cut",1);
533
534 for(Int_t iMCtrack = 0; iMCtrack < stack->GetEntriesFast(); iMCtrack++)
535 {
536 mcPart =(AliAODMCParticle*)stack->At(iMCtrack);
537
538 // check for charge
539 if( !(IsMCTrackAccepted(mcPart)) ) continue;
540
541 if(!IsHijingParticle(mcPart, genHijingHeader)) { continue; }
542
543 if(mcPart->IsPhysicalPrimary() )
544 {
545 hMCHijingPrim->Fill("IsPhysicalPrimary",1);
546 }
547 else
548 {
549 hMCHijingPrim->Fill("NOT a primary",1);
550 continue;
551 }
552
d0483ba3 553
d25bcbe6 554 //
555 // ======================== fill histograms ========================
556 dMCTrackZvPtEtaCent[1] = mcPart->Pt();
557 dMCTrackZvPtEtaCent[2] = mcPart->Eta();
558 dMCTrackZvPtEtaCent[3] = dCentrality;
559
560 bEventHasATrack = kTRUE;
561
562 hnMCGenZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
563
564 if( (dMCTrackZvPtEtaCent[1] > dCutPtMin) &&
565 (dMCTrackZvPtEtaCent[1] < dCutPtMax) &&
566 (dMCTrackZvPtEtaCent[2] > dCutEtaMin) &&
567 (dMCTrackZvPtEtaCent[2] < dCutEtaMax) )
568 {
569 hMCPt->Fill(mcPart->Pt());
570 hMCCharge->Fill(mcPart->Charge()/3.);
571 bEventHasATrackInRange = kTRUE;
572 }
573
574 }
575 } // isMonteCarlo
576 if(bEventHasATrack) { hEventStatistics->Fill("MC events with tracks",1); }
577 if(bEventHasATrackInRange) { hEventStatistics->Fill("MC events with tracks in range",1); }
578 bEventHasATrack = kFALSE;
579 bEventHasATrackInRange = kFALSE;
580
581
582
583 // Loop over recontructed tracks
584
585 dEventZv = eventAOD->GetPrimaryVertex()->GetZ();
586 if( TMath::Abs(dEventZv) > dCutMaxZVertex ) return;
587
588 hAllEventStatisticsCentrality->Fill(dCentrality/*, nTriggerFired*/);
589
590 hEventStatistics->Fill("after Zv cut",1);
591
592 dTrackZvPtEtaCent[0] = dEventZv;
593
594 for(Int_t itrack = 0; itrack < eventAOD->GetNumberOfTracks(); itrack++)
595 {
596 track = eventAOD->GetTrack(itrack);
597 if(!track) continue;
598
599 mcPart = NULL;
600 dMCTrackZvPtEtaCent[1] = 0;
601 dMCTrackZvPtEtaCent[2] = 0;
602 dMCTrackZvPtEtaCent[3] = 0;
603
604 bIsPrimary = kFALSE;
605
d0483ba3 606 Double_t dDCAxyDCAzPt[3] = { GetDCAxy(track, eventAOD), GetDCAz(track, eventAOD), track->Pt() };
607
608 hDCAPtAll->Fill(dDCAxyDCAzPt);
609
d25bcbe6 610 if( !(IsTrackAccepted(track)) ) continue;
611
5747f2c6 612 dTrackZvPtEtaCent[1] = track->Pt();
613 dTrackZvPtEtaCent[2] = track->Eta();
614 dTrackZvPtEtaCent[3] = dCentrality;
615
d25bcbe6 616 if( bIsMonteCarlo )
617 {
618 mcPart = (AliAODMCParticle*)stack->At(TMath::Abs(track->GetLabel()));
619 if( !mcPart ) { continue; }
620
621 // check for charge
622 if( !(IsMCTrackAccepted(mcPart)) ) { continue; }
623
624 bIsHijingParticle = IsHijingParticle(mcPart, genHijingHeader);
625 // bIsPythiaParticle = IsPythiaParticle(mcPart, genPythiaHeader);
626
627 // if(!bIsHijingParticle) continue; // only take real tracks, not injected ones
628
629 bIsPrimary = mcPart->IsPhysicalPrimary();
630
631 dMCTrackZvPtEtaCent[1] = mcPart->Pt();
632 dMCTrackZvPtEtaCent[2] = mcPart->Eta();
633 dMCTrackZvPtEtaCent[3] = dCentrality;
634
635 if(bIsPrimary && bIsHijingParticle)
636 {
d0483ba3 637 hnMCRecPrimZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
638 hMCDCAPtPrimary->Fill(dDCAxyDCAzPt);
d25bcbe6 639 }
640
641 if(!bIsPrimary /*&& !bIsHijingParticle*/)
642 {
643 Int_t indexMoth = mcPart->GetMother();
644 if(indexMoth >= 0)
645 {
646 AliAODMCParticle* moth = (AliAODMCParticle*)stack->At(indexMoth);
647 Bool_t bMotherIsHijingParticle = IsHijingParticle(moth, genHijingHeader);
648
649 if(bMotherIsHijingParticle) // only store secondaries, which come from a not embedded signal!
650 {
651 hMCTrackStatusCode->Fill(Form("%d",mcPart->GetStatus()), 1);
652 if(TMath::Abs(mcPart->Eta()) < 0.8) { hMCPdgPt->Fill(mcPart->Pt(), Form("%s",GetParticleName(mcPart->GetPdgCode())), 1); }
653
d0483ba3 654 hnMCRecSecZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
655 hMCDCAPtSecondary->Fill(dDCAxyDCAzPt);
d25bcbe6 656 hMCTrackPdgCode->Fill(Form("%s_H%i_H%i",GetParticleName(moth->GetPdgCode()),bMotherIsHijingParticle, bIsHijingParticle), 1);
657 // delete moth;
658 }
659 }
660 }
661 } // end isMonteCarlo
662
663 // ======================== fill histograms ========================
664
d0483ba3 665 // if(bIsMonteCarlo && !bIsHijingParticle)
666 // {
667 // continue; //only store reco tracks, which do not come from embedded signal
668 // }
669
670
671
672 bEventHasATrack = kTRUE;
673
674 hnZvPtEtaCent->Fill(dTrackZvPtEtaCent);
675 hDCAPtAccepted->Fill(dDCAxyDCAzPt);
676
677 if( (dTrackZvPtEtaCent[1] > dCutPtMin) &&
678 (dTrackZvPtEtaCent[1] < dCutPtMax) &&
679 (dTrackZvPtEtaCent[2] > dCutEtaMin) &&
680 (dTrackZvPtEtaCent[2] < dCutEtaMax) )
681 {
682 iAcceptedMultiplicity++;
683 bEventHasATrackInRange = kTRUE;
684 hPt->Fill(track->Pt());
685 hCharge->Fill(track->Charge());
686 }
d25bcbe6 687 } // end track loop
688
689 if(bEventHasATrack) { hEventStatistics->Fill("events with tracks",1); bEventHasATrack = kFALSE; }
690
691 if(bEventHasATrackInRange)
692 {
693 hEventStatistics->Fill("events with tracks in range",1);
694 hEventStatisticsCentrality->Fill(dCentrality);
695 bEventHasATrackInRange = kFALSE;
fad9b70b 696
697 if(bIsEventSelectedMB) hEventStatisticsCentralityTrigger->Fill(dCentrality, 0);
698 if(bIsEventSelectedSemi) hEventStatisticsCentralityTrigger->Fill(dCentrality, 1);
699 if(bIsEventSelectedCentral) hEventStatisticsCentralityTrigger->Fill(dCentrality, 2);
d25bcbe6 700 }
701
702 Double_t dEventZvMultCent[3] = {dEventZv, iAcceptedMultiplicity, dCentrality};
703 hnZvMultCent->Fill(dEventZvMultCent);
704
705
706
707 PostData(1, fOutputList);
708
709}
710
711Bool_t AlidNdPtAnalysisPbPbAOD::IsTrackAccepted(AliAODTrack *tr)
712{
713 if(!tr) return kFALSE;
714
715 if(tr->Charge()==0) { return kFALSE; }
716
717 if(!(tr->TestFilterBit(AliAODTrack::kTrkGlobal)) ) { return kFALSE; }
718
d25bcbe6 719 Double_t dNClustersTPC = tr->GetTPCNcls();
720 Double_t dCrossedRowsTPC = tr->GetTPCClusterInfo(2,1);
721
f856053f 722 if(dCrossedRowsTPC < GetCutMinNCrossedRowsTPC()) { return kFALSE; }
d0483ba3 723
d25bcbe6 724 hAccNclsTPC->Fill(dNClustersTPC);
725 hAccCrossedRowsTPC->Fill(dCrossedRowsTPC);
726 // Double_t dFindableClustersTPC = tr->GetTPCNclsF();
727 // Double_t dChi2PerClusterTPC = (dNClustersTPC>0)?tr->Chi2perNDF()*(dNClustersTPC-5)/dNClustersTPC:-1.; // see AliDielectronVarManager.h
728 //
729 // Bool_t bIsFromKink = kFALSE;
730 // if(tr->GetProdVertex()->GetType() == AliAODVertex::kKink) bIsFromKink = kTRUE;
731 //
732 // // from AliAnalysisTaskPIDqa.cxx
733 // ULong_t uStatus = tr->GetStatus();
734 // Bool_t bHasRefitTPC = kFALSE;
735 // Bool_t bHasRefitITS = kFALSE;
736 //
737 // if ((uStatus & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) bHasRefitTPC = kTRUE;
738 // if ((uStatus & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) bHasRefitITS = kTRUE;
739 //
740 // // from AliDielectronVarManager.h
741 // Bool_t bHasHitInSPD = kFALSE;
742 // for (Int_t iC=0; iC<2; iC++)
743 // {
744 // if (((tr->GetITSClusterMap()) & (1<<(iC))) > 0) { bHasHitInSPD = kTRUE; }
745 // }
746 //
747 // Double_t dNClustersITS = tr->GetITSNcls();
748
749 // cuts to be done:
750 // TPC
751 // esdTrackCuts->SetMinNCrossedRowsTPC(70);
752 // esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
753 //
754 // esdTrackCuts->SetMaxChi2PerClusterTPC(4);
755 // esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
756 // esdTrackCuts->SetRequireTPCRefit(kTRUE);
757 // ITS
758 // esdTrackCuts->SetRequireITSRefit(kTRUE);
759 // esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
760 //
761 // esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
762 // esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
763 //
764 // esdTrackCuts->SetMaxDCAToVertexZ(2);
765 // esdTrackCuts->SetDCAToVertex2D(kFALSE);
766 // esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
767 //
768 // esdTrackCuts->SetMaxChi2PerClusterITS(36);
769
770
771 return kTRUE;
772}
773
d0483ba3 774Double_t AlidNdPtAnalysisPbPbAOD::GetDCAz(AliAODTrack *track, AliAODEvent *event)
775{
776 return GetDCA(track, event, kTRUE);
777}
778
779Double_t AlidNdPtAnalysisPbPbAOD::GetDCAxy(AliAODTrack *track, AliAODEvent *event)
780{
781 return GetDCA(track, event, kFALSE);
782}
783
784Double_t AlidNdPtAnalysisPbPbAOD::GetDCA(AliAODTrack *tr, AliAODEvent *evt, Bool_t bDCAz)
785{
786 if(!tr) return -999.;
787
788 if(tr->TestBit(AliAODTrack::kIsDCA))
789 {
790 if(bDCAz) return tr->ZAtDCA();
791 else return sqrt(tr->XAtDCA()*tr->XAtDCA() + tr->YAtDCA()*tr->YAtDCA());
792 }
793
794 Bool_t ok=kFALSE;
795 Double_t d0z0[2];
796 if(evt)
797 {
798 Double_t covd0z0[3];
799
800 AliExternalTrackParam etp;
801 etp.CopyFromVTrack(tr);
802
803 Float_t xstart = etp.GetX();
804 if(xstart>3.)
805 {
806 d0z0[0]=-999.;
807 d0z0[1]=-999.;
808 //printf("This method can be used only for propagation inside the beam pipe \n");
809 if(bDCAz) return d0z0[1];
810 else return d0z0[0];
811 }
fad9b70b 812
d0483ba3 813 AliAODVertex *vtx =(AliAODVertex*)(evt->GetPrimaryVertex());
814 Double_t fBzkG = evt->GetMagneticField(); // z componenent of field in kG
815 ok = etp.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0);
816 }
fad9b70b 817
d0483ba3 818 if(!ok){
819 d0z0[0]=-999.;
820 d0z0[1]=-999.;
821 if(bDCAz) return d0z0[1];
822 else return d0z0[0];
823 }
824 if(bDCAz) return d0z0[1];
825 else return d0z0[0];
826}
827
d25bcbe6 828Bool_t AlidNdPtAnalysisPbPbAOD::IsMCTrackAccepted(AliAODMCParticle *part)
829{
830 if(!part) return kFALSE;
831
832 Double_t charge = part->Charge()/3.;
833 if (TMath::Abs(charge) < 0.001) return kFALSE;
834
835 return kTRUE;
836}
837
838const char * AlidNdPtAnalysisPbPbAOD::GetParticleName(Int_t pdg)
839{
840 TParticlePDG * p1 = TDatabasePDG::Instance()->GetParticle(pdg);
841 if(p1) return p1->GetName();
842 return Form("%d", pdg);
843}
844
845AliGenHijingEventHeader* AlidNdPtAnalysisPbPbAOD::GetHijingEventHeader(AliAODMCHeader *header)
846{
847 //
848 // inspired by PWGJE/AliPWG4HighPtSpectra.cxx
849 //
850
851 if(!header) return 0x0;
852 AliGenHijingEventHeader* hijingGenHeader = NULL;
853
854 TList* headerList = header->GetCocktailHeaders();
855
856 for(Int_t i = 0; i < headerList->GetEntries(); i++)
857 {
858 hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(headerList->At(i));
859 if(hijingGenHeader) break;
860 }
861
862 if(!hijingGenHeader) return 0x0;
863
864 return hijingGenHeader;
865}
866
867AliGenPythiaEventHeader* AlidNdPtAnalysisPbPbAOD::GetPythiaEventHeader(AliAODMCHeader *header)
868{
869 //
870 // inspired by PWGJE/AliPWG4HighPtSpectra.cxx
871 //
872
873 if(!header) return 0x0;
874 AliGenPythiaEventHeader* PythiaGenHeader = NULL;
875
876 TList* headerList = header->GetCocktailHeaders();
877
878 for(Int_t i = 0; i < headerList->GetEntries(); i++)
879 {
880 PythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(i));
881 if(PythiaGenHeader) break;
882 }
883
884 if(!PythiaGenHeader) return 0x0;
885
886 return PythiaGenHeader;
887}
888
889//________________________________________________________________________
890Bool_t AlidNdPtAnalysisPbPbAOD::IsHijingParticle(const AliAODMCParticle *part, AliGenHijingEventHeader* hijingGenHeader){
891
892 // Check whether a particle is from Hijing or some injected
893
894 if(part->Label() > (hijingGenHeader->NProduced()-1)) return kFALSE;
895 return kTRUE;
896}
897
898//________________________________________________________________________
899Bool_t AlidNdPtAnalysisPbPbAOD::IsPythiaParticle(const AliAODMCParticle *part, AliGenPythiaEventHeader* pythiaGenHeader){
900
901 // Check whether a particle is from Pythia or some injected
902
903 if(part->Label() > (pythiaGenHeader->NProduced()-1)) return kFALSE;
904 return kTRUE;
905}
906
5747f2c6 907// Int_t AlidNdPtAnalysisPbPbAOD::IsMCSecondary(AliAODMCParticle *part, TClonesArray *arrayMC)
908// {
d0483ba3 909 // //
910 // // adapted from AliAnalysisTaskSpectraAOD.cxx
911 // //
912 // // returns
913 // // -1: no particle
914 // // 0: is primary
915 // // 1: is secondary from weak
916 // // 2: is secondary from material
917 //
918 // // usage for studies, currrently not implemented
919 //
920 // if(!part) return -1;
921 //
922 // if( part->IsPhysicalPrimary() ) return 0;
923 //
924 // Bool_t isSecondaryMaterial = kFALSE;
925 // Bool_t isSecondaryWeak = kFALSE;
926 // Int_t mfl = -999;
927 // Int_t codemoth = -999;
928 // Int_t indexMoth = part->GetMother(); // FIXME ignore fakes? TO BE CHECKED, on ESD is GetFirstMother()
929 // if(indexMoth >= 0)
930 // {
931 // AliAODMCParticle* moth = (AliAODMCParticle*) arrayMC->At(indexMoth);
932 // codemoth = TMath::Abs(moth->GetPdgCode());
933 // mfl = Int_t (codemoth/ TMath::Power(10, Int_t(TMath::Log10(codemoth))));
934 // }
935 // // add if(partMC->GetStatus() & kPDecay)? FIXME
936 // if(mfl==3) isSecondaryWeak = kTRUE;
937 // else isSecondaryMaterial = kTRUE;
938 //
939 // if(isSecondaryWeak) return 1;
940 // if(isSecondaryMaterial) return 2;
941 //
942 // // if( isSecondaryMaterial || isSecondaryWeak ) return kTRUE;
943 //
944 // // return kFALSE; this line will not be reached, as either isSecondaryMaterial or isSecondaryWeak is true!
945 // // removed due to coverity
946 // }
947
948
949
950 void AlidNdPtAnalysisPbPbAOD::Terminate(Option_t *)
951 {
952
953 }
954
955 Double_t* AlidNdPtAnalysisPbPbAOD::GetArrayClone(Int_t n, Double_t* source)
956 {
957 if (!source || n==0) return 0;
958 Double_t* dest = new Double_t[n];
959 for (Int_t i=0; i<n ; i++) { dest[i] = source[i]; }
960 return dest;
961 }
962