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() :
29 //________________________________________________________________________
30 AliEmcalEsdTpcTrackTask::AliEmcalEsdTpcTrackTask(const char *name) :
31 AliAnalysisTaskSE(name),
34 fTracksName("TpcSpdVertexConstrainedTracks"),
39 fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
42 //________________________________________________________________________
43 AliEmcalEsdTpcTrackTask::~AliEmcalEsdTpcTrackTask()
50 //________________________________________________________________________
51 void AliEmcalEsdTpcTrackTask::UserCreateOutputObjects()
55 fTracks = new TClonesArray("AliESDtrack");
56 fTracks->SetName(fTracksName);
59 AliInfo("No track cuts given, creating default cuts");
60 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
61 fEsdTrackCuts->SetPtRange(0.15,1e3);
65 //________________________________________________________________________
66 void AliEmcalEsdTpcTrackTask::UserExec(Option_t *)
68 // Main loop, called for each event.
70 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
72 AliError("Task works only on ESD events, returning");
76 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
78 AliError("Manager zero, returning");
82 // add tracks to event if not yet there
83 if (!(InputEvent()->FindListObject(fTracksName)))
84 InputEvent()->AddObject(fTracks);
86 if (!fHybridTrackCuts) {
87 am->LoadBranch("AliESDRun.");
88 am->LoadBranch("AliESDHeader.");
89 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
90 fEsdEv->InitMagneticField();
93 am->LoadBranch("SPDVertex.");
94 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
96 AliError("No SPD vertex, returning");
100 am->LoadBranch("Tracks");
101 Int_t ntr = fEsdEv->GetNumberOfTracks();
102 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
103 AliESDtrack *etrack = fEsdEv->GetTrack(i);
106 if (!fEsdTrackCuts->AcceptTrack(etrack))
109 AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
112 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);
126 // set the constraint parameters to the track
127 ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
129 if (ntrack->Pt()<=0) {
134 new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
140 am->LoadBranch("Tracks");
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)) {
147 new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
148 AliESDtrack *newTrack = static_cast<AliESDtrack*>(fTracks->At(ntrnew));
149 newTrack->SetLabel(0);
151 } else if (fHybridTrackCuts->AcceptTrack(etrack)) {
152 if (etrack->GetConstrainedParam()) {
153 new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
154 AliESDtrack *newTrack = static_cast<AliESDtrack*>(fTracks->At(ntrnew));
156 const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam();
157 newTrack->Set(constrainParam->GetX(),
158 constrainParam->GetAlpha(),
159 constrainParam->GetParameter(),
160 constrainParam->GetCovariance());
161 UInt_t status = etrack->GetStatus();
162 if ((status&AliESDtrack::kITSrefit)==0)
163 newTrack->SetLabel(2);
165 newTrack->SetLabel(1);