]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/alice-macros/esd_tracks.C
Transition to PWG new names scheme
[u/mrichter/AliRoot.git] / EVE / alice-macros / esd_tracks.C
index 4b4f7f28541d25a2bdd028a8fddbb05e71bc7b95..49e58f2763cf14402dccb33754bcd0257bad2df4 100644 (file)
  * full copyright notice.                                                 *
  **************************************************************************/
 
-TEveTrack* esd_make_track(TEveTrackPropagator*   trkProp,
-                         Int_t                  index,
-                         AliESDtrack*           at,
-                         AliExternalTrackParam* tp=0)
+#if !defined(__CINT__) || defined(__MAKECINT__)
+#include <TString.h>
+#include <TSystem.h>
+#include <TROOT.h>
+#include <TMath.h>
+#include <TGListTree.h>
+#include <TEveVSDStructs.h>
+#include <TEveManager.h>
+#include <TEveTrackPropagator.h>
+
+#include <AliESDtrackCuts.h>
+#include <AliPWG0Helper.h>
+#include <AliESDEvent.h>
+#include <AliESDfriend.h>
+#include <AliESDtrack.h>
+#include <AliESDfriendTrack.h>
+#include <AliExternalTrackParam.h>
+#include <AliEveTrack.h>
+#include <AliEveTrackCounter.h>
+#include <AliEveMagField.h>
+#include <AliEveEventManager.h>
+#endif
+
+
+// Use inner-tpc track params when its refit failed.
+Bool_t g_esd_tracks_use_ip_on_failed_its_refit = kFALSE;
+
+// Use magnetic-field as retrieved from GRP.
+Bool_t g_esd_tracks_true_field = kTRUE;
+
+// Use Runge-Kutta track stepper.
+Bool_t g_esd_tracks_rk_stepper = kFALSE;
+
+
+//==============================================================================
+
+void esd_track_propagator_setup(TEveTrackPropagator* trkProp,
+                               Float_t magF, Float_t maxR)
 {
-  // Helper function
-  Double_t      pbuf[3], vbuf[3];
-  TEveRecTrack  rt;
+  if (g_esd_tracks_true_field)
+  {
+    trkProp->SetMagFieldObj(new AliEveMagField);
+  }
+  else
+  {
+    trkProp->SetMagField(magF);
+  }
+  if (g_esd_tracks_rk_stepper)
+  {
+    trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
+  }
+  trkProp->SetMaxR(maxR);
+}
 
-  if(tp == 0) tp = at;
+//==============================================================================
 
-  rt.fLabel  = at->GetLabel();
-  rt.fIndex  = index;
-  rt.fStatus = (Int_t) at->GetStatus();
-  rt.fSign   = tp->GetSign();
-  tp->GetXYZ(vbuf);
-  rt.fV.Set(vbuf);
-  tp->GetPxPyPz(pbuf);
-  rt.fP.Set(pbuf);
-  Double_t ep = at->GetP(), mc = at->GetMass();
-  rt.fBeta = ep/TMath::Sqrt(ep*ep + mc*mc);
-
-  TEveTrack* track = new TEveTrack(&rt, trkProp);
-  //PH The line below is replaced waiting for a fix in Root
-  //PH which permits to use variable siza arguments in CINT
-  //PH on some platforms (alphalinuxgcc, solariscc5, etc.)
-  //PH  track->SetName(Form("ESDTrack %d", rt.fLabel));
-  //PH  track->SetTitle(Form("pT=%.3f, pZ=%.3f; V=(%.3f, %.3f, %.3f)",
-  //PH                rt.fSign*TMath::Hypot(rt.fP.fX, rt.fP.fY), rt.fP.fZ,
-  //PH                rt.fV.fX, rt.fV.fY, rt.fV.fZ));
-  char form[1000];
-  sprintf(form,"TEveTrack %d", rt.fIndex);
-  track->SetName(form);
-  track->SetStdTitle();
-  return track;
+TString esd_track_title(AliESDtrack* t)
+{
+  TString s;
+
+  Int_t label = t->GetLabel(), index = t->GetID();
+  TString idx(index == kMinInt ? "<undef>" : Form("%d", index));
+  TString lbl(label == kMinInt ? "<undef>" : Form("%d", label));
+
+  Double_t p[3], v[3];
+  t->GetXYZ(v);
+  t->GetPxPyPz(p);
+  Double_t pt    = t->Pt();
+  Double_t ptsig = TMath::Sqrt(t->GetSigma1Pt2());
+  Double_t ptsq  = pt*pt;
+  Double_t ptm   = pt / (1.0 + pt*ptsig);
+  Double_t ptM   = pt / (1.0 - pt*ptsig);
+
+  s = Form("Index=%s, Label=%s\nChg=%d, Pdg=%d\n"
+          "pT = %.3f + %.3f - %.3f [%.3f]\n"
+           "P  = (%.3f, %.3f, %.3f)\n"
+           "V  = (%.3f, %.3f, %.3f)\n",
+          idx.Data(), lbl.Data(), t->Charge(), 0,
+          pt, ptM - pt, pt - ptm, ptsig*ptsq,
+           p[0], p[1], p[2],
+           v[0], v[1], v[2]);
+
+  Int_t   o;
+  s += "Det (in,out,refit,pid):\n";
+  o  = AliESDtrack::kITSin;
+  s += Form("ITS (%d,%d,%d,%d)  ",  t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
+  o  = AliESDtrack::kTPCin;
+  s += Form("TPC(%d,%d,%d,%d)\n",   t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
+  o  = AliESDtrack::kTRDin;
+  s += Form("TRD(%d,%d,%d,%d) ",    t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
+  o  = AliESDtrack::kTOFin;
+  s += Form("TOF(%d,%d,%d,%d)\n",   t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
+  o  = AliESDtrack::kHMPIDout;
+  s += Form("HMPID(out=%d,pid=%d)\n", t->IsOn(o), t->IsOn(o<<1));
+  s += Form("ESD pid=%d", t->IsOn(AliESDtrack::kESDpid));
+
+  if (t->IsOn(AliESDtrack::kESDpid))
+  {
+    Double_t pid[5];
+    t->GetESDpid(pid);
+    s += Form("\n[%.2f %.2f %.2f %.2f %.2f]", pid[0], pid[1], pid[2], pid[3], pid[4]);
+  }
+
+  return s;
 }
 
-void esd_track_add_param(TEveTrack* track, AliExternalTrackParam* tp)
+//==============================================================================
+
+void esd_track_add_param(AliEveTrack* track, const AliExternalTrackParam* tp)
 {
+  // Add additional track parameters as a path-mark to track.
+
   if (tp == 0)
     return;
 
-  Double_t      pbuf[3], vbuf[3];
+  Double_t pbuf[3], vbuf[3];
   tp->GetXYZ(vbuf);
   tp->GetPxPyPz(pbuf);
 
@@ -59,85 +132,233 @@ void esd_track_add_param(TEveTrack* track, AliExternalTrackParam* tp)
   track->AddPathMark(pm);
 }
 
-// Use inner-tpc track params when its refit failed.
-Bool_t gkFixFailedITSExtr    = kFALSE;
+//==============================================================================
+
+AliEveTrack* esd_make_track_TPC(AliESDtrack *at, AliESDfriendTrack* aft, TEveTrackList* cont)
+{
+  // Make a TPC track representation and put it into given container.
+
+  AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
+  track->SetAttLineAttMarker(cont);
+  track->SetName(Form("AliEveTrack %d", at->GetID()));
+  track->SetElementTitle(esd_track_title(at));
+  track->SetSourceObject(at);
+
+  // Add inner/outer track parameters as start point and pathmark.
+  if (at->GetInnerParam()) track->SetStartParams(at->GetInnerParam());
+  else return NULL;
+  if (aft->GetTPCOut()) esd_track_add_param(track, aft->GetTPCOut());
+  else return NULL;
+
+  return track;
+}
+
+AliEveTrack* esd_make_track_ITS_standalone(AliESDtrack *at, AliESDfriendTrack* aft, TEveTrackList* cont)
+{
+  // Make a ITS standalone track representation and put it into given container.
+
+  if ( !(!at->IsOn(AliESDtrack::kTPCin) &&
+          at->IsOn(AliESDtrack::kITSout)) ) return NULL; //only ITS standalone
+  AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
+  track->SetAttLineAttMarker(cont);
+  track->SetName(Form("AliEveTrack %d", at->GetID()));
+  track->SetElementTitle(esd_track_title(at));
+  track->SetSourceObject(at);
+
+  // Add inner/outer track parameters as path-marks.
+  if (aft->GetITSOut())
+  {
+    esd_track_add_param(track, aft->GetITSOut());
+  }
+  else return NULL;
 
-// Also show lines as generated by AliESDtrack.
-Bool_t gkMakeTrackParamLines = kFALSE;
+  return track;
+}
 
-TEveTrackList* esd_tracks(Double_t min_pt=0, Double_t max_pt=10000)
+AliEveTrack* esd_make_track_ITS(AliESDtrack *at, AliESDfriendTrack* aft, TEveTrackList* cont)
+{
+  // Make a ITS track representation and put it into given container.
+
+  if ( (!at->IsOn(AliESDtrack::kTPCin) &&
+         at->IsOn(AliESDtrack::kITSout)) ) return NULL; //ignore ITS standalone
+  AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
+  track->SetAttLineAttMarker(cont);
+  track->SetName(Form("AliEveTrack %d", at->GetID()));
+  track->SetElementTitle(esd_track_title(at));
+  track->SetSourceObject(at);
+
+  // Add inner/outer track parameters as path-marks.
+  if (aft->GetITSOut())
+  {
+    esd_track_add_param(track, aft->GetITSOut());
+  }
+  else return NULL;
+
+  return track;
+}
+
+AliEveTrack* esd_make_track(AliESDtrack *at, TEveTrackList* cont)
+{
+  // Make a standard track representation and put it into given container.
+
+  // Choose which parameters to use a track's starting point.
+  // If gkFixFailedITSExtr is TRUE (FALSE by default) and
+  // if ITS refit failed, take track parameters at inner TPC radius.
+
+  const AliExternalTrackParam* tp = at;
+
+  Bool_t innerTaken = kFALSE;
+  if ( ! at->IsOn(AliESDtrack::kITSrefit) && g_esd_tracks_use_ip_on_failed_its_refit)
+  {
+    tp = at->GetInnerParam();
+    innerTaken = kTRUE;
+  }
+
+  AliEveTrack* track = new AliEveTrack(at, cont->GetPropagator());
+  track->SetAttLineAttMarker(cont);
+  track->SetName(Form("AliEveTrack %d", at->GetID()));
+  track->SetElementTitle(esd_track_title(at));
+  track->SetSourceObject(at);
+
+  // Add inner/outer track parameters as path-marks.
+  if (at->IsOn(AliESDtrack::kTPCrefit))
+  {
+    if ( ! innerTaken)
+    {
+      esd_track_add_param(track, at->GetInnerParam());
+    }
+    esd_track_add_param(track, at->GetOuterParam());
+  }
+
+  return track;
+}
+
+
+//==============================================================================
+// esd_tracks()
+//==============================================================================
+
+TEveTrackList* esd_tracks_TPC()
 {
   AliESDEvent* esd = AliEveEventManager::AssertESD();
+  AliESDfriend* esd_friend = AliEveEventManager::AssertESDfriend();
 
-  Double_t minptsq = min_pt*min_pt;
-  Double_t maxptsq = max_pt*max_pt;
-  Double_t ptsq;
+  TEveTrackList* cont = new TEveTrackList("TPC Tracks");
+  cont->SetMainColor(kMagenta);
 
-  TEveTrackList* cont = new TEveTrackList("ESD Tracks");
-  cont->SetMainColor(6);
-  TEveTrackPropagator* trkProp = cont->GetPropagator();
-  trkProp->SetMagField( 0.1*esd->GetMagneticField() );
-  trkProp->SetMaxR    ( 520 );
+  esd_track_propagator_setup(cont->GetPropagator(),
+                            0.1*esd->GetMagneticField(), 520);
 
   gEve->AddElement(cont);
 
-  TEveElementList* contLines = 0;
-  if (gkMakeTrackParamLines)
+  Int_t count = 0;
+  for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
   {
-    contLines = new TEveElementList("MyTracks");  
-    gEve->AddElement(contLines);
+    ++count;
+    if (!esd->GetTrack(n)) continue;
+    if (!esd_friend->GetTrack(n)) continue;
+    AliEveTrack* track = esd_make_track_TPC(esd->GetTrack(n), esd_friend->GetTrack(n), cont);
+    if (!track) continue;
+
+    cont->AddElement(track);
   }
+  cont->SetTitle(Form("N=%d", count));
+  cont->MakeTracks();
 
-  Int_t    count = 0;
-  Double_t pbuf[3];
-  for (Int_t n=0; n<esd->GetNumberOfTracks(); n++)
-  {
-    AliESDtrack* at = esd->GetTrack(n);
+  gEve->Redraw3D();
 
-    // Here would be sweet to have TObjectFormula.
-    at->GetPxPyPz(pbuf);
-    ptsq = pbuf[0]*pbuf[0] + pbuf[1]*pbuf[1];
-    if(ptsq < minptsq || ptsq > maxptsq)
-      continue;
+  return cont;
+}
+
+TEveTrackList* esd_tracks_ITS()
+{
+  AliESDEvent* esd = AliEveEventManager::AssertESD();
+  AliESDfriend* esd_friend = AliEveEventManager::AssertESDfriend();
+
+  TEveTrackList* cont = new TEveTrackList("ITS Tracks");
+  cont->SetMainColor(kMagenta+3);
 
+  esd_track_propagator_setup(cont->GetPropagator(),
+                            0.1*esd->GetMagneticField(), 520);
+  cont->GetPropagator()->SetMaxR(85.0);
+  cont->SetLineWidth(1);
+
+  gEve->AddElement(cont);
+
+  Int_t count = 0;
+  for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
+  {
     ++count;
+    if (!esd->GetTrack(n)) continue;
+    if (!esd_friend->GetTrack(n)) continue;
+    AliEveTrack* track = esd_make_track_ITS(esd->GetTrack(n), esd_friend->GetTrack(n), cont);
+    if (!track) continue;
 
-    // If gkFixFailedITSExtr is TRUE (FALSE by default) and
-    // if ITS refit failed, take track parameters at inner TPC radius.
-    Bool_t innerTaken = kFALSE;
-    AliExternalTrackParam* tp = at;
-    if (gkFixFailedITSExtr && !at->IsOn(AliESDtrack::kITSrefit)) {
-      tp = at->GetInnerParam();
-      innerTaken = kTRUE;
-    }
+    cont->AddElement(track);
+  }
+  cont->SetTitle(Form("N=%d", count));
+  cont->MakeTracks();
 
-    TEveTrack* track = esd_make_track(trkProp, n, at, tp);
-    track->SetAttLineAttMarker(cont);
+  gEve->Redraw3D();
 
-    if (!innerTaken) {
-      esd_track_add_param(track, at->GetInnerParam());
-    }
-    // esd_track_add_param(track, at->GetOuterParam());
+  return cont;
+}
 
-    gEve->AddElement(track, cont);
+TEveTrackList* esd_tracks_ITS_standalone()
+{
+  AliESDEvent* esd = AliEveEventManager::AssertESD();
+  AliESDfriend* esd_friend = AliEveEventManager::AssertESDfriend();
 
-    if (gkMakeTrackParamLines) {
-      TEveLine* l = new TEveLine; 
-      l->SetName(Form("Track%d", count));
-      l->SetLineColor(5);
-      at->FillPolymarker(l, esd->GetMagneticField(), 0, 250, 5);
-      contLines->AddElement(l);
-    }
+  TEveTrackList* cont = new TEveTrackList("ITS Standalone Tracks");
+  cont->SetMainColor(kBlue);
+
+  esd_track_propagator_setup(cont->GetPropagator(),
+                            0.1*esd->GetMagneticField(), 520);
+  cont->GetPropagator()->SetMaxR(85.0);
+  cont->SetLineWidth(1);
+
+  gEve->AddElement(cont);
+
+  Int_t count = 0;
+  for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
+  {
+    ++count;
+    if (!esd->GetTrack(n)) continue;
+    if (!esd_friend->GetTrack(n)) continue;
+    AliEveTrack* track = esd_make_track_ITS_standalone(esd->GetTrack(n), esd_friend->GetTrack(n), cont);
+    if (!track) continue;
+
+    cont->AddElement(track);
   }
+  cont->SetTitle(Form("N=%d", count));
+  cont->MakeTracks();
+
+  gEve->Redraw3D();
+
+  return cont;
+}
+
+TEveTrackList* esd_tracks()
+{
+  AliESDEvent* esd = AliEveEventManager::AssertESD();
+
+  TEveTrackList* cont = new TEveTrackList("ESD Tracks");
+  cont->SetMainColor(6);
+
+  esd_track_propagator_setup(cont->GetPropagator(),
+                            0.1*esd->GetMagneticField(), 520);
 
-  //PH The line below is replaced waiting for a fix in Root
-  //PH which permits to use variable siza arguments in CINT
-  //PH on some platforms (alphalinuxgcc, solariscc5, etc.)
-  //PH  const Text_t* tooltip = Form("pT ~ (%.2lf, %.2lf), N=%d", min_pt, max_pt, count);
-  char tooltip[1000];
-  sprintf(tooltip,"pT ~ (%.2lf, %.2lf), N=%d", min_pt, max_pt, count);
-  cont->SetTitle(tooltip); // Not broadcasted automatically ...
+  gEve->AddElement(cont);
 
+  Int_t count = 0;
+  for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
+  {
+    ++count;
+    AliEveTrack* track = esd_make_track(esd->GetTrack(n), cont);
+
+    cont->AddElement(track);
+  }
+  cont->SetTitle(Form("N=%d", count));
   cont->MakeTracks();
 
   gEve->Redraw3D();
@@ -145,9 +366,41 @@ TEveTrackList* esd_tracks(Double_t min_pt=0, Double_t max_pt=10000)
   return cont;
 }
 
-/******************************************************************************/
+TEveTrackList* esd_tracks_MI()
+{
+  AliESDEvent* esd = AliEveEventManager::AssertESD();
+
+  TEveTrackList* cont = new TEveTrackList("ESD Tracks MI");
+  cont->SetLineColor(5);
+  gEve->AddElement(cont);
+
+  Int_t count = 0;
+  for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
+  {
+    ++count;
+    AliESDtrack* at = esd->GetTrack(n);
+    AliEveTrack* l = new AliEveTrack(at, cont->GetPropagator());
+    l->SetName(Form("ESDTrackMI %d", at->GetID()));
+    l->SetElementTitle(esd_track_title(at));
+    l->SetAttLineAttMarker(cont);
+    l->SetSourceObject(at);
+
+    at->FillPolymarker(l, esd->GetMagneticField(), 0, 250, 5);
+
+    l->SetLockPoints(kTRUE);
+    cont->AddElement(l);
+  }
+  cont->SetTitle(Form("N=%d", count));
+
+  gEve->Redraw3D();
+
+  return cont;
+}
+
+
+//==============================================================================
 // esd_tracks_from_array()
-/******************************************************************************/
+//==============================================================================
 
 TEveTrackList* esd_tracks_from_array(TCollection* col, AliESDEvent* esd=0)
 {
@@ -158,9 +411,9 @@ TEveTrackList* esd_tracks_from_array(TCollection* col, AliESDEvent* esd=0)
 
   TEveTrackList* cont = new TEveTrackList("ESD Tracks");
   cont->SetMainColor(6);
-  TEveTrackPropagator* trkProp = cont->GetPropagator();
-  trkProp->SetMagField( 0.1*esd->GetMagneticField() );
-  trkProp->SetMaxR    ( 520 );
+
+  esd_track_propagator_setup(cont->GetPropagator(),
+                            0.1*esd->GetMagneticField(), 520);
 
   gEve->AddElement(cont);
 
@@ -169,28 +422,20 @@ TEveTrackList* esd_tracks_from_array(TCollection* col, AliESDEvent* esd=0)
   TObject *obj;
   while ((obj = next()) != 0)
   {
-    if (obj->IsA()->InheritsFrom("AliESDtrack") == kFALSE) {
-      Warning("Object '%s', '%s' is not an AliESDtrack.",
+    if (obj->IsA()->InheritsFrom("AliESDtrack") == kFALSE)
+    {
+      Warning("esd_tracks_from_array", "Object '%s', '%s' is not an AliESDtrack.",
              obj->GetName(), obj->GetTitle());
       continue;
     }
 
     ++count;
-    AliESDtrack* at = (AliESDtrack*) obj;
+    AliESDtrack* at = reinterpret_cast<AliESDtrack*>(obj);
 
-    TEveTrack* track = esd_make_track(trkProp, count, at);
-    track->SetAttLineAttMarker(cont);
-    gEve->AddElement(track, cont);
+    AliEveTrack* track = esd_make_track(at, cont);
+    cont->AddElement(track);
   }
-
-  //PH The line below is replaced waiting for a fix in Root
-  //PH which permits to use variable siza arguments in CINT
-  //PH on some platforms (alphalinuxgcc, solariscc5, etc.)
-  //PH  const Text_t* tooltip = Form("N=%d", count);
-  const tooltip[1000];
-  sprintf(tooltip,"N=%d", count);
-  cont->SetTitle(tooltip); // Not broadcasted automatically ...
-
+  cont->SetTitle(Form("N=%d", count));
   cont->MakeTracks();
 
   gEve->Redraw3D();
@@ -201,18 +446,18 @@ TEveTrackList* esd_tracks_from_array(TCollection* col, AliESDEvent* esd=0)
 void esd_tracks_alianalcuts_demo()
 {
   AliESDEvent* esd = AliEveEventManager::AssertESD();
-  gSystem->Load("libANALYSIS");
 
-  AliAnalysisTrackCuts atc;
+  AliESDtrackCuts atc;
   atc.SetPtRange(0.1, 5);
   atc.SetRapRange(-1, 1);
 
-  esd_tracks_from_array(atc.GetAcceptedParticles(esd), esd);
+  esd_tracks_from_array(atc.GetAcceptedTracks(esd), esd);
 }
 
-/******************************************************************************/
-// esd_tracks_vertex_cut
-/******************************************************************************/
+
+//==============================================================================
+// esd_tracks_by_category
+//==============================================================================
 
 Float_t get_sigma_to_vertex(AliESDtrack* esdTrack)
 {
@@ -223,9 +468,10 @@ Float_t get_sigma_to_vertex(AliESDtrack* esdTrack)
   Float_t bRes[2];
   Float_t bCov[3];
   esdTrack->GetImpactParameters(b,bCov);
-  if (bCov[0]<=0 || bCov[2]<=0) {
+  if (bCov[0] <= 0 || bCov[2] <= 0)
+  {
     printf("Estimated b resolution lower or equal zero!\n");
-    bCov[0]=0; bCov[2]=0;
+    bCov[0] = bCov[2] = 0;
   }
   bRes[0] = TMath::Sqrt(bCov[0]);
   bRes[1] = TMath::Sqrt(bCov[2]);
@@ -241,7 +487,7 @@ Float_t get_sigma_to_vertex(AliESDtrack* esdTrack)
   // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-x**2)/2)
   // Can this be expressed in a different way?
 
-  if (bRes[0] == 0 || bRes[1] ==0)
+  if (bRes[0] == 0 || bRes[1] == 0)
     return -1;
 
   Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
@@ -255,114 +501,244 @@ Float_t get_sigma_to_vertex(AliESDtrack* esdTrack)
   return d;
 }
 
-TEveElementList* esd_tracks_vertex_cut()
+TEveElementList* esd_tracks_by_category()
 {
-  // Import ESD tracks, separate them into five containers according to
-  // primary-vertex cut and ITS refit status.
+   // Import ESD tracks, separate them into several containers
+   // according to primary-vertex cut and ITS&TPC refit status.
+
+   AliESDEvent* esd = AliEveEventManager::AssertESD();
+
+   TEveElementList* cont = new TEveElementList("ESD Tracks by category");
+   gEve->AddElement(cont);
+
+   const Int_t   nCont = 9;
+   const Float_t maxR  = 520;
+   const Float_t magF  = 0.1*esd->GetMagneticField();
+
+   TEveTrackList *tl[nCont];
+   Int_t          tc[nCont];
+   Int_t          count = 0;
+
+   tl[0] = new TEveTrackList("Sigma < 3");
+   tc[0] = 0;
+   esd_track_propagator_setup(tl[0]->GetPropagator(), magF, maxR);
+   tl[0]->SetMainColor(3);
+   cont->AddElement(tl[0]);
+
+   tl[1] = new TEveTrackList("3 < Sigma < 5");
+   tc[1] = 0;
+   esd_track_propagator_setup(tl[1]->GetPropagator(), magF, maxR);
+   tl[1]->SetMainColor(7);
+   cont->AddElement(tl[1]);
+
+   tl[2] = new TEveTrackList("5 < Sigma");
+   tc[2] = 0;
+   esd_track_propagator_setup(tl[2]->GetPropagator(), magF, maxR);
+   tl[2]->SetMainColor(46);
+   cont->AddElement(tl[2]);
+
+   tl[3] = new TEveTrackList("no ITS refit; Sigma < 5");
+   tc[3] = 0;
+   esd_track_propagator_setup(tl[3]->GetPropagator(), magF, maxR);
+   tl[3]->SetMainColor(41);
+   cont->AddElement(tl[3]);
+
+   tl[4] = new TEveTrackList("no ITS refit; Sigma > 5");
+   tc[4] = 0;
+   esd_track_propagator_setup(tl[4]->GetPropagator(), magF, maxR);
+   tl[4]->SetMainColor(48);
+   cont->AddElement(tl[4]);
+
+   tl[5] = new TEveTrackList("no TPC refit");
+   tc[5] = 0;
+   esd_track_propagator_setup(tl[5]->GetPropagator(), magF, maxR);
+   tl[5]->SetMainColor(kRed);
+   cont->AddElement(tl[5]);
+
+   tl[6] = new TEveTrackList("ITS ncl>=3 & SPD Inner");
+   tc[6] = 0;
+   esd_track_propagator_setup(tl[6]->GetPropagator(), magF, maxR);
+   tl[6]->SetMainColor(kGreen);
+   cont->AddElement(tl[6]);
+
+   tl[7] = new TEveTrackList("ITS ncl>=3 & b<3 cm");
+   tc[7] = 0;
+   esd_track_propagator_setup(tl[7]->GetPropagator(), magF, maxR);
+   tl[7]->SetMainColor(kMagenta - 9);
+   cont->AddElement(tl[7]);
+
+   tl[8] = new TEveTrackList("ITS others");
+   tc[8] = 0;
+   esd_track_propagator_setup(tl[8]->GetPropagator(), magF, maxR);
+   tl[8]->SetMainColor(kRed + 2);
+   cont->AddElement(tl[8]);
+
+   for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
+   {
+      AliESDtrack* at = esd->GetTrack(n);
+
+      Float_t s  = get_sigma_to_vertex(at);
+      Int_t   ti;
+      if      (s <  3) ti = 0;
+      else if (s <= 5) ti = 1;
+      else             ti = 2;
+
+      Int_t    nclits;
+      Double_t dtobeam;
+
+      if (at->IsOn(AliESDtrack::kITSin) && ! at->IsOn(AliESDtrack::kTPCin))
+      {
+         UChar_t itsclmap = at->GetITSClusterMap();
+         Bool_t  spdinner = (itsclmap & 3) != 0;
+
+         nclits = 0;
+         for (Int_t iter = 0; iter < 6; ++iter)
+            if (itsclmap & (1 << iter)) nclits ++;
+
+         Double_t xyz[3];
+         at->GetXYZ(xyz);
+         dtobeam = TMath::Hypot(xyz[0], xyz[1]);
+
+         if ((nclits >= 3) && (spdinner))
+            ti = 6;
+         else if ((nclits >= 3) && (dtobeam < 3.0))
+            ti = 7;
+         else
+            ti = 8;
+      }
+      else if (at->IsOn(AliESDtrack::kTPCin) && ! at->IsOn(AliESDtrack::kTPCrefit))
+      {
+         ti = 5;
+      }
+      else if ( ! at->IsOn(AliESDtrack::kITSrefit))
+      {
+         ti = (ti == 2) ? 4 : 3;
+      }
+
+      TEveTrackList* tlist = tl[ti];
+      ++tc[ti];
+      ++count;
+
+      AliEveTrack* track = esd_make_track(at, tlist);
+      if (ti<6)
+         track->SetName(Form("ESD Track idx=%d, sigma=%5.3f", at->GetID(), s));
+      else
+         track->SetName(Form("ESD Track idx=%d, dxy=%5.3f cl=%i", at->GetID(), dtobeam, nclits));
+      tlist->AddElement(track);
+   }
+
+   for (Int_t ti = 0; ti < nCont; ++ti)
+   {
+      TEveTrackList* tlist = tl[ti];
+      tlist->SetName(Form("%s [%d]", tlist->GetName(), tlist->NumChildren()));
+      tlist->SetTitle(Form("N tracks=%d", tc[ti]));
+
+      tlist->MakeTracks();
+
+      //    Bool_t good_cont = ti <= 1;
+      Bool_t good_cont = ((ti == 6) || (ti == 7));
+      if (AliEveTrackCounter::IsActive())
+      {
+         AliEveTrackCounter::fgInstance->RegisterTracks(tlist, good_cont);
+      }
+      else
+      {
+         if ( ! good_cont)
+            tlist->SetLineStyle(6);
+      }
+   }
+   cont->SetTitle(Form("N all tracks = %d", count));
+   // ??? The following does not always work:
+   cont->FindListTreeItem(gEve->GetListTree())->SetOpen(kTRUE);
+
+   gEve->Redraw3D();
+
+   return cont;
+}
+
 
+//==============================================================================
+// esd_tracks_by_anal_cuts
+//==============================================================================
+
+AliESDtrackCuts* g_esd_tracks_anal_cuts = 0;
+
+TEveElementList* esd_tracks_by_anal_cuts()
+{
   AliESDEvent* esd = AliEveEventManager::AssertESD();
 
-  TEveElementList* cont = new TEveElementList("ESD Tracks");
+  if (g_esd_tracks_anal_cuts == 0)
+  {
+    gSystem->Load("libPWGUDbase");
+    gROOT->ProcessLine(".L $ALICE_ROOT/PWGUD/CreateStandardCuts.C");
+    Int_t mode = AliPWG0Helper::kTPC;
+    if (TMath::Abs(esd->GetMagneticField()) > 0.01)
+      mode |= AliPWG0Helper::kFieldOn;
+    gROOT->ProcessLine(Form("g_esd_tracks_anal_cuts = CreateTrackCuts(%d, kFALSE)", mode));
+  }
 
+  TEveElementList* cont = new TEveElementList("ESD Tracks by Analysis Cuts");
   gEve->AddElement(cont);
-  TEveTrackList *tl[5];
-  Int_t            tc[5];
-  Int_t            count = 0;
 
-  tl[0] = new TEveTrackList("Sigma < 3");
+  const Int_t   nCont = 2;
+  const Float_t maxR  = 520;
+  const Float_t magF  = 0.1*esd->GetMagneticField();
+
+  TEveTrackList *tl[nCont];
+  Int_t          tc[nCont];
+  Int_t          count = 0;
+
+  tl[0] = new TEveTrackList("Passed");
   tc[0] = 0;
-  tl[0]->GetPropagator()->SetMagField( 0.1*esd->GetMagneticField() );
-  tl[0]->GetPropagator()->SetMaxR    ( 520 );
+  esd_track_propagator_setup(tl[0]->GetPropagator(), magF, maxR);
   tl[0]->SetMainColor(3);
-  gEve->AddElement(tl[0], cont);
+  cont->AddElement(tl[0]);
 
-  tl[1] = new TEveTrackList("3 < Sigma < 5");
+  tl[1] = new TEveTrackList("Rejected");
   tc[1] = 0;
-  tl[1]->GetPropagator()->SetMagField( 0.1*esd->GetMagneticField() );
-  tl[1]->GetPropagator()->SetMaxR    ( 520 );
-  tl[1]->SetMainColor(7);
-  gEve->AddElement(tl[1], cont);
-
-  tl[2] = new TEveTrackList("5 < Sigma");
-  tc[2] = 0;
-  tl[2]->GetPropagator()->SetMagField( 0.1*esd->GetMagneticField() );
-  tl[2]->GetPropagator()->SetMaxR    ( 520 );
-  tl[2]->SetMainColor(46);
-  gEve->AddElement(tl[2], cont);
-
-  tl[3] = new TEveTrackList("no ITS refit; Sigma < 5");
-  tc[3] = 0;
-  tl[3]->GetPropagator()->SetMagField( 0.1*esd->GetMagneticField() );
-  tl[3]->GetPropagator()->SetMaxR    ( 520 );
-  tl[3]->SetMainColor(41);
-  gEve->AddElement(tl[3], cont);
-
-  tl[4] = new TEveTrackList("no ITS refit; Sigma > 5");
-  tc[4] = 0;
-  tl[4]->GetPropagator()->SetMagField( 0.1*esd->GetMagneticField() );
-  tl[4]->GetPropagator()->SetMaxR    ( 520 );
-  tl[4]->SetMainColor(48);
-  gEve->AddElement(tl[4], cont);
-
-  for (Int_t n=0; n<esd->GetNumberOfTracks(); n++)
+  esd_track_propagator_setup(tl[1]->GetPropagator(), magF, maxR);
+  tl[1]->SetMainColor(kRed);
+  cont->AddElement(tl[1]);
+
+  for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
   {
     AliESDtrack* at = esd->GetTrack(n);
 
     Float_t s  = get_sigma_to_vertex(at);
-    Int_t   ti;
-    if      (s <  3) ti = 0;
-    else if (s <= 5) ti = 1;
-    else             ti = 2;
-
-    AliExternalTrackParam* tp = at;
-    // If ITS refit failed, optionally take track parameters at inner
-    // TPC radius and put track in a special container.
-    // This ignores state of gkFixFailedITSExtr (used in esd_tracks()).
-    // Use BOTH functions to compare results.
-    if (!at->IsOn(AliESDtrack::kITSrefit)) {
-      // tp = at->GetInnerParam();
-      ti = (ti == 2) ? 4 : 3;
-    }
+    Int_t   ti = (g_esd_tracks_anal_cuts->AcceptTrack(at)) ? 0 : 1;
 
     TEveTrackList* tlist = tl[ti];
     ++tc[ti];
     ++count;
 
-    TEveTrack* track = esd_make_track(tlist->GetPropagator(), n, at, tp);
-    track->SetAttLineAttMarker(tlist);
-
-    //PH The line below is replaced waiting for a fix in Root
-    //PH which permits to use variable siza arguments in CINT
-    //PH on some platforms (alphalinuxgcc, solariscc5, etc.)
-    //PH    track->SetName(Form("track %d, sigma=%5.3f", at->GetLabel(), s));
-    char form[1000];
-    sprintf(form,"TEveTrack idx=%d, sigma=%5.3f", at->GetID(), s);
-    track->SetName(form);
-    gEve->AddElement(track, tlist);
+    AliEveTrack* track = esd_make_track(at, tlist);
+    track->SetName(Form("ESD Track idx=%d, sigma=%5.3f", at->GetID(), s));
+    tlist->AddElement(track);
   }
 
-  for (Int_t ti=0; ti<5; ++ti) {
+  for (Int_t ti = 0; ti < nCont; ++ti)
+  {
     TEveTrackList* tlist = tl[ti];
-    //PH The line below is replaced waiting for a fix in Root
-    //PH which permits to use variable siza arguments in CINT
-    //PH on some platforms (alphalinuxgcc, solariscc5, etc.)
-    //PH    const Text_t* tooltip = Form("N tracks=%d", tc[ti]);
-    //MT Modified somewhat.
-    char buff[1000];
-    sprintf(buff, "%s [%d]", tlist->GetName(), tlist->NumChildren());
-    tlist->SetName(buff);
-    sprintf(buff, "N tracks=%d", tc[ti]);
-    tlist->SetTitle(buff); // Not broadcasted automatically ...
+    tlist->SetName(Form("%s [%d]", tlist->GetName(), tlist->NumChildren()));
+    tlist->SetTitle(Form("N tracks=%d", tc[ti]));
 
     tlist->MakeTracks();
+
+    Bool_t good_cont = ti < 1;
+    if (AliEveTrackCounter::IsActive())
+    {
+      AliEveTrackCounter::fgInstance->RegisterTracks(tlist, good_cont);
+    }
+    else
+    {
+      if ( ! good_cont)
+        tlist->SetLineStyle(6);
+    }
   }
-  //PH The line below is replaced waiting for a fix in Root
-  //PH which permits to use variable siza arguments in CINT
-  //PH on some platforms (alphalinuxgcc, solariscc5, etc.)
-  //PH  cont->SetTitle(Form("N all tracks = %d", count));
-  char form[1000];
-  sprintf(form,"N all tracks = %d", count);
-  cont->SetTitle(form);
+  cont->SetTitle(Form("N all tracks = %d", count));
+  // ??? The following does not always work:
+  cont->FindListTreeItem(gEve->GetListTree())->SetOpen(kTRUE);
+
   gEve->Redraw3D();
 
   return cont;