]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/SPECTRA/ChargedHadrons/dNdPt/AlidNdPtAnalysisPbPbAOD.cxx
Added AlidNdPtAnalysisPbPbAOD.{h,cxx}
[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),
38hnMCSecZvPtEtaCent(0),
39hEventStatistics(0),
40hEventStatisticsCentrality(0),
41hAllEventStatisticsCentrality(0),
42hnZvMultCent(0),
43hTriggerStatistics(0),
44hMCTrackPdgCode(0),
45hMCTrackStatusCode(0),
46hCharge(0),
47hMCCharge(0),
48hMCPdgPt(0),
49hMCHijingPrim(0),
50hAccNclsTPC(0),
51hAccCrossedRowsTPC(0),
52//global
53bIsMonteCarlo(0),
54// event cut variables
55dCutMaxZVertex(10.),
56// track kinematic cut variables
57dCutPtMin(0.15),
58dCutPtMax(1000.),
59dCutEtaMin(-0.8),
60dCutEtaMax(0.8),
61// track quality cut variables
62bCutRequireTPCRefit(kTRUE),
63dCutMinNumberOfCrossedRows(120.),
64dCutMinRatioCrossedRowsOverFindableClustersTPC(0.8),
65dCutMaxChi2PerClusterTPC(4.),
66dCutMaxFractionSharedTPCClusters(0.4),
67dCutMaxDCAToVertexZ(3.0),
68dCutMaxDCAToVertexXY(3.0),
69bCutRequireITSRefit(kTRUE),
70dCutMaxChi2PerClusterITS(36.),
71dCutDCAToVertex2D(kFALSE),
72dCutRequireSigmaToVertex(kFALSE),
73dCutMaxDCAToVertexXYPtDepPar0(0.0182),
74dCutMaxDCAToVertexXYPtDepPar1(0.0350),
75dCutMaxDCAToVertexXYPtDepPar2(1.01),
76bCutAcceptKinkDaughters(kFALSE),
77dCutMaxChi2TPCConstrainedGlobal(36.),
78// binning for THnSparse
79fMultNbins(0),
80fPtNbins(0),
81fPtCorrNbins(0),
82fEtaNbins(0),
83fZvNbins(0),
84fCentralityNbins(0),
85fBinsMult(0),
86fBinsPt(0),
87fBinsPtCorr(0),
88fBinsEta(0),
89fBinsZv(0),
90fBinsCentrality(0)
91{
92
93 fMultNbins = 0;
94 fPtNbins = 0;
95 fPtCorrNbins = 0;
96 fEtaNbins = 0;
97 fZvNbins = 0;
98 fCentralityNbins = 0;
99 fBinsMult = 0;
100 fBinsPt = 0;
101 fBinsPtCorr = 0;
102 fBinsEta = 0;
103 fBinsEta = 0;
104 fBinsZv = 0;
105 fBinsCentrality = 0;
106
107}
108
109AlidNdPtAnalysisPbPbAOD::AlidNdPtAnalysisPbPbAOD(const char *name) : AliAnalysisTaskSE(name),
110fOutputList(0),
111// Histograms
112hPt(0),
113hMCPt(0),
114hnZvPtEtaCent(0),
115hnMCRecPrimZvPtEtaCent(0),
116hnMCGenZvPtEtaCent(0),
117hnMCSecZvPtEtaCent(0),
118hEventStatistics(0),
119hEventStatisticsCentrality(0),
120hAllEventStatisticsCentrality(0),
121hnZvMultCent(0),
122hTriggerStatistics(0),
123hMCTrackPdgCode(0),
124hMCTrackStatusCode(0),
125hCharge(0),
126hMCCharge(0),
127hMCPdgPt(0),
128hMCHijingPrim(0),
129hAccNclsTPC(0),
130hAccCrossedRowsTPC(0),
131//global
132bIsMonteCarlo(0),
133// event cut variables
134dCutMaxZVertex(10.),
135// track kinematic cut variables
136dCutPtMin(0.15),
137dCutPtMax(200.),
138dCutEtaMin(-0.8),
139dCutEtaMax(0.8),
140// track quality cut variables
141bCutRequireTPCRefit(kTRUE),
142dCutMinNumberOfCrossedRows(120.),
143dCutMinRatioCrossedRowsOverFindableClustersTPC(0.8),
144dCutMaxChi2PerClusterTPC(4.),
145dCutMaxFractionSharedTPCClusters(0.4),
146dCutMaxDCAToVertexZ(3.0),
147dCutMaxDCAToVertexXY(3.0),
148bCutRequireITSRefit(kTRUE),
149dCutMaxChi2PerClusterITS(36.),
150dCutDCAToVertex2D(kFALSE),
151dCutRequireSigmaToVertex(kFALSE),
152dCutMaxDCAToVertexXYPtDepPar0(0.0182),
153dCutMaxDCAToVertexXYPtDepPar1(0.0350),
154dCutMaxDCAToVertexXYPtDepPar2(1.01),
155bCutAcceptKinkDaughters(kFALSE),
156dCutMaxChi2TPCConstrainedGlobal(36.),
157// binning for THnSparse
158fMultNbins(0),
159fPtNbins(0),
160fPtCorrNbins(0),
161fEtaNbins(0),
162fZvNbins(0),
163fCentralityNbins(0),
164fBinsMult(0),
165fBinsPt(0),
166fBinsPtCorr(0),
167fBinsEta(0),
168fBinsZv(0),
169fBinsCentrality(0)
170{
171 fMultNbins = 0;
172 fPtNbins = 0;
173 fPtCorrNbins = 0;
174 fEtaNbins = 0;
175 fZvNbins = 0;
176 fCentralityNbins = 0;
177 fBinsMult = 0;
178 fBinsPt = 0;
179 fBinsPtCorr = 0;
180 fBinsEta = 0;
181 fBinsEta = 0;
182 fBinsZv = 0;
183 fBinsCentrality = 0;
184
185 DefineOutput(1, TList::Class());
186}
187
188// destructor
189AlidNdPtAnalysisPbPbAOD::~AlidNdPtAnalysisPbPbAOD()
190{
191 if(hnZvPtEtaCent) delete hnZvPtEtaCent; hnZvPtEtaCent = 0;
192 if(hPt) delete hPt; hPt = 0;
193}
194
195void AlidNdPtAnalysisPbPbAOD::UserCreateOutputObjects()
196{
197 // create all output histograms here
198 OpenFile(1, "RECREATE");
199
200 fOutputList = new TList();
201 fOutputList->SetOwner();
202
203 //define default binning
204 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 };
205 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};
206 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};
207 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};
208 Double_t binsZvDefault[13] = {-30.,-25.,-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.,25.,30.};
209 Double_t binsCentralityDefault[12] = {0., 5., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.};
210
211 // if no binning is set, use the default
212 if (!fBinsMult) { SetBinsMult(48,binsMultDefault); }
213 if (!fBinsPt) { SetBinsPt(82,binsPtDefault); }
214 if (!fBinsPtCorr) { SetBinsPtCorr(37,binsPtCorrDefault); }
215 if (!fBinsEta) { SetBinsEta(31,binsEtaDefault); }
216 if (!fBinsZv) { SetBinsZv(13,binsZvDefault); }
217 if (!fBinsCentrality) { SetBinsCentrality(12,binsCentralityDefault); }
218
219 Int_t binsZvPtEtaCent[4]={fZvNbins-1,fPtNbins-1,fEtaNbins-1,fCentralityNbins-1};
220 Int_t binsZvMultCent[3]={fZvNbins-1,fMultNbins-1,fCentralityNbins-1};
221
222 // define Histograms
223 hnZvPtEtaCent = new THnSparseF("hnZvPtEtaCent","Zv:Pt:Eta:Centrality",4,binsZvPtEtaCent);
224 hnZvPtEtaCent->SetBinEdges(0,fBinsZv);
225 hnZvPtEtaCent->SetBinEdges(1,fBinsPt);
226 hnZvPtEtaCent->SetBinEdges(2,fBinsEta);
227 hnZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
228 hnZvPtEtaCent->GetAxis(0)->SetTitle("Zv (cm)");
229 hnZvPtEtaCent->GetAxis(1)->SetTitle("Pt (GeV/c)");
230 hnZvPtEtaCent->GetAxis(2)->SetTitle("Eta");
231 hnZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
232 hnZvPtEtaCent->Sumw2();
233
234 hnMCRecPrimZvPtEtaCent = new THnSparseF("hnMCRecPrimZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
235 hnMCRecPrimZvPtEtaCent->SetBinEdges(0,fBinsZv);
236 hnMCRecPrimZvPtEtaCent->SetBinEdges(1,fBinsPt);
237 hnMCRecPrimZvPtEtaCent->SetBinEdges(2,fBinsEta);
238 hnMCRecPrimZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
239 hnMCRecPrimZvPtEtaCent->GetAxis(0)->SetTitle("MC Zv (cm)");
240 hnMCRecPrimZvPtEtaCent->GetAxis(1)->SetTitle("MC Pt (GeV/c)");
241 hnMCRecPrimZvPtEtaCent->GetAxis(2)->SetTitle("MC Eta");
242 hnMCRecPrimZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
243 hnMCRecPrimZvPtEtaCent->Sumw2();
244
245 hnMCGenZvPtEtaCent = new THnSparseF("hnMCGenZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
246 hnMCGenZvPtEtaCent->SetBinEdges(0,fBinsZv);
247 hnMCGenZvPtEtaCent->SetBinEdges(1,fBinsPt);
248 hnMCGenZvPtEtaCent->SetBinEdges(2,fBinsEta);
249 hnMCGenZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
250 hnMCGenZvPtEtaCent->GetAxis(0)->SetTitle("MC Zv (cm)");
251 hnMCGenZvPtEtaCent->GetAxis(1)->SetTitle("MC Pt (GeV/c)");
252 hnMCGenZvPtEtaCent->GetAxis(2)->SetTitle("MC Eta");
253 hnMCGenZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
254 hnMCGenZvPtEtaCent->Sumw2();
255
256 hnMCSecZvPtEtaCent = new THnSparseF("hnMCSecZvPtEtaCent","mcZv:mcPt:mcEta:Centrality",4,binsZvPtEtaCent);
257 hnMCSecZvPtEtaCent->SetBinEdges(0,fBinsZv);
258 hnMCSecZvPtEtaCent->SetBinEdges(1,fBinsPt);
259 hnMCSecZvPtEtaCent->SetBinEdges(2,fBinsEta);
260 hnMCSecZvPtEtaCent->SetBinEdges(3,fBinsCentrality);
261 hnMCSecZvPtEtaCent->GetAxis(0)->SetTitle("MC Sec Zv (cm)");
262 hnMCSecZvPtEtaCent->GetAxis(1)->SetTitle("MC Sec Pt (GeV/c)");
263 hnMCSecZvPtEtaCent->GetAxis(2)->SetTitle("MC Sec Eta");
264 hnMCSecZvPtEtaCent->GetAxis(3)->SetTitle("Centrality");
265 hnMCSecZvPtEtaCent->Sumw2();
266
267 hPt = new TH1F("hPt","hPt",2000,0,200);
268 hPt->GetXaxis()->SetTitle("p_{T} (GeV/c)");
269 hPt->GetYaxis()->SetTitle("dN/dp_{T}");
270 hPt->Sumw2();
271
272 hMCPt = new TH1F("hMCPt","hMCPt",2000,0,200);
273 hMCPt->GetXaxis()->SetTitle("MC p_{T} (GeV/c)");
274 hMCPt->GetYaxis()->SetTitle("dN/dp_{T}");
275 hMCPt->Sumw2();
276
277 hEventStatistics = new TH1F("hEventStatistics","hEventStatistics",10,0,10);
278 hEventStatistics->GetYaxis()->SetTitle("number of events");
279 hEventStatistics->SetBit(TH1::kCanRebin);
280
281 hEventStatisticsCentrality = new TH1F("hEventStatisticsCentrality","hEventStatisticsCentrality",fCentralityNbins-1, fBinsCentrality);
282 hEventStatisticsCentrality->GetYaxis()->SetTitle("number of events");
283
284 hAllEventStatisticsCentrality = new TH1F("hAllEventStatisticsCentrality","hAllEventStatisticsCentrality",fCentralityNbins-1, fBinsCentrality);
285 hAllEventStatisticsCentrality->GetYaxis()->SetTitle("number of events");
286
287 hnZvMultCent = new THnSparseF("hnZvMultCent","Zv:mult:Centrality",3,binsZvMultCent);
288 hnZvMultCent->SetBinEdges(0,fBinsZv);
289 hnZvMultCent->SetBinEdges(1,fBinsMult);
290 hnZvMultCent->SetBinEdges(2,fBinsCentrality);
291 hnZvMultCent->GetAxis(0)->SetTitle("Zv (cm)");
292 hnZvMultCent->GetAxis(1)->SetTitle("N_{acc}");
293 hnZvMultCent->GetAxis(2)->SetTitle("Centrality");
294 hnZvMultCent->Sumw2();
295
296 hTriggerStatistics = new TH1F("hTriggerStatistics","hTriggerStatistics",10,0,10);
297 hTriggerStatistics->GetYaxis()->SetTitle("number of events");
298
299 hMCTrackPdgCode = new TH1F("hMCTrackPdgCode","hMCTrackPdgCode",100,0,10);
300 hMCTrackPdgCode->GetYaxis()->SetTitle("number of tracks");
301 hMCTrackPdgCode->SetBit(TH1::kCanRebin);
302
303 hMCTrackStatusCode = new TH1F("hMCTrackStatusCode","hMCTrackStatusCode",100,0,10);
304 hMCTrackStatusCode->GetYaxis()->SetTitle("number of tracks");
305 hMCTrackStatusCode->SetBit(TH1::kCanRebin);
306
307 hCharge = new TH1F("hCharge","hCharge",30, -5, 5);
308 hCharge->GetXaxis()->SetTitle("Charge");
309 hCharge->GetYaxis()->SetTitle("number of tracks");
310
311 hMCCharge = new TH1F("hMCCharge","hMCCharge",30, -5, 5);
312 hMCCharge->GetXaxis()->SetTitle("MC Charge");
313 hMCCharge->GetYaxis()->SetTitle("number of tracks");
314
315 hMCPdgPt = new TH2F("hMCPdgPt","hMCPdgPt",fPtNbins-1, fBinsPt, 100,0,100);
316 hMCPdgPt->GetYaxis()->SetTitle("particle");
317 hMCPdgPt->GetXaxis()->SetTitle("Pt (GeV/c)");
318
319 hMCHijingPrim = new TH1F("hMCHijingPrim","hMCHijingPrim",2,0,2);
320 hMCPdgPt->GetYaxis()->SetTitle("number of particles");
321
322 hAccNclsTPC = new TH1F("hAccNclsTPC","hAccNclsTPC",160,0,159);
323 hAccNclsTPC->GetXaxis()->SetTitle("number of clusters per track after cut");
324
325 hAccCrossedRowsTPC = new TH1F("hAccCrossedRowsTPC","hAccCrossedRowsTPC",160,0,159);
326 hAccCrossedRowsTPC->GetXaxis()->SetTitle("number of crossed rows per track after cut");
327
328
329 // Add Histos, Profiles etc to List
330 fOutputList->Add(hnZvPtEtaCent);
331 fOutputList->Add(hPt);
332 fOutputList->Add(hnMCRecPrimZvPtEtaCent);
333 fOutputList->Add(hnMCGenZvPtEtaCent);
334 fOutputList->Add(hnMCSecZvPtEtaCent);
335 fOutputList->Add(hMCPt);
336 fOutputList->Add(hEventStatistics);
337 fOutputList->Add(hEventStatisticsCentrality);
338 fOutputList->Add(hAllEventStatisticsCentrality);
339 fOutputList->Add(hnZvMultCent);
340 fOutputList->Add(hTriggerStatistics);
341 fOutputList->Add(hMCTrackPdgCode);
342 fOutputList->Add(hMCTrackStatusCode);
343 fOutputList->Add(hCharge);
344 fOutputList->Add(hMCCharge);
345 fOutputList->Add(hMCPdgPt);
346 fOutputList->Add(hMCHijingPrim);
347 fOutputList->Add(hAccNclsTPC);
348 fOutputList->Add(hAccCrossedRowsTPC);
349
350 PostData(1, fOutputList);
351}
352
353void AlidNdPtAnalysisPbPbAOD::UserExec(Option_t *option)
354{
355 // Main Loop
356 // called for each event
357 hEventStatistics->Fill("all events",1);
358
359 // set ZERO pointers:
360 AliInputEventHandler *inputHandler = NULL;
361 AliAODTrack *track = NULL;
362 AliAODMCParticle *mcPart = NULL;
363 AliAODMCHeader *mcHdr = NULL;
364 AliGenHijingEventHeader *genHijingHeader = NULL;
365 AliGenPythiaEventHeader *genPythiaHeader = NULL;
366
367 Bool_t bIsEventSelectedMB = kFALSE;
368 Bool_t bIsEventSelectedSemi = kFALSE;
369 Bool_t bIsEventSelectedCentral = kFALSE;
370 Bool_t bIsEventSelected = kFALSE;
371 Bool_t bIsPrimary = kFALSE;
372 Bool_t bIsHijingParticle = kFALSE;
373 Bool_t bIsPythiaParticle = kFALSE;
374 Bool_t bEventHasATrack = kFALSE;
375 Bool_t bEventHasATrackInRange = kFALSE;
376 Int_t nTriggerFired = 0;
377
378
379 Double_t dMCTrackZvPtEtaCent[4] = {0};
380 Double_t dTrackZvPtEtaCent[4] = {0};
381
382 Double_t dMCEventZv = -100;
383 Double_t dEventZv = -100;
384 Int_t iAcceptedMultiplicity = 0;
385
386 bIsMonteCarlo = kFALSE;
387
388 AliAODEvent *eventAOD = 0x0;
389 eventAOD = dynamic_cast<AliAODEvent*>( InputEvent() );
390 if (!eventAOD) {
391 AliWarning("ERROR: eventAOD not available \n");
392 return;
393 }
394
395 // check, which trigger has been fired
396 inputHandler = (AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
397 bIsEventSelectedMB = ( inputHandler->IsEventSelected() & AliVEvent::kMB);
398 bIsEventSelectedSemi = ( inputHandler->IsEventSelected() & AliVEvent::kSemiCentral);
399 bIsEventSelectedCentral = ( inputHandler->IsEventSelected() & AliVEvent::kCentral);
400
401 if(bIsEventSelectedMB || bIsEventSelectedSemi || bIsEventSelectedCentral) hTriggerStatistics->Fill("all triggered events",1);
402 if(bIsEventSelectedMB) { hTriggerStatistics->Fill("MB trigger",1); nTriggerFired++; }
403 if(bIsEventSelectedSemi) { hTriggerStatistics->Fill("SemiCentral trigger",1); nTriggerFired++; }
404 if(bIsEventSelectedCentral) { hTriggerStatistics->Fill("Central trigger",1); nTriggerFired++; }
405 if(nTriggerFired == 0) { hTriggerStatistics->Fill("No trigger",1); }
406
407 bIsEventSelected = ( inputHandler->IsEventSelected() & GetCollisionCandidates() );
408
409 // only take tracks of events, which are triggered
410 if(nTriggerFired == 0) { return; }
411
412 // if( !bIsEventSelected || nTriggerFired>1 ) return;
413
414 // hEventStatistics->Fill("events with only coll. cand.", 1);
415
416
417
418 // check if there is a stack, if yes, then do MC loop
419 TList *list = eventAOD->GetList();
420 TClonesArray *stack = 0x0;
421 stack = (TClonesArray*)list->FindObject(AliAODMCParticle::StdBranchName());
422
423 if( stack )
424 {
425 bIsMonteCarlo = kTRUE;
426
427 mcHdr = (AliAODMCHeader*)list->FindObject(AliAODMCHeader::StdBranchName());
428
429 genHijingHeader = GetHijingEventHeader(mcHdr);
430 // genPythiaHeader = GetPythiaEventHeader(mcHdr);
431
432 if(!genHijingHeader) { return; }
433
434 // if(!genPythiaHeader) { return; }
435
436 dMCEventZv = mcHdr->GetVtxZ();
437 dMCTrackZvPtEtaCent[0] = dMCEventZv;
438 hEventStatistics->Fill("MC all events",1);
439 }
440
441 AliCentrality* aCentrality = eventAOD->GetCentrality();
442 Double_t dCentrality = aCentrality->GetCentralityPercentile("V0M");
443
444 if( dCentrality < 0 ) return;
445 hEventStatistics->Fill("after centrality selection",1);
446
447
448
449 // start with MC truth analysis
450 if(bIsMonteCarlo)
451 {
452
453 if( dMCEventZv > dCutMaxZVertex ) { return; }
454
455 dMCTrackZvPtEtaCent[0] = dMCEventZv;
456
457 hEventStatistics->Fill("MC afterZv cut",1);
458
459 for(Int_t iMCtrack = 0; iMCtrack < stack->GetEntriesFast(); iMCtrack++)
460 {
461 mcPart =(AliAODMCParticle*)stack->At(iMCtrack);
462
463 // check for charge
464 if( !(IsMCTrackAccepted(mcPart)) ) continue;
465
466 if(!IsHijingParticle(mcPart, genHijingHeader)) { continue; }
467
468 if(mcPart->IsPhysicalPrimary() )
469 {
470 hMCHijingPrim->Fill("IsPhysicalPrimary",1);
471 }
472 else
473 {
474 hMCHijingPrim->Fill("NOT a primary",1);
475 continue;
476 }
477
478
479 //
480 // ======================== fill histograms ========================
481 dMCTrackZvPtEtaCent[1] = mcPart->Pt();
482 dMCTrackZvPtEtaCent[2] = mcPart->Eta();
483 dMCTrackZvPtEtaCent[3] = dCentrality;
484
485 bEventHasATrack = kTRUE;
486
487 hnMCGenZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
488
489 if( (dMCTrackZvPtEtaCent[1] > dCutPtMin) &&
490 (dMCTrackZvPtEtaCent[1] < dCutPtMax) &&
491 (dMCTrackZvPtEtaCent[2] > dCutEtaMin) &&
492 (dMCTrackZvPtEtaCent[2] < dCutEtaMax) )
493 {
494 hMCPt->Fill(mcPart->Pt());
495 hMCCharge->Fill(mcPart->Charge()/3.);
496 bEventHasATrackInRange = kTRUE;
497 }
498
499 }
500 } // isMonteCarlo
501 if(bEventHasATrack) { hEventStatistics->Fill("MC events with tracks",1); }
502 if(bEventHasATrackInRange) { hEventStatistics->Fill("MC events with tracks in range",1); }
503 bEventHasATrack = kFALSE;
504 bEventHasATrackInRange = kFALSE;
505
506
507
508 // Loop over recontructed tracks
509
510 dEventZv = eventAOD->GetPrimaryVertex()->GetZ();
511 if( TMath::Abs(dEventZv) > dCutMaxZVertex ) return;
512
513 hAllEventStatisticsCentrality->Fill(dCentrality/*, nTriggerFired*/);
514
515 hEventStatistics->Fill("after Zv cut",1);
516
517 dTrackZvPtEtaCent[0] = dEventZv;
518
519 for(Int_t itrack = 0; itrack < eventAOD->GetNumberOfTracks(); itrack++)
520 {
521 track = eventAOD->GetTrack(itrack);
522 if(!track) continue;
523
524 mcPart = NULL;
525 dMCTrackZvPtEtaCent[1] = 0;
526 dMCTrackZvPtEtaCent[2] = 0;
527 dMCTrackZvPtEtaCent[3] = 0;
528
529 bIsPrimary = kFALSE;
530
531 if( !(IsTrackAccepted(track)) ) continue;
532
533 if( bIsMonteCarlo )
534 {
535 mcPart = (AliAODMCParticle*)stack->At(TMath::Abs(track->GetLabel()));
536 if( !mcPart ) { continue; }
537
538 // check for charge
539 if( !(IsMCTrackAccepted(mcPart)) ) { continue; }
540
541 bIsHijingParticle = IsHijingParticle(mcPart, genHijingHeader);
542 // bIsPythiaParticle = IsPythiaParticle(mcPart, genPythiaHeader);
543
544 // if(!bIsHijingParticle) continue; // only take real tracks, not injected ones
545
546 bIsPrimary = mcPart->IsPhysicalPrimary();
547
548 dMCTrackZvPtEtaCent[1] = mcPart->Pt();
549 dMCTrackZvPtEtaCent[2] = mcPart->Eta();
550 dMCTrackZvPtEtaCent[3] = dCentrality;
551
552 if(bIsPrimary && bIsHijingParticle)
553 {
554 hnMCRecPrimZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
555 }
556
557 if(!bIsPrimary /*&& !bIsHijingParticle*/)
558 {
559 Int_t indexMoth = mcPart->GetMother();
560 if(indexMoth >= 0)
561 {
562 AliAODMCParticle* moth = (AliAODMCParticle*)stack->At(indexMoth);
563 Bool_t bMotherIsHijingParticle = IsHijingParticle(moth, genHijingHeader);
564
565 if(bMotherIsHijingParticle) // only store secondaries, which come from a not embedded signal!
566 {
567 hMCTrackStatusCode->Fill(Form("%d",mcPart->GetStatus()), 1);
568 if(TMath::Abs(mcPart->Eta()) < 0.8) { hMCPdgPt->Fill(mcPart->Pt(), Form("%s",GetParticleName(mcPart->GetPdgCode())), 1); }
569
570 hnMCSecZvPtEtaCent->Fill(dMCTrackZvPtEtaCent);
571 hMCTrackPdgCode->Fill(Form("%s_H%i_H%i",GetParticleName(moth->GetPdgCode()),bMotherIsHijingParticle, bIsHijingParticle), 1);
572 // delete moth;
573 }
574 }
575 }
576 } // end isMonteCarlo
577
578 // ======================== fill histograms ========================
579
580// if(bIsMonteCarlo && !bIsHijingParticle)
581// {
582// continue; //only store reco tracks, which do not come from embedded signal
583// }
584
585 dTrackZvPtEtaCent[1] = track->Pt();
586 dTrackZvPtEtaCent[2] = track->Eta();
587 dTrackZvPtEtaCent[3] = dCentrality;
588
589 bEventHasATrack = kTRUE;
590
591 hnZvPtEtaCent->Fill(dTrackZvPtEtaCent);
592
593 if( (dTrackZvPtEtaCent[1] > dCutPtMin) &&
594 (dTrackZvPtEtaCent[1] < dCutPtMax) &&
595 (dTrackZvPtEtaCent[2] > dCutEtaMin) &&
596 (dTrackZvPtEtaCent[2] < dCutEtaMax) )
597 {
598 iAcceptedMultiplicity++;
599 bEventHasATrackInRange = kTRUE;
600 hPt->Fill(track->Pt());
601 hCharge->Fill(track->Charge());
602 }
603 } // end track loop
604
605 if(bEventHasATrack) { hEventStatistics->Fill("events with tracks",1); bEventHasATrack = kFALSE; }
606
607 if(bEventHasATrackInRange)
608 {
609 hEventStatistics->Fill("events with tracks in range",1);
610 hEventStatisticsCentrality->Fill(dCentrality);
611 bEventHasATrackInRange = kFALSE;
612 }
613
614 Double_t dEventZvMultCent[3] = {dEventZv, iAcceptedMultiplicity, dCentrality};
615 hnZvMultCent->Fill(dEventZvMultCent);
616
617
618
619 PostData(1, fOutputList);
620
621}
622
623Bool_t AlidNdPtAnalysisPbPbAOD::IsTrackAccepted(AliAODTrack *tr)
624{
625 if(!tr) return kFALSE;
626
627 if(tr->Charge()==0) { return kFALSE; }
628
629 if(!(tr->TestFilterBit(AliAODTrack::kTrkGlobal)) ) { return kFALSE; }
630
631
632
633 Double_t dNClustersTPC = tr->GetTPCNcls();
634 Double_t dCrossedRowsTPC = tr->GetTPCClusterInfo(2,1);
635
636 hAccNclsTPC->Fill(dNClustersTPC);
637 hAccCrossedRowsTPC->Fill(dCrossedRowsTPC);
638 // Double_t dFindableClustersTPC = tr->GetTPCNclsF();
639 // Double_t dChi2PerClusterTPC = (dNClustersTPC>0)?tr->Chi2perNDF()*(dNClustersTPC-5)/dNClustersTPC:-1.; // see AliDielectronVarManager.h
640 //
641 // Bool_t bIsFromKink = kFALSE;
642 // if(tr->GetProdVertex()->GetType() == AliAODVertex::kKink) bIsFromKink = kTRUE;
643 //
644 // // from AliAnalysisTaskPIDqa.cxx
645 // ULong_t uStatus = tr->GetStatus();
646 // Bool_t bHasRefitTPC = kFALSE;
647 // Bool_t bHasRefitITS = kFALSE;
648 //
649 // if ((uStatus & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) bHasRefitTPC = kTRUE;
650 // if ((uStatus & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) bHasRefitITS = kTRUE;
651 //
652 // // from AliDielectronVarManager.h
653 // Bool_t bHasHitInSPD = kFALSE;
654 // for (Int_t iC=0; iC<2; iC++)
655 // {
656 // if (((tr->GetITSClusterMap()) & (1<<(iC))) > 0) { bHasHitInSPD = kTRUE; }
657 // }
658 //
659 // Double_t dNClustersITS = tr->GetITSNcls();
660
661 // cuts to be done:
662 // TPC
663 // esdTrackCuts->SetMinNCrossedRowsTPC(70);
664 // esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
665 //
666 // esdTrackCuts->SetMaxChi2PerClusterTPC(4);
667 // esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
668 // esdTrackCuts->SetRequireTPCRefit(kTRUE);
669 // ITS
670 // esdTrackCuts->SetRequireITSRefit(kTRUE);
671 // esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
672 //
673 // esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
674 // esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
675 //
676 // esdTrackCuts->SetMaxDCAToVertexZ(2);
677 // esdTrackCuts->SetDCAToVertex2D(kFALSE);
678 // esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
679 //
680 // esdTrackCuts->SetMaxChi2PerClusterITS(36);
681
682
683 return kTRUE;
684}
685
686Bool_t AlidNdPtAnalysisPbPbAOD::IsMCTrackAccepted(AliAODMCParticle *part)
687{
688 if(!part) return kFALSE;
689
690 Double_t charge = part->Charge()/3.;
691 if (TMath::Abs(charge) < 0.001) return kFALSE;
692
693 return kTRUE;
694}
695
696const char * AlidNdPtAnalysisPbPbAOD::GetParticleName(Int_t pdg)
697{
698 TParticlePDG * p1 = TDatabasePDG::Instance()->GetParticle(pdg);
699 if(p1) return p1->GetName();
700 return Form("%d", pdg);
701}
702
703AliGenHijingEventHeader* AlidNdPtAnalysisPbPbAOD::GetHijingEventHeader(AliAODMCHeader *header)
704{
705 //
706 // inspired by PWGJE/AliPWG4HighPtSpectra.cxx
707 //
708
709 if(!header) return 0x0;
710 AliGenHijingEventHeader* hijingGenHeader = NULL;
711
712 TList* headerList = header->GetCocktailHeaders();
713
714 for(Int_t i = 0; i < headerList->GetEntries(); i++)
715 {
716 hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(headerList->At(i));
717 if(hijingGenHeader) break;
718 }
719
720 if(!hijingGenHeader) return 0x0;
721
722 return hijingGenHeader;
723}
724
725AliGenPythiaEventHeader* AlidNdPtAnalysisPbPbAOD::GetPythiaEventHeader(AliAODMCHeader *header)
726{
727 //
728 // inspired by PWGJE/AliPWG4HighPtSpectra.cxx
729 //
730
731 if(!header) return 0x0;
732 AliGenPythiaEventHeader* PythiaGenHeader = NULL;
733
734 TList* headerList = header->GetCocktailHeaders();
735
736 for(Int_t i = 0; i < headerList->GetEntries(); i++)
737 {
738 PythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(i));
739 if(PythiaGenHeader) break;
740 }
741
742 if(!PythiaGenHeader) return 0x0;
743
744 return PythiaGenHeader;
745}
746
747//________________________________________________________________________
748Bool_t AlidNdPtAnalysisPbPbAOD::IsHijingParticle(const AliAODMCParticle *part, AliGenHijingEventHeader* hijingGenHeader){
749
750 // Check whether a particle is from Hijing or some injected
751
752 if(part->Label() > (hijingGenHeader->NProduced()-1)) return kFALSE;
753 return kTRUE;
754}
755
756//________________________________________________________________________
757Bool_t AlidNdPtAnalysisPbPbAOD::IsPythiaParticle(const AliAODMCParticle *part, AliGenPythiaEventHeader* pythiaGenHeader){
758
759 // Check whether a particle is from Pythia or some injected
760
761 if(part->Label() > (pythiaGenHeader->NProduced()-1)) return kFALSE;
762 return kTRUE;
763}
764
765Bool_t AlidNdPtAnalysisPbPbAOD::IsMCSecondary(AliAODMCParticle *part, TClonesArray *arrayMC)
766{
767 //
768 // from AliAnalysisTaskSpectraAOD.cxx
769 //
770
771 if(!part) return kFALSE;
772
773 if( part->IsPhysicalPrimary() ) return kFALSE;
774
775 Bool_t isSecondaryMaterial = kFALSE;
776 Bool_t isSecondaryWeak = kFALSE;
777 Int_t mfl = -999;
778 Int_t codemoth = -999;
779 Int_t indexMoth = part->GetMother(); // FIXME ignore fakes? TO BE CHECKED, on ESD is GetFirstMother()
780 if(indexMoth >= 0)
781 {
782 AliAODMCParticle* moth = (AliAODMCParticle*) arrayMC->At(indexMoth);
783 codemoth = TMath::Abs(moth->GetPdgCode());
784 mfl = Int_t (codemoth/ TMath::Power(10, Int_t(TMath::Log10(codemoth))));
785 }
786 // add if(partMC->GetStatus() & kPDecay)? FIXME
787 if(mfl==3) isSecondaryWeak = kTRUE;
788 else isSecondaryMaterial = kTRUE;
789
790 if( isSecondaryMaterial || isSecondaryWeak ) return kTRUE;
791
792 return kFALSE;
793}
794
795
796
797void AlidNdPtAnalysisPbPbAOD::Terminate(Option_t *)
798{
799
800}
801
802Double_t* AlidNdPtAnalysisPbPbAOD::GetArrayClone(Int_t n, Double_t* source)
803{
804 if (!source || n==0) return 0;
805 Double_t* dest = new Double_t[n];
806 for (Int_t i=0; i<n ; i++) { dest[i] = source[i]; }
807 return dest;
808}