]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/alice-macros/kine_tracks.C
Add default value for tracklet line width argument.
[u/mrichter/AliRoot.git] / EVE / alice-macros / kine_tracks.C
1 // $Id$
2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3
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  **************************************************************************/
9
10 // Import tracks from kinematics-tree / particle-stack.
11 // Preliminary/minimal solution.
12
13 #include <TEveManager.h>
14 #include <TEveTrackPropagator.h>
15
16 #include <EveBase/AliEveEventManager.h>
17 #include <EveBase/AliEveMagField.h>
18 #include <EveBase/AliEveTrack.h>
19 #include <EveBase/AliEveKineTools.h>
20
21 #include <AliRunLoader.h>
22 #include <AliStack.h>
23 #include <AliMagF.h>
24
25 #include "TParticlePDG.h"
26
27 // Use magnetic-field as retrieved from GRP.
28 Bool_t g_kine_tracks_true_field = kTRUE;
29
30 // Use Runge-Kutta track stepper.
31 Bool_t g_kine_tracks_rk_stepper = kFALSE;
32
33 //==============================================================================
34
35 void kine_track_propagator_setup(TEveTrackPropagator* trkProp);
36
37 TEveTrackList*
38 kine_tracks(Double_t min_pt  = 0,     Double_t min_p   = 0,
39             Bool_t   pdg_col = kTRUE, Bool_t   recurse = kTRUE,
40             Bool_t   use_track_refs = kTRUE);
41
42 void kine_daughters(AliEveTrack* parent,  AliStack* stack,
43                     Double_t     min_pt,  Double_t  min_p,
44                     Bool_t       pdg_col, Bool_t    recurse);
45
46 void    set_track_color(AliEveTrack* t, Bool_t pdg_col);
47 Color_t get_pdg_color(Int_t pdg);
48
49 TEveElement*
50 kine_track(Int_t  label,
51            Bool_t import_mother = kTRUE, Bool_t import_daughters = kTRUE,
52            Bool_t pdg_col       = kTRUE, Bool_t recurse          = kTRUE,
53            TEveElement* cont = 0);
54
55 void kine_hide_neutrals(TEveElement* el=0, Int_t level=0);
56
57 //==============================================================================
58
59 void kine_track_propagator_setup(TEveTrackPropagator* trkProp)
60 {
61   AliMagF* fld = AliEveEventManager::AssertMagField();
62
63   if (g_kine_tracks_true_field)
64   {
65     trkProp->SetMagFieldObj(new AliEveMagField(fld));
66   }
67   else
68   {
69     trkProp->SetMagField(-0.1*fld->SolenoidField());
70   }
71   if (g_kine_tracks_rk_stepper)
72   {
73     trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
74   }
75 }
76
77 //==============================================================================
78
79 TEveTrackList*
80 kine_tracks(Double_t min_pt,  Double_t min_p,
81             Bool_t   pdg_col, Bool_t   recurse,
82             Bool_t   use_track_refs)
83 {
84   AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
85   rl->LoadKinematics();
86   AliStack* stack = rl->Stack();
87   if (!stack)
88   {
89     Error("kine_tracks.C", "can not get kinematics.");
90     return 0;
91   }
92
93   gEve->DisableRedraw();
94
95   TEveTrackList* cont = new TEveTrackList("Kine Tracks");
96   cont->SetMainColor(3);
97   TEveTrackPropagator* trkProp = cont->GetPropagator();
98
99   kine_track_propagator_setup(trkProp);
100
101   gEve->AddElement(cont);
102   Int_t count = 0;
103   Int_t Np = stack->GetNprimary();
104   for (Int_t i = 0; i < Np; ++i)
105   {
106     TParticle* p = stack->Particle(i);
107     if (p->GetStatusCode() <= 1)
108     {
109       if (p->Pt() < min_pt && p->P() < min_p) continue;
110
111       ++count;
112       AliEveTrack* track = new AliEveTrack(p, i, trkProp);
113
114       //PH The line below is replaced waiting for a fix in Root
115       //PH which permits to use variable siza arguments in CINT
116       //PH on some platforms (alphalinuxgcc, solariscc5, etc.)
117       //PH    track->SetName(Form("%s [%d]", p->GetName(), i));
118       char form[1000];
119       sprintf(form,"%s [%d]", p->GetName(), i);
120       track->SetName(form);
121       track->SetStdTitle();
122       Int_t ml = p->GetMother(0);
123       if (ml != -1)
124       {
125         track->SetTitle(Form("%s\nMother label=%d\nMother Pdg=%d",
126                              track->GetElementTitle(),
127                              ml, stack->Particle(ml)->GetPdgCode()));
128       }
129       set_track_color(track, pdg_col);
130
131       gEve->AddElement(track, cont);
132
133       if (recurse)
134         kine_daughters(track, stack, min_pt, min_p, pdg_col, recurse);
135     }
136   }
137
138   // set path marks
139   AliEveKineTools kt;
140   kt.SetDaughterPathMarks(cont, stack, recurse);
141   if (use_track_refs && rl->LoadTrackRefs() == 0)
142   {
143     kt.SetTrackReferences(cont, rl->TreeTR(), recurse);
144     trkProp->SetEditPathMarks(kTRUE);
145   }
146   kt.SortPathMarks(cont, recurse);
147
148   //PH  const Text_t* tooltip = Form("min pT=%.2lf, min P=%.2lf), N=%d", min_pt, min_p, count);
149   char tooltip[1000];
150   sprintf(tooltip,"min pT=%.2lf, min P=%.2lf), N=%d", min_pt, min_p, count);
151   cont->SetTitle(tooltip); // Not broadcasted automatically ...
152
153   cont->MakeTracks(recurse);
154   gEve->EnableRedraw();
155   gEve->Redraw3D();
156
157   return cont;
158 }
159
160 void kine_daughters(AliEveTrack* parent,  AliStack* stack,
161                     Double_t     min_pt,  Double_t  min_p,
162                     Bool_t       pdg_col, Bool_t    recurse)
163 {
164   TParticle *p = stack->Particle(parent->GetLabel());
165   if (p->GetNDaughters() > 0)
166   {
167     TEveTrackPropagator* rs = parent->GetPropagator();
168     for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d)
169     {
170       TParticle* dp = stack->Particle(d);
171       if (dp->Pt() < min_pt && dp->P() < min_p) continue;
172
173       AliEveTrack* dtrack = new AliEveTrack(dp, d, rs);
174       char form[1000];
175       sprintf(form,"%s [%d]", dp->GetName(), d);
176       dtrack->SetName(form);
177       dtrack->SetStdTitle();
178       set_track_color(dtrack, pdg_col);
179
180       gEve->AddElement(dtrack, parent);
181
182       if (recurse)
183         kine_daughters(dtrack, stack, min_pt, min_p, pdg_col, recurse);
184     }
185   }
186 }
187
188 //==============================================================================
189
190 void set_track_color(AliEveTrack* t, Bool_t pdg_col)
191 {
192   if (pdg_col)
193     t->SetMainColor(get_pdg_color(t->GetPdg()));
194   else
195     t->SetMainColor(30);
196 }
197
198 Color_t get_pdg_color(Int_t pdg)
199 {
200   // PDG color indices
201   static const Color_t DefCol   = 30;
202   static const Color_t ECol     = 5;
203   static const Color_t MuCol    = 6;
204   static const Color_t GammaCol = 7;
205   static const Color_t MesCol1  = 3;
206   static const Color_t MesCol2  = 38;
207   static const Color_t BarCol   = 10;
208
209   Int_t pdga  = TMath::Abs(pdg);
210   Color_t col = DefCol;
211
212   // elementary  particles
213   if (pdga < 100) {
214     switch (pdga) {
215       case 11:
216         col = ECol; break;
217       case 12:
218         col = MuCol; break;
219       case 22:
220         col = GammaCol; break;
221     }
222   }
223   // mesons and barions
224   else if (pdga < 100000) {
225     Int_t i  = pdga;
226     // Int_t i0 = i%10;  // Not used at the moment.
227     i /= 10;
228     Int_t i1 = i%10; i /= 10;
229     Int_t i2 = i%10; i /= 10;
230     Int_t i3 = i%10; i /= 10;
231     Int_t i4 = i%10;
232     //printf("pdg(%d) quark indices (%d,%d,%d,%d,%d) \n",pdg, i4,i3,i2, i1, i0);
233     // meson
234     if ((i3 == 0) && ( i4 < 2)){
235       col = MesCol1; // quarks: i1,i2 (spin = i0)
236       if(i1 == 3 || i2 == 3)
237         col = MesCol2;
238     } // barion
239     else if ( i2 >= i1 && i3 >= i2 ) {
240       col = BarCol; // quarks: i1,i2, i3 (spin = i0))
241     }
242   }
243
244   return col;
245 }
246
247 //==============================================================================
248
249 TEveElement*
250 kine_track(Int_t  label,
251            Bool_t import_mother, Bool_t import_daughters,
252            Bool_t pdg_col,       Bool_t recurse,
253            TEveElement* cont)
254 {
255   // Create mother and daughters tracks with given label.
256   // mother     -> particle with label
257   // daughters  -> daughters of label
258
259   if (label < 0) {
260     Warning("kine_track", "label not set.");
261     return 0;
262   }
263
264   AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
265   rl->LoadKinematics();
266   AliStack* stack = rl->Stack();
267   if (label >= stack->GetNtrack())
268   {
269     Warning("kine_track", "label out of range.");
270     return 0;
271   }
272
273   TParticle* p = stack->Particle(label);
274
275   if (import_mother || (import_daughters && p->GetNDaughters()))
276   {
277     TEveTrackPropagator* rs = 0;
278
279     if (cont == 0)
280     {
281       TEveTrackList* tlist = new TEveTrackList
282         (Form("Kinematics of %d", label, p->GetNDaughters()));
283       cont = tlist;
284
285       TEveTrackPropagator* trkProp = tlist->GetPropagator();
286
287       kine_track_propagator_setup(trkProp);
288
289       char tooltip[1000];
290       sprintf(tooltip,"Ndaughters=%d", p->GetNDaughters());
291       tlist->SetTitle(tooltip);
292       trkProp->fMaxOrbs = 2;
293       trkProp->SetEditPathMarks(kTRUE);
294
295       gEve->AddElement(cont);
296       rs = tlist->GetPropagator();
297     }
298     else
299     {
300       // check if container is TEveTrackList or AliEveTrack (has rnr-style)
301       AliEveTrack* t = dynamic_cast<AliEveTrack*>(cont);
302       if (t) {
303         rs = t->GetPropagator();
304       } else {
305         TEveTrackList* l = dynamic_cast<TEveTrackList*>(cont);
306         if (l)
307           rs = l->GetPropagator();
308         else
309           Error("kine_tracks.C", "TrackRenderStyle not set.");
310       }
311     }
312
313     if (import_mother)
314     {
315       AliEveTrack* track = new AliEveTrack(p, label, rs);
316       char form[1000];
317       sprintf(form,"%s [%d]", p->GetName(), label);
318       track->SetName(form);
319       track->SetStdTitle();
320       set_track_color(track, pdg_col);
321
322       track->MakeTrack();
323       gEve->AddElement(track, cont);
324       cont = track;
325     }
326
327     if (import_daughters && p->GetNDaughters())
328     {
329       for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d)
330       {
331         TParticle* dp = stack->Particle(d);
332         AliEveTrack* track = new AliEveTrack(dp, d, rs);
333         char form[1000];
334         sprintf(form,"%s [%d]", dp->GetName(), d);
335         track->SetName(form);
336         track->SetStdTitle();
337         set_track_color(track, pdg_col);
338
339         track->MakeTrack();
340         gEve->AddElement(track, cont);
341
342         if (recurse)
343           kine_daughters(track, stack, 0, 0, pdg_col, recurse);
344       }
345     }
346   }
347
348   gEve->Redraw3D();
349   return cont;
350 }
351
352 //==============================================================================
353
354 void kine_hide_neutrals(TEveElement* el, Int_t level)
355 {
356   if (el == 0)
357   {
358     el = gEve->GetCurrentEvent()->FindChild("Kine Tracks");
359     if (!el)
360       return;
361   }
362
363   TEveTrack* t = dynamic_cast<TEveTrack*>(el);
364   if (t && t->GetCharge() == 0)
365     t->SetRnrSelf(kFALSE);
366
367   for (TEveElement::List_i i = el->BeginChildren(); i != el->EndChildren(); ++i)
368   {
369     kine_hide_neutrals(*i, level + 1);
370   }
371
372   if (level == 0)
373     gEve->Redraw3D();
374 }