3 // Task to constrain TPC tracks to SPD 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() :
30 //________________________________________________________________________
31 AliEmcalEsdTpcTrackTask::AliEmcalEsdTpcTrackTask(const char *name) :
32 AliAnalysisTaskSE(name),
36 fTracksName("TpcSpdVertexConstrainedTracks"),
41 fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
44 //________________________________________________________________________
45 AliEmcalEsdTpcTrackTask::~AliEmcalEsdTpcTrackTask()
52 //________________________________________________________________________
53 void AliEmcalEsdTpcTrackTask::UserCreateOutputObjects()
57 fTracks = new TClonesArray("AliESDtrack");
58 fTracks->SetName(fTracksName);
61 AliInfo("No track cuts given, creating default (standard only TPC) cuts");
62 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
63 fEsdTrackCuts->SetPtRange(0.15,1e3);
67 //________________________________________________________________________
68 void AliEmcalEsdTpcTrackTask::UserExec(Option_t *)
70 // Main loop, called for each event.
72 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
74 AliError("Task works only on ESD events, returning");
78 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
80 AliError("Manager zero, returning");
84 // add tracks to event if not yet there
85 if (!(InputEvent()->FindListObject(fTracksName)))
86 InputEvent()->AddObject(fTracks);
88 if (!fHybridTrackCuts) { // contrain TPC tracks to SPD vertex if fDoSpdVtxCon==kTRUE
89 am->LoadBranch("AliESDRun.");
90 am->LoadBranch("AliESDHeader.");
91 am->LoadBranch("Tracks");
94 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
95 fEsdEv->InitMagneticField();
97 am->LoadBranch("SPDVertex.");
98 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
100 AliError("No SPD vertex, returning");
103 Int_t ntr = fEsdEv->GetNumberOfTracks();
104 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
105 AliESDtrack *etrack = fEsdEv->GetTrack(i);
108 if (!fEsdTrackCuts->AcceptTrack(etrack))
110 AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
113 if (ntrack->Pt()<=0) {
117 Double_t bfield[3] = {0,0,0};
118 ntrack->GetBxByBz(bfield);
119 AliExternalTrackParam exParam;
120 Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
125 // set the constraint parameters to the track
126 ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
127 if (ntrack->Pt()<=0) {
131 new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
134 } else { /* no spd vtx constraint */
135 Int_t ntr = fEsdEv->GetNumberOfTracks();
136 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
137 AliESDtrack *etrack = fEsdEv->GetTrack(i);
140 if (!fEsdTrackCuts->AcceptTrack(etrack))
142 new ((*fTracks)[ntrnew++]) AliESDtrack(*etrack);
146 } else { // use hybrid track cuts
148 am->LoadBranch("Tracks");
149 Int_t ntr = fEsdEv->GetNumberOfTracks();
150 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
151 AliESDtrack *etrack = fEsdEv->GetTrack(i);
154 if (fEsdTrackCuts->AcceptTrack(etrack)) {
155 new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
156 AliESDtrack *newTrack = static_cast<AliESDtrack*>(fTracks->At(ntrnew));
157 newTrack->SetLabel(0);
159 } else if (fHybridTrackCuts->AcceptTrack(etrack)) {
160 if (etrack->GetConstrainedParam()) {
161 new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
162 AliESDtrack *newTrack = static_cast<AliESDtrack*>(fTracks->At(ntrnew));
164 const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam();
165 newTrack->Set(constrainParam->GetX(),
166 constrainParam->GetAlpha(),
167 constrainParam->GetParameter(),
168 constrainParam->GetCovariance());
169 UInt_t status = etrack->GetStatus();
170 if ((status&AliESDtrack::kITSrefit)==0)
171 newTrack->SetLabel(2);
173 newTrack->SetLabel(1);