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 (fTrackEfficiency < 1) {
133 Double_t r = gRandom->Rndm();
134 if (fTrackEfficiency < r)
138 if (!fEsdTrackCuts->AcceptTrack(etrack))
141 AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
144 if (ntrack->Pt()<=0) {
148 Double_t bfield[3] = {0,0,0};
149 ntrack->GetBxByBz(bfield);
150 AliExternalTrackParam exParam;
151 Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
156 // set the constraint parameters to the track
157 ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
158 if (ntrack->Pt()<=0) {
163 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
164 new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
167 } else { /* no spd vtx constraint */
168 Int_t ntr = fEsdEv->GetNumberOfTracks();
169 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
170 AliESDtrack *etrack = fEsdEv->GetTrack(i);
173 if (fTrackEfficiency < 1) {
174 Double_t r = gRandom->Rndm();
175 if (fTrackEfficiency < r)
178 if ((fEsdTrackCuts!=0) && !fEsdTrackCuts->AcceptTrack(etrack))
180 AliESDtrack *ntrack = new ((*fTracks)[ntrnew++]) AliESDtrack(*etrack);
182 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
186 } else { // use hybrid track cuts
188 am->LoadBranch("Tracks");
189 Int_t ntr = fEsdEv->GetNumberOfTracks();
190 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
191 AliESDtrack *etrack = fEsdEv->GetTrack(i);
195 if (fTrackEfficiency < 1) {
196 Double_t r = gRandom->Rndm();
197 if (fTrackEfficiency < r)
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);
208 } else if (fHybridTrackCuts->AcceptTrack(etrack)) {
209 if (!etrack->GetConstrainedParam())
211 UInt_t status = etrack->GetStatus();
212 if (!fIncludeNoITS && ((status&AliESDtrack::kITSrefit)==0))
214 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
216 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
217 const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam();
218 newTrack->Set(constrainParam->GetX(),
219 constrainParam->GetAlpha(),
220 constrainParam->GetParameter(),
221 constrainParam->GetCovariance());
222 if ((status&AliESDtrack::kITSrefit)==0) {
223 newTrack->SetBit(BIT(22),0); //type 2
224 newTrack->SetBit(BIT(23),1);
226 newTrack->SetBit(BIT(22),1); //type 1
227 newTrack->SetBit(BIT(23),0);