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),
39 //________________________________________________________________________
40 AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask(const char *name) :
41 AliAnalysisTaskSE(name),
45 fTracksName("EsdTracksOut"),
47 fDoPropagation(kFALSE),
61 fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
64 //________________________________________________________________________
65 AliEmcalEsdTrackFilterTask::~AliEmcalEsdTrackFilterTask()
72 //________________________________________________________________________
73 void AliEmcalEsdTrackFilterTask::UserCreateOutputObjects()
77 fTracks = new TClonesArray("AliESDtrack");
78 fTracks->SetName(fTracksName);
82 AliInfo("No track cuts given, creating default (standard only TPC) cuts");
83 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
84 fEsdTrackCuts->SetPtRange(0.15,1e3);
87 AliWarning("No track cuts given, but maybe this is indeed intended?");
91 //________________________________________________________________________
92 void AliEmcalEsdTrackFilterTask::UserExec(Option_t *)
94 // Main loop, called for each event.
96 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
98 AliError("Task works only on ESD events, returning");
102 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
104 AliError("Manager zero, returning");
108 // add tracks to event if not yet there
110 if (!(InputEvent()->FindListObject(fTracksName)))
111 InputEvent()->AddObject(fTracks);
113 if (!fHybridTrackCuts) { // constrain TPC tracks to SPD vertex if fDoSpdVtxCon==kTRUE
114 am->LoadBranch("AliESDRun.");
115 am->LoadBranch("AliESDHeader.");
116 am->LoadBranch("Tracks");
119 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
120 fEsdEv->InitMagneticField();
122 am->LoadBranch("SPDVertex.");
123 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
125 AliError("No SPD vertex, returning");
128 Int_t ntr = fEsdEv->GetNumberOfTracks();
129 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
130 AliESDtrack *etrack = fEsdEv->GetTrack(i);
134 if (!fEsdTrackCuts->AcceptTrack(etrack))
137 AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
140 if (ntrack->Pt()<=0) {
144 Double_t bfield[3] = {0,0,0};
145 ntrack->GetBxByBz(bfield);
146 AliExternalTrackParam exParam;
147 Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
152 // set the constraint parameters to the track
153 ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
154 if (ntrack->Pt()<=0) {
159 if (fTrackEfficiency < 1) {
160 Double_t r = gRandom->Rndm();
161 if (fTrackEfficiency < r)
166 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
167 new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
170 } else { /* no spd vtx constraint */
171 Int_t ntr = fEsdEv->GetNumberOfTracks();
172 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
173 AliESDtrack *etrack = fEsdEv->GetTrack(i);
177 if ((fEsdTrackCuts!=0) && !fEsdTrackCuts->AcceptTrack(etrack))
180 if (fTrackEfficiency < 1) {
181 Double_t r = gRandom->Rndm();
182 if (fTrackEfficiency < r)
186 AliESDtrack *ntrack = new ((*fTracks)[ntrnew++]) AliESDtrack(*etrack);
188 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
192 } else { // use hybrid track cuts
194 am->LoadBranch("Tracks");
195 Int_t ntr = fEsdEv->GetNumberOfTracks();
196 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
197 AliESDtrack *etrack = fEsdEv->GetTrack(i);
201 if (fEsdTrackCuts->AcceptTrack(etrack)) {
202 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
204 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
205 newTrack->SetBit(BIT(22),0);
206 newTrack->SetBit(BIT(23),0);
207 if (!fIsMC) newTrack->SetLabel(0);
209 } else if (fHybridTrackCuts->AcceptTrack(etrack)) {
210 if (!etrack->GetConstrainedParam())
212 UInt_t status = etrack->GetStatus();
213 if (!fIncludeNoITS && ((status&AliESDtrack::kITSrefit)==0))
216 if (fTrackEfficiency < 1) {
217 Double_t r = gRandom->Rndm();
218 if (fTrackEfficiency < r)
221 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
223 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
224 const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam();
225 newTrack->Set(constrainParam->GetX(),
226 constrainParam->GetAlpha(),
227 constrainParam->GetParameter(),
228 constrainParam->GetCovariance());
229 if ((status&AliESDtrack::kITSrefit)==0) {
230 newTrack->SetBit(BIT(22),0); //type 2
231 newTrack->SetBit(BIT(23),1);
233 newTrack->SetBit(BIT(22),1); //type 1
234 newTrack->SetBit(BIT(23),0);
236 if (!fIsMC) newTrack->SetLabel(0);