]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/alice-macros/esd_tracks.C
Cosmetically sanitize ITS visualization code.
[u/mrichter/AliRoot.git] / EVE / alice-macros / esd_tracks.C
CommitLineData
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.
32Bool_t g_esd_tracks_use_ip_on_failed_its_refit = kFALSE;
33
6336e5d7 34// Use magnetic-field as retrieved from GRP.
35Bool_t g_esd_tracks_true_field = kTRUE;
36
37// Use Runge-Kutta track stepper.
38Bool_t g_esd_tracks_rk_stepper = kFALSE;
39
40
41//==============================================================================
42
43void 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 63TString 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 106void 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 125AliEveTrack* 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 166TEveTrackList* 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 194TEveElementList* 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 227TEveTrackList* 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
268void 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
284Float_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 326TEveElementList* g_esd_tracks_by_category_container = 0;
327
328TEveElementList* 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}