]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/EMCAL/AliEmcalEsdTrackFilterTask.cxx
change mod 644
[u/mrichter/AliRoot.git] / PWG / EMCAL / AliEmcalEsdTrackFilterTask.cxx
CommitLineData
cc2b5fb5 1// $Id$
b0a53615 2//
cdd4e0e2 3// Task to filter Esd tracks and propagate to Emcal surface.
b0a53615 4//
cd231d42 5// Author: C.Loizides
cc2b5fb5 6
33a8056d 7#include "AliEmcalEsdTrackFilterTask.h"
cc2b5fb5 8#include <TClonesArray.h>
9#include <TGeoGlobalMagField.h>
fe75ca27 10#include <AliAnalysisManager.h>
33a8056d 11#include <AliEMCALRecoUtils.h>
fe75ca27
CL
12#include <AliESDEvent.h>
13#include <AliESDtrackCuts.h>
14#include <AliMagF.h>
15#include <AliTrackerBase.h>
cc2b5fb5 16
cdd4e0e2 17ClassImp(AliEmcalEsdTrackFilterTask)
cc2b5fb5 18
19//________________________________________________________________________
cdd4e0e2
CL
20AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask() :
21 AliAnalysisTaskSE("AliEmcalEsdTrackFilterTask"),
cc2b5fb5 22 fEsdTrackCuts(0),
4d1e3842 23 fDoSpdVtxCon(0),
57184cc6 24 fHybridTrackCuts(0),
cc2b5fb5 25 fTracksName(),
6231f841 26 fIncludeNoITS(kTRUE),
35fb503f 27 fDoPropagation(kFALSE),
af2f024d 28 fDist(440),
cc2b5fb5 29 fEsdEv(0),
30 fTracks(0)
31{
a93ef37c 32 // Constructor.
cc2b5fb5 33}
34
35//________________________________________________________________________
cdd4e0e2 36AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask(const char *name) :
cc2b5fb5 37 AliAnalysisTaskSE(name),
38 fEsdTrackCuts(0),
4d1e3842 39 fDoSpdVtxCon(0),
57184cc6 40 fHybridTrackCuts(0),
cdd4e0e2 41 fTracksName("EsdTracksOut"),
6231f841 42 fIncludeNoITS(kTRUE),
35fb503f 43 fDoPropagation(kFALSE),
af2f024d 44 fDist(440),
cc2b5fb5 45 fEsdEv(0),
46 fTracks(0)
47{
a93ef37c 48 // Constructor.
27fde6c7 49
50 if (!name)
51 return;
52
53 SetName(name);
54
a93ef37c 55 fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
cc2b5fb5 56}
57
58//________________________________________________________________________
cdd4e0e2 59AliEmcalEsdTrackFilterTask::~AliEmcalEsdTrackFilterTask()
cc2b5fb5 60{
61 //Destructor
62
63 delete fEsdTrackCuts;
64}
65
66//________________________________________________________________________
cdd4e0e2 67void AliEmcalEsdTrackFilterTask::UserCreateOutputObjects()
cc2b5fb5 68{
a93ef37c 69 // Create histograms.
cc2b5fb5 70
71 fTracks = new TClonesArray("AliESDtrack");
72 fTracks->SetName(fTracksName);
73
74 if (!fEsdTrackCuts) {
dd5a823e 75 AliInfo("No track cuts given, creating default (standard only TPC) cuts");
cc2b5fb5 76 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
77 fEsdTrackCuts->SetPtRange(0.15,1e3);
78 }
79}
80
81//________________________________________________________________________
cdd4e0e2 82void AliEmcalEsdTrackFilterTask::UserExec(Option_t *)
cc2b5fb5 83{
84 // Main loop, called for each event.
85
86 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
87 if (!fEsdEv) {
88 AliError("Task works only on ESD events, returning");
89 return;
90 }
91
92 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
93 if (!am) {
94 AliError("Manager zero, returning");
95 return;
96 }
97
98 // add tracks to event if not yet there
71c1dd76 99 fTracks->Delete();
cc2b5fb5 100 if (!(InputEvent()->FindListObject(fTracksName)))
101 InputEvent()->AddObject(fTracks);
102
dd5a823e 103 if (!fHybridTrackCuts) { // contrain TPC tracks to SPD vertex if fDoSpdVtxCon==kTRUE
57184cc6 104 am->LoadBranch("AliESDRun.");
105 am->LoadBranch("AliESDHeader.");
57184cc6 106 am->LoadBranch("Tracks");
4d1e3842 107
108 if (fDoSpdVtxCon) {
109 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
110 fEsdEv->InitMagneticField();
57184cc6 111 }
4d1e3842 112 am->LoadBranch("SPDVertex.");
113 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
114 if (!vtxSPD) {
115 AliError("No SPD vertex, returning");
116 return;
57184cc6 117 }
4d1e3842 118 Int_t ntr = fEsdEv->GetNumberOfTracks();
119 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
120 AliESDtrack *etrack = fEsdEv->GetTrack(i);
121 if (!etrack)
122 continue;
123 if (!fEsdTrackCuts->AcceptTrack(etrack))
124 continue;
125 AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
126 if (!ntrack)
127 continue;
128 if (ntrack->Pt()<=0) {
129 delete ntrack;
130 continue;
131 }
132 Double_t bfield[3] = {0,0,0};
133 ntrack->GetBxByBz(bfield);
134 AliExternalTrackParam exParam;
135 Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
136 if (!relate) {
137 delete ntrack;
138 continue;
139 }
140 // set the constraint parameters to the track
141 ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
142 if (ntrack->Pt()<=0) {
143 delete ntrack;
144 continue;
145 }
146 new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
57184cc6 147 delete ntrack;
57184cc6 148 }
4d1e3842 149 } else { /* no spd vtx constraint */
150 Int_t ntr = fEsdEv->GetNumberOfTracks();
151 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
152 AliESDtrack *etrack = fEsdEv->GetTrack(i);
153 if (!etrack)
154 continue;
155 if (!fEsdTrackCuts->AcceptTrack(etrack))
156 continue;
157 new ((*fTracks)[ntrnew++]) AliESDtrack(*etrack);
158 }
cc2b5fb5 159 }
160
10d1f756 161 } else { // use hybrid track cuts
57184cc6 162
163 am->LoadBranch("Tracks");
164 Int_t ntr = fEsdEv->GetNumberOfTracks();
165 for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
166 AliESDtrack *etrack = fEsdEv->GetTrack(i);
35fb503f
CL
167 if (!etrack)
168 continue;
169
57184cc6 170 if (fEsdTrackCuts->AcceptTrack(etrack)) {
af2f024d 171
b3bef4aa 172 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
cdd4e0e2
CL
173 if (fDoPropagation)
174 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
32c97abe 175 newTrack->SetBit(BIT(22),0);
176 newTrack->SetBit(BIT(23),0);
57184cc6 177 ++ntrnew;
178 } else if (fHybridTrackCuts->AcceptTrack(etrack)) {
af2f024d 179
6231f841 180 UInt_t status = etrack->GetStatus();
b3bef4aa 181 if (etrack->GetConstrainedParam() && (((status&AliESDtrack::kITSrefit)!=0) || fIncludeNoITS)) {
b3bef4aa 182 AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
57184cc6 183 const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam();
184 newTrack->Set(constrainParam->GetX(),
185 constrainParam->GetAlpha(),
186 constrainParam->GetParameter(),
187 constrainParam->GetCovariance());
d08428f7 188 if ((status&AliESDtrack::kITSrefit)==0) {
32c97abe 189 newTrack->SetBit(BIT(22),0); //type 2
190 newTrack->SetBit(BIT(23),1);
ee9f2228 191 } else {
32c97abe 192 newTrack->SetBit(BIT(22),1); //type 1
193 newTrack->SetBit(BIT(23),0);
d08428f7 194 }
cdd4e0e2
CL
195 if (fDoPropagation)
196 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
197 ++ntrnew;
af2f024d 198 }
57184cc6 199 }
200 }
cc2b5fb5 201 }
202}