1 // Import tracks from kinematics-tree / particle-stack.
2 // Preliminary/minimal solution.
3 #include "TParticlePDG.h"
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;
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)
19 AliRunLoader* rl = Alieve::Event::AssertRunLoader();
21 AliStack* stack = rl->Stack();
23 Error("kine_tracks.C", "can not get kinematics.");
27 gReve->DisableRedraw();
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() );
35 gReve->AddRenderElement(cont);
37 Int_t N = stack->GetNtrack();
38 for (Int_t i=0; i<N; ++i)
40 if(stack->IsPhysicalPrimary(i))
42 TParticle* p = stack->Particle(i);
43 if (p->Pt() < min_pt && p->P() < min_p) continue;
46 Reve::Track* track = new Reve::Track(p, i, rnrStyle);
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));
53 sprintf(form,"%s [%d]", p->GetName(), i);
55 if (pdg_col && p->GetPDG())
56 track->SetMainColor(get_pdg_color(p->GetPDG()->PdgCode()));
57 gReve->AddRenderElement(track, cont);
60 kine_daughters(track, stack, min_pt, min_p, pdg_col, recurse);
66 kt.SetDaughterPathMarks(cont, stack, recurse);
67 if (use_track_refs && rl->LoadTrackRefs() == 0)
69 kt.SetTrackReferences(cont, rl->TreeTR(), recurse);
70 rnrStyle->SetEditPathMarks(kTRUE);
72 kt.SortPathMarks(cont, recurse);
74 //PH const Text_t* tooltip = Form("min pT=%.2lf, min P=%.2lf), N=%d", min_pt, min_p, count);
76 sprintf(tooltip,"min pT=%.2lf, min P=%.2lf), N=%d", min_pt, min_p, count);
77 cont->SetTitle(tooltip); // Not broadcasted automatically ...
80 cont->MakeTracks(recurse);
81 gReve->EnableRedraw();
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)
91 TParticle *p = stack->Particle(parent->GetLabel());
92 if (p->GetNDaughters() > 0)
94 Reve::TrackRnrStyle* rs = parent->GetRnrStyle();
95 for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d)
97 TParticle* dp = stack->Particle(d);
98 if (dp->Pt() < min_pt && dp->P() < min_p) continue;
100 Reve::Track* dtrack = new Reve::Track(dp, d, rs);
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);
109 kine_daughters(dtrack, stack, min_pt, min_p, pdg_col, recurse);
114 Color_t get_pdg_color(Int_t pdg)
116 Int_t pdga = TMath::Abs(pdg);
117 Color_t col = Reve::DefCol;
119 // elementary particles
127 col = GammaCol; break;
130 else if (pdga < 100000){
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;
137 //printf("pdg(%d) quark indices (%d,%d,%d,%d,%d) \n",pdg, i4,i3,i2, i1, i0);
139 if ((i3 == 0) && ( i4 < 2)){
140 col = MesCol1; // quarks: i1,i2 (spin = i0)
141 if(i1 == 3 || i2 == 3)
144 else if ( i2 >= i1 && i3 >= i2 ) {
145 col = BarCol; // quarks: i1,i2, i3 (spin = i0))
152 // Create mother and daughters tracks with given label.
155 kine_track(Int_t label,
156 Bool_t import_mother = kTRUE,
157 Bool_t import_daughters = kTRUE,
158 Reve::RenderElement* cont = 0)
162 Warning("kine_track", "label not set.");
166 AliRunLoader* rl = Alieve::Event::AssertRunLoader();
167 rl->LoadKinematics();
168 AliStack* stack = rl->Stack();
169 TParticle* p = stack->Particle(label);
171 if (import_mother || (import_daughters && p->GetNDaughters()))
174 TrackList* tracklist = 0;
175 TrackRnrStyle* rs = 0;
179 Reve::TrackList* tlist = new Reve::TrackList
180 (Form("Kinematics of %d", label, p->GetNDaughters()));
183 Reve::TrackRnrStyle* rnrStyle = tlist->GetRnrStyle();
184 // !!! Watch the '-', apparently different sign convention then for ESD.
185 rnrStyle->SetMagField( - gAlice->Field()->SolenoidField() );
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();
197 // check if argument is TrackList
198 Reve::Track* t = dynamic_cast<Reve::Track*>(cont);
201 rs = t->GetRnrStyle();
205 Reve::TrackList* l = dynamic_cast<Reve::TrackList*>(cont);
208 rs = l->GetRnrStyle();
212 Error("kine_tracks.C", "TrackRenderStyle not set.");
219 Track* track = new Reve::Track(p, label, rs);
221 sprintf(form,"%s [%d]", p->GetName(), label);
222 track->SetName(form);
223 gReve->AddRenderElement(track, cont);
227 if (import_daughters && p->GetNDaughters())
229 for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d)
231 TParticle* dp = stack->Particle(d);
232 Track* track = new Reve::Track(dp, d, rs);
234 sprintf(form,"%s [%d]", dp->GetName(), d);
235 track->SetName(form);
237 gReve->AddRenderElement(track, cont);