3 // Task to filter Esd tracks and propagate to Emcal surface.
7 #include <TClonesArray.h>
8 #include <TGeoGlobalMagField.h>
9 #include <AliAnalysisManager.h>
10 #include <AliESDEvent.h>
11 #include <AliESDtrackCuts.h>
13 #include <AliTrackerBase.h>
14 #include <AliEMCALRecoUtils.h>
16 #include "AliEmcalEsdTrackFilterTask.h"
18 ClassImp(AliEmcalEsdTrackFilterTask)
20 //________________________________________________________________________
21 AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask() :
22 AliAnalysisTaskSE("AliEmcalEsdTrackFilterTask"),
28 fDoPropagation(kFALSE),
36 //________________________________________________________________________
37 AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask(const char *name) :
38 AliAnalysisTaskSE(name),
42 fTracksName("EsdTracksOut"),
44 fDoPropagation(kFALSE),
56 fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
59 //________________________________________________________________________
60 AliEmcalEsdTrackFilterTask::~AliEmcalEsdTrackFilterTask()
67 //________________________________________________________________________
68 void AliEmcalEsdTrackFilterTask::UserCreateOutputObjects()
72 fTracks = new TClonesArray("AliESDtrack");
73 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);
82 //________________________________________________________________________
83 void AliEmcalEsdTrackFilterTask::UserExec(Option_t *)
85 // Main loop, called for each event.
87 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
89 AliError("Task works only on ESD events, returning");
93 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
95 AliError("Manager zero, returning");
99 // add tracks to event if not yet there
101 if (!(InputEvent()->FindListObject(fTracksName)))
102 InputEvent()->AddObject(fTracks);
104 if (!fHybridTrackCuts) { // contrain TPC tracks to SPD vertex if fDoSpdVtxCon==kTRUE
105 am->LoadBranch("AliESDRun.");
106 am->LoadBranch("AliESDHeader.");
107 am->LoadBranch("Tracks");
110 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
111 fEsdEv->InitMagneticField();
113 am->LoadBranch("SPDVertex.");
114 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
116 AliError("No SPD vertex, returning");
119 Int_t ntr = fEsdEv->GetNumberOfTracks();
120 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
121 AliESDtrack *etrack = fEsdEv->GetTrack(i);
124 if (!fEsdTrackCuts->AcceptTrack(etrack))
126 AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
129 if (ntrack->Pt()<=0) {
133 Double_t bfield[3] = {0,0,0};
134 ntrack->GetBxByBz(bfield);
135 AliExternalTrackParam exParam;
136 Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
141 // set the constraint parameters to the track
142 ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
143 if (ntrack->Pt()<=0) {
147 new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
150 } else { /* no spd vtx constraint */
151 Int_t ntr = fEsdEv->GetNumberOfTracks();
152 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
153 AliESDtrack *etrack = fEsdEv->GetTrack(i);
156 if (!fEsdTrackCuts->AcceptTrack(etrack))
158 new ((*fTracks)[ntrnew++]) AliESDtrack(*etrack);
162 } else { // use hybrid track cuts
164 am->LoadBranch("Tracks");
165 Int_t ntr = fEsdEv->GetNumberOfTracks();
166 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
167 AliESDtrack *etrack = fEsdEv->GetTrack(i);
171 if (fEsdTrackCuts->AcceptTrack(etrack)) {
173 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
175 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
176 newTrack->SetBit(BIT(20),0);
177 newTrack->SetBit(BIT(21),0);
179 } else if (fHybridTrackCuts->AcceptTrack(etrack)) {
181 UInt_t status = etrack->GetStatus();
182 if (etrack->GetConstrainedParam() && (((status&AliESDtrack::kITSrefit)!=0) || fIncludeNoITS)) {
183 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
184 const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam();
185 newTrack->Set(constrainParam->GetX(),
186 constrainParam->GetAlpha(),
187 constrainParam->GetParameter(),
188 constrainParam->GetCovariance());
189 if ((status&AliESDtrack::kITSrefit)==0) {
190 newTrack->SetBit(BIT(20),0); //type 2
191 newTrack->SetBit(BIT(21),1);
193 newTrack->SetBit(BIT(20),1); //type 1
194 newTrack->SetBit(BIT(21),0);
197 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);