3 // Class to make PicoTracks in AOD/ESD events.
5 // Author: S.Aiola, C.Loizides
7 #include <TClonesArray.h>
10 #include "AliAODEvent.h"
11 #include "AliAODTrack.h"
12 #include "AliAnalysisManager.h"
13 #include "AliESDtrack.h"
14 #include "AliESDtrackCuts.h"
16 #include "AliPicoTrack.h"
17 #include "AliVTrack.h"
18 #include "AliEmcalPicoTrackMaker.h"
20 ClassImp(AliEmcalPicoTrackMaker)
22 //________________________________________________________________________
23 AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker() :
24 AliAnalysisTaskSE("AliEmcalPicoTrackMaker"),
26 fTracksOutName("PicoTracks"),
27 fTracksInName("tracks"),
40 fAODfilterBits[0] = -1;
41 fAODfilterBits[1] = -1;
44 //________________________________________________________________________
45 AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker(const char *name) :
46 AliAnalysisTaskSE(name),
48 fTracksOutName("PicoTracks"),
49 fTracksInName("tracks"),
62 fAODfilterBits[0] = -1;
63 fAODfilterBits[1] = -1;
64 fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
67 //________________________________________________________________________
68 AliEmcalPicoTrackMaker::~AliEmcalPicoTrackMaker()
73 //________________________________________________________________________
74 void AliEmcalPicoTrackMaker::UserCreateOutputObjects()
76 // Create my user objects.
78 fTracksOut = new TClonesArray("AliPicoTrack");
79 fTracksOut->SetName(fTracksOutName);
82 //________________________________________________________________________
83 void AliEmcalPicoTrackMaker::UserExec(Option_t *)
85 // Main loop, called for each event.
87 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
89 AliError("Manager zero, returning");
93 // retrieve tracks from input.
95 fTracksIn = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksInName));
97 AliError(Form("Could not retrieve tracks %s!", fTracksInName.Data()));
100 if (!fTracksIn->GetClass()->GetBaseClass("AliVParticle")) {
101 AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTracksInName.Data()));
106 // add tracks to event if not yet there
107 fTracksOut->Delete();
108 if (!(InputEvent()->FindListObject(fTracksOutName))) {
109 InputEvent()->AddObject(fTracksOut);
112 // clear container (normally a null operation as the event should clean it already)
115 // test if we are in ESD or AOD mode
116 Bool_t esdMode = kTRUE;
117 if (dynamic_cast<AliAODEvent*>(InputEvent())!=0)
121 const Int_t Ntracks = fTracksIn->GetEntriesFast();
122 for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
124 AliVTrack *track = static_cast<AliVTrack*>(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)
136 Bool_t isEmc = kFALSE;
140 AliESDtrack *esdtrack = static_cast<AliESDtrack*>(track);
141 if (!fESDtrackCuts->AcceptTrack(esdtrack))
144 label = track->GetLabel();
145 isEmc = track->IsEMCAL();
147 AliAODTrack *aodtrack = static_cast<AliAODTrack*>(track);
148 if (fAODfilterBits[0] < 0) {
149 if (aodtrack->IsHybridGlobalConstrainedGlobal())
151 else /*not a good track*/
155 if (aodtrack->TestFilterBit(fAODfilterBits[0]))
157 else if (aodtrack->TestFilterBit(fAODfilterBits[1]))
159 else /*not a good track*/
163 if (TMath::Abs(track->GetTrackEtaOnEMCal()) < 0.75 &&
164 track->GetTrackPhiOnEMCal() > 70 * TMath::DegToRad() &&
165 track->GetTrackPhiOnEMCal() < 190 * TMath::DegToRad())
169 if (fTrackEfficiency < 1) {
170 Double_t r = gRandom->Rndm();
171 if (fTrackEfficiency < r)
175 /*AliPicoTrack *picotrack =*/ new ((*fTracksOut)[nacc]) AliPicoTrack(track->Pt(),
180 track->GetTrackEtaOnEMCal(),
181 track->GetTrackPhiOnEMCal(),