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