1 /**************************************************************************
2 * Copyright(c) 1998-2009, 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 **************************************************************************/
16 ////////////////////////////////////////////////////////////////////////////
17 // Class to retrieve the branch of the dielectron candidates stored in //
18 // filtered AODs file (AliAOD.Dielectron.root). It is possible to //
19 // apply tighter cuts to candidates stored in the branch and do the //
20 // matching with MC truth. //
21 ////////////////////////////////////////////////////////////////////////////
28 #include "TDatabasePDG.h"
30 #include "AliAnalysisManager.h"
31 #include "AliAODHandler.h"
32 #include "AliAODEvent.h"
33 #include "AliAODVertex.h"
34 #include "AliAODTrack.h"
35 #include "AliAODMCParticle.h"
36 #include "AliAnalysisTaskDielectronReadAODBranch.h"
37 #include "AliDielectronPair.h"
38 #include "AliDielectronMC.h"
40 ClassImp(AliAnalysisTaskDielectronReadAODBranch)
41 //________________________________________________________________________
42 AliAnalysisTaskDielectronReadAODBranch::AliAnalysisTaskDielectronReadAODBranch():
50 fpsproperSidebands(0),
73 fSpdFirstRequired(kFALSE),
77 fInvMassSignalLimits(0),
78 fInvMassSideBandsLimits(0),
81 // Default constructor
84 //________________________________________________________________________
85 AliAnalysisTaskDielectronReadAODBranch::AliAnalysisTaskDielectronReadAODBranch(const char *name):
86 AliAnalysisTaskSE(name),
93 fpsproperSidebands(0),
116 fSpdFirstRequired(kFALSE),
120 fInvMassSignalLimits(0),
121 fInvMassSideBandsLimits(0),
124 // Default constructor
125 DefineInput(0,TChain::Class());
126 DefineOutput(1,TList::Class()); //My private output
128 fInvMassSignalLimits = new Double_t[2];
129 fInvMassSignalLimits[0] = 0.; fInvMassSignalLimits[1] = 0.;
130 fInvMassSideBandsLimits = new Double_t[2];
131 fInvMassSideBandsLimits[0] = 0.; fInvMassSideBandsLimits[1] = 0.;
134 //________________________________________________________________________
135 AliAnalysisTaskDielectronReadAODBranch::~AliAnalysisTaskDielectronReadAODBranch()
137 if(fOutput) delete fOutput;
138 if(fobj) delete fobj;
139 if(fobjMC) delete fobjMC;
142 //________________________________________________________________________
143 void AliAnalysisTaskDielectronReadAODBranch::Init()
146 if(fDebug > 1) printf("AnalysisTaskReadAOD::Init() \n");
150 //________________________________________________________________________
151 void AliAnalysisTaskDielectronReadAODBranch::UserCreateOutputObjects()
154 // Create the output container
156 if(fDebug > 1) printf("AnalysisTaskReadAOD::UserCreateOutputObjects() \n");
157 fOutput = new TList();
159 //// Histogram booking
162 fInvMass = new TH1F("fInvMass","fInvMass",300,2.0,2.0+300*.04); // step 40MeV
163 fInvMassNoCuts = new TH1F("fInvMass_no_cuts","fInvMass_no_cuts",125,0,125*0.04); //step 40MeV
164 fNentries = new TH1F("numberOfevent","numbOfEvent",1,-0.5,0.5);
167 fpsproperSignal = new TH1F("psproper_decay_length",Form("psproper_decay_length_distrib(AODcuts+#clustTPC>%d, pT(leg)>%fGeV, pT(J/#psi)>%fGeV/c, %f < M < %f);X [#mu m];Entries/40#mu m",fClsTPC,fPtCut,fPtJpsi,fInvMassSignalLimits[0],fInvMassSignalLimits[1]),150,-3000.,3000.);
168 fpsproperSidebands = new TH1F("psproper_decay_length_sidebands",Form("psproper_decay_length_distrib_sidebands(AODcuts+#clustTPC>%d, pT(e+e-)>%f GeV,pT(J/#psi)>%f GeV/c,M> %f && M < %f ); X [#mu m]; Entries/40#mu m",fClsTPC,fPtCut,fPtJpsi,fInvMassSideBandsLimits[1],fInvMassSideBandsLimits[0]),150,-3000.,3000.);
169 fpsproperAll = new TH1F("psproper_decay_length_all",Form("psproper_decay_length_distrib_all(AODcuts+#clustTPC>%d, pT(e+e-)>%f GeV,pT(J/#psi)>%f GeV/c);X [#mu m];Entries/15#mu m",fClsTPC,fPtCut,fPtJpsi),400,-3000.,3000.);
170 fpsproperUnder = new TH1F("psproper_decay_length_under",Form("psproper_decay_length_distrib_under(AODcuts+#clustTPC>%d,pT(e+e-)>%f GeV,pT(J/#psi)>%f GeV/c);X [#mu m];Entries/15#mu m",fClsTPC,fPtCut,fPtJpsi),400,-3000.,3000.);
171 fpsproperUpper = new TH1F("psproper_decay_length_upper",Form("psproper_decay_length_distrib_upper(AODcuts+#clustTPC>%d,pT(e+e-)>%f GeV,pT(J/#psi)>%f GeV/c);X [#mu m];Entries/15#mu m",fClsTPC,fPtCut,fPtJpsi),400,-3000.,3000.);
173 fLxyVsPtleg1 = new TH2F("Lxy_vs_Pt_leg1",Form("Lxy_vs_Pt_leg1_distrib(AODcuts+#clustTPC>%d,pT(e+e-)>%f GeV,pT(J/#psi)>%f GeV/c,%f<M<%f);p_{T}[GeV/c]; X",fClsTPC,fPtCut,fPtJpsi,fInvMassSignalLimits[0],fInvMassSignalLimits[1]), 700, 0., 7.,400, -3000.,3000.);
174 fLxyVsPtleg2 = new TH2F("Lxy_vs_Pt_leg2",Form("Lxy_vs_Pt_leg2_distrib(AODcuts+#clustTPC>%d,pT(e+e-)>%f GeV,pT(J/#psi)>%f GeV/c,%f<M<%f);p_{T}[GeV/c]; X",fClsTPC,fPtCut,fPtJpsi,fInvMassSignalLimits[0],fInvMassSignalLimits[1]), 700, 0., 7.,400, -3000.,3000.);
175 fLxyVsPt = new TH2F("Lxy_vs_Pt_jpsi",Form("Lxy_vs_Pt_jpsi_distrib(AODcuts+#clustTPC>%d,pT(e+e-)>%f GeV,pT(J/#psi)>%f GeV/c,%f<M<%f); p_{T}[GeV/c]; X",fClsTPC,fPtCut,fPtJpsi,fInvMassSignalLimits[0],fInvMassSignalLimits[1]), 700, 0., 7.,400, -3000.,3000.);
176 fMeeVsPt = new TH2F("Mee_vs_Pt_jpsi",Form("Mee_vs_Pt_jpsi_distrib(AODcuts+#clustTPC>%d,pT(e+e-)>%f GeV,pT(J/#psi)>%f GeV/c,%f<M<%f); p_{T}[GeV/c]; M_{ee}",fClsTPC,fPtCut,fPtJpsi,fInvMassSignalLimits[0],fInvMassSignalLimits[1]), 700, 0., 7.,200, 1.99,4.1);
177 fMeeVsLxy = new TH2F("Mee_vs_Lxy_jpsi",Form("Mee_vs_Lxy_jpsi_distrib(AODcuts+#clustTPC>%d,pT(e+e-)>%f GeV),pT(J/#psi)>%f GeV/c; X; M_{ee}",fClsTPC,fPtCut,fPtJpsi), 400, -3000, 3000.,200, 1.99,4.1);
180 fprimvtxZ = new TH1F("prim_vtx_Z",Form("prim_vtx_Z_distrib(AODcuts + #clustTPC>%d, pT(e+e-)>%f GeV, pT(J/#psi)>%f); Z[cm]; Entries/20 mm",fClsTPC,fPtCut,fPtJpsi),1000,-10.,10.);
181 fsecvtxZ = new TH1F("sec_vtx_Z",Form("sec_vtx_Z_distrib(AODcuts + #clustTPC>%d, pT(e+e-)>%f GeV, pT(J/#psi)>%f); Z[cm]; Entries/20 mm",fClsTPC,fPtCut,fPtJpsi),1000,-10.,10.);
182 fprimvtxX = new TH1F("prim_vtx_X",Form("prim_vtx_X_distrib(AODcuts + #clustTPC>%d, pT(e+e-)>%f GeV,pT(J/#psi)>%f); X[cm]; Entries/mm",fClsTPC,fPtCut,fPtJpsi),1000,-0.5,0.5);
183 fsecvtxX = new TH1F("sec_vtx_X",Form("sec_vtx_X_distrib(AODcuts + #clustTPC>%d, pT(e+e-)>%f GeV,pT(J/#psi)>%f); X[cm]; Entries/20 mm",fClsTPC,fPtCut,fPtJpsi),100,-1.,1.);
184 fprimvtxY = new TH1F("prim_vtx_Y",Form("prim_vtx_Y_distrib(AODcuts + #clustTPC>%d, pT(e+e-)>%f GeV,pT(J/#psi)>%f); Y[cm]; Entries/mm",fClsTPC,fPtCut,fPtJpsi),1000,-0.5,0.5);
185 fsecvtxY = new TH1F("sec_vtx_Y",Form("sec_vtx_Y_distrib(AODcuts + #clustTPC>%d, pT(e+e-)>%f GeV,pT(J/#psi)>%f); Y[cm]; Entries/20 mm",fClsTPC,fPtCut,fPtJpsi),100,-1.,1.);
187 fPt = new TH1F("Pt(J/psi)",Form("Pt_Jpsi_distrib(AODcuts + #clustTPC>%d, pT(e+e-)>%f GeV, pT(J/#psi)>%f); p_{T}(J/#psi)[GeV/c]; Entries/25 MeV",fClsTPC,fPtCut,fPtJpsi),400,0.,10.);
188 fPtLeg1 = new TH1F("Pt_leg1",Form("Pt_leg1_distrib(AODcuts + #clustTPC>%d, pT(e+e-) > %f GeV, pT(J/#psi)>%f); p_{T}[GeV/c]; Entries/25 MeV",fClsTPC,fPtCut,fPtJpsi),400,0.,10.);
189 fPtLeg2 = new TH1F("Pt_leg2",Form("Pt_leg2_distrib(AODcuts + #clustTPC>%d, pT(e+e-) > %f GeV, pT(J/#psi)>%f); p_{T}[GeV/c]; Entries/25 MeV",fClsTPC,fPtCut,fPtJpsi),400,0.,10.);
191 fdEdxP = new TH2F("dE/dx_vs_Ptpc",Form("dE/dx_vs_Ptpc(AODcuts + #clustTPC>%d, pT(e+e-) > %f GeV, pT(J/#psi)>%f)",fClsTPC,fPtCut,fPtJpsi),400,0.2,20.,200,0.,200.);
193 //J/psi n-tuple (X and M values)
194 fNtupleJPSI = new TNtuple("fNtupleJPSI","J/#psi pseudo-proper decay time & invariant mass","Xdecaytime:Mass");
196 // add histograms to list
197 fOutput->Add(fNentries);
198 fOutput->Add(fInvMass);
199 fOutput->Add(fInvMassNoCuts);
200 fOutput->Add(fpsproperSignal);
201 fOutput->Add(fpsproperSidebands);
202 fOutput->Add(fpsproperAll);
203 fOutput->Add(fpsproperUnder);
204 fOutput->Add(fpsproperUpper);
205 fOutput->Add(fLxyVsPtleg1);
206 fOutput->Add(fLxyVsPtleg2);
207 fOutput->Add(fLxyVsPt);
208 fOutput->Add(fMeeVsPt);
209 fOutput->Add(fMeeVsLxy);
210 fOutput->Add(fprimvtxZ);
211 fOutput->Add(fsecvtxZ);
212 fOutput->Add(fprimvtxX);
213 fOutput->Add(fsecvtxX);
214 fOutput->Add(fprimvtxY);
215 fOutput->Add(fsecvtxY);
217 fOutput->Add(fPtLeg1);
218 fOutput->Add(fPtLeg2);
219 fOutput->Add(fNtupleJPSI);
220 fOutput->Add(fdEdxP);
224 //________________________________________________________________________
225 void AliAnalysisTaskDielectronReadAODBranch::UserExec(Option_t */*option*/)
227 // Execute analysis for current event:
228 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
231 Double_t vtxPrim[3] = {0.,0.,0.};
233 AliAODVertex* primvtx = aod->GetPrimaryVertex();
234 vtxPrim[0] = primvtx->GetX();
235 vtxPrim[1] = primvtx->GetY();
236 vtxPrim[2] = primvtx->GetZ();
238 AliAODHandler* aodHandler = (AliAODHandler*)((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
240 TTree *aodTree = aodHandler->GetTree();
241 if(!fobj) aodTree->SetBranchAddress("dielectrons",&fobj);
243 if(fHasMC){ aodTree->SetBranchAddress("mcparticles",&fobjMC);
244 if(!fobjMC) printf("AliAnalysisTaskDielectronReadAODBranch::UserExec: MC particles branch not found!\n"); }
247 aodTree->GetEvent(Entry());
249 // loop over candidates
251 TObjArray *objArr = (TObjArray*)fobj->UncheckedAt(fPairType);
252 for(int j=0;j<objArr->GetEntriesFast();j++)
254 AliDielectronPair *pairObj = (AliDielectronPair*)objArr->UncheckedAt(j);
255 fInvMassNoCuts->Fill(pairObj->M());
256 Double_t vtxSec[3] = {0.,0.,0.};
257 fprimvtxX->Fill(vtxPrim[0]);
258 fprimvtxY->Fill(vtxPrim[1]);
259 fprimvtxZ->Fill(vtxPrim[2]);
260 pairObj->XvYvZv(vtxSec);
261 fsecvtxX->Fill(vtxSec[0]);
262 fsecvtxY->Fill(vtxSec[1]);
263 fsecvtxZ->Fill(vtxSec[2]);
265 Double_t lxy = ((vtxSec[0]-vtxPrim[0])*(pairObj->Px()) + (vtxSec[1]-vtxPrim[1])*(pairObj->Py()))/pairObj->Pt();
266 Double_t psProperDecayLength = lxy*(TDatabasePDG::Instance()->GetParticle(443)->Mass())/pairObj->Pt();
268 AliAODTrack *trk = (AliAODTrack*)pairObj->GetFirstDaughterP();
269 AliAODTrack *trk1 = (AliAODTrack*)pairObj->GetSecondDaughterP();
270 if(!trk || !trk1) {printf("ERROR: daughter tracks not available\n"); continue;}
272 //check in case of MC analysis if candidate is a true J/psi->ee
273 if(fHasMC && ((AliDielectronMC::Instance()->IsJpsiPrimary(pairObj))!=fSecondary)) continue;
274 AliAODPid *pid = trk->GetDetPid();
275 AliAODPid *pid1 = trk1->GetDetPid();
277 if(fDebug>1) printf("No AliAODPid found\n");
281 if((trk->Pt()<fPtCut) || (trk1->Pt()<fPtCut)) continue;
284 if((pairObj->Pt())<fPtJpsi) continue;
287 if(fSpdFirstRequired)
289 if((!trk->HasPointOnITSLayer(0)) || (!trk1->HasPointOnITSLayer(0))) continue;
292 if((trk->GetTPCNcls()) <= fClsTPC || (trk1->GetTPCNcls()) <= fClsTPC) continue;
293 if(trk->Charge()==-1){
294 fPtLeg1->Fill(trk->Pt());
295 } else {fPtLeg2->Fill(trk->Pt());}
296 if(trk1->Charge()==-1){
297 fPtLeg1->Fill(trk1->Pt());
298 } else {fPtLeg2->Fill(trk1->Pt());}
299 //Fill dE/dx related plots (before PID cuts)
300 fdEdxP->Fill(pid->GetTPCmomentum(),pid->GetTPCsignal());
301 fdEdxP->Fill(pid1->GetTPCmomentum(),pid1->GetTPCsignal());
302 fInvMass->Fill(pairObj->M());
303 fPt->Fill(pairObj->Pt());
304 fMeeVsLxy->Fill(10000*psProperDecayLength,pairObj->M());
305 fMeeVsPt->Fill(pairObj->Pt(),pairObj->M());
306 fpsproperAll->Fill(10000*psProperDecayLength);
308 //psproper in the signal region
309 if((pairObj->M())<fInvMassSignalLimits[1] && (pairObj->M())>fInvMassSignalLimits[0]){
310 fpsproperSignal->Fill(10000*psProperDecayLength);
311 fLxyVsPt->Fill(pairObj->Pt(),10000*psProperDecayLength); //jpsi
312 fLxyVsPtleg1->Fill(trk->Pt(),10000*psProperDecayLength); //leg1 (warning: mixture of pos and neg tracks)
313 fLxyVsPtleg2->Fill(trk1->Pt(),10000*psProperDecayLength); //leg2 (warning: mixture of pos and neg tracks)
314 fNtupleJPSI->Fill(10000*psProperDecayLength,pairObj->M()); // fill the N-tuple (imput of the minimization algorithm)
317 // psproper in the sidebands
318 if((pairObj->M())> fInvMassSideBandsLimits[1] || (pairObj->M())< fInvMassSideBandsLimits[0])
319 fpsproperSidebands->Fill(10000*psProperDecayLength);
321 // psproper in the lower sideband
322 if(pairObj->M()< fInvMassSideBandsLimits[0]) fpsproperUnder->Fill(10000*psProperDecayLength);
324 // psproper in the upper sideband
325 if(pairObj->M()> fInvMassSideBandsLimits[1]) fpsproperUpper->Fill(10000*psProperDecayLength);
326 } // end loop over candidates
327 }// end loop over pair types
333 //________________________________________________________________________
334 void AliAnalysisTaskDielectronReadAODBranch::Terminate(Option_t */*option*/)
336 if(fDebug > 1) printf("AliAnalysisTaskDielectronReadAODBranch::Terminate() \n");