]>
Commit | Line | Data |
---|---|---|
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 | 17 | ClassImp(AliEmcalEsdTrackFilterTask) |
cc2b5fb5 | 18 | |
19 | //________________________________________________________________________ | |
cdd4e0e2 CL |
20 | AliEmcalEsdTrackFilterTask::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 | 36 | AliEmcalEsdTrackFilterTask::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 | 59 | AliEmcalEsdTrackFilterTask::~AliEmcalEsdTrackFilterTask() |
cc2b5fb5 | 60 | { |
61 | //Destructor | |
62 | ||
63 | delete fEsdTrackCuts; | |
64 | } | |
65 | ||
66 | //________________________________________________________________________ | |
cdd4e0e2 | 67 | void 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 | 82 | void 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 | } |