]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/EMCAL/AliEmcalPicoTrackMaker.cxx
update from Salvatore
[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
10 #include "AliAODEvent.h"
11 #include "AliAODTrack.h"
12 #include "AliAnalysisManager.h"
13 #include "AliESDtrack.h"
14 #include "AliESDtrackCuts.h"
15 #include "AliLog.h"
16 #include "AliPicoTrack.h"
17 #include "AliVTrack.h"
18 #include "AliEmcalPicoTrackMaker.h"
19
20 ClassImp(AliEmcalPicoTrackMaker)
21
22 //________________________________________________________________________
23 AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker() : 
24   AliAnalysisTaskSE("AliEmcalPicoTrackMaker"),
25   fESDtrackCuts(0),
26   fTracksOutName("PicoTracks"),
27   fTracksInName("tracks"),
28   fMinTrackPt(0),
29   fMaxTrackPt(1000),
30   fMinTrackEta(-0.9),
31   fMaxTrackEta(0.9),
32   fMinTrackPhi(-10),
33   fMaxTrackPhi(10),
34   fTrackEfficiency(1),
35   fIncludeNoITS(kTRUE),
36   fTracksIn(0),
37   fTracksOut(0)
38 {
39   // Constructor.
40
41   fAODfilterBits[0] = -1;
42   fAODfilterBits[1] = -1;
43 }
44
45 //________________________________________________________________________
46 AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker(const char *name) : 
47   AliAnalysisTaskSE(name),
48   fESDtrackCuts(0),
49   fTracksOutName("PicoTracks"),
50   fTracksInName("tracks"),
51   fMinTrackPt(0),
52   fMaxTrackPt(1000),
53   fMinTrackEta(-0.9),
54   fMaxTrackEta(0.9),
55   fMinTrackPhi(-10),
56   fMaxTrackPhi(10),
57   fTrackEfficiency(1),
58   fIncludeNoITS(kTRUE),
59   fTracksIn(0),
60   fTracksOut(0)
61 {
62   // Constructor.
63
64   fAODfilterBits[0] = -1;
65   fAODfilterBits[1] = -1;
66   fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
67 }
68
69 //________________________________________________________________________
70 AliEmcalPicoTrackMaker::~AliEmcalPicoTrackMaker()
71 {
72   // Destructor.
73 }
74
75 //________________________________________________________________________
76 void AliEmcalPicoTrackMaker::UserCreateOutputObjects()
77 {
78   // Create my user objects.
79
80   fTracksOut = new TClonesArray("AliPicoTrack");
81   fTracksOut->SetName(fTracksOutName);
82 }
83
84 //________________________________________________________________________
85 void AliEmcalPicoTrackMaker::UserExec(Option_t *) 
86 {
87   // Main loop, called for each event.
88
89   AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
90   if (!am) {
91     AliError("Manager zero, returning");
92     return;
93   }
94
95   // retrieve tracks from input.
96   if (!fTracksIn) { 
97     fTracksIn = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksInName));
98     if (!fTracksIn) {
99       AliError(Form("Could not retrieve tracks %s!", fTracksInName.Data())); 
100       return;
101     }
102     if (!fTracksIn->GetClass()->GetBaseClass("AliVParticle")) {
103       AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTracksInName.Data())); 
104       return;
105     }
106   }
107
108   // add tracks to event if not yet there
109   fTracksOut->Delete();
110   if (!(InputEvent()->FindListObject(fTracksOutName))) {
111     InputEvent()->AddObject(fTracksOut);
112   }
113
114   // clear container (normally a null operation as the event should clean it already)
115   fTracksOut->Clear();
116
117   // test if we are in ESD or AOD mode
118   Bool_t esdMode = kTRUE;
119   if (dynamic_cast<AliAODEvent*>(InputEvent())!=0)
120     esdMode = kFALSE;
121  
122   // loop over tracks
123   const Int_t Ntracks = fTracksIn->GetEntriesFast();
124   for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
125
126     AliVTrack *track = static_cast<AliVTrack*>(fTracksIn->At(iTracks));
127
128     if (!track)
129       continue;
130
131     if (track->Pt() > fMaxTrackPt || track->Pt() < fMinTrackPt)
132       continue;
133
134     if (track->Eta() < fMinTrackEta || track->Eta() > fMaxTrackEta || 
135         track->Phi() < fMinTrackPhi || track->Phi() > fMaxTrackPhi)
136       continue;
137
138     Bool_t isEmc = kFALSE;
139     Int_t type = -1;
140     if (esdMode) {
141       AliESDtrack *esdtrack = static_cast<AliESDtrack*>(track);
142       if (fESDtrackCuts && !fESDtrackCuts->AcceptTrack(esdtrack))
143         continue;
144       type = esdtrack->GetTRDNchamberdEdx();
145       if (!fIncludeNoITS && (type==2))
146         continue;
147       isEmc = track->IsEMCAL();
148     } else {
149       AliAODTrack *aodtrack = static_cast<AliAODTrack*>(track);
150       if (fAODfilterBits[0] < 0) {
151         if (aodtrack->IsHybridGlobalConstrainedGlobal())
152           type = 3;
153         else /*not a good track*/
154           continue;
155       }
156       else {
157         if (aodtrack->TestFilterBit(fAODfilterBits[0])) {
158           type = 0;
159         }
160         else if (aodtrack->TestFilterBit(fAODfilterBits[1])) {
161           if ((aodtrack->GetStatus()&AliESDtrack::kITSrefit)==0) {
162             if (fIncludeNoITS)
163               type = 2;
164             else
165               continue;
166           }
167           else {
168             type = 1;
169           }
170         }
171         else {/*not a good track*/
172           continue;
173         }
174       }
175
176       if (TMath::Abs(track->GetTrackEtaOnEMCal()) < 0.75 && 
177           track->GetTrackPhiOnEMCal() > 70 * TMath::DegToRad() && 
178           track->GetTrackPhiOnEMCal() < 190 * TMath::DegToRad())
179         isEmc = kTRUE;
180     }
181
182     if (fTrackEfficiency < 1) {
183       Double_t r = gRandom->Rndm();
184       if (fTrackEfficiency < r) 
185         continue;
186     }
187
188     /*AliPicoTrack *picotrack =*/ new ((*fTracksOut)[nacc]) AliPicoTrack(track->Pt(), 
189                                                                          track->Eta(), 
190                                                                          track->Phi(), 
191                                                                          track->Charge(), 
192                                                                          -1,
193                                                                          type,
194                                                                          track->GetTrackEtaOnEMCal(), 
195                                                                          track->GetTrackPhiOnEMCal(), 
196                                                                          isEmc);
197     ++nacc;
198   }
199 }