3 // Task to filter Esd tracks and propagate to Emcal surface.
7 #include "AliEmcalEsdTrackFilterTask.h"
8 #include <TClonesArray.h>
10 #include <TGeoGlobalMagField.h>
11 #include <AliAnalysisManager.h>
12 #include <AliEMCALRecoUtils.h>
13 #include <AliESDEvent.h>
14 #include <AliESDtrackCuts.h>
16 #include <AliTrackerBase.h>
19 ClassImp(AliEmcalEsdTrackFilterTask)
21 //________________________________________________________________________
22 AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask() :
23 AliAnalysisTaskSE("AliEmcalEsdTrackFilterTask"),
29 fDoPropagation(kFALSE),
38 //________________________________________________________________________
39 AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask(const char *name) :
40 AliAnalysisTaskSE(name),
44 fTracksName("EsdTracksOut"),
46 fDoPropagation(kFALSE),
59 fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
62 //________________________________________________________________________
63 AliEmcalEsdTrackFilterTask::~AliEmcalEsdTrackFilterTask()
70 //________________________________________________________________________
71 void AliEmcalEsdTrackFilterTask::UserCreateOutputObjects()
75 fTracks = new TClonesArray("AliESDtrack");
76 fTracks->SetName(fTracksName);
80 AliInfo("No track cuts given, creating default (standard only TPC) cuts");
81 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
82 fEsdTrackCuts->SetPtRange(0.15,1e3);
85 AliWarning("No track cuts given, but maybe this is indeed intended?");
89 //________________________________________________________________________
90 void AliEmcalEsdTrackFilterTask::UserExec(Option_t *)
92 // Main loop, called for each event.
94 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
96 AliError("Task works only on ESD events, returning");
100 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
102 AliError("Manager zero, returning");
106 // add tracks to event if not yet there
108 if (!(InputEvent()->FindListObject(fTracksName)))
109 InputEvent()->AddObject(fTracks);
111 if (!fHybridTrackCuts) { // constrain TPC tracks to SPD vertex if fDoSpdVtxCon==kTRUE
112 am->LoadBranch("AliESDRun.");
113 am->LoadBranch("AliESDHeader.");
114 am->LoadBranch("Tracks");
117 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
118 fEsdEv->InitMagneticField();
120 am->LoadBranch("SPDVertex.");
121 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
123 AliError("No SPD vertex, returning");
126 Int_t ntr = fEsdEv->GetNumberOfTracks();
127 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
128 AliESDtrack *etrack = fEsdEv->GetTrack(i);
132 if (!fEsdTrackCuts->AcceptTrack(etrack))
135 AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
138 if (ntrack->Pt()<=0) {
142 Double_t bfield[3] = {0,0,0};
143 ntrack->GetBxByBz(bfield);
144 AliExternalTrackParam exParam;
145 Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
150 // set the constraint parameters to the track
151 ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
152 if (ntrack->Pt()<=0) {
157 if (fTrackEfficiency < 1) {
158 Double_t r = gRandom->Rndm();
159 if (fTrackEfficiency < r)
164 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
165 new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
168 } else { /* no spd vtx constraint */
169 Int_t ntr = fEsdEv->GetNumberOfTracks();
170 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
171 AliESDtrack *etrack = fEsdEv->GetTrack(i);
175 if ((fEsdTrackCuts!=0) && !fEsdTrackCuts->AcceptTrack(etrack))
178 if (fTrackEfficiency < 1) {
179 Double_t r = gRandom->Rndm();
180 if (fTrackEfficiency < r)
184 AliESDtrack *ntrack = new ((*fTracks)[ntrnew++]) AliESDtrack(*etrack);
186 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
190 } else { // use hybrid track cuts
192 am->LoadBranch("Tracks");
193 Int_t ntr = fEsdEv->GetNumberOfTracks();
194 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
195 AliESDtrack *etrack = fEsdEv->GetTrack(i);
199 if (fEsdTrackCuts->AcceptTrack(etrack)) {
200 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
202 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
203 newTrack->SetBit(BIT(22),0);
204 newTrack->SetBit(BIT(23),0);
206 } else if (fHybridTrackCuts->AcceptTrack(etrack)) {
207 if (!etrack->GetConstrainedParam())
209 UInt_t status = etrack->GetStatus();
210 if (!fIncludeNoITS && ((status&AliESDtrack::kITSrefit)==0))
213 if (fTrackEfficiency < 1) {
214 Double_t r = gRandom->Rndm();
215 if (fTrackEfficiency < r)
219 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
221 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
222 const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam();
223 newTrack->Set(constrainParam->GetX(),
224 constrainParam->GetAlpha(),
225 constrainParam->GetParameter(),
226 constrainParam->GetCovariance());
227 if ((status&AliESDtrack::kITSrefit)==0) {
228 newTrack->SetBit(BIT(22),0); //type 2
229 newTrack->SetBit(BIT(23),1);
231 newTrack->SetBit(BIT(22),1); //type 1
232 newTrack->SetBit(BIT(23),0);