34 using namespace ROOT::Experimental;
35 namespace REX = ROOT::Experimental;
49 REveTrack::REveTrack() :
72 REveTrack::REveTrack(TParticle *t, Int_t label, REveTrackPropagator *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 SetMainColorPtr(&fLineColor);
93 TParticlePDG *pdgp = t->GetPDG();
95 fPdg = pdgp->PdgCode();
96 fCharge = (Int_t) TMath::Nint(pdgp->Charge()/3);
99 SetName(t->GetName());
104 REveTrack::REveTrack(REveMCTrack* t, REveTrackPropagator* 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 REveTrack::REveTrack(REveRecTrackD* t, REveTrackPropagator* prop) :
157 fMainColorPtr = &fLineColor;
165 REveTrack::REveTrack(REveRecTrack* t, REveTrackPropagator* prop) :
184 fMainColorPtr = &fLineColor;
193 REveTrack::REveTrack(
const REveTrack& t) :
205 fLockPoints(t.fLockPoints),
207 fLastPMIdx(t.fLastPMIdx),
214 SetPropagator (t.fPropagator);
222 REveTrack::~REveTrack()
224 SetPropagator(
nullptr);
230 void REveTrack::ComputeBBox()
232 if (fSize > 0 || ! fPathMarks.empty())
236 Float_t *p = & fPoints[0].fX;
237 for (Int_t i = 0; i < n; ++i, p += 3)
241 for (
const auto &pm: fPathMarks)
243 BBoxCheckPoint(pm.fV.fX, pm.fV.fY, pm.fV.fZ);
255 void REveTrack::SetStdTitle()
257 TString idx(fIndex == kMinInt ?
"<undef>" : Form(
"%d", fIndex));
258 TString lbl(fLabel == kMinInt ?
"<undef>" : Form(
"%d", fLabel));
259 SetTitle(Form(
"Index=%s, Label=%s\nChg=%d, Pdg=%d\n"
260 "pT=%.3f, pZ=%.3f\nV=(%.3f, %.3f, %.3f)",
261 idx.Data(), lbl.Data(), fCharge, fPdg,
262 fP.Perp(), fP.fZ, fV.fX, fV.fY, fV.fZ));
271 void REveTrack::SetTrackParams(
const REveTrack& t)
282 SetPropagator(t.fPropagator);
288 void REveTrack::SetPathMarks(
const REveTrack& t)
290 std::copy(t.RefPathMarks().begin(), t.RefPathMarks().end(),
291 std::back_insert_iterator<vPathMark_t>(fPathMarks));
298 void REveTrack::SetPropagator(REveTrackPropagator *prop)
300 if (fPropagator == prop)
return;
301 if (fPropagator) fPropagator->DecRefCount(
this);
303 if (fPropagator) fPropagator->IncRefCount(
this);
309 void REveTrack::SetAttLineAttMarker(REveTrackList* tl)
311 SetRnrLine(tl->GetRnrLine());
312 SetLineColor(tl->GetLineColor());
313 SetLineStyle(tl->GetLineStyle());
314 SetLineWidth(tl->GetLineWidth());
316 SetRnrPoints(tl->GetRnrPoints());
317 SetMarkerColor(tl->GetMarkerColor());
318 SetMarkerStyle(tl->GetMarkerStyle());
319 SetMarkerSize(tl->GetMarkerSize());
327 void REveTrack::MakeTrack(Bool_t recurse)
334 REveTrackPropagator& rTP((fPropagator !=
nullptr) ? *fPropagator : REveTrackPropagator::fgDefault);
336 const Double_t maxRsq = rTP.GetMaxR() * rTP.GetMaxR();
337 const Double_t maxZ = rTP.GetMaxZ();
339 if ( ! REveTrackPropagator::IsOutsideBounds(fV, maxRsq, maxZ))
341 REveVectorD currP = fP;
342 Bool_t decay = kFALSE;
343 rTP.InitTrack(fV, fCharge);
344 for (
auto pm = fPathMarks.begin(); pm != fPathMarks.end(); ++pm, ++fLastPMIdx)
346 Int_t start_point = rTP.GetCurrentPoint();
348 if (rTP.GetFitReferences() && pm->fType == REvePathMarkD::kReference)
350 if (REveTrackPropagator::IsOutsideBounds(pm->fV, maxRsq, maxZ))
352 if (rTP.GoToVertex(pm->fV, currP))
354 currP.fX = pm->fP.fX; currP.fY = pm->fP.fY; currP.fZ = pm->fP.fZ;
361 else if (rTP.GetFitDaughters() && pm->fType == REvePathMarkD::kDaughter)
363 if (REveTrackPropagator::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;
370 Double_t dp = fDpDs * rTP.GetTrackLength(start_point);
371 Double_t p = currP.Mag();
372 if (p > dp) currP *= 1.0 - dp / p;
380 else if (rTP.GetFitDecay() && pm->fType == REvePathMarkD::kDecay)
382 if (REveTrackPropagator::IsOutsideBounds(pm->fV, maxRsq, maxZ))
384 rTP.GoToVertex(pm->fV, currP);
389 else if (rTP.GetFitCluster2Ds() && pm->fType == REvePathMarkD::kCluster2D)
392 if (rTP.IntersectPlane(currP, pm->fV, pm->fP, itsect))
394 REveVectorD delta = itsect - pm->fV;
395 REveVectorD vtopass = pm->fV + pm->fE*(pm->fE.Dot(delta));
396 if (REveTrackPropagator::IsOutsideBounds(vtopass, maxRsq, maxZ))
398 if ( ! rTP.GoToVertex(vtopass, currP))
403 Double_t dp = fDpDs * rTP.GetTrackLength(start_point);
404 Double_t p = currP.Mag();
405 if (p > dp) currP *= 1.0 - dp / p;
410 Warning(
"REveTrack::MakeTrack",
"Failed to intersect plane for Cluster2D. Ignoring path-mark.");
413 else if (rTP.GetFitLineSegments() && pm->fType == REvePathMarkD::kLineSegment)
415 if (REveTrackPropagator::IsOutsideBounds(pm->fV, maxRsq, maxZ))
418 if (rTP.GoToLineSegment(pm->fV, pm->fE, currP))
422 Double_t dp = fDpDs * rTP.GetTrackLength(start_point);
423 Double_t p = currP.Mag();
424 if (p > dp) currP *= 1.0 - dp / p;
434 if (REveTrackPropagator::IsOutsideBounds(pm->fV, maxRsq, maxZ))
442 rTP.GoToBounds(currP);
446 rTP.FillPointSet(
this);
453 for (
auto &c: fChildren) {
454 REveTrack* t =
dynamic_cast<REveTrack *
>(c);
455 if (t) t->MakeTrack(recurse);
463 void REveTrack::CopyVizParams(
const REveElement* el)
471 REveLine::CopyVizParams(el);
477 void REveTrack::WriteVizParams(std::ostream& out,
const TString& var)
479 REveLine::WriteVizParams(out, var);
487 TClass* REveTrack::ProjectedClass(
const REveProjection*)
const
489 return TClass::GetClass<REveTrackProjected>();
494 struct Cmp_pathmark_t
496 bool operator()(REvePathMarkD
const & a, REvePathMarkD
const & b)
497 {
return a.fTime < b.fTime; }
504 void REveTrack::SortPathMarksByTime()
506 std::sort(fPathMarks.begin(), fPathMarks.end(), Cmp_pathmark_t());
512 void REveTrack::PrintPathMarks()
514 static const REveException eh(
"REveTrack::PrintPathMarks ");
516 printf(
"REveTrack '%s', number of path marks %d, label %d\n",
517 GetCName(), (Int_t)fPathMarks.size(), fLabel);
519 for (
auto &pm: fPathMarks)
521 printf(
" %-9s p: %8f %8f %8f Vertex: %8e %8e %8e %g Extra:%8f %8f %8f\n",
523 pm.fP.fX, pm.fP.fY, pm.fP.fZ,
524 pm.fV.fX, pm.fV.fY, pm.fV.fZ,
525 pm.fE.fX, pm.fE.fY, pm.fE.fZ,
533 Int_t REveTrack::WriteCoreJson(nlohmann::json &j, Int_t rnr_offset)
536 return REveLine::WriteCoreJson(j, rnr_offset);
542 void REveTrack::BuildRenderData()
545 REveLine::BuildRenderData();
551 void REveTrack::SecSelected(REveTrack* )
570 REveTrackList::REveTrackList(REveTrackPropagator* prop) :
572 TAttMarker(1, 20, 1),
580 fMinPt (0), fMaxPt (0), fLimPt (0),
581 fMinP (0), fMaxP (0), fLimP (0)
584 fChildClass = TClass::GetClass<REveTrack>();
586 fMainColorPtr = &fLineColor;
588 if (!prop) prop =
new REveTrackPropagator;
596 REveTrackList::REveTrackList(
const std::string& name, REveTrackPropagator* prop) :
598 TAttMarker(1, 20, 1),
606 fMinPt (0), fMaxPt (0), fLimPt (0),
607 fMinP (0), fMaxP (0), fLimP (0)
609 fChildClass = TClass::GetClass<REveTrack>();
611 fMainColorPtr = &fLineColor;
613 if (!prop) prop =
new REveTrackPropagator;
620 REveTrackList::~REveTrackList()
630 void REveTrackList::SetPropagator(REveTrackPropagator* prop)
632 if (fPropagator == prop)
return;
633 if (fPropagator) fPropagator->DecRefCount();
635 if (fPropagator) fPropagator->IncRefCount();
642 void REveTrackList::MakeTracks(Bool_t recurse)
646 for (
auto &c: fChildren) {
647 REveTrack* track =
dynamic_cast<REveTrack*
>(c);
649 track->MakeTrack(recurse);
651 fLimPt = TMath::Max(fLimPt, track->fP.Perp());
652 fLimP = TMath::Max(fLimP, track->fP.Mag());
655 FindMomentumLimits(c, recurse);
658 fLimPt = RoundMomentumLimit(fLimPt);
659 fLimP = RoundMomentumLimit(fLimP);
661 SanitizeMinMaxCuts();
668 void REveTrackList::FindMomentumLimits(Bool_t recurse)
674 for (
auto &c: RefChildren())
676 REveTrack* track =
dynamic_cast<REveTrack *
>(c);
679 fLimPt = TMath::Max(fLimPt, track->fP.Perp());
680 fLimP = TMath::Max(fLimP, track->fP.Mag());
683 FindMomentumLimits(c, recurse);
686 fLimPt = RoundMomentumLimit(fLimPt);
687 fLimP = RoundMomentumLimit(fLimP);
690 SanitizeMinMaxCuts();
697 void REveTrackList::FindMomentumLimits(REveElement *el, Bool_t recurse)
699 for (
auto &c: el->RefChildren()) {
700 auto track =
dynamic_cast<REveTrack *
>(c);
702 fLimPt = TMath::Max(fLimPt, track->fP.Perp());
703 fLimP = TMath::Max(fLimP, track->fP.Mag());
706 FindMomentumLimits(c, recurse);
713 Double_t REveTrackList::RoundMomentumLimit(Double_t x)
715 using namespace TMath;
717 if (x < 1e-3)
return 1e-3;
719 Double_t fac = Power(10, 1 - Floor(Log10(x)));
720 return Ceil(fac*x) / fac;
726 void REveTrackList::SanitizeMinMaxCuts()
728 fMinPt = TMath::Min(fMinPt, fLimPt);
729 fMaxPt = (fMaxPt == 0) ? fLimPt : TMath::Min(fMaxPt, fLimPt);
730 fMinP = TMath::Min(fMinP, fLimP);
731 fMaxP = (fMaxP == 0) ? fLimP : TMath::Min(fMaxP, fLimP);
737 void REveTrackList::SetRnrLine(Bool_t rnr)
739 for (
auto &c: RefChildren()) {
740 auto track = (REveTrack *)(c);
741 if (track->GetRnrLine() == fRnrLine)
742 track->SetRnrLine(rnr);
752 void REveTrackList::SetRnrLine(Bool_t rnr, REveElement* el)
754 for (
auto &c: el->RefChildren()) {
755 auto track =
dynamic_cast<REveTrack *
>(c);
756 if (track && (track->GetRnrLine() == fRnrLine))
757 track->SetRnrLine(rnr);
766 void REveTrackList::SetRnrPoints(Bool_t rnr)
768 for (
auto &c: RefChildren()) {
769 auto track = (REveTrack *)(c);
770 if (track->GetRnrPoints() == fRnrPoints)
771 track->SetRnrPoints(rnr);
773 SetRnrPoints(rnr, c);
781 void REveTrackList::SetRnrPoints(Bool_t rnr, REveElement* el)
783 for (
auto &c: el->RefChildren()) {
784 auto track =
dynamic_cast<REveTrack *
>(c);
786 if (track->GetRnrPoints() == fRnrPoints)
787 track->SetRnrPoints(rnr);
789 SetRnrPoints(rnr, c);
796 void REveTrackList::SetMainColor(Color_t col)
798 for (
auto &c: RefChildren()) {
799 auto track = (REveTrack *)(c);
800 if (track->GetLineColor() == fLineColor)
801 track->SetLineColor(col);
803 SetLineColor(col, c);
805 REveElement::SetMainColor(col);
811 void REveTrackList::SetLineColor(Color_t col, REveElement* el)
813 for (
auto &c: el->RefChildren()) {
814 auto track =
dynamic_cast<REveTrack *
>(c);
815 if (track && track->GetLineColor() == fLineColor)
816 track->SetLineColor(col);
818 SetLineColor(col, c);
825 void REveTrackList::SetLineWidth(Width_t width)
827 for (
auto &c: RefChildren()) {
828 auto track = (REveTrack *)(c);
829 if (track->GetLineWidth() == fLineWidth)
830 track->SetLineWidth(width);
832 SetLineWidth(width, c);
840 void REveTrackList::SetLineWidth(Width_t width, REveElement* el)
842 for (
auto &c: el->RefChildren()) {
843 auto track =
dynamic_cast<REveTrack *
>(c);
844 if (track && track->GetLineWidth() == fLineWidth)
845 track->SetLineWidth(width);
847 SetLineWidth(width, c);
854 void REveTrackList::SetLineStyle(Style_t style)
856 for (
auto &c: RefChildren()) {
857 auto track = (REveTrack *)(c);
858 if (track->GetLineStyle() == fLineStyle)
859 track->SetLineStyle(style);
861 SetLineStyle(style, c);
869 void REveTrackList::SetLineStyle(Style_t style, REveElement* el)
871 for (
auto &c: el->RefChildren()) {
872 auto track =
dynamic_cast<REveTrack *
>(c);
873 if (track && track->GetLineStyle() == fLineStyle)
874 track->SetLineStyle(style);
876 SetLineStyle(style, c);
883 void REveTrackList::SetMarkerStyle(Style_t style)
885 for (
auto &c: RefChildren()) {
886 auto track = (REveTrack *)(c);
887 if (track->GetMarkerStyle() == fMarkerStyle)
888 track->SetMarkerStyle(style);
890 SetMarkerStyle(style, c);
892 fMarkerStyle = style;
898 void REveTrackList::SetMarkerStyle(Style_t style, REveElement* el)
900 for (
auto &c: el->RefChildren()) {
901 auto track =
dynamic_cast<REveTrack *
>(c);
902 if (track && track->GetMarkerStyle() == fMarkerStyle)
903 track->SetMarkerStyle(style);
905 SetMarkerStyle(style, c);
912 void REveTrackList::SetMarkerColor(Color_t col)
914 for (
auto &c: RefChildren()) {
915 auto track = (REveTrack *)(c);
916 if (track->GetMarkerColor() == fMarkerColor)
917 track->SetMarkerColor(col);
919 SetMarkerColor(col, c);
927 void REveTrackList::SetMarkerColor(Color_t col, REveElement* el)
929 for (
auto &c: el->RefChildren()) {
930 auto track =
dynamic_cast<REveTrack *
>(c);
931 if (track && track->GetMarkerColor() == fMarkerColor)
932 track->SetMarkerColor(col);
934 SetMarkerColor(col, c);
941 void REveTrackList::SetMarkerSize(Size_t size)
943 for (
auto &c: RefChildren()) {
944 auto track = (REveTrack *)(c);
945 if (track->GetMarkerSize() == fMarkerSize)
946 track->SetMarkerSize(size);
948 SetMarkerSize(size, c);
956 void REveTrackList::SetMarkerSize(Size_t size, REveElement* el)
958 for (
auto &c: el->RefChildren()) {
959 auto track =
dynamic_cast<REveTrack*
>(c);
960 if (track && track->GetMarkerSize() == fMarkerSize)
961 track->SetMarkerSize(size);
963 SetMarkerSize(size, c);
972 void REveTrackList::SelectByPt(Double_t min_pt, Double_t max_pt)
977 const Double_t minptsq = min_pt*min_pt;
978 const Double_t maxptsq = max_pt*max_pt;
980 for (
auto &c: RefChildren()) {
981 const Double_t ptsq = ((REveTrack*)c)->fP.Perp2();
982 Bool_t on = ptsq >= minptsq && ptsq <= maxptsq;
985 SelectByPt(min_pt, max_pt, c);
992 void REveTrackList::SelectByPt(Double_t min_pt, Double_t max_pt, REveElement *el)
994 const Double_t minptsq = min_pt*min_pt;
995 const Double_t maxptsq = max_pt*max_pt;
997 for (
auto &c: el->RefChildren()) {
998 auto track = (REveTrack *)(c);
1000 const Double_t ptsq = track->fP.Perp2();
1001 Bool_t on = ptsq >= minptsq && ptsq <= maxptsq;
1002 track->SetRnrState(on);
1004 SelectByPt(min_pt, max_pt, c);
1014 void REveTrackList::SelectByP(Double_t min_p, Double_t max_p)
1019 const Double_t minpsq = min_p*min_p;
1020 const Double_t maxpsq = max_p*max_p;
1022 for (
auto &c: RefChildren()) {
1023 const Double_t psq = ((REveTrack*)c)->fP.Mag2();
1024 Bool_t on = psq >= minpsq && psq <= maxpsq;
1025 c->SetRnrState(psq >= minpsq && psq <= maxpsq);
1027 SelectByP(min_p, max_p, c);
1034 void REveTrackList::SelectByP(Double_t min_p, Double_t max_p, REveElement* el)
1036 const Double_t minpsq = min_p*min_p;
1037 const Double_t maxpsq = max_p*max_p;
1039 for (
auto &c: el->RefChildren()) {
1040 auto track = (REveTrack *)(c);
1042 const Double_t psq = ((REveTrack*)c)->fP.Mag2();
1043 Bool_t on = psq >= minpsq && psq <= maxpsq;
1044 track->SetRnrState(on);
1046 SelectByP(min_p, max_p, c);
1054 REveTrack *REveTrackList::FindTrackByLabel(Int_t label)
1056 for (
auto &c: fChildren) {
1057 if (((REveTrack*)c)->GetLabel() == label)
1067 return (REveTrack*) c;
1076 REveTrack* REveTrackList::FindTrackByIndex(Int_t index)
1078 for (
auto &c: fChildren) {
1079 if (((REveTrack *)c)->GetIndex() == index) {
1088 return (REveTrack *) c;
1097 void REveTrackList::CopyVizParams(
const REveElement* el)
1099 const REveTrackList* m =
dynamic_cast<const REveTrackList*
>(el);
1102 TAttMarker::operator=(*m);
1103 TAttLine::operator=(*m);
1104 fRecurse = m->fRecurse;
1105 fRnrLine = m->fRnrLine;
1106 fRnrPoints = m->fRnrPoints;
1115 REveElement::CopyVizParams(el);
1121 void REveTrackList::WriteVizParams(std::ostream& out,
const TString& var)
1123 REveElement::WriteVizParams(out, var);
1125 TString t =
" " + var +
"->";
1126 TAttMarker::SaveMarkerAttributes(out, var);
1127 TAttLine ::SaveLineAttributes (out, var);
1128 out << t <<
"SetRecurse(" << ToString(fRecurse) <<
");\n";
1129 out << t <<
"SetRnrLine(" << ToString(fRnrLine) <<
");\n";
1130 out << t <<
"SetRnrPoints(" << ToString(fRnrPoints) <<
");\n";
1143 TClass* REveTrackList::ProjectedClass(
const REveProjection*)
const
1145 return TClass::GetClass<REveTrackListProjected>();