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)
105 using namespace TMath;
125 if (curr_step >
fMaxStep || enforce_max_step)
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;
505 fH.
Step(v, p, vOut, pOut);
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)
556 Float_t t = (fMaxR - currV.
R()) / (forwV.
R() - currV.
R());
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)
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)
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;
virtual Bool_t IsConst() const
TEveTrans is a 4x4 transformation matrix for homogeneous coordinates stored internally in a column-ma...
virtual Double_t GetMaxFieldMagD() const
Bool_t ClosestPointBetweenLines(const TEveVectorD &, const TEveVectorD &, const TEveVectorD &, const TEveVectorD &, TEveVectorD &out)
Get closest point on line defined with vector p0 and u.
static long int sum(long int i)
void SetRnrCluster2Ds(Bool_t x)
Set rendering of 2D-clusters and rebuild tracks.
Implements constant magnetic filed that switches on given axial radius fR2 from vector fBIn to fBOut...
static Double_t fgEditorMaxR
Base-class for reference-counted objects with reverse references to TEveElement objects.
constexpr Double_t TwoPi()
TEveMagField * fMagFieldObj
TT Dot(const TEveVectorT &a) const
void SetDelta(Double_t x)
Set maximum error and rebuild tracks.
Implements constant magnetic field, given by a vector fB.
Bool_t IntersectPlane(const TEveVectorD &p, const TEveVectorD &point, const TEveVectorD &normal, TEveVectorD &itsect)
Find intersection of currently propagated track with a plane.
T Mag(const SVector< T, D > &rhs)
Vector magnitude (Euclidian norm) Compute : .
void PrintMagField(Double_t x, Double_t y, Double_t z) const
Short_t Range(Short_t lb, Short_t ub, Short_t x)
Short_t Min(Short_t a, Short_t b)
void SetMaxStep(Double_t x)
Set maximum step-size and rebuild tracks.
void SetMinAng(Double_t x)
Set maximum step angle and rebuild tracks.
void SetFitLineSegments(Bool_t x)
Set line segment fitting and rebuild tracks.
void SetMaxAng(Double_t x)
Set maximum step angle and rebuild tracks.
void LoopToBounds(TEveVectorD &p)
Propagate charged particle with momentum p to bounds.
Minimal, templated four-vector.
void SetMaxR(Double_t x)
Set maximum radius and rebuild tracks.
void SetRnrReferences(Bool_t x)
Set track-reference rendering and rebuild tracks.
void SetProjTrackBreaking(UChar_t x)
Set projection break-point mode and rebuild tracks.
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.
TEveVectorD GetFieldD(const TEveVectorD &v) const
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...
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...
static Double_t fgDefMagField
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 UpdateCommon(const TEveVectorD &p, const TEveVectorD &b)
Common update code for helix and RK propagation.
void Step(const TEveVector4D &v, const TEveVectorD &p, TEveVector4D &vOut, TEveVectorD &pOut)
Wrapper to step helix.
virtual void MakeTrack(Bool_t recurse=kTRUE)
Calculate track representation based on track data and current settings of the propagator.
constexpr Double_t DegToRad()
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
void SetFitDaughters(Bool_t x)
Set daughter creation point fitting and rebuild tracks.
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)
virtual Bool_t GoToVertex(TEveVectorD &v, TEveVectorD &p)
Propagate particle with momentum p to vertex v.
static const Double_t fgkB2C
Double_t GetMinAng() const
Get maximum step angle.
Double_t GetMaxAng() const
void UpdateRK(const TEveVectorD &p, const TEveVectorD &b)
Update helix for stepper RungeKutta.
void Step(const TEveVector4D &v, const TEveVectorD &p, TEveVector4D &vOut, TEveVectorD &pOut)
Step helix for given momentum p from vertex v.
Double_t Sqrt(Double_t x)
static TEveTrackPropagator fgDefault
virtual void CheckReferenceCount(const TEveException &eh="TEveElement::CheckReferenceCount ")
Check external references to this and eventually auto-destruct the render-element.
static Double_t fgEditorMaxZ
void SetRnrFV(Bool_t x)
Set first-vertex rendering and rebuild tracks.
Bool_t LoopToVertex(TEveVectorD &v, TEveVectorD &p)
Propagate charged particle with momentum p to vertex v.
Bool_t LineToVertex(TEveVectorD &v)
Propagate neutral particle to vertex v.
void RotateIP(TVector3 &v) const
Rotate vector in-place. Translation is NOT applied.
void SetRnrDaughters(Bool_t x)
Set daughter rendering and rebuild tracks.
TEveTrackPropagator(const TEveTrackPropagator &)
virtual void CheckReferenceCount(const TEveException &eh="TEveElement::CheckReferenceCount ")
Check reference count - virtual from TEveElement.
void FillPointSet(TEvePointSet *ps) const
Reset ps and populate it with points in propagation cache.
TEvePointSet is a render-element holding a collection of 3D points with optional per-point TRef and a...
void SetMaxOrbs(Double_t x)
Set maximum number of orbits and rebuild tracks.
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
Bool_t PointOverVertex(const TEveVector4D &v0, const TEveVector4D &v, Double_t *p=0)
T * Cross(const T v1[3], const T v2[3], T out[3])
Holding structure for a number of track rendering parameters.
void SetMaxZ(Double_t x)
Set maximum z and rebuild tracks.
Visual representation of a track.
Int_t GetCurrentPoint() const
Get index of current point on track.
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
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.
Bool_t HelixIntersectPlane(const TEveVectorD &p, const TEveVectorD &point, const TEveVectorD &normal, TEveVectorD &itsect)
Intersect helix with a plane.
virtual Int_t SetNextPoint(Double_t x, Double_t y, Double_t z)
Set point following LastPoint to x, y, z.
Double_t Dot(const TGLVector3 &v1, const TGLVector3 &v2)
void ResetTrack()
Reset cache holding particle trajectory.
std::vector< TEveVector4D > fLastPoints
void SetMagFieldObj(TEveMagField *field, Bool_t own_field=kTRUE)
Set constant magnetic field and rebuild tracks.
std::vector< TEveVector4D > fPoints
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
void RebuildTracks()
Rebuild all tracks using this render-style.
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.
void SetMagField(Double_t bX, Double_t bY, Double_t bZ)
Set constant magnetic field and rebuild tracks.
void UpdateHelix(const TEveVectorD &p, const TEveVectorD &b, Bool_t full_update, Bool_t enforce_max_step)
Update helix parameters.
you should not use this method at all Int_t Int_t z
void SetRnrDecay(Bool_t x)
Set decay rendering and rebuild tracks.
void SetFitReferences(Bool_t x)
Set track-reference fitting and rebuild tracks.
virtual void OnZeroRefCount()
Virtual from TEveRefBackPtr - track reference count has reached zero.
double f2(const double *x)
Helix_t()
Default constructor.
TT Normalize(TT length=1)
Normalize the vector to length if current length is non-zero.
void SetFitDecay(Bool_t x)
Set decay fitting and rebuild tracks.
virtual void ElementChanged(Bool_t update_scenes=kTRUE, Bool_t redraw=kFALSE)
Element-change notification.
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...
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
Exception class thrown by TEve classes and macros.
virtual ~TEveTrackPropagator()
Destructor.
UChar_t fProjTrackBreaking
void SetFitCluster2Ds(Bool_t x)
Set 2D-cluster fitting 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.
Abstract base-class for interfacing to magnetic field needed by the TEveTrackPropagator.
virtual void PrintField(Double_t x, Double_t y, Double_t z) const
def normal(shape, name=None)
void SetRnrPTBMarkers(Bool_t x)
Set projection break-point rendering and rebuild tracks.
Double_t Sqrt(Double_t x)
RefMap_t::iterator RefMap_i
void StepRungeKutta(Double_t step, Double_t *vect, Double_t *vout)
Wrapper to step with method RungeKutta.
void InitTrack(const TEveVectorD &v, Int_t charge)
Initialize internal data-members for given particle parameters.
virtual void GoToBounds(TEveVectorD &p)
Propagate particle to bounds.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
void LineToBounds(TEveVectorD &p)
Propagate neutral particle with momentum p to bounds.
Bool_t LineIntersectPlane(const TEveVectorD &p, const TEveVectorD &point, const TEveVectorD &normal, TEveVectorD &itsect)
Intersect line with a plane.