-// Import tracks from kinematics-tree / particle-stack.
-// Preliminary/minimal solution.
+// $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. *
+ **************************************************************************/
+
+/// \ingroup evemacros
+/// \file kine_tracks.C
+/// \brief Import tracks from kinematics-tree / particle-stack.
+///
+/// Preliminary/minimal solution.
+///
+/// \author Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
+
+#if !defined(__CINT__) || defined(__MAKECINT__)
+#include <TParticle.h>
+#include <TParticlePDG.h>
+#include <TEveManager.h>
+#include <TEveTrackPropagator.h>
+
+#include <AliMagF.h>
+#include <AliStack.h>
+#include <AliRunLoader.h>
+#include <AliEveEventManager.h>
+#include <AliEveMagField.h>
+#include <AliEveTrack.h>
+#include <AliEveKineTools.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);
+
+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);
-#include "TParticlePDG.h"
+void kine_daughters(AliEveTrack* parent, AliStack* stack,
+ Double_t min_pt, Double_t min_p,
+ Bool_t pdg_col, Bool_t recurse);
-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,
- Bool_t use_track_refs = kTRUE)
+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)
+{
+ 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 = Alieve::Event::AssertRunLoader();
+ AliRunLoader* rl = AliEveEventManager::AssertRunLoader();
rl->LoadKinematics();
AliStack* stack = rl->Stack();
- if (!stack) {
- Error("kine_tracks.C", "can not get kinematics.");
+ if (!stack)
+ {
+ Error("kine_tracks", "can not get kinematics.");
return 0;
}
- gReve->DisableRedraw();
-
- Reve::TrackList* cont = new Reve::TrackList("Kine Tracks");
- cont->SetMainColor(Color_t(3));
- Reve::TrackRnrStyle* rnrStyle = cont->GetRnrStyle();
- // !!! 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.)
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);
- gReve->AddRenderElement(track, cont);
+ gEve->AddElement(track, cont);
if (recurse)
kine_daughters(track, stack, min_pt, min_p, pdg_col, recurse);
}
// set path marks
- Alieve::KineTools kt;
+ AliEveKineTools kt;
kt.SetDaughterPathMarks(cont, stack, recurse);
if (use_track_refs && rl->LoadTrackRefs() == 0)
{
kt.SetTrackReferences(cont, rl->TreeTR(), recurse);
- rnrStyle->SetEditPathMarks(kTRUE);
+ trkProp->SetEditPathMarks(kTRUE);
}
kt.SortPathMarks(cont, recurse);
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);
- 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;
- Reve::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);
dtrack->SetStdTitle();
set_track_color(dtrack, pdg_col);
- gReve->AddRenderElement(dtrack, parent);
+ gEve->AddElement(dtrack, parent);
if (recurse)
kine_daughters(dtrack, stack, min_pt, min_p, pdg_col, recurse);
}
}
-Color_t set_track_color(Reve::Track* t, Bool_t pdg_col)
+//==============================================================================
+
+void set_track_color(AliEveTrack* t, Bool_t pdg_col)
{
if (pdg_col)
t->SetMainColor(get_pdg_color(t->GetPdg()));
else
- t->SetMainColor((Color_t)30);
+ t->SetMainColor(30);
}
Color_t get_pdg_color(Int_t pdg)
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 GammaCol = 7;
static const Color_t MesCol1 = 3;
static const Color_t MesCol2 = 38;
static const Color_t BarCol = 10;
// elementary particles
if (pdga < 100) {
switch (pdga) {
- case 11:
- col = ECol; break;
+ case 11:
+ col = ECol; break;
case 12:
col = MuCol; break;
case 22:
// 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
return col;
}
-/******************************************************************************/
+//==============================================================================
-Reve::RenderElement*
+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,
- 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
Warning("kine_track", "label not set.");
return 0;
}
-
- AliRunLoader* rl = Alieve::Event::AssertRunLoader();
+
+ AliRunLoader* rl = AliEveEventManager::AssertRunLoader();
rl->LoadKinematics();
AliStack* stack = rl->Stack();
+ if (!stack)
+ {
+ Warning("kine_track", "can not get kinematics.");
+ return 0;
+ }
if (label >= stack->GetNtrack())
{
Warning("kine_track", "label out of range.");
if (import_mother || (import_daughters && p->GetNDaughters()))
{
- Reve::Track* toptrack = 0;
- Reve::TrackList* tracklist = 0;
- Reve::TrackRnrStyle* rs = 0;
+ TEveTrackPropagator* rs = 0;
if (cont == 0)
{
- Reve::TrackList* tlist = new Reve::TrackList
- (Form("Kinematics of %d", label, p->GetNDaughters()));
+ TEveTrackList* tlist = new TEveTrackList
+ (Form("Kinematics of %d %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);
- rnrStyle->fMaxOrbs = 2;
- rnrStyle->SetEditPathMarks(kTRUE);
+ trkProp->SetMaxOrbs(2);
+ trkProp->SetEditPathMarks(kTRUE);
- gReve->AddRenderElement(cont);
- rs = tlist->GetRnrStyle();
+ gEve->AddElement(cont);
+ rs = tlist->GetPropagator();
}
else
{
- // check if container is TrackList or Track (has rnr-style)
- Reve::Track* t = dynamic_cast<Reve::Track*>(cont);
+ // check if container is TEveTrackList or AliEveTrack (has rnr-style)
+ AliEveTrack* t = dynamic_cast<AliEveTrack*>(cont);
if (t) {
- rs = t->GetRnrStyle();
+ rs = t->GetPropagator();
} else {
- Reve::TrackList* l = dynamic_cast<Reve::TrackList*>(cont);
+ TEveTrackList* l = dynamic_cast<TEveTrackList*>(cont);
if (l)
- rs = l->GetRnrStyle();
+ rs = l->GetPropagator();
else
Error("kine_tracks.C", "TrackRenderStyle not set.");
}
if (import_mother)
{
- Reve::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);
set_track_color(track, pdg_col);
track->MakeTrack();
- gReve->AddRenderElement(track, cont);
+ 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);
- Reve::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);
set_track_color(track, pdg_col);
track->MakeTrack();
- gReve->AddRenderElement(track, cont);
+ 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();
+}