]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/alice-macros/kine_tracks.C
kine_tracks.C
[u/mrichter/AliRoot.git] / EVE / alice-macros / kine_tracks.C
index 3fefa9ed950dd60c6ed38932a22801ab3064255d..d8ddf0d291baf80d9775e533f6411f5b821b4b93 100644 (file)
@@ -1,9 +1,23 @@
+// $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.
 
-Reve::TrackList* kine_tracks(Double_t min_pt=0.5, Double_t max_pt=100)
+#include "TParticlePDG.h"
+
+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)
 {
-  AliRunLoader* rl =  Alieve::Event::AssertRunLoader();
+  AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
   rl->LoadKinematics();
   AliStack* stack = rl->Stack();
   if (!stack) {
@@ -11,35 +25,261 @@ Reve::TrackList* kine_tracks(Double_t min_pt=0.5, Double_t max_pt=100)
     return 0;
   }
 
-  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();
 
-  gReve->AddRenderElement(cont);
+  TEveTrackList* cont = new TEveTrackList("Kine Tracks");
+  cont->SetMainColor(3);
+  TEveTrackPropagator* rnrStyle = cont->GetPropagator();
+  // !!! Watch the '-', apparently different sign convention then for ESD.
+  rnrStyle->SetMagField( -0.1*gAlice->Field()->SolenoidField() );
 
+  gEve->AddElement(cont);
   Int_t count = 0;
-  Int_t     N = stack->GetNtrack();
-  for (Int_t i=0; i<N; ++i) {
-    TParticle* p = stack->Particle(i);
-    Double_t  pT = p->Pt();
-    if (pT<min_pt || pT>max_pt) continue;
-
-    ++count;
-    Reve::Track* track = new Reve::Track(p, i, rnrStyle);
-    track->SetName(Form("%s [%d]", p->GetName(), i));
-    gReve->AddRenderElement(cont, track);
-  }
-  
-  const Text_t* tooltip = Form("pT ~ (%.2lf, %.2lf), N=%d", min_pt, max_pt, count);
+  Int_t N = stack->GetNtrack();
+  for (Int_t i=0; i<N; ++i)
+  {
+    if (stack->IsPhysicalPrimary(i))
+    {
+      TParticle* p = stack->Particle(i);
+      if (p->Pt() < min_pt && p->P() < min_p) continue;
+
+      ++count;
+      TEveTrack* track = new TEveTrack(p, i, rnrStyle);
+
+      //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("%s [%d]", p->GetName(), i));
+      char form[1000];
+      sprintf(form,"%s [%d]", p->GetName(), i);
+      track->SetName(form);
+      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);
+    }
+  }
+
+  // set path marks
+  AliEveKineTools kt;
+  kt.SetDaughterPathMarks(cont, stack, recurse);
+  if (use_track_refs && rl->LoadTrackRefs() == 0)
+  {
+    kt.SetTrackReferences(cont, rl->TreeTR(), recurse);
+    rnrStyle->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();
-  cont->MakeMarkers();
-  gReve->Redraw3D();
+  cont->MakeTracks(recurse);
+  gEve->EnableRedraw();
+  gEve->Redraw3D();
+
+  return cont;
+}
+
+void kine_daughters(TEveTrack* 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)
+  {
+    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;
+
+      TEveTrack* dtrack = new TEveTrack(dp, d, rs);
+      char form[1000];
+      sprintf(form,"%s [%d]", dp->GetName(), d);
+      dtrack->SetName(form);
+      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);
+    }
+  }
+}
+
+Color_t set_track_color(TEveTrack* 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)
+{
+  // 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 12:
+       col = MuCol; break;
+      case 22:
+       col = GammaCol; break;
+    }
+  }
+  // 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 i4 = i%10;
+    //printf("pdg(%d) quark indices (%d,%d,%d,%d,%d) \n",pdg, i4,i3,i2, i1, i0);
+    // meson
+    if ((i3 == 0) && ( i4 < 2)){
+      col = MesCol1; // quarks: i1,i2 (spin = i0)
+      if(i1 == 3 || i2 == 3)
+       col = MesCol2;
+    } // barion
+    else if ( i2 >= i1 && i3 >= i2 ) {
+      col = BarCol; // quarks: i1,i2, i3 (spin = i0))
+    }
+  }
+
+  return col;
+}
+
+/******************************************************************************/
+
+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)
+
+{
+  // 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 =  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()))
+  {
+    TEveTrack* toptrack = 0;
+    TEveTrackList* tracklist = 0;
+    TEveTrackPropagator* rs = 0;
+
+    if (cont == 0)
+    {
+      TEveTrackList* tlist = new TEveTrackList
+       (Form("Kinematics of %d", label, p->GetNDaughters()));
+      cont = tlist;
+
+      TEveTrackPropagator* rnrStyle = tlist->GetPropagator();
+      // !!! Watch the '-', apparently different sign convention then for ESD.
+      rnrStyle->SetMagField( -0.1*gAlice->Field()->SolenoidField() );
+      char tooltip[1000];
+      sprintf(tooltip,"Ndaughters=%d", p->GetNDaughters());
+      tlist->SetTitle(tooltip);
+      rnrStyle->fMaxOrbs = 2;
+      rnrStyle->SetEditPathMarks(kTRUE);
+
+      gEve->AddElement(cont);
+      rs = tlist->GetPropagator();
+    }
+    else
+    {
+      // check if container is TEveTrackList or TEveTrack (has rnr-style)
+      TEveTrack* t = dynamic_cast<TEveTrack*>(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)
+    {
+      TEveTrack* track = new TEveTrack(p, label, rs);
+      char form[1000];
+      sprintf(form,"%s [%d]", p->GetName(), label);
+      track->SetName(form);
+      track->SetStdTitle();
+      set_track_color(track, pdg_col);
+
+      track->MakeTrack();
+      gEve->AddElement(track, cont);
+      cont = track;
+    }
+
+    if (import_daughters && p->GetNDaughters())
+    {
+      for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d)
+      {
+       TParticle* dp = stack->Particle(d);
+       TEveTrack* track = new TEveTrack(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();
+       gEve->AddElement(track, cont);
+
+       if (recurse)
+         kine_daughters(track, stack, 0, 0, pdg_col, recurse);
+      }
+    }
+  }
+
+  gEve->Redraw3D();
   return cont;
 }
+