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() :
19 AliAnalysisTaskSE("TpcSpdVertexConstrainedTracks"),
30 //________________________________________________________________________
31 AliEmcalEsdTpcTrackTask::AliEmcalEsdTpcTrackTask(const char *name) :
32 AliAnalysisTaskSE(name),
36 fTracksName("TpcSpdVertexConstrainedTracks"),
47 fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
50 //________________________________________________________________________
51 AliEmcalEsdTpcTrackTask::~AliEmcalEsdTpcTrackTask()
58 //________________________________________________________________________
59 void AliEmcalEsdTpcTrackTask::UserCreateOutputObjects()
63 fTracks = new TClonesArray("AliESDtrack");
64 fTracks->SetName(fTracksName);
67 AliInfo("No track cuts given, creating default (standard only TPC) cuts");
68 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
69 fEsdTrackCuts->SetPtRange(0.15,1e3);
73 //________________________________________________________________________
74 void AliEmcalEsdTpcTrackTask::UserExec(Option_t *)
76 // Main loop, called for each event.
78 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
80 AliError("Task works only on ESD events, returning");
84 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
86 AliError("Manager zero, returning");
90 // add tracks to event if not yet there
91 if (!(InputEvent()->FindListObject(fTracksName)))
92 InputEvent()->AddObject(fTracks);
94 if (!fHybridTrackCuts) { // contrain TPC tracks to SPD vertex if fDoSpdVtxCon==kTRUE
95 am->LoadBranch("AliESDRun.");
96 am->LoadBranch("AliESDHeader.");
97 am->LoadBranch("Tracks");
100 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
101 fEsdEv->InitMagneticField();
103 am->LoadBranch("SPDVertex.");
104 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
106 AliError("No SPD vertex, returning");
109 Int_t ntr = fEsdEv->GetNumberOfTracks();
110 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
111 AliESDtrack *etrack = fEsdEv->GetTrack(i);
114 if (!fEsdTrackCuts->AcceptTrack(etrack))
116 AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
119 if (ntrack->Pt()<=0) {
123 Double_t bfield[3] = {0,0,0};
124 ntrack->GetBxByBz(bfield);
125 AliExternalTrackParam exParam;
126 Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
131 // set the constraint parameters to the track
132 ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
133 if (ntrack->Pt()<=0) {
137 new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
140 } else { /* no spd vtx constraint */
141 Int_t ntr = fEsdEv->GetNumberOfTracks();
142 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
143 AliESDtrack *etrack = fEsdEv->GetTrack(i);
146 if (!fEsdTrackCuts->AcceptTrack(etrack))
148 new ((*fTracks)[ntrnew++]) AliESDtrack(*etrack);
152 } else { // use hybrid track cuts
154 am->LoadBranch("Tracks");
155 Int_t ntr = fEsdEv->GetNumberOfTracks();
156 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
157 AliESDtrack *etrack = fEsdEv->GetTrack(i);
160 if (fEsdTrackCuts->AcceptTrack(etrack)) {
161 new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
162 AliESDtrack *newTrack = static_cast<AliESDtrack*>(fTracks->At(ntrnew));
163 newTrack->SetLabel(0);
165 } else if (fHybridTrackCuts->AcceptTrack(etrack)) {
166 if (etrack->GetConstrainedParam()) {
167 new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
168 AliESDtrack *newTrack = static_cast<AliESDtrack*>(fTracks->At(ntrnew));
170 const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam();
171 newTrack->Set(constrainParam->GetX(),
172 constrainParam->GetAlpha(),
173 constrainParam->GetParameter(),
174 constrainParam->GetCovariance());
175 UInt_t status = etrack->GetStatus();
176 if ((status&AliESDtrack::kITSrefit)==0)
177 newTrack->SetLabel(2);
179 newTrack->SetLabel(1);