]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/alice-macros/esd_tracks.C
Almost final version of scanning tools.
[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);
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 115void 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 134AliEveTrack* 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 175TEveTrackList* 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 203TEveElementList* 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 236TEveTrackList* 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
277void 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
293Float_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 335TEveElementList* g_esd_tracks_by_category_container = 0;
336
337TEveElementList* 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}