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