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