]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGUD/UPC/AliAnalysisTaskUpcPhi.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGUD / UPC / AliAnalysisTaskUpcPhi.cxx
CommitLineData
4c28b078 1/*************************************************************************
2* Copyright(c) 1998-2008, 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// c++ headers
17#include <iostream>
18#include <string.h>
19
20// root headers
21#include "TH1I.h"
22#include "TTree.h"
23#include "TClonesArray.h"
24#include "TParticle.h"
25#include "TObjString.h"
26#include "TFile.h"
27#include "TDatabasePDG.h"
28#include "TLorentzVector.h"
29
30// aliroot headers
31#include "AliAnalysisManager.h"
32#include "AliInputEventHandler.h"
33#include "AliESDEvent.h"
34#include "AliAODEvent.h"
35#include "AliMCEvent.h"
36#include "AliAODVZERO.h"
37#include "AliAODZDC.h"
38#include "AliESDVZERO.h"
39#include "AliESDZDC.h"
40#include "AliPIDResponse.h"
41#include "AliAODTrack.h"
42#include "AliAODPid.h"
43#include "AliAODVertex.h"
44#include "AliESDVertex.h"
45#include "AliMultiplicity.h"
46#include "AliESDtrack.h"
47#include "AliESDMuonTrack.h"
48#include "AliAODMCParticle.h"
49#include "AliMCParticle.h"
50#include "AliCentrality.h"
51#include "AliKFVertex.h"
52#include "AliExternalTrackParam.h"
53#include "AliTriggerAnalysis.h"
54
55// my headers
56#include "AliAnalysisTaskUpcPhi.h"
57
58ClassImp(AliAnalysisTaskUpcPhi);
59
60using std::cout;
61using std::endl;
62
63//trees for UPC analysis,
64// michal.broz@cern.ch
65
66//_____________________________________________________________________________
67AliAnalysisTaskUpcPhi::AliAnalysisTaskUpcPhi()
f96a5cb1 68 : AliAnalysisTaskSE(),fType(0),isMC(kFALSE),fRunTree(kTRUE),fRunHist(kTRUE),fRunSystematics(kFALSE),fPIDResponse(0),fITSTree(0),fTPCTree(0),
4c28b078 69 fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),
4c28b078 70 fVtxContrib(0),fVtxChi2(0),fVtxNDF(0),
f96a5cb1 71 fBCrossNum(0),fNtracklets(0),fNLooseITSTracks(0),fNLooseTPCTracks(0),
4c28b078 72 fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
73 fDataFilnam(0),fRecoPass(0),fEvtNum(0),
74 fPhiAODTracks(0),fPhiESDTracks(0),fGenPart(0),
75 fListTrig(0),fHistCcup4TriggersPerRun(0), fHistCcup7TriggersPerRun(0), fHistCcup2TriggersPerRun(0),fHistCint1TriggersPerRun(0),fHistC0tvxAndCint1TriggersPerRun(0),
76 fHistZedTriggersPerRun(0),fHistCvlnTriggersPerRun(0), fHistMBTriggersPerRun(0),fHistCentralTriggersPerRun(0),fHistSemiCentralTriggersPerRun(0),
77 fListHist(0)
78
79{
80
81//Dummy constructor
82
83}//AliAnalysisTaskUpcPhi
84
85
86//_____________________________________________________________________________
87AliAnalysisTaskUpcPhi::AliAnalysisTaskUpcPhi(const char *name)
f96a5cb1 88 : AliAnalysisTaskSE(name),fType(0),isMC(kFALSE),fRunTree(kTRUE),fRunHist(kTRUE),fRunSystematics(kFALSE),fPIDResponse(0),fITSTree(0),fTPCTree(0),
4c28b078 89 fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),
4c28b078 90 fVtxContrib(0),fVtxChi2(0),fVtxNDF(0),
f96a5cb1 91 fBCrossNum(0),fNtracklets(0),fNLooseITSTracks(0),fNLooseTPCTracks(0),
4c28b078 92 fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
93 fDataFilnam(0),fRecoPass(0),fEvtNum(0),
94 fPhiAODTracks(0),fPhiESDTracks(0),fGenPart(0),
95 fListTrig(0),fHistCcup4TriggersPerRun(0), fHistCcup7TriggersPerRun(0), fHistCcup2TriggersPerRun(0),fHistCint1TriggersPerRun(0),fHistC0tvxAndCint1TriggersPerRun(0),
96 fHistZedTriggersPerRun(0),fHistCvlnTriggersPerRun(0), fHistMBTriggersPerRun(0),fHistCentralTriggersPerRun(0),fHistSemiCentralTriggersPerRun(0),
97 fListHist(0)
98
99{
100
101 // Constructor
102 if( strstr(name,"ESD") ) fType = 0;
103 if( strstr(name,"AOD") ) fType = 1;
104
105 Init();
106
107 DefineOutput(1, TTree::Class());
f96a5cb1 108 DefineOutput(2, TTree::Class());
4c28b078 109 DefineOutput(3, TList::Class());
f96a5cb1 110 DefineOutput(4, TList::Class());
4c28b078 111
112}//AliAnalysisTaskUpcPhi
113
114//_____________________________________________________________________________
115void AliAnalysisTaskUpcPhi::Init()
116{
117
118 for(Int_t i=0; i<ntrg; i++) fTrigger[i] = kFALSE;
119 for(Int_t i=0; i<4; i++) {
c9448233 120 fPIDITSMuon[i] = -666;
121 fPIDITSElectron[i] = -666;
122 fPIDITSPion[i] = -666;
123 fPIDITSKaon[i] = -666;
124 fPIDITSProton[i] = -666;
4c28b078 125
f96a5cb1 126 fPIDTPCMuon[i] = -666;
127 fPIDTPCElectron[i] = -666;
128 fPIDTPCPion[i] = -666;
129 fPIDTPCKaon[i] = -666;
130 fPIDTPCProton[i] = -666;
131
4c28b078 132 fTriggerInputsMC[i] = kFALSE;
133 }
134 for(Int_t i=0; i<3; i++){
135 fVtxPos[i] = -666;
136 fVtxErr[i] = -666;
137 fKfVtxPos[i] = -666;
138 fSpdVtxPos[i] = -666;
139 }
140
141}//Init
142
143//_____________________________________________________________________________
144AliAnalysisTaskUpcPhi::~AliAnalysisTaskUpcPhi()
145{
146 // Destructor
f96a5cb1 147 if(fITSTree){
148 delete fITSTree;
149 fITSTree = 0x0;
150 }
151 if(fTPCTree){
152 delete fTPCTree;
153 fTPCTree = 0x0;
4c28b078 154 }
155 if(fListTrig){
156 delete fListTrig;
157 fListTrig = 0x0;
158 }
159 if(fListHist){
160 delete fListHist;
161 fListHist = 0x0;
162 }
163
164}//~AliAnalysisTaskUpcPhi
165
166
167//_____________________________________________________________________________
168void AliAnalysisTaskUpcPhi::UserCreateOutputObjects()
169{
170 //PID response
171 AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
172 AliInputEventHandler *inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
173 fPIDResponse = inputHandler->GetPIDResponse();
174
175 //input file
176 fDataFilnam = new TObjString();
177 fDataFilnam->SetString("");
178
179 //tracks
180 fPhiAODTracks = new TClonesArray("AliAODTrack", 1000);
181 fPhiESDTracks = new TClonesArray("AliESDtrack", 1000);
182 fGenPart = new TClonesArray("TParticle", 1000);
183
f96a5cb1 184 //output tree with Phi ITSsa candidate events
185 fITSTree = new TTree("fITSTree", "fITSTree");
186 fITSTree ->Branch("fRunNum", &fRunNum, "fRunNum/I");
187 fITSTree ->Branch("fPerNum", &fPerNum, "fPerNum/i");
188 fITSTree ->Branch("fOrbNum", &fOrbNum, "fOrbNum/i");
189
190 fITSTree ->Branch("fBCrossNum", &fBCrossNum, "fBCrossNum/s");
191 fITSTree ->Branch("fTrigger", &fTrigger[0], Form("fTrigger[%i]/O", ntrg));
192 fITSTree ->Branch("fL0inputs", &fL0inputs, "fL0inputs/i");
193 fITSTree ->Branch("fL1inputs", &fL1inputs, "fL1inputs/i");
194 fITSTree ->Branch("fNtracklets", &fNtracklets, "fNtracklets/s");
195 fITSTree ->Branch("fNLooseITSTracks", &fNLooseITSTracks, "fNLooseITSTracks/s");
196 fITSTree ->Branch("fVtxContrib", &fVtxContrib, "fVtxContrib/I");
197
198 fITSTree ->Branch("fPIDITSMuon", &fPIDITSMuon[0], "fPIDITSMuon[2]/D");
199 fITSTree ->Branch("fPIDITSElectron", &fPIDITSElectron[0], "fPIDITSElectron[2]/D");
200 fITSTree ->Branch("fPIDITSPion", &fPIDITSPion[0], "fPIDITSPion[2]/D");
201 fITSTree ->Branch("fPIDITSKaon", &fPIDITSKaon[0], "fPIDITSKaon[2]/D");
202 fITSTree ->Branch("fPIDITSProton", &fPIDITSProton[0], "fPIDITSProton[2]/D");
203
204 fITSTree ->Branch("fVtxPos", &fVtxPos[0], "fVtxPos[3]/D");
205 fITSTree ->Branch("fVtxErr", &fVtxErr[0], "fVtxErr[3]/D");
206 fITSTree ->Branch("fVtxChi2", &fVtxChi2, "fVtxChi2/D");
207 fITSTree ->Branch("fVtxNDF", &fVtxNDF, "fVtxNDF/D");
208
f96a5cb1 209 fITSTree ->Branch("fSpdVtxPos", &fSpdVtxPos[0], "fSpdVtxPos[3]/D");
210
211 fITSTree ->Branch("fZDCAenergy", &fZDCAenergy, "fZDCAenergy/D");
212 fITSTree ->Branch("fZDCCenergy", &fZDCCenergy, "fZDCCenergy/D");
213 fITSTree ->Branch("fV0Adecision", &fV0Adecision, "fV0Adecision/I");
214 fITSTree ->Branch("fV0Cdecision", &fV0Cdecision, "fV0Cdecision/I");
215 fITSTree ->Branch("fDataFilnam", &fDataFilnam);
216 fITSTree ->Branch("fRecoPass", &fRecoPass, "fRecoPass/S");
217 fITSTree ->Branch("fEvtNum", &fEvtNum, "fEvtNum/L");
218 if( fType == 0 ) {
219 fITSTree ->Branch("fPhiESDTracks", &fPhiESDTracks);
220 }
221 if( fType == 1 ) {
222 fITSTree ->Branch("fPhiAODTracks", &fPhiAODTracks);
223 }
224 if(isMC) {
225 fITSTree ->Branch("fGenPart", &fGenPart);
226 fITSTree ->Branch("fTriggerInputsMC", &fTriggerInputsMC[0], "fTriggerInputsMC[2]/O");
227 }
228
229 //output tree with Phi ITS-TPC candidate events
230 fTPCTree = new TTree("fTPCTree", "fTPCTree");
231 fTPCTree ->Branch("fRunNum", &fRunNum, "fRunNum/I");
232 fTPCTree ->Branch("fPerNum", &fPerNum, "fPerNum/i");
233 fTPCTree ->Branch("fOrbNum", &fOrbNum, "fOrbNum/i");
234
235 fTPCTree ->Branch("fBCrossNum", &fBCrossNum, "fBCrossNum/s");
236 fTPCTree ->Branch("fTrigger", &fTrigger[0], Form("fTrigger[%i]/O", ntrg));
237 fTPCTree ->Branch("fL0inputs", &fL0inputs, "fL0inputs/i");
238 fTPCTree ->Branch("fL1inputs", &fL1inputs, "fL1inputs/i");
239 fTPCTree ->Branch("fNtracklets", &fNtracklets, "fNtracklets/s");
240 fTPCTree ->Branch("fNLooseTPCTracks", &fNLooseTPCTracks, "fNLooseTPCTracks/s");
241 fTPCTree ->Branch("fVtxContrib", &fVtxContrib, "fVtxContrib/I");
242
243 fTPCTree ->Branch("fPIDTPCMuon", &fPIDTPCMuon[0], "fPIDTPCMuon[2]/D");
244 fTPCTree ->Branch("fPIDTPCElectron", &fPIDTPCElectron[0], "fPIDTPCElectron[2]/D");
245 fTPCTree ->Branch("fPIDTPCPion", &fPIDTPCPion[0], "fPIDTPCPion[2]/D");
246 fTPCTree ->Branch("fPIDTPCKaon", &fPIDTPCKaon[0], "fPIDTPCKaon[2]/D");
247 fTPCTree ->Branch("fPIDTPCProton", &fPIDTPCProton[0], "fPIDTPCProton[2]/D");
248
249 fTPCTree ->Branch("fVtxPos", &fVtxPos[0], "fVtxPos[3]/D");
250 fTPCTree ->Branch("fVtxErr", &fVtxErr[0], "fVtxErr[3]/D");
251 fTPCTree ->Branch("fVtxChi2", &fVtxChi2, "fVtxChi2/D");
252 fTPCTree ->Branch("fVtxNDF", &fVtxNDF, "fVtxNDF/D");
f96a5cb1 253 fTPCTree ->Branch("fSpdVtxPos", &fSpdVtxPos[0], "fSpdVtxPos[3]/D");
254
255 fTPCTree ->Branch("fZDCAenergy", &fZDCAenergy, "fZDCAenergy/D");
256 fTPCTree ->Branch("fZDCCenergy", &fZDCCenergy, "fZDCCenergy/D");
257 fTPCTree ->Branch("fV0Adecision", &fV0Adecision, "fV0Adecision/I");
258 fTPCTree ->Branch("fV0Cdecision", &fV0Cdecision, "fV0Cdecision/I");
259 fTPCTree ->Branch("fDataFilnam", &fDataFilnam);
260 fTPCTree ->Branch("fRecoPass", &fRecoPass, "fRecoPass/S");
261 fTPCTree ->Branch("fEvtNum", &fEvtNum, "fEvtNum/L");
4c28b078 262 if( fType == 0 ) {
f96a5cb1 263 fTPCTree ->Branch("fPhiESDTracks", &fPhiESDTracks);
4c28b078 264 }
265 if( fType == 1 ) {
f96a5cb1 266 fTPCTree ->Branch("fPhiAODTracks", &fPhiAODTracks);
4c28b078 267 }
268 if(isMC) {
f96a5cb1 269 fTPCTree ->Branch("fGenPart", &fGenPart);
270 fTPCTree ->Branch("fTriggerInputsMC", &fTriggerInputsMC[0], "fTriggerInputsMC[2]/O");
4c28b078 271 }
272
273
274 fListTrig = new TList();
275 fListTrig ->SetOwner();
276
277 fHistCcup4TriggersPerRun = new TH1D("fHistCcup4TriggersPerRun", "fHistCcup4TriggersPerRun", 33000, 167000.5, 200000.5);
278 fListTrig->Add(fHistCcup4TriggersPerRun);
279
280 fHistCcup7TriggersPerRun = new TH1D("fHistCcup7TriggersPerRun", "fHistCcup7TriggersPerRun", 33000, 167000.5, 200000.5);
281 fListTrig->Add(fHistCcup7TriggersPerRun);
282
283 fHistCcup2TriggersPerRun = new TH1D("fHistCcup2TriggersPerRun", "fHistCcup2TriggersPerRun", 33000, 167000.5, 200000.5);
284 fListTrig->Add(fHistCcup2TriggersPerRun);
285
286 fHistCint1TriggersPerRun = new TH1D("fHistCint1TriggersPerRun", "fHistCint1TriggersPerRun", 33000, 167000.5, 200000.5);
287 fListTrig->Add(fHistCint1TriggersPerRun);
288
289 fHistC0tvxAndCint1TriggersPerRun = new TH1D("fHistC0tvxAndCint1TriggersPerRun", "fHistC0tvxAndCint1TriggersPerRun", 33000, 167000.5, 200000.5);
290 fListTrig->Add(fHistC0tvxAndCint1TriggersPerRun);
291
292 fHistZedTriggersPerRun = new TH1D("fHistZedTriggersPerRun", "fHistZedTriggersPerRun", 33000, 167000.5, 200000.5);
293 fListTrig->Add(fHistZedTriggersPerRun);
294
295 fHistCvlnTriggersPerRun = new TH1D("fHistCvlnTriggersPerRun", "fHistCvlnTriggersPerRun", 33000, 167000.5, 200000.5);
296 fListTrig->Add(fHistCvlnTriggersPerRun);
297
298 fHistMBTriggersPerRun = new TH1D("fHistMBTriggersPerRun", "fHistMBTriggersPerRun", 33000, 167000.5, 200000.5);
299 fListTrig->Add(fHistMBTriggersPerRun);
300
301 fHistCentralTriggersPerRun = new TH1D("fHistCentralTriggersPerRun", "fHistCentralTriggersPerRun", 33000, 167000.5, 200000.5);
302 fListTrig->Add(fHistCentralTriggersPerRun);
303
304 fHistSemiCentralTriggersPerRun = new TH1D("fHistSemiCentralTriggersPerRun", "fHistSemiCentralTriggersPerRun", 33000, 167000.5, 200000.5);
305 fListTrig->Add(fHistSemiCentralTriggersPerRun);
306
307 fListHist = new TList();
308 fListHist ->SetOwner();
309
f96a5cb1 310 PostData(1, fITSTree);
311 PostData(2, fTPCTree);
312 PostData(3, fListTrig);
313 PostData(4, fListHist);
4c28b078 314
315}//UserCreateOutputObjects
316
317//_____________________________________________________________________________
318void AliAnalysisTaskUpcPhi::UserExec(Option_t *)
319{
320
321 //cout<<"#################### Next event ##################"<<endl;
322
323 if( fType == 0 ){
324 RunESDtrig();
325 if(fRunHist) RunESDhist();
326 if(fRunTree) RunESDtree();
327 }
328
329 if( fType == 1 ){
330 RunAODtrig();
331 if(fRunHist) RunAODhist();
332 if(fRunTree) RunAODtree();
333 }
334
335}//UserExec
336//_____________________________________________________________________________
337void AliAnalysisTaskUpcPhi::RunAODtrig()
338{
339
340 //input event
341 AliAODEvent *aod = (AliAODEvent*) InputEvent();
342 if(!aod) return;
343
344 fRunNum = aod ->GetRunNumber();
345 //Trigger
346 TString trigger = aod->GetFiredTriggerClasses();
347
348 if(trigger.Contains("CCUP4-B")) fHistCcup4TriggersPerRun->Fill(fRunNum); //CCUP4 triggers
349 if(trigger.Contains("CCUP7-B")) fHistCcup7TriggersPerRun->Fill(fRunNum); //CCUP7 triggers
350 if(trigger.Contains("CCUP2-B")) fHistCcup2TriggersPerRun->Fill(fRunNum); //CCUP2 triggers
351
352 if(trigger.Contains("CINT1")) fHistCint1TriggersPerRun->Fill(fRunNum); //CINT1 triggers
353
354 fL0inputs = aod->GetHeader()->GetL0TriggerInputs();
355 if(trigger.Contains("CINT1") && (fL0inputs & (1 << 3))) fHistC0tvxAndCint1TriggersPerRun->Fill(fRunNum); //0TVX triggers in CINT1 events
356
357 if(trigger.Contains("CVLN_B2-B")) fHistCvlnTriggersPerRun->Fill(fRunNum); //CVLN triggers - synchronously downscaled
358 if(trigger.Contains("CVLN_R1-B")) fHistCvlnTriggersPerRun->Fill(fRunNum); //CVLN triggers - randomly downscaled
359
360 fL1inputs = aod->GetHeader()->GetL1TriggerInputs();
361 if(fL1inputs & (1 << 18)) fHistZedTriggersPerRun->Fill(fRunNum); //1ZED trigger inputs
362
363 //MB, Central and SemiCentral triggers
364 AliCentrality *centrality = aod->GetCentrality();
365 UInt_t selectionMask = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
366
367 Double_t percentile = centrality->GetCentralityPercentileUnchecked("V0M");
368 //Double_t percentile = centrality->GetCentralityPercentile("V0M");
369
370 if(((selectionMask & AliVEvent::kMB) == AliVEvent::kMB) && percentile<=80 && percentile>=0) fHistMBTriggersPerRun->Fill(fRunNum);
371
372 if(((selectionMask & AliVEvent::kCentral) == AliVEvent::kCentral) && percentile<=6 && percentile>=0 && (trigger.Contains("CVHN_R2-B"))) fHistCentralTriggersPerRun->Fill(fRunNum);
373
374 if(((selectionMask & AliVEvent::kSemiCentral) == AliVEvent::kSemiCentral) && percentile<=50 && percentile>=15) fHistSemiCentralTriggersPerRun->Fill(fRunNum);
375
376PostData(3, fListTrig);
377
378}
379//_____________________________________________________________________________
380void AliAnalysisTaskUpcPhi::RunAODhist()
381{
382
383
384}
385
386//_____________________________________________________________________________
387void AliAnalysisTaskUpcPhi::RunAODtree()
388{
389 //input event
390 AliAODEvent *aod = (AliAODEvent*) InputEvent();
391 if(!aod) return;
392
393 if(isMC) RunAODMC(aod);
394
395 //input data
396 const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
397 fDataFilnam->Clear();
398 fDataFilnam->SetString(filnam);
399 fEvtNum = ((TTree*) GetInputData(0))->GetTree()->GetReadEntry();
400 fRunNum = aod ->GetRunNumber();
401
402 //Trigger
403 TString trigger = aod->GetFiredTriggerClasses();
404
405 fTrigger[0] = trigger.Contains("CCUP4-B"); // Central UPC Pb-Pb 2011
406 fTrigger[1] = trigger.Contains("CCUP2-B"); // Double gap
407 fTrigger[2] = trigger.Contains("CCUP7-B"); // Central UPC p-Pb 2013
408 fTrigger[3] = trigger.Contains("CINT1");
409
410 Bool_t isTriggered = kFALSE;
411 for(Int_t i=0; i<ntrg; i++) {
412 if( fTrigger[i] ) isTriggered = kTRUE;
413 }
414 if(!isMC && !isTriggered ) return;
415
416 //trigger inputs
417 fL0inputs = aod->GetHeader()->GetL0TriggerInputs();
418 fL1inputs = aod->GetHeader()->GetL1TriggerInputs();
419
420 //Event identification
421 fPerNum = aod ->GetPeriodNumber();
422 fOrbNum = aod ->GetOrbitNumber();
423 fBCrossNum = aod ->GetBunchCrossNumber();
424
425 //primary vertex
426 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
427 fVtxContrib = fAODVertex->GetNContributors();
428 fVtxPos[0] = fAODVertex->GetX();
429 fVtxPos[1] = fAODVertex->GetY();
430 fVtxPos[2] = fAODVertex->GetZ();
431 Double_t CovMatx[6];
432 fAODVertex->GetCovarianceMatrix(CovMatx);
433 fVtxErr[0] = CovMatx[0];
434 fVtxErr[1] = CovMatx[1];
435 fVtxErr[2] = CovMatx[2];
436 fVtxChi2 = fAODVertex->GetChi2();
437 fVtxNDF = fAODVertex->GetNDF();
438
439 //SPD primary vertex
440 AliAODVertex *fSPDVertex = aod->GetPrimaryVertexSPD();
441 if(fSPDVertex){
442 fSpdVtxPos[0] = fSPDVertex->GetX();
443 fSpdVtxPos[1] = fSPDVertex->GetY();
444 fSpdVtxPos[2] = fSPDVertex->GetZ();
445 }
446 else{
447 fSpdVtxPos[0] = -666;
448 fSpdVtxPos[1] = -666;
449 fSpdVtxPos[2] = -666;
450 }
451
452 //Tracklets
453 fNtracklets = aod->GetTracklets()->GetNumberOfTracklets();
454
455 //VZERO, ZDC
456 AliAODVZERO *fV0data = aod ->GetVZEROData();
457 AliAODZDC *fZDCdata = aod->GetZDCData();
458
459 fV0Adecision = fV0data->GetV0ADecision();
460 fV0Cdecision = fV0data->GetV0CDecision();
461 fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
462 fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
463
f96a5cb1 464 fNLooseITSTracks = 0;
465 fNLooseTPCTracks = 0;
4c28b078 466
467 //Track loop - loose cuts
468 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
469 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
470 if( !trk ) continue;
f96a5cb1 471 if((trk->TestFilterBit(1<<0))) fNLooseTPCTracks++;
472 if((trk->TestFilterBit(1<<1))) fNLooseITSTracks++;
473
4c28b078 474 }//Track loop -loose cuts
475
476 Int_t nGoodTracks=0;
477 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
478
f96a5cb1 479 //ITSsa track loop
4c28b078 480 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
481 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
482 if( !trk ) continue;
483 if(!(trk->TestFilterBit(1<<1))) continue;
484
485 if(!(trk->GetStatus() & AliAODTrack::kITSrefit) ) continue;
c9448233 486 if(trk->GetITSNcls() < 4)continue;
487 if(trk->Chi2perNDF() > 2.5)continue;
4c28b078 488 if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1)))continue;
489
490 TrackIndex[nGoodTracks] = itr;
491 nGoodTracks++;
492
493 if(nGoodTracks > 2) break;
494 }//Track loop
495
496 fPhiAODTracks->Clear("C");
497 if(nGoodTracks == 2){
498
499 for(Int_t i=0; i<2; i++){
500 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(TrackIndex[i]));
501 if(!trk) AliFatal("Not a standard AOD");
502
c9448233 503 fPIDITSMuon[i] = fPIDResponse->NumberOfSigmasITS(trk,AliPID::kMuon);
504 fPIDITSElectron[i] = fPIDResponse->NumberOfSigmasITS(trk,AliPID::kElectron);
505 fPIDITSPion[i] = fPIDResponse->NumberOfSigmasITS(trk,AliPID::kPion);
506 fPIDITSKaon[i] = fPIDResponse->NumberOfSigmasITS(trk,AliPID::kKaon);
507 fPIDITSProton[i] = fPIDResponse->NumberOfSigmasITS(trk,AliPID::kProton);
508
4c28b078 509 new((*fPhiAODTracks)[i]) AliAODTrack(*trk);
510 }
511
f96a5cb1 512 fITSTree ->Fill();
513 }
514
515 nGoodTracks=0;
516
517 //TPC track loop
518 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
519 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
520 if( !trk ) continue;
521 if(!(trk->TestFilterBit(1<<0))) continue;
522
523 if(!(trk->GetStatus() & AliAODTrack::kTPCrefit) ) continue;
524 if(!(trk->GetStatus() & AliAODTrack::kITSrefit) ) continue;
525 if(trk->GetTPCNcls() < 70)continue;
526 if(trk->Chi2perNDF() > 4)continue;
527 if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1))) continue;
528 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
529 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
530 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
531 delete trk_clone;
532 if(TMath::Abs(dca[1]) > 2) continue;
533 Double_t cut_DCAxy = (0.0182 + 0.0350/TMath::Power(trk->Pt(),1.01));
534 if(TMath::Abs(dca[0]) > cut_DCAxy) continue;
535
536
537 TrackIndex[nGoodTracks] = itr;
538 nGoodTracks++;
539
540 if(nGoodTracks > 2) break;
541 }//Track loop
542
543 fPhiAODTracks->Clear("C");
544 if(nGoodTracks == 2){
545
546 for(Int_t i=0; i<2; i++){
547 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(TrackIndex[i]));
548 if(!trk) AliFatal("Not a standard AOD");
549
550 fPIDTPCMuon[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kMuon);
551 fPIDTPCElectron[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kElectron);
552 fPIDTPCPion[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kPion);
553 fPIDTPCKaon[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kKaon);
554 fPIDTPCProton[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kProton);
555
556 new((*fPhiAODTracks)[i]) AliAODTrack(*trk);
557 }
558
559 fTPCTree ->Fill();
4c28b078 560 }
4c28b078 561
562
f96a5cb1 563
564 PostData(1, fITSTree);
565 PostData(2, fTPCTree);
4c28b078 566
567}//RunAOD
568
569
570//_____________________________________________________________________________
571void AliAnalysisTaskUpcPhi::RunAODMC(AliAODEvent *aod)
572{
573
574 fL0inputs = aod->GetHeader()->GetL0TriggerInputs();
575 fTriggerInputsMC[0] = kFALSE;//0SM2
576 fTriggerInputsMC[1] = fL0inputs & (1 << 0);//0VBA
577 fTriggerInputsMC[2] = fL0inputs & (1 << 1);//0VBC
578 fTriggerInputsMC[3] = fL0inputs & (1 << 9);//0OMU
579
580 fGenPart->Clear("C");
581
582 TClonesArray *arrayMC = (TClonesArray*) aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
583 if(!arrayMC) return;
584
585 Int_t nmc=0;
586 //loop over mc particles
587 for(Int_t imc=0; imc<arrayMC->GetEntriesFast(); imc++) {
588 AliAODMCParticle *mcPart = (AliAODMCParticle*) arrayMC->At(imc);
589 if(!mcPart) continue;
590
591 if(mcPart->GetMother() >= 0) continue;
592
593 TParticle *part = (TParticle*) fGenPart->ConstructedAt(nmc++);
594 part->SetMomentum(mcPart->Px(), mcPart->Py(), mcPart->Pz(), mcPart->E());
595 part->SetPdgCode(mcPart->GetPdgCode());
596 part->SetUniqueID(imc);
597 }//loop over mc particles
598
599}//RunAODMC
600
601
602//_____________________________________________________________________________
603void AliAnalysisTaskUpcPhi::RunESDtrig()
604{
605
606
607}
608//_____________________________________________________________________________
609void AliAnalysisTaskUpcPhi::RunESDhist()
610{
611
612
613}
614
615//_____________________________________________________________________________
616void AliAnalysisTaskUpcPhi::RunESDtree()
617{
618
619
620}//RunESD
621
622
4c28b078 623//_____________________________________________________________________________
624void AliAnalysisTaskUpcPhi::Terminate(Option_t *)
625{
626
627 cout<<"Analysis complete."<<endl;
628}//Terminate