]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/EMCAL/AliEmcalPicoTrackMaker.cxx
rearranged classification so that bit 27,28 naturally represent type=0,1,2
[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
19 ClassImp(AliEmcalPicoTrackMaker)
20
21 //________________________________________________________________________
22 AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker() : 
23   AliAnalysisTaskSE("AliEmcalPicoTrackMaker"),
24   fESDtrackCuts(0),
25   fTracksOutName("PicoTracks"),
26   fTracksInName("tracks"),
27   fMinTrackPt(0),
28   fMaxTrackPt(1000),
29   fMinTrackEta(-10),
30   fMaxTrackEta(10),
31   fMinTrackPhi(-10),
32   fMaxTrackPhi(10),
33   fTrackEfficiency(1),
34   fIncludeNoITS(kTRUE),
35   fUseNegativeLabels(kTRUE),
36   fIsMC(kFALSE),
37   fCutMaxFractionSharedTPCClusters(0.4),
38   fTracksIn(0),
39   fTracksOut(0)
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   fESDtrackCuts(0),
51   fTracksOutName("PicoTracks"),
52   fTracksInName("tracks"),
53   fMinTrackPt(0),
54   fMaxTrackPt(1000),
55   fMinTrackEta(-10),
56   fMaxTrackEta(10),
57   fMinTrackPhi(-10),
58   fMaxTrackPhi(10),
59   fTrackEfficiency(1),
60   fIncludeNoITS(kTRUE),
61   fUseNegativeLabels(kTRUE),
62   fIsMC(kFALSE),
63   fCutMaxFractionSharedTPCClusters(0.4),
64   fTracksIn(0),
65   fTracksOut(0)
66 {
67   // Constructor.
68
69   fAODfilterBits[0] = -1;
70   fAODfilterBits[1] = -1;
71   fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
72 }
73
74 //________________________________________________________________________
75 AliEmcalPicoTrackMaker::~AliEmcalPicoTrackMaker()
76 {
77   // Destructor.
78 }
79
80 //________________________________________________________________________
81 void AliEmcalPicoTrackMaker::UserCreateOutputObjects()
82 {
83   // Create my user objects.
84
85   fTracksOut = new TClonesArray("AliPicoTrack");
86   fTracksOut->SetName(fTracksOutName);
87 }
88
89 //________________________________________________________________________
90 void AliEmcalPicoTrackMaker::UserExec(Option_t *) 
91 {
92   // Main loop, called for each event.
93
94   AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
95   if (!am) {
96     AliError("Manager zero, returning");
97     return;
98   }
99
100   // retrieve tracks from input.
101   if (!fTracksIn) { 
102     fTracksIn = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksInName));
103     if (!fTracksIn) {
104       AliError(Form("Could not retrieve tracks %s!", fTracksInName.Data())); 
105       return;
106     }
107     if (!fTracksIn->GetClass()->GetBaseClass("AliVParticle")) {
108       AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTracksInName.Data())); 
109       return;
110     }
111   }
112
113   // add tracks to event if not yet there
114   fTracksOut->Delete();
115   if (!(InputEvent()->FindListObject(fTracksOutName))) {
116     InputEvent()->AddObject(fTracksOut);
117   }
118
119   // test if we are in ESD or AOD mode
120   Bool_t esdMode = kTRUE;
121   if (dynamic_cast<AliAODEvent*>(InputEvent())!=0)
122     esdMode = kFALSE;
123  
124   // loop over tracks
125   const Int_t Ntracks = fTracksIn->GetEntriesFast();
126   for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
127
128     AliVTrack *track = static_cast<AliVTrack*>(fTracksIn->At(iTracks));
129
130     if (!track)
131       continue;
132
133     if (track->Pt() > fMaxTrackPt || track->Pt() < fMinTrackPt)
134       continue;
135
136     if (track->Eta() < fMinTrackEta || track->Eta() > fMaxTrackEta || 
137         track->Phi() < fMinTrackPhi || track->Phi() > fMaxTrackPhi)
138       continue;
139
140     Bool_t isEmc = kFALSE;
141     Int_t type = -1;
142     if (esdMode) {
143       AliESDtrack *esdtrack = static_cast<AliESDtrack*>(track);
144       if (fESDtrackCuts && !fESDtrackCuts->AcceptTrack(esdtrack))
145         continue;
146       type = 0;
147       if (esdtrack->TestBit(BIT(27)) && !esdtrack->TestBit(BIT(28)))
148         type = 1;
149       else if (!esdtrack->TestBit(BIT(27)) && esdtrack->TestBit(BIT(28)))
150         type = 2;
151       if (!fIncludeNoITS && (type==2))
152         continue;
153       if (TMath::Abs(esdtrack->GetTrackEtaOnEMCal()) < 0.75 && 
154           esdtrack->GetTrackPhiOnEMCal() > 70 * TMath::DegToRad() &&
155           esdtrack->GetTrackPhiOnEMCal() < 190 * TMath::DegToRad())
156         isEmc = kTRUE;
157     } else {
158       AliAODTrack *aodtrack = static_cast<AliAODTrack*>(track);
159       if (fAODfilterBits[0] < 0) {
160         if (aodtrack->IsHybridGlobalConstrainedGlobal())
161           type = 3;
162         else /*not a good track*/
163           continue;
164       } else {
165         if (aodtrack->TestFilterBit(fAODfilterBits[0])) {
166           type = 0;
167         } else if (aodtrack->TestFilterBit(fAODfilterBits[1])) {
168           if ((aodtrack->GetStatus()&AliESDtrack::kITSrefit)==0) {
169             if (fIncludeNoITS)
170               type = 2;
171             else
172               continue;
173           } else {
174             type = 1;
175           }
176         }
177         else {/*not a good track*/
178           continue;
179         }
180       }
181       if (fCutMaxFractionSharedTPCClusters > 0) {
182         Double_t frac = Double_t(aodtrack->GetTPCnclsS()) / Double_t(aodtrack->GetTPCncls());
183         if (frac > fCutMaxFractionSharedTPCClusters) 
184           continue;
185       }
186       if (TMath::Abs(track->GetTrackEtaOnEMCal()) < 0.75 && 
187           track->GetTrackPhiOnEMCal() > 70 * TMath::DegToRad() &&
188           track->GetTrackPhiOnEMCal() < 190 * TMath::DegToRad())
189         isEmc = kTRUE;
190     }
191
192     if (fTrackEfficiency < 1) {
193       Double_t r = gRandom->Rndm();
194       if (fTrackEfficiency < r) 
195         continue;
196     }
197
198     Int_t label = 0;
199     if (fIsMC) {
200       if (fUseNegativeLabels)
201         label = track->GetLabel();
202       else 
203         label = TMath::Abs(track->GetLabel());
204
205       if (label == 0) 
206         AliDebug(2,Form("Track %d with label==0", iTracks));
207     }
208
209     /*AliPicoTrack *picotrack =*/ new ((*fTracksOut)[nacc]) AliPicoTrack(track->Pt(), 
210                                                                          track->Eta(), 
211                                                                          track->Phi(), 
212                                                                          track->Charge(), 
213                                                                          label,
214                                                                          type,
215                                                                          track->GetTrackEtaOnEMCal(), 
216                                                                          track->GetTrackPhiOnEMCal(), 
217                                                                          track->GetTrackPtOnEMCal(), 
218                                                                          isEmc);
219     ++nacc;
220   }
221 }