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