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