2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
4 /**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
7 * full copyright notice. *
8 **************************************************************************/
10 /// \ingroup evemacros
11 /// \file kine_tracks.C
12 /// \brief Import tracks from kinematics-tree / particle-stack.
14 /// Preliminary/minimal solution.
16 /// \author Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
18 #if !defined(__CINT__) || defined(__MAKECINT__)
20 #include <TParticle.h>
21 #include <TParticlePDG.h>
23 #include <TEveManager.h>
24 #include <TEveTrackPropagator.h>
26 #include <EveBase/AliEveEventManager.h>
27 #include <EveBase/AliEveMagField.h>
28 #include <EveBase/AliEveTrack.h>
29 #include <EveBase/AliEveKineTools.h>
31 #include <AliRunLoader.h>
37 // Use magnetic-field as retrieved from GRP.
38 Bool_t g_kine_tracks_true_field = kTRUE;
40 // Use Runge-Kutta track stepper.
41 Bool_t g_kine_tracks_rk_stepper = kFALSE;
43 //==============================================================================
45 void kine_track_propagator_setup(TEveTrackPropagator* trkProp);
48 kine_tracks(Double_t min_pt = 0, Double_t min_p = 0,
49 Bool_t pdg_col = kTRUE, Bool_t recurse = kTRUE,
50 Bool_t use_track_refs = kTRUE);
52 void kine_daughters(AliEveTrack* parent, AliStack* stack,
53 Double_t min_pt, Double_t min_p,
54 Bool_t pdg_col, Bool_t recurse);
56 void set_track_color(AliEveTrack* t, Bool_t pdg_col);
57 Color_t get_pdg_color(Int_t pdg);
60 kine_track(Int_t label,
61 Bool_t import_mother = kTRUE, Bool_t import_daughters = kTRUE,
62 Bool_t pdg_col = kTRUE, Bool_t recurse = kTRUE,
63 TEveElement* cont = 0);
65 void kine_hide_neutrals(TEveElement* el=0, Int_t level=0);
67 //==============================================================================
69 void kine_track_propagator_setup(TEveTrackPropagator* trkProp)
71 AliMagF* fld = AliEveEventManager::AssertMagField();
73 if (g_kine_tracks_true_field)
75 trkProp->SetMagFieldObj(new AliEveMagField(fld));
79 trkProp->SetMagField(-0.1*fld->SolenoidField());
81 if (g_kine_tracks_rk_stepper)
83 trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
87 //==============================================================================
90 kine_tracks(Double_t min_pt, Double_t min_p,
91 Bool_t pdg_col, Bool_t recurse,
92 Bool_t use_track_refs)
94 AliRunLoader* rl = AliEveEventManager::AssertRunLoader();
96 AliStack* stack = rl->Stack();
99 Error("kine_tracks", "can not get kinematics.");
103 gEve->DisableRedraw();
105 TEveTrackList* cont = new TEveTrackList("Kine Tracks");
106 cont->SetMainColor(3);
107 TEveTrackPropagator* trkProp = cont->GetPropagator();
109 kine_track_propagator_setup(trkProp);
111 gEve->AddElement(cont);
113 Int_t Np = stack->GetNprimary();
114 for (Int_t i = 0; i < Np; ++i)
116 TParticle* p = stack->Particle(i);
117 if (p->GetStatusCode() <= 1)
119 if (p->Pt() < min_pt && p->P() < min_p) continue;
122 AliEveTrack* track = new AliEveTrack(p, i, trkProp);
124 //PH The line below is replaced waiting for a fix in Root
125 //PH which permits to use variable siza arguments in CINT
126 //PH on some platforms (alphalinuxgcc, solariscc5, etc.)
127 //PH track->SetName(Form("%s [%d]", p->GetName(), i));
129 sprintf(form,"%s [%d]", p->GetName(), i);
130 track->SetName(form);
131 track->SetStdTitle();
132 Int_t ml = p->GetMother(0);
135 track->SetTitle(Form("%s\nMother label=%d\nMother Pdg=%d",
136 track->GetElementTitle(),
137 ml, stack->Particle(ml)->GetPdgCode()));
139 set_track_color(track, pdg_col);
141 gEve->AddElement(track, cont);
144 kine_daughters(track, stack, min_pt, min_p, pdg_col, recurse);
150 kt.SetDaughterPathMarks(cont, stack, recurse);
151 if (use_track_refs && rl->LoadTrackRefs() == 0)
153 kt.SetTrackReferences(cont, rl->TreeTR(), recurse);
154 trkProp->SetEditPathMarks(kTRUE);
156 kt.SortPathMarks(cont, recurse);
158 //PH const Text_t* tooltip = Form("min pT=%.2lf, min P=%.2lf), N=%d", min_pt, min_p, count);
160 sprintf(tooltip,"min pT=%.2lf, min P=%.2lf), N=%d", min_pt, min_p, count);
161 cont->SetTitle(tooltip); // Not broadcasted automatically ...
163 cont->MakeTracks(recurse);
164 gEve->EnableRedraw();
170 void kine_daughters(AliEveTrack* parent, AliStack* stack,
171 Double_t min_pt, Double_t min_p,
172 Bool_t pdg_col, Bool_t recurse)
174 TParticle *p = stack->Particle(parent->GetLabel());
175 if (p->GetNDaughters() > 0)
177 TEveTrackPropagator* rs = parent->GetPropagator();
178 for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d)
180 TParticle* dp = stack->Particle(d);
181 if (dp->Pt() < min_pt && dp->P() < min_p) continue;
183 AliEveTrack* dtrack = new AliEveTrack(dp, d, rs);
185 sprintf(form,"%s [%d]", dp->GetName(), d);
186 dtrack->SetName(form);
187 dtrack->SetStdTitle();
188 set_track_color(dtrack, pdg_col);
190 gEve->AddElement(dtrack, parent);
193 kine_daughters(dtrack, stack, min_pt, min_p, pdg_col, recurse);
198 //==============================================================================
200 void set_track_color(AliEveTrack* t, Bool_t pdg_col)
203 t->SetMainColor(get_pdg_color(t->GetPdg()));
208 Color_t get_pdg_color(Int_t pdg)
211 static const Color_t DefCol = 30;
212 static const Color_t ECol = 5;
213 static const Color_t MuCol = 6;
214 static const Color_t GammaCol = 7;
215 static const Color_t MesCol1 = 3;
216 static const Color_t MesCol2 = 38;
217 static const Color_t BarCol = 10;
219 Int_t pdga = TMath::Abs(pdg);
220 Color_t col = DefCol;
222 // elementary particles
230 col = GammaCol; break;
233 // mesons and barions
234 else if (pdga < 100000) {
236 // Int_t i0 = i%10; // Not used at the moment.
238 Int_t i1 = i%10; i /= 10;
239 Int_t i2 = i%10; i /= 10;
240 Int_t i3 = i%10; i /= 10;
242 //printf("pdg(%d) quark indices (%d,%d,%d,%d,%d) \n",pdg, i4,i3,i2, i1, i0);
244 if ((i3 == 0) && ( i4 < 2)){
245 col = MesCol1; // quarks: i1,i2 (spin = i0)
246 if(i1 == 3 || i2 == 3)
249 else if ( i2 >= i1 && i3 >= i2 ) {
250 col = BarCol; // quarks: i1,i2, i3 (spin = i0))
257 //==============================================================================
260 kine_track(Int_t label,
261 Bool_t import_mother, Bool_t import_daughters,
262 Bool_t pdg_col, Bool_t recurse,
265 // Create mother and daughters tracks with given label.
266 // mother -> particle with label
267 // daughters -> daughters of label
270 Warning("kine_track", "label not set.");
274 AliRunLoader* rl = AliEveEventManager::AssertRunLoader();
275 rl->LoadKinematics();
276 AliStack* stack = rl->Stack();
279 Warning("kine_track", "can not get kinematics.");
282 if (label >= stack->GetNtrack())
284 Warning("kine_track", "label out of range.");
288 TParticle* p = stack->Particle(label);
290 if (import_mother || (import_daughters && p->GetNDaughters()))
292 TEveTrackPropagator* rs = 0;
296 TEveTrackList* tlist = new TEveTrackList
297 (Form("Kinematics of %d", label, p->GetNDaughters()));
300 TEveTrackPropagator* trkProp = tlist->GetPropagator();
302 kine_track_propagator_setup(trkProp);
305 sprintf(tooltip,"Ndaughters=%d", p->GetNDaughters());
306 tlist->SetTitle(tooltip);
307 trkProp->SetMaxOrbs(2);
308 trkProp->SetEditPathMarks(kTRUE);
310 gEve->AddElement(cont);
311 rs = tlist->GetPropagator();
315 // check if container is TEveTrackList or AliEveTrack (has rnr-style)
316 AliEveTrack* t = dynamic_cast<AliEveTrack*>(cont);
318 rs = t->GetPropagator();
320 TEveTrackList* l = dynamic_cast<TEveTrackList*>(cont);
322 rs = l->GetPropagator();
324 Error("kine_tracks.C", "TrackRenderStyle not set.");
330 AliEveTrack* track = new AliEveTrack(p, label, rs);
332 sprintf(form,"%s [%d]", p->GetName(), label);
333 track->SetName(form);
334 track->SetStdTitle();
335 set_track_color(track, pdg_col);
338 gEve->AddElement(track, cont);
342 if (import_daughters && p->GetNDaughters())
344 for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d)
346 TParticle* dp = stack->Particle(d);
347 AliEveTrack* track = new AliEveTrack(dp, d, rs);
349 sprintf(form,"%s [%d]", dp->GetName(), d);
350 track->SetName(form);
351 track->SetStdTitle();
352 set_track_color(track, pdg_col);
355 gEve->AddElement(track, cont);
358 kine_daughters(track, stack, 0, 0, pdg_col, recurse);
367 //==============================================================================
369 void kine_hide_neutrals(TEveElement* el, Int_t level)
373 el = gEve->GetCurrentEvent()->FindChild("Kine Tracks");
378 TEveTrack* t = dynamic_cast<TEveTrack*>(el);
379 if (t && t->GetCharge() == 0)
380 t->SetRnrSelf(kFALSE);
382 for (TEveElement::List_i i = el->BeginChildren(); i != el->EndChildren(); ++i)
384 kine_hide_neutrals(*i, level + 1);