In muon-related macros in EVE:
[u/mrichter/AliRoot.git] / EVE / alice-macros / kine_tracks.C
index 8d18be5..e9e3618 100644 (file)
+// $Id$
+// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
+
+/**************************************************************************
+ * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
+ * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
+ * full copyright notice.                                                 *
+ **************************************************************************/
+
 // Import tracks from kinematics-tree / particle-stack.
 // Preliminary/minimal solution.
-#include "TParticlePDG.h"
 
-// PDG color indices
-static Color_t DefCol   = 30;
-static Color_t ECol     = 5;
-static Color_t MuCol    = 6;
-static Color_t GammaCol = 7; 
-static Color_t MesCol1  = 3;
-static Color_t MesCol2  = 38;
-static Color_t BarCol   = 10;
+#if !defined(__CINT__) || defined(__MAKECINT__)
+
+#include <TParticle.h>
+#include <TParticlePDG.h>
+
+#include <TEveManager.h>
+#include <TEveTrackPropagator.h>
+
+#include <EveBase/AliEveEventManager.h>
+#include <EveBase/AliEveMagField.h>
+#include <EveBase/AliEveTrack.h>
+#include <EveBase/AliEveKineTools.h>
+
+#include <AliRunLoader.h>
+#include <AliStack.h>
+#include <AliMagF.h>
+
+#endif
+
+// Use magnetic-field as retrieved from GRP.
+Bool_t g_kine_tracks_true_field = kTRUE;
+
+// Use Runge-Kutta track stepper.
+Bool_t g_kine_tracks_rk_stepper = kFALSE;
+
+//==============================================================================
 
+void kine_track_propagator_setup(TEveTrackPropagator* trkProp);
 
-Reve::TrackList*
-kine_tracks(Double_t min_pt  = 0.1,   Double_t min_p   = 0.2,
-           Bool_t   pdg_col = kTRUE, Bool_t   recurse = kTRUE)
+TEveTrackList*
+kine_tracks(Double_t min_pt  = 0,     Double_t min_p   = 0,
+           Bool_t   pdg_col = kTRUE, Bool_t   recurse = kTRUE,
+           Bool_t   use_track_refs = kTRUE);
+
+void kine_daughters(AliEveTrack* parent,  AliStack* stack,
+                   Double_t     min_pt,  Double_t  min_p,
+                   Bool_t       pdg_col, Bool_t    recurse);
+
+void    set_track_color(AliEveTrack* t, Bool_t pdg_col);
+Color_t get_pdg_color(Int_t pdg);
+
+TEveElement*
+kine_track(Int_t  label,
+          Bool_t import_mother = kTRUE, Bool_t import_daughters = kTRUE,
+          Bool_t pdg_col       = kTRUE, Bool_t recurse          = kTRUE,
+           TEveElement* cont = 0);
+
+void kine_hide_neutrals(TEveElement* el=0, Int_t level=0);
+
+//==============================================================================
+
+void kine_track_propagator_setup(TEveTrackPropagator* trkProp)
 {
-  AliRunLoader* rl =  Alieve::Event::AssertRunLoader();
+  AliMagF* fld = AliEveEventManager::AssertMagField();
+
+  if (g_kine_tracks_true_field)
+  {
+    trkProp->SetMagFieldObj(new AliEveMagField(fld));
+  }
+  else
+  {
+    trkProp->SetMagField(-0.1*fld->SolenoidField());
+  }
+  if (g_kine_tracks_rk_stepper)
+  {
+    trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
+  }
+}
+
+//==============================================================================
+
+TEveTrackList*
+kine_tracks(Double_t min_pt,  Double_t min_p,
+           Bool_t   pdg_col, Bool_t   recurse,
+           Bool_t   use_track_refs)
+{
+  AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
   rl->LoadKinematics();
   AliStack* stack = rl->Stack();
-  if (!stack) {
+  if (!stack)
+  {
     Error("kine_tracks.C", "can not get kinematics.");
     return 0;
   }
 
-  gReve->DisableRedraw();
-  Reve::TrackList* cont = new Reve::TrackList("Kine Tracks"); 
-  cont->SetMainColor(Color_t(6));
-  Reve::TrackRnrStyle* rnrStyle = cont->GetRnrStyle();
-  rnrStyle->fColor = 8;
-  // !!! Watch the '-', apparently different sign convention then for ESD.
-  rnrStyle->SetMagField( - gAlice->Field()->SolenoidField() );
+  gEve->DisableRedraw();
+
+  TEveTrackList* cont = new TEveTrackList("Kine Tracks");
+  cont->SetMainColor(3);
+  TEveTrackPropagator* trkProp = cont->GetPropagator();
 
-  gReve->AddRenderElement(cont);
+  kine_track_propagator_setup(trkProp);
+
+  gEve->AddElement(cont);
   Int_t count = 0;
-  Int_t N = stack->GetNtrack();
-  for (Int_t i=0; i<N; ++i) 
+  Int_t Np = stack->GetNprimary();
+  for (Int_t i = 0; i < Np; ++i)
   {
-    if(stack->IsPhysicalPrimary(i)) 
+    TParticle* p = stack->Particle(i);
+    if (p->GetStatusCode() <= 1)
     {
-      TParticle* p = stack->Particle(i);
       if (p->Pt() < min_pt && p->P() < min_p) continue;
 
       ++count;
-      Reve::Track* track = new Reve::Track(p, i, rnrStyle);
-  
+      AliEveTrack* track = new AliEveTrack(p, i, 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.)
@@ -53,9 +123,17 @@ kine_tracks(Double_t min_pt  = 0.1,   Double_t min_p   = 0.2,
       char form[1000];
       sprintf(form,"%s [%d]", p->GetName(), i);
       track->SetName(form);
-      if (pdg_col && p->GetPDG())
-       track->SetMainColor(get_pdg_color(p->GetPDG()->PdgCode()));
-      gReve->AddRenderElement(cont, track);
+      track->SetStdTitle();
+      Int_t ml = p->GetMother(0);
+      if (ml != -1)
+      {
+        track->SetTitle(Form("%s\nMother label=%d\nMother Pdg=%d",
+                             track->GetElementTitle(),
+                             ml, stack->Particle(ml)->GetPdgCode()));
+      }
+      set_track_color(track, pdg_col);
+
+      gEve->AddElement(track, cont);
 
       if (recurse)
        kine_daughters(track, stack, min_pt, min_p, pdg_col, recurse);
@@ -63,47 +141,48 @@ kine_tracks(Double_t min_pt  = 0.1,   Double_t min_p   = 0.2,
   }
 
   // set path marks
-  Alieve::KineTools kt; 
+  AliEveKineTools kt;
   kt.SetDaughterPathMarks(cont, stack, recurse);
-  rl->LoadTrackRefs();
-  kt.SetTrackReferences(cont, rl->TreeTR(), recurse);
-  cont->SetEditPathMarks(kTRUE);
+  if (use_track_refs && rl->LoadTrackRefs() == 0)
+  {
+    kt.SetTrackReferences(cont, rl->TreeTR(), recurse);
+    trkProp->SetEditPathMarks(kTRUE);
+  }
+  kt.SortPathMarks(cont, recurse);
 
   //PH  const Text_t* tooltip = Form("min pT=%.2lf, min P=%.2lf), N=%d", min_pt, min_p, count);
   char tooltip[1000];
   sprintf(tooltip,"min pT=%.2lf, min P=%.2lf), N=%d", min_pt, min_p, count);
   cont->SetTitle(tooltip); // Not broadcasted automatically ...
-  cont->UpdateItems();
 
   cont->MakeTracks(recurse);
-  cont->MakeMarkers();
-
-  gReve->EnableRedraw();
-  gReve->Redraw3D();
+  gEve->EnableRedraw();
+  gEve->Redraw3D();
 
   return cont;
 }
 
-void kine_daughters(Reve::Track* parent,  AliStack* stack,
+void kine_daughters(AliEveTrack* parent,  AliStack* stack,
                    Double_t     min_pt,  Double_t  min_p,
                    Bool_t       pdg_col, Bool_t    recurse)
 {
   TParticle *p = stack->Particle(parent->GetLabel());
-  if (p->GetNDaughters() > 0) 
+  if (p->GetNDaughters() > 0)
   {
-    Reve::TrackRnrStyle* rs = parent->GetRnrStyle();
-    for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d) 
-    {  
+    TEveTrackPropagator* rs = parent->GetPropagator();
+    for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d)
+    {
       TParticle* dp = stack->Particle(d);
       if (dp->Pt() < min_pt && dp->P() < min_p) continue;
 
-      Track* dtrack = new Reve::Track(dp, d, rs);  
+      AliEveTrack* dtrack = new AliEveTrack(dp, d, rs);
       char form[1000];
       sprintf(form,"%s [%d]", dp->GetName(), d);
       dtrack->SetName(form);
-      if (pdg_col && dp->GetPDG())
-       dtrack->SetMainColor(get_pdg_color(dp->GetPDG()->PdgCode()));
-      gReve->AddRenderElement(parent, dtrack);
+      dtrack->SetStdTitle();
+      set_track_color(dtrack, pdg_col);
+
+      gEve->AddElement(dtrack, parent);
 
       if (recurse)
        kine_daughters(dtrack, stack, min_pt, min_p, pdg_col, recurse);
@@ -111,28 +190,49 @@ void kine_daughters(Reve::Track* parent,  AliStack* stack,
   }
 }
 
+//==============================================================================
+
+void set_track_color(AliEveTrack* t, Bool_t pdg_col)
+{
+  if (pdg_col)
+    t->SetMainColor(get_pdg_color(t->GetPdg()));
+  else
+    t->SetMainColor(30);
+}
+
 Color_t get_pdg_color(Int_t pdg)
 {
-  Int_t pdga = TMath::Abs(pdg);
-  Color_t col = Reve::DefCol;
+  // PDG color indices
+  static const Color_t DefCol   = 30;
+  static const Color_t ECol     = 5;
+  static const Color_t MuCol    = 6;
+  static const Color_t GammaCol = 7;
+  static const Color_t MesCol1  = 3;
+  static const Color_t MesCol2  = 38;
+  static const Color_t BarCol   = 10;
+
+  Int_t pdga  = TMath::Abs(pdg);
+  Color_t col = DefCol;
 
   // elementary  particles
   if (pdga < 100) {
     switch (pdga) {
-      case 11:  
-       col = ECol; break; 
+      case 11:
+       col = ECol; break;
       case 12:
        col = MuCol; break;
       case 22:
        col = GammaCol; break;
     }
   }
-  else if (pdga < 100000){ 
+  // mesons and barions
+  else if (pdga < 100000) {
     Int_t i  = pdga;
-    Int_t i0 = i%10; i /= 10;
-    Int_t i1 = i%10; i /= 10; 
-    Int_t i2 = i%10; i /= 10; 
-    Int_t i3 = i%10; i /= 10; 
+    // Int_t i0 = i%10;  // Not used at the moment.
+    i /= 10;
+    Int_t i1 = i%10; i /= 10;
+    Int_t i2 = i%10; i /= 10;
+    Int_t i3 = i%10; i /= 10;
     Int_t i4 = i%10;
     //printf("pdg(%d) quark indices (%d,%d,%d,%d,%d) \n",pdg, i4,i3,i2, i1, i0);
     // meson
@@ -145,103 +245,135 @@ Color_t get_pdg_color(Int_t pdg)
       col = BarCol; // quarks: i1,i2, i3 (spin = i0))
     }
   }
+
   return col;
 }
 
+//==============================================================================
 
-// Create mother and daughters tracks with given label.
-
-Reve::RenderElement*
+TEveElement*
 kine_track(Int_t  label,
-          Bool_t import_mother    = kTRUE,
-           Bool_t import_daughters = kTRUE,
-           Reve::RenderElement* cont = 0)
-
+          Bool_t import_mother, Bool_t import_daughters,
+          Bool_t pdg_col,       Bool_t recurse,
+           TEveElement* cont)
 {
+  // Create mother and daughters tracks with given label.
+  // mother     -> particle with label
+  // daughters  -> daughters of label
+
   if (label < 0) {
     Warning("kine_track", "label not set.");
     return 0;
   }
-  AliRunLoader* rl =  Alieve::Event::AssertRunLoader();
+
+  AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
   rl->LoadKinematics();
   AliStack* stack = rl->Stack();
+  if (label >= stack->GetNtrack())
+  {
+    Warning("kine_track", "label out of range.");
+    return 0;
+  }
+
   TParticle* p = stack->Particle(label);
 
   if (import_mother || (import_daughters && p->GetNDaughters()))
   {
-    Track* toptrack = 0;
-    TrackList* tracklist = 0;  
-    TrackRnrStyle* rs = 0;
+    TEveTrackPropagator* rs = 0;
 
     if (cont == 0)
     {
-      Reve::TrackList* tlist = new Reve::TrackList
+      TEveTrackList* tlist = new TEveTrackList
        (Form("Kinematics of %d", label, p->GetNDaughters()));
       cont = tlist;
 
-      Reve::TrackRnrStyle* rnrStyle = tlist->GetRnrStyle();
-      // !!! Watch the '-', apparently different sign convention then for ESD.
-      rnrStyle->SetMagField( - gAlice->Field()->SolenoidField() );
+      TEveTrackPropagator* trkProp = tlist->GetPropagator();
+
+      kine_track_propagator_setup(trkProp);
+
       char tooltip[1000];
       sprintf(tooltip,"Ndaughters=%d", p->GetNDaughters());
       tlist->SetTitle(tooltip);
-      tlist->SelectByPt(0.2, 100);
-      rnrStyle->fColor   = 8;
-      rnrStyle->fMaxOrbs = 8;
-      tlist->SetEditPathMarks(kTRUE);
-      gReve->AddRenderElement(cont);
-      rs = tlist->GetRnrStyle();
+      trkProp->SetMaxOrbs(2);
+      trkProp->SetEditPathMarks(kTRUE);
+
+      gEve->AddElement(cont);
+      rs = tlist->GetPropagator();
     }
     else
     {
-      // check if argument is TrackList
-      Reve::Track* t = dynamic_cast<Reve::Track*>(cont);
-      if(t) 
-      {
-       rs = t->GetRnrStyle();
-      }
-      else
-      {
-        Reve::TrackList* l = dynamic_cast<Reve::TrackList*>(cont);
-        if(l)
-       {
-         rs = l->GetRnrStyle();
-       }
+      // check if container is TEveTrackList or AliEveTrack (has rnr-style)
+      AliEveTrack* t = dynamic_cast<AliEveTrack*>(cont);
+      if (t) {
+       rs = t->GetPropagator();
+      } else {
+        TEveTrackList* l = dynamic_cast<TEveTrackList*>(cont);
+        if (l)
+         rs = l->GetPropagator();
         else
-       {
          Error("kine_tracks.C", "TrackRenderStyle not set.");
-       }
       }
     }
 
     if (import_mother)
     {
-      Track* track = new Reve::Track(p, label, rs);  
+      AliEveTrack* track = new AliEveTrack(p, label, rs);
       char form[1000];
       sprintf(form,"%s [%d]", p->GetName(), label);
       track->SetName(form);
-      gReve->AddRenderElement(cont, track);
+      track->SetStdTitle();
+      set_track_color(track, pdg_col);
 
+      track->MakeTrack();
+      gEve->AddElement(track, cont);
+      cont = track;
     }
 
-    if (import_daughters && p->GetNDaughters()) 
+    if (import_daughters && p->GetNDaughters())
     {
-      for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d) 
-      {        
+      for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d)
+      {
        TParticle* dp = stack->Particle(d);
-       Track* track = new Reve::Track(dp, d, rs);  
+       AliEveTrack* track = new AliEveTrack(dp, d, rs);
        char form[1000];
        sprintf(form,"%s [%d]", dp->GetName(), d);
        track->SetName(form);
+       track->SetStdTitle();
+       set_track_color(track, pdg_col);
+
         track->MakeTrack();
-       gReve->AddRenderElement(cont, track);
+       gEve->AddElement(track, cont);
+
+       if (recurse)
+         kine_daughters(track, stack, 0, 0, pdg_col, recurse);
       }
     }
   }
 
-  cont->UpdateItems();
-  gReve->Redraw3D();
+  gEve->Redraw3D();
   return cont;
 }
 
+//==============================================================================
+
+void kine_hide_neutrals(TEveElement* el, Int_t level)
+{
+  if (el == 0)
+  {
+    el = gEve->GetCurrentEvent()->FindChild("Kine Tracks");
+    if (!el)
+      return;
+  }
+
+  TEveTrack* t = dynamic_cast<TEveTrack*>(el);
+  if (t && t->GetCharge() == 0)
+    t->SetRnrSelf(kFALSE);
+
+  for (TEveElement::List_i i = el->BeginChildren(); i != el->EndChildren(); ++i)
+  {
+    kine_hide_neutrals(*i, level + 1);
+  }
+
+  if (level == 0)
+    gEve->Redraw3D();
+}