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__)
16 #include <TGListTree.h>
18 #include <TEveVSDStructs.h>
19 #include <TEveManager.h>
20 #include <TEveTrackPropagator.h>
22 #include <EveBase/AliEveTrack.h>
23 #include <EveBase/AliEveTrackCounter.h>
24 #include <EveBase/AliEveMagField.h>
25 #include <EveBase/AliEveEventManager.h>
27 #include <AliESDEvent.h>
28 #include <AliESDfriend.h>
29 #include <AliESDtrackCuts.h>
30 #include <AliESDtrack.h>
31 #include <AliESDfriendTrack.h>
32 #include <AliExternalTrackParam.h>
34 #include <AliPWG0Helper.h>
39 // Use inner-tpc track params when its refit failed.
40 Bool_t g_esd_tracks_use_ip_on_failed_its_refit = kFALSE;
42 // Use magnetic-field as retrieved from GRP.
43 Bool_t g_esd_tracks_true_field = kTRUE;
45 // Use Runge-Kutta track stepper.
46 Bool_t g_esd_tracks_rk_stepper = kFALSE;
49 //==============================================================================
51 void esd_track_propagator_setup(TEveTrackPropagator* trkProp,
52 Float_t magF, Float_t maxR)
54 if (g_esd_tracks_true_field)
56 trkProp->SetMagFieldObj(new AliEveMagField);
60 trkProp->SetMagField(magF);
62 if (g_esd_tracks_rk_stepper)
64 trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
66 trkProp->SetMaxR(maxR);
69 //==============================================================================
71 TString esd_track_title(AliESDtrack* t)
75 Int_t label = t->GetLabel(), index = t->GetID();
76 TString idx(index == kMinInt ? "<undef>" : Form("%d", index));
77 TString lbl(label == kMinInt ? "<undef>" : Form("%d", label));
82 Double_t pt = t->Pt();
83 Double_t ptsig = TMath::Sqrt(t->GetSigma1Pt2());
84 Double_t ptsq = pt*pt;
85 Double_t ptm = pt / (1.0 + pt*ptsig);
86 Double_t ptM = pt / (1.0 - pt*ptsig);
88 s = Form("Index=%s, Label=%s\nChg=%d, Pdg=%d\n"
89 "pT = %.3f + %.3f - %.3f [%.3f]\n"
90 "P = (%.3f, %.3f, %.3f)\n"
91 "V = (%.3f, %.3f, %.3f)\n",
92 idx.Data(), lbl.Data(), t->Charge(), 0,
93 pt, ptM - pt, pt - ptm, ptsig*ptsq,
98 s += "Det (in,out,refit,pid):\n";
99 o = AliESDtrack::kITSin;
100 s += Form("ITS (%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
101 o = AliESDtrack::kTPCin;
102 s += Form("TPC(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
103 o = AliESDtrack::kTRDin;
104 s += Form("TRD(%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
105 o = AliESDtrack::kTOFin;
106 s += Form("TOF(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
107 o = AliESDtrack::kHMPIDout;
108 s += Form("HMPID(out=%d,pid=%d)\n", t->IsOn(o), t->IsOn(o<<1));
109 s += Form("ESD pid=%d", t->IsOn(AliESDtrack::kESDpid));
111 if (t->IsOn(AliESDtrack::kESDpid))
115 s += Form("\n[%.2f %.2f %.2f %.2f %.2f]", pid[0], pid[1], pid[2], pid[3], pid[4]);
121 //==============================================================================
123 void esd_track_add_param(AliEveTrack* track, const AliExternalTrackParam* tp)
125 // Add additional track parameters as a path-mark to track.
130 Double_t pbuf[3], vbuf[3];
134 TEvePathMark pm(TEvePathMark::kReference);
137 track->AddPathMark(pm);
140 //==============================================================================
142 AliEveTrack* esd_make_track_TPC(AliESDtrack *at, AliESDfriendTrack* aft, TEveTrackList* cont)
144 // Make a TPC track representation and put it into given container.
146 AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
147 track->SetAttLineAttMarker(cont);
148 track->SetName(Form("AliEveTrack %d", at->GetID()));
149 track->SetElementTitle(esd_track_title(at));
150 track->SetSourceObject(at);
152 // Add inner/outer track parameters as start point and pathmark.
153 if (at->GetInnerParam()) track->SetStartParams(at->GetInnerParam());
155 if (aft->GetTPCOut()) esd_track_add_param(track, aft->GetTPCOut());
161 AliEveTrack* esd_make_track_ITS_standalone(AliESDtrack *at, AliESDfriendTrack* aft, TEveTrackList* cont)
163 // Make a ITS standalone track representation and put it into given container.
165 if ( !(!at->IsOn(AliESDtrack::kTPCin) &&
166 at->IsOn(AliESDtrack::kITSout)) ) return NULL; //only ITS standalone
167 AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
168 track->SetAttLineAttMarker(cont);
169 track->SetName(Form("AliEveTrack %d", at->GetID()));
170 track->SetElementTitle(esd_track_title(at));
171 track->SetSourceObject(at);
173 // Add inner/outer track parameters as path-marks.
174 if (aft->GetITSOut())
176 esd_track_add_param(track, aft->GetITSOut());
183 AliEveTrack* esd_make_track_ITS(AliESDtrack *at, AliESDfriendTrack* aft, TEveTrackList* cont)
185 // Make a ITS track representation and put it into given container.
187 if ( (!at->IsOn(AliESDtrack::kTPCin) &&
188 at->IsOn(AliESDtrack::kITSout)) ) return NULL; //ignore ITS standalone
189 AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
190 track->SetAttLineAttMarker(cont);
191 track->SetName(Form("AliEveTrack %d", at->GetID()));
192 track->SetElementTitle(esd_track_title(at));
193 track->SetSourceObject(at);
195 // Add inner/outer track parameters as path-marks.
196 if (aft->GetITSOut())
198 esd_track_add_param(track, aft->GetITSOut());
205 AliEveTrack* esd_make_track(AliESDtrack *at, TEveTrackList* cont)
207 // Make a standard track representation and put it into given container.
209 // Choose which parameters to use a track's starting point.
210 // If gkFixFailedITSExtr is TRUE (FALSE by default) and
211 // if ITS refit failed, take track parameters at inner TPC radius.
213 const AliExternalTrackParam* tp = at;
215 Bool_t innerTaken = kFALSE;
216 if ( ! at->IsOn(AliESDtrack::kITSrefit) && g_esd_tracks_use_ip_on_failed_its_refit)
218 tp = at->GetInnerParam();
222 AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
223 track->SetAttLineAttMarker(cont);
224 track->SetName(Form("AliEveTrack %d", at->GetID()));
225 track->SetElementTitle(esd_track_title(at));
226 track->SetSourceObject(at);
228 // Add inner/outer track parameters as path-marks.
229 if (at->IsOn(AliESDtrack::kTPCrefit))
233 esd_track_add_param(track, at->GetInnerParam());
235 esd_track_add_param(track, at->GetOuterParam());
242 //==============================================================================
244 //==============================================================================
246 TEveTrackList* esd_tracks_TPC()
248 AliESDEvent* esd = AliEveEventManager::AssertESD();
249 AliESDfriend* esd_friend = AliEveEventManager::AssertESDfriend();
251 TEveTrackList* cont = new TEveTrackList("TPC Tracks");
252 cont->SetMainColor(kMagenta);
254 esd_track_propagator_setup(cont->GetPropagator(),
255 0.1*esd->GetMagneticField(), 520);
257 gEve->AddElement(cont);
260 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
263 if (!esd->GetTrack(n)) continue;
264 if (!esd_friend->GetTrack(n)) continue;
265 AliEveTrack* track = esd_make_track_TPC(esd->GetTrack(n), esd_friend->GetTrack(n), cont);
266 if (!track) continue;
268 cont->AddElement(track);
270 cont->SetTitle(Form("N=%d", count));
278 TEveTrackList* esd_tracks_ITS()
280 AliESDEvent* esd = AliEveEventManager::AssertESD();
281 AliESDfriend* esd_friend = AliEveEventManager::AssertESDfriend();
283 TEveTrackList* cont = new TEveTrackList("ITS Tracks");
284 cont->SetMainColor(kMagenta+3);
286 esd_track_propagator_setup(cont->GetPropagator(),
287 0.1*esd->GetMagneticField(), 520);
288 cont->GetPropagator()->SetMaxR(85.0);
289 cont->SetLineWidth(1);
291 gEve->AddElement(cont);
294 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
297 if (!esd->GetTrack(n)) continue;
298 if (!esd_friend->GetTrack(n)) continue;
299 AliEveTrack* track = esd_make_track_ITS(esd->GetTrack(n), esd_friend->GetTrack(n), cont);
300 if (!track) continue;
302 cont->AddElement(track);
304 cont->SetTitle(Form("N=%d", count));
312 TEveTrackList* esd_tracks_ITS_standalone()
314 AliESDEvent* esd = AliEveEventManager::AssertESD();
315 AliESDfriend* esd_friend = AliEveEventManager::AssertESDfriend();
317 TEveTrackList* cont = new TEveTrackList("ITS Standalone Tracks");
318 cont->SetMainColor(kBlue);
320 esd_track_propagator_setup(cont->GetPropagator(),
321 0.1*esd->GetMagneticField(), 520);
322 cont->GetPropagator()->SetMaxR(85.0);
323 cont->SetLineWidth(1);
325 gEve->AddElement(cont);
328 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
331 if (!esd->GetTrack(n)) continue;
332 if (!esd_friend->GetTrack(n)) continue;
333 AliEveTrack* track = esd_make_track_ITS_standalone(esd->GetTrack(n), esd_friend->GetTrack(n), cont);
334 if (!track) continue;
336 cont->AddElement(track);
338 cont->SetTitle(Form("N=%d", count));
346 TEveTrackList* esd_tracks()
348 AliESDEvent* esd = AliEveEventManager::AssertESD();
350 TEveTrackList* cont = new TEveTrackList("ESD Tracks");
351 cont->SetMainColor(6);
353 esd_track_propagator_setup(cont->GetPropagator(),
354 0.1*esd->GetMagneticField(), 520);
356 gEve->AddElement(cont);
359 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
362 AliEveTrack* track = esd_make_track(esd->GetTrack(n), cont);
364 cont->AddElement(track);
366 cont->SetTitle(Form("N=%d", count));
374 TEveTrackList* esd_tracks_MI()
376 AliESDEvent* esd = AliEveEventManager::AssertESD();
378 TEveTrackList* cont = new TEveTrackList("ESD Tracks MI");
379 cont->SetLineColor(5);
380 gEve->AddElement(cont);
383 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
386 AliESDtrack* at = esd->GetTrack(n);
387 AliEveTrack* l = new AliEveTrack(at, cont->GetPropagator());
388 l->SetName(Form("ESDTrackMI %d", at->GetID()));
389 l->SetElementTitle(esd_track_title(at));
390 l->SetAttLineAttMarker(cont);
391 l->SetSourceObject(at);
393 at->FillPolymarker(l, esd->GetMagneticField(), 0, 250, 5);
395 l->SetLockPoints(kTRUE);
398 cont->SetTitle(Form("N=%d", count));
406 //==============================================================================
407 // esd_tracks_from_array()
408 //==============================================================================
410 TEveTrackList* esd_tracks_from_array(TCollection* col, AliESDEvent* esd=0)
412 // Retrieves AliESDTrack's from collection.
413 // See example usage with AliAnalysisTrackCuts in the next function.
415 if (esd == 0) esd = AliEveEventManager::AssertESD();
417 TEveTrackList* cont = new TEveTrackList("ESD Tracks");
418 cont->SetMainColor(6);
420 esd_track_propagator_setup(cont->GetPropagator(),
421 0.1*esd->GetMagneticField(), 520);
423 gEve->AddElement(cont);
428 while ((obj = next()) != 0)
430 if (obj->IsA()->InheritsFrom("AliESDtrack") == kFALSE)
432 Warning("esd_tracks_from_array", "Object '%s', '%s' is not an AliESDtrack.",
433 obj->GetName(), obj->GetTitle());
438 AliESDtrack* at = reinterpret_cast<AliESDtrack*>(obj);
440 AliEveTrack* track = esd_make_track(at, cont);
441 cont->AddElement(track);
443 cont->SetTitle(Form("N=%d", count));
451 void esd_tracks_alianalcuts_demo()
453 AliESDEvent* esd = AliEveEventManager::AssertESD();
456 atc.SetPtRange(0.1, 5);
457 atc.SetRapRange(-1, 1);
459 esd_tracks_from_array(atc.GetAcceptedTracks(esd), esd);
463 //==============================================================================
464 // esd_tracks_by_category
465 //==============================================================================
467 Float_t get_sigma_to_vertex(AliESDtrack* esdTrack)
469 // Taken from: PWG0/esdTrackCuts/AliESDtrackCuts.cxx
470 // Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* esdTrack)
475 esdTrack->GetImpactParameters(b,bCov);
476 if (bCov[0] <= 0 || bCov[2] <= 0)
478 printf("Estimated b resolution lower or equal zero!\n");
479 bCov[0] = bCov[2] = 0;
481 bRes[0] = TMath::Sqrt(bCov[0]);
482 bRes[1] = TMath::Sqrt(bCov[2]);
484 // -----------------------------------
485 // How to get to a n-sigma cut?
487 // The accumulated statistics from 0 to d is
489 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
490 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
492 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-x**2)/2)
493 // Can this be expressed in a different way?
495 if (bRes[0] == 0 || bRes[1] == 0)
498 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
500 // stupid rounding problem screws up everything:
501 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
502 if (TMath::Exp(-d * d / 2) < 1e-10)
505 d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
509 TEveElementList* esd_tracks_by_category()
511 // Import ESD tracks, separate them into several containers
512 // according to primary-vertex cut and ITS&TPC refit status.
514 AliESDEvent* esd = AliEveEventManager::AssertESD();
516 TEveElementList* cont = new TEveElementList("ESD Tracks by category");
517 gEve->AddElement(cont);
519 const Int_t nCont = 9;
520 const Float_t maxR = 520;
521 const Float_t magF = 0.1*esd->GetMagneticField();
523 TEveTrackList *tl[nCont];
527 tl[0] = new TEveTrackList("Sigma < 3");
529 esd_track_propagator_setup(tl[0]->GetPropagator(), magF, maxR);
530 tl[0]->SetMainColor(3);
531 cont->AddElement(tl[0]);
533 tl[1] = new TEveTrackList("3 < Sigma < 5");
535 esd_track_propagator_setup(tl[1]->GetPropagator(), magF, maxR);
536 tl[1]->SetMainColor(7);
537 cont->AddElement(tl[1]);
539 tl[2] = new TEveTrackList("5 < Sigma");
541 esd_track_propagator_setup(tl[2]->GetPropagator(), magF, maxR);
542 tl[2]->SetMainColor(46);
543 cont->AddElement(tl[2]);
545 tl[3] = new TEveTrackList("no ITS refit; Sigma < 5");
547 esd_track_propagator_setup(tl[3]->GetPropagator(), magF, maxR);
548 tl[3]->SetMainColor(41);
549 cont->AddElement(tl[3]);
551 tl[4] = new TEveTrackList("no ITS refit; Sigma > 5");
553 esd_track_propagator_setup(tl[4]->GetPropagator(), magF, maxR);
554 tl[4]->SetMainColor(48);
555 cont->AddElement(tl[4]);
557 tl[5] = new TEveTrackList("no TPC refit");
559 esd_track_propagator_setup(tl[5]->GetPropagator(), magF, maxR);
560 tl[5]->SetMainColor(kRed);
561 cont->AddElement(tl[5]);
563 tl[6] = new TEveTrackList("ITS ncl>=3 & SPD Inner");
565 esd_track_propagator_setup(tl[6]->GetPropagator(), magF, maxR);
566 tl[6]->SetMainColor(kGreen);
567 cont->AddElement(tl[6]);
569 tl[7] = new TEveTrackList("ITS ncl>=3 & b<3 cm");
571 esd_track_propagator_setup(tl[7]->GetPropagator(), magF, maxR);
572 tl[7]->SetMainColor(kMagenta - 9);
573 cont->AddElement(tl[7]);
575 tl[8] = new TEveTrackList("ITS others");
577 esd_track_propagator_setup(tl[8]->GetPropagator(), magF, maxR);
578 tl[8]->SetMainColor(kRed + 2);
579 cont->AddElement(tl[8]);
581 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
583 AliESDtrack* at = esd->GetTrack(n);
585 Float_t s = get_sigma_to_vertex(at);
588 else if (s <= 5) ti = 1;
594 if (at->IsOn(AliESDtrack::kITSin) && ! at->IsOn(AliESDtrack::kTPCin))
596 UChar_t itsclmap = at->GetITSClusterMap();
597 Bool_t spdinner = (itsclmap & 3) != 0;
600 for (Int_t iter = 0; iter < 6; ++iter)
601 if (itsclmap & (1 << iter)) nclits ++;
605 dtobeam = TMath::Hypot(xyz[0], xyz[1]);
607 if ((nclits >= 3) && (spdinner))
609 else if ((nclits >= 3) && (dtobeam < 3.0))
614 else if (at->IsOn(AliESDtrack::kTPCin) && ! at->IsOn(AliESDtrack::kTPCrefit))
618 else if ( ! at->IsOn(AliESDtrack::kITSrefit))
620 ti = (ti == 2) ? 4 : 3;
623 TEveTrackList* tlist = tl[ti];
627 AliEveTrack* track = esd_make_track(at, tlist);
629 track->SetName(Form("ESD Track idx=%d, sigma=%5.3f", at->GetID(), s));
631 track->SetName(Form("ESD Track idx=%d, dxy=%5.3f cl=%i", at->GetID(), dtobeam, nclits));
632 tlist->AddElement(track);
635 for (Int_t ti = 0; ti < nCont; ++ti)
637 TEveTrackList* tlist = tl[ti];
638 tlist->SetName(Form("%s [%d]", tlist->GetName(), tlist->NumChildren()));
639 tlist->SetTitle(Form("N tracks=%d", tc[ti]));
643 // Bool_t good_cont = ti <= 1;
644 Bool_t good_cont = ((ti == 6) || (ti == 7));
645 if (AliEveTrackCounter::IsActive())
647 AliEveTrackCounter::fgInstance->RegisterTracks(tlist, good_cont);
652 tlist->SetLineStyle(6);
655 cont->SetTitle(Form("N all tracks = %d", count));
656 // ??? The following does not always work:
657 cont->FindListTreeItem(gEve->GetListTree())->SetOpen(kTRUE);
665 //==============================================================================
666 // esd_tracks_by_anal_cuts
667 //==============================================================================
669 AliESDtrackCuts* g_esd_tracks_anal_cuts = 0;
671 TEveElementList* esd_tracks_by_anal_cuts()
673 AliESDEvent* esd = AliEveEventManager::AssertESD();
675 if (g_esd_tracks_anal_cuts == 0)
677 gSystem->Load("libPWG0base");
678 gROOT->ProcessLine(".L $ALICE_ROOT/PWG0/CreateStandardCuts.C");
679 Int_t mode = AliPWG0Helper::kTPC;
680 if (TMath::Abs(esd->GetMagneticField()) > 0.01)
681 mode |= AliPWG0Helper::kFieldOn;
682 gROOT->ProcessLine(Form("g_esd_tracks_anal_cuts = CreateTrackCuts(%d, kFALSE)", mode));
685 TEveElementList* cont = new TEveElementList("ESD Tracks by Analysis Cuts");
686 gEve->AddElement(cont);
688 const Int_t nCont = 2;
689 const Float_t maxR = 520;
690 const Float_t magF = 0.1*esd->GetMagneticField();
692 TEveTrackList *tl[nCont];
696 tl[0] = new TEveTrackList("Passed");
698 esd_track_propagator_setup(tl[0]->GetPropagator(), magF, maxR);
699 tl[0]->SetMainColor(3);
700 cont->AddElement(tl[0]);
702 tl[1] = new TEveTrackList("Rejected");
704 esd_track_propagator_setup(tl[1]->GetPropagator(), magF, maxR);
705 tl[1]->SetMainColor(kRed);
706 cont->AddElement(tl[1]);
708 for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
710 AliESDtrack* at = esd->GetTrack(n);
712 Float_t s = get_sigma_to_vertex(at);
713 Int_t ti = (g_esd_tracks_anal_cuts->AcceptTrack(at)) ? 0 : 1;
715 TEveTrackList* tlist = tl[ti];
719 AliEveTrack* track = esd_make_track(at, tlist);
720 track->SetName(Form("ESD Track idx=%d, sigma=%5.3f", at->GetID(), s));
721 tlist->AddElement(track);
724 for (Int_t ti = 0; ti < nCont; ++ti)
726 TEveTrackList* tlist = tl[ti];
727 tlist->SetName(Form("%s [%d]", tlist->GetName(), tlist->NumChildren()));
728 tlist->SetTitle(Form("N tracks=%d", tc[ti]));
732 Bool_t good_cont = ti < 1;
733 if (AliEveTrackCounter::IsActive())
735 AliEveTrackCounter::fgInstance->RegisterTracks(tlist, good_cont);
740 tlist->SetLineStyle(6);
743 cont->SetTitle(Form("N all tracks = %d", count));
744 // ??? The following does not always work:
745 cont->FindListTreeItem(gEve->GetListTree())->SetOpen(kTRUE);