]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/EMCAL/AliEmcalAodTrackFilterTask.cxx
bits again
[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 "AliEmcalAodTrackFilterTask.h"
8 #include <TClonesArray.h>
9 #include <TRandom3.h>
10 #include <AliAODEvent.h>
11 #include <AliAODTrack.h>
12 #include <AliAnalysisManager.h>
13 #include <AliEMCALRecoUtils.h>
14 #include <AliLog.h>
15
16 ClassImp(AliEmcalAodTrackFilterTask)
17
18 //________________________________________________________________________
19 AliEmcalAodTrackFilterTask::AliEmcalAodTrackFilterTask() : 
20   AliAnalysisTaskSE("AliEmcalAodTrackFilterTask"),
21   fTracksOutName("PicoTracks"),
22   fTracksInName("tracks"),
23   fIncludeNoITS(kTRUE),
24   fCutMaxFrShTPCClus(0.4),
25   fUseNegativeLabels(kTRUE),
26   fIsMC(kFALSE),
27   fDoPropagation(kFALSE),
28   fDist(440),
29   fTracksIn(0),
30   fTracksOut(0)
31 {
32   // Constructor.
33
34   fAODfilterBits[0] = -1;
35   fAODfilterBits[1] = -1;
36 }
37
38 //________________________________________________________________________
39 AliEmcalAodTrackFilterTask::AliEmcalAodTrackFilterTask(const char *name) : 
40   AliAnalysisTaskSE(name),
41   fTracksOutName("PicoTracks"),
42   fTracksInName("tracks"),
43   fIncludeNoITS(kTRUE),
44   fCutMaxFrShTPCClus(0.4),
45   fUseNegativeLabels(kTRUE),
46   fIsMC(kFALSE),
47   fDoPropagation(kFALSE),
48   fDist(440),
49   fTracksIn(0),
50   fTracksOut(0)
51 {
52   // Constructor.
53
54   fAODfilterBits[0] = -1;
55   fAODfilterBits[1] = -1;
56   fBranchNames = "AOD:tracks";
57 }
58
59 //________________________________________________________________________
60 AliEmcalAodTrackFilterTask::~AliEmcalAodTrackFilterTask()
61 {
62   // Destructor.
63 }
64
65 //________________________________________________________________________
66 void AliEmcalAodTrackFilterTask::UserCreateOutputObjects()
67 {
68   // Create my user objects.
69
70   fTracksOut = new TClonesArray("AliAODTrack");
71   fTracksOut->SetName(fTracksOutName);
72 }
73
74 //________________________________________________________________________
75 void AliEmcalAodTrackFilterTask::UserExec(Option_t *) 
76 {
77   // Main loop, called for each event.
78
79   AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
80   if (!am) {
81     AliError("Manager zero, returning");
82     return;
83   }
84
85   // retrieve tracks from input.
86   if (!fTracksIn) { 
87     fTracksIn = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksInName));
88     if (!fTracksIn) {
89       AliError(Form("Could not retrieve tracks %s!", fTracksInName.Data())); 
90       return;
91     }
92     if (!fTracksIn->GetClass()->GetBaseClass("AliVParticle")) {
93       AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTracksInName.Data())); 
94       return;
95     }
96   }
97
98   // add tracks to event if not yet there
99   fTracksOut->Delete();
100   if (!(InputEvent()->FindListObject(fTracksOutName))) {
101     InputEvent()->AddObject(fTracksOut);
102   }
103
104   // loop over tracks
105   const Int_t Ntracks = fTracksIn->GetEntriesFast();
106   for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
107
108     AliAODTrack *track = static_cast<AliAODTrack*>(fTracksIn->At(iTracks));
109
110     if (!track)
111       continue;
112     Int_t type = -1;
113     if (fAODfilterBits[0] < 0) {
114       if (track->IsHybridGlobalConstrainedGlobal())
115         type = 3;
116       else /*not a good track*/
117         continue;
118     } else {
119       if (track->TestFilterBit(fAODfilterBits[0])) {
120         type = 0;
121       } else if (track->TestFilterBit(fAODfilterBits[1])) {
122         if ((track->GetStatus()&AliVTrack::kITSrefit)==0) {
123           if (fIncludeNoITS)
124             type = 2;
125           else
126             continue;
127         } else {
128           type = 1;
129         }
130       }
131       else {/*not a good track*/
132         continue;
133       }
134     }
135
136     if (fCutMaxFrShTPCClus > 0) {
137       Double_t frac = Double_t(track->GetTPCnclsS()) / Double_t(track->GetTPCncls());
138       if (frac > fCutMaxFrShTPCClus) 
139         continue;
140     }
141
142     AliAODTrack *newt = new ((*fTracksOut)[nacc]) AliAODTrack(*track);
143     if (fDoPropagation)
144       AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newt,fDist);
145     Int_t label = 0;
146     if (fIsMC) {
147       if (fUseNegativeLabels)
148         label = track->GetLabel();
149       else 
150         label = TMath::Abs(track->GetLabel());
151       if (label == 0) 
152         AliDebug(2,Form("Track %d with label==0", iTracks));
153     }
154     if (type==0) {
155       newt->SetBit(BIT(22),0);
156       newt->SetBit(BIT(23),0);
157     } else if (type==1) {
158       newt->SetBit(BIT(22),1);
159       newt->SetBit(BIT(23),0);
160     } else if (type==2) {
161       newt->SetBit(BIT(22),0);
162       newt->SetBit(BIT(23),1);
163     } else if (type==3) {
164       newt->SetBit(BIT(22),1);
165       newt->SetBit(BIT(23),1);
166     }
167     ++nacc;
168   }
169 }