void kine_daughters(IlcEveTrack* parent, IlcStack* stack, Double_t min_pt, Double_t min_p, Bool_t pdg_col, Bool_t recurse) { TParticle *p = stack->Particle(parent->GetLabel()); if (p->GetNDaughters() > 0) { TEveTrackPropagator* rs = parent->GetPropagator(); for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d) { TParticle* dp = stack->Particle(d); if (dp->Pt() < min_pt && dp->P() < min_p) continue; IlcEveTrack* dtrack = new IlcEveTrack(dp, d, rs); char form[1000]; sprintf(form,"%s [%d]", dp->GetName(), d); dtrack->SetName(form); dtrack->SetStdTitle(); set_track_color(dtrack, pdg_col); gEve->AddElement(dtrack, parent); if (recurse) kine_daughters(dtrack, stack, min_pt, min_p, pdg_col, recurse); } } }
void GetFinalDecayProducts(Int_t ind, IlcStack & stack , TArrayI & ar){ // Recursive algorithm to get the final decay products of a particle // // ind is the index of the particle in the IlcStack // stack is the particle stack from the generator // ar contains the indexes of the final decay products // ar[0] is the number of final decay products if (ind<0 || ind>stack.GetNtrack()) { cerr << "Invalid index of the particle " << ind << endl; return; } if (ar.GetSize()==0) { ar.Set(10); ar[0] = 0; } TParticle * part = stack.Particle(ind); Int_t iFirstDaughter = part->GetFirstDaughter(); if( iFirstDaughter<0) { // This particle is a final decay product, add its index to the array ar[0]++; if (ar.GetSize() <= ar[0]) ar.Set(ar.GetSize()+10); // resize if needed ar[ar[0]] = ind; return; } Int_t iLastDaughter = part->GetLastDaughter(); for (Int_t id=iFirstDaughter; id<=iLastDaughter;id++) { // Now search for final decay products of the daughters GetFinalDecayProducts(id,stack,ar); } }
TEveElement* kine_track(Int_t label, Bool_t import_mother, Bool_t import_daughters, Bool_t pdg_col, Bool_t recurse, TEveElement* cont) { // Create mother and daughters tracks with given label. // mother -> particle with label // daughters -> daughters of label if (label < 0) { Warning("kine_track", "label not set."); return 0; } IlcRunLoader* rl = IlcEveEventManager::AssertRunLoader(); rl->LoadKinematics(); IlcStack* stack = rl->Stack(); if (!stack) { Warning("kine_track", "can not get kinematics."); return 0; } if (label >= stack->GetNtrack()) { Warning("kine_track", "label out of range."); return 0; } TParticle* p = stack->Particle(label); if (import_mother || (import_daughters && p->GetNDaughters())) { TEveTrackPropagator* rs = 0; if (cont == 0) { TEveTrackList* tlist = new TEveTrackList (Form("Kinematics of %d %d", label, p->GetNDaughters())); cont = tlist; TEveTrackPropagator* trkProp = tlist->GetPropagator(); kine_track_propagator_setup(trkProp); char tooltip[1000]; sprintf(tooltip,"Ndaughters=%d", p->GetNDaughters()); tlist->SetTitle(tooltip); trkProp->SetMaxOrbs(2); trkProp->SetEditPathMarks(kTRUE); gEve->AddElement(cont); rs = tlist->GetPropagator(); } else { // check if container is TEveTrackList or IlcEveTrack (has rnr-style) IlcEveTrack* t = dynamic_cast<IlcEveTrack*>(cont); if (t) { rs = t->GetPropagator(); } else { TEveTrackList* l = dynamic_cast<TEveTrackList*>(cont); if (l) rs = l->GetPropagator(); else Error("kine_tracks.C", "TrackRenderStyle not set."); } } if (import_mother) { IlcEveTrack* track = new IlcEveTrack(p, label, rs); char form[1000]; sprintf(form,"%s [%d]", p->GetName(), label); track->SetName(form); track->SetStdTitle(); set_track_color(track, pdg_col); track->MakeTrack(); gEve->AddElement(track, cont); cont = track; } if (import_daughters && p->GetNDaughters()) { for (int d=p->GetFirstDaughter(); d>0 && d<=p->GetLastDaughter(); ++d) { TParticle* dp = stack->Particle(d); IlcEveTrack* track = new IlcEveTrack(dp, d, rs); char form[1000]; sprintf(form,"%s [%d]", dp->GetName(), d); track->SetName(form); track->SetStdTitle(); set_track_color(track, pdg_col); track->MakeTrack(); gEve->AddElement(track, cont); if (recurse) kine_daughters(track, stack, 0, 0, pdg_col, recurse); } } } gEve->Redraw3D(); return cont; }