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"
53 #include "AliTriggerAnalysis.h"
56 #include "AliAnalysisTaskUpcPsi2s.h"
58 ClassImp(AliAnalysisTaskUpcPsi2s);
63 //trees for UPC analysis,
64 // michal.broz@cern.ch
66 //_____________________________________________________________________________
67 AliAnalysisTaskUpcPsi2s::AliAnalysisTaskUpcPsi2s()
68 : AliAnalysisTaskSE(),fType(0),isMC(kFALSE),fRunTree(kTRUE),fRunHist(kTRUE),fRunSystematics(kFALSE),fPIDResponse(0),fJPsiTree(0),fPsi2sTree(0),
69 fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),
70 fTOFtrig1(0), fTOFtrig2(0),
71 fVtxContrib(0),fVtxChi2(0),fVtxNDF(0),fSpdVtxContrib(0),
72 fBCrossNum(0),fNtracklets(0),fNLooseTracks(0),
73 fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
74 fDataFilnam(0),fRecoPass(0),fEvtNum(0),
75 fJPsiAODTracks(0),fJPsiESDTracks(0),fPsi2sAODTracks(0),fPsi2sESDTracks(0),fGenPart(0),
76 fListTrig(0),fHistCcup4TriggersPerRun(0), fHistCcup7TriggersPerRun(0), fHistCcup2TriggersPerRun(0),fHistCint1TriggersPerRun(0),fHistC0tvxAndCint1TriggersPerRun(0),
77 fHistZedTriggersPerRun(0),fHistCvlnTriggersPerRun(0), fHistMBTriggersPerRun(0),fHistCentralTriggersPerRun(0),fHistSemiCentralTriggersPerRun(0),
78 fListHist(0),fHistNeventsJPsi(0),fHistTPCsignalJPsi(0),fHistDiLeptonPtJPsi(0),fHistDiElectronMass(0),fHistDiMuonMass(0),fHistDiLeptonMass(0),
79 fHistNeventsPsi2s(0),fHistPsi2sMassVsPt(0),fHistPsi2sMassCoherent(0),
80 fListSystematics(0),fListJPsiLoose(0),fListJPsiTight(0),fListPsi2sLoose(0),fListPsi2sTight(0)
86 }//AliAnalysisTaskUpcPsi2s
89 //_____________________________________________________________________________
90 AliAnalysisTaskUpcPsi2s::AliAnalysisTaskUpcPsi2s(const char *name)
91 : AliAnalysisTaskSE(name),fType(0),isMC(kFALSE),fRunTree(kTRUE),fRunHist(kTRUE),fRunSystematics(kFALSE),fPIDResponse(0),fJPsiTree(0),fPsi2sTree(0),
92 fRunNum(0),fPerNum(0),fOrbNum(0),fL0inputs(0),fL1inputs(0),
93 fTOFtrig1(0), fTOFtrig2(0),
94 fVtxContrib(0),fVtxChi2(0),fVtxNDF(0),fSpdVtxContrib(0),
95 fBCrossNum(0),fNtracklets(0),fNLooseTracks(0),
96 fZDCAenergy(0),fZDCCenergy(0),fV0Adecision(0),fV0Cdecision(0),
97 fDataFilnam(0),fRecoPass(0),fEvtNum(0),
98 fJPsiAODTracks(0),fJPsiESDTracks(0),fPsi2sAODTracks(0),fPsi2sESDTracks(0),fGenPart(0),
99 fListTrig(0),fHistCcup4TriggersPerRun(0), fHistCcup7TriggersPerRun(0), fHistCcup2TriggersPerRun(0),fHistCint1TriggersPerRun(0),fHistC0tvxAndCint1TriggersPerRun(0),
100 fHistZedTriggersPerRun(0),fHistCvlnTriggersPerRun(0), fHistMBTriggersPerRun(0),fHistCentralTriggersPerRun(0),fHistSemiCentralTriggersPerRun(0),
101 fListHist(0),fHistNeventsJPsi(0),fHistTPCsignalJPsi(0),fHistDiLeptonPtJPsi(0),fHistDiElectronMass(0),fHistDiMuonMass(0),fHistDiLeptonMass(0),
102 fHistNeventsPsi2s(0),fHistPsi2sMassVsPt(0),fHistPsi2sMassCoherent(0),
103 fListSystematics(0),fListJPsiLoose(0),fListJPsiTight(0),fListPsi2sLoose(0),fListPsi2sTight(0)
108 if( strstr(name,"ESD") ) fType = 0;
109 if( strstr(name,"AOD") ) fType = 1;
113 DefineOutput(1, TTree::Class());
114 DefineOutput(2, TTree::Class());
115 DefineOutput(3, TList::Class());
116 DefineOutput(4, TList::Class());
118 }//AliAnalysisTaskUpcPsi2s
120 //_____________________________________________________________________________
121 void AliAnalysisTaskUpcPsi2s::Init()
124 for(Int_t i=0; i<ntrg; i++) fTrigger[i] = kFALSE;
125 for(Int_t i=0; i<4; i++) {
127 fPIDTPCMuon[i] = -666;
128 fPIDTPCElectron[i] = -666;
129 fPIDTPCPion[i] = -666;
130 fPIDTPCKaon[i] = -666;
131 fPIDTPCProton[i] = -666;
133 fPIDTOFMuon[i] = -666;
134 fPIDTOFElectron[i] = -666;
135 fPIDTOFPion[i] = -666;
136 fPIDTOFKaon[i] = -666;
137 fPIDTOFProton[i] = -666;
139 fTriggerInputsMC[i] = kFALSE;
141 fIsVtxContributor[i] = kFALSE;
143 for(Int_t i=0; i<3; i++){
147 fSpdVtxPos[i] = -666;
152 //_____________________________________________________________________________
153 AliAnalysisTaskUpcPsi2s::~AliAnalysisTaskUpcPsi2s()
173 }//~AliAnalysisTaskUpcPsi2s
176 //_____________________________________________________________________________
177 void AliAnalysisTaskUpcPsi2s::UserCreateOutputObjects()
180 AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
181 AliInputEventHandler *inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
182 fPIDResponse = inputHandler->GetPIDResponse();
185 fDataFilnam = new TObjString();
186 fDataFilnam->SetString("");
189 fJPsiAODTracks = new TClonesArray("AliAODTrack", 1000);
190 fJPsiESDTracks = new TClonesArray("AliESDtrack", 1000);
191 fPsi2sAODTracks = new TClonesArray("AliAODTrack", 1000);
192 fPsi2sESDTracks = new TClonesArray("AliESDtrack", 1000);
193 fGenPart = new TClonesArray("TParticle", 1000);
195 //output tree with JPsi candidate events
196 fJPsiTree = new TTree("fJPsiTree", "fJPsiTree");
197 fJPsiTree ->Branch("fRunNum", &fRunNum, "fRunNum/I");
198 fJPsiTree ->Branch("fPerNum", &fPerNum, "fPerNum/i");
199 fJPsiTree ->Branch("fOrbNum", &fOrbNum, "fOrbNum/i");
201 fJPsiTree ->Branch("fBCrossNum", &fBCrossNum, "fBCrossNum/s");
202 fJPsiTree ->Branch("fTrigger", &fTrigger[0], Form("fTrigger[%i]/O", ntrg));
203 fJPsiTree ->Branch("fL0inputs", &fL0inputs, "fL0inputs/i");
204 fJPsiTree ->Branch("fL1inputs", &fL1inputs, "fL1inputs/i");
205 fJPsiTree ->Branch("fNtracklets", &fNtracklets, "fNtracklets/s");
206 fJPsiTree ->Branch("fNLooseTracks", &fNLooseTracks, "fNLooseTracks/s");
207 fJPsiTree ->Branch("fVtxContrib", &fVtxContrib, "fVtxContrib/I");
208 fJPsiTree ->Branch("fSpdVtxContrib", &fSpdVtxContrib, "fSpdVtxContrib/I");
210 fJPsiTree ->Branch("fTOFtrig1", &fTOFtrig1, "fTOFtrig1/O");
211 fJPsiTree ->Branch("fTOFtrig2", &fTOFtrig2, "fTOFtrig2/O");
212 fJPsiTree ->Branch("fTOFphi", &fTOFphi[0], "fTOFphi[2]/D");
214 fJPsiTree ->Branch("fPIDTPCMuon", &fPIDTPCMuon[0], "fPIDTPCMuon[2]/D");
215 fJPsiTree ->Branch("fPIDTPCElectron", &fPIDTPCElectron[0], "fPIDTPCElectron[2]/D");
216 fJPsiTree ->Branch("fPIDTPCPion", &fPIDTPCPion[0], "fPIDTPCPion[2]/D");
217 fJPsiTree ->Branch("fPIDTPCKaon", &fPIDTPCKaon[0], "fPIDTPCKaon[2]/D");
218 fJPsiTree ->Branch("fPIDTPCProton", &fPIDTPCProton[0], "fPIDTPCProton[2]/D");
220 fJPsiTree ->Branch("fPIDTOFMuon", &fPIDTOFMuon[0], "fPIDTOFMuon[2]/D");
221 fJPsiTree ->Branch("fPIDTOFElectron", &fPIDTOFElectron[0], "fPIDTOFElectron[2]/D");
222 fJPsiTree ->Branch("fPIDTOFPion", &fPIDTOFPion[0], "fPIDTOFPion[2]/D");
223 fJPsiTree ->Branch("fPIDTOFKaon", &fPIDTOFKaon[0], "fPIDTOFKaon[2]/D");
224 fJPsiTree ->Branch("fPIDTOFProton", &fPIDTOFProton[0], "fPIDTOFProton[2]/D");
226 fJPsiTree ->Branch("fIsVtxContributor", &fIsVtxContributor[0], "fIsVtxContributor[2]/O");
228 fJPsiTree ->Branch("fVtxPos", &fVtxPos[0], "fVtxPos[3]/D");
229 fJPsiTree ->Branch("fVtxErr", &fVtxErr[0], "fVtxErr[3]/D");
230 fJPsiTree ->Branch("fVtxChi2", &fVtxChi2, "fVtxChi2/D");
231 fJPsiTree ->Branch("fVtxNDF", &fVtxNDF, "fVtxNDF/D");
233 fJPsiTree ->Branch("fKfVtxPos", &fKfVtxPos[0], "fKfVtxPos[3]/D");
234 fJPsiTree ->Branch("fSpdVtxPos", &fSpdVtxPos[0], "fSpdVtxPos[3]/D");
236 fJPsiTree ->Branch("fZDCAenergy", &fZDCAenergy, "fZDCAenergy/D");
237 fJPsiTree ->Branch("fZDCCenergy", &fZDCCenergy, "fZDCCenergy/D");
238 fJPsiTree ->Branch("fV0Adecision", &fV0Adecision, "fV0Adecision/I");
239 fJPsiTree ->Branch("fV0Cdecision", &fV0Cdecision, "fV0Cdecision/I");
240 fJPsiTree ->Branch("fDataFilnam", &fDataFilnam);
241 fJPsiTree ->Branch("fRecoPass", &fRecoPass, "fRecoPass/S");
242 fJPsiTree ->Branch("fEvtNum", &fEvtNum, "fEvtNum/L");
244 fJPsiTree ->Branch("fJPsiESDTracks", &fJPsiESDTracks);
247 fJPsiTree ->Branch("fJPsiAODTracks", &fJPsiAODTracks);
250 fJPsiTree ->Branch("fGenPart", &fGenPart);
251 fJPsiTree ->Branch("fTriggerInputsMC", &fTriggerInputsMC[0], "fTriggerInputsMC[4]/O");
255 //output tree with Psi2s candidate events
256 fPsi2sTree = new TTree("fPsi2sTree", "fPsi2sTree");
257 fPsi2sTree ->Branch("fRunNum", &fRunNum, "fRunNum/I");
258 fPsi2sTree ->Branch("fPerNum", &fPerNum, "fPerNum/i");
259 fPsi2sTree ->Branch("fOrbNum", &fOrbNum, "fOrbNum/i");
261 fPsi2sTree ->Branch("fBCrossNum", &fBCrossNum, "fBCrossNum/s");
262 fPsi2sTree ->Branch("fTrigger", &fTrigger[0], Form("fTrigger[%i]/O", ntrg));
263 fPsi2sTree ->Branch("fL0inputs", &fL0inputs, "fL0inputs/i");
264 fPsi2sTree ->Branch("fL1inputs", &fL1inputs, "fL1inputs/i");
265 fPsi2sTree ->Branch("fNtracklets", &fNtracklets, "fNtracklets/s");
266 fPsi2sTree ->Branch("fNLooseTracks", &fNLooseTracks, "fNLooseTracks/s");
267 fPsi2sTree ->Branch("fVtxContrib", &fVtxContrib, "fVtxContrib/I");
268 fPsi2sTree ->Branch("fSpdVtxContrib", &fSpdVtxContrib, "fSpdVtxContrib/I");
270 fPsi2sTree ->Branch("fTOFtrig1", &fTOFtrig1, "fTOFtrig1/O");
271 fPsi2sTree ->Branch("fTOFtrig2", &fTOFtrig2, "fTOFtrig2/O");
272 fPsi2sTree ->Branch("fTOFphi", &fTOFphi[0], "fTOFphi[4]/D");
274 fPsi2sTree ->Branch("fPIDTPCMuon", &fPIDTPCMuon[0], "fPIDTPCMuon[4]/D");
275 fPsi2sTree ->Branch("fPIDTPCElectron", &fPIDTPCElectron[0], "fPIDTPCElectron[4]/D");
276 fPsi2sTree ->Branch("fPIDTPCPion", &fPIDTPCPion[0], "fPIDTPCPion[4]/D");
277 fPsi2sTree ->Branch("fPIDTPCKaon", &fPIDTPCKaon[0], "fPIDTPCKaon[4]/D");
278 fPsi2sTree ->Branch("fPIDTPCProton", &fPIDTPCProton[0], "fPIDTPCProton[4]/D");
280 fPsi2sTree ->Branch("fPIDTOFMuon", &fPIDTOFMuon[0], "fPIDTOFMuon[4]/D");
281 fPsi2sTree ->Branch("fPIDTOFElectron", &fPIDTOFElectron[0], "fPIDTOFElectron[4]/D");
282 fPsi2sTree ->Branch("fPIDTOFPion", &fPIDTOFPion[0], "fPIDTOFPion[4]/D");
283 fPsi2sTree ->Branch("fPIDTOFKaon", &fPIDTOFKaon[0], "fPIDTOFKaon[4]/D");
284 fPsi2sTree ->Branch("fPIDTOFProton", &fPIDTOFProton[0], "fPIDTOFProton[4]/D");
286 fPsi2sTree ->Branch("fIsVtxContributor", &fIsVtxContributor[0], "fIsVtxContributor[4]/O");
288 fPsi2sTree ->Branch("fVtxPos", &fVtxPos[0], "fVtxPos[3]/D");
289 fPsi2sTree ->Branch("fVtxErr", &fVtxErr[0], "fVtxErr[3]/D");
290 fPsi2sTree ->Branch("fVtxChi2", &fVtxChi2, "fVtxChi2/D");
291 fPsi2sTree ->Branch("fVtxNDF", &fVtxNDF, "fVtxNDF/D");
293 fPsi2sTree ->Branch("fKfVtxPos", &fKfVtxPos[0], "fKfVtxPos[3]/D");
294 fPsi2sTree ->Branch("fSpdVtxPos", &fSpdVtxPos[0], "fSpdVtxPos[3]/D");
296 fPsi2sTree ->Branch("fZDCAenergy", &fZDCAenergy, "fZDCAenergy/D");
297 fPsi2sTree ->Branch("fZDCCenergy", &fZDCCenergy, "fZDCCenergy/D");
298 fPsi2sTree ->Branch("fV0Adecision", &fV0Adecision, "fV0Adecision/I");
299 fPsi2sTree ->Branch("fV0Cdecision", &fV0Cdecision, "fV0Cdecision/I");
300 fPsi2sTree ->Branch("fDataFilnam", &fDataFilnam);
301 fPsi2sTree ->Branch("fRecoPass", &fRecoPass, "fRecoPass/S");
302 fPsi2sTree ->Branch("fEvtNum", &fEvtNum, "fEvtNum/L");
304 fPsi2sTree ->Branch("fPsi2sESDTracks", &fPsi2sESDTracks);
307 fPsi2sTree ->Branch("fPsi2sAODTracks", &fPsi2sAODTracks);
310 fPsi2sTree ->Branch("fGenPart", &fGenPart);
311 fPsi2sTree ->Branch("fTriggerInputsMC", &fTriggerInputsMC[0], "fTriggerInputsMC[4]/O");
315 fListTrig = new TList();
316 fListTrig ->SetOwner();
318 fHistCcup4TriggersPerRun = new TH1D("fHistCcup4TriggersPerRun", "fHistCcup4TriggersPerRun", 33000, 167000.5, 200000.5);
319 fListTrig->Add(fHistCcup4TriggersPerRun);
321 fHistCcup7TriggersPerRun = new TH1D("fHistCcup7TriggersPerRun", "fHistCcup7TriggersPerRun", 33000, 167000.5, 200000.5);
322 fListTrig->Add(fHistCcup7TriggersPerRun);
324 fHistCcup2TriggersPerRun = new TH1D("fHistCcup2TriggersPerRun", "fHistCcup2TriggersPerRun", 33000, 167000.5, 200000.5);
325 fListTrig->Add(fHistCcup2TriggersPerRun);
327 fHistCint1TriggersPerRun = new TH1D("fHistCint1TriggersPerRun", "fHistCint1TriggersPerRun", 33000, 167000.5, 200000.5);
328 fListTrig->Add(fHistCint1TriggersPerRun);
330 fHistC0tvxAndCint1TriggersPerRun = new TH1D("fHistC0tvxAndCint1TriggersPerRun", "fHistC0tvxAndCint1TriggersPerRun", 33000, 167000.5, 200000.5);
331 fListTrig->Add(fHistC0tvxAndCint1TriggersPerRun);
333 fHistZedTriggersPerRun = new TH1D("fHistZedTriggersPerRun", "fHistZedTriggersPerRun", 33000, 167000.5, 200000.5);
334 fListTrig->Add(fHistZedTriggersPerRun);
336 fHistCvlnTriggersPerRun = new TH1D("fHistCvlnTriggersPerRun", "fHistCvlnTriggersPerRun", 33000, 167000.5, 200000.5);
337 fListTrig->Add(fHistCvlnTriggersPerRun);
339 fHistMBTriggersPerRun = new TH1D("fHistMBTriggersPerRun", "fHistMBTriggersPerRun", 33000, 167000.5, 200000.5);
340 fListTrig->Add(fHistMBTriggersPerRun);
342 fHistCentralTriggersPerRun = new TH1D("fHistCentralTriggersPerRun", "fHistCentralTriggersPerRun", 33000, 167000.5, 200000.5);
343 fListTrig->Add(fHistCentralTriggersPerRun);
345 fHistSemiCentralTriggersPerRun = new TH1D("fHistSemiCentralTriggersPerRun", "fHistSemiCentralTriggersPerRun", 33000, 167000.5, 200000.5);
346 fListTrig->Add(fHistSemiCentralTriggersPerRun);
348 fListHist = new TList();
349 fListHist ->SetOwner();
351 TString CutNameJPsi[13] = {"Analyzed","Triggered","Vertex cut","V0 decision","Neutron ZDC cut","Two good tracks",
352 "Like sign","Oposite sign","One p_{T}>1", "Both p_{T}>1","PID","Dimuom","Dielectron"};
353 fHistNeventsJPsi = new TH1D("fHistNeventsJPsi","fHistNeventsPsi2s",13,0.5,13.5);
354 for (Int_t i = 0; i<13; i++) fHistNeventsJPsi->GetXaxis()->SetBinLabel(i+1,CutNameJPsi[i].Data());
355 fListHist->Add(fHistNeventsJPsi);
357 fHistTPCsignalJPsi = new TH2D("fHistTPCsignalJPsi","fHistTPCsignalJPsi",240,0,120,240,0,120);
358 fListHist->Add(fHistTPCsignalJPsi);
360 fHistDiLeptonPtJPsi = new TH2D("fHistDiLeptonPtJPsi","fHistDiLeptonPtJPsi",350,0,3.5,350,0,3.5);
361 fListHist->Add(fHistDiLeptonPtJPsi);
363 fHistDiElectronMass = new TH1D("fHistDiElectronMass","Invariant mass of J/#psi candidates",100,2,5);
364 fHistDiElectronMass->GetXaxis()->SetTitle("Invariant mass(e^{+}e^{-}) (GeV/c)");
365 fListHist->Add(fHistDiElectronMass);
367 fHistDiMuonMass = new TH1D("fHistDiMuonMass","Invariant mass of J/#psi candidates",100,2,5);
368 fHistDiMuonMass->GetXaxis()->SetTitle("Invariant mass(#mu^{+}#mu^{-}) (GeV/c)");
369 fListHist->Add(fHistDiMuonMass);
371 fHistDiLeptonMass = new TH1D("fHistDiLeptonMass","Invariant mass of J/#psi candidates",130,2.1,6.0);
372 fHistDiLeptonMass->GetXaxis()->SetTitle("Invariant mass(l^{+}l^{-}) (GeV/c)");
373 fListHist->Add(fHistDiLeptonMass);
375 TString CutNamePsi2s[14] = {"Analyzed","Triggered","Vertex cut","V0 decision","Neutron ZDC cut","Four good tracks",
376 "DiLepton - DiPion","Like sign leptons","Like sign pions","Like sign both","Oposite sign","PID","Dimuom","Dielectron"};
378 fHistNeventsPsi2s = new TH1D("fHistNeventsPsi2s","fHistNeventsPsi2s",14,0.5,14.5);
379 for (Int_t i = 0; i<14; i++) fHistNeventsPsi2s->GetXaxis()->SetBinLabel(i+1,CutNamePsi2s[i].Data());
380 fListHist->Add(fHistNeventsPsi2s);
382 fHistPsi2sMassVsPt = new TH2D("fHistPsi2sMassVsPt","Mass vs p_{T} of #psi(2s) candidates",100,3,6,50,0,5);
383 fHistPsi2sMassVsPt->GetXaxis()->SetTitle("Invariant mass(l^{+}l^{-}#pi^{+}#pi^{-}) (GeV/c)");
384 fHistPsi2sMassVsPt->GetYaxis()->SetTitle("#it{p}_{T} (GeV/#it{c})");
385 fListHist->Add(fHistPsi2sMassVsPt);
387 fHistPsi2sMassCoherent = new TH1D("fHistPsi2sMassAllCoherent","Invariant mass of coherent #psi(2s) candidates",50,2.5,5.5);
388 fHistPsi2sMassCoherent->GetXaxis()->SetTitle("Invariant mass(l^{+}l^{-}#pi^{+}#pi^{-}) (GeV/c)");
389 fListHist->Add(fHistPsi2sMassCoherent);
391 fListSystematics = new TList();
392 fListSystematics->SetOwner();
393 fListSystematics->SetName("fListSystematics");
394 fListHist->Add(fListSystematics);
398 PostData(1, fJPsiTree);
399 PostData(2, fPsi2sTree);
400 PostData(3, fListTrig);
401 PostData(4, fListHist);
403 }//UserCreateOutputObjects
405 //_____________________________________________________________________________
406 void AliAnalysisTaskUpcPsi2s::InitSystematics()
409 fListJPsiLoose = new TList();
410 fListJPsiLoose->SetOwner();
411 fListJPsiLoose->SetName("JPsiLoose");
412 fListSystematics->Add(fListJPsiLoose);
414 TH1D *fHistJPsiNClusLoose = new TH1D("JPsiNClusLoose","Invariant mass of J/#psi candidates",130,2.1,6.0);
415 fListJPsiLoose->Add(fHistJPsiNClusLoose);
417 TH1D *fHistJPsiChi2Loose = new TH1D("JPsiChi2Loose","Invariant mass of J/#psi candidates",130,2.1,6.0);
418 fListJPsiLoose->Add(fHistJPsiChi2Loose);
420 TH1D *fHistJPsiDCAzLoose = new TH1D("JPsiDCAzLoose","Invariant mass of J/#psi candidates",130,2.1,6.0);
421 fListJPsiLoose->Add(fHistJPsiDCAzLoose);
423 TH1D *fHistJPsiDCAxyLoose = new TH1D("JPsiDCAxyLoose","Invariant mass of J/#psi candidates",130,2.1,6.0);
424 fListJPsiLoose->Add(fHistJPsiDCAxyLoose);
426 TH1D *fHistJPsiITShitsLoose = new TH1D("JPsiITShitsLoose","Invariant mass of J/#psi candidates",130,2.1,6.0);
427 fListJPsiLoose->Add(fHistJPsiITShitsLoose);
430 fListJPsiTight = new TList();
431 fListJPsiTight->SetOwner();
432 fListJPsiTight->SetName("JPsiTight");
433 fListSystematics->Add(fListJPsiTight);
435 TH1D *fHistJPsiNClusTight = new TH1D("JPsiNClusTight","Invariant mass of J/#psi candidates",130,2.1,6.0);
436 fListJPsiTight->Add(fHistJPsiNClusTight);
438 TH1D *fHistJPsiChi2Tight = new TH1D("JPsiChi2Tight","Invariant mass of J/#psi candidates",130,2.1,6.0);
439 fListJPsiTight->Add(fHistJPsiChi2Tight);
441 TH1D *fHistJPsiDCAzTight = new TH1D("JPsiDCAzTight","Invariant mass of J/#psi candidates",130,2.1,6.0);
442 fListJPsiTight->Add(fHistJPsiDCAzTight);
444 TH1D *fHistJPsiDCAxyTight = new TH1D("JPsiDCAxyTight","Invariant mass of J/#psi candidates",130,2.1,6.0);
445 fListJPsiTight->Add(fHistJPsiDCAxyTight);
448 fListPsi2sLoose = new TList();
449 fListPsi2sLoose->SetOwner();
450 fListPsi2sLoose->SetName("Psi2sLoose");
451 fListSystematics->Add(fListPsi2sLoose);
453 TH1D *fHistPsi2sNClusLoose = new TH1D("Psi2sNClusLoose","Invariant mass of #psi(2S) candidates",50,2.5,5.5);
454 fListPsi2sLoose->Add(fHistPsi2sNClusLoose);
456 TH1D *fHistPsi2sChi2Loose = new TH1D("Psi2sChi2Loose","Invariant mass of #psi(2S) candidates",50,2.5,5.5);
457 fListPsi2sLoose->Add(fHistPsi2sChi2Loose);
459 TH1D *fHistPsi2sDCAzLoose = new TH1D("Psi2sDCAzLoose","Invariant mass of #psi(2S) candidates",50,2.5,5.5);
460 fListPsi2sLoose->Add(fHistPsi2sDCAzLoose);
462 TH1D *fHistPsi2sDCAxyLoose = new TH1D("Psi2sDCAxyLoose","Invariant mass of #psi(2S) candidates",50,2.5,5.5);
463 fListPsi2sLoose->Add(fHistPsi2sDCAxyLoose);
465 TH1D *fHistPsi2sITShitsLoose = new TH1D("Psi2sITShitsLoose","Invariant mass of #psi(2S) candidates",50,2.5,5.5);
466 fListPsi2sLoose->Add(fHistPsi2sITShitsLoose);
469 fListPsi2sTight = new TList();
470 fListPsi2sTight->SetOwner();
471 fListPsi2sTight->SetName("Psi2sTight");
472 fListSystematics->Add(fListPsi2sTight);
474 TH1D *fHistPsi2sNClusTight = new TH1D("Psi2sNClusTight","Invariant mass of #psi(2S) candidates",50,2.5,5.5);
475 fListPsi2sTight->Add(fHistPsi2sNClusTight);
477 TH1D *fHistPsi2sChi2Tight = new TH1D("Psi2sChi2Tight","Invariant mass of #psi(2S) candidates",50,2.5,5.5);
478 fListPsi2sTight->Add(fHistPsi2sChi2Tight);
480 TH1D *fHistPsi2sDCAzTight = new TH1D("Psi2sDCAzTight","Invariant mass of #psi(2S) candidates",50,2.5,5.5);
481 fListPsi2sTight->Add(fHistPsi2sDCAzTight);
483 TH1D *fHistPsi2sDCAxyTight = new TH1D("Psi2sDCAxyTight","Invariant mass of #psi(2S) candidates",50,2.5,5.5);
484 fListPsi2sTight->Add(fHistPsi2sDCAxyTight);
489 //_____________________________________________________________________________
490 void AliAnalysisTaskUpcPsi2s::UserExec(Option_t *)
493 //cout<<"#################### Next event ##################"<<endl;
497 if(fRunHist) RunESDhist();
498 if(fRunTree) RunESDtree();
503 if(fRunHist) RunAODhist();
504 if(fRunTree) RunAODtree();
508 //_____________________________________________________________________________
509 void AliAnalysisTaskUpcPsi2s::RunAODtrig()
513 AliAODEvent *aod = (AliAODEvent*) InputEvent();
516 fRunNum = aod ->GetRunNumber();
518 TString trigger = aod->GetFiredTriggerClasses();
520 if(trigger.Contains("CCUP4-B")) fHistCcup4TriggersPerRun->Fill(fRunNum); //CCUP4 triggers
521 if(trigger.Contains("CCUP7-B")) fHistCcup7TriggersPerRun->Fill(fRunNum); //CCUP7 triggers
522 if(trigger.Contains("CCUP2-B")) fHistCcup2TriggersPerRun->Fill(fRunNum); //CCUP2 triggers
524 if(trigger.Contains("CINT1")) fHistCint1TriggersPerRun->Fill(fRunNum); //CINT1 triggers
526 fL0inputs = aod->GetHeader()->GetL0TriggerInputs();
527 if(trigger.Contains("CINT1") && (fL0inputs & (1 << 3))) fHistC0tvxAndCint1TriggersPerRun->Fill(fRunNum); //0TVX triggers in CINT1 events
529 if(trigger.Contains("CVLN_B2-B")) fHistCvlnTriggersPerRun->Fill(fRunNum); //CVLN triggers - synchronously downscaled
530 if(trigger.Contains("CVLN_R1-B")) fHistCvlnTriggersPerRun->Fill(fRunNum); //CVLN triggers - randomly downscaled
532 fL1inputs = aod->GetHeader()->GetL1TriggerInputs();
533 if(fL1inputs & (1 << 18)) fHistZedTriggersPerRun->Fill(fRunNum); //1ZED trigger inputs
535 //MB, Central and SemiCentral triggers
536 AliCentrality *centrality = aod->GetCentrality();
537 UInt_t selectionMask = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
539 Double_t percentile = centrality->GetCentralityPercentileUnchecked("V0M");
540 //Double_t percentile = centrality->GetCentralityPercentile("V0M");
542 if(((selectionMask & AliVEvent::kMB) == AliVEvent::kMB) && percentile<=80 && percentile>=0) fHistMBTriggersPerRun->Fill(fRunNum);
544 if(((selectionMask & AliVEvent::kCentral) == AliVEvent::kCentral) && percentile<=6 && percentile>=0 && (trigger.Contains("CVHN_R2-B"))) fHistCentralTriggersPerRun->Fill(fRunNum);
546 if(((selectionMask & AliVEvent::kSemiCentral) == AliVEvent::kSemiCentral) && percentile<=50 && percentile>=15) fHistSemiCentralTriggersPerRun->Fill(fRunNum);
548 PostData(3, fListTrig);
551 //_____________________________________________________________________________
552 void AliAnalysisTaskUpcPsi2s::RunAODhist()
555 TDatabasePDG *pdgdat = TDatabasePDG::Instance();
557 TParticlePDG *partMuon = pdgdat->GetParticle( 13 );
558 Double_t muonMass = partMuon->Mass();
560 TParticlePDG *partElectron = pdgdat->GetParticle( 11 );
561 Double_t electronMass = partElectron->Mass();
563 TParticlePDG *partPion = pdgdat->GetParticle( 211 );
564 Double_t pionMass = partPion->Mass();
567 AliAODEvent *aod = (AliAODEvent*) InputEvent();
570 // cout<<"Event number: "<<((TTree*) GetInputData(0))->GetTree()->GetReadEntry()<<endl;
572 fHistNeventsJPsi->Fill(1);
573 fHistNeventsPsi2s->Fill(1);
576 TString trigger = aod->GetFiredTriggerClasses();
578 if(!isMC && !trigger.Contains("CCUP") ) return;
580 fHistNeventsJPsi->Fill(2);
581 fHistNeventsPsi2s->Fill(2);
584 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
585 fVtxContrib = fAODVertex->GetNContributors();
586 if(fVtxContrib < 2) return;
588 fHistNeventsJPsi->Fill(3);
589 fHistNeventsPsi2s->Fill(3);
592 AliAODVZERO *fV0data = aod ->GetVZEROData();
593 AliAODZDC *fZDCdata = aod->GetZDCData();
595 fV0Adecision = fV0data->GetV0ADecision();
596 fV0Cdecision = fV0data->GetV0CDecision();
597 if(fV0Adecision != AliAODVZERO::kV0Empty || fV0Cdecision != AliAODVZERO::kV0Empty) return;
599 fHistNeventsJPsi->Fill(4);
600 fHistNeventsPsi2s->Fill(4);
602 fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
603 fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
605 if( fZDCAenergy > 8200 || fZDCCenergy > 8200) return;
607 fHistNeventsJPsi->Fill(5);
608 fHistNeventsPsi2s->Fill(5);
610 //Systematics - cut variation
611 if(fRunSystematics) RunAODsystematics(aod);
614 Int_t nGoodTracks = 0;
615 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
617 TLorentzVector vLepton[4], vPion[4], vCandidate, vDilepton;
618 Short_t qLepton[4], qPion[4];
619 UInt_t nLepton=0, nPion=0, nHighPt=0, nSpdHits=0;
620 Double_t fRecTPCsignal[5], fRecTPCsignalDist;
622 Int_t mass[3]={-1,-1,-1};
623 Double_t TrackPt[5]={0,0,0,0,0};
624 Double_t MeanPt = -1;
628 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
629 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
631 if(!(trk->TestFilterBit(1<<0))) continue;
633 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
634 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
635 if(trk->GetTPCNcls() < 50)continue;
636 if(trk->Chi2perNDF() > 4)continue;
637 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
638 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
639 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
641 if(TMath::Abs(dca[1]) > 2) continue;
642 Double_t cut_DCAxy = 4*(0.0182 + 0.0350/TMath::Power(trk->Pt(),1.01));
643 if(TMath::Abs(dca[0]) > cut_DCAxy) continue;
644 if((trk->HasPointOnITSLayer(0))||(trk->HasPointOnITSLayer(1))) nSpdHits++;
646 TrackIndex[nGoodTracks] = itr;
647 TrackPt[nGoodTracks] = trk->Pt();
650 if(nGoodTracks > 4) break;
653 nLepton=0; nPion=0; nHighPt=0;
654 mass[0]= -1; mass[1]= -1, mass[2]= -1;
656 if(nGoodTracks == 4 && nSpdHits>1){
657 MeanPt = GetMedian(TrackPt);
658 fHistNeventsPsi2s->Fill(6);
659 for(Int_t i=0; i<4; i++){
660 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(TrackIndex[i]));
661 if(!trk) AliFatal("Not a standard AOD");
663 if(trk->Pt() > MeanPt){
664 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
665 qLepton[nLepton] = trk->Charge();
666 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
667 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
670 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
671 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
677 qPion[nPion] = trk->Charge();
678 vPion[nPion].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), pionMass);
682 if(nLepton > 2 || nPion > 2) break;
684 if((nLepton == 2) && (nPion == 2)){
685 fHistNeventsPsi2s->Fill(7);
686 if(qLepton[0]*qLepton[1] > 0) fHistNeventsPsi2s->Fill(8);
687 if(qPion[0]*qPion[1] > 0) fHistNeventsPsi2s->Fill(9);
688 if((qLepton[0]*qLepton[1] > 0) && (qPion[0]*qPion[1] > 0)) fHistNeventsPsi2s->Fill(10);
689 if((qLepton[0]*qLepton[1] < 0) && (qPion[0]*qPion[1] < 0)){
690 fHistNeventsPsi2s->Fill(11);
691 if(mass[0] != -1 && mass[1] != -1) {
692 fHistNeventsPsi2s->Fill(12);
693 vCandidate = vLepton[0]+vLepton[1]+vPion[0]+vPion[1];
694 vDilepton = vLepton[0]+vLepton[1];
695 fHistPsi2sMassVsPt->Fill(vCandidate.M(),vCandidate.Pt());
696 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-56,2)+TMath::Power(fRecTPCsignal[1]-56,2));
697 if (fRecTPCsignalDist < 3.6*4.0) fChannel = -1;
699 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-78,2)+TMath::Power(fRecTPCsignal[1]-78,2));
700 if (fRecTPCsignalDist < 4.1*4.0) fChannel = 1;
704 fHistNeventsPsi2s->Fill(13);
705 if(vDilepton.M() > 3.0 && vDilepton.M() < 3.2 && vCandidate.Pt()<0.15) fHistPsi2sMassCoherent->Fill(vCandidate.M());
708 fHistNeventsPsi2s->Fill(14);
709 if(vDilepton.M() > 2.6 && vDilepton.M() < 3.2 && vCandidate.Pt()<0.3) fHistPsi2sMassCoherent->Fill(vCandidate.M());
718 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
719 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
721 if(!(trk->TestFilterBit(1<<0))) continue;
723 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
724 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
725 if(trk->GetTPCNcls() < 70)continue;
726 if(trk->Chi2perNDF() > 4)continue;
727 if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1))) continue;
728 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
729 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
730 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
732 if(TMath::Abs(dca[1]) > 2) continue;
733 Double_t cut_DCAxy = (0.0182 + 0.0350/TMath::Power(trk->Pt(),1.01));
734 if(TMath::Abs(dca[0]) > cut_DCAxy) continue;
736 TrackIndex[nGoodTracks] = itr;
739 if(nGoodTracks > 2) break;
742 nLepton=0; nPion=0; nHighPt=0;
743 mass[0]= -1; mass[1]= -1, mass[2]= -1;
745 if(nGoodTracks == 2){
746 fHistNeventsJPsi->Fill(6);
747 for(Int_t i=0; i<2; i++){
748 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(TrackIndex[i]));
749 if(!trk) AliFatal("Not a standard AOD");
750 if(trk->Pt() > 1) nHighPt++;
751 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
752 qLepton[nLepton] = trk->Charge();
753 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
754 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
757 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
758 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
764 if(qLepton[0]*qLepton[1] > 0) fHistNeventsJPsi->Fill(7);
765 if(qLepton[0]*qLepton[1] < 0){
766 fHistNeventsJPsi->Fill(8);
768 fHistNeventsJPsi->Fill(9);
769 fHistTPCsignalJPsi->Fill(fRecTPCsignal[0],fRecTPCsignal[1]);
770 if(nHighPt == 2) fHistNeventsJPsi->Fill(10);
771 if(mass[0] != -1 && mass[1] != -1) {
772 fHistNeventsJPsi->Fill(11);
773 vCandidate = vLepton[0]+vLepton[1];
774 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-56,2)+TMath::Power(fRecTPCsignal[1]-56,2));
775 if (fRecTPCsignalDist < 3.6*4.0) fChannel = -1;
777 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-78,2)+TMath::Power(fRecTPCsignal[1]-78,2));
778 if (fRecTPCsignalDist < 4.1*4.0) fChannel = 1;
780 if( vCandidate.M() > 2.8 && vCandidate.M() < 3.2) fHistDiLeptonPtJPsi->Fill(vLepton[0].Pt(),vLepton[1].Pt());
782 fHistDiMuonMass->Fill(vCandidate.M());
783 if(vCandidate.Pt()<0.15)fHistDiLeptonMass->Fill(vCandidate.M());
784 fHistNeventsJPsi->Fill(12);
787 fHistDiElectronMass->Fill(vCandidate.M());
788 if(vCandidate.Pt()<0.3)fHistDiLeptonMass->Fill(vCandidate.M());
789 fHistNeventsJPsi->Fill(13);
798 PostData(4, fListHist);
802 //_____________________________________________________________________________
803 void AliAnalysisTaskUpcPsi2s::RunAODtree()
806 AliAODEvent *aod = (AliAODEvent*) InputEvent();
809 if(isMC) RunAODMC(aod);
812 const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
813 fDataFilnam->Clear();
814 fDataFilnam->SetString(filnam);
815 fEvtNum = ((TTree*) GetInputData(0))->GetTree()->GetReadEntry();
816 fRunNum = aod ->GetRunNumber();
819 TString trigger = aod->GetFiredTriggerClasses();
821 fTrigger[0] = trigger.Contains("CCUP4-B"); // Central UPC Pb-Pb 2011
822 fTrigger[1] = trigger.Contains("CCUP2-B"); // Double gap
823 fTrigger[2] = trigger.Contains("CCUP7-B"); // Central UPC p-Pb 2013
824 fTrigger[3] = trigger.Contains("CINT1");
826 Bool_t isTriggered = kFALSE;
827 for(Int_t i=0; i<ntrg; i++) {
828 if( fTrigger[i] ) isTriggered = kTRUE;
830 if(!isMC && !isTriggered ) return;
833 fL0inputs = aod->GetHeader()->GetL0TriggerInputs();
834 fL1inputs = aod->GetHeader()->GetL1TriggerInputs();
836 //Event identification
837 fPerNum = aod ->GetPeriodNumber();
838 fOrbNum = aod ->GetOrbitNumber();
839 fBCrossNum = aod ->GetBunchCrossNumber();
842 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
843 fVtxContrib = fAODVertex->GetNContributors();
844 fVtxPos[0] = fAODVertex->GetX();
845 fVtxPos[1] = fAODVertex->GetY();
846 fVtxPos[2] = fAODVertex->GetZ();
848 fAODVertex->GetCovarianceMatrix(CovMatx);
849 fVtxErr[0] = CovMatx[0];
850 fVtxErr[1] = CovMatx[1];
851 fVtxErr[2] = CovMatx[2];
852 fVtxChi2 = fAODVertex->GetChi2();
853 fVtxNDF = fAODVertex->GetNDF();
856 AliAODVertex *fSPDVertex = aod->GetPrimaryVertexSPD();
857 fSpdVtxContrib = fSPDVertex->GetNContributors();
858 fSpdVtxPos[0] = fSPDVertex->GetX();
859 fSpdVtxPos[1] = fSPDVertex->GetY();
860 fSpdVtxPos[2] = fSPDVertex->GetZ();
863 fNtracklets = aod->GetTracklets()->GetNumberOfTracklets();
866 AliAODVZERO *fV0data = aod ->GetVZEROData();
867 AliAODZDC *fZDCdata = aod->GetZDCData();
869 fV0Adecision = fV0data->GetV0ADecision();
870 fV0Cdecision = fV0data->GetV0CDecision();
871 fZDCAenergy = fZDCdata->GetZNATowerEnergy()[0];
872 fZDCCenergy = fZDCdata->GetZNCTowerEnergy()[0];
876 //Track loop - loose cuts
877 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
878 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
880 if(!(trk->TestFilterBit(1<<0))) continue;
882 if(!(trk->GetStatus() & AliAODTrack::kTPCrefit) ) continue;
883 if(!(trk->GetStatus() & AliAODTrack::kITSrefit) ) continue;
884 if(trk->GetTPCNcls() < 20)continue;
886 }//Track loop -loose cuts
889 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
892 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
893 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
895 if(!(trk->TestFilterBit(1<<0))) continue;
897 if(!(trk->GetStatus() & AliAODTrack::kTPCrefit) ) continue;
898 if(!(trk->GetStatus() & AliAODTrack::kITSrefit) ) continue;
899 if(trk->GetTPCNcls() < 70)continue;
900 if(trk->Chi2perNDF() > 4)continue;
901 if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1))) continue;
902 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
903 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
904 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
906 if(TMath::Abs(dca[1]) > 2) continue;
907 Double_t cut_DCAxy = (0.0182 + 0.0350/TMath::Power(trk->Pt(),1.01));
908 if(TMath::Abs(dca[0]) > cut_DCAxy) continue;
911 TrackIndex[nGoodTracks] = itr;
914 if(nGoodTracks > 2) break;
917 fJPsiAODTracks->Clear("C");
918 if(nGoodTracks == 2){
920 TDatabasePDG *pdgdat = TDatabasePDG::Instance();
921 TParticlePDG *partMuon = pdgdat->GetParticle( 13 );
922 Double_t muonMass = partMuon->Mass();
923 TParticlePDG *partElectron = pdgdat->GetParticle( 11 );
924 Double_t electronMass = partElectron->Mass();
925 TParticlePDG *partPion = pdgdat->GetParticle( 211 );
926 Double_t pionMass = partPion->Mass();
930 Double_t KFmass = pionMass;
931 Double_t fRecTPCsignal;
932 AliKFParticle *KFpart[2];
933 AliKFVertex *KFvtx = new AliKFVertex();
934 KFvtx->SetField(aod->GetMagneticField());
936 for(Int_t i=0; i<2; i++){
937 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(TrackIndex[i]));
938 if(!trk) AliFatal("Not a standard AOD");
940 if(fAODVertex->HasDaughter(trk) && trk->GetUsedForVtxFit())fIsVtxContributor[i] = kTRUE;
941 else fIsVtxContributor[i] = kFALSE;
943 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
944 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
945 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
948 new((*fJPsiAODTracks)[i]) AliAODTrack(*trk);
949 ((AliAODTrack*)((*fJPsiAODTracks)[i]))->SetDCA(dca[0],dca[1]);//to get DCAxy trk->DCA(); to get DCAz trk->ZAtDCA();
951 fPIDTPCMuon[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kMuon);
952 fPIDTPCElectron[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kElectron);
953 fPIDTPCPion[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kPion);
954 fPIDTPCKaon[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kKaon);
955 fPIDTPCProton[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kProton);
957 fPIDTOFMuon[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kMuon);
958 fPIDTOFElectron[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kElectron);
959 fPIDTOFPion[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kPion);
960 fPIDTOFKaon[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kKaon);
961 fPIDTOFProton[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kProton);
963 trk->GetPosition(KFpar);
964 trk->PxPyPz(KFpar+3);
965 trk->GetCovMatrix(KFcov);
968 fRecTPCsignal = trk->GetTPCsignal();
969 if(fRecTPCsignal > 40 && fRecTPCsignal < 70) KFmass = muonMass;
970 if(fRecTPCsignal > 70 && fRecTPCsignal < 100)KFmass = electronMass;
972 else KFmass = pionMass;
974 KFpart[i] = new AliKFParticle();
975 KFpart[i]->SetField(aod->GetMagneticField());
976 KFpart[i]->AliKFParticleBase::Initialize(KFpar,KFcov,(Int_t) trk->Charge(), KFmass);
977 KFvtx->AddDaughter(*KFpart[i]);
980 Double_t pos[3]={0,0,0};
981 AliExternalTrackParam *parTrk = new AliExternalTrackParam();
982 parTrk->CopyFromVTrack((AliVTrack*) trk);
983 if(!parTrk->GetXYZAt(378,aod->GetMagneticField(),pos)) fTOFphi[i] = -666;
985 fTOFphi[i] = TMath::ATan2(pos[1],pos[0])*TMath::RadToDeg();
986 if(fTOFphi[i] < 0) fTOFphi[i]+=(2*TMath::Pi()*TMath::RadToDeg());
990 fKfVtxPos[0]= KFvtx->GetX();
991 fKfVtxPos[1]= KFvtx->GetY();
992 fKfVtxPos[2]= KFvtx->GetZ();
993 for(UInt_t i=0; i<2; i++)delete KFpart[i];
996 if(!isMC) fJPsiTree ->Fill();
1001 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
1002 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
1003 if( !trk ) continue;
1004 if(!(trk->TestFilterBit(1<<0))) continue;
1006 if(!(trk->GetStatus() & AliAODTrack::kTPCrefit) ) continue;
1007 if(!(trk->GetStatus() & AliAODTrack::kITSrefit) ) continue;
1008 if(trk->GetTPCNcls() < 50)continue;
1009 if(trk->Chi2perNDF() > 4)continue;
1010 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
1011 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
1012 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
1014 if(TMath::Abs(dca[1]) > 2) continue;
1015 Double_t cut_DCAxy = 4*(0.0182 + 0.0350/TMath::Power(trk->Pt(),1.01));
1016 if(TMath::Abs(dca[0]) > cut_DCAxy) continue;
1018 TrackIndex[nGoodTracks] = itr;
1021 if(nGoodTracks > 4) break;
1024 fPsi2sAODTracks->Clear("C");
1025 if(nGoodTracks == 4){
1027 TDatabasePDG *pdgdat = TDatabasePDG::Instance();
1028 TParticlePDG *partMuon = pdgdat->GetParticle( 13 );
1029 Double_t muonMass = partMuon->Mass();
1030 TParticlePDG *partElectron = pdgdat->GetParticle( 11 );
1031 Double_t electronMass = partElectron->Mass();
1032 TParticlePDG *partPion = pdgdat->GetParticle( 211 );
1033 Double_t pionMass = partPion->Mass();
1037 Double_t KFmass = pionMass;
1038 Double_t fRecTPCsignal;
1039 AliKFParticle *KFpart[4];
1040 AliKFVertex *KFvtx = new AliKFVertex();
1041 KFvtx->SetField(aod->GetMagneticField());
1043 for(Int_t i=0; i<4; i++){
1044 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(TrackIndex[i]));
1045 if(!trk) AliFatal("Not a standard AOD");
1047 if(fAODVertex->HasDaughter(trk) && trk->GetUsedForVtxFit())fIsVtxContributor[i] = kTRUE;
1048 else fIsVtxContributor[i] = kFALSE;
1050 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
1051 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
1052 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
1055 new((*fPsi2sAODTracks)[i]) AliAODTrack(*trk);
1056 ((AliAODTrack*)((*fPsi2sAODTracks)[i]))->SetDCA(dca[0],dca[1]);//to get DCAxy trk->DCA(); to get DCAz trk->ZAtDCA();
1059 fPIDTPCMuon[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kMuon);
1060 fPIDTPCElectron[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kElectron);
1061 fPIDTPCPion[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kPion);
1062 fPIDTPCKaon[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kKaon);
1063 fPIDTPCProton[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kProton);
1065 fPIDTOFMuon[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kMuon);
1066 fPIDTOFElectron[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kElectron);
1067 fPIDTOFPion[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kPion);
1068 fPIDTOFKaon[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kKaon);
1069 fPIDTOFProton[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kProton);
1071 trk->GetPosition(KFpar);
1072 trk->PxPyPz(KFpar+3);
1073 trk->GetCovMatrix(KFcov);
1076 fRecTPCsignal = trk->GetTPCsignal();
1077 if(fRecTPCsignal > 40 && fRecTPCsignal < 70) KFmass = muonMass;
1078 if(fRecTPCsignal > 70 && fRecTPCsignal < 100)KFmass = electronMass;
1080 else KFmass = pionMass;
1082 KFpart[i] = new AliKFParticle();
1083 KFpart[i]->SetField(aod->GetMagneticField());
1084 KFpart[i]->AliKFParticleBase::Initialize(KFpar,KFcov,(Int_t) trk->Charge(), KFmass);
1085 KFvtx->AddDaughter(*KFpart[i]);
1087 Double_t pos[3]={0,0,0};
1088 AliExternalTrackParam *parTrk = new AliExternalTrackParam();
1089 parTrk->CopyFromVTrack((AliVTrack*) trk);
1090 if(!parTrk->GetXYZAt(378,aod->GetMagneticField(),pos)) fTOFphi[i] = -666;
1092 fTOFphi[i] = TMath::ATan2(pos[1],pos[0])*TMath::RadToDeg();
1093 if(fTOFphi[i] < 0) fTOFphi[i]+=(2*TMath::Pi()*TMath::RadToDeg());
1097 fKfVtxPos[0]= KFvtx->GetX();
1098 fKfVtxPos[1]= KFvtx->GetY();
1099 fKfVtxPos[2]= KFvtx->GetZ();
1100 for(UInt_t i=0; i<4; i++)delete KFpart[i];
1102 if(!isMC) fPsi2sTree ->Fill();
1107 fPsi2sTree ->Fill();
1110 PostData(1, fJPsiTree);
1111 PostData(2, fPsi2sTree);
1116 //_____________________________________________________________________________
1117 void AliAnalysisTaskUpcPsi2s::RunAODMC(AliAODEvent *aod)
1120 fL0inputs = aod->GetHeader()->GetL0TriggerInputs();
1121 fTriggerInputsMC[0] = kFALSE;//0SM2
1122 fTriggerInputsMC[1] = fL0inputs & (1 << 0);//0VBA
1123 fTriggerInputsMC[2] = fL0inputs & (1 << 1);//0VBC
1124 fTriggerInputsMC[3] = fL0inputs & (1 << 9);//0OMU
1126 fGenPart->Clear("C");
1128 TClonesArray *arrayMC = (TClonesArray*) aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
1129 if(!arrayMC) return;
1132 //loop over mc particles
1133 for(Int_t imc=0; imc<arrayMC->GetEntriesFast(); imc++) {
1134 AliAODMCParticle *mcPart = (AliAODMCParticle*) arrayMC->At(imc);
1135 if(!mcPart) continue;
1137 if(mcPart->GetMother() >= 0) continue;
1139 TParticle *part = (TParticle*) fGenPart->ConstructedAt(nmc++);
1140 part->SetMomentum(mcPart->Px(), mcPart->Py(), mcPart->Pz(), mcPart->E());
1141 part->SetPdgCode(mcPart->GetPdgCode());
1142 part->SetUniqueID(imc);
1143 }//loop over mc particles
1148 //_____________________________________________________________________________
1149 void AliAnalysisTaskUpcPsi2s::RunESDtrig()
1153 AliESDEvent *esd = (AliESDEvent*) InputEvent();
1156 fRunNum = esd ->GetRunNumber();
1158 TString trigger = esd->GetFiredTriggerClasses();
1160 if(trigger.Contains("CCUP4-B")) fHistCcup4TriggersPerRun->Fill(fRunNum); //CCUP4 triggers
1161 if(trigger.Contains("CCUP7-B")) fHistCcup7TriggersPerRun->Fill(fRunNum); //CCUP7 triggers
1162 if(trigger.Contains("CCUP2-B")) fHistCcup2TriggersPerRun->Fill(fRunNum); //CCUP2 triggers
1164 if(trigger.Contains("CINT1")) fHistCint1TriggersPerRun->Fill(fRunNum); //CINT1 triggers
1165 if(trigger.Contains("CINT1") && trigger.Contains("C0TVX")) fHistC0tvxAndCint1TriggersPerRun->Fill(fRunNum); //C0TVX triggers in CINT1 events
1167 if(trigger.Contains("CVLN_B2-B")) fHistCvlnTriggersPerRun->Fill(fRunNum); //CVLN triggers - synchronously downscaled
1168 if(trigger.Contains("CVLN_R1-B")) fHistCvlnTriggersPerRun->Fill(fRunNum); //CVLN triggers - randomly downscaled
1170 if(esd->GetHeader()->IsTriggerInputFired("1ZED")) fHistZedTriggersPerRun->Fill(fRunNum); //1ZED trigger inputs
1172 //MB, Central and SemiCentral triggers
1173 AliCentrality *centrality = esd->GetCentrality();
1174 UInt_t selectionMask = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
1176 //Double_t percentile = centrality->GetCentralityPercentile("V0M");
1177 Double_t percentile = centrality->GetCentralityPercentileUnchecked("V0M");
1179 if(((selectionMask & AliVEvent::kMB) == AliVEvent::kMB) && percentile<=80 && percentile>=0) fHistMBTriggersPerRun->Fill(fRunNum);
1181 if(((selectionMask & AliVEvent::kCentral) == AliVEvent::kCentral) && percentile<=6 && percentile>=0 && (trigger.Contains("CVHN_R2-B"))) fHistCentralTriggersPerRun->Fill(fRunNum);
1183 if(((selectionMask & AliVEvent::kSemiCentral) == AliVEvent::kSemiCentral) && percentile<=50 && percentile>=15) fHistSemiCentralTriggersPerRun->Fill(fRunNum);
1186 PostData(3, fListTrig);
1189 //_____________________________________________________________________________
1190 void AliAnalysisTaskUpcPsi2s::RunESDhist()
1193 TDatabasePDG *pdgdat = TDatabasePDG::Instance();
1195 TParticlePDG *partMuon = pdgdat->GetParticle( 13 );
1196 Double_t muonMass = partMuon->Mass();
1198 TParticlePDG *partElectron = pdgdat->GetParticle( 11 );
1199 Double_t electronMass = partElectron->Mass();
1201 TParticlePDG *partPion = pdgdat->GetParticle( 211 );
1202 Double_t pionMass = partPion->Mass();
1205 AliESDEvent *esd = (AliESDEvent*) InputEvent();
1208 fHistNeventsJPsi->Fill(1);
1209 fHistNeventsPsi2s->Fill(1);
1212 TString trigger = esd->GetFiredTriggerClasses();
1214 if(!isMC && !trigger.Contains("CCUP") ) return;
1216 fHistNeventsJPsi->Fill(2);
1217 fHistNeventsPsi2s->Fill(2);
1220 AliESDVertex *fESDVertex = (AliESDVertex*) esd->GetPrimaryVertex();
1221 fVtxContrib = fESDVertex->GetNContributors();
1222 if(fVtxContrib < 2) return;
1224 fHistNeventsJPsi->Fill(3);
1225 fHistNeventsPsi2s->Fill(3);
1228 AliESDVZERO *fV0data = esd->GetVZEROData();
1229 AliESDZDC *fZDCdata = esd->GetESDZDC();
1231 fV0Adecision = fV0data->GetV0ADecision();
1232 fV0Cdecision = fV0data->GetV0CDecision();
1233 if(fV0Adecision != AliESDVZERO::kV0Empty || fV0Cdecision != AliESDVZERO::kV0Empty) return;
1235 fZDCAenergy = fZDCdata->GetZN2TowerEnergy()[0];
1236 fZDCCenergy = fZDCdata->GetZN1TowerEnergy()[0];
1237 if( fZDCAenergy > 8200 || fZDCCenergy > 8200) return;
1239 fHistNeventsJPsi->Fill(4);
1240 fHistNeventsPsi2s->Fill(4);
1242 Int_t nGoodTracks=0;
1244 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
1246 TLorentzVector vLepton[4], vPion[4], vCandidate, vDilepton;
1247 Short_t qLepton[4], qPion[4];
1248 UInt_t nLepton=0, nPion=0, nHighPt=0;
1249 Double_t fRecTPCsignal[5];
1250 Int_t mass[3]={-1,-1,-1};
1253 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
1254 AliESDtrack *trk = esd->GetTrack(itr);
1255 if( !trk ) continue;
1257 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1258 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1259 if(trk->GetTPCNcls() < 70)continue;
1260 if(trk->GetTPCchi2()/trk->GetTPCNcls() > 4)continue;
1261 if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1))) continue;
1262 Float_t dca[2] = {0.0,0.0}; AliExternalTrackParam cParam;
1263 if(!trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam)) continue;
1264 trk->GetImpactParameters(dca[0],dca[1]);
1265 if(TMath::Abs(dca[1]) > 2) continue;
1266 if(TMath::Abs(dca[1]) > 0.2) continue;
1268 TrackIndex[nGoodTracks] = itr;
1270 if(nGoodTracks > 2) break;
1274 if(nGoodTracks == 2){
1275 fHistNeventsJPsi->Fill(5);
1276 for(Int_t i=0; i<2; i++){
1277 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
1278 if(trk->Pt() > 1) nHighPt++;
1279 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
1280 qLepton[nLepton] = trk->Charge();
1281 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
1282 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
1285 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
1286 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
1292 if(qLepton[0]*qLepton[1] > 0) fHistNeventsJPsi->Fill(6);
1293 if(qLepton[0]*qLepton[1] < 0){
1294 fHistNeventsJPsi->Fill(7);
1296 fHistNeventsJPsi->Fill(8);
1297 fHistTPCsignalJPsi->Fill(fRecTPCsignal[0],fRecTPCsignal[1]);
1298 if(nHighPt == 2) fHistNeventsJPsi->Fill(9);
1299 if(mass[0] == mass[1] && mass[0] != -1) {
1300 fHistNeventsJPsi->Fill(10);
1301 vCandidate = vLepton[0]+vLepton[1];
1302 if( vCandidate.M() > 2.8 && vCandidate.M() < 3.2) fHistDiLeptonPtJPsi->Fill(vLepton[0].Pt(),vLepton[1].Pt());
1304 fHistDiMuonMass->Fill(vCandidate.M());
1305 fHistNeventsJPsi->Fill(11);
1308 fHistDiElectronMass->Fill(vCandidate.M());
1309 fHistNeventsJPsi->Fill(12);
1316 nGoodTracks = 0; nLepton=0; nPion=0; nHighPt=0;
1317 mass[0]= -1; mass[1]= -1, mass[2]= -1;
1320 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
1321 AliESDtrack *trk = esd->GetTrack(itr);
1322 if( !trk ) continue;
1324 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1325 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1326 if(trk->GetTPCNcls() < 50)continue;
1327 if(trk->GetTPCchi2()/trk->GetTPCNcls() > 4)continue;
1328 Float_t dca[2] = {0.0,0.0}; AliExternalTrackParam cParam;
1329 if(!trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam)) continue;
1330 trk->GetImpactParameters(dca[0],dca[1]);
1331 if(TMath::Abs(dca[1]) > 2) continue;
1333 TrackIndex[nGoodTracks] = itr;
1335 if(nGoodTracks > 4) break;
1338 if(nGoodTracks == 4){
1339 fHistNeventsPsi2s->Fill(5);
1340 for(Int_t i=0; i<4; i++){
1341 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
1344 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
1345 qLepton[nLepton] = trk->Charge();
1346 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
1347 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
1350 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
1351 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
1357 qPion[nPion] = trk->Charge();
1358 vPion[nPion].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), pionMass);
1362 if(nLepton > 2 || nPion > 2) break;
1364 if((nLepton == 2) && (nPion == 2)){
1365 fHistNeventsPsi2s->Fill(6);
1366 if(qLepton[0]*qLepton[1] > 0) fHistNeventsPsi2s->Fill(7);
1367 if(qPion[0]*qPion[1] > 0) fHistNeventsPsi2s->Fill(8);
1368 if((qLepton[0]*qLepton[1] > 0) && (qPion[0]*qPion[1] > 0)) fHistNeventsPsi2s->Fill(9);
1369 if((qLepton[0]*qLepton[1] < 0) && (qPion[0]*qPion[1] < 0)){
1370 fHistNeventsPsi2s->Fill(10);
1371 if(mass[0] == mass[1]) {
1372 fHistNeventsPsi2s->Fill(11);
1373 vCandidate = vLepton[0]+vLepton[1]+vPion[0]+vPion[1];
1374 vDilepton = vLepton[0]+vLepton[1];
1375 fHistPsi2sMassVsPt->Fill(vCandidate.M(),vCandidate.Pt());
1376 if(vCandidate.Pt() < 0.15) fHistPsi2sMassCoherent->Fill(vCandidate.M());
1377 if(mass[0] == 0) fHistNeventsPsi2s->Fill(12);
1378 if(mass[0] == 1) fHistNeventsPsi2s->Fill(13);
1384 PostData(4, fListHist);
1388 //_____________________________________________________________________________
1389 void AliAnalysisTaskUpcPsi2s::RunESDtree()
1393 AliESDEvent *esd = (AliESDEvent*) InputEvent();
1396 if(isMC) RunESDMC(esd);
1399 const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
1400 fDataFilnam->Clear();
1401 fDataFilnam->SetString(filnam);
1402 fEvtNum = ((TTree*) GetInputData(0))->GetTree()->GetReadEntry();
1403 fRunNum = esd->GetRunNumber();
1406 TString trigger = esd->GetFiredTriggerClasses();
1408 fTrigger[0] = trigger.Contains("CCUP4-B"); // Central UPC Pb-Pb 2011
1409 fTrigger[1] = trigger.Contains("CCUP2-B"); // Double gap
1410 fTrigger[2] = trigger.Contains("CCUP7-B"); // Central UPC p-Pb 2013
1412 Bool_t isTriggered = kFALSE;
1413 for(Int_t i=0; i<ntrg; i++) {
1414 if( fTrigger[i] ) isTriggered = kTRUE;
1416 if(!isMC && !isTriggered ) return;
1419 fL0inputs = esd->GetHeader()->GetL0TriggerInputs();
1420 fL1inputs = esd->GetHeader()->GetL1TriggerInputs();
1422 //TOF trigger info (0OMU)
1423 fTOFtrig1 = esd->GetHeader()->IsTriggerInputFired("0OMU");
1424 fTOFtrig2 = esd->GetHeader()->GetActiveTriggerInputs().Contains("0OMU") ? ((esd->GetHeader()) ? esd->GetHeader()->IsTriggerInputFired("0OMU") : kFALSE) : TESTBIT(esd->GetHeader()->GetL0TriggerInputs(), (kFALSE) ? 21 : 9);
1426 //Event identification
1427 fPerNum = esd->GetPeriodNumber();
1428 fOrbNum = esd->GetOrbitNumber();
1429 fBCrossNum = esd->GetBunchCrossNumber();
1432 AliESDVertex *fESDVertex = (AliESDVertex*) esd->GetPrimaryVertex();
1433 fVtxContrib = fESDVertex->GetNContributors();
1434 fVtxPos[0] = fESDVertex->GetX();
1435 fVtxPos[1] = fESDVertex->GetY();
1436 fVtxPos[2] = fESDVertex->GetZ();
1437 Double_t CovMatx[6];
1438 fESDVertex->GetCovarianceMatrix(CovMatx);
1439 fVtxErr[0] = CovMatx[0];
1440 fVtxErr[1] = CovMatx[1];
1441 fVtxErr[2] = CovMatx[2];
1442 fVtxChi2 = fESDVertex->GetChi2();
1443 fVtxNDF = fESDVertex->GetNDF();
1445 //SPD primary vertex
1446 AliESDVertex *fSPDVertex = (AliESDVertex*) esd->GetPrimaryVertexSPD();
1448 fSpdVtxPos[0] = fSPDVertex->GetX();
1449 fSpdVtxPos[1] = fSPDVertex->GetY();
1450 fSpdVtxPos[2] = fSPDVertex->GetZ();
1454 fNtracklets = esd->GetMultiplicity()->GetNumberOfTracklets();
1457 AliESDVZERO *fV0data = esd->GetVZEROData();
1458 AliESDZDC *fZDCdata = esd->GetESDZDC();
1460 fV0Adecision = fV0data->GetV0ADecision();
1461 fV0Cdecision = fV0data->GetV0CDecision();
1462 fZDCAenergy = fZDCdata->GetZN2TowerEnergy()[0];
1463 fZDCCenergy = fZDCdata->GetZN1TowerEnergy()[0];
1467 //Track loop - loose cuts
1468 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
1469 AliESDtrack *trk = esd->GetTrack(itr);
1470 if( !trk ) continue;
1472 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1473 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1474 if(trk->GetTPCNcls() < 20)continue;
1476 }//Track loop -loose cuts
1478 Int_t nGoodTracks=0;
1479 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
1482 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
1483 AliESDtrack *trk = esd->GetTrack(itr);
1484 if( !trk ) continue;
1486 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1487 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1488 if(trk->GetTPCNcls() < 70)continue;
1489 if(trk->GetTPCchi2()/trk->GetTPCNcls() > 4)continue;
1490 if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1))) continue;
1491 Float_t dca[2] = {0.0,0.0}; AliExternalTrackParam cParam;
1492 if(!trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam)) continue;
1493 trk->GetImpactParameters(dca[0],dca[1]);
1494 if(TMath::Abs(dca[1]) > 2) continue;
1495 if(TMath::Abs(dca[0]) > 0.2) continue;
1497 TrackIndex[nGoodTracks] = itr;
1499 if(nGoodTracks > 2) break;
1502 fJPsiESDTracks->Clear("C");
1503 if(nGoodTracks == 2){
1504 for(Int_t i=0; i<2; i++){
1505 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
1507 AliExternalTrackParam cParam;
1508 trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam);// to get trk->GetImpactParameters(DCAxy,DCAz);
1510 new((*fJPsiESDTracks)[i]) AliESDtrack(*trk);
1512 fPIDTPCMuon[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kMuon);
1513 fPIDTPCElectron[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kElectron);
1514 fPIDTPCPion[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kPion);
1515 fPIDTPCKaon[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kKaon);
1516 fPIDTPCProton[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kProton);
1518 fPIDTOFMuon[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kMuon);
1519 fPIDTOFElectron[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kElectron);
1520 fPIDTOFPion[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kPion);
1521 fPIDTOFKaon[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kKaon);
1522 fPIDTOFProton[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kProton);
1524 Double_t pos[3]={0,0,0};
1525 if(!trk->GetXYZAt(378,esd->GetMagneticField(),pos)) fTOFphi[i] = -666;
1527 fTOFphi[i] = TMath::ATan2(pos[1],pos[0])*TMath::RadToDeg();
1528 if(fTOFphi[i] < 0) fTOFphi[i]+=(2*TMath::Pi()*TMath::RadToDeg());
1531 if(!isMC) fJPsiTree ->Fill();
1536 for(Int_t itr=0; itr<esd ->GetNumberOfTracks(); itr++) {
1537 AliESDtrack *trk = esd->GetTrack(itr);
1538 if( !trk ) continue;
1540 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1541 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1542 if(trk->GetTPCNcls() < 50)continue;
1543 if(trk->GetTPCchi2()/trk->GetTPCNcls() > 4)continue;
1544 Float_t dca[2] = {0.0,0.0}; AliExternalTrackParam cParam;
1545 if(!trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam)) continue;
1546 trk->GetImpactParameters(dca[0],dca[1]);
1547 if(TMath::Abs(dca[1]) > 2) continue;
1549 TrackIndex[nGoodTracks] = itr;
1551 if(nGoodTracks > 4) break;
1554 fPsi2sESDTracks->Clear("C");
1555 if(nGoodTracks == 4){
1556 for(Int_t i=0; i<4; i++){
1557 AliESDtrack *trk = esd->GetTrack(TrackIndex[i]);
1559 AliExternalTrackParam cParam;
1560 trk->RelateToVertex(fESDVertex, esd->GetMagneticField(),300.,&cParam);// to get trk->GetImpactParameters(DCAxy,DCAz);
1562 new((*fPsi2sESDTracks)[i]) AliESDtrack(*trk);
1564 fPIDTPCMuon[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kMuon);
1565 fPIDTPCElectron[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kElectron);
1566 fPIDTPCPion[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kPion);
1567 fPIDTPCKaon[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kKaon);
1568 fPIDTPCProton[i] = fPIDResponse->NumberOfSigmasTPC(trk,AliPID::kProton);
1570 fPIDTOFMuon[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kMuon);
1571 fPIDTOFElectron[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kElectron);
1572 fPIDTOFPion[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kPion);
1573 fPIDTOFKaon[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kKaon);
1574 fPIDTOFProton[i] = fPIDResponse->NumberOfSigmasTOF(trk,AliPID::kProton);
1576 Double_t pos[3]={0,0,0};
1577 if(!trk->GetXYZAt(378,esd->GetMagneticField(),pos)) fTOFphi[i] = -666;
1579 fTOFphi[i] = TMath::ATan2(pos[1],pos[0])*TMath::RadToDeg();
1580 if(fTOFphi[i] < 0) fTOFphi[i]+=(2*TMath::Pi()*TMath::RadToDeg());
1583 if(!isMC) fPsi2sTree ->Fill();
1588 fPsi2sTree ->Fill();
1591 PostData(1, fJPsiTree);
1592 PostData(2, fPsi2sTree);
1597 //_____________________________________________________________________________
1598 void AliAnalysisTaskUpcPsi2s::RunESDMC(AliESDEvent* esd)
1601 AliTriggerAnalysis *fTrigAna = new AliTriggerAnalysis();
1602 fTrigAna->SetAnalyzeMC(isMC);
1604 if(fTrigAna->SPDFiredChips(esd,1,kFALSE,2) > 1) fTriggerInputsMC[0] = kTRUE;
1605 if(fTrigAna->SPDFiredChips(esd,1,kFALSE,2) < 2) fTriggerInputsMC[0] = kFALSE;
1607 fTriggerInputsMC[1] = esd->GetHeader()->IsTriggerInputFired("0OMU");
1608 fTriggerInputsMC[2] = esd->GetHeader()->IsTriggerInputFired("0VBA");
1609 fTriggerInputsMC[3] = esd->GetHeader()->IsTriggerInputFired("0VBC");
1611 fGenPart->Clear("C");
1613 AliMCEvent *mc = MCEvent();
1617 //loop over mc particles
1618 for(Int_t imc=0; imc<mc->GetNumberOfTracks(); imc++) {
1619 AliMCParticle *mcPart = (AliMCParticle*) mc->GetTrack(imc);
1620 if(!mcPart) continue;
1622 if(mcPart->GetMother() >= 0) continue;
1624 TParticle *part = (TParticle*) fGenPart->ConstructedAt(nmc++);
1625 part->SetMomentum(mcPart->Px(), mcPart->Py(), mcPart->Pz(), mcPart->E());
1626 part->SetPdgCode(mcPart->PdgCode());
1627 part->SetUniqueID(imc);
1628 }//loop over mc particles
1634 //_____________________________________________________________________________
1635 void AliAnalysisTaskUpcPsi2s::Terminate(Option_t *)
1638 cout<<"Analysis complete."<<endl;
1641 //_____________________________________________________________________________
1642 Double_t AliAnalysisTaskUpcPsi2s::GetMedian(Double_t *daArray) {
1643 // Allocate an array of the same size and sort it.
1644 Double_t dpSorted[4];
1645 for (Int_t i = 0; i < 4; ++i) {
1646 dpSorted[i] = daArray[i];
1648 for (Int_t i = 3; i > 0; --i) {
1649 for (Int_t j = 0; j < i; ++j) {
1650 if (dpSorted[j] > dpSorted[j+1]) {
1651 Double_t dTemp = dpSorted[j];
1652 dpSorted[j] = dpSorted[j+1];
1653 dpSorted[j+1] = dTemp;
1658 // Middle or average of middle values in the sorted array.
1659 Double_t dMedian = 0.0;
1660 dMedian = (dpSorted[2] + dpSorted[1])/2.0;
1665 //_____________________________________________________________________________
1666 void AliAnalysisTaskUpcPsi2s::RunAODsystematics(AliAODEvent* aod)
1669 Double_t fJPsiSels[4];
1671 fJPsiSels[0] = 70; //min number of TPC clusters
1672 fJPsiSels[1] = 4; //chi2
1673 fJPsiSels[2] = 2; //DCAz
1674 fJPsiSels[3] = 1; // DCAxy 1x
1676 Double_t fJPsiSelsMid[4];
1678 fJPsiSelsMid[0] = 70; //min number of TPC clusters
1679 fJPsiSelsMid[1] = 4; //chi2
1680 fJPsiSelsMid[2] = 2; //DCAz
1681 fJPsiSelsMid[3] = 1; // DCAxy 1x
1683 Double_t fJPsiSelsLoose[4];
1685 fJPsiSelsLoose[0] = 60; //min number of TPC clusters
1686 fJPsiSelsLoose[1] = 5; //chi2
1687 fJPsiSelsLoose[2] = 3; //DCAz
1688 fJPsiSelsLoose[3] = 2; // DCAxy 2x
1690 Double_t fJPsiSelsTight[4];
1692 fJPsiSelsTight[0] = 80; //min number of TPC clusters
1693 fJPsiSelsTight[1] = 3.5; //chi2
1694 fJPsiSelsTight[2] = 1; //DCAz
1695 fJPsiSelsTight[3] = 0.5; // DCAxy 0.5x
1697 Int_t nGoodTracks = 0;
1698 Int_t TrackIndex[5] = {-1,-1,-1,-1,-1};
1700 TLorentzVector vLepton[4], vPion[4], vCandidate, vDilepton;
1701 Short_t qLepton[4],qPion[4];
1702 UInt_t nLepton=0, nPion=0, nHighPt=0;
1703 Double_t fRecTPCsignal[5], fRecTPCsignalDist;
1706 AliAODVertex *fAODVertex = aod->GetPrimaryVertex();
1708 TDatabasePDG *pdgdat = TDatabasePDG::Instance();
1710 TParticlePDG *partMuon = pdgdat->GetParticle( 13 );
1711 Double_t muonMass = partMuon->Mass();
1713 TParticlePDG *partElectron = pdgdat->GetParticle( 11 );
1714 Double_t electronMass = partElectron->Mass();
1716 TParticlePDG *partPion = pdgdat->GetParticle( 211 );
1717 Double_t pionMass = partPion->Mass();
1720 for(Int_t i=0; i<5; i++){
1721 //cout<<"Loose sytematics, cut"<<i<<endl;
1722 for(Int_t j=0; j<4; j++){
1723 if(i==j) fJPsiSels[j] = fJPsiSelsLoose[i];
1724 else fJPsiSels[j] = fJPsiSelsMid[j];
1728 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
1729 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
1730 if( !trk ) continue;
1731 if(!(trk->TestFilterBit(1<<0))) continue;
1733 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1734 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1735 if(i!=4){ if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1))) continue;}
1736 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
1737 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
1738 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
1740 Double_t cut_DCAxy = (0.0182 + 0.0350/TMath::Power(trk->Pt(),1.01));
1742 if(trk->GetTPCNcls() < fJPsiSels[0])continue;
1743 if(trk->Chi2perNDF() > fJPsiSels[1])continue;
1744 if(TMath::Abs(dca[1]) > fJPsiSels[2]) continue;
1745 if(TMath::Abs(dca[0]) > fJPsiSels[3]*cut_DCAxy) continue;
1747 TrackIndex[nGoodTracks] = itr;
1750 if(nGoodTracks > 2) break;
1753 Int_t mass[3]={-1,-1,-1};
1755 nLepton=0; nHighPt=0;
1757 if(nGoodTracks == 2){
1758 for(Int_t k=0; k<2; k++){
1759 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(TrackIndex[k]));
1760 if(!trk) AliFatal("Not a standard AOD");
1762 if(trk->Pt() > 1) nHighPt++;
1763 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
1764 qLepton[nLepton] = trk->Charge();
1765 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
1766 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
1769 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
1770 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
1776 if(qLepton[0]*qLepton[1] < 0 && nHighPt > 0 && (mass[0]!=-1 || mass[1]!=-1)){
1777 vCandidate = vLepton[0]+vLepton[1];
1778 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-56,2)+TMath::Power(fRecTPCsignal[1]-56,2));
1779 if (fRecTPCsignalDist < 3.6*4.0) fChannel = -1;
1781 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-78,2)+TMath::Power(fRecTPCsignal[1]-78,2));
1782 if (fRecTPCsignalDist < 4.1*4.0) fChannel = 1;
1784 if(fChannel == -1 && vCandidate.Pt()<0.15) ((TH1D*)(fListJPsiLoose->At(i)))->Fill(vCandidate.M());
1785 if(fChannel == 1 && vCandidate.Pt()<0.3) ((TH1D*)(fListJPsiLoose->At(i)))->Fill(vCandidate.M());
1791 for(Int_t i=0; i<4; i++){
1792 //cout<<"Tight sytematics, cut"<<i<<endl;
1793 for(Int_t j=0; j<4; j++){
1794 if(i==j) fJPsiSels[j] = fJPsiSelsTight[i];
1795 else fJPsiSels[j] = fJPsiSelsMid[j];
1799 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
1800 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
1801 if( !trk ) continue;
1802 if(!(trk->TestFilterBit(1<<0))) continue;
1804 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1805 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1806 if((!trk->HasPointOnITSLayer(0))&&(!trk->HasPointOnITSLayer(1))) continue;
1807 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
1808 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
1809 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
1811 Double_t cut_DCAxy = (0.0182 + 0.0350/TMath::Power(trk->Pt(),1.01));
1813 if(trk->GetTPCNcls() < fJPsiSels[0])continue;
1814 if(trk->Chi2perNDF() > fJPsiSels[1])continue;
1815 if(TMath::Abs(dca[1]) > fJPsiSels[2]) continue;
1816 if(TMath::Abs(dca[0]) > fJPsiSels[3]*cut_DCAxy) continue;
1818 TrackIndex[nGoodTracks] = itr;
1821 if(nGoodTracks > 2) break;
1824 Int_t mass[3]={-1,-1,-1};
1826 nLepton=0; nHighPt=0;
1828 if(nGoodTracks == 2){
1829 for(Int_t k=0; k<2; k++){
1830 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(TrackIndex[k]));
1831 if(!trk) AliFatal("Not a standard AOD");
1833 if(trk->Pt() > 1) nHighPt++;
1834 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
1835 qLepton[nLepton] = trk->Charge();
1836 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
1837 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
1840 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
1841 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
1847 if(qLepton[0]*qLepton[1] < 0 && nHighPt > 0 && (mass[0]!=-1 || mass[1]!=-1)){
1848 vCandidate = vLepton[0]+vLepton[1];
1849 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-56,2)+TMath::Power(fRecTPCsignal[1]-56,2));
1850 if (fRecTPCsignalDist < 3.6*4.0) fChannel = -1;
1852 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-78,2)+TMath::Power(fRecTPCsignal[1]-78,2));
1853 if (fRecTPCsignalDist < 4.1*4.0) fChannel = 1;
1855 if(fChannel == -1 && vCandidate.Pt()<0.15) ((TH1D*)(fListJPsiTight->At(i)))->Fill(vCandidate.M());
1856 if(fChannel == 1 && vCandidate.Pt()<0.3) ((TH1D*)(fListJPsiTight->At(i)))->Fill(vCandidate.M());
1862 //---------------------------------------------Psi2s------------------------------------------------------------------------
1864 Double_t fPsi2sSels[4];
1866 fPsi2sSels[0] = 50; //min number of TPC clusters
1867 fPsi2sSels[1] = 4; //chi2
1868 fPsi2sSels[2] = 2; //DCAz
1869 fPsi2sSels[3] = 4; // DCAxy 1x
1871 Double_t fPsi2sSelsMid[4];
1873 fPsi2sSelsMid[0] = 50; //min number of TPC clusters
1874 fPsi2sSelsMid[1] = 4; //chi2
1875 fPsi2sSelsMid[2] = 2; //DCAz
1876 fPsi2sSelsMid[3] = 4; // DCAxy 1x
1878 Double_t fPsi2sSelsLoose[4];
1880 fPsi2sSelsLoose[0] = 60; //min number of TPC clusters
1881 fPsi2sSelsLoose[1] = 5; //chi2
1882 fPsi2sSelsLoose[2] = 3; //DCAz
1883 fPsi2sSelsLoose[3] = 6; // DCAxy 2x
1885 Double_t fPsi2sSelsTight[4];
1887 fPsi2sSelsTight[0] = 70; //min number of TPC clusters
1888 fPsi2sSelsTight[1] = 3.5; //chi2
1889 fPsi2sSelsTight[2] = 1; //DCAz
1890 fPsi2sSelsTight[3] = 2; // DCAxy 0.5x
1892 nGoodTracks = 0; nLepton=0; nHighPt=0; fChannel = 0;
1894 Double_t TrackPt[5]={0,0,0,0,0};
1895 Double_t MeanPt = -1;
1897 for(Int_t i=0; i<5; i++){
1898 //cout<<"Loose systematics psi2s, cut"<<i<<endl;
1899 for(Int_t j=0; j<4; j++){
1900 if(i==j) fJPsiSels[j] = fJPsiSelsLoose[i];
1901 else fJPsiSels[j] = fJPsiSelsMid[j];
1905 nGoodTracks = 0; nSpdHits = 0;
1906 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
1907 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
1908 if( !trk ) continue;
1909 if(!(trk->TestFilterBit(1<<0))) continue;
1911 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1912 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1913 if((trk->HasPointOnITSLayer(0))||(trk->HasPointOnITSLayer(1))) nSpdHits++;
1914 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
1915 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
1916 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
1918 Double_t cut_DCAxy = (0.0182 + 0.0350/TMath::Power(trk->Pt(),1.01));
1920 if(trk->GetTPCNcls() < fJPsiSels[0])continue;
1921 if(trk->Chi2perNDF() > fJPsiSels[1])continue;
1922 if(TMath::Abs(dca[1]) > fJPsiSels[2]) continue;
1923 if(TMath::Abs(dca[0]) > fJPsiSels[3]*cut_DCAxy) continue;
1924 if((trk->HasPointOnITSLayer(0))||(trk->HasPointOnITSLayer(1))) nSpdHits++;
1926 TrackIndex[nGoodTracks] = itr;
1927 TrackPt[nGoodTracks] = trk->Pt();
1930 if(nGoodTracks > 4) break;
1933 Int_t mass[3]={-1,-1,-1};
1935 nLepton=0; nPion=0; nHighPt=0;
1937 if(nGoodTracks == 4){
1938 if(i!=4){ if(nSpdHits<2) continue;}
1939 MeanPt = GetMedian(TrackPt);
1940 for(Int_t k=0; k<4; k++){
1941 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(TrackIndex[k]));
1942 if(!trk) AliFatal("Not a standard AOD");
1944 if(trk->Pt() > MeanPt){
1945 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
1946 qLepton[nLepton] = trk->Charge();
1947 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
1948 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
1951 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
1952 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
1958 qPion[nPion] = trk->Charge();
1959 vPion[nPion].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), pionMass);
1963 if((qLepton[0]*qLepton[1] < 0) && (qPion[0]*qPion[1] < 0) && mass[0] != -1 && mass[1] != -1){
1964 vCandidate = vLepton[0]+vLepton[1]+vPion[0]+vPion[1];
1965 vDilepton = vLepton[0]+vLepton[1];
1966 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-56,2)+TMath::Power(fRecTPCsignal[1]-56,2));
1967 if (fRecTPCsignalDist < 3.6*4.0) fChannel = -1;
1969 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-78,2)+TMath::Power(fRecTPCsignal[1]-78,2));
1970 if (fRecTPCsignalDist < 4.1*4.0) fChannel = 1;
1972 if(fChannel == -1) if(vDilepton.M() > 3.0 && vDilepton.M() < 3.2 && vCandidate.Pt()<0.15) ((TH1D*)(fListPsi2sLoose->At(i)))->Fill(vCandidate.M());
1973 if(fChannel == 1) if(vDilepton.M() > 2.6 && vDilepton.M() < 3.2 && vCandidate.Pt()<0.3) ((TH1D*)(fListPsi2sLoose->At(i)))->Fill(vCandidate.M());
1978 for(Int_t i=0; i<4; i++){
1979 //cout<<"Tight systematics psi2s, cut"<<i<<endl;
1980 for(Int_t j=0; j<4; j++){
1981 if(i==j) fJPsiSels[j] = fJPsiSelsTight[i];
1982 else fJPsiSels[j] = fJPsiSelsMid[j];
1986 nGoodTracks = 0; nSpdHits = 0;
1987 for(Int_t itr=0; itr<aod ->GetNumberOfTracks(); itr++) {
1988 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(itr));
1989 if( !trk ) continue;
1990 if(!(trk->TestFilterBit(1<<0))) continue;
1992 if(!(trk->GetStatus() & AliESDtrack::kTPCrefit) ) continue;
1993 if(!(trk->GetStatus() & AliESDtrack::kITSrefit) ) continue;
1994 if((trk->HasPointOnITSLayer(0))||(trk->HasPointOnITSLayer(1))) nSpdHits++;
1995 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};
1996 AliAODTrack* trk_clone=(AliAODTrack*)trk->Clone("trk_clone");
1997 if(!trk_clone->PropagateToDCA(fAODVertex,aod->GetMagneticField(),300.,dca,cov)) continue;
1999 Double_t cut_DCAxy = (0.0182 + 0.0350/TMath::Power(trk->Pt(),1.01));
2001 if(trk->GetTPCNcls() < fJPsiSels[0])continue;
2002 if(trk->Chi2perNDF() > fJPsiSels[1])continue;
2003 if(TMath::Abs(dca[1]) > fJPsiSels[2]) continue;
2004 if(TMath::Abs(dca[0]) > fJPsiSels[3]*cut_DCAxy) continue;
2005 if((trk->HasPointOnITSLayer(0))||(trk->HasPointOnITSLayer(1))) nSpdHits++;
2007 TrackIndex[nGoodTracks] = itr;
2008 TrackPt[nGoodTracks] = trk->Pt();
2011 if(nGoodTracks > 4) break;
2014 Int_t mass[3]={-1,-1,-1};
2016 nLepton=0; nPion=0; nHighPt=0;
2018 if(nGoodTracks == 4){
2019 if(nSpdHits<2) continue;
2020 MeanPt = GetMedian(TrackPt);
2021 for(Int_t k=0; k<4; k++){
2022 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aod->GetTrack(TrackIndex[k]));
2023 if(!trk) AliFatal("Not a standard AOD");
2025 if(trk->Pt() > MeanPt){
2026 fRecTPCsignal[nLepton] = trk->GetTPCsignal();
2027 qLepton[nLepton] = trk->Charge();
2028 if(fRecTPCsignal[nLepton] > 40 && fRecTPCsignal[nLepton] < 70){
2029 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), muonMass);
2032 if(fRecTPCsignal[nLepton] > 70 && fRecTPCsignal[nLepton] < 100){
2033 vLepton[nLepton].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), electronMass);
2039 qPion[nPion] = trk->Charge();
2040 vPion[nPion].SetPtEtaPhiM(trk->Pt(), trk->Eta(), trk->Phi(), pionMass);
2044 if((qLepton[0]*qLepton[1] < 0) && (qPion[0]*qPion[1] < 0) && mass[0] != -1 && mass[1] != -1){
2045 vCandidate = vLepton[0]+vLepton[1]+vPion[0]+vPion[1];
2046 vDilepton = vLepton[0]+vLepton[1];
2047 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-56,2)+TMath::Power(fRecTPCsignal[1]-56,2));
2048 if (fRecTPCsignalDist < 3.6*4.0) fChannel = -1;
2050 fRecTPCsignalDist = TMath::Sqrt(TMath::Power(fRecTPCsignal[0]-78,2)+TMath::Power(fRecTPCsignal[1]-78,2));
2051 if (fRecTPCsignalDist < 4.1*4.0) fChannel = 1;
2053 if(fChannel == -1) if(vDilepton.M() > 3.0 && vDilepton.M() < 3.2 && vCandidate.Pt()<0.15) ((TH1D*)(fListPsi2sTight->At(i)))->Fill(vCandidate.M());
2054 if(fChannel == 1) if(vDilepton.M() > 2.6 && vDilepton.M() < 3.2 && vCandidate.Pt()<0.3) ((TH1D*)(fListPsi2sTight->At(i)))->Fill(vCandidate.M());