1 // $Id: AliEmcalAodTrackFilterTask.cxx | Fri Dec 6 10:29:20 2013 +0100 | Constantin Loizides $
3 // Class to filter Aod tracks
7 #include <TClonesArray.h>
9 #include <AliAODEvent.h>
10 #include <AliAODTrack.h>
11 #include <AliAnalysisManager.h>
13 #include <AliEMCALRecoUtils.h>
14 #include "AliEmcalAodTrackFilterTask.h"
16 ClassImp(AliEmcalAodTrackFilterTask)
18 //________________________________________________________________________
19 AliEmcalAodTrackFilterTask::AliEmcalAodTrackFilterTask() :
20 AliAnalysisTaskSE("AliEmcalAodTrackFilterTask"),
21 fTracksOutName("PicoTracks"),
22 fTracksInName("tracks"),
31 fUseNegativeLabels(kTRUE),
33 fCutMaxFrShTPCClus(0.4),
35 fDoPropagation(kFALSE),
42 fAODfilterBits[0] = -1;
43 fAODfilterBits[1] = -1;
46 //________________________________________________________________________
47 AliEmcalAodTrackFilterTask::AliEmcalAodTrackFilterTask(const char *name) :
48 AliAnalysisTaskSE(name),
49 fTracksOutName("PicoTracks"),
50 fTracksInName("tracks"),
59 fUseNegativeLabels(kTRUE),
61 fCutMaxFrShTPCClus(0.4),
63 fDoPropagation(kFALSE),
70 fAODfilterBits[0] = -1;
71 fAODfilterBits[1] = -1;
72 fBranchNames = "AOD:tracks";
75 //________________________________________________________________________
76 AliEmcalAodTrackFilterTask::~AliEmcalAodTrackFilterTask()
81 //________________________________________________________________________
82 void AliEmcalAodTrackFilterTask::UserCreateOutputObjects()
84 // Create my user objects.
86 fTracksOut = new TClonesArray("AliAODTrack");
87 fTracksOut->SetName(fTracksOutName);
90 //________________________________________________________________________
91 void AliEmcalAodTrackFilterTask::UserExec(Option_t *)
93 // Main loop, called for each event.
95 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
97 AliError("Manager zero, returning");
101 // retrieve tracks from input.
103 fTracksIn = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksInName));
105 AliError(Form("Could not retrieve tracks %s!", fTracksInName.Data()));
108 if (!fTracksIn->GetClass()->GetBaseClass("AliVParticle")) {
109 AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTracksInName.Data()));
114 // add tracks to event if not yet there
115 fTracksOut->Delete();
116 if (!(InputEvent()->FindListObject(fTracksOutName))) {
117 InputEvent()->AddObject(fTracksOut);
121 const Int_t Ntracks = fTracksIn->GetEntriesFast();
122 for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
124 AliAODTrack *track = static_cast<AliAODTrack*>(fTracksIn->At(iTracks));
129 if (track->Pt() > fMaxTrackPt || track->Pt() < fMinTrackPt)
132 if (track->Eta() < fMinTrackEta || track->Eta() > fMaxTrackEta ||
133 track->Phi() < fMinTrackPhi || track->Phi() > fMaxTrackPhi)
138 if (fAODfilterBits[0] < 0) {
139 if (track->IsHybridGlobalConstrainedGlobal())
141 else /*not a good track*/
144 if (track->TestFilterBit(fAODfilterBits[0])) {
146 } else if (track->TestFilterBit(fAODfilterBits[1])) {
147 if ((track->GetStatus()&AliVTrack::kITSrefit)==0) {
156 else {/*not a good track*/
161 if (fCutMaxFrShTPCClus > 0) {
162 Double_t frac = Double_t(track->GetTPCnclsS()) / Double_t(track->GetTPCncls());
163 if (frac > fCutMaxFrShTPCClus)
167 if (fTrackEfficiency < 1) {
168 Double_t r = gRandom->Rndm();
169 if (fTrackEfficiency < r)
175 if (fUseNegativeLabels)
176 label = track->GetLabel();
178 label = TMath::Abs(track->GetLabel());
181 AliDebug(2,Form("Track %d with label==0", iTracks));
184 AliAODTrack *newt = new ((*fTracksOut)[nacc]) AliAODTrack(*track);
186 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newt,fDist);
188 newt->SetLabel(label);
190 newt->SetBit(BIT(27),0);
191 newt->SetBit(BIT(28),0);
192 } else if (type==1) {
193 newt->SetBit(BIT(27),1);
194 newt->SetBit(BIT(28),0);
195 } else if (type==2) {
196 newt->SetBit(BIT(27),0);
197 newt->SetBit(BIT(28),1);
198 } else if (type==3) {
199 newt->SetBit(BIT(27),1);
200 newt->SetBit(BIT(28),1);