1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 //_________________________________________________________________________
18 // Class for track selection and identification (not done now)
19 // Tracks from the CTS are kept in the AOD.
20 // Few histograms produced.
22 //-- Author: Gustavo Conesa (INFN-LNF)
23 //_________________________________________________________________________
26 // --- ROOT system ---
27 #include "TParticle.h"
29 #include "TDatabasePDG.h"
31 //---- AliRoot system ----
32 #include "AliAnaChargedParticles.h"
33 #include "AliCaloTrackReader.h"
34 #include "AliAODPWG4Particle.h"
36 #include "AliFiducialCut.h"
37 #include "AliVTrack.h"
38 #include "AliAODMCParticle.h"
39 #include "AliAODTrack.h"
40 #include "AliAODEvent.h"
41 #include "AliESDEvent.h"
43 ClassImp(AliAnaChargedParticles)
45 //__________________________________________________
46 AliAnaChargedParticles::AliAnaChargedParticles() :
47 AliAnaCaloTrackCorrBaseClass(),
48 fFillPileUpHistograms(0), fFillTrackBCHistograms(0),
49 fFillVertexBC0Histograms(0),
51 fhNtracks(0), fhPt(0), fhPtNoCut(0),
52 fhPtCutDCA(0), fhPtCutDCABCOK(0),
53 fhPhiNeg(0), fhEtaNeg(0),
54 fhPhiPos(0), fhEtaPos(0),
55 fhEtaPhiPos(0), fhEtaPhiNeg(0),
56 fhPtVtxOutBC0(0), fhEtaPhiVtxOutBC0(0),
57 fhPtVtxInBC0(0), fhEtaPhiVtxInBC0(0),
58 fhPtSPDRefit(0), fhPtNoSPDRefit(0), fhPtNoSPDNoRefit(0),
59 fhEtaPhiSPDRefitPt02(0), fhEtaPhiNoSPDRefitPt02(0), fhEtaPhiNoSPDNoRefitPt02(0),
60 fhEtaPhiSPDRefitPt3(0), fhEtaPhiNoSPDRefitPt3(0), fhEtaPhiNoSPDNoRefitPt3(0),
63 fhTOFSignal(0), fhTOFSignalPtCut(0), fhTOFSignalBCOK(0),
64 fhPtTOFSignal(0), fhPtTOFSignalDCACut(0),
65 fhPtTOFSignalVtxOutBC0(0), fhPtTOFSignalVtxInBC0(0),
66 fhPtTOFStatus0(0), fhEtaPhiTOFStatus0(0),
67 fhEtaPhiTOFBC0(0), fhEtaPhiTOFBCPlus(0), fhEtaPhiTOFBCMinus(0),
68 fhEtaPhiTOFBC0PileUpSPD(0),
69 fhEtaPhiTOFBCPlusPileUpSPD(0),
70 fhEtaPhiTOFBCMinusPileUpSPD(0),
71 fhProductionVertexBC(0),
72 fhPtNPileUpSPDVtx(0), fhPtNPileUpTrkVtx(0),
73 fhPtNPileUpSPDVtxBC0(0), fhPtNPileUpTrkVtxBC0(0)
78 for(Int_t i = 0; i < 7; i++)
81 fhPtTOFSignalPileUp[i] = 0;
82 fhPtTOFSignalVtxOutBC0PileUp[i] = 0;
83 fhPtTOFSignalVtxInBC0PileUp [i] = 0;
84 fhProductionVertexBCPileUp [i] = 0;
87 for(Int_t i = 0; i < 3; i++)
91 fhPtDCASPDRefit [i] = 0 ;
92 fhPtDCANoSPDRefit [i] = 0 ;
93 fhPtDCANoSPDNoRefit [i] = 0 ;
95 fhPtDCAPileUp [i] = 0 ;
96 fhPtDCATOFBC0 [i] = 0 ;
97 fhPtDCATOFBCOut [i] = 0 ;
98 fhPtDCAPileUpTOFBC0 [i] = 0 ;
99 fhPtDCANoTOFHit [i] = 0 ;
100 fhPtDCAPileUpNoTOFHit [i] = 0 ;
102 fhPtDCAVtxOutBC0 [i] = 0 ;
103 fhPtDCAVtxInBC0 [i] = 0 ;
104 fhPtDCAVtxOutBC0PileUp[i] = 0 ;
105 fhPtDCAVtxInBC0PileUp [i] = 0 ;
106 fhPtDCAVtxOutBC0NoTOFHit[i] = 0 ;
107 fhPtDCAVtxInBC0NoTOFHit [i] = 0 ;
108 fhPtDCAVtxOutBC0PileUpNoTOFHit[i] = 0 ;
109 fhPtDCAVtxInBC0PileUpNoTOFHit [i] = 0 ;
113 for(Int_t imcPart = 0; imcPart < 6; imcPart++)
115 fhPtMCPart [imcPart] = 0;
116 fhPtMCPrimPart [imcPart] = 0;
117 fhPhiMCPart [imcPart] = 0;
118 fhPhiMCPrimPart[imcPart] = 0;
119 fhEtaMCPart [imcPart] = 0;
120 fhEtaMCPrimPart[imcPart] = 0;
123 //Initialize parameters
128 //__________________________________________________
129 void AliAnaChargedParticles::FillPrimaryHistograms()
131 // Fill primary generated particles histograms if MC data is available
136 TParticle * primStack = 0;
137 AliAODMCParticle * primAOD = 0;
140 // Get the ESD MC particles container
141 AliStack * stack = 0;
142 if( GetReader()->ReadStack() )
144 stack = GetMCStack();
146 nprim = stack->GetNtrack();
149 // Get the AOD MC particles container
150 TClonesArray * mcparticles = 0;
151 if( GetReader()->ReadAODMCParticles() )
153 mcparticles = GetReader()->GetAODMCParticles();
154 if( !mcparticles ) return;
155 nprim = mcparticles->GetEntriesFast();
158 for(Int_t i=0 ; i < nprim; i++)
160 if(GetReader()->AcceptOnlyHIJINGLabels() && !GetReader()->IsHIJINGLabel(i)) continue ;
162 if(GetReader()->ReadStack())
164 primStack = stack->Particle(i) ;
167 printf("AliAnaChargedParticles::FillPrimaryMCHistograms() - ESD primaries pointer not available!!\n");
171 if( primStack->GetStatusCode() != 1 ) continue;
173 Int_t charge = (Int_t )TDatabasePDG::Instance()->GetParticle(primStack->GetPdgCode())->Charge();
174 if( TMath::Abs(charge) == 0 ) continue;
176 pdg = TMath::Abs(primStack->GetPdgCode());
178 if(primStack->Energy() == TMath::Abs(primStack->Pz())) continue ; //Protection against floating point exception
180 //printf("i %d, %s %d %s %d \n",i, stack->Particle(i)->GetName(), stack->Particle(i)->GetPdgCode(),
181 // prim->GetName(), prim->GetPdgCode());
184 primStack->Momentum(lv);
188 primAOD = (AliAODMCParticle *) mcparticles->At(i);
191 printf("AliAnaChargedParticles::FillPrimaryHistograms() - AOD primaries pointer not available!!\n");
195 if( primAOD->GetStatus() != 1 ) continue;
197 if(TMath::Abs(primAOD->Charge()) == 0 ) continue;
199 pdg = TMath::Abs(primAOD->GetPdgCode());
201 if(primAOD->E() == TMath::Abs(primAOD->Pz())) continue ; //Protection against floating point exception
204 lv.SetPxPyPzE(primAOD->Px(),primAOD->Py(),primAOD->Pz(),primAOD->E());
207 Int_t mcType = kmcUnknown;
208 if (pdg==211 ) mcType = kmcPion;
209 else if(pdg==2212) mcType = kmcProton;
210 else if(pdg==321 ) mcType = kmcKaon;
211 else if(pdg==11 ) mcType = kmcElectron;
212 else if(pdg==13 ) mcType = kmcMuon;
214 //printf("pdg %d, charge %f, mctype %d\n",pdg, charge, mcType);
216 Bool_t in = GetFiducialCut()->IsInFiducialCut(lv,"CTS") ;
218 Float_t ptPrim = lv.Pt();
219 Float_t etaPrim = lv.Eta();
220 Float_t phiPrim = lv.Phi();
221 if(phiPrim < 0) phiPrim+=TMath::TwoPi();
224 fhPtMCPrimPart[mcType]->Fill(ptPrim);
225 fhEtaMCPrimPart[mcType]->Fill(ptPrim,etaPrim);
226 fhPhiMCPrimPart[mcType]->Fill(ptPrim,phiPrim);
230 //_______________________________________________________
231 TList * AliAnaChargedParticles::GetCreateOutputObjects()
233 // Create histograms to be saved in output file and
234 // store them in fOutputContainer
237 TList * outputContainer = new TList() ;
238 outputContainer->SetName("ChargedParticleHistos") ;
240 Int_t nptbins = GetHistogramRanges()->GetHistoPtBins(); Int_t nphibins = GetHistogramRanges()->GetHistoPhiBins(); Int_t netabins = GetHistogramRanges()->GetHistoEtaBins();
241 Float_t ptmax = GetHistogramRanges()->GetHistoPtMax(); Float_t phimax = GetHistogramRanges()->GetHistoPhiMax(); Float_t etamax = GetHistogramRanges()->GetHistoEtaMax();
242 Float_t ptmin = GetHistogramRanges()->GetHistoPtMin(); Float_t phimin = GetHistogramRanges()->GetHistoPhiMin(); Float_t etamin = GetHistogramRanges()->GetHistoEtaMin();
244 fhNtracks = new TH1F ("hNtracks","# of tracks", 1000,0,1000);
245 fhNtracks->SetXTitle("# of tracks");
246 outputContainer->Add(fhNtracks);
248 fhPt = new TH1F ("hPt","#it{p}_{T} distribution", nptbins,ptmin,ptmax);
249 fhPt->SetXTitle("#it{p}_{T} (GeV/#it{c})");
250 outputContainer->Add(fhPt);
252 fhPtNoCut = new TH1F ("hPtNoCut","#it{p}_{T} distribution, raw tracks", nptbins,ptmin,ptmax);
253 fhPtNoCut->SetXTitle("#it{p}_{T} (GeV/#it{c})");
254 outputContainer->Add(fhPtNoCut);
256 if(!GetReader()->IsDCACutOn())
258 fhPtCutDCA = new TH1F ("hPtCutDCA","#it{p}_{T} distribution, cut DCA", nptbins,ptmin,ptmax);
259 fhPtCutDCA->SetXTitle("#it{p}_{T} (GeV/#it{c})");
260 outputContainer->Add(fhPtCutDCA);
263 if(fFillVertexBC0Histograms && !GetReader()->IsDCACutOn())
265 fhPtCutDCABCOK = new TH1F ("hPtCutDCABCOK","#it{p}_{T} distribution, DCA cut, track BC=0 or -100", nptbins,ptmin,ptmax);
266 fhPtCutDCABCOK->SetXTitle("#it{p}_{T} (GeV/#it{c})");
267 outputContainer->Add(fhPtCutDCABCOK);
270 fhPhiNeg = new TH2F ("hPhiNegative","#phi of negative charges distribution",
271 nptbins,ptmin,ptmax, nphibins,phimin,phimax);
272 fhPhiNeg->SetYTitle("#phi (rad)");
273 fhPhiNeg->SetXTitle("#it{p}_{T} (GeV/#it{c})");
274 outputContainer->Add(fhPhiNeg);
276 fhEtaNeg = new TH2F ("hEtaNegative","#eta of negative charges distribution",
277 nptbins,ptmin,ptmax, netabins,etamin,etamax);
278 fhEtaNeg->SetYTitle("#eta ");
279 fhEtaNeg->SetXTitle("#it{p}_{T} (GeV/#it{c})");
280 outputContainer->Add(fhEtaNeg);
282 fhPhiPos = new TH2F ("hPhiPositive","#phi of positive charges distribution",
283 nptbins,ptmin,ptmax, nphibins,phimin,phimax);
284 fhPhiPos->SetYTitle("#phi (rad)");
285 fhPhiPos->SetXTitle("#it{p}_{T} (GeV/#it{c})");
286 outputContainer->Add(fhPhiPos);
288 fhEtaPos = new TH2F ("hEtaPositive","#eta of positive charges distribution",
289 nptbins,ptmin,ptmax, netabins,etamin,etamax);
290 fhEtaPos->SetYTitle("#eta ");
291 fhEtaPos->SetXTitle("#it{p}_{T} (GeV/#it{c})");
292 outputContainer->Add(fhEtaPos);
294 fhEtaPhiPos = new TH2F ("hEtaPhiPositive","pt/eta/phi of positive charge",netabins,etamin,etamax, nphibins,phimin,phimax);
295 fhEtaPhiPos->SetXTitle("#eta ");
296 fhEtaPhiPos->SetYTitle("#phi (rad)");
297 outputContainer->Add(fhEtaPhiPos);
299 fhEtaPhiNeg = new TH2F ("hEtaPhiNegative","#eta vs #phi of negative charge",netabins,etamin,etamax, nphibins,phimin,phimax);
300 fhEtaPhiNeg->SetXTitle("#eta ");
301 fhEtaPhiNeg->SetYTitle("#phi (rad)");
302 outputContainer->Add(fhEtaPhiNeg);
304 if(fFillVertexBC0Histograms)
306 fhPtVtxOutBC0 = new TH1F ("hPtVtxOutBC0","#it{p}_{T} distribution, vertex in BC=0", nptbins,ptmin,ptmax);
307 fhPtVtxOutBC0->SetXTitle("#it{p}_{T} (GeV/#it{c})");
308 outputContainer->Add(fhPtVtxOutBC0);
310 fhEtaPhiVtxOutBC0 = new TH2F ("hEtaPhiVtxOutBC0","#eta vs #phi of all charges with vertex in BC=0",netabins,etamin,etamax, nphibins,phimin,phimax);
311 fhEtaPhiVtxOutBC0->SetXTitle("#eta ");
312 fhEtaPhiVtxOutBC0->SetYTitle("#phi (rad)");
313 outputContainer->Add(fhEtaPhiVtxOutBC0);
315 fhPtVtxInBC0 = new TH1F ("hPtVtxInBC0","#it{p}_{T} distribution, vertex in BC=0", nptbins,ptmin,ptmax);
316 fhPtVtxInBC0->SetXTitle("#it{p}_{T} (GeV/#it{c})");
317 outputContainer->Add(fhPtVtxInBC0);
319 fhEtaPhiVtxInBC0 = new TH2F ("hEtaPhiVtxInBC0","#eta vs #phi of all charges with vertex in BC=0",netabins,etamin,etamax, nphibins,phimin,phimax);
320 fhEtaPhiVtxInBC0->SetXTitle("#eta ");
321 fhEtaPhiVtxInBC0->SetYTitle("#phi (rad)");
322 outputContainer->Add(fhEtaPhiVtxInBC0);
325 fhPtSPDRefit = new TH1F ("hPtSPDRefit","#it{p}_{T} distribution of tracks with SPD and ITS refit", nptbins,ptmin,ptmax);
326 fhPtSPDRefit->SetXTitle("#it{p}_{T} (GeV/#it{c})");
327 outputContainer->Add(fhPtSPDRefit);
329 fhEtaPhiSPDRefitPt02 = new TH2F ("hEtaPhiSPDRefitPt02","#eta vs #phi of tracks with SPD and ITS refit, #it{p}_{T}< 2 GeV/#it{c}",
330 netabins,etamin,etamax, nphibins,phimin,phimax);
331 fhEtaPhiSPDRefitPt02->SetXTitle("#eta ");
332 fhEtaPhiSPDRefitPt02->SetYTitle("#phi (rad)");
333 outputContainer->Add(fhEtaPhiSPDRefitPt02);
335 fhEtaPhiSPDRefitPt3 = new TH2F ("hEtaPhiSPDRefitPt3","#eta vs #phi of tracks with SPD and ITS refit, #it{p}_{T}> 3 GeV/#it{c}",
336 netabins,etamin,etamax, nphibins,phimin,phimax);
337 fhEtaPhiSPDRefitPt3->SetXTitle("#eta ");
338 fhEtaPhiSPDRefitPt3->SetYTitle("#phi (rad)");
339 outputContainer->Add(fhEtaPhiSPDRefitPt3);
341 fhPtNoSPDRefit = new TH1F ("hPtNoSPDRefit","#it{p}_{T} distribution of constrained tracks no SPD and with ITSRefit",
342 nptbins,ptmin,ptmax);
343 fhPtNoSPDRefit->SetXTitle("#it{p}_{T} (GeV/#it{c})");
344 outputContainer->Add(fhPtNoSPDRefit);
346 fhEtaPhiNoSPDRefitPt02 = new TH2F ("hEtaPhiNoSPDRefitPt02","#eta vs #phi of constrained tracks no SPD and with ITSRefit, #it{p}_{T}< 2 GeV/#it{c}",
347 netabins,etamin,etamax, nphibins,phimin,phimax);
348 fhEtaPhiNoSPDRefitPt02->SetXTitle("#eta ");
349 fhEtaPhiNoSPDRefitPt02->SetYTitle("#phi (rad)");
350 outputContainer->Add(fhEtaPhiNoSPDRefitPt02);
352 fhEtaPhiNoSPDRefitPt3 = new TH2F ("hEtaPhiNoSPDRefitPt3","#eta vs #phi of of constrained tracks no SPD and with ITSRefit, #it{p}_{T}> 3 GeV/#it{c}",
353 netabins,etamin,etamax, nphibins,phimin,phimax);
354 fhEtaPhiNoSPDRefitPt3->SetXTitle("#eta ");
355 fhEtaPhiNoSPDRefitPt3->SetYTitle("#phi (rad)");
356 outputContainer->Add(fhEtaPhiNoSPDRefitPt3);
358 fhPtNoSPDNoRefit = new TH1F ("hPtNoSPDNoRefit","#it{p}_{T} distribution of constrained tracks with no SPD requierement and without ITSRefit",
359 nptbins,ptmin,ptmax);
360 fhPtNoSPDNoRefit->SetXTitle("#it{p}_{T} (GeV/#it{c})");
361 outputContainer->Add(fhPtNoSPDNoRefit);
363 fhEtaPhiNoSPDNoRefitPt02 = new TH2F ("hEtaPhiNoSPDNoRefitPt02",
364 "#eta vs #phi of constrained tracks with no SPD requierement and without ITSRefit, #it{p}_{T}< 2 GeV/#it{c}",
365 netabins,etamin,etamax, nphibins,phimin,phimax);
366 fhEtaPhiNoSPDNoRefitPt02->SetXTitle("#eta ");
367 fhEtaPhiNoSPDNoRefitPt02->SetYTitle("#phi (rad)");
368 outputContainer->Add(fhEtaPhiNoSPDNoRefitPt02);
370 fhEtaPhiNoSPDNoRefitPt3 = new TH2F ("hEtaPhiNoSPDNoRefitPt3",
371 "#eta vs #phi of constrained tracks with no SPD requierement and without ITSRefit, #it{p}_{T}> 3 GeV/#it{c}",
372 netabins,etamin,etamax, nphibins,phimin,phimax);
373 fhEtaPhiNoSPDNoRefitPt3->SetXTitle("#eta ");
374 fhEtaPhiNoSPDNoRefitPt3->SetYTitle("#phi (rad)");
375 outputContainer->Add(fhEtaPhiNoSPDNoRefitPt3);
377 if(fFillVertexBC0Histograms)
379 fhProductionVertexBC = new TH1F("hProductionVertexBC", "tracks production vertex bunch crossing ", 41 , -20 , 20 ) ;
380 fhProductionVertexBC->SetYTitle("# tracks");
381 fhProductionVertexBC->SetXTitle("Bunch crossing");
382 outputContainer->Add(fhProductionVertexBC);
385 Int_t ntofbins = 1000;
389 fhTOFSignal = new TH1F ("hTOFSignal","TOF signal", ntofbins,mintof,maxtof);
390 fhTOFSignal->SetXTitle("TOF signal (ns)");
391 outputContainer->Add(fhTOFSignal);
393 if(fFillTrackBCHistograms)
395 fhTOFSignalBCOK = new TH1F ("hTOFSignalBCOK","TOF signal", ntofbins,mintof,maxtof);
396 fhTOFSignalBCOK->SetXTitle("TOF signal (ns)");
397 outputContainer->Add(fhTOFSignalBCOK);
400 fhTOFSignalPtCut = new TH1F ("hTOFSignalPtCut","TOF signal", ntofbins,mintof,maxtof);
401 fhTOFSignalPtCut->SetXTitle("TOF signal (ns)");
402 outputContainer->Add(fhTOFSignalPtCut);
404 fhPtTOFSignal = new TH2F ("hPtTOFSignal","TOF signal", nptbins,ptmin,ptmax,ntofbins,mintof,maxtof);
405 fhPtTOFSignal->SetYTitle("TOF signal (ns)");
406 fhPtTOFSignal->SetXTitle("#it{p}_{T} (GeV/#it{c})");
407 outputContainer->Add(fhPtTOFSignal);
409 if(!GetReader()->IsDCACutOn())
411 fhPtTOFSignalDCACut = new TH2F ("hPtTOFSignalDCACut","TOF signal after DCA cut", nptbins,ptmin,ptmax,ntofbins,mintof,maxtof);
412 fhPtTOFSignalDCACut->SetYTitle("TOF signal (ns)");
413 fhPtTOFSignalDCACut->SetXTitle("#it{p}_{T} (GeV/#it{c})");
414 outputContainer->Add(fhPtTOFSignalDCACut);
417 if(fFillVertexBC0Histograms)
419 fhPtTOFSignalVtxOutBC0 = new TH2F ("hPtTOFSignalVtxOutBC0","TOF signal, vtx BC!=0", nptbins,ptmin,ptmax,ntofbins,mintof,maxtof);
420 fhPtTOFSignalVtxOutBC0->SetYTitle("TOF signal (ns)");
421 fhPtTOFSignalVtxOutBC0->SetXTitle("#it{p}_{T} (GeV/#it{c})");
422 outputContainer->Add(fhPtTOFSignalVtxOutBC0);
424 fhPtTOFSignalVtxInBC0 = new TH2F ("hPtTOFSignalVtxInBC0","TOF signal, vtx BC=0", nptbins,ptmin,ptmax,ntofbins,mintof,maxtof);
425 fhPtTOFSignalVtxInBC0->SetYTitle("TOF signal (ns)");
426 fhPtTOFSignalVtxInBC0->SetXTitle("#it{p}_{T} (GeV/#it{c})");
427 outputContainer->Add(fhPtTOFSignalVtxInBC0);
430 if(fFillPileUpHistograms)
432 TString pileUpName[] = {"SPD","EMCAL","SPDOrEMCAL","SPDAndEMCAL","SPDAndNotEMCAL","EMCALAndNotSPD","NotSPDAndNotEMCAL"} ;
434 for(Int_t i = 0 ; i < 7 ; i++)
436 fhPtPileUp[i] = new TH1F(Form("hPtPileUp%s",pileUpName[i].Data()),
437 Form("Track #it{p}_{T}distribution, %s Pile-Up event",pileUpName[i].Data()),
438 nptbins,ptmin,ptmax);
439 fhPtPileUp[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
440 outputContainer->Add(fhPtPileUp[i]);
442 fhPtTOFSignalPileUp[i] = new TH2F(Form("hPtTOFSignalPileUp%s",pileUpName[i].Data()),
443 Form("Track TOF vs #it{p}_{T}distribution, %s Pile-Up event",pileUpName[i].Data()),
444 nptbins,ptmin,ptmax,ntofbins,mintof,maxtof);
445 fhPtTOFSignalPileUp[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
446 fhPtTOFSignalPileUp[i]->SetXTitle("TOF signal (ns)");
447 outputContainer->Add(fhPtTOFSignalPileUp[i]);
449 if(fFillVertexBC0Histograms)
451 fhPtTOFSignalVtxOutBC0PileUp[i] = new TH2F(Form("hPtTOFSignalVtxOutBC0PileUp%s",pileUpName[i].Data()),
452 Form("Track TOF vs #it{p}_{T}distribution, %s Pile-Up event, vtx BC!=0",pileUpName[i].Data()),
453 nptbins,ptmin,ptmax,ntofbins,mintof,maxtof);
454 fhPtTOFSignalVtxOutBC0PileUp[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
455 fhPtTOFSignalVtxOutBC0PileUp[i]->SetXTitle("TOF signal (ns)");
456 outputContainer->Add(fhPtTOFSignalVtxOutBC0PileUp[i]);
458 fhPtTOFSignalVtxInBC0PileUp[i] = new TH2F(Form("hPtTOFSignalVtxInBC0PileUp%s",pileUpName[i].Data()),
459 Form("Track TOF vs #it{p}_{T}distribution, %s Pile-Up event, vtx BC=0",pileUpName[i].Data()),
460 nptbins,ptmin,ptmax,ntofbins,mintof,maxtof);
461 fhPtTOFSignalVtxInBC0PileUp[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
462 fhPtTOFSignalVtxInBC0PileUp[i]->SetXTitle("TOF signal (ns)");
463 outputContainer->Add(fhPtTOFSignalVtxInBC0PileUp[i]);
466 if(fFillVertexBC0Histograms)
468 fhProductionVertexBCPileUp[i] = new TH1F(Form("hProductionVertexBCPileUp%s",pileUpName[i].Data()),
469 Form("tracks production vertex bunch crossing, %s Pile-Up event",pileUpName[i].Data()),
471 fhProductionVertexBCPileUp[i]->SetYTitle("# tracks");
472 fhProductionVertexBCPileUp[i]->SetXTitle("Bunch crossing");
473 outputContainer->Add(fhProductionVertexBCPileUp[i]);
478 if(fFillTrackBCHistograms)
480 fhEtaPhiTOFBC0 = new TH2F ("hEtaPhiTOFBC0","eta-phi for tracks with hit on TOF, and tof corresponding to BC=0",netabins,etamin,etamax, nphibins,phimin,phimax);
481 fhEtaPhiTOFBC0->SetXTitle("#eta ");
482 fhEtaPhiTOFBC0->SetYTitle("#phi (rad)");
483 outputContainer->Add(fhEtaPhiTOFBC0);
485 fhEtaPhiTOFBCPlus = new TH2F ("hEtaPhiTOFBCPlus","eta-phi for tracks with hit on TOF, and tof corresponding to BC>0",netabins,etamin,etamax, nphibins,phimin,phimax);
486 fhEtaPhiTOFBCPlus->SetXTitle("#eta ");
487 fhEtaPhiTOFBCPlus->SetYTitle("#phi (rad)");
488 outputContainer->Add(fhEtaPhiTOFBCPlus);
490 fhEtaPhiTOFBCMinus = new TH2F ("hEtaPhiTOFBCMinus","eta-phi for tracks with hit on TOF, and tof corresponding to BC<0",netabins,etamin,etamax, nphibins,phimin,phimax);
491 fhEtaPhiTOFBCMinus->SetXTitle("#eta ");
492 fhEtaPhiTOFBCMinus->SetYTitle("#phi (rad)");
493 outputContainer->Add(fhEtaPhiTOFBCMinus);
495 if(fFillPileUpHistograms)
497 fhEtaPhiTOFBC0PileUpSPD = new TH2F ("hEtaPhiTOFBC0PileUpSPD","eta-phi for tracks with hit on TOF, and tof corresponding to BC=0, SPD pile-up",netabins,etamin,etamax, nphibins,phimin,phimax);
498 fhEtaPhiTOFBC0PileUpSPD->SetXTitle("#eta ");
499 fhEtaPhiTOFBC0PileUpSPD->SetYTitle("#phi (rad)");
500 outputContainer->Add(fhEtaPhiTOFBC0PileUpSPD);
502 fhEtaPhiTOFBCPlusPileUpSPD = new TH2F ("hEtaPhiTOFBCPlusPileUpSPD","eta-phi for tracks with hit on TOF, and tof corresponding to BC>0, SPD pile-up",netabins,etamin,etamax, nphibins,phimin,phimax);
503 fhEtaPhiTOFBCPlusPileUpSPD->SetXTitle("#eta ");
504 fhEtaPhiTOFBCPlusPileUpSPD->SetYTitle("#phi (rad)");
505 outputContainer->Add(fhEtaPhiTOFBCPlusPileUpSPD);
507 fhEtaPhiTOFBCMinusPileUpSPD = new TH2F ("hEtaPhiTOFBCMinusPileUpSPD","eta-phi for tracks with hit on TOF, and tof corresponding to BC<0, SPD pile-up",netabins,etamin,etamax, nphibins,phimin,phimax);
508 fhEtaPhiTOFBCMinusPileUpSPD->SetXTitle("#eta ");
509 fhEtaPhiTOFBCMinusPileUpSPD->SetYTitle("#phi (rad)");
510 outputContainer->Add(fhEtaPhiTOFBCMinusPileUpSPD);
516 fhPtTOFStatus0 = new TH1F ("hPtTOFStatus0","#it{p}_{T} distribution of tracks not hitting TOF", nptbins,ptmin,ptmax);
517 fhPtTOFStatus0->SetXTitle("#it{p}_{T} (GeV/#it{c})");
518 outputContainer->Add(fhPtTOFStatus0);
521 fhEtaPhiTOFStatus0 = new TH2F ("hEtaPhiTOFStatus0","eta-phi for tracks without hit on TOF",netabins,etamin,etamax, nphibins,phimin,phimax);
522 fhEtaPhiTOFStatus0->SetXTitle("#eta ");
523 fhEtaPhiTOFStatus0->SetYTitle("#phi (rad)");
524 outputContainer->Add(fhEtaPhiTOFStatus0);
526 TString dcaName[] = {"xy","z","Cons"} ;
527 Int_t ndcabins = 800;
531 for(Int_t i = 0 ; i < 3 ; i++)
534 fhPtDCA[i] = new TH2F(Form("hPtDCA%s",dcaName[i].Data()),
535 Form("Track DCA%s vs #it{p}_{T}distribution",dcaName[i].Data()),
536 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
537 fhPtDCA[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
538 fhPtDCA[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
539 outputContainer->Add(fhPtDCA[i]);
541 fhPtDCASPDRefit[i] = new TH2F(Form("hPtDCA%sSPDRefit",dcaName[i].Data()),
542 Form("Track DCA%s vs #it{p}_{T}distribution of tracks with SPD and ITS refit",dcaName[i].Data()),
543 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
544 fhPtDCASPDRefit[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
545 fhPtDCASPDRefit[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
546 outputContainer->Add(fhPtDCASPDRefit[i]);
548 fhPtDCANoSPDRefit[i] = new TH2F(Form("hPtDCA%sNoSPDRefit",dcaName[i].Data()),
549 Form("Track DCA%s vs #it{p}_{T}distributionof constrained tracks no SPD and with ITSRefit",dcaName[i].Data()),
550 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
551 fhPtDCANoSPDRefit[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
552 fhPtDCANoSPDRefit[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
553 outputContainer->Add(fhPtDCANoSPDRefit[i]);
555 fhPtDCANoSPDNoRefit[i] = new TH2F(Form("hPtDCA%sNoSPDNoRefit",dcaName[i].Data()),
556 Form("Track DCA%s vs #it{p}_{T}distribution, constrained tracks with no SPD requierement and without ITSRefit",dcaName[i].Data()),
557 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
558 fhPtDCANoSPDNoRefit[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
559 fhPtDCANoSPDNoRefit[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
560 outputContainer->Add(fhPtDCANoSPDNoRefit[i]);
562 if(fFillTrackBCHistograms)
564 fhPtDCATOFBC0[i] = new TH2F(Form("hPtDCA%sTOFBC0",dcaName[i].Data()),
565 Form("Track DCA%s vs #it{p}_{T}distribution, BC=0",dcaName[i].Data()),
566 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
567 fhPtDCATOFBC0[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
568 fhPtDCATOFBC0[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
569 outputContainer->Add(fhPtDCATOFBC0[i]);
571 fhPtDCATOFBCOut[i] = new TH2F(Form("hPtDCA%sTOFBCOut",dcaName[i].Data()),
572 Form("Track DCA%s vs #it{p}_{T}distribution, BC!=0",dcaName[i].Data()),
573 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
574 fhPtDCATOFBCOut[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
575 fhPtDCATOFBCOut[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
576 outputContainer->Add(fhPtDCATOFBCOut[i]);
579 fhPtDCANoTOFHit[i] = new TH2F(Form("hPtDCA%sNoTOFHit",dcaName[i].Data()),
580 Form("Track (no TOF hit) DCA%s vs #it{p}_{T}distribution",dcaName[i].Data()),
581 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
582 fhPtDCANoTOFHit[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
583 fhPtDCANoTOFHit[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
584 outputContainer->Add(fhPtDCANoTOFHit[i]);
586 if(fFillVertexBC0Histograms)
588 fhPtDCAVtxOutBC0[i] = new TH2F(Form("hPtDCA%sVtxOutBC0",dcaName[i].Data()),
589 Form("Track DCA%s vs #it{p}_{T}distribution, vertex with BC!=0",dcaName[i].Data()),
590 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
591 fhPtDCAVtxOutBC0[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
592 fhPtDCAVtxOutBC0[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
593 outputContainer->Add(fhPtDCAVtxOutBC0[i]);
595 fhPtDCAVtxOutBC0NoTOFHit[i] = new TH2F(Form("hPtDCA%sVtxOutBC0NoTOFHit",dcaName[i].Data()),
596 Form("Track (no TOF hit) DCA%s vs #it{p}_{T}distribution, vertex with BC!=0",dcaName[i].Data()),
597 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
598 fhPtDCAVtxOutBC0NoTOFHit[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
599 fhPtDCAVtxOutBC0NoTOFHit[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
600 outputContainer->Add(fhPtDCAVtxOutBC0NoTOFHit[i]);
602 fhPtDCAVtxInBC0[i] = new TH2F(Form("hPtDCA%sVtxInBC0",dcaName[i].Data()),
603 Form("Track DCA%s vs #it{p}_{T}distribution, vertex with BC==0",dcaName[i].Data()),
604 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
605 fhPtDCAVtxInBC0[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
606 fhPtDCAVtxInBC0[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
607 outputContainer->Add(fhPtDCAVtxInBC0[i]);
609 fhPtDCAVtxInBC0NoTOFHit[i] = new TH2F(Form("hPtDCA%sVtxInBC0NoTOFHit",dcaName[i].Data()),
610 Form("Track (no TOF hit) DCA%s vs #it{p}_{T}distribution, vertex with BC==0",dcaName[i].Data()),
611 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
612 fhPtDCAVtxInBC0NoTOFHit[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
613 fhPtDCAVtxInBC0NoTOFHit[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
614 outputContainer->Add(fhPtDCAVtxInBC0NoTOFHit[i]);
617 if(fFillPileUpHistograms)
619 fhPtDCAPileUp[i] = new TH2F(Form("hPtDCA%sPileUp",dcaName[i].Data()),
620 Form("Track DCA%s vs #it{p}_{T}distribution, SPD Pile-Up",dcaName[i].Data()),
621 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
622 fhPtDCAPileUp[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
623 fhPtDCAPileUp[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
624 outputContainer->Add(fhPtDCAPileUp[i]);
626 if(fFillTrackBCHistograms)
628 fhPtDCAPileUpTOFBC0[i] = new TH2F(Form("hPtDCA%sPileUpTOFBC0",dcaName[i].Data()),
629 Form("Track DCA%s vs #it{p}_{T}distribution",dcaName[i].Data()),
630 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
631 fhPtDCAPileUpTOFBC0[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
632 fhPtDCAPileUpTOFBC0[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
633 outputContainer->Add(fhPtDCAPileUpTOFBC0[i]);
636 fhPtDCAPileUpNoTOFHit[i] = new TH2F(Form("hPtDCA%sPileUpNoTOFHit",dcaName[i].Data()),
637 Form("Track (no TOF hit) DCA%s vs #it{p}_{T}distribution, SPD Pile-Up, vertex with BC!=0",dcaName[i].Data()),
638 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
639 fhPtDCAPileUpNoTOFHit[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
640 fhPtDCAPileUpNoTOFHit[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
641 outputContainer->Add(fhPtDCAPileUpNoTOFHit[i]);
643 if(fFillVertexBC0Histograms)
645 fhPtDCAVtxOutBC0PileUp[i] = new TH2F(Form("hPtDCA%sPileUpVtxOutBC0",dcaName[i].Data()),
646 Form("Track DCA%s vs #it{p}_{T}distribution, SPD Pile-Up, vertex with BC!=0",dcaName[i].Data()),
647 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
648 fhPtDCAVtxOutBC0PileUp[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
649 fhPtDCAVtxOutBC0PileUp[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
650 outputContainer->Add(fhPtDCAVtxOutBC0PileUp[i]);
652 fhPtDCAVtxOutBC0PileUpNoTOFHit[i] = new TH2F(Form("hPtDCA%sVtxOutBC0PileUpNoTOFHit",dcaName[i].Data()),
653 Form("Track (no TOF hit) DCA%s vs #it{p}_{T}distribution, SPD Pile-Up, vertex with BC!=0",dcaName[i].Data()),
654 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
655 fhPtDCAVtxOutBC0PileUpNoTOFHit[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
656 fhPtDCAVtxOutBC0PileUpNoTOFHit[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
657 outputContainer->Add(fhPtDCAVtxOutBC0PileUpNoTOFHit[i]);
659 fhPtDCAVtxInBC0PileUp[i] = new TH2F(Form("hPtDCA%sPileUpVtxInBC0",dcaName[i].Data()),
660 Form("Track DCA%s vs #it{p}_{T}distribution, SPD Pile-Up,vertex with BC==0",dcaName[i].Data()),
661 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
662 fhPtDCAVtxInBC0PileUp[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
663 fhPtDCAVtxInBC0PileUp[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
664 outputContainer->Add(fhPtDCAVtxInBC0PileUp[i]);
666 fhPtDCAVtxInBC0PileUpNoTOFHit[i] = new TH2F(Form("hPtDCA%sVtxInBC0PileUpNoTOFHit",dcaName[i].Data()),
667 Form("Track (no TOF hit) DCA%s vs #it{p}_{T}distribution, SPD Pile-Up, vertex with BC==0",dcaName[i].Data()),
668 nptbins,ptmin,ptmax,ndcabins,mindca,maxdca);
669 fhPtDCAVtxInBC0PileUpNoTOFHit[i]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
670 fhPtDCAVtxInBC0PileUpNoTOFHit[i]->SetYTitle(Form("DCA_{%s}",dcaName[i].Data()));
671 outputContainer->Add(fhPtDCAVtxInBC0PileUpNoTOFHit[i]);
679 //enum mvType{kmcPion = 0, kmcProton = 1, kmcKaon = 2, kmcMuon = 3, kmcElectron = 4, kmcUnknown = 4 };
681 TString histoName[] = {"Pion","Proton","Kaon","Muon","Electron","Unknown"};
682 TString titleName[] = {"#pi^{#pm}","p^{#pm}","K^{#pm}","#mu^{#pm}","e^{#pm}","x^{#pm}"};
684 for(Int_t imcPart = 0; imcPart < 6; imcPart++)
686 fhPtMCPart[imcPart] = new TH1F (Form("hPtMC%s",histoName[imcPart].Data()),
687 Form("reconstructed #it{p}_{T} distribution from %s",titleName[imcPart].Data()),
688 nptbins,ptmin,ptmax);
689 fhPtMCPart[imcPart]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
690 outputContainer->Add(fhPtMCPart[imcPart]);
692 fhPhiMCPart[imcPart] = new TH2F (Form("hPhiMC%s",histoName[imcPart].Data()),
693 Form("reconstructed #phi vs #it{p}_{T} distribution from %s",titleName[imcPart].Data()),
694 nptbins,ptmin,ptmax, nphibins,phimin,phimax);
695 fhPhiMCPart[imcPart]->SetYTitle("#phi (rad)");
696 fhPhiMCPart[imcPart]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
697 outputContainer->Add(fhPhiMCPart[imcPart]);
699 fhEtaMCPart[imcPart] = new TH2F (Form("hEtaMC%s",histoName[imcPart].Data()),
700 Form("reconstructed #eta vs #it{p}_{T} distribution from %s",titleName[imcPart].Data()),
701 nptbins,ptmin,ptmax, netabins,etamin,etamax);
702 fhEtaMCPart[imcPart]->SetYTitle("#eta ");
703 fhEtaMCPart[imcPart]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
704 outputContainer->Add(fhEtaMCPart[imcPart]);
706 fhPtMCPrimPart[imcPart] = new TH1F (Form("hPtMCPrimary%s",histoName[imcPart].Data()),
707 Form("generated #it{p}_{T} distribution from %s",titleName[imcPart].Data()),
708 nptbins,ptmin,ptmax);
709 fhPtMCPrimPart[imcPart]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
710 outputContainer->Add(fhPtMCPrimPart[imcPart]);
712 fhPhiMCPrimPart[imcPart] = new TH2F (Form("hPhiMCPrimary%s",histoName[imcPart].Data()),
713 Form("generated #phi vs #it{p}_{T} distribution from %s",titleName[imcPart].Data()),
714 nptbins,ptmin,ptmax, nphibins,phimin,phimax);
715 fhPhiMCPrimPart[imcPart]->SetYTitle("#phi (rad)");
716 fhPhiMCPrimPart[imcPart]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
717 outputContainer->Add(fhPhiMCPrimPart[imcPart]);
719 fhEtaMCPrimPart[imcPart] = new TH2F (Form("hEtaMCPrimary%s",histoName[imcPart].Data()),
720 Form("generated #eta vs #it{p}_{T} distribution from %s",titleName[imcPart].Data()),
721 nptbins,ptmin,ptmax, netabins,etamin,etamax);
722 fhEtaMCPrimPart[imcPart]->SetYTitle("#eta ");
723 fhEtaMCPrimPart[imcPart]->SetXTitle("#it{p}_{T} (GeV/#it{c})");
724 outputContainer->Add(fhEtaMCPrimPart[imcPart]);
729 fhPtNPileUpSPDVtx = new TH2F ("hPt_NPileUpVertSPD","pT of cluster vs N pile-up SPD vertex",
730 nptbins,ptmin,ptmax,20,0,20);
731 fhPtNPileUpSPDVtx->SetYTitle("# vertex ");
732 fhPtNPileUpSPDVtx->SetXTitle("#it{p}_{T} (GeV/#it{c})");
733 outputContainer->Add(fhPtNPileUpSPDVtx);
735 fhPtNPileUpTrkVtx = new TH2F ("hPt_NPileUpVertTracks","pT of cluster vs N pile-up Tracks vertex",
736 nptbins,ptmin,ptmax, 20,0,20 );
737 fhPtNPileUpTrkVtx->SetYTitle("# vertex ");
738 fhPtNPileUpTrkVtx->SetXTitle("#it{p}_{T} (GeV/#it{c})");
739 outputContainer->Add(fhPtNPileUpTrkVtx);
741 if(fFillVertexBC0Histograms)
743 fhPtNPileUpSPDVtxBC0 = new TH2F ("hPt_NPileUpVertSPD_BC0","pT of cluster vs N pile-up SPD vertex",
744 nptbins,ptmin,ptmax,20,0,20);
745 fhPtNPileUpSPDVtxBC0->SetYTitle("# vertex ");
746 fhPtNPileUpSPDVtxBC0->SetXTitle("#it{p}_{T} (GeV/#it{c})");
747 outputContainer->Add(fhPtNPileUpSPDVtxBC0);
749 fhPtNPileUpTrkVtxBC0 = new TH2F ("hPt_NPileUpVertTracks_BC0","pT of cluster vs N pile-up Tracks vertex",
750 nptbins,ptmin,ptmax, 20,0,20 );
751 fhPtNPileUpTrkVtxBC0->SetYTitle("# vertex ");
752 fhPtNPileUpTrkVtxBC0->SetXTitle("#it{p}_{T} (GeV/#it{c})");
753 outputContainer->Add(fhPtNPileUpTrkVtxBC0);
756 return outputContainer;
761 //___________________________________________
762 void AliAnaChargedParticles::InitParameters()
764 //Initialize the parameters of the analysis.
765 SetOutputAODClassName("AliAODPWG4Particle");
766 SetOutputAODName("PWG4Particle");
768 AddToHistogramsName("AnaCharged_");
772 //____________________________________________________________
773 void AliAnaChargedParticles::Print(const Option_t * opt) const
775 //Print some relevant parameters set for the analysis
779 printf("**** Print %s %s ****\n", GetName(), GetTitle() ) ;
780 AliAnaCaloTrackCorrBaseClass::Print(" ");
782 printf("Min Pt = %3.2f\n", GetMinPt());
783 printf("Max Pt = %3.2f\n", GetMaxPt());
787 //_________________________________
788 void AliAnaChargedParticles::Init()
793 if(!GetReader()->IsCTSSwitchedOn())
794 AliFatal("STOP!: You want to use CTS tracks in analysis but not read!! \n!!Check the configuration file!!\n");
799 //_________________________________________________
800 void AliAnaChargedParticles::MakeAnalysisFillAOD()
802 //Do analysis and fill aods
803 if(!GetCTSTracks() || GetCTSTracks()->GetEntriesFast() == 0) return ;
805 Int_t ntracks = GetCTSTracks()->GetEntriesFast();
806 Double_t vert[3] = {0,0,0}; //vertex ;
810 printf("AliAnaChargedParticles::MakeAnalysisFillAOD() - In CTS aod entries %d\n", ntracks);
812 AliVEvent * event = GetReader()->GetInputEvent();
813 AliESDEvent* esdEv = dynamic_cast<AliESDEvent*> (event);
814 AliAODEvent* aodEv = dynamic_cast<AliAODEvent*> (event);
816 Int_t vtxBC = GetReader()->GetVertexBC();
817 if(!GetReader()->IsDCACutOn()) vtxBC = GetReader()->GetVertexBC(event->GetPrimaryVertex());
819 if(fFillVertexBC0Histograms)
821 fhProductionVertexBC->Fill(vtxBC);
822 if(fFillPileUpHistograms)
824 if(GetReader()->IsPileUpFromSPD()) fhProductionVertexBCPileUp[0]->Fill(vtxBC);
825 if(GetReader()->IsPileUpFromEMCal()) fhProductionVertexBCPileUp[1]->Fill(vtxBC);
826 if(GetReader()->IsPileUpFromSPDOrEMCal()) fhProductionVertexBCPileUp[2]->Fill(vtxBC);
827 if(GetReader()->IsPileUpFromSPDAndEMCal()) fhProductionVertexBCPileUp[3]->Fill(vtxBC);
828 if(GetReader()->IsPileUpFromSPDAndNotEMCal()) fhProductionVertexBCPileUp[4]->Fill(vtxBC);
829 if(GetReader()->IsPileUpFromEMCalAndNotSPD()) fhProductionVertexBCPileUp[5]->Fill(vtxBC);
830 if(GetReader()->IsPileUpFromNotSPDAndNotEMCal()) fhProductionVertexBCPileUp[6]->Fill(vtxBC);
834 // N pile up vertices
840 nVtxSPD = esdEv->GetNumberOfPileupVerticesSPD();
841 nVtxTrk = esdEv->GetNumberOfPileupVerticesTracks();
846 nVtxSPD = aodEv->GetNumberOfPileupVerticesSPD();
847 nVtxTrk = aodEv->GetNumberOfPileupVerticesTracks();
851 //printf("AliAnaChargedParticles::MakeAnalysisFillAOD() - primary vertex BC %d\n",vtxBC);
853 Double_t bz = event->GetMagneticField();
855 //Fill AODParticle with CTS aods
860 for(Int_t i = 0; i < ntracks; i++)
862 AliVTrack * track = (AliVTrack*) (GetCTSTracks()->At(i));
870 fhPtNPileUpSPDVtx->Fill(pt,nVtxSPD);
871 fhPtNPileUpTrkVtx->Fill(pt,nVtxTrk);
873 AliAODTrack * aodTrack = dynamic_cast<AliAODTrack*>(track);
874 AliESDtrack * esdTrack = dynamic_cast<AliESDtrack*>(track);
877 ULong_t status = track->GetStatus();
878 Bool_t okTOF = (status & AliVTrack::kTOFout) == AliVTrack::kTOFout ;
879 Double32_t tof = track->GetTOFsignal()*1e-3;
882 Double_t dcaCons = -999;
885 dcaCons = aodTrack->DCA();
886 //vtxBC = aodTrack->GetProdVertex()->GetBC();
889 Double_t dca[2] = {1e6,1e6};
890 Double_t covar[3] = {1e6,1e6,1e6};
891 track->PropagateToDCA(GetReader()->GetInputEvent()->GetPrimaryVertex(),bz,100.,dca,covar);
893 Float_t trackDCA = dca[0];
897 fhPtDCA[0]->Fill(pt, dca[0]);
898 fhPtDCA[1]->Fill(pt, dca[1]);
903 fhPtDCA[2]->Fill(pt, dcaCons);
906 if(GetReader()->AcceptDCA(pt,trackDCA) && !GetReader()->IsDCACutOn() ) fhPtCutDCA->Fill(pt);
908 if(fFillVertexBC0Histograms)
910 if(TMath::Abs(vtxBC) > 0 && vtxBC!=AliVTrack::kTOFBCNA)
912 fhPtVtxOutBC0->Fill(pt);
913 fhEtaPhiVtxOutBC0->Fill(eta,phi);
917 fhPtDCAVtxOutBC0[0]->Fill(pt, dca[0]);
918 fhPtDCAVtxOutBC0[1]->Fill(pt, dca[1]);
921 fhPtDCAVtxOutBC0[2]->Fill(pt, dcaCons);
925 fhPtVtxInBC0->Fill(pt);
926 fhEtaPhiVtxInBC0->Fill(eta,phi);
928 fhPtNPileUpSPDVtxBC0->Fill(pt,nVtxSPD);
929 fhPtNPileUpTrkVtxBC0->Fill(pt,nVtxTrk);
931 if(GetReader()->AcceptDCA(pt,trackDCA) && !GetReader()->IsDCACutOn() ) fhPtCutDCABCOK->Fill(pt);
935 fhPtDCAVtxInBC0[0]->Fill(pt, dca[0]);
936 fhPtDCAVtxInBC0[1]->Fill(pt, dca[1]);
939 fhPtDCAVtxInBC0[2]->Fill(pt, dcaCons);
944 if(fFillPileUpHistograms && GetReader()->IsPileUpFromSPD())
948 fhPtDCAPileUp[0]->Fill(pt, dca[0]);
949 fhPtDCAPileUp[1]->Fill(pt, dca[1]);
952 fhPtDCAPileUp[2]->Fill(pt, dcaCons);
954 if(fFillVertexBC0Histograms)
956 if(TMath::Abs(vtxBC) > 0 && vtxBC!=AliVTrack::kTOFBCNA)
960 fhPtDCAVtxOutBC0PileUp[0]->Fill(pt, dca[0]);
961 fhPtDCAVtxOutBC0PileUp[1]->Fill(pt, dca[1]);
963 else fhPtDCAVtxOutBC0PileUp[2]->Fill(pt, dcaCons);
969 fhPtDCAVtxInBC0PileUp[0]->Fill(pt, dca[0]);
970 fhPtDCAVtxInBC0PileUp[1]->Fill(pt, dca[1]);
972 else fhPtDCAVtxInBC0PileUp[2]->Fill(pt, dcaCons);
981 fhPtDCANoTOFHit[0]->Fill(pt, dca[0]);
982 fhPtDCANoTOFHit[1]->Fill(pt, dca[1]);
985 fhPtDCANoTOFHit[2]->Fill(pt, dcaCons);
987 if(fFillVertexBC0Histograms)
989 if(TMath::Abs(vtxBC) > 0 && vtxBC!=AliVTrack::kTOFBCNA)
993 fhPtDCAVtxOutBC0NoTOFHit[0]->Fill(pt, dca[0]);
994 fhPtDCAVtxOutBC0NoTOFHit[1]->Fill(pt, dca[1]);
997 fhPtDCAVtxOutBC0NoTOFHit[2]->Fill(pt, dcaCons);
1003 fhPtDCAVtxInBC0NoTOFHit[0]->Fill(pt, dca[0]);
1004 fhPtDCAVtxInBC0NoTOFHit[1]->Fill(pt, dca[1]);
1007 fhPtDCAVtxInBC0NoTOFHit[2]->Fill(pt, dcaCons);
1012 if(fFillPileUpHistograms && GetReader()->IsPileUpFromSPD())
1016 fhPtDCAPileUpNoTOFHit[0]->Fill(pt, dca[0]);
1017 fhPtDCAPileUpNoTOFHit[1]->Fill(pt, dca[1]);
1020 fhPtDCAPileUpNoTOFHit[2]->Fill(pt, dcaCons);
1022 if(fFillVertexBC0Histograms)
1024 if(TMath::Abs(vtxBC) > 0 && vtxBC!=AliVTrack::kTOFBCNA)
1028 fhPtDCAVtxOutBC0PileUpNoTOFHit[0]->Fill(pt, dca[0]);
1029 fhPtDCAVtxOutBC0PileUpNoTOFHit[1]->Fill(pt, dca[1]);
1032 fhPtDCAVtxOutBC0PileUpNoTOFHit[2]->Fill(pt, dcaCons);
1038 fhPtDCAVtxInBC0PileUpNoTOFHit[0]->Fill(pt, dca[0]);
1039 fhPtDCAVtxInBC0PileUpNoTOFHit[1]->Fill(pt, dca[1]);
1042 fhPtDCAVtxInBC0PileUpNoTOFHit[2]->Fill(pt, dcaCons);
1049 //printf("track pT %2.2f, DCA Cons %f, DCA1 %f, DCA2 %f, TOFBC %d, oktof %d, tof %f\n",
1050 // pt,dcaCons,dca[0],dca[1],track->GetTOFBunchCrossing(bz),okTOF, tof);
1053 // if( vtxBC == 0 && trackBC !=0 && trackBC!=AliVTrack::kTOFBCNA)
1054 // printf("TOF Signal %e, BC %d, pt %f, dca_xy %f, dca_z %f, dca_tpc %f \n", tof,trackBC, pt,dca[0],dca[1],dcaCons);
1059 fhTOFSignal ->Fill(tof);
1060 fhPtTOFSignal->Fill(pt, tof);
1061 if(GetReader()->AcceptDCA(pt,trackDCA) && !GetReader()->IsDCACutOn() ) fhPtTOFSignalDCACut->Fill(pt, tof);
1063 if(fFillVertexBC0Histograms)
1065 if(TMath::Abs(vtxBC) > 0 && vtxBC!=AliVTrack::kTOFBCNA)
1066 fhPtTOFSignalVtxOutBC0->Fill(pt, tof);
1068 fhPtTOFSignalVtxInBC0->Fill(pt, tof);
1071 Int_t trackBC = 1000;
1073 if(fFillTrackBCHistograms)
1075 trackBC = track->GetTOFBunchCrossing(bz);
1079 fhTOFSignalBCOK->Fill(tof);
1083 fhPtDCATOFBC0[0]->Fill(pt, dca[0]);
1084 fhPtDCATOFBC0[1]->Fill(pt, dca[1]);
1087 fhPtDCATOFBC0[2]->Fill(pt, dcaCons);
1089 if(fFillPileUpHistograms && GetReader()->IsPileUpFromSPD())
1093 fhPtDCAPileUpTOFBC0[0]->Fill(pt, dca[0]);
1094 fhPtDCAPileUpTOFBC0[1]->Fill(pt, dca[1]);
1097 fhPtDCAPileUpTOFBC0[2]->Fill(pt, dcaCons);
1100 else if(trackBC!=AliVTrack::kTOFBCNA)
1104 fhPtDCATOFBCOut[0]->Fill(pt, dca[0]);
1105 fhPtDCATOFBCOut[1]->Fill(pt, dca[1]);
1108 fhPtDCATOFBCOut[2]->Fill(pt, dcaCons);
1113 if(fFillPileUpHistograms)
1115 if(GetReader()->IsPileUpFromSPD()) fhPtTOFSignalPileUp[0]->Fill(pt, tof);
1116 if(GetReader()->IsPileUpFromEMCal()) fhPtTOFSignalPileUp[1]->Fill(pt, tof);
1117 if(GetReader()->IsPileUpFromSPDOrEMCal()) fhPtTOFSignalPileUp[2]->Fill(pt, tof);
1118 if(GetReader()->IsPileUpFromSPDAndEMCal()) fhPtTOFSignalPileUp[3]->Fill(pt, tof);
1119 if(GetReader()->IsPileUpFromSPDAndNotEMCal()) fhPtTOFSignalPileUp[4]->Fill(pt, tof);
1120 if(GetReader()->IsPileUpFromEMCalAndNotSPD()) fhPtTOFSignalPileUp[5]->Fill(pt, tof);
1121 if(GetReader()->IsPileUpFromNotSPDAndNotEMCal()) fhPtTOFSignalPileUp[6]->Fill(pt, tof);
1123 if(fFillTrackBCHistograms)
1125 if (trackBC ==0) { fhEtaPhiTOFBC0 ->Fill(eta,phi); if(fFillPileUpHistograms && GetReader()->IsPileUpFromSPD()) fhEtaPhiTOFBC0PileUpSPD ->Fill(eta,phi); }
1126 else if (trackBC < 0) { fhEtaPhiTOFBCPlus ->Fill(eta,phi); if(fFillPileUpHistograms && GetReader()->IsPileUpFromSPD()) fhEtaPhiTOFBCPlusPileUpSPD ->Fill(eta,phi); }
1127 else if (trackBC > 0) { fhEtaPhiTOFBCMinus->Fill(eta,phi); if(fFillPileUpHistograms && GetReader()->IsPileUpFromSPD()) fhEtaPhiTOFBCMinusPileUpSPD->Fill(eta,phi); }
1130 if(fFillVertexBC0Histograms)
1132 if(TMath::Abs(vtxBC) > 0 && vtxBC!=AliVTrack::kTOFBCNA)
1134 if(GetReader()->IsPileUpFromSPD()) fhPtTOFSignalVtxOutBC0PileUp[0]->Fill(pt, tof);
1135 if(GetReader()->IsPileUpFromEMCal()) fhPtTOFSignalVtxOutBC0PileUp[1]->Fill(pt, tof);
1136 if(GetReader()->IsPileUpFromSPDOrEMCal()) fhPtTOFSignalVtxOutBC0PileUp[2]->Fill(pt, tof);
1137 if(GetReader()->IsPileUpFromSPDAndEMCal()) fhPtTOFSignalVtxOutBC0PileUp[3]->Fill(pt, tof);
1138 if(GetReader()->IsPileUpFromSPDAndNotEMCal()) fhPtTOFSignalVtxOutBC0PileUp[4]->Fill(pt, tof);
1139 if(GetReader()->IsPileUpFromEMCalAndNotSPD()) fhPtTOFSignalVtxOutBC0PileUp[5]->Fill(pt, tof);
1140 if(GetReader()->IsPileUpFromNotSPDAndNotEMCal()) fhPtTOFSignalVtxOutBC0PileUp[6]->Fill(pt, tof);
1144 if(GetReader()->IsPileUpFromSPD()) fhPtTOFSignalVtxInBC0PileUp[0]->Fill(pt, tof);
1145 if(GetReader()->IsPileUpFromEMCal()) fhPtTOFSignalVtxInBC0PileUp[1]->Fill(pt, tof);
1146 if(GetReader()->IsPileUpFromSPDOrEMCal()) fhPtTOFSignalVtxInBC0PileUp[2]->Fill(pt, tof);
1147 if(GetReader()->IsPileUpFromSPDAndEMCal()) fhPtTOFSignalVtxInBC0PileUp[3]->Fill(pt, tof);
1148 if(GetReader()->IsPileUpFromSPDAndNotEMCal()) fhPtTOFSignalVtxInBC0PileUp[4]->Fill(pt, tof);
1149 if(GetReader()->IsPileUpFromEMCalAndNotSPD()) fhPtTOFSignalVtxInBC0PileUp[5]->Fill(pt, tof);
1150 if(GetReader()->IsPileUpFromNotSPDAndNotEMCal()) fhPtTOFSignalVtxInBC0PileUp[6]->Fill(pt, tof);
1156 //Fill AODParticle after some selection
1157 Double_t mom[3] = {track->Px(),track->Py(),track->Pz()};
1159 Bool_t in = GetFiducialCut()->IsInFiducialCut(mom,"CTS") ;
1162 printf("AliAnaChargedParticles::MakeAnalysisFillAOD() - Track pt %2.2f, eta %2.2f, phi %2.2f in fiducial cut %d\n",pt,eta,phi,in);
1164 //Acceptance selection
1165 if(IsFiducialCutOn() && ! in ) continue ;
1167 // Momentum selection
1168 if(pt < GetMinPt() || pt > GetMaxPt()) continue;
1170 if(okTOF) fhTOFSignalPtCut->Fill(tof);
1173 fhPtTOFStatus0 ->Fill(pt);
1174 fhEtaPhiTOFStatus0->Fill(eta,phi);
1177 Bool_t bITSRefit = (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit;
1178 Bool_t bConstrained = kFALSE;
1179 if (aodTrack) bConstrained = aodTrack->IsGlobalConstrained();
1180 else if(esdTrack) bConstrained = (!esdTrack->HasPointOnITSLayer(0) && !esdTrack->HasPointOnITSLayer(1));
1181 //printf("Track %d, pt %2.2f, eta %2.2f, phi %2.2f, SPDRefit %d, refit %d, dcaCons %2.2f\n",
1182 // i, pt, eta, phi, bConstrained, bITSRefit, dcaCons);
1188 fhPtNoSPDRefit->Fill(pt);
1189 if(pt < 2)fhEtaPhiNoSPDRefitPt02->Fill(eta,phi);
1190 if(pt > 3)fhEtaPhiNoSPDRefitPt3 ->Fill(eta,phi);
1194 fhPtDCANoSPDRefit[0]->Fill(pt, dca[0]);
1195 fhPtDCANoSPDRefit[1]->Fill(pt, dca[1]);
1198 fhPtDCANoSPDRefit[2]->Fill(pt, dcaCons);
1203 fhPtNoSPDNoRefit->Fill(pt);
1204 if(pt < 2)fhEtaPhiNoSPDNoRefitPt02->Fill(eta,phi);
1205 if(pt > 3)fhEtaPhiNoSPDNoRefitPt3 ->Fill(eta,phi);
1208 fhPtDCANoSPDNoRefit[0]->Fill(pt, dca[0]);
1209 fhPtDCANoSPDNoRefit[1]->Fill(pt, dca[1]);
1212 fhPtDCANoSPDNoRefit[2]->Fill(pt, dcaCons);
1218 fhPtSPDRefit->Fill(pt);
1219 if(pt < 2)fhEtaPhiSPDRefitPt02->Fill(eta,phi);
1220 if(pt > 3)fhEtaPhiSPDRefitPt3 ->Fill(eta,phi);
1223 fhPtDCASPDRefit[0]->Fill(pt, dca[0]);
1224 fhPtDCASPDRefit[1]->Fill(pt, dca[1]);
1227 fhPtDCASPDRefit[2]->Fill(pt, dcaCons);
1231 if (GetMixedEvent())
1233 evtIndex = GetMixedEvent()->EventIndex(track->GetID()) ;
1236 GetVertex(vert,evtIndex);
1237 if(TMath::Abs(vert[2])> GetZvertexCut()) return;
1239 AliAODPWG4Particle tr = AliAODPWG4Particle(mom[0],mom[1],mom[2],0);
1240 tr.SetDetector("CTS");
1241 tr.SetLabel(track->GetLabel());
1242 tr.SetTrackLabel(track->GetID(),-1);
1243 tr.SetChargedBit(track->Charge()>0);
1250 printf("AliAnaChargedParticles::MakeAnalysisFillAOD() - Final aod branch entries %d\n", GetOutputAODBranch()->GetEntriesFast());
1253 //__________________________________________________________________
1254 void AliAnaChargedParticles::MakeAnalysisFillHistograms()
1256 //Do analysis and fill histograms
1258 if(IsDataMC()) FillPrimaryHistograms();
1260 //Loop on stored AODParticles
1261 Int_t naod = GetOutputAODBranch()->GetEntriesFast();
1263 fhNtracks->Fill(GetReader()->GetTrackMultiplicity()) ;
1266 printf("AliAnaChargedParticles::MakeAnalysisFillHistograms() - aod branch entries %d\n", naod);
1272 for(Int_t iaod = 0; iaod < naod ; iaod++)
1274 AliAODPWG4Particle* track = (AliAODPWG4Particle*) (GetOutputAODBranch()->At(iaod));
1282 if(track->GetChargedBit())
1284 fhPhiPos ->Fill(pt, phi);
1285 fhEtaPos ->Fill(pt, eta);
1286 fhEtaPhiPos->Fill(eta,phi);
1290 fhPhiNeg ->Fill(pt, phi);
1291 fhEtaNeg ->Fill(pt, eta);
1292 fhEtaPhiNeg->Fill(eta,phi);
1295 if(fFillPileUpHistograms)
1297 if(GetReader()->IsPileUpFromSPD()) {fhPtPileUp[0]->Fill(pt);}
1298 if(GetReader()->IsPileUpFromEMCal()) {fhPtPileUp[1]->Fill(pt);}
1299 if(GetReader()->IsPileUpFromSPDOrEMCal()) {fhPtPileUp[2]->Fill(pt);}
1300 if(GetReader()->IsPileUpFromSPDAndEMCal()) {fhPtPileUp[3]->Fill(pt);}
1301 if(GetReader()->IsPileUpFromSPDAndNotEMCal()) {fhPtPileUp[4]->Fill(pt);}
1302 if(GetReader()->IsPileUpFromEMCalAndNotSPD()) {fhPtPileUp[5]->Fill(pt);}
1303 if(GetReader()->IsPileUpFromNotSPDAndNotEMCal()) {fhPtPileUp[6]->Fill(pt);}
1309 //Play with the MC stack if available
1311 Int_t label = track->GetLabel();
1315 if( GetReader()->ReadStack() && label < GetMCStack()->GetNtrack())
1317 TParticle * mom = GetMCStack()->Particle(label);
1318 mompdg =TMath::Abs(mom->GetPdgCode());
1320 else if(GetReader()->ReadAODMCParticles())
1322 AliAODMCParticle * aodmom = 0;
1323 //Get the list of MC particles
1324 aodmom = (AliAODMCParticle*) (GetReader()->GetAODMCParticles())->At(label);
1325 mompdg =TMath::Abs(aodmom->GetPdgCode());
1329 Int_t mcType = kmcUnknown;
1330 if (mompdg==211 ) mcType = kmcPion;
1331 else if(mompdg==2212) mcType = kmcProton;
1332 else if(mompdg==321 ) mcType = kmcKaon;
1333 else if(mompdg==11 ) mcType = kmcElectron;
1334 else if(mompdg==13 ) mcType = kmcMuon;
1336 fhPtMCPart [mcType]->Fill(pt);
1337 fhEtaMCPart[mcType]->Fill(pt,eta);
1338 fhPhiMCPart[mcType]->Fill(pt,phi);
1340 }//Work with stack also