1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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.
18 // Author: P. Luettig, 15.05.2013
19 //------------------------------------------------------------------------------
22 #include "AlidNdPtAnalysisPbPbAOD.h"
27 ClassImp(AlidNdPtAnalysisPbPbAOD)
30 AlidNdPtAnalysisPbPbAOD::AlidNdPtAnalysisPbPbAOD() : AliAnalysisTaskSE(),
36 hnMCRecPrimZvPtEtaCent(0),
37 hnMCGenZvPtEtaCent(0),
38 hnMCRecSecZvPtEtaCent(0),
40 hEventStatisticsCentrality(0),
41 hMCEventStatisticsCentrality(0),
42 hAllEventStatisticsCentrality(0),
43 hEventStatisticsCentralityTrigger(0),
45 hTriggerStatistics(0),
47 hMCTrackStatusCode(0),
56 hnCrossedRowsClustersChiPtEtaPhiAll(0),
57 hnCrossedRowsClustersChiPtEtaPhiAcc(0),
60 // event cut variables
62 // track kinematic cut variables
67 // track quality cut variables
68 bCutRequireTPCRefit(kTRUE),
69 dCutMinNumberOfCrossedRows(120.),
70 dCutMinRatioCrossedRowsOverFindableClustersTPC(0.8),
71 dCutMaxChi2PerClusterTPC(4.),
72 dCutMaxFractionSharedTPCClusters(0.4),
73 dCutMaxDCAToVertexZ(3.0),
74 dCutMaxDCAToVertexXY(3.0),
75 bCutRequireITSRefit(kTRUE),
76 dCutMaxChi2PerClusterITS(36.),
77 dCutDCAToVertex2D(kFALSE),
78 dCutRequireSigmaToVertex(kFALSE),
79 dCutMaxDCAToVertexXYPtDepPar0(0.0182),
80 dCutMaxDCAToVertexXYPtDepPar1(0.0350),
81 dCutMaxDCAToVertexXYPtDepPar2(1.01),
82 bCutAcceptKinkDaughters(kFALSE),
83 dCutMaxChi2TPCConstrainedGlobal(36.),
84 // binning for THnSparse
104 fCentralityNbins = 0;
115 AlidNdPtAnalysisPbPbAOD::AlidNdPtAnalysisPbPbAOD(const char *name) : AliAnalysisTaskSE(name),
121 hnMCRecPrimZvPtEtaCent(0),
122 hnMCGenZvPtEtaCent(0),
123 hnMCRecSecZvPtEtaCent(0),
125 hEventStatisticsCentrality(0),
126 hMCEventStatisticsCentrality(0),
127 hAllEventStatisticsCentrality(0),
128 hEventStatisticsCentralityTrigger(0),
130 hTriggerStatistics(0),
132 hMCTrackStatusCode(0),
139 hMCDCAPtSecondary(0),
141 hnCrossedRowsClustersChiPtEtaPhiAll(0),
142 hnCrossedRowsClustersChiPtEtaPhiAcc(0),
145 // event cut variables
147 // track kinematic cut variables
152 // track quality cut variables
153 bCutRequireTPCRefit(kTRUE),
154 dCutMinNumberOfCrossedRows(120.),
155 dCutMinRatioCrossedRowsOverFindableClustersTPC(0.8),
156 dCutMaxChi2PerClusterTPC(4.),
157 dCutMaxFractionSharedTPCClusters(0.4),
158 dCutMaxDCAToVertexZ(3.0),
159 dCutMaxDCAToVertexXY(3.0),
160 bCutRequireITSRefit(kTRUE),
161 dCutMaxChi2PerClusterITS(36.),
162 dCutDCAToVertex2D(kFALSE),
163 dCutRequireSigmaToVertex(kFALSE),
164 dCutMaxDCAToVertexXYPtDepPar0(0.0182),
165 dCutMaxDCAToVertexXYPtDepPar1(0.0350),
166 dCutMaxDCAToVertexXYPtDepPar2(1.01),
167 bCutAcceptKinkDaughters(kFALSE),
168 dCutMaxChi2TPCConstrainedGlobal(36.),
169 // binning for THnSparse
188 fCentralityNbins = 0;
197 DefineOutput(1, TList::Class());
201 AlidNdPtAnalysisPbPbAOD::~AlidNdPtAnalysisPbPbAOD()
204 if(hnZvPtEtaCent) delete hnZvPtEtaCent; hnZvPtEtaCent = 0;
205 if(hPt) delete hPt; hPt = 0;
206 if(hnMCRecPrimZvPtEtaCent) delete hnMCRecPrimZvPtEtaCent; hnMCRecPrimZvPtEtaCent = 0;
207 if(hnMCGenZvPtEtaCent) delete hnMCGenZvPtEtaCent; hnMCGenZvPtEtaCent = 0;
208 if(hnMCRecSecZvPtEtaCent) delete hnMCRecSecZvPtEtaCent; hnMCRecSecZvPtEtaCent = 0;
209 if(hMCPt) delete hMCPt; hMCPt = 0;
210 if(hEventStatistics) delete hEventStatistics; hEventStatistics = 0;
211 if(hEventStatisticsCentrality) delete hEventStatisticsCentrality; hEventStatisticsCentrality = 0;
212 if(hMCEventStatisticsCentrality) delete hMCEventStatisticsCentrality; hMCEventStatisticsCentrality = 0;
213 if(hAllEventStatisticsCentrality) delete hAllEventStatisticsCentrality; hAllEventStatisticsCentrality = 0;
214 if(hEventStatisticsCentralityTrigger) delete hEventStatisticsCentralityTrigger; hEventStatisticsCentralityTrigger = 0;
215 if(hnZvMultCent) delete hnZvMultCent; hnZvMultCent = 0;
216 if(hTriggerStatistics) delete hTriggerStatistics; hTriggerStatistics = 0;
217 if(hMCTrackPdgCode) delete hMCTrackPdgCode; hMCTrackPdgCode = 0;
218 if(hMCTrackStatusCode) delete hMCTrackStatusCode; hMCTrackStatusCode = 0;
219 if(hCharge) delete hCharge; hCharge = 0;
220 if(hMCCharge) delete hMCCharge; hMCCharge = 0;
221 if(hMCPdgPt) delete hMCPdgPt; hMCPdgPt = 0;
222 if(hMCHijingPrim) delete hMCHijingPrim; hMCHijingPrim = 0;
223 if(hDCAPtAll) delete hDCAPtAll; hDCAPtAll = 0;
224 if(hDCAPtAccepted) delete hDCAPtAccepted; hDCAPtAccepted = 0;
225 if(hMCDCAPtSecondary) delete hMCDCAPtSecondary; hMCDCAPtSecondary = 0;
226 if(hMCDCAPtPrimary) delete hMCDCAPtPrimary; hMCDCAPtPrimary = 0;
227 if(hMCDCAPtSecondary) delete hMCDCAPtSecondary; hMCDCAPtSecondary = 0;
228 if(hMCDCAPtPrimary) delete hMCDCAPtPrimary; hMCDCAPtPrimary = 0;
229 if(hnCrossedRowsClustersChiPtEtaPhiAll) delete hnCrossedRowsClustersChiPtEtaPhiAll; hnCrossedRowsClustersChiPtEtaPhiAll = 0;
230 if(hnCrossedRowsClustersChiPtEtaPhiAcc) delete hnCrossedRowsClustersChiPtEtaPhiAcc; hnCrossedRowsClustersChiPtEtaPhiAcc = 0;
233 void AlidNdPtAnalysisPbPbAOD::UserCreateOutputObjects()
235 // create all output histograms here
236 OpenFile(1, "RECREATE");
238 fOutputList = new TList();
239 fOutputList->SetOwner();
241 //define default binning
242 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 };
243 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};
244 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};
245 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};
246 Double_t binsZvDefault[13] = {-30.,-25.,-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.,25.,30.};
247 Double_t binsCentralityDefault[12] = {0., 5., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.};
249 // if no binning is set, use the default
250 if (!fBinsMult) { SetBinsMult(48,binsMultDefault); }
251 if (!fBinsPt) { SetBinsPt(82,binsPtDefault); }
252 if (!fBinsPtCorr) { SetBinsPtCorr(37,binsPtCorrDefault); }
253 if (!fBinsEta) { SetBinsEta(31,binsEtaDefault); }
254 if (!fBinsZv) { SetBinsZv(13,binsZvDefault); }
255 if (!fBinsCentrality) { SetBinsCentrality(12,binsCentralityDefault); }
257 Int_t binsZvPtEtaCent[4]={fZvNbins-1,fPtNbins-1,fEtaNbins-1,fCentralityNbins-1};
258 Int_t binsZvMultCent[3]={fZvNbins-1,fMultNbins-1,fCentralityNbins-1};
261 hnZvPtEtaCent = new THnSparseF("hnZvPtEtaCent","Zv:Pt:Eta:Centrality",4,binsZvPtEtaCent);
262 hnZvPtEtaCent->SetBinEdges(0,fBinsZv);
263 hnZvPtEtaCent->SetBinEdges(1,fBinsPt);
264 hnZvPtEtaCent->SetBinEdges(2,fBinsEta);
265 hnZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
266 hnZvPtEtaCent->GetAxis(0)->SetTitle("Zv (cm)");
267 hnZvPtEtaCent->GetAxis(1)->SetTitle("Pt (GeV/c)");
268 hnZvPtEtaCent->GetAxis(2)->SetTitle("Eta");
269 hnZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
270 hnZvPtEtaCent->Sumw2();
272 hnMCRecPrimZvPtEtaCent = new THnSparseF("hnMCRecPrimZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
273 hnMCRecPrimZvPtEtaCent->SetBinEdges(0,fBinsZv);
274 hnMCRecPrimZvPtEtaCent->SetBinEdges(1,fBinsPt);
275 hnMCRecPrimZvPtEtaCent->SetBinEdges(2,fBinsEta);
276 hnMCRecPrimZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
277 hnMCRecPrimZvPtEtaCent->GetAxis(0)->SetTitle("MC Zv (cm)");
278 hnMCRecPrimZvPtEtaCent->GetAxis(1)->SetTitle("MC Pt (GeV/c)");
279 hnMCRecPrimZvPtEtaCent->GetAxis(2)->SetTitle("MC Eta");
280 hnMCRecPrimZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
281 hnMCRecPrimZvPtEtaCent->Sumw2();
283 hnMCGenZvPtEtaCent = new THnSparseF("hnMCGenZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
284 hnMCGenZvPtEtaCent->SetBinEdges(0,fBinsZv);
285 hnMCGenZvPtEtaCent->SetBinEdges(1,fBinsPt);
286 hnMCGenZvPtEtaCent->SetBinEdges(2,fBinsEta);
287 hnMCGenZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
288 hnMCGenZvPtEtaCent->GetAxis(0)->SetTitle("MC Zv (cm)");
289 hnMCGenZvPtEtaCent->GetAxis(1)->SetTitle("MC Pt (GeV/c)");
290 hnMCGenZvPtEtaCent->GetAxis(2)->SetTitle("MC Eta");
291 hnMCGenZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
292 hnMCGenZvPtEtaCent->Sumw2();
294 hnMCRecSecZvPtEtaCent = new THnSparseF("hnMCRecSecZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
295 hnMCRecSecZvPtEtaCent->SetBinEdges(0,fBinsZv);
296 hnMCRecSecZvPtEtaCent->SetBinEdges(1,fBinsPt);
297 hnMCRecSecZvPtEtaCent->SetBinEdges(2,fBinsEta);
298 hnMCRecSecZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
299 hnMCRecSecZvPtEtaCent->GetAxis(0)->SetTitle("MC Sec Zv (cm)");
300 hnMCRecSecZvPtEtaCent->GetAxis(1)->SetTitle("MC Sec Pt (GeV/c)");
301 hnMCRecSecZvPtEtaCent->GetAxis(2)->SetTitle("MC Sec Eta");
302 hnMCRecSecZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
303 hnMCRecSecZvPtEtaCent->Sumw2();
305 hPt = new TH1F("hPt","hPt",2000,0,200);
306 hPt->GetXaxis()->SetTitle("p_{T} (GeV/c)");
307 hPt->GetYaxis()->SetTitle("dN/dp_{T}");
310 hMCPt = new TH1F("hMCPt","hMCPt",2000,0,200);
311 hMCPt->GetXaxis()->SetTitle("MC p_{T} (GeV/c)");
312 hMCPt->GetYaxis()->SetTitle("dN/dp_{T}");
315 hEventStatistics = new TH1F("hEventStatistics","hEventStatistics",10,0,10);
316 hEventStatistics->GetYaxis()->SetTitle("number of events");
317 hEventStatistics->SetBit(TH1::kCanRebin);
319 hEventStatisticsCentrality = new TH1F("hEventStatisticsCentrality","hEventStatisticsCentrality",fCentralityNbins-1, fBinsCentrality);
320 hEventStatisticsCentrality->GetYaxis()->SetTitle("number of events");
322 hMCEventStatisticsCentrality = new TH1F("hMCEventStatisticsCentrality","hMCEventStatisticsCentrality",fCentralityNbins-1, fBinsCentrality);
323 hMCEventStatisticsCentrality->GetYaxis()->SetTitle("number of MC events");
325 hAllEventStatisticsCentrality = new TH1F("hAllEventStatisticsCentrality","hAllEventStatisticsCentrality",fCentralityNbins-1, fBinsCentrality);
326 hAllEventStatisticsCentrality->GetYaxis()->SetTitle("number of events");
328 hEventStatisticsCentralityTrigger = new TH2F("hEventStatisticsCentralityTrigger","hEventStatisticsCentralityTrigger;centrality;trigger",100,0,100,3,0,3);
329 hEventStatisticsCentralityTrigger->Sumw2();
331 hnZvMultCent = new THnSparseF("hnZvMultCent","Zv:mult:Centrality",3,binsZvMultCent);
332 hnZvMultCent->SetBinEdges(0,fBinsZv);
333 hnZvMultCent->SetBinEdges(1,fBinsMult);
334 hnZvMultCent->SetBinEdges(2,fBinsCentrality);
335 hnZvMultCent->GetAxis(0)->SetTitle("Zv (cm)");
336 hnZvMultCent->GetAxis(1)->SetTitle("N_{acc}");
337 hnZvMultCent->GetAxis(2)->SetTitle("Centrality");
338 hnZvMultCent->Sumw2();
340 hTriggerStatistics = new TH1F("hTriggerStatistics","hTriggerStatistics",10,0,10);
341 hTriggerStatistics->GetYaxis()->SetTitle("number of events");
343 hMCTrackPdgCode = new TH1F("hMCTrackPdgCode","hMCTrackPdgCode",100,0,10);
344 hMCTrackPdgCode->GetYaxis()->SetTitle("number of tracks");
345 hMCTrackPdgCode->SetBit(TH1::kCanRebin);
347 hMCTrackStatusCode = new TH1F("hMCTrackStatusCode","hMCTrackStatusCode",100,0,10);
348 hMCTrackStatusCode->GetYaxis()->SetTitle("number of tracks");
349 hMCTrackStatusCode->SetBit(TH1::kCanRebin);
351 hCharge = new TH1F("hCharge","hCharge",30, -5, 5);
352 hCharge->GetXaxis()->SetTitle("Charge");
353 hCharge->GetYaxis()->SetTitle("number of tracks");
355 hMCCharge = new TH1F("hMCCharge","hMCCharge",30, -5, 5);
356 hMCCharge->GetXaxis()->SetTitle("MC Charge");
357 hMCCharge->GetYaxis()->SetTitle("number of tracks");
359 hMCPdgPt = new TH2F("hMCPdgPt","hMCPdgPt",fPtNbins-1, fBinsPt, 100,0,100);
360 hMCPdgPt->GetYaxis()->SetTitle("particle");
361 hMCPdgPt->GetXaxis()->SetTitle("Pt (GeV/c)");
363 hMCHijingPrim = new TH1F("hMCHijingPrim","hMCHijingPrim",2,0,2);
364 hMCPdgPt->GetYaxis()->SetTitle("number of particles");
368 Int_t binsDCAxyDCAzPtEtaPhi[6] = { 200,200, fPtNbins-1, fEtaNbins-1, 36, fCentralityNbins-1};
369 Double_t minDCAxyDCAzPtEtaPhi[6] = { -5, -5, 0, -1.5, 0., 0, };
370 Double_t maxDCAxyDCAzPtEtaPhi[6] = { 5., 5., 100, 1.5, 2.*TMath::Pi(), 100};
372 hDCAPtAll = new THnSparseF("hDCAPtAll","hDCAPtAll",6, binsDCAxyDCAzPtEtaPhi, minDCAxyDCAzPtEtaPhi, maxDCAxyDCAzPtEtaPhi);
373 hDCAPtAccepted = new THnSparseF("hDCAPtAccepted","hDCAPtAccepted",6, binsDCAxyDCAzPtEtaPhi, minDCAxyDCAzPtEtaPhi, maxDCAxyDCAzPtEtaPhi);
374 hMCDCAPtSecondary = new THnSparseF("hMCDCAPtSecondary","hMCDCAPtSecondary",6, binsDCAxyDCAzPtEtaPhi, minDCAxyDCAzPtEtaPhi, maxDCAxyDCAzPtEtaPhi);
375 hMCDCAPtPrimary = new THnSparseF("hMCDCAPtPrimary","hMCDCAPtPrimary",6, binsDCAxyDCAzPtEtaPhi, minDCAxyDCAzPtEtaPhi, maxDCAxyDCAzPtEtaPhi);
377 hDCAPtAll->SetBinEdges(2, fBinsPt);
378 hDCAPtAccepted->SetBinEdges(2, fBinsPt);
379 hMCDCAPtSecondary->SetBinEdges(2, fBinsPt);
380 hMCDCAPtPrimary->SetBinEdges(2, fBinsPt);
382 hDCAPtAll->SetBinEdges(3, fBinsEta);
383 hDCAPtAccepted->SetBinEdges(3, fBinsEta);
384 hMCDCAPtSecondary->SetBinEdges(3, fBinsEta);
385 hMCDCAPtPrimary->SetBinEdges(3, fBinsEta);
387 hDCAPtAll->SetBinEdges(5, fBinsCentrality);
388 hDCAPtAccepted->SetBinEdges(5, fBinsCentrality);
389 hMCDCAPtSecondary->SetBinEdges(5, fBinsCentrality);
390 hMCDCAPtPrimary->SetBinEdges(5, fBinsCentrality);
393 hDCAPtAccepted->Sumw2();
394 hMCDCAPtSecondary->Sumw2();
395 hMCDCAPtPrimary->Sumw2();
397 hDCAPtAll->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
398 hDCAPtAll->GetAxis(1)->SetTitle("DCA_{z} (cm)");
399 hDCAPtAll->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
400 hDCAPtAll->GetAxis(3)->SetTitle("#eta");
401 hDCAPtAll->GetAxis(4)->SetTitle("#phi");
402 hDCAPtAll->GetAxis(5)->SetTitle("Centrality");
404 hDCAPtAccepted->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
405 hDCAPtAccepted->GetAxis(1)->SetTitle("DCA_{z} (cm)");
406 hDCAPtAccepted->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
407 hDCAPtAccepted->GetAxis(3)->SetTitle("#eta");
408 hDCAPtAccepted->GetAxis(4)->SetTitle("#phi");
409 hDCAPtAccepted->GetAxis(5)->SetTitle("Centrality");
411 hMCDCAPtSecondary->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
412 hMCDCAPtSecondary->GetAxis(1)->SetTitle("DCA_{z} (cm)");
413 hMCDCAPtSecondary->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
414 hMCDCAPtSecondary->GetAxis(3)->SetTitle("#eta");
415 hMCDCAPtSecondary->GetAxis(4)->SetTitle("#phi");
416 hMCDCAPtSecondary->GetAxis(5)->SetTitle("Centrality");
418 hMCDCAPtPrimary->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
419 hMCDCAPtPrimary->GetAxis(1)->SetTitle("DCA_{z} (cm)");
420 hMCDCAPtPrimary->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
421 hMCDCAPtPrimary->GetAxis(3)->SetTitle("#eta");
422 hMCDCAPtPrimary->GetAxis(4)->SetTitle("#phi");
423 hMCDCAPtPrimary->GetAxis(5)->SetTitle("Centrality");
425 Int_t binsRowsClusterChiPtEtaPhi[7] = { 32,32, 100, fPtNbins-1, fEtaNbins-1, 36, fCentralityNbins-1};
426 Double_t minRowsClusterChiPtEtaPhi[7] = { 0, 0, 0, 0, -1.5, 0., 0.};
427 Double_t maxRowsClusterChiPtEtaPhi[7] = { 159, 159, 10, 100, 1.5, 2.*TMath::Pi(), 100.};
429 hnCrossedRowsClustersChiPtEtaPhiAll = new THnSparseF("hnCrossedRowsClustersChiPtEtaPhiAll","hnCrossedRowsClustersChiPtEtaPhiAll",7,binsRowsClusterChiPtEtaPhi, minRowsClusterChiPtEtaPhi, maxRowsClusterChiPtEtaPhi);
431 hnCrossedRowsClustersChiPtEtaPhiAcc = new THnSparseF("hnCrossedRowsClustersChiPtEtaPhiAcc","hnCrossedRowsClustersChiPtEtaPhiAcc",7,binsRowsClusterChiPtEtaPhi, minRowsClusterChiPtEtaPhi, maxRowsClusterChiPtEtaPhi);
433 hnCrossedRowsClustersChiPtEtaPhiAll->Sumw2();
434 hnCrossedRowsClustersChiPtEtaPhiAll->SetBinEdges(3, fBinsPt);
435 hnCrossedRowsClustersChiPtEtaPhiAll->SetBinEdges(4, fBinsEta);
436 hnCrossedRowsClustersChiPtEtaPhiAll->SetBinEdges(6, fBinsCentrality);
437 hnCrossedRowsClustersChiPtEtaPhiAll->GetAxis(0)->SetTitle("NcrossedRows before Cut");
438 hnCrossedRowsClustersChiPtEtaPhiAll->GetAxis(1)->SetTitle("Nclusters before Cut");
439 hnCrossedRowsClustersChiPtEtaPhiAll->GetAxis(2)->SetTitle("#Chi^{2}/cluster before Cut");
440 hnCrossedRowsClustersChiPtEtaPhiAll->GetAxis(3)->SetTitle("p_{T} (GeV/c)");
441 hnCrossedRowsClustersChiPtEtaPhiAll->GetAxis(4)->SetTitle("#eta");
442 hnCrossedRowsClustersChiPtEtaPhiAll->GetAxis(5)->SetTitle("#phi");
443 hnCrossedRowsClustersChiPtEtaPhiAll->GetAxis(6)->SetTitle("Centrality");
445 hnCrossedRowsClustersChiPtEtaPhiAcc->Sumw2();
446 hnCrossedRowsClustersChiPtEtaPhiAcc->SetBinEdges(3, fBinsPt);
447 hnCrossedRowsClustersChiPtEtaPhiAcc->SetBinEdges(4, fBinsEta);
448 hnCrossedRowsClustersChiPtEtaPhiAcc->SetBinEdges(6, fBinsCentrality);
449 hnCrossedRowsClustersChiPtEtaPhiAcc->GetAxis(0)->SetTitle("NcrossedRows after Cut");
450 hnCrossedRowsClustersChiPtEtaPhiAcc->GetAxis(1)->SetTitle("Nclusters after Cut");
451 hnCrossedRowsClustersChiPtEtaPhiAcc->GetAxis(2)->SetTitle("#Chi^{2}/cluster after Cut");
452 hnCrossedRowsClustersChiPtEtaPhiAcc->GetAxis(3)->SetTitle("p_{T} (GeV/c)");
453 hnCrossedRowsClustersChiPtEtaPhiAcc->GetAxis(4)->SetTitle("#eta");
454 hnCrossedRowsClustersChiPtEtaPhiAcc->GetAxis(5)->SetTitle("#phi");
455 hnCrossedRowsClustersChiPtEtaPhiAcc->GetAxis(6)->SetTitle("Centrality");
457 // Add Histos, Profiles etc to List
458 fOutputList->Add(hnZvPtEtaCent);
459 fOutputList->Add(hPt);
460 fOutputList->Add(hnMCRecPrimZvPtEtaCent);
461 fOutputList->Add(hnMCGenZvPtEtaCent);
462 fOutputList->Add(hnMCRecSecZvPtEtaCent);
463 fOutputList->Add(hMCPt);
464 fOutputList->Add(hEventStatistics);
465 fOutputList->Add(hEventStatisticsCentrality);
466 fOutputList->Add(hMCEventStatisticsCentrality);
467 fOutputList->Add(hAllEventStatisticsCentrality);
468 fOutputList->Add(hEventStatisticsCentralityTrigger);
469 fOutputList->Add(hnZvMultCent);
470 fOutputList->Add(hTriggerStatistics);
471 fOutputList->Add(hMCTrackPdgCode);
472 fOutputList->Add(hMCTrackStatusCode);
473 fOutputList->Add(hCharge);
474 fOutputList->Add(hMCCharge);
475 fOutputList->Add(hMCPdgPt);
476 fOutputList->Add(hMCHijingPrim);
477 fOutputList->Add(hDCAPtAll);
478 fOutputList->Add(hDCAPtAccepted);
479 fOutputList->Add(hMCDCAPtSecondary);
480 fOutputList->Add(hMCDCAPtPrimary);
481 fOutputList->Add(hnCrossedRowsClustersChiPtEtaPhiAll);
482 fOutputList->Add(hnCrossedRowsClustersChiPtEtaPhiAcc);
484 PostData(1, fOutputList);
487 void AlidNdPtAnalysisPbPbAOD::UserExec(Option_t *option)
491 // called for each event
492 hEventStatistics->Fill("all events",1);
494 // set ZERO pointers:
495 AliInputEventHandler *inputHandler = NULL;
496 AliAODTrack *track = NULL;
497 AliAODMCParticle *mcPart = NULL;
498 AliAODMCHeader *mcHdr = NULL;
499 AliGenHijingEventHeader *genHijingHeader = NULL;
500 //AliGenPythiaEventHeader *genPythiaHeader = NULL;
502 Bool_t bIsEventSelectedMB = kFALSE;
503 Bool_t bIsEventSelectedSemi = kFALSE;
504 Bool_t bIsEventSelectedCentral = kFALSE;
505 Bool_t bIsEventSelected = kFALSE;
506 Bool_t bIsPrimary = kFALSE;
507 Bool_t bIsHijingParticle = kFALSE;
508 Bool_t bMotherIsHijingParticle = kFALSE;
509 //Bool_t bIsPythiaParticle = kFALSE;
510 Bool_t bEventHasATrack = kFALSE;
511 Bool_t bEventHasATrackInRange = kFALSE;
512 Int_t nTriggerFired = 0;
515 Double_t dMCTrackZvPtEtaCent[4] = {0};
516 Double_t dTrackZvPtEtaCent[4] = {0};
518 Double_t dDCA[2] = {0};
520 Double_t dMCEventZv = -100;
521 Double_t dEventZv = -100;
522 Int_t iAcceptedMultiplicity = 0;
524 bIsMonteCarlo = kFALSE;
526 AliAODEvent *eventAOD = 0x0;
527 eventAOD = dynamic_cast<AliAODEvent*>( InputEvent() );
529 AliWarning("ERROR: eventAOD not available \n");
533 // check, which trigger has been fired
534 inputHandler = (AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
535 bIsEventSelectedMB = ( inputHandler->IsEventSelected() & AliVEvent::kMB);
536 bIsEventSelectedSemi = ( inputHandler->IsEventSelected() & AliVEvent::kSemiCentral);
537 bIsEventSelectedCentral = ( inputHandler->IsEventSelected() & AliVEvent::kCentral);
539 if(bIsEventSelectedMB || bIsEventSelectedSemi || bIsEventSelectedCentral) hTriggerStatistics->Fill("all triggered events",1);
540 if(bIsEventSelectedMB) { hTriggerStatistics->Fill("MB trigger",1); nTriggerFired++; }
541 if(bIsEventSelectedSemi) { hTriggerStatistics->Fill("SemiCentral trigger",1); nTriggerFired++; }
542 if(bIsEventSelectedCentral) { hTriggerStatistics->Fill("Central trigger",1); nTriggerFired++; }
543 if(nTriggerFired == 0) { hTriggerStatistics->Fill("No trigger",1); }
545 bIsEventSelected = ( inputHandler->IsEventSelected() & GetCollisionCandidates() );
547 // only take tracks of events, which are triggered
548 if(nTriggerFired == 0) { return; }
550 // if( !bIsEventSelected || nTriggerFired>1 ) return;
552 // hEventStatistics->Fill("events with only coll. cand.", 1);
556 // check if there is a stack, if yes, then do MC loop
557 TList *list = eventAOD->GetList();
558 TClonesArray *stack = 0x0;
559 stack = (TClonesArray*)list->FindObject(AliAODMCParticle::StdBranchName());
563 bIsMonteCarlo = kTRUE;
565 mcHdr = (AliAODMCHeader*)list->FindObject(AliAODMCHeader::StdBranchName());
567 genHijingHeader = GetHijingEventHeader(mcHdr);
568 // genPythiaHeader = GetPythiaEventHeader(mcHdr);
570 if(!genHijingHeader) { return; }
572 // if(!genPythiaHeader) { return; }
574 dMCEventZv = mcHdr->GetVtxZ();
575 dMCTrackZvPtEtaCent[0] = dMCEventZv;
576 hEventStatistics->Fill("MC all events",1);
579 AliCentrality* aCentrality = eventAOD->GetCentrality();
580 Double_t dCentrality = aCentrality->GetCentralityPercentile("V0M");
582 if( dCentrality < 0 ) return;
583 hEventStatistics->Fill("after centrality selection",1);
587 // start with MC truth analysis
591 if( dMCEventZv > dCutMaxZVertex ) { return; }
593 dMCTrackZvPtEtaCent[0] = dMCEventZv;
595 hEventStatistics->Fill("MC afterZv cut",1);
597 for(Int_t iMCtrack = 0; iMCtrack < stack->GetEntriesFast(); iMCtrack++)
599 mcPart =(AliAODMCParticle*)stack->At(iMCtrack);
602 if( !(IsMCTrackAccepted(mcPart)) ) continue;
604 if(!IsHijingParticle(mcPart, genHijingHeader)) { continue; }
606 if(mcPart->IsPhysicalPrimary() )
608 hMCHijingPrim->Fill("IsPhysicalPrimary",1);
612 hMCHijingPrim->Fill("NOT a primary",1);
618 // ======================== fill histograms ========================
619 dMCTrackZvPtEtaCent[1] = mcPart->Pt();
620 dMCTrackZvPtEtaCent[2] = mcPart->Eta();
621 dMCTrackZvPtEtaCent[3] = dCentrality;
623 bEventHasATrack = kTRUE;
625 hnMCGenZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
627 if( (dMCTrackZvPtEtaCent[1] > dCutPtMin) &&
628 (dMCTrackZvPtEtaCent[1] < dCutPtMax) &&
629 (dMCTrackZvPtEtaCent[2] > dCutEtaMin) &&
630 (dMCTrackZvPtEtaCent[2] < dCutEtaMax) )
632 hMCPt->Fill(mcPart->Pt());
633 hMCCharge->Fill(mcPart->Charge()/3.);
634 bEventHasATrackInRange = kTRUE;
639 if(bEventHasATrack) { hEventStatistics->Fill("MC events with tracks",1); }
640 if(bEventHasATrackInRange)
642 hEventStatistics->Fill("MC events with tracks in range",1);
643 hMCEventStatisticsCentrality->Fill(dCentrality);
645 bEventHasATrack = kFALSE;
646 bEventHasATrackInRange = kFALSE;
650 // Loop over recontructed tracks
652 dEventZv = eventAOD->GetPrimaryVertex()->GetZ();
653 if( TMath::Abs(dEventZv) > dCutMaxZVertex ) return;
655 hAllEventStatisticsCentrality->Fill(dCentrality/*, nTriggerFired*/);
657 hEventStatistics->Fill("after Zv cut",1);
659 dTrackZvPtEtaCent[0] = dEventZv;
661 for(Int_t itrack = 0; itrack < eventAOD->GetNumberOfTracks(); itrack++)
663 track = eventAOD->GetTrack(itrack);
667 dMCTrackZvPtEtaCent[1] = 0;
668 dMCTrackZvPtEtaCent[2] = 0;
669 dMCTrackZvPtEtaCent[3] = 0;
673 GetDCA(track, eventAOD, dDCA);
675 Double_t dDCAxyDCAzPt[5] = { dDCA[0], dDCA[1], track->Pt(), track->Eta(), track->Phi() };
677 hDCAPtAll->Fill(dDCAxyDCAzPt);
679 if( !(IsTrackAccepted(track)) ) continue;
681 dTrackZvPtEtaCent[1] = track->Pt();
682 dTrackZvPtEtaCent[2] = track->Eta();
683 dTrackZvPtEtaCent[3] = dCentrality;
687 mcPart = (AliAODMCParticle*)stack->At(TMath::Abs(track->GetLabel()));
688 if( !mcPart ) { continue; }
691 if( !(IsMCTrackAccepted(mcPart)) ) { continue; }
693 bIsHijingParticle = IsHijingParticle(mcPart, genHijingHeader);
694 // bIsPythiaParticle = IsPythiaParticle(mcPart, genPythiaHeader);
696 // if(!bIsHijingParticle) continue; // only take real tracks, not injected ones
698 bIsPrimary = mcPart->IsPhysicalPrimary();
700 dMCTrackZvPtEtaCent[1] = mcPart->Pt();
701 dMCTrackZvPtEtaCent[2] = mcPart->Eta();
702 dMCTrackZvPtEtaCent[3] = dCentrality;
704 if(bIsPrimary && bIsHijingParticle)
706 hnMCRecPrimZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
707 hMCDCAPtPrimary->Fill(dDCAxyDCAzPt);
710 if(!bIsPrimary /*&& !bIsHijingParticle*/)
712 Int_t indexMoth = mcPart->GetMother();
715 AliAODMCParticle* moth = (AliAODMCParticle*)stack->At(indexMoth);
716 bMotherIsHijingParticle = IsHijingParticle(moth, genHijingHeader);
718 if(bMotherIsHijingParticle) // only store secondaries, which come from a not embedded signal!
720 hMCTrackStatusCode->Fill(Form("%d",mcPart->GetStatus()), 1);
721 if(TMath::Abs(mcPart->Eta()) < 0.8) { hMCPdgPt->Fill(mcPart->Pt(), Form("%s",GetParticleName(mcPart->GetPdgCode())), 1); }
723 hnMCRecSecZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
724 hMCDCAPtSecondary->Fill(dDCAxyDCAzPt);
725 hMCTrackPdgCode->Fill(Form("%s_H%i_H%i",GetParticleName(moth->GetPdgCode()),bMotherIsHijingParticle, bIsHijingParticle), 1);
730 } // end isMonteCarlo
732 // ======================== fill histograms ========================
734 // only keep prim and sec from not embedded signal
735 Bool_t bKeepMCTrack = kFALSE;
738 if( (bIsHijingParticle && bIsPrimary) ^ (bMotherIsHijingParticle && !bIsPrimary) )
740 bKeepMCTrack = kTRUE;
748 bEventHasATrack = kTRUE;
750 hnZvPtEtaCent->Fill(dTrackZvPtEtaCent);
751 hDCAPtAccepted->Fill(dDCAxyDCAzPt);
753 if( (dTrackZvPtEtaCent[1] > dCutPtMin) &&
754 (dTrackZvPtEtaCent[1] < dCutPtMax) &&
755 (dTrackZvPtEtaCent[2] > dCutEtaMin) &&
756 (dTrackZvPtEtaCent[2] < dCutEtaMax) )
758 iAcceptedMultiplicity++;
759 bEventHasATrackInRange = kTRUE;
760 hPt->Fill(track->Pt());
761 hCharge->Fill(track->Charge());
765 if(bEventHasATrack) { hEventStatistics->Fill("events with tracks",1); bEventHasATrack = kFALSE; }
767 if(bEventHasATrackInRange)
769 hEventStatistics->Fill("events with tracks in range",1);
770 hEventStatisticsCentrality->Fill(dCentrality);
771 bEventHasATrackInRange = kFALSE;
773 if(bIsEventSelectedMB) hEventStatisticsCentralityTrigger->Fill(dCentrality, 0);
774 if(bIsEventSelectedSemi) hEventStatisticsCentralityTrigger->Fill(dCentrality, 1);
775 if(bIsEventSelectedCentral) hEventStatisticsCentralityTrigger->Fill(dCentrality, 2);
778 Double_t dEventZvMultCent[3] = {dEventZv, iAcceptedMultiplicity, dCentrality};
779 hnZvMultCent->Fill(dEventZvMultCent);
781 PostData(1, fOutputList);
785 Bool_t AlidNdPtAnalysisPbPbAOD::IsTrackAccepted(AliAODTrack *tr)
787 if(!tr) return kFALSE;
789 if(tr->Charge()==0) { return kFALSE; }
791 Double_t dNClustersTPC = tr->GetTPCNcls();
792 Double_t dCrossedRowsTPC = tr->GetTPCClusterInfo(2,1);
793 Double_t dChi2PerClusterTPC = (dNClustersTPC>0)?tr->Chi2perNDF()*(dNClustersTPC-5)/dNClustersTPC:-1.; // see AliDielectronVarManager.h
795 // hAllCrossedRowsTPC->Fill(dCrossedRowsTPC);
797 Double_t dRowClusterChiPtEtaPhi[6] = {dCrossedRowsTPC, dNClustersTPC, dChi2PerClusterTPC, tr->Pt(), tr->Eta(), tr->Phi() };
798 hnCrossedRowsClustersChiPtEtaPhiAll->Fill(dRowClusterChiPtEtaPhi);
801 if(!(tr->TestFilterBit(AliAODTrack::kTrkGlobal)) ) { return kFALSE; }
804 // if(!(tr->TestFilterBit(AliAODTrack::kTrkGlobalNoDCA)) ) { return kFALSE; }
806 // hFilterCrossedRowsTPC->Fill(dCrossedRowsTPC);
808 if(dCrossedRowsTPC < GetCutMinNCrossedRowsTPC()) { return kFALSE; }
810 hnCrossedRowsClustersChiPtEtaPhiAcc->Fill(dRowClusterChiPtEtaPhi);
812 // hAccNclsTPC->Fill(dNClustersTPC);
813 // hAccCrossedRowsTPC->Fill(dCrossedRowsTPC);
814 // Double_t dFindableClustersTPC = tr->GetTPCNclsF();
815 // Double_t dChi2PerClusterTPC = (dNClustersTPC>0)?tr->Chi2perNDF()*(dNClustersTPC-5)/dNClustersTPC:-1.; // see AliDielectronVarManager.h
817 // Bool_t bIsFromKink = kFALSE;
818 // if(tr->GetProdVertex()->GetType() == AliAODVertex::kKink) bIsFromKink = kTRUE;
820 // // from AliAnalysisTaskPIDqa.cxx
821 // ULong_t uStatus = tr->GetStatus();
822 // Bool_t bHasRefitTPC = kFALSE;
823 // Bool_t bHasRefitITS = kFALSE;
825 // if ((uStatus & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) bHasRefitTPC = kTRUE;
826 // if ((uStatus & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) bHasRefitITS = kTRUE;
828 // // from AliDielectronVarManager.h
829 // Bool_t bHasHitInSPD = kFALSE;
830 // for (Int_t iC=0; iC<2; iC++)
832 // if (((tr->GetITSClusterMap()) & (1<<(iC))) > 0) { bHasHitInSPD = kTRUE; }
835 // Double_t dNClustersITS = tr->GetITSNcls();
839 // esdTrackCuts->SetMinNCrossedRowsTPC(70);
840 // esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
842 // esdTrackCuts->SetMaxChi2PerClusterTPC(4);
843 // esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
844 // esdTrackCuts->SetRequireTPCRefit(kTRUE);
846 // esdTrackCuts->SetRequireITSRefit(kTRUE);
847 // esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
849 // esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
850 // esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
852 // esdTrackCuts->SetMaxDCAToVertexZ(2);
853 // esdTrackCuts->SetDCAToVertex2D(kFALSE);
854 // esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
856 // esdTrackCuts->SetMaxChi2PerClusterITS(36);
862 Bool_t AlidNdPtAnalysisPbPbAOD::GetDCA(const AliAODTrack *track, AliAODEvent *evt, Double_t d0z0[2])
864 // function adapted from AliDielectronVarManager.h
866 if(track->TestBit(AliAODTrack::kIsDCA)){
867 d0z0[0]=track->DCA();
868 d0z0[1]=track->ZAtDCA();
875 //AliAODTrack copy(*track);
876 AliExternalTrackParam etp; etp.CopyFromVTrack(track);
878 Float_t xstart = etp.GetX();
882 //printf("This method can be used only for propagation inside the beam pipe \n");
887 AliAODVertex *vtx =(AliAODVertex*)(evt->GetPrimaryVertex());
888 Double_t fBzkG = evt->GetMagneticField(); // z componenent of field in kG
889 ok = etp.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0);
890 //ok = copy.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0);
900 Bool_t AlidNdPtAnalysisPbPbAOD::IsMCTrackAccepted(AliAODMCParticle *part)
902 if(!part) return kFALSE;
904 Double_t charge = part->Charge()/3.;
905 if (TMath::Abs(charge) < 0.001) return kFALSE;
910 const char * AlidNdPtAnalysisPbPbAOD::GetParticleName(Int_t pdg)
912 TParticlePDG * p1 = TDatabasePDG::Instance()->GetParticle(pdg);
913 if(p1) return p1->GetName();
914 return Form("%d", pdg);
917 AliGenHijingEventHeader* AlidNdPtAnalysisPbPbAOD::GetHijingEventHeader(AliAODMCHeader *header)
920 // inspired by PWGJE/AliPWG4HighPtSpectra.cxx
923 if(!header) return 0x0;
924 AliGenHijingEventHeader* hijingGenHeader = NULL;
926 TList* headerList = header->GetCocktailHeaders();
928 for(Int_t i = 0; i < headerList->GetEntries(); i++)
930 hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(headerList->At(i));
931 if(hijingGenHeader) break;
934 if(!hijingGenHeader) return 0x0;
936 return hijingGenHeader;
939 AliGenPythiaEventHeader* AlidNdPtAnalysisPbPbAOD::GetPythiaEventHeader(AliAODMCHeader *header)
942 // inspired by PWGJE/AliPWG4HighPtSpectra.cxx
945 if(!header) return 0x0;
946 AliGenPythiaEventHeader* PythiaGenHeader = NULL;
948 TList* headerList = header->GetCocktailHeaders();
950 for(Int_t i = 0; i < headerList->GetEntries(); i++)
952 PythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(i));
953 if(PythiaGenHeader) break;
956 if(!PythiaGenHeader) return 0x0;
958 return PythiaGenHeader;
961 //________________________________________________________________________
962 Bool_t AlidNdPtAnalysisPbPbAOD::IsHijingParticle(const AliAODMCParticle *part, AliGenHijingEventHeader* hijingGenHeader){
964 // Check whether a particle is from Hijing or some injected
966 if(part->Label() > (hijingGenHeader->NProduced()-1)) return kFALSE;
970 //________________________________________________________________________
971 Bool_t AlidNdPtAnalysisPbPbAOD::IsPythiaParticle(const AliAODMCParticle *part, AliGenPythiaEventHeader* pythiaGenHeader){
973 // Check whether a particle is from Pythia or some injected
975 if(part->Label() > (pythiaGenHeader->NProduced()-1)) return kFALSE;
979 Double_t* AlidNdPtAnalysisPbPbAOD::GetArrayClone(Int_t n, Double_t* source)
981 if (!source || n==0) return 0;
982 Double_t* dest = new Double_t[n];
983 for (Int_t i=0; i<n ; i++) { dest[i] = source[i]; }
987 void AlidNdPtAnalysisPbPbAOD::Terminate(Option_t *)