2 // Task to filter Esd tracks and propagate to Emcal surface.
6 #include "AliEmcalEsdTrackFilterTask.h"
7 #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>
18 ClassImp(AliEmcalEsdTrackFilterTask)
20 //________________________________________________________________________
21 AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask() :
22 AliAnalysisTaskSE("AliEmcalEsdTrackFilterTask"),
28 fDoPropagation(kFALSE),
38 //________________________________________________________________________
39 AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask(const char *name) :
40 AliAnalysisTaskSE(name),
44 fTracksName("EsdTracksOut"),
46 fDoPropagation(kFALSE),
60 fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
63 //________________________________________________________________________
64 AliEmcalEsdTrackFilterTask::~AliEmcalEsdTrackFilterTask()
71 //________________________________________________________________________
72 void AliEmcalEsdTrackFilterTask::UserCreateOutputObjects()
76 fTracks = new TClonesArray("AliESDtrack");
77 fTracks->SetName(fTracksName);
81 AliInfo("No track cuts given, creating default (standard only TPC) cuts");
82 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
83 fEsdTrackCuts->SetPtRange(0.15,1e3);
86 AliWarning("No track cuts given, but maybe this is indeed intended?");
90 //________________________________________________________________________
91 void AliEmcalEsdTrackFilterTask::UserExec(Option_t *)
93 // Main loop, called for each event.
95 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
97 AliError("Task works only on ESD events, returning");
101 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
103 AliError("Manager zero, returning");
107 // add tracks to event if not yet there
109 if (!(InputEvent()->FindListObject(fTracksName)))
110 InputEvent()->AddObject(fTracks);
112 if (!fHybridTrackCuts) { // constrain TPC tracks to SPD vertex if fDoSpdVtxCon==kTRUE
113 am->LoadBranch("AliESDRun.");
114 am->LoadBranch("AliESDHeader.");
115 am->LoadBranch("Tracks");
118 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
119 fEsdEv->InitMagneticField();
121 am->LoadBranch("SPDVertex.");
122 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
124 AliError("No SPD vertex, returning");
127 Int_t ntr = fEsdEv->GetNumberOfTracks();
128 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
129 AliESDtrack *etrack = fEsdEv->GetTrack(i);
133 if (!fEsdTrackCuts->AcceptTrack(etrack))
136 AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
139 if (ntrack->Pt()<=0) {
143 Double_t bfield[3] = {0,0,0};
144 ntrack->GetBxByBz(bfield);
145 AliExternalTrackParam exParam;
146 Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
151 // set the constraint parameters to the track
152 ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
153 if (ntrack->Pt()<=0) {
158 if (fTrackEfficiency) {
159 Double_t r = gRandom->Rndm();
160 if (fTrackEfficiency->Eval(ntrack->Pt()) < r)
165 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
166 new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
169 } else { /* no spd vtx constraint */
170 Int_t ntr = fEsdEv->GetNumberOfTracks();
171 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
172 AliESDtrack *etrack = fEsdEv->GetTrack(i);
176 if ((fEsdTrackCuts!=0) && !fEsdTrackCuts->AcceptTrack(etrack))
179 if (fTrackEfficiency) {
180 Double_t r = gRandom->Rndm();
181 if (fTrackEfficiency->Eval(etrack->Pt()) < r)
185 AliESDtrack *ntrack = new ((*fTracks)[ntrnew++]) AliESDtrack(*etrack);
187 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
191 } else { // use hybrid track cuts
193 am->LoadBranch("Tracks");
194 Int_t ntr = fEsdEv->GetNumberOfTracks();
195 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
196 AliESDtrack *etrack = fEsdEv->GetTrack(i);
200 if (fEsdTrackCuts->AcceptTrack(etrack)) {
201 if (fTrackEfficiency) {
202 Double_t r = gRandom->Rndm();
203 if (fTrackEfficiency->Eval(etrack->Pt()) < r)
206 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
208 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
209 newTrack->SetBit(BIT(22),0);
210 newTrack->SetBit(BIT(23),0);
211 if (!fMCEvent) newTrack->SetLabel(0);
213 } else if (fHybridTrackCuts->AcceptTrack(etrack)) {
214 if (!etrack->GetConstrainedParam())
216 UInt_t status = etrack->GetStatus();
217 if (!fIncludeNoITS && ((status&AliESDtrack::kITSrefit)==0))
220 if (fTrackEfficiency) {
221 Double_t r = gRandom->Rndm();
222 if (fTrackEfficiency->Eval(etrack->Pt()) < r)
225 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
227 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
228 const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam();
229 newTrack->Set(constrainParam->GetX(),
230 constrainParam->GetAlpha(),
231 constrainParam->GetParameter(),
232 constrainParam->GetCovariance());
233 if ((status&AliESDtrack::kITSrefit)==0) {
234 newTrack->SetBit(BIT(22),0); //type 2
235 newTrack->SetBit(BIT(23),1);
237 newTrack->SetBit(BIT(22),1); //type 1
238 newTrack->SetBit(BIT(23),0);
240 if (!fMCEvent) newTrack->SetLabel(0);