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