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