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 // last modified: 17.10.2013
20 //------------------------------------------------------------------------------
23 #include "AlidNdPtAnalysisPbPbAOD.h"
28 ClassImp(AlidNdPtAnalysisPbPbAOD)
32 AlidNdPtAnalysisPbPbAOD::AlidNdPtAnalysisPbPbAOD(const char *name) : AliAnalysisTaskSE(name),
39 fMCRecPrimZvPtEtaCent(0),
41 fMCRecSecZvPtEtaCent(0),
42 fMCRecPrimPhiPtEtaCent(0),
43 fMCGenPhiPtEtaCent(0),
44 fMCRecSecPhiPtEtaCent(0),
46 fEventStatisticsCentrality(0),
47 fMCEventStatisticsCentrality(0),
48 fAllEventStatisticsCentrality(0),
49 fEventStatisticsCentralityTrigger(0),
51 fTriggerStatistics(0),
53 fMCTrackStatusCode(0),
64 fCrossCheckRowsLength(0),
65 fCrossCheckClusterLength(0),
66 fCrossCheckRowsLengthAcc(0),
67 fCrossCheckClusterLengthAcc(0),
70 // event cut variables
72 // track kinematic cut variables
77 // track quality cut variables
78 fUseRelativeCuts(kFALSE),
79 fCutRequireTPCRefit(kTRUE),
80 fCutMinNumberOfClusters(60),
81 fCutPercMinNumberOfClusters(0.2),
82 fCutMinNumberOfCrossedRows(120.),
83 fCutPercMinNumberOfCrossedRows(0.2),
84 fCutMinRatioCrossedRowsOverFindableClustersTPC(0.8),
85 fCutMaxChi2PerClusterTPC(4.),
86 fCutMaxFractionSharedTPCClusters(0.4),
87 fCutMaxDCAToVertexZ(3.0),
88 fCutMaxDCAToVertexXY(3.0),
89 fCutRequireITSRefit(kTRUE),
90 fCutMaxChi2PerClusterITS(36.),
91 fCutDCAToVertex2D(kFALSE),
92 fCutRequireSigmaToVertex(kFALSE),
93 fCutMaxDCAToVertexXYPtDepPar0(0.0182),
94 fCutMaxDCAToVertexXYPtDepPar1(0.0350),
95 fCutMaxDCAToVertexXYPtDepPar2(1.01),
96 fCutAcceptKinkDaughters(kFALSE),
97 fCutMaxChi2TPCConstrainedGlobal(36.),
98 fCutLengthInTPCPtDependent(kFALSE),
99 fPrefactorLengthInTPCPtDependent(1),
100 // binning for THnSparse
121 for(Int_t i = 0; i < cqMax; i++)
123 fCrossCheckAll[i] = 0;
124 fCrossCheckAcc[i] = 0;
134 fCentralityNbins = 0;
145 DefineOutput(1, TList::Class());
149 AlidNdPtAnalysisPbPbAOD::~AlidNdPtAnalysisPbPbAOD()
152 if(fZvPtEtaCent) delete fZvPtEtaCent; fZvPtEtaCent = 0;
153 if(fPt) delete fPt; fPt = 0;
154 if(fMCRecPrimZvPtEtaCent) delete fMCRecPrimZvPtEtaCent; fMCRecPrimZvPtEtaCent = 0;
155 if(fMCGenZvPtEtaCent) delete fMCGenZvPtEtaCent; fMCGenZvPtEtaCent = 0;
156 if(fMCRecSecZvPtEtaCent) delete fMCRecSecZvPtEtaCent; fMCRecSecZvPtEtaCent = 0;
157 if(fMCPt) delete fMCPt; fMCPt = 0;
158 if(fEventStatistics) delete fEventStatistics; fEventStatistics = 0;
159 if(fEventStatisticsCentrality) delete fEventStatisticsCentrality; fEventStatisticsCentrality = 0;
160 if(fMCEventStatisticsCentrality) delete fMCEventStatisticsCentrality; fMCEventStatisticsCentrality = 0;
161 if(fAllEventStatisticsCentrality) delete fAllEventStatisticsCentrality; fAllEventStatisticsCentrality = 0;
162 if(fEventStatisticsCentralityTrigger) delete fEventStatisticsCentralityTrigger; fEventStatisticsCentralityTrigger = 0;
163 if(fZvMultCent) delete fZvMultCent; fZvMultCent = 0;
164 if(fTriggerStatistics) delete fTriggerStatistics; fTriggerStatistics = 0;
165 if(fMCTrackPdgCode) delete fMCTrackPdgCode; fMCTrackPdgCode = 0;
166 if(fMCTrackStatusCode) delete fMCTrackStatusCode; fMCTrackStatusCode = 0;
167 if(fCharge) delete fCharge; fCharge = 0;
168 if(fMCCharge) delete fMCCharge; fMCCharge = 0;
169 if(fMCPdgPt) delete fMCPdgPt; fMCPdgPt = 0;
170 if(fMCHijingPrim) delete fMCHijingPrim; fMCHijingPrim = 0;
171 if(fDCAPtAll) delete fDCAPtAll; fDCAPtAll = 0;
172 if(fDCAPtAccepted) delete fDCAPtAccepted; fDCAPtAccepted = 0;
173 if(fMCDCAPtSecondary) delete fMCDCAPtSecondary; fMCDCAPtSecondary = 0;
174 if(fMCDCAPtPrimary) delete fMCDCAPtPrimary; fMCDCAPtPrimary = 0;
175 if(fMCDCAPtSecondary) delete fMCDCAPtSecondary; fMCDCAPtSecondary = 0;
176 if(fMCDCAPtPrimary) delete fMCDCAPtPrimary; fMCDCAPtPrimary = 0;
178 for(Int_t i = 0; i < cqMax; i++)
180 if(fCrossCheckAll[i]) delete fCrossCheckAll[i]; fCrossCheckAll[i] = 0;
181 if(fCrossCheckAcc[i]) delete fCrossCheckAcc[i]; fCrossCheckAcc[i] = 0;
186 void AlidNdPtAnalysisPbPbAOD::UserCreateOutputObjects()
188 // create all output histograms here
189 OpenFile(1, "RECREATE");
191 fOutputList = new TList();
192 fOutputList->SetOwner();
194 //define default binning
195 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 };
196 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};
197 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};
198 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};
199 Double_t binsZvDefault[13] = {-30.,-25.,-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.,25.,30.};
200 Double_t binsCentralityDefault[12] = {0., 5., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.};
202 Double_t binsPhiDefault[37] = { 0, 0.174533, 0.349066, 0.523599, 0.698132, 0.872665, 1.0472, 1.22173, 1.39626, 1.5708, 1.74533, 1.91986, 2.0944, 2.26893, 2.44346, 2.61799, 2.79253, 2.96706, 3.14159, 3.31613, 3.49066, 3.66519, 3.83972, 4.01426, 4.18879, 4.36332, 4.53786, 4.71239, 4.88692, 5.06145, 5.23599, 5.41052, 5.58505, 5.75959, 5.93412, 6.10865, 2.*TMath::Pi()};
204 Double_t binsPtCheckDefault[20] = {0.,0.15,0.5,1.0,2.0,3.0,4.0, 5.0, 10.0, 13.0, 15.0, 20.0, 25.0, 30.0, 40.0, 50.0, 70.0, 100.0, 150.0, 200.0};
205 Double_t binsEtaCheckDefault[7] = {-1.0,-0.8,-0.4,0.,0.4,0.8,1.0};
207 // if no binning is set, use the default
208 if (!fBinsMult) { SetBinsMult(48,binsMultDefault); }
209 if (!fBinsPt) { SetBinsPt(82,binsPtDefault); }
210 if (!fBinsPtCorr) { SetBinsPtCorr(37,binsPtCorrDefault); }
211 if (!fBinsPtCheck) { SetBinsPtCheck(20,binsPtCheckDefault); }
212 if (!fBinsEta) { SetBinsEta(31,binsEtaDefault); }
213 if (!fBinsEtaCheck) { SetBinsEtaCheck(7,binsEtaCheckDefault); }
214 if (!fBinsZv) { SetBinsZv(13,binsZvDefault); }
215 if (!fBinsCentrality) { SetBinsCentrality(12,binsCentralityDefault); }
216 if (!fBinsPhi) { SetBinsPhi(37,binsPhiDefault); }
218 Int_t binsZvPtEtaCent[4]={fZvNbins-1,fPtNbins-1,fEtaNbins-1,fCentralityNbins-1};
219 Int_t binsPhiPtEtaCent[4]={fPhiNbins-1,fPtNbins-1,fEtaNbins-1,fCentralityNbins-1};
220 Int_t binsZvMultCent[3]={fZvNbins-1,fMultNbins-1,fCentralityNbins-1};
223 fZvPtEtaCent = new THnSparseF("fZvPtEtaCent","Zv:Pt:Eta:Centrality",4,binsZvPtEtaCent);
224 fZvPtEtaCent->SetBinEdges(0,fBinsZv);
225 fZvPtEtaCent->SetBinEdges(1,fBinsPt);
226 fZvPtEtaCent->SetBinEdges(2,fBinsEta);
227 fZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
228 fZvPtEtaCent->GetAxis(0)->SetTitle("Zv (cm)");
229 fZvPtEtaCent->GetAxis(1)->SetTitle("Pt (GeV/c)");
230 fZvPtEtaCent->GetAxis(2)->SetTitle("Eta");
231 fZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
232 fZvPtEtaCent->Sumw2();
234 fPhiPtEtaCent = new THnSparseF("fPhiPtEtaCent","Phi:Pt:Eta:Centrality",4,binsPhiPtEtaCent);
235 fPhiPtEtaCent->SetBinEdges(0,fBinsPhi);
236 fPhiPtEtaCent->SetBinEdges(1,fBinsPt);
237 fPhiPtEtaCent->SetBinEdges(2,fBinsEta);
238 fPhiPtEtaCent->SetBinEdges(3,fBinsCentrality);
239 fPhiPtEtaCent->GetAxis(0)->SetTitle("Phi (cm)");
240 fPhiPtEtaCent->GetAxis(1)->SetTitle("Pt (GeV/c)");
241 fPhiPtEtaCent->GetAxis(2)->SetTitle("Eta");
242 fPhiPtEtaCent->GetAxis(3)->SetTitle("Centrality");
243 fPhiPtEtaCent->Sumw2();
247 fMCRecPrimZvPtEtaCent = new THnSparseF("fMCRecPrimZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
248 fMCRecPrimZvPtEtaCent->SetBinEdges(0,fBinsZv);
249 fMCRecPrimZvPtEtaCent->SetBinEdges(1,fBinsPt);
250 fMCRecPrimZvPtEtaCent->SetBinEdges(2,fBinsEta);
251 fMCRecPrimZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
252 fMCRecPrimZvPtEtaCent->GetAxis(0)->SetTitle("MC Zv (cm)");
253 fMCRecPrimZvPtEtaCent->GetAxis(1)->SetTitle("MC Pt (GeV/c)");
254 fMCRecPrimZvPtEtaCent->GetAxis(2)->SetTitle("MC Eta");
255 fMCRecPrimZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
256 fMCRecPrimZvPtEtaCent->Sumw2();
258 fMCGenZvPtEtaCent = new THnSparseF("fMCGenZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
259 fMCGenZvPtEtaCent->SetBinEdges(0,fBinsZv);
260 fMCGenZvPtEtaCent->SetBinEdges(1,fBinsPt);
261 fMCGenZvPtEtaCent->SetBinEdges(2,fBinsEta);
262 fMCGenZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
263 fMCGenZvPtEtaCent->GetAxis(0)->SetTitle("MC Zv (cm)");
264 fMCGenZvPtEtaCent->GetAxis(1)->SetTitle("MC Pt (GeV/c)");
265 fMCGenZvPtEtaCent->GetAxis(2)->SetTitle("MC Eta");
266 fMCGenZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
267 fMCGenZvPtEtaCent->Sumw2();
269 fMCRecSecZvPtEtaCent = new THnSparseF("fMCRecSecZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
270 fMCRecSecZvPtEtaCent->SetBinEdges(0,fBinsZv);
271 fMCRecSecZvPtEtaCent->SetBinEdges(1,fBinsPt);
272 fMCRecSecZvPtEtaCent->SetBinEdges(2,fBinsEta);
273 fMCRecSecZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
274 fMCRecSecZvPtEtaCent->GetAxis(0)->SetTitle("MC Sec Zv (cm)");
275 fMCRecSecZvPtEtaCent->GetAxis(1)->SetTitle("MC Sec Pt (GeV/c)");
276 fMCRecSecZvPtEtaCent->GetAxis(2)->SetTitle("MC Sec Eta");
277 fMCRecSecZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
278 fMCRecSecZvPtEtaCent->Sumw2();
280 fMCRecPrimPhiPtEtaCent = new THnSparseF("fMCRecPrimPhiPtEtaCent","mcPhi:mcPt:mcEta:Centrality",4,binsPhiPtEtaCent);
281 fMCRecPrimPhiPtEtaCent->SetBinEdges(0,fBinsPhi);
282 fMCRecPrimPhiPtEtaCent->SetBinEdges(1,fBinsPt);
283 fMCRecPrimPhiPtEtaCent->SetBinEdges(2,fBinsEta);
284 fMCRecPrimPhiPtEtaCent->SetBinEdges(3,fBinsCentrality);
285 fMCRecPrimPhiPtEtaCent->GetAxis(0)->SetTitle("MC Phi (cm)");
286 fMCRecPrimPhiPtEtaCent->GetAxis(1)->SetTitle("MC Pt (GeV/c)");
287 fMCRecPrimPhiPtEtaCent->GetAxis(2)->SetTitle("MC Eta");
288 fMCRecPrimPhiPtEtaCent->GetAxis(3)->SetTitle("Centrality");
289 fMCRecPrimPhiPtEtaCent->Sumw2();
291 fMCGenPhiPtEtaCent = new THnSparseF("fMCGenPhiPtEtaCent","mcPhi:mcPt:mcEta:Centrality",4,binsPhiPtEtaCent);
292 fMCGenPhiPtEtaCent->SetBinEdges(0,fBinsPhi);
293 fMCGenPhiPtEtaCent->SetBinEdges(1,fBinsPt);
294 fMCGenPhiPtEtaCent->SetBinEdges(2,fBinsEta);
295 fMCGenPhiPtEtaCent->SetBinEdges(3,fBinsCentrality);
296 fMCGenPhiPtEtaCent->GetAxis(0)->SetTitle("MC Phi (cm)");
297 fMCGenPhiPtEtaCent->GetAxis(1)->SetTitle("MC Pt (GeV/c)");
298 fMCGenPhiPtEtaCent->GetAxis(2)->SetTitle("MC Eta");
299 fMCGenPhiPtEtaCent->GetAxis(3)->SetTitle("Centrality");
300 fMCGenPhiPtEtaCent->Sumw2();
302 fMCRecSecPhiPtEtaCent = new THnSparseF("fMCRecSecPhiPtEtaCent","mcPhi:mcPt:mcEta:Centrality",4,binsPhiPtEtaCent);
303 fMCRecSecPhiPtEtaCent->SetBinEdges(0,fBinsPhi);
304 fMCRecSecPhiPtEtaCent->SetBinEdges(1,fBinsPt);
305 fMCRecSecPhiPtEtaCent->SetBinEdges(2,fBinsEta);
306 fMCRecSecPhiPtEtaCent->SetBinEdges(3,fBinsCentrality);
307 fMCRecSecPhiPtEtaCent->GetAxis(0)->SetTitle("MC Sec Phi (cm)");
308 fMCRecSecPhiPtEtaCent->GetAxis(1)->SetTitle("MC Sec Pt (GeV/c)");
309 fMCRecSecPhiPtEtaCent->GetAxis(2)->SetTitle("MC Sec Eta");
310 fMCRecSecPhiPtEtaCent->GetAxis(3)->SetTitle("Centrality");
311 fMCRecSecPhiPtEtaCent->Sumw2();
313 fPt = new TH1F("fPt","fPt",2000,0,200);
314 fPt->GetXaxis()->SetTitle("p_{T} (GeV/c)");
315 fPt->GetYaxis()->SetTitle("dN/dp_{T}");
318 fMCPt = new TH1F("fMCPt","fMCPt",2000,0,200);
319 fMCPt->GetXaxis()->SetTitle("MC p_{T} (GeV/c)");
320 fMCPt->GetYaxis()->SetTitle("dN/dp_{T}");
323 fEventStatistics = new TH1F("fEventStatistics","fEventStatistics",10,0,10);
324 fEventStatistics->GetYaxis()->SetTitle("number of events");
325 fEventStatistics->SetBit(TH1::kCanRebin);
327 fEventStatisticsCentrality = new TH1F("fEventStatisticsCentrality","fEventStatisticsCentrality",fCentralityNbins-1, fBinsCentrality);
328 fEventStatisticsCentrality->GetYaxis()->SetTitle("number of events");
330 fMCEventStatisticsCentrality = new TH1F("fMCEventStatisticsCentrality","fMCEventStatisticsCentrality",fCentralityNbins-1, fBinsCentrality);
331 fMCEventStatisticsCentrality->GetYaxis()->SetTitle("number of MC events");
333 fAllEventStatisticsCentrality = new TH1F("fAllEventStatisticsCentrality","fAllEventStatisticsCentrality",fCentralityNbins-1, fBinsCentrality);
334 fAllEventStatisticsCentrality->GetYaxis()->SetTitle("number of events");
336 fEventStatisticsCentralityTrigger = new TH2F("fEventStatisticsCentralityTrigger","fEventStatisticsCentralityTrigger;centrality;trigger",100,0,100,3,0,3);
337 fEventStatisticsCentralityTrigger->Sumw2();
339 fZvMultCent = new THnSparseF("fZvMultCent","Zv:mult:Centrality",3,binsZvMultCent);
340 fZvMultCent->SetBinEdges(0,fBinsZv);
341 fZvMultCent->SetBinEdges(1,fBinsMult);
342 fZvMultCent->SetBinEdges(2,fBinsCentrality);
343 fZvMultCent->GetAxis(0)->SetTitle("Zv (cm)");
344 fZvMultCent->GetAxis(1)->SetTitle("N_{acc}");
345 fZvMultCent->GetAxis(2)->SetTitle("Centrality");
346 fZvMultCent->Sumw2();
348 fTriggerStatistics = new TH1F("fTriggerStatistics","fTriggerStatistics",10,0,10);
349 fTriggerStatistics->GetYaxis()->SetTitle("number of events");
351 fMCTrackPdgCode = new TH1F("fMCTrackPdgCode","fMCTrackPdgCode",100,0,10);
352 fMCTrackPdgCode->GetYaxis()->SetTitle("number of tracks");
353 fMCTrackPdgCode->SetBit(TH1::kCanRebin);
355 fMCTrackStatusCode = new TH1F("fMCTrackStatusCode","fMCTrackStatusCode",100,0,10);
356 fMCTrackStatusCode->GetYaxis()->SetTitle("number of tracks");
357 fMCTrackStatusCode->SetBit(TH1::kCanRebin);
359 fCharge = new TH1F("fCharge","fCharge",30, -5, 5);
360 fCharge->GetXaxis()->SetTitle("Charge");
361 fCharge->GetYaxis()->SetTitle("number of tracks");
363 fMCCharge = new TH1F("fMCCharge","fMCCharge",30, -5, 5);
364 fMCCharge->GetXaxis()->SetTitle("MC Charge");
365 fMCCharge->GetYaxis()->SetTitle("number of tracks");
367 fMCPdgPt = new TH2F("fMCPdgPt","fMCPdgPt",fPtNbins-1, fBinsPt, 100,0,100);
368 fMCPdgPt->GetYaxis()->SetTitle("particle");
369 fMCPdgPt->GetXaxis()->SetTitle("Pt (GeV/c)");
371 fMCHijingPrim = new TH1F("fMCHijingPrim","fMCHijingPrim",2,0,2);
372 fMCHijingPrim->GetYaxis()->SetTitle("number of particles");
376 Int_t binsDCAxyDCAzPtEtaPhi[6] = { 200,200, fPtCheckNbins-1, fEtaCheckNbins-1, 18, fCentralityNbins-1};
377 Double_t minDCAxyDCAzPtEtaPhi[6] = { -5, -5, 0, -1.5, 0., 0, };
378 Double_t maxDCAxyDCAzPtEtaPhi[6] = { 5., 5., 100, 1.5, 2.*TMath::Pi(), 100};
380 fDCAPtAll = new THnSparseF("fDCAPtAll","fDCAPtAll",6, binsDCAxyDCAzPtEtaPhi, minDCAxyDCAzPtEtaPhi, maxDCAxyDCAzPtEtaPhi);
381 fDCAPtAccepted = new THnSparseF("fDCAPtAccepted","fDCAPtAccepted",6, binsDCAxyDCAzPtEtaPhi, minDCAxyDCAzPtEtaPhi, maxDCAxyDCAzPtEtaPhi);
382 fMCDCAPtSecondary = new THnSparseF("fMCDCAPtSecondary","fMCDCAPtSecondary",6, binsDCAxyDCAzPtEtaPhi, minDCAxyDCAzPtEtaPhi, maxDCAxyDCAzPtEtaPhi);
383 fMCDCAPtPrimary = new THnSparseF("fMCDCAPtPrimary","fMCDCAPtPrimary",6, binsDCAxyDCAzPtEtaPhi, minDCAxyDCAzPtEtaPhi, maxDCAxyDCAzPtEtaPhi);
385 fDCAPtAll->SetBinEdges(2, fBinsPtCheck);
386 fDCAPtAccepted->SetBinEdges(2, fBinsPtCheck);
387 fMCDCAPtSecondary->SetBinEdges(2, fBinsPtCheck);
388 fMCDCAPtPrimary->SetBinEdges(2, fBinsPtCheck);
390 fDCAPtAll->SetBinEdges(3, fBinsEtaCheck);
391 fDCAPtAccepted->SetBinEdges(3, fBinsEtaCheck);
392 fMCDCAPtSecondary->SetBinEdges(3, fBinsEtaCheck);
393 fMCDCAPtPrimary->SetBinEdges(3, fBinsEtaCheck);
395 fDCAPtAll->SetBinEdges(5, fBinsCentrality);
396 fDCAPtAccepted->SetBinEdges(5, fBinsCentrality);
397 fMCDCAPtSecondary->SetBinEdges(5, fBinsCentrality);
398 fMCDCAPtPrimary->SetBinEdges(5, fBinsCentrality);
401 fDCAPtAccepted->Sumw2();
402 fMCDCAPtSecondary->Sumw2();
403 fMCDCAPtPrimary->Sumw2();
405 fDCAPtAll->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
406 fDCAPtAll->GetAxis(1)->SetTitle("DCA_{z} (cm)");
407 fDCAPtAll->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
408 fDCAPtAll->GetAxis(3)->SetTitle("#eta");
409 fDCAPtAll->GetAxis(4)->SetTitle("#phi");
410 fDCAPtAll->GetAxis(5)->SetTitle("Centrality");
412 fDCAPtAccepted->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
413 fDCAPtAccepted->GetAxis(1)->SetTitle("DCA_{z} (cm)");
414 fDCAPtAccepted->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
415 fDCAPtAccepted->GetAxis(3)->SetTitle("#eta");
416 fDCAPtAccepted->GetAxis(4)->SetTitle("#phi");
417 fDCAPtAccepted->GetAxis(5)->SetTitle("Centrality");
419 fMCDCAPtSecondary->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
420 fMCDCAPtSecondary->GetAxis(1)->SetTitle("DCA_{z} (cm)");
421 fMCDCAPtSecondary->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
422 fMCDCAPtSecondary->GetAxis(3)->SetTitle("#eta");
423 fMCDCAPtSecondary->GetAxis(4)->SetTitle("#phi");
424 fMCDCAPtSecondary->GetAxis(5)->SetTitle("Centrality");
426 fMCDCAPtPrimary->GetAxis(0)->SetTitle("DCA_{xy} (cm)");
427 fMCDCAPtPrimary->GetAxis(1)->SetTitle("DCA_{z} (cm)");
428 fMCDCAPtPrimary->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
429 fMCDCAPtPrimary->GetAxis(3)->SetTitle("#eta");
430 fMCDCAPtPrimary->GetAxis(4)->SetTitle("#phi");
431 fMCDCAPtPrimary->GetAxis(5)->SetTitle("Centrality");
434 char cFullTempTitle[255];
435 char cTempTitleAxis0All[255];
436 char cTempTitleAxis0Acc[255];
437 // char cTempTitleAxis1[255];
438 char cFullTempName[255];
439 char cTempNameAxis0[255];
440 // char cTempNameAxis1[255];
441 const Int_t iNbinRowsClusters = 21;
442 // Double_t dBinsRowsClusters[iNbinRowsClusters] = {0, 7.95, 15.9, 23.85, 31.8, 39.75, 47.7, 55.65, 63.6, 71.55, 79.5, 87.45, 95.4, 103.35, 111.3, 119.25, 127.2, 135.15, 143.1, 151.05, 159.};
444 const Int_t iNbinChi = 51;
445 const Int_t iNbinLength = 165;
446 // Double_t dBinsChi[iNbinChi] = {0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.4, 3.6, 3.8, 4, 4.2, 4.4, 4.6, 4.8, 5, 5.2, 5.4, 5.6, 5.8, 6, 6.2, 6.4, 6.6, 6.8, 7, 7.2, 7.4, 7.6, 7.8, 8, 8.2, 8.4, 8.6, 8.8, 9, 9.2, 9.4, 9.6, 9.8,10.};
449 // Double_t *dBins = 0x0;
450 Double_t dBinMin = 0;
451 Double_t dBinMax = 0;
453 for(Int_t iCheckQuant = 0; iCheckQuant < cqMax; iCheckQuant++)
455 // iCheckQuant: 0 = CrossedRows, 1 = Nclusters, 2 = Chi^2/clusterTPC
456 if(iCheckQuant == cqCrossedRows)
458 snprintf(cTempTitleAxis0All,255, "NcrossedRows before Cut");
459 snprintf(cTempTitleAxis0Acc,255, "NcrossedRows after Cut");
460 snprintf(cTempNameAxis0,255, "CrossedRows");
461 iNbin = iNbinRowsClusters;
465 else if(iCheckQuant == cqNcluster)
467 snprintf(cTempTitleAxis0All,255, "Nclusters before Cut");
468 snprintf(cTempTitleAxis0Acc,255, "Nclusters after Cut");
469 snprintf(cTempNameAxis0,255, "Clusters");
470 iNbin = iNbinRowsClusters;
474 else if(iCheckQuant == cqChi)
476 snprintf(cTempTitleAxis0All,255, "#Chi^{2}/cluster before Cut");
477 snprintf(cTempTitleAxis0Acc,255, "#Chi^{2}/cluster after Cut");
478 snprintf(cTempNameAxis0,255, "Chi");
483 else if(iCheckQuant == cqLength)
485 snprintf(cTempTitleAxis0All,255, "Length in TPC before Cut (cm)");
486 snprintf(cTempTitleAxis0Acc,255, "Length in TPC after Cut (cm)");
487 snprintf(cTempNameAxis0,255, "Length");
493 Int_t binsCheckPtEtaPhi[5] = { iNbin, fPtCheckNbins-1, fEtaCheckNbins-1, 18, fCentralityNbins-1};
494 // Int_t binsCheckPtEtaPhi[5] = { iNbin, fPtNbins-1, fEtaCheckNbins-1, 18, fCentralityNbins-1};
495 Double_t minCheckPtEtaPhi[5] = { dBinMin, 0, -1.5, 0., 0, };
496 Double_t maxCheckPtEtaPhi[5] = { dBinMax, 100, 1.5, 2.*TMath::Pi(), 100};
498 snprintf(cFullTempName, 255, "f%sPtEtaPhiAll",cTempNameAxis0);
499 snprintf(cFullTempTitle, 255,"%s;%s;p_{T} (GeV/c);#eta;#phi;Centrality", cFullTempName, cTempTitleAxis0All);
500 fCrossCheckAll[iCheckQuant] = new THnF(cFullTempName, cFullTempTitle, 5, binsCheckPtEtaPhi, minCheckPtEtaPhi, maxCheckPtEtaPhi);
501 fCrossCheckAll[iCheckQuant]->SetBinEdges(1, fBinsPtCheck);
502 fCrossCheckAll[iCheckQuant]->SetBinEdges(2, fBinsEtaCheck);
503 fCrossCheckAll[iCheckQuant]->Sumw2();
505 snprintf(cFullTempName, 255, "f%sPtEtaPhiAcc",cTempNameAxis0);
506 snprintf(cFullTempTitle, 255,"%s;%s;p_{T} (GeV/c);#eta;#phi;Centrality", cFullTempName, cTempTitleAxis0Acc);
507 fCrossCheckAcc[iCheckQuant] = new THnF(cFullTempName, cFullTempTitle, 5, binsCheckPtEtaPhi, minCheckPtEtaPhi, maxCheckPtEtaPhi);
508 fCrossCheckAcc[iCheckQuant]->SetBinEdges(1, fBinsPtCheck);
509 fCrossCheckAcc[iCheckQuant]->SetBinEdges(2, fBinsEtaCheck);
510 fCrossCheckAcc[iCheckQuant]->Sumw2();
513 fCutPercClusters = new TH1F("fCutPercClusters","fCutPercClusters;NclustersTPC;counts",160,0,160);
514 fCutPercClusters->Sumw2();
515 fCutPercCrossed = new TH1F("fCutPercCrossed","fCutPercCrossed;NcrossedRowsTPC;counts",160,0,160);
516 fCutPercCrossed->Sumw2();
518 fCrossCheckRowsLength = new TH2F("fCrossCheckRowsLength","fCrossCheckRowsLength;Length in TPC;NcrossedRows",170,0,170,170,0,170);
519 fCrossCheckRowsLength->Sumw2();
521 fCrossCheckClusterLength = new TH2F("fCrossCheckClusterLength","fCrossCheckClusterLength;Length in TPC;NClusters",170,0,170,170,0,170);
522 fCrossCheckClusterLength->Sumw2();
524 fCrossCheckRowsLengthAcc = new TH2F("fCrossCheckRowsLengthAcc","fCrossCheckRowsLengthAcc;Length in TPC;NcrossedRows",170,0,170,170,0,170);
525 fCrossCheckRowsLengthAcc->Sumw2();
527 fCrossCheckClusterLengthAcc = new TH2F("fCrossCheckClusterLengthAcc","fCrossCheckClusterLengthAcc;Length in TPC;NClusters",170,0,170,170,0,170);
528 fCrossCheckClusterLengthAcc->Sumw2();
531 // Add Histos, Profiles etc to List
532 fOutputList->Add(fZvPtEtaCent);
533 fOutputList->Add(fPhiPtEtaCent);
534 fOutputList->Add(fPt);
535 fOutputList->Add(fMCRecPrimZvPtEtaCent);
536 fOutputList->Add(fMCGenZvPtEtaCent);
537 fOutputList->Add(fMCRecSecZvPtEtaCent);
538 fOutputList->Add(fMCRecPrimPhiPtEtaCent);
539 fOutputList->Add(fMCGenPhiPtEtaCent);
540 fOutputList->Add(fMCRecSecPhiPtEtaCent);
541 fOutputList->Add(fMCPt);
542 fOutputList->Add(fEventStatistics);
543 fOutputList->Add(fEventStatisticsCentrality);
544 fOutputList->Add(fMCEventStatisticsCentrality);
545 fOutputList->Add(fAllEventStatisticsCentrality);
546 fOutputList->Add(fEventStatisticsCentralityTrigger);
547 fOutputList->Add(fZvMultCent);
548 fOutputList->Add(fTriggerStatistics);
549 fOutputList->Add(fMCTrackPdgCode);
550 fOutputList->Add(fMCTrackStatusCode);
551 fOutputList->Add(fCharge);
552 fOutputList->Add(fMCCharge);
553 fOutputList->Add(fMCPdgPt);
554 fOutputList->Add(fMCHijingPrim);
555 fOutputList->Add(fDCAPtAll);
556 fOutputList->Add(fDCAPtAccepted);
557 fOutputList->Add(fMCDCAPtSecondary);
558 fOutputList->Add(fMCDCAPtPrimary);
559 for(Int_t i = 0; i < cqMax; i++)
561 fOutputList->Add(fCrossCheckAll[i]);
562 fOutputList->Add(fCrossCheckAcc[i]);
564 fOutputList->Add(fCutPercClusters);
565 fOutputList->Add(fCutPercCrossed);
566 fOutputList->Add(fCrossCheckRowsLength);
567 fOutputList->Add(fCrossCheckClusterLength);
568 fOutputList->Add(fCrossCheckRowsLengthAcc);
569 fOutputList->Add(fCrossCheckClusterLengthAcc);
571 PostData(1, fOutputList);
574 void AlidNdPtAnalysisPbPbAOD::UserExec(Option_t *option)
578 // called for each event
579 fEventStatistics->Fill("all events",1);
581 // set ZERO pointers:
582 AliInputEventHandler *inputHandler = NULL;
583 AliAODTrack *track = NULL;
584 AliAODMCParticle *mcPart = NULL;
585 AliAODMCHeader *mcHdr = NULL;
586 AliGenHijingEventHeader *genHijingHeader = NULL;
587 //AliGenPythiaEventHeader *genPythiaHeader = NULL;
589 Bool_t bIsEventSelectedMB = kFALSE;
590 Bool_t bIsEventSelectedSemi = kFALSE;
591 Bool_t bIsEventSelectedCentral = kFALSE;
592 Bool_t bIsEventSelected = kFALSE;
593 Bool_t bIsPrimary = kFALSE;
594 Bool_t bIsHijingParticle = kFALSE;
595 Bool_t bMotherIsHijingParticle = kFALSE;
596 //Bool_t bIsPythiaParticle = kFALSE;
597 Bool_t bEventHasATrack = kFALSE;
598 Bool_t bEventHasATrackInRange = kFALSE;
599 Int_t nTriggerFired = 0;
602 Double_t dMCTrackZvPtEtaCent[4] = {0};
603 Double_t dTrackZvPtEtaCent[4] = {0};
605 Double_t dMCTrackPhiPtEtaCent[4] = {0};
606 Double_t dTrackPhiPtEtaCent[4] = {0};
608 Double_t dDCA[2] = {0};
610 Double_t dMCEventZv = -100;
611 Double_t dEventZv = -100;
612 Int_t iAcceptedMultiplicity = 0;
614 fIsMonteCarlo = kFALSE;
616 AliAODEvent *eventAOD = 0x0;
617 eventAOD = dynamic_cast<AliAODEvent*>( InputEvent() );
619 AliWarning("ERROR: eventAOD not available \n");
623 // check, which trigger has been fired
624 inputHandler = (AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
625 bIsEventSelectedMB = ( inputHandler->IsEventSelected() & AliVEvent::kMB);
626 bIsEventSelectedSemi = ( inputHandler->IsEventSelected() & AliVEvent::kSemiCentral);
627 bIsEventSelectedCentral = ( inputHandler->IsEventSelected() & AliVEvent::kCentral);
629 if(bIsEventSelectedMB || bIsEventSelectedSemi || bIsEventSelectedCentral) fTriggerStatistics->Fill("all triggered events",1);
630 if(bIsEventSelectedMB) { fTriggerStatistics->Fill("MB trigger",1); nTriggerFired++; }
631 if(bIsEventSelectedSemi) { fTriggerStatistics->Fill("SemiCentral trigger",1); nTriggerFired++; }
632 if(bIsEventSelectedCentral) { fTriggerStatistics->Fill("Central trigger",1); nTriggerFired++; }
633 if(nTriggerFired == 0) { fTriggerStatistics->Fill("No trigger",1); }
635 bIsEventSelected = ( inputHandler->IsEventSelected() & GetCollisionCandidates() );
637 // only take tracks of events, which are triggered
638 if(nTriggerFired == 0) { return; }
640 // if( !bIsEventSelected || nTriggerFired>1 ) return;
642 // fEventStatistics->Fill("events with only coll. cand.", 1);
646 // check if there is a stack, if yes, then do MC loop
647 TList *list = eventAOD->GetList();
648 TClonesArray *stack = 0x0;
649 stack = (TClonesArray*)list->FindObject(AliAODMCParticle::StdBranchName());
653 fIsMonteCarlo = kTRUE;
655 mcHdr = (AliAODMCHeader*)list->FindObject(AliAODMCHeader::StdBranchName());
657 genHijingHeader = GetHijingEventHeader(mcHdr);
658 // genPythiaHeader = GetPythiaEventHeader(mcHdr);
660 if(!genHijingHeader) { return; }
662 // if(!genPythiaHeader) { return; }
664 dMCEventZv = mcHdr->GetVtxZ();
665 dMCTrackZvPtEtaCent[0] = dMCEventZv;
666 fEventStatistics->Fill("MC all events",1);
669 AliCentrality* aCentrality = eventAOD->GetCentrality();
670 Double_t dCentrality = aCentrality->GetCentralityPercentile("V0M");
672 if( dCentrality < 0 ) return;
673 fEventStatistics->Fill("after centrality selection",1);
677 // start with MC truth analysis
681 if( dMCEventZv > GetCutMaxZVertex() ) { return; }
683 dMCTrackZvPtEtaCent[0] = dMCEventZv;
685 fEventStatistics->Fill("MC afterZv cut",1);
687 for(Int_t iMCtrack = 0; iMCtrack < stack->GetEntriesFast(); iMCtrack++)
689 mcPart =(AliAODMCParticle*)stack->At(iMCtrack);
692 if( !(IsMCTrackAccepted(mcPart)) ) continue;
694 if(!IsHijingParticle(mcPart, genHijingHeader)) { continue; }
696 if(mcPart->IsPhysicalPrimary() )
698 fMCHijingPrim->Fill("IsPhysicalPrimary",1);
702 fMCHijingPrim->Fill("NOT a primary",1);
708 // ======================== fill histograms ========================
709 dMCTrackZvPtEtaCent[1] = mcPart->Pt();
710 dMCTrackZvPtEtaCent[2] = mcPart->Eta();
711 dMCTrackZvPtEtaCent[3] = dCentrality;
712 fMCGenZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
714 dMCTrackPhiPtEtaCent[0] = mcPart->Phi();
715 dMCTrackPhiPtEtaCent[1] = mcPart->Pt();
716 dMCTrackPhiPtEtaCent[2] = mcPart->Eta();
717 dMCTrackPhiPtEtaCent[3] = dCentrality;
718 fMCGenPhiPtEtaCent->Fill(dMCTrackPhiPtEtaCent);
720 bEventHasATrack = kTRUE;
723 if( (dMCTrackZvPtEtaCent[1] > GetCutPtMin() ) &&
724 (dMCTrackZvPtEtaCent[1] < GetCutPtMax() ) &&
725 (dMCTrackZvPtEtaCent[2] > GetCutEtaMin() ) &&
726 (dMCTrackZvPtEtaCent[2] < GetCutEtaMax() ) )
728 fMCPt->Fill(mcPart->Pt());
729 fMCCharge->Fill(mcPart->Charge()/3.);
730 bEventHasATrackInRange = kTRUE;
736 if(bEventHasATrack) { fEventStatistics->Fill("MC events with tracks",1); }
737 if(bEventHasATrackInRange)
739 fEventStatistics->Fill("MC events with tracks in range",1);
740 fMCEventStatisticsCentrality->Fill(dCentrality);
742 bEventHasATrack = kFALSE;
743 bEventHasATrackInRange = kFALSE;
747 // Loop over recontructed tracks
749 dEventZv = eventAOD->GetPrimaryVertex()->GetZ();
750 if( TMath::Abs(dEventZv) > GetCutMaxZVertex() ) return;
752 fAllEventStatisticsCentrality->Fill(dCentrality/*, nTriggerFired*/);
754 fEventStatistics->Fill("after Zv cut",1);
756 dTrackZvPtEtaCent[0] = dEventZv;
758 if(AreRelativeCutsEnabled())
760 if(!SetRelativeCuts(eventAOD)) return;
763 for(Int_t itrack = 0; itrack < eventAOD->GetNumberOfTracks(); itrack++)
765 track = eventAOD->GetTrack(itrack);
769 dMCTrackZvPtEtaCent[1] = 0;
770 dMCTrackZvPtEtaCent[2] = 0;
771 dMCTrackZvPtEtaCent[3] = 0;
773 dMCTrackPhiPtEtaCent[0] = 0;
774 dMCTrackPhiPtEtaCent[1] = 0;
775 dMCTrackPhiPtEtaCent[2] = 0;
776 dMCTrackPhiPtEtaCent[3] = 0;
780 GetDCA(track, eventAOD, dDCA);
782 Double_t dDCAxyDCAzPt[5] = { dDCA[0], dDCA[1], track->Pt(), track->Eta(), track->Phi() };
784 fDCAPtAll->Fill(dDCAxyDCAzPt);
786 if( !(IsTrackAccepted(track, dCentrality, eventAOD->GetMagneticField())) ) continue;
788 dTrackZvPtEtaCent[1] = track->Pt();
789 dTrackZvPtEtaCent[2] = track->Eta();
790 dTrackZvPtEtaCent[3] = dCentrality;
792 dTrackPhiPtEtaCent[0] = track->Phi();
793 dTrackPhiPtEtaCent[1] = track->Pt();
794 dTrackPhiPtEtaCent[2] = track->Eta();
795 dTrackPhiPtEtaCent[3] = dCentrality;
799 mcPart = (AliAODMCParticle*)stack->At(TMath::Abs(track->GetLabel()));
800 if( !mcPart ) { continue; }
803 // if( !(IsMCTrackAccepted(mcPart)) ) { continue; }
805 bIsHijingParticle = IsHijingParticle(mcPart, genHijingHeader);
806 // bIsPythiaParticle = IsPythiaParticle(mcPart, genPythiaHeader);
808 // if(!bIsHijingParticle) continue; // only take real tracks, not injected ones
810 bIsPrimary = mcPart->IsPhysicalPrimary();
812 dMCTrackZvPtEtaCent[1] = mcPart->Pt();
813 dMCTrackZvPtEtaCent[2] = mcPart->Eta();
814 dMCTrackZvPtEtaCent[3] = dCentrality;
816 dMCTrackPhiPtEtaCent[0] = mcPart->Phi();
817 dMCTrackPhiPtEtaCent[1] = mcPart->Pt();
818 dMCTrackPhiPtEtaCent[2] = mcPart->Eta();
819 dMCTrackPhiPtEtaCent[3] = dCentrality;
821 if(bIsPrimary && bIsHijingParticle)
823 fMCRecPrimZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
824 fMCRecPrimPhiPtEtaCent->Fill(dMCTrackPhiPtEtaCent);
825 if( (TMath::Abs(mcPart->Eta()) < 0.8) && (dCentrality<5.) ) { fMCPdgPt->Fill(mcPart->Pt(), Form("%s",GetParticleName(mcPart->GetPdgCode())), 1); }
826 fMCDCAPtPrimary->Fill(dDCAxyDCAzPt);
829 if(!bIsPrimary /*&& !bIsHijingParticle*/)
831 Int_t indexMoth = mcPart->GetMother();
834 AliAODMCParticle* moth = (AliAODMCParticle*)stack->At(indexMoth);
835 bMotherIsHijingParticle = IsHijingParticle(moth, genHijingHeader);
837 if(bMotherIsHijingParticle) // only store secondaries, which come from a not embedded signal!
839 fMCTrackStatusCode->Fill(Form("%d",mcPart->GetStatus()), 1);
842 fMCRecSecZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
843 fMCRecSecPhiPtEtaCent->Fill(dMCTrackPhiPtEtaCent);
844 fMCDCAPtSecondary->Fill(dDCAxyDCAzPt);
845 fMCTrackPdgCode->Fill(Form("%s_H%i_H%i",GetParticleName(moth->GetPdgCode()),bMotherIsHijingParticle, bIsHijingParticle), 1);
850 } // end isMonteCarlo
852 // ======================== fill histograms ========================
854 // only keep prim and sec from not embedded signal
855 Bool_t bKeepMCTrack = kFALSE;
858 if( (bIsHijingParticle && bIsPrimary) ^ (bMotherIsHijingParticle && !bIsPrimary) )
860 bKeepMCTrack = kTRUE;
868 bEventHasATrack = kTRUE;
870 fZvPtEtaCent->Fill(dTrackZvPtEtaCent);
871 fPhiPtEtaCent->Fill(dTrackPhiPtEtaCent);
873 fDCAPtAccepted->Fill(dDCAxyDCAzPt);
875 if( (dTrackZvPtEtaCent[1] > GetCutPtMin()) &&
876 (dTrackZvPtEtaCent[1] < GetCutPtMax()) &&
877 (dTrackZvPtEtaCent[2] > GetCutEtaMin()) &&
878 (dTrackZvPtEtaCent[2] < GetCutEtaMax()) )
880 iAcceptedMultiplicity++;
881 bEventHasATrackInRange = kTRUE;
882 fPt->Fill(track->Pt());
883 fCharge->Fill(track->Charge());
887 if(bEventHasATrack) { fEventStatistics->Fill("events with tracks",1); bEventHasATrack = kFALSE; }
889 if(bEventHasATrackInRange)
891 fEventStatistics->Fill("events with tracks in range",1);
892 fEventStatisticsCentrality->Fill(dCentrality);
893 bEventHasATrackInRange = kFALSE;
895 if(bIsEventSelectedMB) fEventStatisticsCentralityTrigger->Fill(dCentrality, 0);
896 if(bIsEventSelectedSemi) fEventStatisticsCentralityTrigger->Fill(dCentrality, 1);
897 if(bIsEventSelectedCentral) fEventStatisticsCentralityTrigger->Fill(dCentrality, 2);
900 Double_t dEventZvMultCent[3] = {dEventZv, iAcceptedMultiplicity, dCentrality};
901 fZvMultCent->Fill(dEventZvMultCent);
903 PostData(1, fOutputList);
907 Bool_t AlidNdPtAnalysisPbPbAOD::SetRelativeCuts(AliAODEvent *event)
909 if(!event) return kFALSE;
911 AliAODTrack *tr = 0x0;
912 TH1F *hCluster = new TH1F("hCluster","hCluster",160,0,160);
913 TH1F *hCrossed = new TH1F("hCrossed","hCrossed",160,0,160);
915 for(Int_t itrack = 0; itrack < event->GetNumberOfTracks(); itrack++)
917 tr = event->GetTrack(itrack);
920 // do some selection already
921 //if(!(tr->TestFilterBit(AliAODTrack::kTrkGlobal)) ) { continue; }
923 Double_t dNClustersTPC = tr->GetTPCNcls();
924 Double_t dCrossedRowsTPC = tr->GetTPCClusterInfo(2,1);
926 hCluster->Fill(dNClustersTPC);
927 hCrossed->Fill(dCrossedRowsTPC);
930 // loop trough histogram to check, where percentage is reach
931 Double_t dTotIntCluster = hCluster->Integral();
932 Double_t dTotIntCrossed = hCrossed->Integral();
933 Float_t dIntCluster = 0;
934 Float_t dIntCrossed = 0;
938 for(Int_t i = 0; i < hCluster->GetNbinsX(); i++)
940 if(hCluster->GetBinCenter(i) < 0) continue;
941 dIntCluster += hCluster->GetBinContent(i);
942 if(dIntCluster/dTotIntCluster > (1-GetCutPercMinNClustersTPC()))
944 SetCutMinNClustersTPC(hCluster->GetBinCenter(i));
945 fCutPercClusters->Fill(hCluster->GetBinCenter(i));
953 for(Int_t i = 0; i < hCrossed->GetNbinsX(); i++)
955 if(hCrossed->GetBinCenter(i) < 0) continue;
956 dIntCrossed += hCrossed->GetBinContent(i);
957 if(dIntCrossed/dTotIntCrossed > (1-GetCutPercMinNCrossedRowsTPC()))
959 SetCutMinNClustersTPC(hCrossed->GetBinCenter(i));
960 fCutPercCrossed->Fill(hCrossed->GetBinCenter(i));
972 Bool_t AlidNdPtAnalysisPbPbAOD::IsTrackAccepted(AliAODTrack *tr, Double_t dCentrality, Double_t bMagZ)
974 if(!tr) return kFALSE;
976 if(tr->Charge()==0) { return kFALSE; }
979 // as done in AliAnalysisTaskFragmentationFunction
982 Short_t sign = tr->Charge();
987 for(Int_t i = 0; i < 100; i++) cv[i] = 0;
988 for(Int_t i = 0; i < 50; i++) xyz[i] = 0;
989 for(Int_t i = 0; i < 50; i++) pxpypz[i] = 0;
992 tr->GetPxPyPz(pxpypz);
994 // similar error occured as this one:
995 // See https://savannah.cern.ch/bugs/?102721
996 // which is one of the two 11h re-filtering follow-ups:
997 // Andrea Dainese now first does the beam pipe
998 // check and then copies from the vtrack (was the other
999 // way around) to avoid the crash in the etp::Set()
1001 // if(xyz[0]*xyz[0]+xyz[1]*xyz[1] > 3.*3.) { return kFALSE; }
1003 AliExternalTrackParam * par = new AliExternalTrackParam(xyz, pxpypz, cv, sign);
1004 if(!par) { return kFALSE; }
1006 // Double_t dLength = dummy.GetLengthInActiveZone(par,3,236, -5 ,0,0);
1007 // Double_t dLengthInTPC = GetLengthInTPC(tr, 1.8, 220, bMagZ);
1009 Double_t dLengthInTPC = dummy.GetLengthInActiveZone(par,3,236, bMagZ ,0,0);
1010 Double_t dNClustersTPC = tr->GetTPCNcls();
1011 Double_t dCrossedRowsTPC = tr->GetTPCClusterInfo(2,1);
1012 Double_t dFindableClustersTPC = tr->GetTPCNclsF();
1013 Double_t dChi2PerClusterTPC = (dNClustersTPC>0)?tr->Chi2perNDF()*(dNClustersTPC-5)/dNClustersTPC:-1.; // see AliDielectronVarManager.h
1015 // hAllCrossedRowsTPC->Fill(dCrossedRowsTPC);
1017 Double_t dCheck[cqMax] = {dCrossedRowsTPC, dNClustersTPC, dChi2PerClusterTPC, dLengthInTPC};// = new Double_t[cqMax];
1018 Double_t dKine[kqMax] = {tr->Pt(), tr->Eta(), tr->Phi()};// = new Double_t[kqMax];
1019 // dKine[0] = tr->Pt();
1020 // dKine[1] = tr->Eta();
1021 // dKine[2] = tr->Phi();
1023 // dCheck[0] = dCrossedRowsTPC;
1024 // dCheck[1] = dNClustersTPC;
1025 // dCheck[2] = dChi2PerClusterTPC;
1028 FillDebugHisto(dCheck, dKine, dCentrality, kFALSE);
1030 // first cut on length
1032 if( DoCutLengthInTPCPtDependent() && ( dLengthInTPC < GetPrefactorLengthInTPCPtDependent()*(130-5*TMath::Abs(1./tr->Pt())) ) ) { return kFALSE; }
1035 if(!(tr->TestFilterBit(AliAODTrack::kTrkGlobal)) ) { return kFALSE; }
1038 // if(!(tr->TestFilterBit(AliAODTrack::kTrkGlobalNoDCA)) ) { return kFALSE; }
1040 // hFilterCrossedRowsTPC->Fill(dCrossedRowsTPC);
1043 if(dFindableClustersTPC == 0) {return kFALSE; }
1044 if(dCrossedRowsTPC < GetCutMinNCrossedRowsTPC()) { return kFALSE; }
1045 if( (dCrossedRowsTPC/dFindableClustersTPC) < GetCutMinRatioCrossedRowsOverFindableClustersTPC() ) { return kFALSE; }
1046 if(dNClustersTPC < GetCutMinNClustersTPC()) { return kFALSE; }
1048 if (!(tr->GetStatus() & AliVTrack::kITSrefit)) { return kFALSE; } // no ITS refit
1050 // do a relativ cut in Nclusters, both time at 80% of mean
1051 // if(fIsMonteCarlo)
1053 // if(dNClustersTPC < 88) { return kFALSE; }
1057 // if(dNClustersTPC < 76) { return kFALSE; }
1061 FillDebugHisto(dCheck, dKine, dCentrality, kTRUE);
1064 // hAccNclsTPC->Fill(dNClustersTPC);
1065 // hAccCrossedRowsTPC->Fill(dCrossedRowsTPC);
1066 // Double_t dFindableClustersTPC = tr->GetTPCNclsF();
1067 // Double_t dChi2PerClusterTPC = (dNClustersTPC>0)?tr->Chi2perNDF()*(dNClustersTPC-5)/dNClustersTPC:-1.; // see AliDielectronVarManager.h
1069 // Bool_t bIsFromKink = kFALSE;
1070 // if(tr->GetProdVertex()->GetType() == AliAODVertex::kKink) bIsFromKink = kTRUE;
1072 // // from AliAnalysisTaskPIDqa.cxx
1073 // ULong_t uStatus = tr->GetStatus();
1074 // Bool_t bHasRefitTPC = kFALSE;
1075 // Bool_t bHasRefitITS = kFALSE;
1077 // if ((uStatus & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) bHasRefitTPC = kTRUE;
1078 // if ((uStatus & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) bHasRefitITS = kTRUE;
1080 // // from AliDielectronVarManager.h
1081 // Bool_t bHasHitInSPD = kFALSE;
1082 // for (Int_t iC=0; iC<2; iC++)
1084 // if (((tr->GetITSClusterMap()) & (1<<(iC))) > 0) { bHasHitInSPD = kTRUE; }
1087 // Double_t dNClustersITS = tr->GetITSNcls();
1091 // esdTrackCuts->SetMinNCrossedRowsTPC(70);
1092 // esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
1094 // esdTrackCuts->SetMaxChi2PerClusterTPC(4);
1095 // esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
1096 // esdTrackCuts->SetRequireTPCRefit(kTRUE);
1098 // esdTrackCuts->SetRequireITSRefit(kTRUE);
1099 // esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
1101 // esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
1102 // esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
1104 // esdTrackCuts->SetMaxDCAToVertexZ(2);
1105 // esdTrackCuts->SetDCAToVertex2D(kFALSE);
1106 // esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
1108 // esdTrackCuts->SetMaxChi2PerClusterITS(36);
1111 // delete [] dCheck;
1115 Bool_t AlidNdPtAnalysisPbPbAOD::FillDebugHisto(Double_t *dCrossCheckVar, Double_t *dKineVar, Double_t dCentrality, Bool_t bIsAccepted)
1119 for(Int_t iCrossCheck = 0; iCrossCheck < cqMax; iCrossCheck++)
1121 Double_t dFillIt[5] = {dCrossCheckVar[iCrossCheck], dKineVar[0], dKineVar[1], dKineVar[2], dCentrality};
1122 fCrossCheckAcc[iCrossCheck]->Fill(dFillIt);
1125 fCrossCheckRowsLengthAcc->Fill(dCrossCheckVar[cqLength], dCrossCheckVar[cqCrossedRows]);
1126 fCrossCheckClusterLengthAcc->Fill(dCrossCheckVar[cqLength], dCrossCheckVar[cqNcluster]);
1130 for(Int_t iCrossCheck = 0; iCrossCheck < cqMax; iCrossCheck++)
1132 Double_t dFillIt[5] = {dCrossCheckVar[iCrossCheck], dKineVar[0], dKineVar[1], dKineVar[2], dCentrality};
1133 fCrossCheckAll[iCrossCheck]->Fill(dFillIt);
1136 fCrossCheckRowsLength->Fill(dCrossCheckVar[cqLength], dCrossCheckVar[cqCrossedRows]);
1137 fCrossCheckClusterLength->Fill(dCrossCheckVar[cqLength], dCrossCheckVar[cqNcluster]);
1144 Bool_t AlidNdPtAnalysisPbPbAOD::GetDCA(const AliAODTrack *track, AliAODEvent *evt, Double_t d0z0[2])
1146 // function adapted from AliDielectronVarManager.h
1148 if(track->TestBit(AliAODTrack::kIsDCA)){
1149 d0z0[0]=track->DCA();
1150 d0z0[1]=track->ZAtDCA();
1156 Double_t covd0z0[3];
1157 //AliAODTrack copy(*track);
1158 AliExternalTrackParam etp; etp.CopyFromVTrack(track);
1160 Float_t xstart = etp.GetX();
1164 //printf("This method can be used only for propagation inside the beam pipe \n");
1169 AliAODVertex *vtx =(AliAODVertex*)(evt->GetPrimaryVertex());
1170 Double_t fBzkG = evt->GetMagneticField(); // z componenent of field in kG
1171 ok = etp.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0);
1172 //ok = copy.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0);
1182 Bool_t AlidNdPtAnalysisPbPbAOD::IsMCTrackAccepted(AliAODMCParticle *part)
1184 if(!part) return kFALSE;
1186 Double_t charge = part->Charge()/3.;
1187 if (TMath::Abs(charge) < 0.001) return kFALSE;
1192 const char * AlidNdPtAnalysisPbPbAOD::GetParticleName(Int_t pdg)
1194 TParticlePDG * p1 = TDatabasePDG::Instance()->GetParticle(pdg);
1195 if(p1) return p1->GetName();
1196 return Form("%d", pdg);
1199 AliGenHijingEventHeader* AlidNdPtAnalysisPbPbAOD::GetHijingEventHeader(AliAODMCHeader *header)
1202 // inspired by PWGJE/AliPWG4HighPtSpectra.cxx
1205 if(!header) return 0x0;
1206 AliGenHijingEventHeader* hijingGenHeader = NULL;
1208 TList* headerList = header->GetCocktailHeaders();
1210 for(Int_t i = 0; i < headerList->GetEntries(); i++)
1212 hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(headerList->At(i));
1213 if(hijingGenHeader) break;
1216 if(!hijingGenHeader) return 0x0;
1218 return hijingGenHeader;
1221 AliGenPythiaEventHeader* AlidNdPtAnalysisPbPbAOD::GetPythiaEventHeader(AliAODMCHeader *header)
1224 // inspired by PWGJE/AliPWG4HighPtSpectra.cxx
1227 if(!header) return 0x0;
1228 AliGenPythiaEventHeader* PythiaGenHeader = NULL;
1230 TList* headerList = header->GetCocktailHeaders();
1232 for(Int_t i = 0; i < headerList->GetEntries(); i++)
1234 PythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(i));
1235 if(PythiaGenHeader) break;
1238 if(!PythiaGenHeader) return 0x0;
1240 return PythiaGenHeader;
1243 //________________________________________________________________________
1244 Bool_t AlidNdPtAnalysisPbPbAOD::IsHijingParticle(const AliAODMCParticle *part, AliGenHijingEventHeader* hijingGenHeader){
1246 // Check whether a particle is from Hijing or some injected
1247 // returns kFALSE if particle is injected
1249 if(part->Label() > (hijingGenHeader->NProduced()-1)) return kFALSE;
1253 //________________________________________________________________________
1254 Bool_t AlidNdPtAnalysisPbPbAOD::IsPythiaParticle(const AliAODMCParticle *part, AliGenPythiaEventHeader* pythiaGenHeader){
1256 // Check whether a particle is from Pythia or some injected
1258 if(part->Label() > (pythiaGenHeader->NProduced()-1)) return kFALSE;
1262 Double_t* AlidNdPtAnalysisPbPbAOD::GetArrayClone(Int_t n, Double_t* source)
1264 if (!source || n==0) return 0;
1265 Double_t* dest = new Double_t[n];
1266 for (Int_t i=0; i<n ; i++) { dest[i] = source[i]; }
1270 void AlidNdPtAnalysisPbPbAOD::Terminate(Option_t *)