X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=EVE%2Falice-macros%2Fkine_tracks.C;h=3f381538210ac7b20bcfeb11025af93c6e06e548;hp=041b8fa97e841d5e51bf9206be5322d1e9c94504;hb=f7a1cc68313147ec921d4c82df1890abe00e4032;hpb=a78677429ae749dc7c732f43f2e71549c603236e diff --git a/EVE/alice-macros/kine_tracks.C b/EVE/alice-macros/kine_tracks.C index 041b8fa97e8..3f381538210 100644 --- a/EVE/alice-macros/kine_tracks.C +++ b/EVE/alice-macros/kine_tracks.C @@ -1,20 +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. -#include "TParticlePDG.h" - -// PDG color indices -static Color_t DefCol = 30; -static Color_t ECol = 5; -static Color_t MuCol = 6; -static Color_t GamaCol = 7; -static Color_t MesCol1 = 3; -static Color_t MesCol2 = 38; -static Color_t BarCol = 10; +#include "TParticlePDG.h" -Reve::TrackList* kine_tracks(Double_t min_pt=0.5, Double_t max_pt=100, Bool_t pdg_col= kFALSE) +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) { @@ -22,28 +25,28 @@ Reve::TrackList* kine_tracks(Double_t min_pt=0.5, Double_t max_pt=100, Bool_t pd 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(); + AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField(); + rnrStyle->SetMagField(fld ? -0.1*fld->SolenoidField() : 0); + gEve->AddElement(cont); Int_t count = 0; Int_t N = stack->GetNtrack(); - for (Int_t i=0; iGetNprimary(); + 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); - Double_t pT = p->Pt(); - if (pTmax_pt) continue; + if (p->Pt() < min_pt && p->P() < min_p) continue; ++count; - Reve::Track* track = new Reve::Track(p, i, rnrStyle); - + 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.) @@ -51,54 +54,113 @@ Reve::TrackList* kine_tracks(Double_t min_pt=0.5, Double_t max_pt=100, Bool_t pd char form[1000]; sprintf(form,"%s [%d]", p->GetName(), i); track->SetName(form); - TParticlePDG* pdgp = p->GetPDG(); - track->SetMainColor(get_pdg_color(pdgp->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); } } - - // set path marks - Alieve::KineTools kt; - rl->LoadTrackRefs(); - kt.SetPathMarks(cont,stack, rl->TreeTR()); - cont->SetEditPathMarks(kTRUE); + // 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("pT ~ (%.2lf, %.2lf), N=%d", min_pt, max_pt, count); + //PH const Text_t* tooltip = Form("min pT=%.2lf, min P=%.2lf), N=%d", min_pt, min_p, count); char tooltip[1000]; - sprintf(tooltip,"pT ~ (%.2lf, %.2lf), N=%d", min_pt, max_pt, count); + 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){ - Int_t pdga = TMath::Abs(pdg); - Color_t col = Reve::DefCol; +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 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 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 @@ -111,5 +173,115 @@ Color_t get_pdg_color(Int_t pdg){ 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. + AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField(); + rnrStyle->SetMagField( fld ? -0.1*fld->SolenoidField() : 0 ); + 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(cont); + if (t) { + rs = t->GetPropagator(); + } else { + TEveTrackList* l = dynamic_cast(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; +} +