2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
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 **************************************************************************/
10 // Import tracks from kinematics-tree / particle-stack.
11 // Preliminary/minimal solution.
13 #include "TParticlePDG.h"
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)
20 AliRunLoader* rl = AliEveEventManager::AssertRunLoader();
22 AliStack* stack = rl->Stack();
25 Error("kine_tracks.C", "can not get kinematics.");
29 gEve->DisableRedraw();
31 TEveTrackList* cont = new TEveTrackList("Kine Tracks");
32 cont->SetMainColor(3);
33 TEveTrackPropagator* trkProp = cont->GetPropagator();
35 AliMagF* fld = AliEveEventManager::AssertMagField();
36 // !!! Watch the '-', apparently different sign convention then for ESD.
37 trkProp->SetMagField(fld ? -0.1*fld->SolenoidField() : 0);
39 gEve->AddElement(cont);
41 Int_t N = stack->GetNtrack();
42 Int_t Np = stack->GetNprimary();
43 for (Int_t i = 0; i < Np; ++i)
45 TParticle* p = stack->Particle(i);
46 if (p->GetStatusCode() <= 1)
48 if (p->Pt() < min_pt && p->P() < min_p) continue;
51 TEveTrack* track = new TEveTrack(p, i, trkProp);
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));
58 sprintf(form,"%s [%d]", p->GetName(), i);
61 Int_t ml = p->GetMother(0);
64 track->SetTitle(Form("%s\nMother label=%d\nMother Pdg=%d",
65 track->GetElementTitle(),
66 ml, stack->Particle(ml)->GetPdgCode()));
68 set_track_color(track, pdg_col);
70 gEve->AddElement(track, cont);
73 kine_daughters(track, stack, min_pt, min_p, pdg_col, recurse);
79 kt.SetDaughterPathMarks(cont, stack, recurse);
80 if (use_track_refs && rl->LoadTrackRefs() == 0)
82 kt.SetTrackReferences(cont, rl->TreeTR(), recurse);
83 trkProp->SetEditPathMarks(kTRUE);
85 kt.SortPathMarks(cont, recurse);
87 //PH const Text_t* tooltip = Form("min pT=%.2lf, min P=%.2lf), N=%d", min_pt, min_p, count);
89 sprintf(tooltip,"min pT=%.2lf, min P=%.2lf), N=%d", min_pt, min_p, count);
90 cont->SetTitle(tooltip); // Not broadcasted automatically ...
92 cont->MakeTracks(recurse);
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)
103 TParticle *p = stack->Particle(parent->GetLabel());
104 if (p->GetNDaughters() > 0)
106 TEveTrackPropagator* rs = parent->GetPropagator();
107 for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d)
109 TParticle* dp = stack->Particle(d);
110 if (dp->Pt() < min_pt && dp->P() < min_p) continue;
112 TEveTrack* dtrack = new TEveTrack(dp, d, rs);
114 sprintf(form,"%s [%d]", dp->GetName(), d);
115 dtrack->SetName(form);
116 dtrack->SetStdTitle();
117 set_track_color(dtrack, pdg_col);
119 gEve->AddElement(dtrack, parent);
122 kine_daughters(dtrack, stack, min_pt, min_p, pdg_col, recurse);
127 Color_t set_track_color(TEveTrack* t, Bool_t pdg_col)
130 t->SetMainColor(get_pdg_color(t->GetPdg()));
135 Color_t get_pdg_color(Int_t pdg)
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;
146 Int_t pdga = TMath::Abs(pdg);
147 Color_t col = DefCol;
149 // elementary particles
157 col = GammaCol; break;
160 // mesons and barions
161 else if (pdga < 100000) {
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;
168 //printf("pdg(%d) quark indices (%d,%d,%d,%d,%d) \n",pdg, i4,i3,i2, i1, i0);
170 if ((i3 == 0) && ( i4 < 2)){
171 col = MesCol1; // quarks: i1,i2 (spin = i0)
172 if(i1 == 3 || i2 == 3)
175 else if ( i2 >= i1 && i3 >= i2 ) {
176 col = BarCol; // quarks: i1,i2, i3 (spin = i0))
183 /******************************************************************************/
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)
192 // Create mother and daughters tracks with given label.
193 // mother -> particle with label
194 // daughters -> daughters of label
197 Warning("kine_track", "label not set.");
201 AliRunLoader* rl = AliEveEventManager::AssertRunLoader();
202 rl->LoadKinematics();
203 AliStack* stack = rl->Stack();
204 if (label >= stack->GetNtrack())
206 Warning("kine_track", "label out of range.");
210 TParticle* p = stack->Particle(label);
212 if (import_mother || (import_daughters && p->GetNDaughters()))
214 TEveTrack* toptrack = 0;
215 TEveTrackList* tracklist = 0;
216 TEveTrackPropagator* rs = 0;
220 TEveTrackList* tlist = new TEveTrackList
221 (Form("Kinematics of %d", label, p->GetNDaughters()));
224 TEveTrackPropagator* trkProp = tlist->GetPropagator();
226 AliMagF* fld = AliEveEventManager::AssertMagField();
227 trkProp->SetMagField(fld ? -0.1*fld->SolenoidField() : 0);
230 sprintf(tooltip,"Ndaughters=%d", p->GetNDaughters());
231 tlist->SetTitle(tooltip);
232 trkProp->fMaxOrbs = 2;
233 trkProp->SetEditPathMarks(kTRUE);
235 gEve->AddElement(cont);
236 rs = tlist->GetPropagator();
240 // check if container is TEveTrackList or TEveTrack (has rnr-style)
241 TEveTrack* t = dynamic_cast<TEveTrack*>(cont);
243 rs = t->GetPropagator();
245 TEveTrackList* l = dynamic_cast<TEveTrackList*>(cont);
247 rs = l->GetPropagator();
249 Error("kine_tracks.C", "TrackRenderStyle not set.");
255 TEveTrack* track = new TEveTrack(p, label, rs);
257 sprintf(form,"%s [%d]", p->GetName(), label);
258 track->SetName(form);
259 track->SetStdTitle();
260 set_track_color(track, pdg_col);
263 gEve->AddElement(track, cont);
267 if (import_daughters && p->GetNDaughters())
269 for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d)
271 TParticle* dp = stack->Particle(d);
272 TEveTrack* track = new TEveTrack(dp, d, rs);
274 sprintf(form,"%s [%d]", dp->GetName(), d);
275 track->SetName(form);
276 track->SetStdTitle();
277 set_track_color(track, pdg_col);
280 gEve->AddElement(track, cont);
283 kine_daughters(track, stack, 0, 0, pdg_col, recurse);