73 fMaxAng(45), fMaxStep(20.f), fDelta(0.1),
75 fLam(-1), fR(-1), fPhiStep(-1), fSin(-1), fCos(-1),
77 fPtMag(-1), fPlMag(-1), fLStep(-1)
110 if (fCharge < 0) fE3.NegateXYZ();
114 using namespace TMath;
116 if (
a > kAMin && fPtMag*fPtMag > kPtMinSqr)
120 fR = Abs(fPtMag /
a);
121 fLam = fPlMag / fPtMag;
124 fPhiStep = fMaxAng * DegToRad();
127 Double_t ang = 2.0 * ACos(1.0f - fDelta/fR);
133 Double_t curr_step = fR * fPhiStep * Sqrt(1.0f + fLam*fLam);
134 if (curr_step > fMaxStep || enforce_max_step)
135 fPhiStep *= fMaxStep / curr_step;
137 fLStep = fR * fPhiStep * fLam;
138 fSin = Sin(fPhiStep);
139 fCos = Cos(fPhiStep);
179 TEveVectorD d = fE2*(fR*fSin) + fE3*(fR*(1-fCos)) + fE1*fLStep;
183 pOut = fPl + fE2*(fPtMag*fCos) + fE3*(fPtMag*fSin);
191 vOut += p * (fMaxStep / p.
Mag());
314 track =
dynamic_cast<TEveTrack*
>(i->first);
369 if (end_point < 0) end_point =
fPoints.size() - 1;
372 for (
Int_t i = start_point; i < end_point; ++i)
386 if ((
v-
fV).Mag() < kStepEps)
475 using namespace TMath;
524 vecRKIn[3] = p.
fX*nm;
525 vecRKIn[4] = p.
fY*nm;
526 vecRKIn[5] = p.
fZ*nm;
527 vecRKIn[6] = p.
Mag();
532 vOut.
fX = vecRKOut[0];
533 vOut.
fY = vecRKOut[1];
534 vOut.
fZ = vecRKOut[2];
537 pOut.
fX = vecRKOut[3]*pm;
538 pOut.
fY = vecRKOut[4]*pm;
539 pOut.
fZ = vecRKOut[5]*pm;
560 Step(currV, p, forwV, forwP);
563 if (forwV.
Perp2() > maxRsq)
568 Warning(
"HelixToBounds",
"In MaxR crossing expected t>=0 && t<=1: t=%f, r1=%f, r2=%f, MaxR=%f.",
569 t, currV.
R(), forwV.
R(),
fMaxR);
586 Warning(
"HelixToBounds",
"In MaxZ crossing expected t>=0 && t<=1: t=%f, z1=%f, z2=%f, MaxZ=%f.",
619 Int_t np = first_point;
625 Step(currV, p, forwV, forwP);
644 }
while (np <
fNMax);
647 if (np > first_point)
649 if ((
v - currV).Mag() > kStepEps)
651 Double_t step_frac = prod0 / (prod0 - prod1);
657 fH.
fMaxStep = step_frac * (forwV - currV).Mag();
659 Step(currV, p, forwV, forwP);
670 off *= 1.0f / currV.
fT;
697 Int_t np = first_point;
703 Step(currV, p, forwV, forwP);
713 if (pTPM.
Dot(forwC - forwV) < 0)
729 }
while (np <
fNMax);
736 if (np > first_point)
738 if ((
v - currV).Mag() > kStepEps)
748 fH.
fMaxStep = step_frac * (forwV - currV).Mag();
750 Step(currV, p, forwV, forwP);
761 off *= 1.0f / currV.fT;
785 for (
Int_t i = first_point; i < np; ++i)
843 tR = (-
b - sqrtD) / (2.0 *
a);
845 tR = (-
b + sqrtD) / (2.0 *
a);
847 tB = tR < tZ ? tR : tZ;
883 Step(pos4, mom, forwV , forwP);
888 Warning(
"HelixIntersectPlane",
"going away from the plane.");
893 delta = forwV - pos4;
894 itsect = pos4 + delta * ((point - pos4).
Dot(
n) / delta.
Dot(
n));
997 Bool_t force = (x < 0 || x > 1);
1009 for (
Int_t i = 0; i < size; ++i)
1025 track =
dynamic_cast<TEveTrack*
>(i->first);
1093 Warning(
"SetMinAng",
"This method was mis-named, use SetMaxAng() instead!");
1102 Warning(
"GetMinAng",
"This method was mis-named, use GetMaxAng() instead!");
1271 Double_t secxs[4],secys[4],seczs[4],hxp[3];
1272 Double_t g1, g2, g3, g4, g5, g6, ang2, dxt, dyt, dzt;
1274 Double_t f1, f2, f3, f4, rho, tet, hnorm, hp, rho1, sint, cost;
1285 const Int_t maxit = 500;
1286 const Int_t maxcut = 11;
1295 const Double_t kpisqua = 9.86960440109;
1296 const Int_t kix = 0;
1297 const Int_t kiy = 1;
1298 const Int_t kiz = 2;
1299 const Int_t kipx = 3;
1300 const Int_t kipy = 4;
1301 const Int_t kipz = 5;
1310 for(
Int_t j = 0; j < 7; j++)
1339 secxs[0] = (
b *
f[2] -
c *
f[1]) * ph2;
1340 secys[0] = (
c *
f[0] -
a *
f[2]) * ph2;
1341 seczs[0] = (
a *
f[1] -
b *
f[0]) * ph2;
1342 ang2 = (secxs[0]*secxs[0] + secys[0]*secys[0] + seczs[0]*seczs[0]);
1343 if (ang2 > kpisqua)
break;
1345 dxt = h2 *
a + h4 * secxs[0];
1346 dyt = h2 *
b + h4 * secys[0];
1347 dzt = h2 *
c + h4 * seczs[0];
1355 if (ncut++ > maxcut)
break;
1373 secxs[1] = (bt *
f[2] - ct *
f[1]) * ph2;
1374 secys[1] = (ct *
f[0] - at *
f[2]) * ph2;
1375 seczs[1] = (at *
f[1] - bt *
f[0]) * ph2;
1379 secxs[2] = (bt *
f[2] - ct *
f[1]) * ph2;
1380 secys[2] = (ct *
f[0] - at *
f[2]) * ph2;
1381 seczs[2] = (at *
f[1] - bt *
f[0]) * ph2;
1382 dxt =
h * (
a + secxs[2]);
1383 dyt =
h * (
b + secys[2]);
1384 dzt =
h * (
c + seczs[2]);
1388 at =
a + 2.*secxs[2];
1389 bt =
b + 2.*secys[2];
1390 ct =
c + 2.*seczs[2];
1394 if (ncut++ > maxcut)
break;
1408 z = z + (
c + (seczs[0] + seczs[1] + seczs[2]) * kthird) *
h;
1409 y =
y + (
b + (secys[0] + secys[1] + secys[2]) * kthird) *
h;
1410 x =
x + (
a + (secxs[0] + secxs[1] + secxs[2]) * kthird) *
h;
1412 secxs[3] = (bt*
f[2] - ct*
f[1])* ph2;
1413 secys[3] = (ct*
f[0] - at*
f[2])* ph2;
1414 seczs[3] = (at*
f[1] - bt*
f[0])* ph2;
1415 a =
a+(secxs[0]+secxs[3]+2. * (secxs[1]+secxs[2])) * kthird;
1416 b =
b+(secys[0]+secys[3]+2. * (secys[1]+secys[2])) * kthird;
1417 c =
c+(seczs[0]+seczs[3]+2. * (seczs[1]+seczs[2])) * kthird;
1419 est =
TMath::Abs(secxs[0]+secxs[3] - (secxs[1]+secxs[2]))
1420 +
TMath::Abs(secys[0]+secys[3] - (secys[1]+secys[2]))
1421 +
TMath::Abs(seczs[0]+seczs[3] - (seczs[1]+seczs[2]));
1424 if (ncut++ > maxcut)
break;
1431 if (iter++ > maxit)
break;
1444 if (step < 0.) rest = -rest;
1447 Float_t dot = (vout[3]*vect[3] + vout[4]*vect[4] + vout[5]*vect[5]);
1468 hxp[0] = f2*vect[kipz] - f3*vect[kipy];
1469 hxp[1] = f3*vect[kipx] -
f1*vect[kipz];
1470 hxp[2] =
f1*vect[kipy] - f2*vect[kipx];
1472 hp =
f1*vect[kipx] + f2*vect[kipy] + f3*vect[kipz];
1480 g3 = (tet-sint) * hp*rho1;
1485 vout[kix] = vect[kix] + g1*vect[kipx] + g2*hxp[0] + g3*
f1;
1486 vout[kiy] = vect[kiy] + g1*vect[kipy] + g2*hxp[1] + g3*f2;
1487 vout[kiz] = vect[kiz] + g1*vect[kipz] + g2*hxp[2] + g3*f3;
1489 vout[kipx] = vect[kipx] + g4*vect[kipx] + g5*hxp[0] + g6*
f1;
1490 vout[kipy] = vect[kipy] + g4*vect[kipy] + g5*hxp[1] + g6*f2;
1491 vout[kipz] = vect[kipz] + g4*vect[kipz] + g5*hxp[2] + g6*f3;
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
virtual void CheckReferenceCount(const TEveException &eh="TEveElement::CheckReferenceCount ")
Check external references to this and eventually auto-destruct the render-element.
virtual void ElementChanged(Bool_t update_scenes=kTRUE, Bool_t redraw=kFALSE)
Call this after an element has been changed so that the state can be propagated around the framework.
Exception class thrown by TEve classes and macros.
Implements constant magnetic field, given by a vector fB.
Implements constant magnetic filed that switches on given axial radius fR2 from vector fBIn to fBOut.
Abstract base-class for interfacing to magnetic field needed by the TEveTrackPropagator.
virtual Bool_t IsConst() const
virtual void PrintField(Double_t x, Double_t y, Double_t z) const
virtual TEveVectorD GetFieldD(Double_t x, Double_t y, Double_t z) const
virtual Double_t GetMaxFieldMagD() const
TEvePointSet is a render-element holding a collection of 3D points with optional per-point TRef and a...
void Reset(Int_t n_points=0, Int_t n_int_ids=0)
Drop all data and set-up the data structures to recive new data.
Base-class for reference-counted objects with reverse references to TEveElement objects.
RefMap_t::iterator RefMap_i
Holding structure for a number of track rendering parameters.
Double_t GetMaxAng() const
virtual void GoToBounds(TEveVectorD &p)
Propagate particle to bounds.
void SetFitReferences(Bool_t x)
Set track-reference fitting and rebuild tracks.
void SetRnrDecay(Bool_t x)
Set decay rendering and rebuild tracks.
void SetRnrDaughters(Bool_t x)
Set daughter rendering and rebuild tracks.
void SetFitLineSegments(Bool_t x)
Set line segment fitting and rebuild tracks.
void ResetTrack()
Reset cache holding particle trajectory.
void SetMagFieldObj(TEveMagField *field, Bool_t own_field=kTRUE)
Set constant magnetic field and rebuild tracks.
Bool_t HelixIntersectPlane(const TEveVectorD &p, const TEveVectorD &point, const TEveVectorD &normal, TEveVectorD &itsect)
Intersect helix with a plane.
void StepRungeKutta(Double_t step, Double_t *vect, Double_t *vout)
Wrapper to step with method RungeKutta.
void SetDelta(Double_t x)
Set maximum error and rebuild tracks.
Bool_t IntersectPlane(const TEveVectorD &p, const TEveVectorD &point, const TEveVectorD &normal, TEveVectorD &itsect)
Find intersection of currently propagated track with a plane.
void DistributeOffset(const TEveVectorD &off, Int_t first_point, Int_t np, TEveVectorD &p)
Distribute offset between first and last point index and rotate momentum.
static Bool_t IsOutsideBounds(const TEveVectorD &point, Double_t maxRsqr, Double_t maxZ)
void ClosestPointFromVertexToLineSegment(const TEveVectorD &v, const TEveVectorD &s, const TEveVectorD &r, Double_t rMagInv, TEveVectorD &c)
Get closest point from given vertex v to line segment defined with s and r.
void Step(const TEveVector4D &v, const TEveVectorD &p, TEveVector4D &vOut, TEveVectorD &pOut)
Wrapper to step helix.
void SetMaxR(Double_t x)
Set maximum radius and rebuild tracks.
Double_t GetTrackLength(Int_t start_point=0, Int_t end_point=-1) const
Calculate track length from start_point to end_point.
void SetFitDaughters(Bool_t x)
Set daughter creation point fitting and rebuild tracks.
TEveTrackPropagator(const TEveTrackPropagator &)
virtual Bool_t GoToVertex(TEveVectorD &v, TEveVectorD &p)
Propagate particle with momentum p to vertex v.
static Double_t fgEditorMaxZ
Bool_t PointOverVertex(const TEveVector4D &v0, const TEveVector4D &v, Double_t *p=0)
void LineToBounds(TEveVectorD &p)
Propagate neutral particle with momentum p to bounds.
Int_t GetCurrentPoint() const
Get index of current point on track.
virtual ~TEveTrackPropagator()
Destructor.
static Double_t fgDefMagField
void Update(const TEveVector4D &v, const TEveVectorD &p, Bool_t full_update=kFALSE, Bool_t enforce_max_step=kFALSE)
Update helix / B-field projection state.
void FillPointSet(TEvePointSet *ps) const
Reset ps and populate it with points in propagation cache.
virtual void OnZeroRefCount()
Virtual from TEveRefBackPtr - track reference count has reached zero.
void SetRnrFV(Bool_t x)
Set first-vertex rendering and rebuild tracks.
void SetProjTrackBreaking(UChar_t x)
Set projection break-point mode and rebuild tracks.
Bool_t ClosestPointBetweenLines(const TEveVectorD &, const TEveVectorD &, const TEveVectorD &, const TEveVectorD &, TEveVectorD &out)
Get closest point on line defined with vector p0 and u.
void SetMinAng(Double_t x)
Set maximum step angle and rebuild tracks.
void LoopToBounds(TEveVectorD &p)
Propagate charged particle with momentum p to bounds.
static TEveTrackPropagator fgDefault
Bool_t LineIntersectPlane(const TEveVectorD &p, const TEveVectorD &point, const TEveVectorD &normal, TEveVectorD &itsect)
Intersect line with a plane.
TEveMagField * fMagFieldObj
void SetRnrCluster2Ds(Bool_t x)
Set rendering of 2D-clusters and rebuild tracks.
std::vector< TEveVector4D > fPoints
virtual Bool_t GoToLineSegment(const TEveVectorD &s, const TEveVectorD &r, TEveVectorD &p)
Propagate particle with momentum p to line with start point s and vector r to the second point.
void SetRnrReferences(Bool_t x)
Set track-reference rendering and rebuild tracks.
UChar_t fProjTrackBreaking
static Double_t fgEditorMaxR
void SetMaxAng(Double_t x)
Set maximum step angle and rebuild tracks.
Bool_t LineToVertex(TEveVectorD &v)
Propagate neutral particle to vertex v.
void InitTrack(const TEveVectorD &v, Int_t charge)
Initialize internal data-members for given particle parameters.
virtual void ElementChanged(Bool_t update_scenes=kTRUE, Bool_t redraw=kFALSE)
Element-change notification.
static const Double_t fgkB2C
void SetMaxStep(Double_t x)
Set maximum step-size and rebuild tracks.
void SetFitCluster2Ds(Bool_t x)
Set 2D-cluster fitting and rebuild tracks.
std::vector< TEveVector4D > fLastPoints
Bool_t LoopToLineSegment(const TEveVectorD &s, const TEveVectorD &r, TEveVectorD &p)
Propagate charged particle with momentum p to line segment with point s and vector r to the second po...
Double_t GetMinAng() const
Get maximum step angle.
void PrintMagField(Double_t x, Double_t y, Double_t z) const
void RebuildTracks()
Rebuild all tracks using this render-style.
void SetRnrPTBMarkers(Bool_t x)
Set projection break-point rendering and rebuild tracks.
virtual void CheckReferenceCount(const TEveException &eh="TEveElement::CheckReferenceCount ")
Check reference count - virtual from TEveElement.
Bool_t LoopToVertex(TEveVectorD &v, TEveVectorD &p)
Propagate charged particle with momentum p to vertex v.
void SetMaxZ(Double_t x)
Set maximum z and rebuild tracks.
void SetFitDecay(Bool_t x)
Set decay fitting and rebuild tracks.
void SetMaxOrbs(Double_t x)
Set maximum number of orbits and rebuild tracks.
void SetMagField(Double_t bX, Double_t bY, Double_t bZ)
Set constant magnetic field and rebuild tracks.
Visual representation of a track.
virtual void MakeTrack(Bool_t recurse=kTRUE)
Calculate track representation based on track data and current settings of the propagator.
TEveTrans is a 4x4 transformation matrix for homogeneous coordinates stored internally in a column-ma...
void SetupFromToVec(const TEveVector &from, const TEveVector &to)
A function for creating a rotation matrix that rotates a vector called "from" into another vector cal...
Minimal, templated four-vector.
TT Normalize(TT length=1)
Normalize the vector to length if current length is non-zero.
TT Dot(const TEveVectorT &a) const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual Int_t SetNextPoint(Double_t x, Double_t y, Double_t z)
Set point following LastPoint to x, y, z.
Short_t Range(Short_t lb, Short_t ub, Short_t x)
Double_t Sqrt(Double_t x)
Short_t Min(Short_t a, Short_t b)
T * Cross(const T v1[3], const T v2[3], T out[3])
Calculate the Cross Product of two vectors: out = [v1 x v2].
constexpr Double_t TwoPi()
void UpdateRK(const TEveVectorD &p, const TEveVectorD &b)
Update helix for stepper RungeKutta.
void UpdateHelix(const TEveVectorD &p, const TEveVectorD &b, Bool_t full_update, Bool_t enforce_max_step)
Update helix parameters.
Helix_t()
Default constructor.
void Step(const TEveVector4D &v, const TEveVectorD &p, TEveVector4D &vOut, TEveVectorD &pOut)
Step helix for given momentum p from vertex v.
void UpdateCommon(const TEveVectorD &p, const TEveVectorD &b)
Common update code for helix and RK propagation.
static uint64_t sum(uint64_t i)