3 // Task to filter Esd tracks and propagate to Emcal surface.
7 #include "AliEmcalEsdTrackFilterTask.h"
8 #include <TClonesArray.h>
9 #include <TGeoGlobalMagField.h>
10 #include <AliAnalysisManager.h>
11 #include <AliEMCALRecoUtils.h>
12 #include <AliESDEvent.h>
13 #include <AliESDtrackCuts.h>
15 #include <AliTrackerBase.h>
17 ClassImp(AliEmcalEsdTrackFilterTask)
19 //________________________________________________________________________
20 AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask() :
21 AliAnalysisTaskSE("AliEmcalEsdTrackFilterTask"),
27 fDoPropagation(kFALSE),
35 //________________________________________________________________________
36 AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask(const char *name) :
37 AliAnalysisTaskSE(name),
41 fTracksName("EsdTracksOut"),
43 fDoPropagation(kFALSE),
55 fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
58 //________________________________________________________________________
59 AliEmcalEsdTrackFilterTask::~AliEmcalEsdTrackFilterTask()
66 //________________________________________________________________________
67 void AliEmcalEsdTrackFilterTask::UserCreateOutputObjects()
71 fTracks = new TClonesArray("AliESDtrack");
72 fTracks->SetName(fTracksName);
76 AliInfo("No track cuts given, creating default (standard only TPC) cuts");
77 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
78 fEsdTrackCuts->SetPtRange(0.15,1e3);
81 AliWarning("No track cuts given, but maybe this is indeed intended?");
85 //________________________________________________________________________
86 void AliEmcalEsdTrackFilterTask::UserExec(Option_t *)
88 // Main loop, called for each event.
90 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
92 AliError("Task works only on ESD events, returning");
96 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
98 AliError("Manager zero, returning");
102 // add tracks to event if not yet there
104 if (!(InputEvent()->FindListObject(fTracksName)))
105 InputEvent()->AddObject(fTracks);
107 if (!fHybridTrackCuts) { // contrain TPC tracks to SPD vertex if fDoSpdVtxCon==kTRUE
108 am->LoadBranch("AliESDRun.");
109 am->LoadBranch("AliESDHeader.");
110 am->LoadBranch("Tracks");
113 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
114 fEsdEv->InitMagneticField();
116 am->LoadBranch("SPDVertex.");
117 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
119 AliError("No SPD vertex, returning");
122 Int_t ntr = fEsdEv->GetNumberOfTracks();
123 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
124 AliESDtrack *etrack = fEsdEv->GetTrack(i);
127 if (!fEsdTrackCuts->AcceptTrack(etrack))
129 AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
132 if (ntrack->Pt()<=0) {
136 Double_t bfield[3] = {0,0,0};
137 ntrack->GetBxByBz(bfield);
138 AliExternalTrackParam exParam;
139 Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
144 // set the constraint parameters to the track
145 ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
146 if (ntrack->Pt()<=0) {
151 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
152 new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
155 } else { /* no spd vtx constraint */
156 Int_t ntr = fEsdEv->GetNumberOfTracks();
157 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
158 AliESDtrack *etrack = fEsdEv->GetTrack(i);
161 if ((fEsdTrackCuts!=0) && !fEsdTrackCuts->AcceptTrack(etrack))
163 AliESDtrack *ntrack = new ((*fTracks)[ntrnew++]) AliESDtrack(*etrack);
165 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
169 } else { // use hybrid track cuts
171 am->LoadBranch("Tracks");
172 Int_t ntr = fEsdEv->GetNumberOfTracks();
173 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
174 AliESDtrack *etrack = fEsdEv->GetTrack(i);
178 if (fEsdTrackCuts->AcceptTrack(etrack)) {
180 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
182 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
183 newTrack->SetBit(BIT(22),0);
184 newTrack->SetBit(BIT(23),0);
186 } else if (fHybridTrackCuts->AcceptTrack(etrack)) {
188 UInt_t status = etrack->GetStatus();
189 if (etrack->GetConstrainedParam() && (((status&AliESDtrack::kITSrefit)!=0) || fIncludeNoITS)) {
190 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
191 const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam();
192 newTrack->Set(constrainParam->GetX(),
193 constrainParam->GetAlpha(),
194 constrainParam->GetParameter(),
195 constrainParam->GetCovariance());
196 if ((status&AliESDtrack::kITSrefit)==0) {
197 newTrack->SetBit(BIT(22),0); //type 2
198 newTrack->SetBit(BIT(23),1);
200 newTrack->SetBit(BIT(22),1); //type 1
201 newTrack->SetBit(BIT(23),0);
204 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);