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