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