3 // Task to constrain TPC tracks to vertex
7 #include <TClonesArray.h>
8 #include <TGeoGlobalMagField.h>
9 #include "AliAnalysisManager.h"
10 #include "AliESDEvent.h"
11 #include "AliESDtrackCuts.h"
12 #include "AliEmcalEsdTpcTrackTask.h"
15 ClassImp(AliEmcalEsdTpcTrackTask)
17 //________________________________________________________________________
18 AliEmcalEsdTpcTrackTask::AliEmcalEsdTpcTrackTask() :
28 //________________________________________________________________________
29 AliEmcalEsdTpcTrackTask::AliEmcalEsdTpcTrackTask(const char *name) :
30 AliAnalysisTaskSE(name),
32 fTracksName("TpcSpdVertexConstrainedTracks"),
37 fBranchNames = "ESD:SPDVertex.,Tracks";
40 //________________________________________________________________________
41 AliEmcalEsdTpcTrackTask::~AliEmcalEsdTpcTrackTask()
48 //________________________________________________________________________
49 void AliEmcalEsdTpcTrackTask::UserCreateOutputObjects()
53 fTracks = new TClonesArray("AliESDtrack");
54 fTracks->SetName(fTracksName);
57 AliInfo("No track cuts given, creating default cuts");
58 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
59 fEsdTrackCuts->SetPtRange(0.15,1e3);
63 //________________________________________________________________________
64 void AliEmcalEsdTpcTrackTask::UserExec(Option_t *)
66 // Main loop, called for each event.
68 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
70 AliError("Task works only on ESD events, returning");
74 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
76 AliError("Manager zero, returning");
80 // add tracks to event if not yet there
81 if (!(InputEvent()->FindListObject(fTracksName)))
82 InputEvent()->AddObject(fTracks);
84 am->LoadBranch("AliESDRun.");
85 am->LoadBranch("AliESDHeader.");
86 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
87 const AliESDRun *erun = fEsdEv->GetESDRun();
88 AliMagF *field = AliMagF::CreateFieldMap(erun->GetCurrentL3(),
89 erun->GetCurrentDip(),
92 erun->GetBeamEnergy(),
94 TGeoGlobalMagField::Instance()->SetField(field);
97 am->LoadBranch("SPDVertex.");
98 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
100 AliError("No SPD vertex, returning");
104 am->LoadBranch("Tracks");
105 Int_t ntr = fEsdEv->GetNumberOfTracks();
106 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
107 AliESDtrack *etrack = fEsdEv->GetTrack(i);
110 if (!fEsdTrackCuts->AcceptTrack(etrack))
113 AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
116 if (ntrack->Pt()<=0) {
121 Double_t bfield[3] = {0,0,0};
122 ntrack->GetBxByBz(bfield);
123 AliExternalTrackParam exParam;
124 Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
130 // set the constraint parameters to the track
131 ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
133 if (ntrack->Pt()<=0) {
138 new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);