2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
4 /**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
7 * full copyright notice. *
8 **************************************************************************/
10 #if !defined(__CINT__) || defined(__MAKECINT__)
14 #include "TGListTree.h"
15 #include "TEveVSDStructs.h"
16 #include "TEveManager.h"
17 #include "TEveTrackPropagator.h"
19 #include "AliESDEvent.h"
20 #include "AliESDtrackCuts.h"
21 #include "AliESDtrack.h"
22 #include "AliExternalTrackParam.h"
24 #include "EVE/EveBase/AliEveTrack.h"
25 #include "EVE/EveBase/AliEveMagField.h"
26 #include "EVE/EveBase/AliEveEventManager.h"
31 // Use inner-tpc track params when its refit failed.
32 Bool_t g_esd_tracks_use_ip_on_failed_its_refit = kFALSE;
34 // Use magnetic-field as retrieved from GRP.
35 Bool_t g_esd_tracks_true_field = kTRUE;
37 // Use Runge-Kutta track stepper.
38 Bool_t g_esd_tracks_rk_stepper = kFALSE;
41 //==============================================================================
43 void esd_track_propagator_setup(TEveTrackPropagator* trkProp,
44 Float_t magF, Float_t maxR)
46 if (g_esd_tracks_true_field)
48 trkProp->SetMagFieldObj(new AliEveMagField);
52 trkProp->SetMagField(magF);
54 if (g_esd_tracks_rk_stepper)
56 trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
58 trkProp->SetMaxR(maxR);
61 //==============================================================================
63 TString esd_track_title(AliESDtrack* t)
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));
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]);
81 s += "Det(in,out,refit,pid):\n";
82 o = AliESDtrack::kITSin;
83 s += Form("ITS (%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
84 o = AliESDtrack::kTPCin;
85 s += Form("TPC(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
86 o = AliESDtrack::kTRDin;
87 s += Form("TRD(%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
88 o = AliESDtrack::kTOFin;
89 s += Form("TOF(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
90 o = AliESDtrack::kHMPIDout;
91 s += Form("HMPID(out=%d,pid=%d)\n", t->IsOn(o), t->IsOn(o<<1));
92 s += Form("ESD pid=%d", t->IsOn(AliESDtrack::kESDpid));
94 if (t->IsOn(AliESDtrack::kESDpid))
98 s += Form("\n[%.2f %.2f %.2f %.2f %.2f]", pid[0], pid[1], pid[2], pid[3], pid[4]);
104 //==============================================================================
106 void esd_track_add_param(AliEveTrack* track, const AliExternalTrackParam* tp)
108 // Add additional track parameters as a path-mark to track.
113 Double_t pbuf[3], vbuf[3];
117 TEvePathMark pm(TEvePathMark::kReference);
120 track->AddPathMark(pm);
123 //==============================================================================
125 AliEveTrack* esd_make_track(AliESDtrack *at, TEveTrackList* cont)
127 // Make a standard track representation and put it into given container.
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.
133 const AliExternalTrackParam* tp = at;
135 Bool_t innerTaken = kFALSE;
136 if ( ! at->IsOn(AliESDtrack::kITSrefit) && g_esd_tracks_use_ip_on_failed_its_refit)
138 tp = at->GetInnerParam();
142 AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
143 track->SetAttLineAttMarker(cont);
144 track->SetName(Form("AliEveTrack %d", at->GetID()));
145 track->SetElementTitle(esd_track_title(at));
146 track->SetSourceObject(at);
148 // Add inner/outer track parameters as path-marks.
149 if (at->IsOn(AliESDtrack::kTPCrefit))
153 esd_track_add_param(track, at->GetInnerParam());
155 esd_track_add_param(track, at->GetOuterParam());
162 //==============================================================================
164 //==============================================================================
166 TEveTrackList* esd_tracks()
168 AliESDEvent* esd = AliEveEventManager::AssertESD();
170 TEveTrackList* cont = new TEveTrackList("ESD Tracks");
171 cont->SetMainColor(6);
173 esd_track_propagator_setup(cont->GetPropagator(),
174 0.1*esd->GetMagneticField(), 520);
176 gEve->AddElement(cont);
179 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
182 AliEveTrack* track = esd_make_track(esd->GetTrack(n), cont);
184 cont->AddElement(track);
186 cont->SetTitle(Form("N=%d", count));
194 TEveElementList* esd_tracks_MI()
196 AliESDEvent* esd = AliEveEventManager::AssertESD();
198 TEveElementList* cont = new TEveElementList("ESD Tracks MI");
199 gEve->AddElement(cont);
202 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
205 AliESDtrack* at = esd->GetTrack(n);
206 TEveLine* l = new TEveLine;
208 at->FillPolymarker(l, esd->GetMagneticField(), 0, 250, 5);
209 l->SetName(Form("ESDTrackMI %d", at->GetID()));
210 l->SetElementTitle(esd_track_title(at));
211 l->SetSourceObject(at);
215 cont->SetTitle(Form("N=%d", count));
223 //==============================================================================
224 // esd_tracks_from_array()
225 //==============================================================================
227 TEveTrackList* esd_tracks_from_array(TCollection* col, AliESDEvent* esd=0)
229 // Retrieves AliESDTrack's from collection.
230 // See example usage with AliAnalysisTrackCuts in the next function.
232 if (esd == 0) esd = AliEveEventManager::AssertESD();
234 TEveTrackList* cont = new TEveTrackList("ESD Tracks");
235 cont->SetMainColor(6);
237 esd_track_propagator_setup(cont->GetPropagator(),
238 0.1*esd->GetMagneticField(), 520);
240 gEve->AddElement(cont);
245 while ((obj = next()) != 0)
247 if (obj->IsA()->InheritsFrom("AliESDtrack") == kFALSE)
249 Warning("esd_tracks_from_array", "Object '%s', '%s' is not an AliESDtrack.",
250 obj->GetName(), obj->GetTitle());
255 AliESDtrack* at = reinterpret_cast<AliESDtrack*>(obj);
257 AliEveTrack* track = esd_make_track(at, cont);
258 cont->AddElement(track);
260 cont->SetTitle(Form("N=%d", count));
268 void esd_tracks_alianalcuts_demo()
270 AliESDEvent* esd = AliEveEventManager::AssertESD();
273 atc.SetPtRange(0.1, 5);
274 atc.SetRapRange(-1, 1);
276 esd_tracks_from_array(atc.GetAcceptedTracks(esd), esd);
280 //==============================================================================
281 // esd_tracks_by_category
282 //==============================================================================
284 Float_t get_sigma_to_vertex(AliESDtrack* esdTrack)
286 // Taken from: PWG0/esdTrackCuts/AliESDtrackCuts.cxx
287 // Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* esdTrack)
292 esdTrack->GetImpactParameters(b,bCov);
293 if (bCov[0] <= 0 || bCov[2] <= 0)
295 printf("Estimated b resolution lower or equal zero!\n");
296 bCov[0] = bCov[2] = 0;
298 bRes[0] = TMath::Sqrt(bCov[0]);
299 bRes[1] = TMath::Sqrt(bCov[2]);
301 // -----------------------------------
302 // How to get to a n-sigma cut?
304 // The accumulated statistics from 0 to d is
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)
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?
312 if (bRes[0] == 0 || bRes[1] == 0)
315 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
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)
322 d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
326 TEveElementList* g_esd_tracks_by_category_container = 0;
328 TEveElementList* esd_tracks_by_category()
330 // Import ESD tracks, separate them into several containers
331 // according to primary-vertex cut and ITS&TPC refit status.
333 AliESDEvent* esd = AliEveEventManager::AssertESD();
335 TEveElementList* cont = new TEveElementList("ESD Tracks by category");
336 gEve->AddElement(cont);
338 g_esd_tracks_by_category_container = cont;
340 const Int_t nCont = 7;
341 const Float_t maxR = 520;
342 const Float_t magF = 0.1*esd->GetMagneticField();
344 TEveTrackList *tl[nCont];
348 tl[0] = new TEveTrackList("Sigma < 3");
350 esd_track_propagator_setup(tl[0]->GetPropagator(), magF, maxR);
351 tl[0]->SetMainColor(3);
352 cont->AddElement(tl[0]);
354 tl[1] = new TEveTrackList("3 < Sigma < 5");
356 esd_track_propagator_setup(tl[1]->GetPropagator(), magF, maxR);
357 tl[1]->SetMainColor(7);
358 cont->AddElement(tl[1]);
360 tl[2] = new TEveTrackList("5 < Sigma");
362 esd_track_propagator_setup(tl[2]->GetPropagator(), magF, maxR);
363 tl[2]->SetMainColor(46);
364 cont->AddElement(tl[2]);
366 tl[3] = new TEveTrackList("no ITS refit; Sigma < 5");
368 esd_track_propagator_setup(tl[3]->GetPropagator(), magF, maxR);
369 tl[3]->SetMainColor(41);
370 cont->AddElement(tl[3]);
372 tl[4] = new TEveTrackList("no ITS refit; Sigma > 5");
374 esd_track_propagator_setup(tl[4]->GetPropagator(), magF, maxR);
375 tl[4]->SetMainColor(48);
376 cont->AddElement(tl[4]);
378 tl[5] = new TEveTrackList("no TPC refit");
380 esd_track_propagator_setup(tl[5]->GetPropagator(), magF, maxR);
381 tl[5]->SetMainColor(kRed);
382 cont->AddElement(tl[5]);
384 tl[6] = new TEveTrackList("ITS stand-alone");
386 esd_track_propagator_setup(tl[6]->GetPropagator(), magF, maxR);
387 tl[6]->SetMainColor(kMagenta - 9);
388 cont->AddElement(tl[6]);
390 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
392 AliESDtrack* at = esd->GetTrack(n);
394 Float_t s = get_sigma_to_vertex(at);
397 else if (s <= 5) ti = 1;
400 if (at->IsOn(AliESDtrack::kITSin) && ! at->IsOn(AliESDtrack::kTPCin))
404 else if (at->IsOn(AliESDtrack::kTPCin) && ! at->IsOn(AliESDtrack::kTPCrefit))
408 else if ( ! at->IsOn(AliESDtrack::kITSrefit))
410 ti = (ti == 2) ? 4 : 3;
413 TEveTrackList* tlist = tl[ti];
417 AliEveTrack* track = esd_make_track(at, tlist);
418 track->SetName(Form("AliEveTrack idx=%d, sigma=%5.3f", at->GetID(), s));
419 tlist->AddElement(track);
422 for (Int_t ti = 0; ti < nCont; ++ti)
424 TEveTrackList* tlist = tl[ti];
425 tlist->SetName(Form("%s [%d]", tlist->GetName(), tlist->NumChildren()));
426 tlist->SetTitle(Form("N tracks=%d", tc[ti]));
430 cont->SetTitle(Form("N all tracks = %d", count));
431 // ??? The following does not always work:
432 cont->FindListTreeItem(gEve->GetListTree())->SetOpen(kTRUE);