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