]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/EMCAL/AliEmcalAodTrackFilterTask.cxx
2441a51a4cf0d8f951041f71e389c55f893cf245
[u/mrichter/AliRoot.git] / PWG / EMCAL / AliEmcalAodTrackFilterTask.cxx
1 // $Id: AliEmcalAodTrackFilterTask.cxx | Fri Dec 6 10:29:20 2013 +0100 | Constantin Loizides  $
2 //
3 // Class to filter Aod tracks
4 //
5 // Author: 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 <AliLog.h>
13 #include <AliEMCALRecoUtils.h>
14 #include "AliEmcalAodTrackFilterTask.h"
15
16 ClassImp(AliEmcalAodTrackFilterTask)
17
18 //________________________________________________________________________
19 AliEmcalAodTrackFilterTask::AliEmcalAodTrackFilterTask() : 
20   AliAnalysisTaskSE("AliEmcalAodTrackFilterTask"),
21   fTracksOutName("PicoTracks"),
22   fTracksInName("tracks"),
23   fMinTrackPt(0),
24   fMaxTrackPt(1000),
25   fMinTrackEta(-10),
26   fMaxTrackEta(10),
27   fMinTrackPhi(-10),
28   fMaxTrackPhi(10),
29   fTrackEfficiency(1),
30   fIncludeNoITS(kTRUE),
31   fUseNegativeLabels(kTRUE),
32   fIsMC(kFALSE),
33   fCutMaxFrShTPCClus(0.4),
34   fModifyTrack(kTRUE),
35   fDoPropagation(kFALSE),
36   fDist(440),
37   fTracksIn(0),
38   fTracksOut(0)
39 {
40   // Constructor.
41
42   fAODfilterBits[0] = -1;
43   fAODfilterBits[1] = -1;
44 }
45
46 //________________________________________________________________________
47 AliEmcalAodTrackFilterTask::AliEmcalAodTrackFilterTask(const char *name) : 
48   AliAnalysisTaskSE(name),
49   fTracksOutName("PicoTracks"),
50   fTracksInName("tracks"),
51   fMinTrackPt(0),
52   fMaxTrackPt(1000),
53   fMinTrackEta(-10),
54   fMaxTrackEta(10),
55   fMinTrackPhi(-10),
56   fMaxTrackPhi(10),
57   fTrackEfficiency(1),
58   fIncludeNoITS(kTRUE),
59   fUseNegativeLabels(kTRUE),
60   fIsMC(kFALSE),
61   fCutMaxFrShTPCClus(0.4),
62   fModifyTrack(kTRUE),
63   fDoPropagation(kFALSE),
64   fDist(440),
65   fTracksIn(0),
66   fTracksOut(0)
67 {
68   // Constructor.
69
70   fAODfilterBits[0] = -1;
71   fAODfilterBits[1] = -1;
72   fBranchNames = "AOD:tracks";
73 }
74
75 //________________________________________________________________________
76 AliEmcalAodTrackFilterTask::~AliEmcalAodTrackFilterTask()
77 {
78   // Destructor.
79 }
80
81 //________________________________________________________________________
82 void AliEmcalAodTrackFilterTask::UserCreateOutputObjects()
83 {
84   // Create my user objects.
85
86   fTracksOut = new TClonesArray("AliAODTrack");
87   fTracksOut->SetName(fTracksOutName);
88 }
89
90 //________________________________________________________________________
91 void AliEmcalAodTrackFilterTask::UserExec(Option_t *) 
92 {
93   // Main loop, called for each event.
94
95   AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
96   if (!am) {
97     AliError("Manager zero, returning");
98     return;
99   }
100
101   // retrieve tracks from input.
102   if (!fTracksIn) { 
103     fTracksIn = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksInName));
104     if (!fTracksIn) {
105       AliError(Form("Could not retrieve tracks %s!", fTracksInName.Data())); 
106       return;
107     }
108     if (!fTracksIn->GetClass()->GetBaseClass("AliVParticle")) {
109       AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTracksInName.Data())); 
110       return;
111     }
112   }
113
114   // add tracks to event if not yet there
115   fTracksOut->Delete();
116   if (!(InputEvent()->FindListObject(fTracksOutName))) {
117     InputEvent()->AddObject(fTracksOut);
118   }
119
120   // loop over tracks
121   const Int_t Ntracks = fTracksIn->GetEntriesFast();
122   for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
123
124     AliAODTrack *track = static_cast<AliAODTrack*>(fTracksIn->At(iTracks));
125
126     if (!track)
127       continue;
128
129     if (track->Pt() > fMaxTrackPt || track->Pt() < fMinTrackPt)
130       continue;
131
132     if (track->Eta() < fMinTrackEta || track->Eta() > fMaxTrackEta || 
133         track->Phi() < fMinTrackPhi || track->Phi() > fMaxTrackPhi)
134       continue;
135
136     Bool_t isEmc = kFALSE;
137     Int_t type = -1;
138
139     if (fAODfilterBits[0] < 0) {
140       if (track->IsHybridGlobalConstrainedGlobal())
141         type = 3;
142       else /*not a good track*/
143         continue;
144     } else {
145       if (track->TestFilterBit(fAODfilterBits[0])) {
146         type = 0;
147       } else if (track->TestFilterBit(fAODfilterBits[1])) {
148         if ((track->GetStatus()&AliVTrack::kITSrefit)==0) {
149           if (fIncludeNoITS)
150             type = 2;
151           else
152             continue;
153         } else {
154           type = 1;
155         }
156       }
157       else {/*not a good track*/
158         continue;
159       }
160     }
161
162     if (fCutMaxFrShTPCClus > 0) {
163       Double_t frac = Double_t(track->GetTPCnclsS()) / Double_t(track->GetTPCncls());
164       if (frac > fCutMaxFrShTPCClus) 
165         continue;
166     }
167
168     if (fTrackEfficiency < 1) {
169       Double_t r = gRandom->Rndm();
170       if (fTrackEfficiency < r) 
171         continue;
172     }
173
174     Int_t label = 0;
175     if (fIsMC) {
176       if (fUseNegativeLabels)
177         label = track->GetLabel();
178       else 
179         label = TMath::Abs(track->GetLabel());
180     
181       if (label == 0) 
182         AliDebug(2,Form("Track %d with label==0", iTracks));
183     }
184
185     AliAODTrack *newt = new ((*fTracksOut)[nacc]) AliAODTrack(*track);
186     if (fDoPropagation)
187       AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newt,fDist);
188
189     if (fModifyTrack) {
190       newt->SetLabel(label);
191       //newt->SetType((AliAODTrack::AODTrk_t)type);
192       //      if (isEmc)
193       //        newt->SetStatus(AliVTrack::kEMCALmatch);
194       //else 
195       //        newt->ResetStatus(AliVTrack::kEMCALmatch);
196     }
197     ++nacc;
198   }
199 }