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"
50 #include "AliCentrality.h"
51 #include "AliKFVertex.h"
52 #include "AliExternalTrackParam.h"
55 #include "AliAnalysisTaskUpcPsi2s.h"
57 ClassImp(AliAnalysisTaskUpcPsi2s);
62 //trees for UPC analysis,
63 // michal.broz@cern.ch
65 //_____________________________________________________________________________
66 AliAnalysisTaskUpcPsi2s::AliAnalysisTaskUpcPsi2s()
67 : AliAnalysisTaskSE(),fType(0),fRunTree(kTRUE),fRunHist(kTRUE),fJPsiTree(0),fPsi2sTree(0),
68 fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),
69 fTOFtrig1(0), fTOFtrig2(0),
70 fVtxContrib(0),fVtxChi2(0),fVtxNDF(0),
71 fBCrossNum(0),fNtracklets(0),fNLooseTracks(0),
72 fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
73 fDataFilnam(0),fRecoPass(0),fEvtNum(0),
74 fJPsiAODTracks(0),fJPsiESDTracks(0),fPsi2sAODTracks(0),fPsi2sESDTracks(0),
75 fListTrig(0),fHistUpcTriggersPerRun(0),fHistZedTriggersPerRun(0),fHistCvlnTriggersPerRun(0),
76 fHistMBTriggersPerRun(0),fHistCentralTriggersPerRun(0),fHistSemiCentralTriggersPerRun(0),
77 fListHist(0),fHistNeventsJPsi(0),fHistTPCsignalJPsi(0),fHistDiLeptonPtJPsi(0),fHistDiElectronMass(0),fHistDiMuonMass(0),
78 fHistNeventsPsi2s(0),fHistPsi2sMassVsPt(0),fHistPsi2sMassCoherent(0)
84 }//AliAnalysisTaskUpcPsi2s
87 //_____________________________________________________________________________
88 AliAnalysisTaskUpcPsi2s::AliAnalysisTaskUpcPsi2s(const char *name)
89 : AliAnalysisTaskSE(name),fType(0),fRunTree(kTRUE),fRunHist(kTRUE),fJPsiTree(0),fPsi2sTree(0),
90 fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),
91 fTOFtrig1(0), fTOFtrig2(0),
92 fVtxContrib(0),fVtxChi2(0),fVtxNDF(0),
93 fBCrossNum(0),fNtracklets(0),fNLooseTracks(0),
94 fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
95 fDataFilnam(0),fRecoPass(0),fEvtNum(0),
96 fJPsiAODTracks(0),fJPsiESDTracks(0),fPsi2sAODTracks(0),fPsi2sESDTracks(0),
97 fListTrig(0),fHistUpcTriggersPerRun(0),fHistZedTriggersPerRun(0),fHistCvlnTriggersPerRun(0),
98 fHistMBTriggersPerRun(0),fHistCentralTriggersPerRun(0),fHistSemiCentralTriggersPerRun(0),
99 fListHist(0),fHistNeventsJPsi(0),fHistTPCsignalJPsi(0),fHistDiLeptonPtJPsi(0),fHistDiElectronMass(0),fHistDiMuonMass(0),
100 fHistNeventsPsi2s(0),fHistPsi2sMassVsPt(0),fHistPsi2sMassCoherent(0)
105 if( strstr(name,"ESD") ) fType = 0;
106 if( strstr(name,"AOD") ) fType = 1;
110 DefineOutput(1, TTree::Class());
111 DefineOutput(2, TTree::Class());
112 DefineOutput(3, TList::Class());
113 DefineOutput(4, TList::Class());
115 }//AliAnalysisTaskUpcPsi2s
117 //_____________________________________________________________________________
118 void AliAnalysisTaskUpcPsi2s::Init()
121 for(Int_t i=0; i<ntrg; i++) fTrigger[i] = kFALSE;
122 for(Int_t i=0; i<4; i++) fTOFphi[i] = -666;
123 for(Int_t i=0; i<3; i++){
131 //_____________________________________________________________________________
132 AliAnalysisTaskUpcPsi2s::~AliAnalysisTaskUpcPsi2s()
152 }//~AliAnalysisTaskUpcPsi2s
155 //_____________________________________________________________________________
156 void AliAnalysisTaskUpcPsi2s::UserCreateOutputObjects()
159 fDataFilnam = new TObjString();
160 fDataFilnam->SetString("");
163 fJPsiAODTracks = new TClonesArray("AliAODTrack", 1000);
164 fJPsiESDTracks = new TClonesArray("AliESDtrack", 1000);
165 fPsi2sAODTracks = new TClonesArray("AliAODTrack", 1000);
166 fPsi2sESDTracks = new TClonesArray("AliESDtrack", 1000);
168 //output tree with JPsi candidate events
169 fJPsiTree = new TTree("fJPsiTree", "fJPsiTree");
170 fJPsiTree ->Branch("fRunNum", &fRunNum, "fRunNum/I");
171 fJPsiTree ->Branch("fPerNum", &fPerNum, "fPerNum/i");
172 fJPsiTree ->Branch("fOrbNum", &fOrbNum, "fOrbNum/i");
174 fJPsiTree ->Branch("fBCrossNum", &fBCrossNum, "fBCrossNum/s");
175 fJPsiTree ->Branch("fTrigger", &fTrigger[0], Form("fTrigger[%i]/O", ntrg));
176 fJPsiTree ->Branch("fL0inputs", &fL0inputs, "fL0inputs/i");
177 fJPsiTree ->Branch("fL1inputs", &fL1inputs, "fL1inputs/i");
178 fJPsiTree ->Branch("fNtracklets", &fNtracklets, "fNtracklets/s");
179 fJPsiTree ->Branch("fNLooseTracks", &fNLooseTracks, "fNLooseTracks/s");
180 fJPsiTree ->Branch("fVtxContrib", &fVtxContrib, "fVtxContrib/I");
182 fJPsiTree ->Branch("fTOFtrig1", &fTOFtrig1, "fTOFtrig1/O");
183 fJPsiTree ->Branch("fTOFtrig2", &fTOFtrig2, "fTOFtrig2/O");
184 fJPsiTree ->Branch("fTOFphi", &fTOFphi[0], "fTOFphi[4]/D");
186 fJPsiTree ->Branch("fVtxPos", &fVtxPos[0], "fVtxPos[3]/D");
187 fJPsiTree ->Branch("fVtxErr", &fVtxErr[0], "fVtxErr[3]/D");
188 fJPsiTree ->Branch("fVtxChi2", &fVtxChi2, "fVtxChi2/D");
189 fJPsiTree ->Branch("fVtxNDF", &fVtxNDF, "fVtxNDF/D");
191 fJPsiTree ->Branch("fKfVtxPos", &fKfVtxPos[0], "fKfVtxPos[3]/D");
193 fJPsiTree ->Branch("fZDCAenergy", &fZDCAenergy, "fZDCAenergy/D");
194 fJPsiTree ->Branch("fZDCCenergy", &fZDCCenergy, "fZDCCenergy/D");
195 fJPsiTree ->Branch("fV0Adecision", &fV0Adecision, "fV0Adecision/I");
196 fJPsiTree ->Branch("fV0Cdecision", &fV0Cdecision, "fV0Cdecision/I");
197 fJPsiTree ->Branch("fDataFilnam", &fDataFilnam);
198 fJPsiTree ->Branch("fRecoPass", &fRecoPass, "fRecoPass/S");
199 fJPsiTree ->Branch("fEvtNum", &fEvtNum, "fEvtNum/L");
201 fJPsiTree ->Branch("fJPsiESDTracks", &fJPsiESDTracks);
204 fJPsiTree ->Branch("fJPsiAODTracks", &fJPsiAODTracks);
207 //output tree with Psi2s candidate events
208 fPsi2sTree = new TTree("fPsi2sTree", "fPsi2sTree");
209 fPsi2sTree ->Branch("fRunNum", &fRunNum, "fRunNum/I");
210 fPsi2sTree ->Branch("fPerNum", &fPerNum, "fPerNum/i");
211 fPsi2sTree ->Branch("fOrbNum", &fOrbNum, "fOrbNum/i");
213 fPsi2sTree ->Branch("fBCrossNum", &fBCrossNum, "fBCrossNum/s");
214 fPsi2sTree ->Branch("fTrigger", &fTrigger[0], Form("fTrigger[%i]/O", ntrg));
215 fPsi2sTree ->Branch("fL0inputs", &fL0inputs, "fL0inputs/i");
216 fPsi2sTree ->Branch("fL1inputs", &fL1inputs, "fL1inputs/i");
217 fPsi2sTree ->Branch("fNtracklets", &fNtracklets, "fNtracklets/s");
218 fPsi2sTree ->Branch("fNLooseTracks", &fNLooseTracks, "fNLooseTracks/s");
219 fPsi2sTree ->Branch("fVtxContrib", &fVtxContrib, "fVtxContrib/I");
221 fPsi2sTree ->Branch("fTOFtrig1", &fTOFtrig1, "fTOFtrig1/O");
222 fPsi2sTree ->Branch("fTOFtrig2", &fTOFtrig2, "fTOFtrig2/O");
223 fPsi2sTree ->Branch("fTOFphi", &fTOFphi[0], "fTOFphi[4]/D");
225 fPsi2sTree ->Branch("fVtxPos", &fVtxPos[0], "fVtxPos[3]/D");
226 fPsi2sTree ->Branch("fVtxErr", &fVtxErr[0], "fVtxErr[3]/D");
227 fPsi2sTree ->Branch("fVtxChi2", &fVtxChi2, "fVtxChi2/D");
228 fPsi2sTree ->Branch("fVtxNDF", &fVtxNDF, "fVtxNDF/D");
230 fPsi2sTree ->Branch("fKfVtxPos", &fKfVtxPos[0], "fKfVtxPos[3]/D");
232 fPsi2sTree ->Branch("fZDCAenergy", &fZDCAenergy, "fZDCAenergy/D");
233 fPsi2sTree ->Branch("fZDCCenergy", &fZDCCenergy, "fZDCCenergy/D");
234 fPsi2sTree ->Branch("fV0Adecision", &fV0Adecision, "fV0Adecision/I");
235 fPsi2sTree ->Branch("fV0Cdecision", &fV0Cdecision, "fV0Cdecision/I");
236 fPsi2sTree ->Branch("fDataFilnam", &fDataFilnam);
237 fPsi2sTree ->Branch("fRecoPass", &fRecoPass, "fRecoPass/S");
238 fPsi2sTree ->Branch("fEvtNum", &fEvtNum, "fEvtNum/L");
240 fPsi2sTree ->Branch("fPsi2sESDTracks", &fPsi2sESDTracks);
243 fPsi2sTree ->Branch("fPsi2sAODTracks", &fPsi2sAODTracks);
246 fListTrig = new TList();
247 fListTrig ->SetOwner();
249 fHistUpcTriggersPerRun = new TH1D("fHistUpcTriggersPerRun", "fHistUpcTriggersPerRun", 3000, 167000.5, 170000.5);
250 fListTrig->Add(fHistUpcTriggersPerRun);
252 fHistZedTriggersPerRun = new TH1D("fHistZedTriggersPerRun", "fHistZedTriggersPerRun", 3000, 167000.5, 170000.5);
253 fListTrig->Add(fHistZedTriggersPerRun);
255 fHistCvlnTriggersPerRun = new TH1D("fHistCvlnTriggersPerRun", "fHistCvlnTriggersPerRun", 3000, 167000.5, 170000.5);
256 fListTrig->Add(fHistCvlnTriggersPerRun);
258 fHistMBTriggersPerRun = new TH1D("fHistMBTriggersPerRun", "fHistMBTriggersPerRun", 3000, 167000.5, 170000.5);
259 fListTrig->Add(fHistMBTriggersPerRun);
261 fHistCentralTriggersPerRun = new TH1D("fHistCentralTriggersPerRun", "fHistCentralTriggersPerRun", 3000, 167000.5, 170000.5);
262 fListTrig->Add(fHistCentralTriggersPerRun);
264 fHistSemiCentralTriggersPerRun = new TH1D("fHistSemiCentralTriggersPerRun", "fHistSemiCentralTriggersPerRun", 3000, 167000.5, 170000.5);
265 fListTrig->Add(fHistSemiCentralTriggersPerRun);
267 fListHist = new TList();
268 fListHist ->SetOwner();
270 TString CutNameJPsi[12] = {"Analyzed","Triggered","Vertex cut","V0 decision","Two good tracks",
271 "Like sign","Oposite sign","One p_{T}>1", "Both p_{T}>1","PID","Dimuom","Dielectron"};
272 fHistNeventsJPsi = new TH1D("fHistNeventsJPsi","fHistNeventsPsi2s",12,0.5,12.5);
273 for (Int_t i = 0; i<12; i++) fHistNeventsJPsi->GetXaxis()->SetBinLabel(i+1,CutNameJPsi[i].Data());
274 fListHist->Add(fHistNeventsJPsi);
276 fHistTPCsignalJPsi = new TH2D("fHistTPCsignalJPsi","fHistTPCsignalJPsi",240,0,120,240,0,120);
277 fListHist->Add(fHistTPCsignalJPsi);
279 fHistDiLeptonPtJPsi = new TH2D("fHistDiLeptonPtJPsi","fHistDiLeptonPtJPsi",350,0,3.5,350,0,3.5);
280 fListHist->Add(fHistDiLeptonPtJPsi);
282 fHistDiElectronMass = new TH1D("fHistDiElectronMass","Invariant mass of J/#psi candidates",100,2,5);
283 fHistDiElectronMass->GetXaxis()->SetTitle("Invariant mass(e^{+}e^{-}) (GeV/c)");
284 fListHist->Add(fHistDiElectronMass);
286 fHistDiMuonMass = new TH1D("fHistDiMuonMass","Invariant mass of J/#psi candidates",100,2,5);
287 fHistDiMuonMass->GetXaxis()->SetTitle("Invariant mass(#mu^{+}#mu^{-}) (GeV/c)");
288 fListHist->Add(fHistDiMuonMass);
290 TString CutNamePsi2s[13] = {"Analyzed","Triggered","Vertex cut","V0 decision","Four good tracks",
291 "DiLepton - DiPion","Like sign leptons","Like sign pions","Like sign both","Oposite sign","PID","Dimuom","Dielectron"};
293 fHistNeventsPsi2s = new TH1D("fHistNeventsPsi2s","fHistNeventsPsi2s",13,0.5,13.5);
294 for (Int_t i = 0; i<13; i++) fHistNeventsPsi2s->GetXaxis()->SetBinLabel(i+1,CutNamePsi2s[i].Data());
295 fListHist->Add(fHistNeventsPsi2s);
297 fHistPsi2sMassVsPt = new TH2D("fHistPsi2sMassVsPt","Mass vs p_{T} of #psi(2s) candidates",100,3,6,50,0,5);
298 fHistPsi2sMassVsPt->GetXaxis()->SetTitle("Invariant mass(l^{+}l^{-}#pi^{+}#pi^{-}) (GeV/c)");
299 fHistPsi2sMassVsPt->GetYaxis()->SetTitle("#it{p}_{T} (GeV/#it{c})");
300 fListHist->Add(fHistPsi2sMassVsPt);
302 fHistPsi2sMassCoherent = new TH1D("fHistPsi2sMassAllCoherent","Invariant mass of coherent #psi(2s) candidates",100,3,6);
303 fHistPsi2sMassCoherent->GetXaxis()->SetTitle("Invariant mass(l^{+}l^{-}#pi^{+}#pi^{-}) (GeV/c)");
304 fListHist->Add(fHistPsi2sMassCoherent);
306 PostData(1, fJPsiTree);
307 PostData(2, fPsi2sTree);
308 PostData(3, fListTrig);
309 PostData(4, fListHist);
311 }//UserCreateOutputObjects
313 //_____________________________________________________________________________
314 void AliAnalysisTaskUpcPsi2s::UserExec(Option_t *)
317 //cout<<"#################### Next event ##################"<<endl;
321 if(fRunHist) RunESDhist();
322 if(fRunTree) RunESDtree();
327 if(fRunHist) RunAODhist();
328 if(fRunTree) RunAODtree();
332 //_____________________________________________________________________________
333 void AliAnalysisTaskUpcPsi2s::RunAODtrig()
337 AliAODEvent *aod = (AliAODEvent*) InputEvent();
340 fRunNum = aod ->GetRunNumber();
342 TString trigger = aod->GetFiredTriggerClasses();
344 if(trigger.Contains("CCUP4-B")) fHistUpcTriggersPerRun->Fill(fRunNum); //Upc triggers
346 if(trigger.Contains("CVLN_B2-B")) fHistCvlnTriggersPerRun->Fill(fRunNum); //CVLN triggers - synchronously downscaled
347 if(trigger.Contains("CVLN_R1-B")) fHistCvlnTriggersPerRun->Fill(fRunNum); //CVLN triggers - randomly downscaled
349 fL1inputs = aod->GetHeader()->GetL1TriggerInputs();
350 if(fL1inputs & (1 << 18)) fHistZedTriggersPerRun->Fill(fRunNum); //1ZED trigger inputs
352 //MB, Central and SemiCentral triggers
353 AliCentrality *centrality = aod->GetCentrality();
354 UInt_t selectionMask = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
356 Double_t percentile = centrality->GetCentralityPercentileUnchecked("V0M");
357 //Double_t percentile = centrality->GetCentralityPercentile("V0M");
359 if( ((selectionMask & AliVEvent::kMB) == AliVEvent::kMB) ||
360 ((selectionMask & AliVEvent::kSemiCentral) == AliVEvent::kSemiCentral) ||
361 ((selectionMask & AliVEvent::kCentral) == AliVEvent::kCentral) ){
363 if(percentile<80 && percentile>0) fHistMBTriggersPerRun->Fill(fRunNum);
364 if(percentile<6 && percentile>0 && (trigger.Contains("CVHN_R2-B"))) fHistCentralTriggersPerRun->Fill(fRunNum);
365 if(percentile<50 && percentile>15 && (trigger.Contains("CVLN_B2-B"))) fHistSemiCentralTriggersPerRun->Fill(fRunNum);
366 if(percentile<50 && percentile>15 && (trigger.Contains("CVLN_R1-B"))) fHistSemiCentralTriggersPerRun->Fill(fRunNum);
370 PostData(3, fListTrig);
373 //_____________________________________________________________________________
374 void AliAnalysisTaskUpcPsi2s::RunAODhist()
377 TDatabasePDG *pdgdat = TDatabasePDG::Instance();
379 TParticlePDG *partMuon = pdgdat->GetParticle( 13 );
380 Double_t muonMass = partMuon->Mass();
382 TParticlePDG *partElectron = pdgdat->GetParticle( 11 );
383 Double_t electronMass = partElectron->Mass();
385 TParticlePDG *partPion = pdgdat->GetParticle( 211 );
386 Double_t pionMass = partPion->Mass();
389 AliAODEvent *aod = (AliAODEvent*) InputEvent();
392 fHistNeventsJPsi->Fill(1);
393 fHistNeventsPsi2s->Fill(1);
396 TString trigger = aod->GetFiredTriggerClasses();
398 if( !trigger.Contains("CCUP") ) return;
400 fHistNeventsJPsi->Fill(2);
401 fHistNeventsPsi2s->Fill(2);
404 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
405 fVtxContrib = fAODVertex->GetNContributors();
406 if(fVtxContrib < 2) return;
408 fHistNeventsJPsi->Fill(3);
409 fHistNeventsPsi2s->Fill(3);
412 AliAODVZERO *fV0data = aod ->GetVZEROData();
413 AliAODZDC *fZDCdata = aod->GetZDCData();
415 fV0Adecision = fV0data->GetV0ADecision();
416 fV0Cdecision = fV0data->GetV0CDecision();
417 if(fV0Adecision != AliAODVZERO::kV0Empty || fV0Cdecision != AliAODVZERO::kV0Empty) return;
419 fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
420 fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
422 if( fZDCAenergy > 8200 || fZDCCenergy > 8200) return;
424 fHistNeventsJPsi->Fill(4);
425 fHistNeventsPsi2s->Fill(4);
428 Int_t nGoodTracks = 0;
429 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
431 TLorentzVector vLepton[4], vPion[4], vCandidate, vDilepton;
432 Short_t qLepton[4], qPion[4];
433 UInt_t nLepton=0, nPion=0, nHighPt=0;
434 Double_t fRecTPCsignal[5];
435 Int_t mass[3]={-1,-1,-1};
439 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
440 AliAODTrack *trk = aod->GetTrack(itr);
443 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
444 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
445 if(trk->GetTPCNcls() < 50)continue;
446 if(trk->Chi2perNDF() > 4)continue;
447 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
448 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
449 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
452 if(TMath::Abs(dca[1]) > 2) continue;
454 TrackIndex[nGoodTracks] = itr;
457 if(nGoodTracks > 4) break;
460 nLepton=0; nPion=0; nHighPt=0;
461 mass[0]= -1; mass[1]= -1, mass[2]= -1;
463 if(nGoodTracks == 4){
464 fHistNeventsPsi2s->Fill(5);
465 for(Int_t i=0; i<4; i++){
466 AliAODTrack *trk = aod->GetTrack(TrackIndex[i]);
469 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
470 qLepton[nLepton] = trk->Charge();
471 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
472 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
475 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
476 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
482 qPion[nPion] = trk->Charge();
483 vPion[nPion].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), pionMass);
487 if(nLepton > 2 || nPion > 2) break;
489 if((nLepton == 2) && (nPion == 2)){
490 fHistNeventsPsi2s->Fill(6);
491 if(qLepton[0]*qLepton[1] > 0) fHistNeventsPsi2s->Fill(7);
492 if(qPion[0]*qPion[1] > 0) fHistNeventsPsi2s->Fill(8);
493 if((qLepton[0]*qLepton[1] > 0) && (qPion[0]*qPion[1] > 0)) fHistNeventsPsi2s->Fill(9);
494 if((qLepton[0]*qLepton[1] < 0) && (qPion[0]*qPion[1] < 0)){
495 fHistNeventsPsi2s->Fill(10);
496 if(mass[0] == mass[1]) {
497 fHistNeventsPsi2s->Fill(11);
498 vCandidate = vLepton[0]+vLepton[1]+vPion[0]+vPion[1];
499 vDilepton = vLepton[0]+vLepton[1];
500 fHistPsi2sMassVsPt->Fill(vCandidate.M(),vCandidate.Pt());
501 if(vCandidate.Pt() < 0.15) fHistPsi2sMassCoherent->Fill(vCandidate.M());
502 if(mass[0] == 0) fHistNeventsPsi2s->Fill(12);
503 if(mass[0] == 1) fHistNeventsPsi2s->Fill(13);
511 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
512 AliAODTrack *trk = aod->GetTrack(itr);
515 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
516 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
517 if(trk->GetTPCNcls() < 70)continue;
518 if(trk->Chi2perNDF() > 4)continue;
519 if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1))) continue;
520 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
521 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
522 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
524 if(TMath::Abs(dca[1]) > 2) continue;
525 if(TMath::Abs(dca[0]) > 0.2) continue;
527 TrackIndex[nGoodTracks] = itr;
530 if(nGoodTracks > 2) break;
533 nLepton=0; nPion=0; nHighPt=0;
534 mass[0]= -1; mass[1]= -1, mass[2]= -1;
536 if(nGoodTracks == 2){
537 fHistNeventsJPsi->Fill(5);
538 for(Int_t i=0; i<2; i++){
539 AliAODTrack *trk = aod->GetTrack(TrackIndex[i]);
540 if(trk->Pt() > 1) nHighPt++;
541 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
542 qLepton[nLepton] = trk->Charge();
543 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
544 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
547 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
548 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
554 if(qLepton[0]*qLepton[1] > 0) fHistNeventsJPsi->Fill(6);
555 if(qLepton[0]*qLepton[1] < 0){
556 fHistNeventsJPsi->Fill(7);
558 fHistNeventsJPsi->Fill(8);
559 fHistTPCsignalJPsi->Fill(fRecTPCsignal[0],fRecTPCsignal[1]);
560 if(nHighPt == 2) fHistNeventsJPsi->Fill(9);
561 if(mass[0] == mass[1] && mass[0] != -1) {
562 fHistNeventsJPsi->Fill(10);
563 vCandidate = vLepton[0]+vLepton[1];
564 if( vCandidate.M() > 2.8 && vCandidate.M() < 3.2) fHistDiLeptonPtJPsi->Fill(vLepton[0].Pt(),vLepton[1].Pt());
566 fHistDiMuonMass->Fill(vCandidate.M());
567 fHistNeventsJPsi->Fill(11);
570 fHistDiElectronMass->Fill(vCandidate.M());
571 fHistNeventsJPsi->Fill(12);
580 PostData(4, fListHist);
584 //_____________________________________________________________________________
585 void AliAnalysisTaskUpcPsi2s::RunAODtree()
588 AliAODEvent *aod = (AliAODEvent*) InputEvent();
592 const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
593 fDataFilnam->Clear();
594 fDataFilnam->SetString(filnam);
595 fEvtNum = ((TTree*) GetInputData(0))->GetTree()->GetReadEntry();
596 fRunNum = aod ->GetRunNumber();
599 TString trigger = aod->GetFiredTriggerClasses();
601 fTrigger[0] = trigger.Contains("CCUP4-B"); // Central UPC Pb-Pb 2011
602 fTrigger[1] = trigger.Contains("CCUP2-B"); // Double gap
603 fTrigger[2] = trigger.Contains("CCUP7-B"); // Central UPC p-Pb 2013
605 Bool_t isTriggered = kFALSE;
606 for(Int_t i=0; i<ntrg; i++) {
607 if( fTrigger[i] ) isTriggered = kTRUE;
609 if( !isTriggered ) return;
612 fL0inputs = aod->GetHeader()->GetL0TriggerInputs();
613 fL1inputs = aod->GetHeader()->GetL1TriggerInputs();
615 //Event identification
616 fPerNum = aod ->GetPeriodNumber();
617 fOrbNum = aod ->GetOrbitNumber();
618 fBCrossNum = aod ->GetBunchCrossNumber();
621 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
622 fVtxContrib = fAODVertex->GetNContributors();
623 fVtxPos[0] = fAODVertex->GetX();
624 fVtxPos[1] = fAODVertex->GetY();
625 fVtxPos[2] = fAODVertex->GetZ();
627 fAODVertex->GetCovarianceMatrix(CovMatx);
628 fVtxErr[0] = CovMatx[0];
629 fVtxErr[1] = CovMatx[1];
630 fVtxErr[2] = CovMatx[2];
631 fVtxChi2 = fAODVertex->GetChi2();
632 fVtxNDF = fAODVertex->GetNDF();
635 fNtracklets = aod->GetTracklets()->GetNumberOfTracklets();
638 AliAODVZERO *fV0data = aod ->GetVZEROData();
639 AliAODZDC *fZDCdata = aod->GetZDCData();
641 fV0Adecision = fV0data->GetV0ADecision();
642 fV0Cdecision = fV0data->GetV0CDecision();
643 fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
644 fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
648 //Track loop - loose cuts
649 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
650 AliAODTrack *trk = aod->GetTrack(itr);
653 if(!(trk->GetStatus() & AliAODTrack::kTPCrefit) ) continue;
654 if(!(trk->GetStatus() & AliAODTrack::kITSrefit) ) continue;
655 if(trk->GetTPCNcls() < 20)continue;
657 }//Track loop -loose cuts
660 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
663 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
664 AliAODTrack *trk = aod->GetTrack(itr);
666 if(!(trk->TestFilterBit(1<<0)))continue;
668 if(!(trk->GetStatus() & AliAODTrack::kTPCrefit) ) continue;
669 if(!(trk->GetStatus() & AliAODTrack::kITSrefit) ) continue;
670 if(trk->GetTPCNcls() < 70)continue;
671 if(trk->Chi2perNDF() > 4)continue;
672 if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1))) continue;
673 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
674 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
675 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
677 if(TMath::Abs(dca[1]) > 2) continue;
678 if(TMath::Abs(dca[0]) > 0.2) continue;
680 TrackIndex[nGoodTracks] = itr;
683 if(nGoodTracks > 2) break;
686 if(nGoodTracks == 2){
688 TDatabasePDG *pdgdat = TDatabasePDG::Instance();
689 TParticlePDG *partMuon = pdgdat->GetParticle( 13 );
690 Double_t muonMass = partMuon->Mass();
691 TParticlePDG *partElectron = pdgdat->GetParticle( 11 );
692 Double_t electronMass = partElectron->Mass();
693 TParticlePDG *partPion = pdgdat->GetParticle( 211 );
694 Double_t pionMass = partPion->Mass();
698 Double_t KFmass = pionMass;
699 Double_t fRecTPCsignal;
700 AliKFParticle *KFpart[2];
701 AliKFVertex *KFvtx = new AliKFVertex();
702 KFvtx->SetField(aod->GetMagneticField());
704 for(Int_t i=0; i<2; i++){
705 AliAODTrack *trk = aod->GetTrack(TrackIndex[i]);
707 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
708 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
709 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
712 new((*fJPsiAODTracks)[i]) AliAODTrack(*trk);
713 ((AliAODTrack*)((*fJPsiAODTracks)[i]))->SetDCA(dca[0],dca[1]);//to get DCAxy trk->DCA(); to get DCAz trk->ZAtDCA();
715 trk->GetPosition(KFpar);
716 trk->PxPyPz(KFpar+3);
717 trk->GetCovMatrix(KFcov);
720 fRecTPCsignal = trk->GetTPCsignal();
721 if(fRecTPCsignal > 40 && fRecTPCsignal < 70) KFmass = muonMass;
722 if(fRecTPCsignal > 70 && fRecTPCsignal < 100)KFmass = electronMass;
724 else KFmass = pionMass;
726 KFpart[i] = new AliKFParticle();
727 KFpart[i]->SetField(aod->GetMagneticField());
728 KFpart[i]->AliKFParticleBase::Initialize(KFpar,KFcov,(Int_t) trk->Charge(), KFmass);
729 KFvtx->AddDaughter(*KFpart[i]);
732 Double_t pos[3]={0,0,0};
733 AliExternalTrackParam *parTrk = new AliExternalTrackParam();
734 parTrk->CopyFromVTrack((AliVTrack*) trk);
735 if(!parTrk->GetXYZAt(378,aod->GetMagneticField(),pos)) fTOFphi[i] = -666;
737 fTOFphi[i] = TMath::ATan2(pos[1],pos[0])*TMath::RadToDeg();
738 if(fTOFphi[i] < 0) fTOFphi[i]+=(2*TMath::Pi()*TMath::RadToDeg());
742 fKfVtxPos[0]= KFvtx->GetX();
743 fKfVtxPos[1]= KFvtx->GetY();
744 fKfVtxPos[2]= KFvtx->GetZ();
745 for(UInt_t i=0; i<2; i++)delete KFpart[i];
753 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
754 AliAODTrack *trk = aod->GetTrack(itr);
756 if(!(trk->TestFilterBit(1<<0)))continue;
758 if(!(trk->GetStatus() & AliAODTrack::kTPCrefit) ) continue;
759 if(!(trk->GetStatus() & AliAODTrack::kITSrefit) ) continue;
760 if(trk->GetTPCNcls() < 50)continue;
761 if(trk->Chi2perNDF() > 4)continue;
762 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
763 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
764 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
766 if(!trk->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
767 if(TMath::Abs(dca[1]) > 2) continue;
769 TrackIndex[nGoodTracks] = itr;
772 if(nGoodTracks > 4) break;
776 if(nGoodTracks == 4){
778 TDatabasePDG *pdgdat = TDatabasePDG::Instance();
779 TParticlePDG *partMuon = pdgdat->GetParticle( 13 );
780 Double_t muonMass = partMuon->Mass();
781 TParticlePDG *partElectron = pdgdat->GetParticle( 11 );
782 Double_t electronMass = partElectron->Mass();
783 TParticlePDG *partPion = pdgdat->GetParticle( 211 );
784 Double_t pionMass = partPion->Mass();
788 Double_t KFmass = pionMass;
789 Double_t fRecTPCsignal;
790 AliKFParticle *KFpart[4];
791 AliKFVertex *KFvtx = new AliKFVertex();
792 KFvtx->SetField(aod->GetMagneticField());
794 for(Int_t i=0; i<4; i++){
795 AliAODTrack *trk = aod->GetTrack(TrackIndex[i]);
797 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
798 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
799 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
802 new((*fPsi2sAODTracks)[i]) AliAODTrack(*trk);
803 ((AliAODTrack*)((*fPsi2sAODTracks)[i]))->SetDCA(dca[0],dca[1]);//to get DCAxy trk->DCA(); to get DCAz trk->ZAtDCA();
805 trk->GetPosition(KFpar);
806 trk->PxPyPz(KFpar+3);
807 trk->GetCovMatrix(KFcov);
810 fRecTPCsignal = trk->GetTPCsignal();
811 if(fRecTPCsignal > 40 && fRecTPCsignal < 70) KFmass = muonMass;
812 if(fRecTPCsignal > 70 && fRecTPCsignal < 100)KFmass = electronMass;
814 else KFmass = pionMass;
816 KFpart[i] = new AliKFParticle();
817 KFpart[i]->SetField(aod->GetMagneticField());
818 KFpart[i]->AliKFParticleBase::Initialize(KFpar,KFcov,(Int_t) trk->Charge(), KFmass);
819 KFvtx->AddDaughter(*KFpart[i]);
821 Double_t pos[3]={0,0,0};
822 AliExternalTrackParam *parTrk = new AliExternalTrackParam();
823 parTrk->CopyFromVTrack((AliVTrack*) trk);
824 if(!parTrk->GetXYZAt(378,aod->GetMagneticField(),pos)) fTOFphi[i] = -666;
826 fTOFphi[i] = TMath::ATan2(pos[1],pos[0])*TMath::RadToDeg();
827 if(fTOFphi[i] < 0) fTOFphi[i]+=(2*TMath::Pi()*TMath::RadToDeg());
831 fKfVtxPos[0]= KFvtx->GetX();
832 fKfVtxPos[1]= KFvtx->GetY();
833 fKfVtxPos[2]= KFvtx->GetZ();
834 for(UInt_t i=0; i<4; i++)delete KFpart[i];
839 PostData(1, fJPsiTree);
840 PostData(2, fPsi2sTree);
844 //_____________________________________________________________________________
845 void AliAnalysisTaskUpcPsi2s::RunESDtrig()
849 AliESDEvent *esd = (AliESDEvent*) InputEvent();
852 fRunNum = esd ->GetRunNumber();
854 TString trigger = esd->GetFiredTriggerClasses();
856 if(trigger.Contains("CCUP4-B")) fHistUpcTriggersPerRun->Fill(fRunNum); //Upc triggers
858 if(trigger.Contains("CVLN_B2-B")) fHistCvlnTriggersPerRun->Fill(fRunNum); //CVLN triggers - synchronously downscaled
859 if(trigger.Contains("CVLN_R1-B")) fHistCvlnTriggersPerRun->Fill(fRunNum); //CVLN triggers - randomly downscaled
861 if(esd->GetHeader()->IsTriggerInputFired("1ZED")) fHistZedTriggersPerRun->Fill(fRunNum); //1ZED trigger inputs
863 //MB, Central and SemiCentral triggers
864 AliCentrality *centrality = esd->GetCentrality();
865 UInt_t selectionMask = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
867 //Double_t percentile = centrality->GetCentralityPercentile("V0M");
868 Double_t percentile = centrality->GetCentralityPercentileUnchecked("V0M");
870 if(((selectionMask & AliVEvent::kMB) == AliVEvent::kMB) && percentile<80 && percentile>0) fHistMBTriggersPerRun->Fill(fRunNum);
872 if(((selectionMask & AliVEvent::kCentral) == AliVEvent::kCentral) && percentile<6 && percentile>0) fHistCentralTriggersPerRun->Fill(fRunNum);
874 if(((selectionMask & AliVEvent::kSemiCentral) == AliVEvent::kSemiCentral) && percentile<50 && percentile>15) fHistSemiCentralTriggersPerRun->Fill(fRunNum);
877 PostData(3, fListTrig);
880 //_____________________________________________________________________________
881 void AliAnalysisTaskUpcPsi2s::RunESDhist()
884 TDatabasePDG *pdgdat = TDatabasePDG::Instance();
886 TParticlePDG *partMuon = pdgdat->GetParticle( 13 );
887 Double_t muonMass = partMuon->Mass();
889 TParticlePDG *partElectron = pdgdat->GetParticle( 11 );
890 Double_t electronMass = partElectron->Mass();
892 TParticlePDG *partPion = pdgdat->GetParticle( 211 );
893 Double_t pionMass = partPion->Mass();
896 AliESDEvent *esd = (AliESDEvent*) InputEvent();
899 fHistNeventsJPsi->Fill(1);
900 fHistNeventsPsi2s->Fill(1);
903 TString trigger = esd->GetFiredTriggerClasses();
905 if( !trigger.Contains("CCUP") ) return;
907 fHistNeventsJPsi->Fill(2);
908 fHistNeventsPsi2s->Fill(2);
911 AliESDVertex *fESDVertex = (AliESDVertex*) esd->GetPrimaryVertex();
912 fVtxContrib = fESDVertex->GetNContributors();
913 if(fVtxContrib < 2) return;
915 fHistNeventsJPsi->Fill(3);
916 fHistNeventsPsi2s->Fill(3);
919 AliESDVZERO *fV0data = esd->GetVZEROData();
920 AliESDZDC *fZDCdata = esd->GetESDZDC();
922 fV0Adecision = fV0data->GetV0ADecision();
923 fV0Cdecision = fV0data->GetV0CDecision();
924 if(fV0Adecision != AliESDVZERO::kV0Empty || fV0Cdecision != AliESDVZERO::kV0Empty) return;
926 fZDCAenergy = fZDCdata->GetZN2TowerEnergy()[0];
927 fZDCCenergy = fZDCdata->GetZN1TowerEnergy()[0];
928 if( fZDCAenergy > 8200 || fZDCCenergy > 8200) return;
930 fHistNeventsJPsi->Fill(4);
931 fHistNeventsPsi2s->Fill(4);
935 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
937 TLorentzVector vLepton[4], vPion[4], vCandidate, vDilepton;
938 Short_t qLepton[4], qPion[4];
939 UInt_t nLepton=0, nPion=0, nHighPt=0;
940 Double_t fRecTPCsignal[5];
941 Int_t mass[3]={-1,-1,-1};
944 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
945 AliESDtrack *trk = esd->GetTrack(itr);
948 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
949 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
950 if(trk->GetTPCNcls() < 70)continue;
951 if(trk->GetTPCchi2()/trk->GetTPCNcls() > 4)continue;
952 if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1))) continue;
953 Float_t dca[2] = {0.0,0.0}; AliExternalTrackParam cParam;
954 if(!trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam)) continue;
955 trk->GetImpactParameters(dca[0],dca[1]);
956 if(TMath::Abs(dca[1]) > 2) continue;
957 if(TMath::Abs(dca[1]) > 0.2) continue;
959 TrackIndex[nGoodTracks] = itr;
961 if(nGoodTracks > 2) break;
965 if(nGoodTracks == 2){
966 fHistNeventsJPsi->Fill(5);
967 for(Int_t i=0; i<2; i++){
968 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
969 if(trk->Pt() > 1) nHighPt++;
970 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
971 qLepton[nLepton] = trk->Charge();
972 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
973 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
976 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
977 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
983 if(qLepton[0]*qLepton[1] > 0) fHistNeventsJPsi->Fill(6);
984 if(qLepton[0]*qLepton[1] < 0){
985 fHistNeventsJPsi->Fill(7);
987 fHistNeventsJPsi->Fill(8);
988 fHistTPCsignalJPsi->Fill(fRecTPCsignal[0],fRecTPCsignal[1]);
989 if(nHighPt == 2) fHistNeventsJPsi->Fill(9);
990 if(mass[0] == mass[1] && mass[0] != -1) {
991 fHistNeventsJPsi->Fill(10);
992 vCandidate = vLepton[0]+vLepton[1];
993 if( vCandidate.M() > 2.8 && vCandidate.M() < 3.2) fHistDiLeptonPtJPsi->Fill(vLepton[0].Pt(),vLepton[1].Pt());
995 fHistDiMuonMass->Fill(vCandidate.M());
996 fHistNeventsJPsi->Fill(11);
999 fHistDiElectronMass->Fill(vCandidate.M());
1000 fHistNeventsJPsi->Fill(12);
1007 nGoodTracks = 0; nLepton=0; nPion=0; nHighPt=0;
1008 mass[0]= -1; mass[1]= -1, mass[2]= -1;
1011 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
1012 AliESDtrack *trk = esd->GetTrack(itr);
1013 if( !trk ) continue;
1015 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1016 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1017 if(trk->GetTPCNcls() < 50)continue;
1018 if(trk->GetTPCchi2()/trk->GetTPCNcls() > 4)continue;
1019 Float_t dca[2] = {0.0,0.0}; AliExternalTrackParam cParam;
1020 if(!trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam)) continue;
1021 trk->GetImpactParameters(dca[0],dca[1]);
1022 if(TMath::Abs(dca[1]) > 2) continue;
1024 TrackIndex[nGoodTracks] = itr;
1026 if(nGoodTracks > 4) break;
1029 if(nGoodTracks == 4){
1030 fHistNeventsPsi2s->Fill(5);
1031 for(Int_t i=0; i<4; i++){
1032 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
1035 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
1036 qLepton[nLepton] = trk->Charge();
1037 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
1038 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
1041 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
1042 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
1048 qPion[nPion] = trk->Charge();
1049 vPion[nPion].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), pionMass);
1053 if(nLepton > 2 || nPion > 2) break;
1055 if((nLepton == 2) && (nPion == 2)){
1056 fHistNeventsPsi2s->Fill(6);
1057 if(qLepton[0]*qLepton[1] > 0) fHistNeventsPsi2s->Fill(7);
1058 if(qPion[0]*qPion[1] > 0) fHistNeventsPsi2s->Fill(8);
1059 if((qLepton[0]*qLepton[1] > 0) && (qPion[0]*qPion[1] > 0)) fHistNeventsPsi2s->Fill(9);
1060 if((qLepton[0]*qLepton[1] < 0) && (qPion[0]*qPion[1] < 0)){
1061 fHistNeventsPsi2s->Fill(10);
1062 if(mass[0] == mass[1]) {
1063 fHistNeventsPsi2s->Fill(11);
1064 vCandidate = vLepton[0]+vLepton[1]+vPion[0]+vPion[1];
1065 vDilepton = vLepton[0]+vLepton[1];
1066 fHistPsi2sMassVsPt->Fill(vCandidate.M(),vCandidate.Pt());
1067 if(vCandidate.Pt() < 0.15) fHistPsi2sMassCoherent->Fill(vCandidate.M());
1068 if(mass[0] == 0) fHistNeventsPsi2s->Fill(12);
1069 if(mass[0] == 1) fHistNeventsPsi2s->Fill(13);
1075 PostData(4, fListHist);
1079 //_____________________________________________________________________________
1080 void AliAnalysisTaskUpcPsi2s::RunESDtree()
1084 AliESDEvent *esd = (AliESDEvent*) InputEvent();
1088 const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
1089 fDataFilnam->Clear();
1090 fDataFilnam->SetString(filnam);
1091 fEvtNum = ((TTree*) GetInputData(0))->GetTree()->GetReadEntry();
1092 fRunNum = esd->GetRunNumber();
1095 TString trigger = esd->GetFiredTriggerClasses();
1097 fTrigger[0] = trigger.Contains("CCUP4-B"); // Central UPC Pb-Pb 2011
1098 fTrigger[1] = trigger.Contains("CCUP2-B"); // Double gap
1099 fTrigger[2] = trigger.Contains("CCUP7-B"); // Central UPC p-Pb 2013
1101 Bool_t isTriggered = kFALSE;
1102 for(Int_t i=0; i<ntrg; i++) {
1103 if( fTrigger[i] ) isTriggered = kTRUE;
1105 if( !isTriggered ) return;
1108 fL0inputs = esd->GetHeader()->GetL0TriggerInputs();
1109 fL1inputs = esd->GetHeader()->GetL1TriggerInputs();
1111 //TOF trigger info (0OMU)
1112 fTOFtrig1 = esd->GetHeader()->IsTriggerInputFired("0OMU");
1113 fTOFtrig2 = esd->GetHeader()->GetActiveTriggerInputs().Contains("0OMU") ? ((esd->GetHeader()) ? esd->GetHeader()->IsTriggerInputFired("0OMU") : kFALSE) : TESTBIT(esd->GetHeader()->GetL0TriggerInputs(), (kFALSE) ? 21 : 9);
1115 //Event identification
1116 fPerNum = esd->GetPeriodNumber();
1117 fOrbNum = esd->GetOrbitNumber();
1118 fBCrossNum = esd->GetBunchCrossNumber();
1121 AliESDVertex *fESDVertex = (AliESDVertex*) esd->GetPrimaryVertex();
1122 fVtxContrib = fESDVertex->GetNContributors();
1123 fVtxPos[0] = fESDVertex->GetX();
1124 fVtxPos[1] = fESDVertex->GetY();
1125 fVtxPos[2] = fESDVertex->GetZ();
1126 Double_t CovMatx[6];
1127 fESDVertex->GetCovarianceMatrix(CovMatx);
1128 fVtxErr[0] = CovMatx[0];
1129 fVtxErr[1] = CovMatx[1];
1130 fVtxErr[2] = CovMatx[2];
1131 fVtxChi2 = fESDVertex->GetChi2();
1132 fVtxNDF = fESDVertex->GetNDF();
1135 fNtracklets = esd->GetMultiplicity()->GetNumberOfTracklets();
1138 AliESDVZERO *fV0data = esd->GetVZEROData();
1139 AliESDZDC *fZDCdata = esd->GetESDZDC();
1141 fV0Adecision = fV0data->GetV0ADecision();
1142 fV0Cdecision = fV0data->GetV0CDecision();
1143 fZDCAenergy = fZDCdata->GetZN2TowerEnergy()[0];
1144 fZDCCenergy = fZDCdata->GetZN1TowerEnergy()[0];
1148 //Track loop - loose cuts
1149 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
1150 AliESDtrack *trk = esd->GetTrack(itr);
1151 if( !trk ) continue;
1153 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1154 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1155 if(trk->GetTPCNcls() < 20)continue;
1157 }//Track loop -loose cuts
1159 Int_t nGoodTracks=0;
1160 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
1163 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
1164 AliESDtrack *trk = esd->GetTrack(itr);
1165 if( !trk ) continue;
1167 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1168 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1169 if(trk->GetTPCNcls() < 70)continue;
1170 if(trk->GetTPCchi2()/trk->GetTPCNcls() > 4)continue;
1171 if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1))) continue;
1172 Float_t dca[2] = {0.0,0.0}; AliExternalTrackParam cParam;
1173 if(!trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam)) continue;
1174 trk->GetImpactParameters(dca[0],dca[1]);
1175 if(TMath::Abs(dca[1]) > 2) continue;
1176 if(TMath::Abs(dca[1]) > 0.2) continue;
1178 TrackIndex[nGoodTracks] = itr;
1180 if(nGoodTracks > 2) break;
1183 if(nGoodTracks == 2){
1184 for(Int_t i=0; i<2; i++){
1185 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
1187 AliExternalTrackParam cParam;
1188 trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam);// to get trk->GetImpactParameters(DCAxy,DCAz);
1190 new((*fJPsiESDTracks)[i]) AliESDtrack(*trk);
1192 Double_t pos[3]={0,0,0};
1193 if(!trk->GetXYZAt(378,esd->GetMagneticField(),pos)) fTOFphi[i] = -666;
1195 fTOFphi[i] = TMath::ATan2(pos[1],pos[0])*TMath::RadToDeg();
1196 if(fTOFphi[i] < 0) fTOFphi[i]+=(2*TMath::Pi()*TMath::RadToDeg());
1204 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
1205 AliESDtrack *trk = esd->GetTrack(itr);
1206 if( !trk ) continue;
1208 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1209 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1210 if(trk->GetTPCNcls() < 50)continue;
1211 if(trk->GetTPCchi2()/trk->GetTPCNcls() > 4)continue;
1212 Float_t dca[2] = {0.0,0.0}; AliExternalTrackParam cParam;
1213 if(!trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam)) continue;
1214 trk->GetImpactParameters(dca[0],dca[1]);
1215 if(TMath::Abs(dca[1]) > 2) continue;
1217 TrackIndex[nGoodTracks] = itr;
1219 if(nGoodTracks > 4) break;
1222 if(nGoodTracks == 4){
1223 for(Int_t i=0; i<4; i++){
1224 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
1226 AliExternalTrackParam cParam;
1227 trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam);// to get trk->GetImpactParameters(DCAxy,DCAz);
1229 new((*fPsi2sESDTracks)[i]) AliESDtrack(*trk);
1231 Double_t pos[3]={0,0,0};
1232 if(!trk->GetXYZAt(378,esd->GetMagneticField(),pos)) fTOFphi[i] = -666;
1234 fTOFphi[i] = TMath::ATan2(pos[1],pos[0])*TMath::RadToDeg();
1235 if(fTOFphi[i] < 0) fTOFphi[i]+=(2*TMath::Pi()*TMath::RadToDeg());
1238 fPsi2sTree ->Fill();
1241 PostData(1, fJPsiTree);
1242 PostData(2, fPsi2sTree);
1246 //_____________________________________________________________________________
1247 void AliAnalysisTaskUpcPsi2s::Terminate(Option_t *)
1250 cout<<"Analysis complete."<<endl;