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>();