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