1 /*************************************************************************
2 * Copyright(c) 1998-2008, 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 **************************************************************************/
23 #include "TClonesArray.h"
24 #include "TParticle.h"
25 #include "TObjString.h"
27 #include "TDatabasePDG.h"
28 #include "TLorentzVector.h"
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"
52 #include "AliAnalysisTaskUpcPsi2s.h"
54 ClassImp(AliAnalysisTaskUpcPsi2s);
59 //trees for UPC analysis,
60 // michal.broz@cern.ch
62 //_____________________________________________________________________________
63 AliAnalysisTaskUpcPsi2s::AliAnalysisTaskUpcPsi2s()
64 : AliAnalysisTaskSE(),fType(0),fRunTree(kTRUE),fRunHist(kTRUE),hCounter(0),fJPsiTree(0),fPsi2sTree(0),
65 fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),fVtxContrib(0),fBCrossNum(0),fNtracklets(0),
66 fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
67 fDataFilnam(0),fRecoPass(0),fEvtNum(0),
68 fJPsiAODTracks(0),fJPsiESDTracks(0),fPsi2sAODTracks(0),fPsi2sESDTracks(0),
69 fListQA(0),fHistNeventsJPsi(0),fHistTPCsignalJPsi(0),fHistDiLeptonPtJPsi(0),fHistDiElectronMass(0),fHistDiMuonMass(0),
70 fHistNeventsPsi2s(0),fHistPsi2sMassVsPt(0),fHistPsi2sMassCoherent(0),
77 }//AliAnalysisTaskUpcPsi2s
80 //_____________________________________________________________________________
81 AliAnalysisTaskUpcPsi2s::AliAnalysisTaskUpcPsi2s(const char *name)
82 : AliAnalysisTaskSE(name),fType(0),fRunTree(kTRUE),fRunHist(kTRUE),hCounter(0),fJPsiTree(0),fPsi2sTree(0),
83 fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),fVtxContrib(0),fBCrossNum(0),fNtracklets(0),
84 fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
85 fDataFilnam(0),fRecoPass(0),fEvtNum(0),
86 fJPsiAODTracks(0),fJPsiESDTracks(0),fPsi2sAODTracks(0),fPsi2sESDTracks(0),
87 fListQA(0),fHistNeventsJPsi(0),fHistTPCsignalJPsi(0),fHistDiLeptonPtJPsi(0),fHistDiElectronMass(0),fHistDiMuonMass(0),
88 fHistNeventsPsi2s(0),fHistPsi2sMassVsPt(0),fHistPsi2sMassCoherent(0),
94 if( strstr(name,"ESD") ) fType = 0;
95 if( strstr(name,"AOD") ) fType = 1;
99 DefineOutput(1, TTree::Class());
100 DefineOutput(2, TTree::Class());
101 DefineOutput(3, TH1I::Class());
102 DefineOutput(4, TList::Class());
104 }//AliAnalysisTaskUpcPsi2s
106 //_____________________________________________________________________________
107 void AliAnalysisTaskUpcPsi2s::Init()
110 for(Int_t i=0; i<ntrg; i++) fTrigger[i] = kFALSE;
114 //_____________________________________________________________________________
115 AliAnalysisTaskUpcPsi2s::~AliAnalysisTaskUpcPsi2s()
135 }//~AliAnalysisTaskUpcPsi2s
138 //_____________________________________________________________________________
139 void AliAnalysisTaskUpcPsi2s::UserCreateOutputObjects()
141 hCounter = new TH1I("hCounter", "hCounter", 34000, 1., 34001.);
144 fDataFilnam = new TObjString();
145 fDataFilnam->SetString("");
148 fJPsiAODTracks = new TClonesArray("AliAODTrack", 1000);
149 fJPsiESDTracks = new TClonesArray("AliESDtrack", 1000);
150 fPsi2sAODTracks = new TClonesArray("AliAODTrack", 1000);
151 fPsi2sESDTracks = new TClonesArray("AliESDtrack", 1000);
153 //output tree with JPsi candidate events
154 fJPsiTree = new TTree("fJPsiTree", "fJPsiTree");
155 fJPsiTree ->Branch("fRunNum", &fRunNum, "fRunNum/I");
156 fJPsiTree ->Branch("fPerNum", &fPerNum, "fPerNum/i");
157 fJPsiTree ->Branch("fOrbNum", &fOrbNum, "fOrbNum/i");
159 fJPsiTree ->Branch("fBCrossNum", &fBCrossNum, "fBCrossNum/s");
160 fJPsiTree ->Branch("fTrigger", &fTrigger[0], Form("fTrigger[%i]/O", ntrg));
161 fJPsiTree ->Branch("fL0inputs", &fL0inputs, "fL0inputs/i");
162 fJPsiTree ->Branch("fL1inputs", &fL1inputs, "fL1inputs/i");
163 fJPsiTree ->Branch("fNtracklets", &fNtracklets, "fNtracklets/s");
164 fJPsiTree ->Branch("fVtxContrib", &fVtxContrib, "fVtxContrib/I");
165 fJPsiTree ->Branch("fZDCAenergy", &fZDCAenergy, "fZDCAenergy/D");
166 fJPsiTree ->Branch("fZDCCenergy", &fZDCCenergy, "fZDCCenergy/D");
167 fJPsiTree ->Branch("fV0Adecision", &fV0Adecision, "fV0Adecision/I");
168 fJPsiTree ->Branch("fV0Cdecision", &fV0Cdecision, "fV0Cdecision/I");
169 fJPsiTree ->Branch("fDataFilnam", &fDataFilnam);
170 fJPsiTree ->Branch("fRecoPass", &fRecoPass, "fRecoPass/S");
171 fJPsiTree ->Branch("fEvtNum", &fEvtNum, "fEvtNum/L");
173 fJPsiTree ->Branch("fJPsiESDTracks", &fJPsiESDTracks);
176 fJPsiTree ->Branch("fJPsiAODTracks", &fJPsiAODTracks);
179 //output tree with Psi2s candidate events
180 fPsi2sTree = new TTree("fPsi2sTree", "fPsi2sTree");
181 fPsi2sTree ->Branch("fRunNum", &fRunNum, "fRunNum/I");
182 fPsi2sTree ->Branch("fPerNum", &fPerNum, "fPerNum/i");
183 fPsi2sTree ->Branch("fOrbNum", &fOrbNum, "fOrbNum/i");
185 fPsi2sTree ->Branch("fBCrossNum", &fBCrossNum, "fBCrossNum/s");
186 fPsi2sTree ->Branch("fTrigger", &fTrigger[0], Form("fTrigger[%i]/O", ntrg));
187 fPsi2sTree ->Branch("fL0inputs", &fL0inputs, "fL0inputs/i");
188 fPsi2sTree ->Branch("fL1inputs", &fL1inputs, "fL1inputs/i");
189 fPsi2sTree ->Branch("fNtracklets", &fNtracklets, "fNtracklets/s");
190 fPsi2sTree ->Branch("fVtxContrib", &fVtxContrib, "fVtxContrib/I");
191 fPsi2sTree ->Branch("fZDCAenergy", &fZDCAenergy, "fZDCAenergy/D");
192 fPsi2sTree ->Branch("fZDCCenergy", &fZDCCenergy, "fZDCCenergy/D");
193 fPsi2sTree ->Branch("fV0Adecision", &fV0Adecision, "fV0Adecision/I");
194 fPsi2sTree ->Branch("fV0Cdecision", &fV0Cdecision, "fV0Cdecision/I");
195 fPsi2sTree ->Branch("fDataFilnam", &fDataFilnam);
196 fPsi2sTree ->Branch("fRecoPass", &fRecoPass, "fRecoPass/S");
197 fPsi2sTree ->Branch("fEvtNum", &fEvtNum, "fEvtNum/L");
199 fPsi2sTree ->Branch("fPsi2sESDTracks", &fPsi2sESDTracks);
202 fPsi2sTree ->Branch("fPsi2sAODTracks", &fPsi2sAODTracks);
205 fListQA = new TList();
206 fListQA ->SetOwner();
208 TString CutNameJPsi[12] = {"Analyzed","Triggered","Vertex cut","V0 decision","Two good tracks",
209 "Like sign","Oposite sign","One p_{T}>1", "Both p_{T}>1","PID","Dimuom","Dielectron"};
210 fHistNeventsJPsi = new TH1D("fHistNeventsJPsi","fHistNeventsPsi2s",12,0.5,12.5);
211 for (Int_t i = 0; i<12; i++) fHistNeventsJPsi->GetXaxis()->SetBinLabel(i+1,CutNameJPsi[i].Data());
212 fListQA->Add(fHistNeventsJPsi);
214 fHistTPCsignalJPsi = new TH2D("fHistTPCsignalJPsi","fHistTPCsignalJPsi",240,0,120,240,0,120);
215 fListQA->Add(fHistTPCsignalJPsi);
217 fHistDiLeptonPtJPsi = new TH2D("fHistDiLeptonPtJPsi","fHistDiLeptonPtJPsi",350,0,3.5,350,0,3.5);
218 fListQA->Add(fHistDiLeptonPtJPsi);
220 fHistDiElectronMass = new TH1D("fHistDiElectronMass","Invariant mass of J/#psi candidates",100,2,5);
221 fHistDiElectronMass->GetXaxis()->SetTitle("Invariant mass(e^{+}e^{-}) (GeV/c)");
222 fListQA->Add(fHistDiElectronMass);
224 fHistDiMuonMass = new TH1D("fHistDiMuonMass","Invariant mass of J/#psi candidates",100,2,5);
225 fHistDiMuonMass->GetXaxis()->SetTitle("Invariant mass(#mu^{+}#mu^{-}) (GeV/c)");
226 fListQA->Add(fHistDiMuonMass);
228 TString CutNamePsi2s[13] = {"Analyzed","Triggered","Vertex cut","V0 decision","Four good tracks",
229 "DiLepton - DiPion","Like sign leptons","Like sign pions","Like sign both","Oposite sign","PID","Dimuom","Dielectron"};
231 fHistNeventsPsi2s = new TH1D("fHistNeventsPsi2s","fHistNeventsPsi2s",13,0.5,13.5);
232 for (Int_t i = 0; i<13; i++) fHistNeventsPsi2s->GetXaxis()->SetBinLabel(i+1,CutNamePsi2s[i].Data());
233 fListQA->Add(fHistNeventsPsi2s);
235 fHistPsi2sMassVsPt = new TH2D("fHistPsi2sMassVsPt","Mass vs p_{T} of #psi(2s) candidates",100,3,6,50,0,5);
236 fHistPsi2sMassVsPt->GetXaxis()->SetTitle("Invariant mass(l^{+}l^{-}#pi^{+}#pi^{-}) (GeV/c)");
237 fHistPsi2sMassVsPt->GetYaxis()->SetTitle("#it{p}_{T} (GeV/#it{c})");
238 fListQA->Add(fHistPsi2sMassVsPt);
240 fHistPsi2sMassCoherent = new TH1D("fHistPsi2sMassAllCoherent","Invariant mass of coherent #psi(2s) candidates",100,3,6);
241 fHistPsi2sMassCoherent->GetXaxis()->SetTitle("Invariant mass(l^{+}l^{-}#pi^{+}#pi^{-}) (GeV/c)");
242 fListQA->Add(fHistPsi2sMassCoherent);
244 fHistK0sMass = new TH1D("fHistK0sMass","fHistK0sMass",200,0.4,0.6);
245 fListQA->Add(fHistK0sMass);
247 PostData(1, fJPsiTree);
248 PostData(2, fPsi2sTree);
249 PostData(3, hCounter);
250 PostData(4, fListQA);
252 }//UserCreateOutputObjects
254 //_____________________________________________________________________________
255 void AliAnalysisTaskUpcPsi2s::UserExec(Option_t *)
258 //cout<<"#################### Next event ##################"<<endl;
260 if( fType == 0 ) RunESD();
262 if(fRunHist) RunAODhist();
263 if(fRunTree) RunAODtree();
267 //_____________________________________________________________________________
268 void AliAnalysisTaskUpcPsi2s::RunAODhist()
271 TDatabasePDG *pdgdat = TDatabasePDG::Instance();
273 TParticlePDG *partMuon = pdgdat->GetParticle( 13 );
274 Double_t muonMass = partMuon->Mass();
276 TParticlePDG *partElectron = pdgdat->GetParticle( 11 );
277 Double_t electronMass = partElectron->Mass();
279 TParticlePDG *partPion = pdgdat->GetParticle( 211 );
280 Double_t pionMass = partPion->Mass();
283 AliAODEvent *aod = (AliAODEvent*) InputEvent();
286 fHistNeventsJPsi->Fill(1);
287 fHistNeventsPsi2s->Fill(1);
290 TString trigger = aod->GetFiredTriggerClasses();
292 if( !trigger.Contains("CCUP4-B") ) return;
294 fHistNeventsJPsi->Fill(2);
295 fHistNeventsPsi2s->Fill(2);
298 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
299 fVtxContrib = fAODVertex->GetNContributors();
300 if(fVtxContrib < 2) return;
302 fHistNeventsJPsi->Fill(3);
303 fHistNeventsPsi2s->Fill(3);
307 AliAODVZERO *fV0data = aod ->GetVZEROData();
308 //AliAODZDC *fZDCdata = aod->GetZDCData();
310 fV0Adecision = fV0data->GetV0ADecision();
311 fV0Cdecision = fV0data->GetV0CDecision();
312 if(fV0Adecision != AliAODVZERO::kV0Empty || fV0Cdecision != AliAODVZERO::kV0Empty) return;
314 fHistNeventsJPsi->Fill(4);
315 fHistNeventsPsi2s->Fill(4);
319 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
321 TLorentzVector vLepton[4], vPion[4], vCandidate, vDilepton;
322 Short_t qLepton[4], qPion[4];
323 UInt_t nLepton=0, nPion=0, nHighPt=0;
324 Double_t jRecTPCsignal[5];
325 Int_t mass[3]={-1,-1,-1};
328 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
329 AliAODTrack *trk = aod->GetTrack(itr);
332 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
333 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
334 if(trk->GetTPCNcls() < 50)continue;
335 if(trk->Chi2perNDF() > 4)continue;
336 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
337 if(!trk->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
338 if(TMath::Abs(dca[1]) > 2) continue;
340 TrackIndex[nGoodTracks] = itr;
343 if(nGoodTracks > 4) break;
346 if(nGoodTracks == 2){
347 fHistNeventsJPsi->Fill(5);
348 for(Int_t i=0; i<2; i++){
349 AliAODTrack *trk = aod->GetTrack(TrackIndex[i]);
350 if(trk->Pt() > 1) nHighPt++;
351 jRecTPCsignal[nLepton] = trk->GetTPCsignal();
352 qLepton[nLepton] = trk->Charge();
353 if(jRecTPCsignal[nLepton] > 40 && jRecTPCsignal[nLepton] < 70){
354 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
357 if(jRecTPCsignal[nLepton] > 70 && jRecTPCsignal[nLepton] < 100){
358 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
364 if(qLepton[0]*qLepton[1] > 0) fHistNeventsJPsi->Fill(6);
365 if(qLepton[0]*qLepton[1] < 0){
366 fHistNeventsJPsi->Fill(7);
368 fHistNeventsJPsi->Fill(8);
369 fHistTPCsignalJPsi->Fill(jRecTPCsignal[0],jRecTPCsignal[1]);
370 if(nHighPt == 2) fHistNeventsJPsi->Fill(9);
371 if(mass[0] == mass[1] && mass[0] != -1) {
372 fHistNeventsJPsi->Fill(10);
373 vCandidate = vLepton[0]+vLepton[1];
374 if( vCandidate.M() > 2.8 && vCandidate.M() < 3.2) fHistDiLeptonPtJPsi->Fill(vLepton[0].Pt(),vLepton[1].Pt());
376 fHistDiMuonMass->Fill(vCandidate.M());
377 fHistNeventsJPsi->Fill(11);
380 fHistDiElectronMass->Fill(vCandidate.M());
381 fHistNeventsJPsi->Fill(12);
388 nLepton=0; nPion=0; nHighPt=0;
389 mass[0]= -1; mass[1]= -1, mass[2]= -1;
391 if(nGoodTracks == 4){
392 fHistNeventsPsi2s->Fill(5);
393 for(Int_t i=0; i<4; i++){
394 AliAODTrack *trk = aod->GetTrack(TrackIndex[i]);
397 jRecTPCsignal[nLepton] = trk->GetTPCsignal();
398 qLepton[nLepton] = trk->Charge();
399 if(jRecTPCsignal[nLepton] > 40 && jRecTPCsignal[nLepton] < 70){
400 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
403 if(jRecTPCsignal[nLepton] > 70 && jRecTPCsignal[nLepton] < 100){
404 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
410 qPion[nPion] = trk->Charge();
411 vPion[nPion].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), pionMass);
415 if(nLepton > 2 || nPion > 2) break;
417 if((nLepton == 2) && (nPion == 2)){
418 fHistNeventsPsi2s->Fill(6);
419 if(qLepton[0]*qLepton[1] > 0) fHistNeventsPsi2s->Fill(7);
420 if(qPion[0]*qPion[1] > 0) fHistNeventsPsi2s->Fill(8);
421 if((qLepton[0]*qLepton[1] > 0) && (qPion[0]*qPion[1] > 0)) fHistNeventsPsi2s->Fill(9);
422 if((qLepton[0]*qLepton[1] < 0) && (qPion[0]*qPion[1] < 0)){
423 fHistNeventsPsi2s->Fill(10);
424 if(mass[0] == mass[1]) {
425 fHistNeventsPsi2s->Fill(11);
426 vCandidate = vLepton[0]+vLepton[1]+vPion[0]+vPion[1];
427 vDilepton = vLepton[0]+vLepton[1];
428 fHistPsi2sMassVsPt->Fill(vCandidate.M(),vCandidate.Pt());
429 if(vCandidate.Pt() < 0.15) fHistPsi2sMassCoherent->Fill(vCandidate.M());
430 if(mass[0] == 0) fHistNeventsPsi2s->Fill(12);
431 if(mass[0] == 1) fHistNeventsPsi2s->Fill(13);
438 //---------------------------------K0s + K0s loop - very experimental--------------------
441 for(Int_t iV0=0; iV0<aod ->GetNumberOfV0s(); iV0++) {
442 AliAODv0 *v0 = aod->GetV0(iV0);
444 Bool_t lOnFlyStatus = v0->GetOnFlyStatus();
445 if (lOnFlyStatus) continue;
447 AliAODTrack *pTrack=(AliAODTrack *)v0->GetDaughter(0); //0->Positive Daughter
448 AliAODTrack *nTrack=(AliAODTrack *)v0->GetDaughter(1); //1->Negative Daughter
449 if (!pTrack || !nTrack) continue;
451 if ( pTrack->Charge() == nTrack->Charge())continue;
453 if(!(pTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
454 if(!(nTrack->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
455 if(pTrack->GetTPCNcls() < 50)continue;
456 if(nTrack->GetTPCNcls() < 50)continue;
457 if(pTrack->Chi2perNDF() > 4)continue;
458 if(nTrack->Chi2perNDF() > 4)continue;
460 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
461 if(!pTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
462 if(TMath::Abs(dca[1]) > 2) continue;
463 if(!nTrack->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
464 if(TMath::Abs(dca[1]) > 2) continue;
466 TrackIndex[nGoodTracks] = iV0;
468 if(nGoodTracks > 2) break;
470 if(nGoodTracks == 2){
471 for(Int_t i=0; i<2; i++){
472 AliAODv0 *v0 = aod->GetV0(TrackIndex[i]);
473 fHistK0sMass->Fill(v0->MassK0Short());
477 PostData(4, fListQA);
481 //_____________________________________________________________________________
482 void AliAnalysisTaskUpcPsi2s::RunAODtree()
485 AliAODEvent *aod = (AliAODEvent*) InputEvent();
489 const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
490 fDataFilnam->Clear();
491 fDataFilnam->SetString(filnam);
492 fEvtNum = ((TTree*) GetInputData(0))->GetTree()->GetReadEntry();
493 fRunNum = aod ->GetRunNumber();
498 TString trigger = aod->GetFiredTriggerClasses();
500 fTrigger[0] = trigger.Contains("CINT7-B");
501 fTrigger[1] = trigger.Contains("CCUP4-B"); // CE
502 fTrigger[2] = trigger.Contains("CCUP4-E"); // CE
504 Bool_t isTRG = kFALSE;
505 for(Int_t i=1; i<ntrg; i++) {
506 if( fTrigger[i] ) {isTRG = kTRUE; hCounter->Fill( fRunNum - 167806 + 1 + i*2000 );}
508 if( !isTRG ) {PostData(3, hCounter); return;}
513 fL0inputs = aod->GetHeader()->GetL0TriggerInputs();
514 fL1inputs = aod->GetHeader()->GetL1TriggerInputs();
516 //Event identification
517 fPerNum = aod ->GetPeriodNumber();
518 fOrbNum = aod ->GetOrbitNumber();
519 fBCrossNum = aod ->GetBunchCrossNumber();
522 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
523 fVtxContrib = fAODVertex->GetNContributors();
526 fNtracklets = aod->GetTracklets()->GetNumberOfTracklets();
529 AliAODVZERO *fV0data = aod ->GetVZEROData();
530 AliAODZDC *fZDCdata = aod->GetZDCData();
532 fV0Adecision = fV0data->GetV0ADecision();
533 fV0Cdecision = fV0data->GetV0CDecision();
534 fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
535 fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
538 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
541 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
542 AliAODTrack *trk = aod->GetTrack(itr);
545 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
546 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
547 if(trk->GetTPCNcls() < 50)continue;
548 if(trk->Chi2perNDF() > 4)continue;
549 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
550 if(!trk->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
551 if(TMath::Abs(dca[1]) > 2) continue;
553 TrackIndex[nGoodTracks] = itr;
556 if(nGoodTracks > 4) break;
559 if(nGoodTracks == 2){
560 for(Int_t i=0; i<2; i++){
561 AliAODTrack *trk = aod->GetTrack(TrackIndex[i]);
563 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
564 trk->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov);
566 trk->SetDCA(dca[0],dca[1]); //to get DCAxy trk->DCA(); to get DCAz trk->ZatDCA();
567 new((*fJPsiAODTracks)[i]) AliAODTrack(*trk);
571 PostData(1, fJPsiTree);
574 if(nGoodTracks == 4){
575 for(Int_t i=0; i<4; i++){
576 AliAODTrack *trk = aod->GetTrack(TrackIndex[i]);
578 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
579 trk->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov);
581 trk->SetDCA(dca[0],dca[1]); //to get DCAxy trk->DCA(); to get DCAz trk->ZatDCA();
582 new((*fPsi2sAODTracks)[i]) AliAODTrack(*trk);
586 PostData(2, fPsi2sTree);
589 PostData(3, hCounter);
593 //_____________________________________________________________________________
594 void AliAnalysisTaskUpcPsi2s::RunESD()
598 AliESDEvent *esd = (AliESDEvent*) InputEvent();
602 const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
603 fDataFilnam->Clear();
604 fDataFilnam->SetString(filnam);
605 fEvtNum = ((TTree*) GetInputData(0))->GetTree()->GetReadEntry();
606 fRunNum = esd->GetRunNumber();
611 TString trigger = esd->GetFiredTriggerClasses();
613 fTrigger[0] = trigger.Contains("CINT7-B");
614 fTrigger[1] = trigger.Contains("CCUP4-B"); // CE
615 fTrigger[2] = trigger.Contains("CCUP4-E"); // CE
617 Bool_t isTRG = kFALSE;
618 for(Int_t i=1; i<ntrg; i++) {
619 if( fTrigger[i] ) {isTRG = kTRUE; hCounter->Fill( fRunNum - 167806 + 1 + i*2000 );}
621 if( !isTRG ) {PostData(3, hCounter); return;}
626 fL0inputs = esd->GetHeader()->GetL0TriggerInputs();
627 fL1inputs = esd->GetHeader()->GetL1TriggerInputs();
629 //Event identification
630 fPerNum = esd->GetPeriodNumber();
631 fOrbNum = esd->GetOrbitNumber();
632 fBCrossNum = esd->GetBunchCrossNumber();
635 AliESDVertex *fESDVertex = (AliESDVertex*) esd->GetPrimaryVertex();
636 fVtxContrib = fESDVertex->GetNContributors();
639 fNtracklets = esd->GetMultiplicity()->GetNumberOfTracklets();
642 AliESDVZERO *fV0data = esd->GetVZEROData();
643 AliESDZDC *fZDCdata = esd->GetESDZDC();
645 fV0Adecision = fV0data->GetV0ADecision();
646 fV0Cdecision = fV0data->GetV0CDecision();
647 fZDCAenergy = fZDCdata->GetZN2TowerEnergy()[0];
648 fZDCCenergy = fZDCdata->GetZN1TowerEnergy()[0];
651 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
654 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
655 AliESDtrack *trk = esd->GetTrack(itr);
658 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
659 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
660 if(trk->GetTPCNcls() < 50)continue;
661 if(trk->GetTPCchi2()/trk->GetTPCNcls() > 4)continue;
662 Float_t dca[2] = {0.0,0.0}; AliExternalTrackParam cParam;
663 if(!trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam)) continue;
664 trk->GetImpactParameters(dca[0],dca[1]);
665 if(TMath::Abs(dca[1]) > 2) continue;
667 TrackIndex[nGoodTracks] = itr;
669 if(nGoodTracks > 4) break;
672 if(nGoodTracks == 2){
673 for(Int_t i=0; i<2; i++){
674 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
676 AliExternalTrackParam cParam;
677 trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam);// to get trk->GetImpactParameters(DCAxy,DCAz);
679 new((*fJPsiESDTracks)[i]) AliESDtrack(*trk);
683 PostData(1, fJPsiTree);
686 if(nGoodTracks == 4){
687 for(Int_t i=0; i<4; i++){
688 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
690 AliExternalTrackParam cParam;
691 trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam);// to get trk->GetImpactParameters(DCAxy,DCAz);
693 new((*fPsi2sESDTracks)[i]) AliESDtrack(*trk);
697 PostData(2, fPsi2sTree);
700 PostData(3, hCounter);
704 //_____________________________________________________________________________
705 void AliAnalysisTaskUpcPsi2s::Terminate(Option_t *)
708 cout<<"Analysis complete."<<endl;