49 TEveTrack::TEveTrack() :
72 TEveTrack::TEveTrack(TParticle* t, Int_t label, TEveTrackPropagator* prop):
75 fV(t->Vx(), t->Vy(), t->Vz()),
76 fP(t->Px(), t->Py(), t->Pz()),
78 fBeta(t->P()/t->Energy()),
84 fStatus(t->GetStatusCode()),
91 fMainColorPtr = &fLineColor;
93 TParticlePDG* pdgp = t->GetPDG();
95 fPdg = pdgp->PdgCode();
96 fCharge = (Int_t) TMath::Nint(pdgp->Charge()/3);
99 SetName(t->GetName());
104 TEveTrack::TEveTrack(TEveMCTrack* t, TEveTrackPropagator* prop):
107 fV(t->Vx(), t->Vy(), t->Vz()),
108 fP(t->Px(), t->Py(), t->Pz()),
110 fBeta(t->P()/t->Energy()),
116 fStatus(t->GetStatusCode()),
125 fMainColorPtr = &fLineColor;
127 TParticlePDG* pdgp = t->GetPDG();
129 fCharge = (Int_t) TMath::Nint(pdgp->Charge()/3);
132 SetName(t->GetName());
138 TEveTrack::TEveTrack(TEveRecTrackD* t, TEveTrackPropagator* prop) :
157 fMainColorPtr = &fLineColor;
159 SetName(t->GetName());
167 TEveTrack::TEveTrack(TEveRecTrack* t, TEveTrackPropagator* prop) :
186 fMainColorPtr = &fLineColor;
188 SetName(t->GetName());
197 TEveTrack::TEveTrack(
const TEveTrack& t) :
209 fLockPoints(t.fLockPoints),
211 fLastPMIdx(t.fLastPMIdx),
218 SetPropagator (t.fPropagator);
226 TEveTrack::~TEveTrack()
235 const TGPicture* TEveTrack::GetListTreeIcon(Bool_t)
237 return fgListTreeIcons[4];
243 void TEveTrack::ComputeBBox()
245 if (Size() > 0 || ! fPathMarks.empty())
249 Float_t* p = TPolyMarker3D::fP;
250 for (Int_t i = 0; i < n; ++i, p += 3)
254 for (vPathMark_ci i = fPathMarks.begin(); i != fPathMarks.end(); ++i)
256 BBoxCheckPoint(i->fV.fX, i->fV.fY,i->fV.fZ);
268 void TEveTrack::SetStdTitle()
270 TString idx(fIndex == kMinInt ?
"<undef>" : Form(
"%d", fIndex));
271 TString lbl(fLabel == kMinInt ?
"<undef>" : Form(
"%d", fLabel));
272 SetTitle(Form(
"Index=%s, Label=%s\nChg=%d, Pdg=%d\n"
273 "pT=%.3f, pZ=%.3f\nV=(%.3f, %.3f, %.3f)",
274 idx.Data(), lbl.Data(), fCharge, fPdg,
275 fP.Perp(), fP.fZ, fV.fX, fV.fY, fV.fZ));
284 void TEveTrack::SetTrackParams(
const TEveTrack& t)
295 SetPropagator(t.fPropagator);
301 void TEveTrack::SetPathMarks(
const TEveTrack& t)
303 std::copy(t.RefPathMarks().begin(), t.RefPathMarks().end(),
304 std::back_insert_iterator<vPathMark_t>(fPathMarks));
311 void TEveTrack::SetPropagator(TEveTrackPropagator* prop)
313 if (fPropagator == prop)
return;
314 if (fPropagator) fPropagator->DecRefCount(
this);
316 if (fPropagator) fPropagator->IncRefCount(
this);
322 void TEveTrack::SetAttLineAttMarker(TEveTrackList* tl)
324 SetRnrLine(tl->GetRnrLine());
325 SetLineColor(tl->GetLineColor());
326 SetLineStyle(tl->GetLineStyle());
327 SetLineWidth(tl->GetLineWidth());
329 SetRnrPoints(tl->GetRnrPoints());
330 SetMarkerColor(tl->GetMarkerColor());
331 SetMarkerStyle(tl->GetMarkerStyle());
332 SetMarkerSize(tl->GetMarkerSize());
340 void TEveTrack::MakeTrack(Bool_t recurse)
347 TEveTrackPropagator& rTP((fPropagator != 0) ? *fPropagator : TEveTrackPropagator::fgDefault);
349 const Double_t maxRsq = rTP.GetMaxR() * rTP.GetMaxR();
350 const Double_t maxZ = rTP.GetMaxZ();
352 if ( ! TEveTrackPropagator::IsOutsideBounds(fV, maxRsq, maxZ))
354 TEveVectorD currP = fP;
355 Bool_t decay = kFALSE;
356 rTP.InitTrack(fV, fCharge);
357 for (vPathMark_i pm = fPathMarks.begin(); pm != fPathMarks.end(); ++pm, ++fLastPMIdx)
359 Int_t start_point = rTP.GetCurrentPoint();
361 if (rTP.GetFitReferences() && pm->fType == TEvePathMarkD::kReference)
363 if (TEveTrackPropagator::IsOutsideBounds(pm->fV, maxRsq, maxZ))
365 if (rTP.GoToVertex(pm->fV, currP))
367 currP.fX = pm->fP.fX; currP.fY = pm->fP.fY; currP.fZ = pm->fP.fZ;
374 else if (rTP.GetFitDaughters() && pm->fType == TEvePathMarkD::kDaughter)
376 if (TEveTrackPropagator::IsOutsideBounds(pm->fV, maxRsq, maxZ))
378 if (rTP.GoToVertex(pm->fV, currP))
380 currP.fX -= pm->fP.fX; currP.fY -= pm->fP.fY; currP.fZ -= pm->fP.fZ;
383 Double_t dp = fDpDs * rTP.GetTrackLength(start_point);
384 Double_t p = currP.Mag();
385 if (p > dp) currP *= 1.0 - dp / p;
393 else if (rTP.GetFitDecay() && pm->fType == TEvePathMarkD::kDecay)
395 if (TEveTrackPropagator::IsOutsideBounds(pm->fV, maxRsq, maxZ))
397 rTP.GoToVertex(pm->fV, currP);
402 else if (rTP.GetFitCluster2Ds() && pm->fType == TEvePathMarkD::kCluster2D)
405 if (rTP.IntersectPlane(currP, pm->fV, pm->fP, itsect))
407 TEveVectorD delta = itsect - pm->fV;
408 TEveVectorD vtopass = pm->fV + pm->fE*(pm->fE.Dot(delta));
409 if (TEveTrackPropagator::IsOutsideBounds(vtopass, maxRsq, maxZ))
411 if ( ! rTP.GoToVertex(vtopass, currP))
416 Double_t dp = fDpDs * rTP.GetTrackLength(start_point);
417 Double_t p = currP.Mag();
418 if (p > dp) currP *= 1.0 - dp / p;
423 Warning(
"TEveTrack::MakeTrack",
"Failed to intersect plane for Cluster2D. Ignoring path-mark.");
426 else if (rTP.GetFitLineSegments() && pm->fType == TEvePathMarkD::kLineSegment)
428 if (TEveTrackPropagator::IsOutsideBounds(pm->fV, maxRsq, maxZ))
431 if (rTP.GoToLineSegment(pm->fV, pm->fE, currP))
435 Double_t dp = fDpDs * rTP.GetTrackLength(start_point);
436 Double_t p = currP.Mag();
437 if (p > dp) currP *= 1.0 - dp / p;
447 if (TEveTrackPropagator::IsOutsideBounds(pm->fV, maxRsq, maxZ))
455 rTP.GoToBounds(currP);
459 rTP.FillPointSet(
this);
466 for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
468 TEveTrack* t =
dynamic_cast<TEveTrack*
>(*i);
469 if (t) t->MakeTrack(recurse);
477 void TEveTrack::CopyVizParams(
const TEveElement* el)
485 TEveLine::CopyVizParams(el);
491 void TEveTrack::WriteVizParams(std::ostream& out,
const TString& var)
493 TEveLine::WriteVizParams(out, var);
501 TClass* TEveTrack::ProjectedClass(
const TEveProjection*)
const
503 return TEveTrackProjected::Class();
508 struct Cmp_pathmark_t
510 bool operator()(TEvePathMarkD
const & a, TEvePathMarkD
const & b)
511 {
return a.fTime < b.fTime; }
518 void TEveTrack::SortPathMarksByTime()
520 std::sort(fPathMarks.begin(), fPathMarks.end(), Cmp_pathmark_t());
526 void TEveTrack::PrintPathMarks()
528 static const TEveException eh(
"TEveTrack::PrintPathMarks ");
530 printf(
"TEveTrack '%s', number of path marks %d, label %d\n",
531 GetName(), (Int_t)fPathMarks.size(), fLabel);
533 for (vPathMark_i pm = fPathMarks.begin(); pm != fPathMarks.end(); ++pm)
535 printf(
" %-9s p: %8f %8f %8f Vertex: %8e %8e %8e %g Extra:%8f %8f %8f\n",
537 pm->fP.fX, pm->fP.fY, pm->fP.fZ,
538 pm->fV.fX, pm->fV.fY, pm->fV.fZ,
539 pm->fE.fX, pm->fE.fY, pm->fE.fZ,
550 void TEveTrack::SecSelected(TEveTrack* track)
552 Emit(
"SecSelected(TEveTrack*)", (Long_t)track);
561 ClassImp(TEveTrackList);
567 TEveTrackList::TEveTrackList(TEveTrackPropagator* prop) :
569 TAttMarker(1, 20, 1),
577 fMinPt (0), fMaxPt (0), fLimPt (0),
578 fMinP (0), fMaxP (0), fLimP (0)
581 fChildClass = TEveTrack::Class();
583 fMainColorPtr = &fLineColor;
585 if (prop == 0) prop =
new TEveTrackPropagator;
593 TEveTrackList::TEveTrackList(
const char* name, TEveTrackPropagator* prop) :
594 TEveElementList(name),
595 TAttMarker(1, 20, 1),
603 fMinPt (0), fMaxPt (0), fLimPt (0),
604 fMinP (0), fMaxP (0), fLimP (0)
606 fChildClass = TEveTrack::Class();
608 fMainColorPtr = &fLineColor;
610 if (prop == 0) prop =
new TEveTrackPropagator;
617 TEveTrackList::~TEveTrackList()
627 void TEveTrackList::SetPropagator(TEveTrackPropagator* prop)
629 if (fPropagator == prop)
return;
630 if (fPropagator) fPropagator->DecRefCount();
632 if (fPropagator) fPropagator->IncRefCount();
639 void TEveTrackList::MakeTracks(Bool_t recurse)
643 for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
645 TEveTrack* track =
dynamic_cast<TEveTrack*
>(*i);
648 track->MakeTrack(recurse);
650 fLimPt = TMath::Max(fLimPt, track->fP.Perp());
651 fLimP = TMath::Max(fLimP, track->fP.Mag());
654 FindMomentumLimits(*i, recurse);
657 fLimPt = RoundMomentumLimit(fLimPt);
658 fLimP = RoundMomentumLimit(fLimP);
660 SanitizeMinMaxCuts();
667 void TEveTrackList::FindMomentumLimits(Bool_t recurse)
673 for (List_i i=BeginChildren(); i!=EndChildren(); ++i)
675 TEveTrack* track =
dynamic_cast<TEveTrack*
>(*i);
678 fLimPt = TMath::Max(fLimPt, track->fP.Perp());
679 fLimP = TMath::Max(fLimP, track->fP.Mag());
682 FindMomentumLimits(*i, recurse);
685 fLimPt = RoundMomentumLimit(fLimPt);
686 fLimP = RoundMomentumLimit(fLimP);
689 SanitizeMinMaxCuts();
696 void TEveTrackList::FindMomentumLimits(TEveElement* el, Bool_t recurse)
698 for (List_i i=el->BeginChildren(); i!=el->EndChildren(); ++i)
700 TEveTrack* track =
dynamic_cast<TEveTrack*
>(*i);
703 fLimPt = TMath::Max(fLimPt, track->fP.Perp());
704 fLimP = TMath::Max(fLimP, track->fP.Mag());
707 FindMomentumLimits(*i, recurse);
714 Double_t TEveTrackList::RoundMomentumLimit(Double_t x)
716 using namespace TMath;
718 if (x < 1e-3)
return 1e-3;
720 Double_t fac = Power(10, 1 - Floor(Log10(x)));
721 return Ceil(fac*x) / fac;
727 void TEveTrackList::SanitizeMinMaxCuts()
729 using namespace TMath;
731 fMinPt = Min(fMinPt, fLimPt);
732 fMaxPt = fMaxPt == 0 ? fLimPt : Min(fMaxPt, fLimPt);
733 fMinP = Min(fMinP, fLimP);
734 fMaxP = fMaxP == 0 ? fLimP : Min(fMaxP, fLimP);
740 void TEveTrackList::SetRnrLine(Bool_t rnr)
742 for (List_i i=BeginChildren(); i!=EndChildren(); ++i)
744 TEveTrack* track = (TEveTrack*)(*i);
745 if (track->GetRnrLine() == fRnrLine)
746 track->SetRnrLine(rnr);
756 void TEveTrackList::SetRnrLine(Bool_t rnr, TEveElement* el)
759 for (List_i i=el->BeginChildren(); i!=el->EndChildren(); ++i)
761 track =
dynamic_cast<TEveTrack*
>(*i);
762 if (track && (track->GetRnrLine() == fRnrLine))
763 track->SetRnrLine(rnr);
772 void TEveTrackList::SetRnrPoints(Bool_t rnr)
774 for (List_i i=BeginChildren(); i!=EndChildren(); ++i)
776 TEveTrack* track = (TEveTrack*)(*i);
777 if (track->GetRnrPoints() == fRnrPoints)
778 track->SetRnrPoints(rnr);
780 SetRnrPoints(rnr, *i);
788 void TEveTrackList::SetRnrPoints(Bool_t rnr, TEveElement* el)
791 for (List_i i=el->BeginChildren(); i!=el->EndChildren(); ++i)
793 track =
dynamic_cast<TEveTrack*
>(*i);
795 if (track->GetRnrPoints() == fRnrPoints)
796 track->SetRnrPoints(rnr);
798 SetRnrPoints(rnr, *i);
805 void TEveTrackList::SetMainColor(Color_t col)
807 for (List_i i=BeginChildren(); i!=EndChildren(); ++i)
809 TEveTrack* track = (TEveTrack*)(*i);
810 if (track->GetLineColor() == fLineColor)
811 track->SetLineColor(col);
813 SetLineColor(col, *i);
815 TEveElement::SetMainColor(col);
821 void TEveTrackList::SetLineColor(Color_t col, TEveElement* el)
824 for (List_i i=el->BeginChildren(); i!=el->EndChildren(); ++i)
826 track =
dynamic_cast<TEveTrack*
>(*i);
827 if (track && track->GetLineColor() == fLineColor)
828 track->SetLineColor(col);
830 SetLineColor(col, *i);
837 void TEveTrackList::SetLineWidth(Width_t width)
839 for (List_i i=BeginChildren(); i!=EndChildren(); ++i)
841 TEveTrack* track = (TEveTrack*)(*i);
842 if (track->GetLineWidth() == fLineWidth)
843 track->SetLineWidth(width);
845 SetLineWidth(width, *i);
853 void TEveTrackList::SetLineWidth(Width_t width, TEveElement* el)
856 for (List_i i=el->BeginChildren(); i!=el->EndChildren(); ++i)
858 track =
dynamic_cast<TEveTrack*
>(*i);
859 if (track && track->GetLineWidth() == fLineWidth)
860 track->SetLineWidth(width);
862 SetLineWidth(width, *i);
869 void TEveTrackList::SetLineStyle(Style_t style)
871 for (List_i i=BeginChildren(); i!=EndChildren(); ++i)
873 TEveTrack* track = (TEveTrack*)(*i);
874 if (track->GetLineStyle() == fLineStyle)
875 track->SetLineStyle(style);
877 SetLineStyle(style, *i);
885 void TEveTrackList::SetLineStyle(Style_t style, TEveElement* el)
888 for (List_i i=el->BeginChildren(); i!=el->EndChildren(); ++i)
890 track =
dynamic_cast<TEveTrack*
>(*i);
891 if (track && track->GetLineStyle() == fLineStyle)
892 track->SetLineStyle(style);
894 SetLineStyle(style, *i);
901 void TEveTrackList::SetMarkerStyle(Style_t style)
903 for (List_i i=BeginChildren(); i!=EndChildren(); ++i)
905 TEveTrack* track = (TEveTrack*)(*i);
906 if (track->GetMarkerStyle() == fMarkerStyle)
907 track->SetMarkerStyle(style);
909 SetMarkerStyle(style, *i);
911 fMarkerStyle = style;
917 void TEveTrackList::SetMarkerStyle(Style_t style, TEveElement* el)
920 for (List_i i=el->BeginChildren(); i!=el->EndChildren(); ++i)
922 track =
dynamic_cast<TEveTrack*
>(*i);
923 if (track && track->GetMarkerStyle() == fMarkerStyle)
924 track->SetMarkerStyle(style);
926 SetMarkerStyle(style, *i);
933 void TEveTrackList::SetMarkerColor(Color_t col)
935 for (List_i i=BeginChildren(); i!=EndChildren(); ++i)
937 TEveTrack* track = (TEveTrack*)(*i);
938 if (track->GetMarkerColor() == fMarkerColor)
939 track->SetMarkerColor(col);
941 SetMarkerColor(col, *i);
949 void TEveTrackList::SetMarkerColor(Color_t col, TEveElement* el)
952 for (List_i i=el->BeginChildren(); i!=el->EndChildren(); ++i)
954 track =
dynamic_cast<TEveTrack*
>(*i);
955 if (track && track->GetMarkerColor() == fMarkerColor)
956 track->SetMarkerColor(col);
958 SetMarkerColor(col, *i);
965 void TEveTrackList::SetMarkerSize(Size_t size)
967 for (List_i i=BeginChildren(); i!=EndChildren(); ++i)
969 TEveTrack* track = (TEveTrack*)(*i);
970 if (track->GetMarkerSize() == fMarkerSize)
971 track->SetMarkerSize(size);
973 SetMarkerSize(size, *i);
981 void TEveTrackList::SetMarkerSize(Size_t size, TEveElement* el)
984 for (List_i i=el->BeginChildren(); i!=el->EndChildren(); ++i)
986 track =
dynamic_cast<TEveTrack*
>(*i);
987 if (track && track->GetMarkerSize() == fMarkerSize)
988 track->SetMarkerSize(size);
990 SetMarkerSize(size, *i);
999 void TEveTrackList::SelectByPt(Double_t min_pt, Double_t max_pt)
1004 const Double_t minptsq = min_pt*min_pt;
1005 const Double_t maxptsq = max_pt*max_pt;
1007 for (List_i i=BeginChildren(); i!=EndChildren(); ++i)
1009 const Double_t ptsq = ((TEveTrack*)(*i))->fP.Perp2();
1010 Bool_t on = ptsq >= minptsq && ptsq <= maxptsq;
1011 (*i)->SetRnrState(on);
1013 SelectByPt(min_pt, max_pt, *i);
1020 void TEveTrackList::SelectByPt(Double_t min_pt, Double_t max_pt, TEveElement* el)
1022 const Double_t minptsq = min_pt*min_pt;
1023 const Double_t maxptsq = max_pt*max_pt;
1025 for (List_i i=el->BeginChildren(); i!=el->EndChildren(); ++i)
1027 TEveTrack* track =
dynamic_cast<TEveTrack*
>(*i);
1030 const Double_t ptsq = track->fP.Perp2();
1031 Bool_t on = ptsq >= minptsq && ptsq <= maxptsq;
1032 track->SetRnrState(on);
1034 SelectByPt(min_pt, max_pt, *i);
1044 void TEveTrackList::SelectByP(Double_t min_p, Double_t max_p)
1049 const Double_t minpsq = min_p*min_p;
1050 const Double_t maxpsq = max_p*max_p;
1052 for (List_i i=BeginChildren(); i!=EndChildren(); ++i)
1054 const Double_t psq = ((TEveTrack*)(*i))->fP.Mag2();
1055 Bool_t on = psq >= minpsq && psq <= maxpsq;
1056 (*i)->SetRnrState(psq >= minpsq && psq <= maxpsq);
1058 SelectByP(min_p, max_p, *i);
1065 void TEveTrackList::SelectByP(Double_t min_p, Double_t max_p, TEveElement* el)
1067 const Double_t minpsq = min_p*min_p;
1068 const Double_t maxpsq = max_p*max_p;
1070 for (List_i i=el->BeginChildren(); i!=el->EndChildren(); ++i)
1072 TEveTrack* track =
dynamic_cast<TEveTrack*
>(*i);
1075 const Double_t psq = ((TEveTrack*)(*i))->fP.Mag2();
1076 Bool_t on = psq >= minpsq && psq <= maxpsq;
1077 track->SetRnrState(on);
1079 SelectByP(min_p, max_p, *i);
1087 TEveTrack* TEveTrackList::FindTrackByLabel(Int_t label)
1089 for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
1091 if (((TEveTrack*)(*i))->GetLabel() == label)
1093 TGListTree *lt = gEve->GetLTEFrame()->GetListTree();
1094 TGListTreeItem *mlti = lt->GetSelected();
1095 if (mlti->GetUserData() !=
this)
1096 mlti = FindListTreeItem(lt);
1097 TGListTreeItem *tlti = (*i)->FindListTreeItem(lt, mlti);
1098 lt->HighlightItem(tlti);
1099 lt->SetSelected(tlti);
1100 gEve->EditElement(*i);
1101 return (TEveTrack*) *i;
1110 TEveTrack* TEveTrackList::FindTrackByIndex(Int_t index)
1112 for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
1114 if (((TEveTrack*)(*i))->GetIndex() == index)
1116 TGListTree *lt = gEve->GetLTEFrame()->GetListTree();
1117 TGListTreeItem *mlti = lt->GetSelected();
1118 if (mlti->GetUserData() !=
this)
1119 mlti = FindListTreeItem(lt);
1120 TGListTreeItem *tlti = (*i)->FindListTreeItem(lt, mlti);
1121 lt->HighlightItem(tlti);
1122 lt->SetSelected(tlti);
1123 gEve->EditElement(*i);
1124 return (TEveTrack*) *i;
1133 void TEveTrackList::CopyVizParams(
const TEveElement* el)
1135 const TEveTrackList* m =
dynamic_cast<const TEveTrackList*
>(el);
1138 TAttMarker::operator=(*m);
1139 TAttLine::operator=(*m);
1140 fRecurse = m->fRecurse;
1141 fRnrLine = m->fRnrLine;
1142 fRnrPoints = m->fRnrPoints;
1151 TEveElement::CopyVizParams(el);
1157 void TEveTrackList::WriteVizParams(std::ostream& out,
const TString& var)
1159 TEveElement::WriteVizParams(out, var);
1161 TString t =
" " + var +
"->";
1162 TAttMarker::SaveMarkerAttributes(out, var);
1163 TAttLine ::SaveLineAttributes (out, var);
1164 out << t <<
"SetRecurse(" << ToString(fRecurse) <<
");\n";
1165 out << t <<
"SetRnrLine(" << ToString(fRnrLine) <<
");\n";
1166 out << t <<
"SetRnrPoints(" << ToString(fRnrPoints) <<
");\n";
1179 TClass* TEveTrackList::ProjectedClass(
const TEveProjection*)
const
1181 return TEveTrackListProjected::Class();