64 fMaxAng(45), fMaxStep(20.f), fDelta(0.1),
66 fLam(-1), fR(-1), fPhiStep(-1), fSin(-1), fCos(-1),
68 fPtMag(-1), fPlMag(-1), fLStep(-1)
101 if (fCharge < 0) fE3.NegateXYZ();
105 using namespace TMath;
107 if (
a > kAMin && fPtMag*fPtMag > kPtMinSqr)
111 fR =
Abs(fPtMag /
a);
112 fLam = fPlMag / fPtMag;
124 Double_t curr_step = fR * fPhiStep *
Sqrt(1.0f + fLam*fLam);
125 if (curr_step > fMaxStep || enforce_max_step)
126 fPhiStep *= fMaxStep / curr_step;
128 fLStep = fR * fPhiStep * fLam;
129 fSin =
Sin(fPhiStep);
130 fCos =
Cos(fPhiStep);
170 TEveVectorD d = fE2*(fR*fSin) + fE3*(fR*(1-fCos)) + fE1*fLStep;
174 pOut = fPl + fE2*(fPtMag*fCos) + fE3*(fPtMag*fSin);
182 vOut += p * (fMaxStep / p.
Mag());
305 track =
dynamic_cast<TEveTrack*
>(i->first);
360 if (end_point < 0) end_point =
fPoints.size() - 1;
363 for (
Int_t i = start_point; i < end_point; ++i)
377 if ((
v-
fV).
Mag() < kStepEps)
466 using namespace TMath;
515 vecRKIn[3] = p.
fX*
nm;
516 vecRKIn[4] = p.
fY*
nm;
517 vecRKIn[5] = p.
fZ*
nm;
518 vecRKIn[6] = p.
Mag();
523 vOut.
fX = vecRKOut[0];
524 vOut.
fY = vecRKOut[1];
525 vOut.
fZ = vecRKOut[2];
528 pOut.
fX = vecRKOut[3]*pm;
529 pOut.
fY = vecRKOut[4]*pm;
530 pOut.
fZ = vecRKOut[5]*pm;
551 Step(currV, p, forwV, forwP);
554 if (forwV.
Perp2() > maxRsq)
559 Warning(
"HelixToBounds",
"In MaxR crossing expected t>=0 && t<=1: t=%f, r1=%f, r2=%f, MaxR=%f.",
560 t, currV.
R(), forwV.
R(),
fMaxR);
577 Warning(
"HelixToBounds",
"In MaxZ crossing expected t>=0 && t<=1: t=%f, z1=%f, z2=%f, MaxZ=%f.",
610 Int_t np = first_point;
616 Step(currV, p, forwV, forwP);
635 }
while (np <
fNMax);
638 if (np > first_point)
640 if ((
v - currV).
Mag() > kStepEps)
642 Double_t step_frac = prod0 / (prod0 - prod1);
650 Step(currV, p, forwV, forwP);
661 off *= 1.0f / currV.
fT;
688 Int_t np = first_point;
694 Step(currV, p, forwV, forwP);
704 if (pTPM.
Dot(forwC - forwV) < 0)
720 }
while (np <
fNMax);
727 if (np > first_point)
729 if ((
v - currV).
Mag() > kStepEps)
741 Step(currV, p, forwV, forwP);
752 off *= 1.0f / currV.fT;
776 for (
Int_t i = first_point; i < np; ++i)
786 tt.SetupFromToVec(lpd0, lpd1);
834 tR = (-
b - sqrtD) / (2.0 *
a);
836 tR = (-
b + sqrtD) / (2.0 *
a);
838 tB = tR < tZ ? tR : tZ;
874 Step(pos4, mom, forwV , forwP);
879 Warning(
"HelixIntersectPlane",
"going away from the plane.");
885 itsect = pos + delta * (
d / (
d - new_d));
987 Bool_t force = (x < 0 || x > 1);
999 for (
Int_t i = 0; i < size; ++i)
1002 ps->SetNextPoint(
v.fX,
v.fY,
v.fZ);
1015 track =
dynamic_cast<TEveTrack*
>(i->first);
1083 Warning(
"SetMinAng",
"This method was mis-named, use SetMaxAng() instead!");
1092 Warning(
"GetMinAng",
"This method was mis-named, use GetMaxAng() instead!");
1261 Double_t secxs[4],secys[4],seczs[4],hxp[3];
1262 Double_t g1, g2, g3, g4, g5, g6, ang2, dxt, dyt, dzt;
1264 Double_t f1, f2, f3, f4, rho, tet, hnorm, hp, rho1, sint, cost;
1275 const Int_t maxit = 500;
1276 const Int_t maxcut = 11;
1285 const Double_t kpisqua = 9.86960440109;
1286 const Int_t kix = 0;
1287 const Int_t kiy = 1;
1288 const Int_t kiz = 2;
1289 const Int_t kipx = 3;
1290 const Int_t kipy = 4;
1291 const Int_t kipz = 5;
1300 for(
Int_t j = 0; j < 7; j++)
1329 secxs[0] = (
b *
f[2] -
c *
f[1]) * ph2;
1330 secys[0] = (
c *
f[0] -
a *
f[2]) * ph2;
1331 seczs[0] = (
a *
f[1] -
b *
f[0]) * ph2;
1332 ang2 = (secxs[0]*secxs[0] + secys[0]*secys[0] + seczs[0]*seczs[0]);
1333 if (ang2 > kpisqua)
break;
1335 dxt = h2 *
a + h4 * secxs[0];
1336 dyt = h2 *
b + h4 * secys[0];
1337 dzt = h2 *
c + h4 * seczs[0];
1345 if (ncut++ > maxcut)
break;
1363 secxs[1] = (bt *
f[2] - ct *
f[1]) * ph2;
1364 secys[1] = (ct *
f[0] - at *
f[2]) * ph2;
1365 seczs[1] = (at *
f[1] - bt *
f[0]) * ph2;
1369 secxs[2] = (bt *
f[2] - ct *
f[1]) * ph2;
1370 secys[2] = (ct *
f[0] - at *
f[2]) * ph2;
1371 seczs[2] = (at *
f[1] - bt *
f[0]) * ph2;
1372 dxt =
h * (
a + secxs[2]);
1373 dyt =
h * (
b + secys[2]);
1374 dzt =
h * (
c + seczs[2]);
1378 at =
a + 2.*secxs[2];
1379 bt =
b + 2.*secys[2];
1380 ct =
c + 2.*seczs[2];
1384 if (ncut++ > maxcut)
break;
1398 z = z + (
c + (seczs[0] + seczs[1] + seczs[2]) * kthird) *
h;
1399 y =
y + (
b + (secys[0] + secys[1] + secys[2]) * kthird) *
h;
1400 x =
x + (
a + (secxs[0] + secxs[1] + secxs[2]) * kthird) *
h;
1402 secxs[3] = (bt*
f[2] - ct*
f[1])* ph2;
1403 secys[3] = (ct*
f[0] - at*
f[2])* ph2;
1404 seczs[3] = (at*
f[1] - bt*
f[0])* ph2;
1405 a =
a+(secxs[0]+secxs[3]+2. * (secxs[1]+secxs[2])) * kthird;
1406 b =
b+(secys[0]+secys[3]+2. * (secys[1]+secys[2])) * kthird;
1407 c =
c+(seczs[0]+seczs[3]+2. * (seczs[1]+seczs[2])) * kthird;
1409 est =
TMath::Abs(secxs[0]+secxs[3] - (secxs[1]+secxs[2]))
1410 +
TMath::Abs(secys[0]+secys[3] - (secys[1]+secys[2]))
1411 +
TMath::Abs(seczs[0]+seczs[3] - (seczs[1]+seczs[2]));
1414 if (ncut++ > maxcut)
break;
1421 if (iter++ > maxit)
break;
1434 if (step < 0.) rest = -rest;
1437 Float_t dot = (vout[3]*vect[3] + vout[4]*vect[4] + vout[5]*vect[5]);
1458 hxp[0] = f2*vect[kipz] - f3*vect[kipy];
1459 hxp[1] = f3*vect[kipx] -
f1*vect[kipz];
1460 hxp[2] =
f1*vect[kipy] - f2*vect[kipx];
1462 hp =
f1*vect[kipx] + f2*vect[kipy] + f3*vect[kipz];
1470 g3 = (tet-sint) * hp*rho1;
1475 vout[kix] = vect[kix] + g1*vect[kipx] + g2*hxp[0] + g3*
f1;
1476 vout[kiy] = vect[kiy] + g1*vect[kipy] + g2*hxp[1] + g3*f2;
1477 vout[kiz] = vect[kiz] + g1*vect[kipz] + g2*hxp[2] + g3*f3;
1479 vout[kipx] = vect[kipx] + g4*vect[kipx] + g5*hxp[0] + g6*
f1;
1480 vout[kipy] = vect[kipy] + g4*vect[kipy] + g5*hxp[1] + g6*f2;
1481 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
TEveVectorD GetFieldD(const TEveVectorD &v) const
virtual Double_t GetMaxFieldMagD() const
TEvePointSet is a render-element holding a collection of 3D points with optional per-point TRef and a...
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...
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.
T Mag(const SVector< T, D > &rhs)
Vector magnitude (Euclidian norm) Compute : .
Double_t Sqrt(Double_t x)
static constexpr double nm
static constexpr double s
static constexpr double ps
Short_t Range(Short_t lb, Short_t ub, Short_t x)
constexpr Double_t DegToRad()
Conversion from degree to radian:
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 long int sum(long int i)