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