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);
832 tR = (-
b - sqrtD) / (2.0 *
a);
834 tR = (-
b + sqrtD) / (2.0 *
a);
836 tB = tR < tZ ? tR : tZ;
872 Step(pos4, mom, forwV , forwP);
877 Warning(
"HelixIntersectPlane",
"going away from the plane.");
883 itsect = pos + delta * (
d / (
d - new_d));
985 Bool_t force = (x < 0 || x > 1);
997 for (
Int_t i = 0; i < size; ++i)
1000 ps->SetNextPoint(
v.fX,
v.fY,
v.fZ);
1013 track =
dynamic_cast<TEveTrack*
>(i->first);
1081 Warning(
"SetMinAng",
"This method was mis-named, use SetMaxAng() instead!");
1090 Warning(
"GetMinAng",
"This method was mis-named, use GetMaxAng() instead!");
1259 Double_t secxs[4],secys[4],seczs[4],hxp[3];
1260 Double_t g1, g2, g3, g4, g5, g6, ang2, dxt, dyt, dzt;
1262 Double_t f1, f2, f3, f4, rho, tet, hnorm, hp, rho1, sint, cost;
1273 const Int_t maxit = 500;
1274 const Int_t maxcut = 11;
1283 const Double_t kpisqua = 9.86960440109;
1284 const Int_t kix = 0;
1285 const Int_t kiy = 1;
1286 const Int_t kiz = 2;
1287 const Int_t kipx = 3;
1288 const Int_t kipy = 4;
1289 const Int_t kipz = 5;
1298 for(
Int_t j = 0; j < 7; j++)
1327 secxs[0] = (
b *
f[2] -
c *
f[1]) * ph2;
1328 secys[0] = (
c *
f[0] -
a *
f[2]) * ph2;
1329 seczs[0] = (
a *
f[1] -
b *
f[0]) * ph2;
1330 ang2 = (secxs[0]*secxs[0] + secys[0]*secys[0] + seczs[0]*seczs[0]);
1331 if (ang2 > kpisqua)
break;
1333 dxt = h2 *
a + h4 * secxs[0];
1334 dyt = h2 *
b + h4 * secys[0];
1335 dzt = h2 *
c + h4 * seczs[0];
1343 if (ncut++ > maxcut)
break;
1361 secxs[1] = (bt *
f[2] - ct *
f[1]) * ph2;
1362 secys[1] = (ct *
f[0] - at *
f[2]) * ph2;
1363 seczs[1] = (at *
f[1] - bt *
f[0]) * ph2;
1367 secxs[2] = (bt *
f[2] - ct *
f[1]) * ph2;
1368 secys[2] = (ct *
f[0] - at *
f[2]) * ph2;
1369 seczs[2] = (at *
f[1] - bt *
f[0]) * ph2;
1370 dxt =
h * (
a + secxs[2]);
1371 dyt =
h * (
b + secys[2]);
1372 dzt =
h * (
c + seczs[2]);
1376 at =
a + 2.*secxs[2];
1377 bt =
b + 2.*secys[2];
1378 ct =
c + 2.*seczs[2];
1382 if (ncut++ > maxcut)
break;
1396 z = z + (
c + (seczs[0] + seczs[1] + seczs[2]) * kthird) *
h;
1397 y =
y + (
b + (secys[0] + secys[1] + secys[2]) * kthird) *
h;
1398 x =
x + (
a + (secxs[0] + secxs[1] + secxs[2]) * kthird) *
h;
1400 secxs[3] = (bt*
f[2] - ct*
f[1])* ph2;
1401 secys[3] = (ct*
f[0] - at*
f[2])* ph2;
1402 seczs[3] = (at*
f[1] - bt*
f[0])* ph2;
1403 a =
a+(secxs[0]+secxs[3]+2. * (secxs[1]+secxs[2])) * kthird;
1404 b =
b+(secys[0]+secys[3]+2. * (secys[1]+secys[2])) * kthird;
1405 c =
c+(seczs[0]+seczs[3]+2. * (seczs[1]+seczs[2])) * kthird;
1407 est =
TMath::Abs(secxs[0]+secxs[3] - (secxs[1]+secxs[2]))
1408 +
TMath::Abs(secys[0]+secys[3] - (secys[1]+secys[2]))
1409 +
TMath::Abs(seczs[0]+seczs[3] - (seczs[1]+seczs[2]));
1412 if (ncut++ > maxcut)
break;
1419 if (iter++ > maxit)
break;
1432 if (step < 0.) rest = -rest;
1435 Float_t dot = (vout[3]*vect[3] + vout[4]*vect[4] + vout[5]*vect[5]);
1456 hxp[0] = f2*vect[kipz] - f3*vect[kipy];
1457 hxp[1] = f3*vect[kipx] -
f1*vect[kipz];
1458 hxp[2] =
f1*vect[kipy] - f2*vect[kipx];
1460 hp =
f1*vect[kipx] + f2*vect[kipy] + f3*vect[kipz];
1468 g3 = (tet-sint) * hp*rho1;
1473 vout[kix] = vect[kix] + g1*vect[kipx] + g2*hxp[0] + g3*
f1;
1474 vout[kiy] = vect[kiy] + g1*vect[kipy] + g2*hxp[1] + g3*f2;
1475 vout[kiz] = vect[kiz] + g1*vect[kipz] + g2*hxp[2] + g3*f3;
1477 vout[kipx] = vect[kipx] + g4*vect[kipx] + g5*hxp[0] + g6*
f1;
1478 vout[kipy] = vect[kipy] + g4*vect[kipy] + g5*hxp[1] + g6*f2;
1479 vout[kipz] = vect[kipz] + g4*vect[kipz] + g5*hxp[2] + g6*f3;
Double_t Dot(const TGLVector3 &v1, const TGLVector3 &v2)
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)