]>
Commit | Line | Data |
---|---|---|
5a5a1232 | 1 | // $Id$ |
d810d0de | 2 | // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007 |
3 | ||
4 | /************************************************************************** | |
5 | * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. * | |
6 | * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for * | |
51346b82 | 7 | * full copyright notice. * |
d810d0de | 8 | **************************************************************************/ |
5a5a1232 | 9 | |
e9ece5b4 | 10 | #if !defined(__CINT__) || defined(__MAKECINT__) |
11 | ||
12 | #include "TString.h" | |
13 | #include "TMath.h" | |
14 | #include "TGListTree.h" | |
15 | #include "TEveVSDStructs.h" | |
16 | #include "TEveManager.h" | |
17 | #include "TEveTrackPropagator.h" | |
18 | ||
19 | #include "AliESDEvent.h" | |
20 | #include "AliESDtrackCuts.h" | |
21 | #include "AliESDtrack.h" | |
22 | #include "AliExternalTrackParam.h" | |
23 | ||
24 | #include "EVE/EveBase/AliEveTrack.h" | |
25 | #include "EVE/EveBase/AliEveMagField.h" | |
26 | #include "EVE/EveBase/AliEveEventManager.h" | |
27 | ||
28 | #endif | |
29 | ||
30 | ||
29207369 | 31 | // Use inner-tpc track params when its refit failed. |
32 | Bool_t g_esd_tracks_use_ip_on_failed_its_refit = kFALSE; | |
33 | ||
6336e5d7 | 34 | // Use magnetic-field as retrieved from GRP. |
35 | Bool_t g_esd_tracks_true_field = kTRUE; | |
36 | ||
37 | // Use Runge-Kutta track stepper. | |
38 | Bool_t g_esd_tracks_rk_stepper = kFALSE; | |
39 | ||
40 | ||
41 | //============================================================================== | |
42 | ||
43 | void esd_track_propagator_setup(TEveTrackPropagator* trkProp, | |
44 | Float_t magF, Float_t maxR) | |
45 | { | |
46 | if (g_esd_tracks_true_field) | |
47 | { | |
48 | trkProp->SetMagFieldObj(new AliEveMagField); | |
49 | } | |
50 | else | |
51 | { | |
52 | trkProp->SetMagField(magF); | |
53 | } | |
54 | if (g_esd_tracks_rk_stepper) | |
55 | { | |
56 | trkProp->SetStepper(TEveTrackPropagator::kRungeKutta); | |
57 | } | |
58 | trkProp->SetMaxR(maxR); | |
59 | } | |
60 | ||
61 | //============================================================================== | |
62 | ||
29207369 | 63 | TString esd_track_title(AliESDtrack* t) |
ad5abc55 | 64 | { |
65 | TString s; | |
29207369 | 66 | |
67 | Int_t label = t->GetLabel(), index = t->GetID(); | |
68 | TString idx(index == kMinInt ? "<undef>" : Form("%d", index)); | |
69 | TString lbl(label == kMinInt ? "<undef>" : Form("%d", label)); | |
70 | ||
71 | Double_t p[3], v[3]; | |
72 | t->GetXYZ(v); | |
73 | t->GetPxPyPz(p); | |
d6962cc4 | 74 | Double_t pt = t->Pt(); |
75 | Double_t ptsig = TMath::Sqrt(t->GetSigma1Pt2()); | |
76 | Double_t ptsq = pt*pt; | |
77 | Double_t ptm = pt / (1.0 + pt*ptsig); | |
78 | Double_t ptM = pt / (1.0 - pt*ptsig); | |
29207369 | 79 | |
80 | s = Form("Index=%s, Label=%s\nChg=%d, Pdg=%d\n" | |
d6962cc4 | 81 | "pT = %.3f + %.3f - %.3f [%.3f]\n" |
82 | "P = (%.3f, %.3f, %.3f)\n" | |
83 | "V = (%.3f, %.3f, %.3f)\n", | |
29207369 | 84 | idx.Data(), lbl.Data(), t->Charge(), 0, |
d6962cc4 | 85 | pt, ptM - pt, pt - ptm, ptsig*ptsq, |
86 | p[0], p[1], p[2], | |
87 | v[0], v[1], v[2]); | |
29207369 | 88 | |
ad5abc55 | 89 | Int_t o; |
d6962cc4 | 90 | s += "Det (in,out,refit,pid):\n"; |
ad5abc55 | 91 | o = AliESDtrack::kITSin; |
6b7fd3a4 | 92 | s += Form("ITS (%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3)); |
ad5abc55 | 93 | o = AliESDtrack::kTPCin; |
6b7fd3a4 | 94 | s += Form("TPC(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3)); |
ad5abc55 | 95 | o = AliESDtrack::kTRDin; |
6b7fd3a4 | 96 | s += Form("TRD(%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3)); |
ad5abc55 | 97 | o = AliESDtrack::kTOFin; |
6b7fd3a4 | 98 | s += Form("TOF(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3)); |
ad5abc55 | 99 | o = AliESDtrack::kHMPIDout; |
6b7fd3a4 | 100 | s += Form("HMPID(out=%d,pid=%d)\n", t->IsOn(o), t->IsOn(o<<1)); |
ad5abc55 | 101 | s += Form("ESD pid=%d", t->IsOn(AliESDtrack::kESDpid)); |
86f12f78 | 102 | |
29207369 | 103 | if (t->IsOn(AliESDtrack::kESDpid)) |
104 | { | |
105 | Double_t pid[5]; | |
106 | t->GetESDpid(pid); | |
107 | s += Form("\n[%.2f %.2f %.2f %.2f %.2f]", pid[0], pid[1], pid[2], pid[3], pid[4]); | |
108 | } | |
51346b82 | 109 | |
29207369 | 110 | return s; |
86f12f78 | 111 | } |
112 | ||
6336e5d7 | 113 | //============================================================================== |
114 | ||
e9ece5b4 | 115 | void esd_track_add_param(AliEveTrack* track, const AliExternalTrackParam* tp) |
c222eb1d | 116 | { |
29207369 | 117 | // Add additional track parameters as a path-mark to track. |
118 | ||
c222eb1d | 119 | if (tp == 0) |
120 | return; | |
121 | ||
29207369 | 122 | Double_t pbuf[3], vbuf[3]; |
c222eb1d | 123 | tp->GetXYZ(vbuf); |
124 | tp->GetPxPyPz(pbuf); | |
125 | ||
a15e6d7d | 126 | TEvePathMark pm(TEvePathMark::kReference); |
127 | pm.fV.Set(vbuf); | |
128 | pm.fP.Set(pbuf); | |
c222eb1d | 129 | track->AddPathMark(pm); |
130 | } | |
131 | ||
6336e5d7 | 132 | //============================================================================== |
133 | ||
e9ece5b4 | 134 | AliEveTrack* esd_make_track(AliESDtrack *at, TEveTrackList* cont) |
29207369 | 135 | { |
136 | // Make a standard track representation and put it into given container. | |
137 | ||
138 | // Choose which parameters to use a track's starting point. | |
139 | // If gkFixFailedITSExtr is TRUE (FALSE by default) and | |
140 | // if ITS refit failed, take track parameters at inner TPC radius. | |
e9ece5b4 | 141 | |
142 | const AliExternalTrackParam* tp = at; | |
29207369 | 143 | |
144 | Bool_t innerTaken = kFALSE; | |
145 | if ( ! at->IsOn(AliESDtrack::kITSrefit) && g_esd_tracks_use_ip_on_failed_its_refit) | |
146 | { | |
147 | tp = at->GetInnerParam(); | |
148 | innerTaken = kTRUE; | |
149 | } | |
150 | ||
50ac85c6 | 151 | AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator()); |
29207369 | 152 | track->SetAttLineAttMarker(cont); |
0e33c639 | 153 | track->SetName(Form("AliEveTrack %d", at->GetID())); |
29207369 | 154 | track->SetElementTitle(esd_track_title(at)); |
9b6216c0 | 155 | track->SetSourceObject(at); |
29207369 | 156 | |
157 | // Add inner/outer track parameters as path-marks. | |
158 | if (at->IsOn(AliESDtrack::kTPCrefit)) | |
159 | { | |
160 | if ( ! innerTaken) | |
161 | { | |
162 | esd_track_add_param(track, at->GetInnerParam()); | |
163 | } | |
164 | esd_track_add_param(track, at->GetOuterParam()); | |
165 | } | |
a15e6d7d | 166 | |
29207369 | 167 | return track; |
168 | } | |
86f12f78 | 169 | |
6336e5d7 | 170 | |
171 | //============================================================================== | |
172 | // esd_tracks() | |
173 | //============================================================================== | |
174 | ||
29207369 | 175 | TEveTrackList* esd_tracks() |
5a5a1232 | 176 | { |
d810d0de | 177 | AliESDEvent* esd = AliEveEventManager::AssertESD(); |
5a5a1232 | 178 | |
51346b82 | 179 | TEveTrackList* cont = new TEveTrackList("ESD Tracks"); |
fbc350a3 | 180 | cont->SetMainColor(6); |
6336e5d7 | 181 | |
182 | esd_track_propagator_setup(cont->GetPropagator(), | |
183 | 0.1*esd->GetMagneticField(), 520); | |
5a5a1232 | 184 | |
84aff7a4 | 185 | gEve->AddElement(cont); |
5a5a1232 | 186 | |
29207369 | 187 | Int_t count = 0; |
188 | for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n) | |
d31ac39d | 189 | { |
29207369 | 190 | ++count; |
0e33c639 | 191 | AliEveTrack* track = esd_make_track(esd->GetTrack(n), cont); |
5a5a1232 | 192 | |
29207369 | 193 | cont->AddElement(track); |
194 | } | |
195 | cont->SetTitle(Form("N=%d", count)); | |
196 | cont->MakeTracks(); | |
5a5a1232 | 197 | |
29207369 | 198 | gEve->Redraw3D(); |
5a5a1232 | 199 | |
29207369 | 200 | return cont; |
201 | } | |
5a5a1232 | 202 | |
29207369 | 203 | TEveElementList* esd_tracks_MI() |
204 | { | |
205 | AliESDEvent* esd = AliEveEventManager::AssertESD(); | |
c222eb1d | 206 | |
29207369 | 207 | TEveElementList* cont = new TEveElementList("ESD Tracks MI"); |
208 | gEve->AddElement(cont); | |
c222eb1d | 209 | |
29207369 | 210 | Int_t count = 0; |
211 | for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n) | |
212 | { | |
213 | ++count; | |
214 | AliESDtrack* at = esd->GetTrack(n); | |
215 | TEveLine* l = new TEveLine; | |
216 | l->SetLineColor(5); | |
217 | at->FillPolymarker(l, esd->GetMagneticField(), 0, 250, 5); | |
218 | l->SetName(Form("ESDTrackMI %d", at->GetID())); | |
219 | l->SetElementTitle(esd_track_title(at)); | |
9b6216c0 | 220 | l->SetSourceObject(at); |
c222eb1d | 221 | |
29207369 | 222 | cont->AddElement(l); |
5a5a1232 | 223 | } |
29207369 | 224 | cont->SetTitle(Form("N=%d", count)); |
32e219c2 | 225 | |
84aff7a4 | 226 | gEve->Redraw3D(); |
5a5a1232 | 227 | |
228 | return cont; | |
229 | } | |
230 | ||
6336e5d7 | 231 | |
232 | //============================================================================== | |
a8600b56 | 233 | // esd_tracks_from_array() |
6336e5d7 | 234 | //============================================================================== |
a8600b56 | 235 | |
84aff7a4 | 236 | TEveTrackList* esd_tracks_from_array(TCollection* col, AliESDEvent* esd=0) |
5a5a1232 | 237 | { |
238 | // Retrieves AliESDTrack's from collection. | |
239 | // See example usage with AliAnalysisTrackCuts in the next function. | |
240 | ||
d810d0de | 241 | if (esd == 0) esd = AliEveEventManager::AssertESD(); |
86f12f78 | 242 | |
51346b82 | 243 | TEveTrackList* cont = new TEveTrackList("ESD Tracks"); |
fbc350a3 | 244 | cont->SetMainColor(6); |
6336e5d7 | 245 | |
246 | esd_track_propagator_setup(cont->GetPropagator(), | |
247 | 0.1*esd->GetMagneticField(), 520); | |
5a5a1232 | 248 | |
84aff7a4 | 249 | gEve->AddElement(cont); |
5a5a1232 | 250 | |
5a5a1232 | 251 | Int_t count = 0; |
252 | TIter next(col); | |
253 | TObject *obj; | |
84aff7a4 | 254 | while ((obj = next()) != 0) |
d31ac39d | 255 | { |
29207369 | 256 | if (obj->IsA()->InheritsFrom("AliESDtrack") == kFALSE) |
257 | { | |
258 | Warning("esd_tracks_from_array", "Object '%s', '%s' is not an AliESDtrack.", | |
5a5a1232 | 259 | obj->GetName(), obj->GetTitle()); |
260 | continue; | |
261 | } | |
262 | ||
263 | ++count; | |
e9ece5b4 | 264 | AliESDtrack* at = reinterpret_cast<AliESDtrack*>(obj); |
5a5a1232 | 265 | |
0e33c639 | 266 | AliEveTrack* track = esd_make_track(at, cont); |
29207369 | 267 | cont->AddElement(track); |
5a5a1232 | 268 | } |
6b7fd3a4 | 269 | cont->SetTitle(Form("N=%d", count)); |
5a5a1232 | 270 | cont->MakeTracks(); |
32e219c2 | 271 | |
84aff7a4 | 272 | gEve->Redraw3D(); |
5a5a1232 | 273 | |
274 | return cont; | |
275 | } | |
276 | ||
277 | void esd_tracks_alianalcuts_demo() | |
278 | { | |
d810d0de | 279 | AliESDEvent* esd = AliEveEventManager::AssertESD(); |
5a5a1232 | 280 | |
fcfc8b01 | 281 | AliESDtrackCuts atc; |
5a5a1232 | 282 | atc.SetPtRange(0.1, 5); |
283 | atc.SetRapRange(-1, 1); | |
284 | ||
fcfc8b01 | 285 | esd_tracks_from_array(atc.GetAcceptedTracks(esd), esd); |
5a5a1232 | 286 | } |
a8600b56 | 287 | |
6336e5d7 | 288 | |
289 | //============================================================================== | |
29207369 | 290 | // esd_tracks_by_category |
6336e5d7 | 291 | //============================================================================== |
a8600b56 | 292 | |
293 | Float_t get_sigma_to_vertex(AliESDtrack* esdTrack) | |
294 | { | |
295 | // Taken from: PWG0/esdTrackCuts/AliESDtrackCuts.cxx | |
296 | // Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* esdTrack) | |
297 | ||
298 | Float_t b[2]; | |
299 | Float_t bRes[2]; | |
300 | Float_t bCov[3]; | |
301 | esdTrack->GetImpactParameters(b,bCov); | |
29207369 | 302 | if (bCov[0] <= 0 || bCov[2] <= 0) |
303 | { | |
d31ac39d | 304 | printf("Estimated b resolution lower or equal zero!\n"); |
29207369 | 305 | bCov[0] = bCov[2] = 0; |
a8600b56 | 306 | } |
307 | bRes[0] = TMath::Sqrt(bCov[0]); | |
308 | bRes[1] = TMath::Sqrt(bCov[2]); | |
309 | ||
310 | // ----------------------------------- | |
311 | // How to get to a n-sigma cut? | |
312 | // | |
313 | // The accumulated statistics from 0 to d is | |
314 | // | |
315 | // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma) | |
316 | // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma) | |
317 | // | |
318 | // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-x**2)/2) | |
319 | // Can this be expressed in a different way? | |
320 | ||
29207369 | 321 | if (bRes[0] == 0 || bRes[1] == 0) |
a8600b56 | 322 | return -1; |
323 | ||
324 | Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2)); | |
325 | ||
326 | // stupid rounding problem screws up everything: | |
327 | // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :( | |
328 | if (TMath::Exp(-d * d / 2) < 1e-10) | |
329 | return 1000; | |
330 | ||
331 | d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2); | |
332 | return d; | |
333 | } | |
334 | ||
29207369 | 335 | TEveElementList* g_esd_tracks_by_category_container = 0; |
336 | ||
337 | TEveElementList* esd_tracks_by_category() | |
a8600b56 | 338 | { |
29207369 | 339 | // Import ESD tracks, separate them into several containers |
340 | // according to primary-vertex cut and ITS&TPC refit status. | |
a8600b56 | 341 | |
d810d0de | 342 | AliESDEvent* esd = AliEveEventManager::AssertESD(); |
a8600b56 | 343 | |
29207369 | 344 | TEveElementList* cont = new TEveElementList("ESD Tracks by category"); |
84aff7a4 | 345 | gEve->AddElement(cont); |
6b7fd3a4 | 346 | |
29207369 | 347 | g_esd_tracks_by_category_container = cont; |
348 | ||
df56539f | 349 | const Int_t nCont = 7; |
350 | const Float_t maxR = 520; | |
351 | const Float_t magF = 0.1*esd->GetMagneticField(); | |
352 | ||
353 | TEveTrackList *tl[nCont]; | |
354 | Int_t tc[nCont]; | |
6b7fd3a4 | 355 | Int_t count = 0; |
a8600b56 | 356 | |
84aff7a4 | 357 | tl[0] = new TEveTrackList("Sigma < 3"); |
a8600b56 | 358 | tc[0] = 0; |
6336e5d7 | 359 | esd_track_propagator_setup(tl[0]->GetPropagator(), magF, maxR); |
fbc350a3 | 360 | tl[0]->SetMainColor(3); |
29207369 | 361 | cont->AddElement(tl[0]); |
a8600b56 | 362 | |
84aff7a4 | 363 | tl[1] = new TEveTrackList("3 < Sigma < 5"); |
a8600b56 | 364 | tc[1] = 0; |
6336e5d7 | 365 | esd_track_propagator_setup(tl[1]->GetPropagator(), magF, maxR); |
fbc350a3 | 366 | tl[1]->SetMainColor(7); |
29207369 | 367 | cont->AddElement(tl[1]); |
a8600b56 | 368 | |
84aff7a4 | 369 | tl[2] = new TEveTrackList("5 < Sigma"); |
a8600b56 | 370 | tc[2] = 0; |
6336e5d7 | 371 | esd_track_propagator_setup(tl[2]->GetPropagator(), magF, maxR); |
fbc350a3 | 372 | tl[2]->SetMainColor(46); |
29207369 | 373 | cont->AddElement(tl[2]); |
a8600b56 | 374 | |
84aff7a4 | 375 | tl[3] = new TEveTrackList("no ITS refit; Sigma < 5"); |
a8600b56 | 376 | tc[3] = 0; |
6336e5d7 | 377 | esd_track_propagator_setup(tl[3]->GetPropagator(), magF, maxR); |
fbc350a3 | 378 | tl[3]->SetMainColor(41); |
29207369 | 379 | cont->AddElement(tl[3]); |
a8600b56 | 380 | |
84aff7a4 | 381 | tl[4] = new TEveTrackList("no ITS refit; Sigma > 5"); |
f206464b | 382 | tc[4] = 0; |
6336e5d7 | 383 | esd_track_propagator_setup(tl[4]->GetPropagator(), magF, maxR); |
fbc350a3 | 384 | tl[4]->SetMainColor(48); |
29207369 | 385 | cont->AddElement(tl[4]); |
f206464b | 386 | |
6b7fd3a4 | 387 | tl[5] = new TEveTrackList("no TPC refit"); |
388 | tc[5] = 0; | |
6336e5d7 | 389 | esd_track_propagator_setup(tl[5]->GetPropagator(), magF, maxR); |
6b7fd3a4 | 390 | tl[5]->SetMainColor(kRed); |
29207369 | 391 | cont->AddElement(tl[5]); |
6b7fd3a4 | 392 | |
df56539f | 393 | tl[6] = new TEveTrackList("ITS stand-alone"); |
394 | tc[6] = 0; | |
6336e5d7 | 395 | esd_track_propagator_setup(tl[6]->GetPropagator(), magF, maxR); |
df56539f | 396 | tl[6]->SetMainColor(kMagenta - 9); |
29207369 | 397 | cont->AddElement(tl[6]); |
df56539f | 398 | |
6b7fd3a4 | 399 | for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n) |
d31ac39d | 400 | { |
a8600b56 | 401 | AliESDtrack* at = esd->GetTrack(n); |
402 | ||
403 | Float_t s = get_sigma_to_vertex(at); | |
404 | Int_t ti; | |
405 | if (s < 3) ti = 0; | |
406 | else if (s <= 5) ti = 1; | |
407 | else ti = 2; | |
408 | ||
df56539f | 409 | if (at->IsOn(AliESDtrack::kITSin) && ! at->IsOn(AliESDtrack::kTPCin)) |
410 | { | |
411 | ti = 6; | |
412 | } | |
413 | else if (at->IsOn(AliESDtrack::kTPCin) && ! at->IsOn(AliESDtrack::kTPCrefit)) | |
6b7fd3a4 | 414 | { |
415 | ti = 5; | |
416 | } | |
df56539f | 417 | else if ( ! at->IsOn(AliESDtrack::kITSrefit)) |
6b7fd3a4 | 418 | { |
f206464b | 419 | ti = (ti == 2) ? 4 : 3; |
a8600b56 | 420 | } |
421 | ||
84aff7a4 | 422 | TEveTrackList* tlist = tl[ti]; |
a8600b56 | 423 | ++tc[ti]; |
424 | ++count; | |
425 | ||
0e33c639 | 426 | AliEveTrack* track = esd_make_track(at, tlist); |
427 | track->SetName(Form("AliEveTrack idx=%d, sigma=%5.3f", at->GetID(), s)); | |
29207369 | 428 | tlist->AddElement(track); |
a8600b56 | 429 | } |
430 | ||
df56539f | 431 | for (Int_t ti = 0; ti < nCont; ++ti) |
6b7fd3a4 | 432 | { |
84aff7a4 | 433 | TEveTrackList* tlist = tl[ti]; |
6b7fd3a4 | 434 | tlist->SetName(Form("%s [%d]", tlist->GetName(), tlist->NumChildren())); |
435 | tlist->SetTitle(Form("N tracks=%d", tc[ti])); | |
a8600b56 | 436 | |
437 | tlist->MakeTracks(); | |
c12be4d4 | 438 | |
439 | Bool_t good_cont = ti <= 1; | |
440 | if (AliEveTrackCounter::IsActive()) | |
441 | { | |
442 | AliEveTrackCounter::fgInstance->RegisterTracks(tlist, good_cont); | |
443 | } | |
444 | else | |
445 | { | |
446 | if ( ! good_cont) | |
447 | tlist->SetLineStyle(6); | |
448 | } | |
a8600b56 | 449 | } |
6b7fd3a4 | 450 | cont->SetTitle(Form("N all tracks = %d", count)); |
451 | // ??? The following does not always work: | |
452 | cont->FindListTreeItem(gEve->GetListTree())->SetOpen(kTRUE); | |
453 | ||
84aff7a4 | 454 | gEve->Redraw3D(); |
a8600b56 | 455 | |
456 | return cont; | |
457 | } |