]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/EMCAL/AliEmcalPicoTrackMaker.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWG / EMCAL / AliEmcalPicoTrackMaker.cxx
1 // $Id$
2 //
3 // Class to make PicoTracks in AOD/ESD events.
4 //
5 // Author: S.Aiola, C.Loizides
6
7 #include <TClonesArray.h>
8 #include <TRandom3.h>
9 #include "AliAODEvent.h"
10 #include "AliAODTrack.h"
11 #include "AliAnalysisManager.h"
12 #include "AliESDtrack.h"
13 #include "AliESDtrackCuts.h"
14 #include "AliEmcalPicoTrackMaker.h"
15 #include "AliLog.h"
16 #include "AliPicoTrack.h"
17 #include "AliVTrack.h"
18 #include "AliAODMCParticle.h"
19
20 ClassImp(AliEmcalPicoTrackMaker)
21
22 //________________________________________________________________________
23 AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker() : 
24   AliAnalysisTaskSE("AliEmcalPicoTrackMaker"),
25   fTracksOutName("PicoTracks"),
26   fTracksInName("tracks"),
27   fMCParticlesName("mcparticles"),
28   fMinTrackPt(0),
29   fMaxTrackPt(1000),
30   fMinTrackEta(-10),
31   fMaxTrackEta(10),
32   fMinTrackPhi(-10),
33   fMaxTrackPhi(10),
34   fTrackEfficiency(1),
35   fCopyMCFlag(kFALSE),
36   fTracksIn(0),
37   fTracksOut(0),
38   fMCParticles(0),
39   fInit(kFALSE)
40 {
41   // Constructor.
42
43   fAODfilterBits[0] = -1;
44   fAODfilterBits[1] = -1;
45 }
46
47 //________________________________________________________________________
48 AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker(const char *name) : 
49   AliAnalysisTaskSE(name),
50   fTracksOutName("PicoTracks"),
51   fTracksInName("tracks"),
52   fMCParticlesName("mcparticles"),
53   fMinTrackPt(0),
54   fMaxTrackPt(1000),
55   fMinTrackEta(-10),
56   fMaxTrackEta(10),
57   fMinTrackPhi(-10),
58   fMaxTrackPhi(10),
59   fTrackEfficiency(1),
60   fCopyMCFlag(kFALSE),
61   fTracksIn(0),
62   fTracksOut(0),
63   fMCParticles(0),
64   fInit(kFALSE)
65 {
66   // Constructor.
67
68   fAODfilterBits[0] = -1;
69   fAODfilterBits[1] = -1;
70   fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
71 }
72
73 //________________________________________________________________________
74 AliEmcalPicoTrackMaker::~AliEmcalPicoTrackMaker()
75 {
76   // Destructor.
77 }
78
79 //________________________________________________________________________
80 void AliEmcalPicoTrackMaker::UserCreateOutputObjects()
81 {
82   // Create my user objects.
83 }
84
85 //________________________________________________________________________
86 void AliEmcalPicoTrackMaker::UserExec(Option_t *) 
87 {
88   // Main loop, called for each event.
89
90   if (!fInit) {
91     fTracksIn = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksInName));
92     if (!fTracksIn) {
93       AliError(Form("Could not retrieve tracks %s!", fTracksInName.Data())); 
94       return;
95     }
96     if (!fTracksIn->GetClass()->GetBaseClass("AliVParticle")) {
97       AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTracksInName.Data())); 
98       return;
99     }
100     
101     fTracksOut = new TClonesArray("AliPicoTrack");
102     fTracksOut->SetName(fTracksOutName);    
103
104     // add tracks to event if not yet there
105     if (InputEvent()->FindListObject(fTracksOutName)) {
106       AliFatal(Form("Object %s already present in the event!",fTracksOutName.Data()));
107     }
108     else {
109       InputEvent()->AddObject(fTracksOut);
110     }
111
112     if (fCopyMCFlag) {
113       fMCParticles = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCParticlesName));
114       if (!fMCParticles) {
115         AliError(Form("Could not retrieve MC particles %s!", fMCParticlesName.Data())); 
116       }
117       if (!fMCParticles->GetClass()->GetBaseClass("AliVParticle")) {
118         AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fMCParticlesName.Data()));
119         fMCParticles = 0;
120       }
121     }
122
123     fInit = kTRUE;
124   }
125
126   fTracksOut->Delete();
127
128   // loop over tracks
129   const Int_t Ntracks = fTracksIn->GetEntriesFast();
130   for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
131
132     AliVTrack *track = static_cast<AliVTrack*>(fTracksIn->At(iTracks));
133
134     if (!track)
135       continue;
136
137     if (track->Pt() > fMaxTrackPt || track->Pt() < fMinTrackPt)
138       continue;
139
140     if (track->Eta() < fMinTrackEta || track->Eta() > fMaxTrackEta || 
141         track->Phi() < fMinTrackPhi || track->Phi() > fMaxTrackPhi)
142       continue;
143
144     if (fTrackEfficiency < 1) {
145       Double_t r = gRandom->Rndm();
146       if (fTrackEfficiency < r) 
147         continue;
148     }
149
150     Bool_t isEmc = kFALSE;
151     if (TMath::Abs(track->GetTrackEtaOnEMCal()) < 0.75 && 
152         track->GetTrackPhiOnEMCal() > 70 * TMath::DegToRad() &&
153         track->GetTrackPhiOnEMCal() < 190 * TMath::DegToRad())
154       isEmc = kTRUE;
155
156     AliPicoTrack *picotrack = new ((*fTracksOut)[nacc]) AliPicoTrack(track->Pt(), 
157                                                                      track->Eta(), 
158                                                                      track->Phi(), 
159                                                                      track->Charge(), 
160                                                                      track->GetLabel(),
161                                                                      AliPicoTrack::GetTrackType(track),
162                                                                      track->GetTrackEtaOnEMCal(), 
163                                                                      track->GetTrackPhiOnEMCal(), 
164                                                                      track->GetTrackPtOnEMCal(), 
165                                                                      isEmc);
166     picotrack->SetTrack(track);
167     
168     if (fCopyMCFlag && track->GetLabel() != 0) {
169       AliVParticle *mcpart = GetMCParticle(TMath::Abs(track->GetLabel()));
170       if (mcpart) {
171         UInt_t mcFlag = mcpart->GetFlag();      
172         picotrack->SetFlag(mcFlag);
173         Short_t genIndex = mcpart->GetGeneratorIndex();
174         picotrack->SetGeneratorIndex(genIndex);
175       }
176     }
177
178     ++nacc;
179   }
180 }
181
182 //________________________________________________________________________
183 AliVParticle* AliEmcalPicoTrackMaker::GetMCParticle(Int_t label) 
184 {
185   if (!fMCParticles) return 0;
186   AliVParticle *part = static_cast<AliVParticle*>(fMCParticles->At(label));
187   return part;
188 }