30 ClassImp(TEveMagField);
39 ClassImp(TEveMagFieldConst);
49 ClassImp(TEveMagFieldDuo);
54 const Double_t kPtMinSqr = 1e-20;
55 const Double_t kAMin = 1e-10;
56 const Double_t kStepEps = 1e-3;
62 TEveTrackPropagator::Helix_t::Helix_t() :
64 fMaxAng(45), fMaxStep(20.f), fDelta(0.1),
65 fPhi(0), fValid(kFALSE),
66 fLam(-1), fR(-1), fPhiStep(-1), fSin(-1), fCos(-1),
68 fPtMag(-1), fPlMag(-1), fLStep(-1)
75 void TEveTrackPropagator::Helix_t::UpdateCommon(
const TEveVectorD& p,
const TEveVectorD& b)
94 void TEveTrackPropagator::Helix_t::UpdateHelix(
const TEveVectorD& p,
const TEveVectorD& b,
95 Bool_t full_update, Bool_t enforce_max_step)
100 TMath::Cross(fE1.Arr(), fE2.Arr(), fE3.Arr());
101 if (fCharge < 0) fE3.NegateXYZ();
105 using namespace TMath;
106 Double_t a = fgkB2C * b.Mag() * Abs(fCharge);
107 if (a > kAMin && fPtMag*fPtMag > kPtMinSqr)
111 fR = Abs(fPtMag / a);
112 fLam = fPlMag / fPtMag;
115 fPhiStep = fMaxAng * DegToRad();
118 Double_t ang = 2.0 * ACos(1.0f - fDelta/fR);
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);
142 void TEveTrackPropagator::Helix_t::UpdateRK(
const TEveVectorD& p,
const TEveVectorD& b)
163 void TEveTrackPropagator::Helix_t::Step(
const TEveVector4D& v,
const TEveVectorD& p,
164 TEveVector4D& vOut, TEveVectorD& pOut)
170 TEveVectorD d = fE2*(fR*fSin) + fE3*(fR*(1-fCos)) + fE1*fLStep;
172 vOut.fT += TMath::Abs(fLStep);
174 pOut = fPl + fE2*(fPtMag*fCos) + fE3*(fPtMag*fSin);
182 vOut += p * (fMaxStep / p.Mag());
208 ClassImp(TEveTrackPropagator);
210 Double_t TEveTrackPropagator::fgDefMagField = 0.5;
211 const Double_t TEveTrackPropagator::fgkB2C = 0.299792458e-2;
212 TEveTrackPropagator TEveTrackPropagator::fgDefault;
214 Double_t TEveTrackPropagator::fgEditorMaxR = 2000;
215 Double_t TEveTrackPropagator::fgEditorMaxZ = 4000;
220 TEveTrackPropagator::TEveTrackPropagator(
const char* n,
const char* t,
221 TEveMagField *field, Bool_t own_field) :
222 TEveElementList(n, t),
227 fOwnMagFiledObj(own_field),
229 fMaxR (350), fMaxZ (450),
230 fNMax (4096), fMaxOrbs (0.5),
232 fEditPathMarks (kTRUE),
233 fFitDaughters (kTRUE), fFitReferences (kTRUE),
235 fFitCluster2Ds (kTRUE), fFitLineSegments (kTRUE),
236 fRnrDaughters (kFALSE), fRnrReferences (kFALSE),
237 fRnrDecay (kFALSE), fRnrCluster2Ds (kFALSE),
241 fProjTrackBreaking(kPTB_Break), fRnrPTBMarkers(kFALSE), fPTBAtt(),
245 fPMAtt.SetMarkerColor(kYellow);
246 fPMAtt.SetMarkerStyle(2);
247 fPMAtt.SetMarkerSize(2);
249 fFVAtt.SetMarkerColor(kRed);
250 fFVAtt.SetMarkerStyle(4);
251 fFVAtt.SetMarkerSize(1.5);
253 fPTBAtt.SetMarkerColor(kBlue);
254 fPTBAtt.SetMarkerStyle(4);
255 fPTBAtt.SetMarkerSize(0.8);
257 if (fMagFieldObj == 0) {
258 fMagFieldObj =
new TEveMagFieldConst(0., 0., fgDefMagField);
259 fOwnMagFiledObj = kTRUE;
266 TEveTrackPropagator::~TEveTrackPropagator()
277 void TEveTrackPropagator::OnZeroRefCount()
279 CheckReferenceCount(
"TEveTrackPropagator::OnZeroRefCount ");
286 void TEveTrackPropagator::CheckReferenceCount(
const TEveException& eh)
290 TEveElementList::CheckReferenceCount(eh);
299 void TEveTrackPropagator::ElementChanged(Bool_t update_scenes, Bool_t redraw)
302 RefMap_i i = fBackRefs.begin();
303 while (i != fBackRefs.end())
305 track =
dynamic_cast<TEveTrack*
>(i->first);
306 track->StampObjProps();
309 TEveElementList::ElementChanged(update_scenes, redraw);
315 void TEveTrackPropagator::InitTrack(
const TEveVectorD &v, Int_t charge)
318 fPoints.push_back(fV);
328 void TEveTrackPropagator::InitTrack(
const TEveVectorF& v, Int_t charge)
331 InitTrack(vd, charge);
337 void TEveTrackPropagator::ResetTrack()
340 fPoints.swap(fLastPoints);
349 Int_t TEveTrackPropagator::GetCurrentPoint()
const
351 return fPoints.size() - 1;
358 Double_t TEveTrackPropagator::GetTrackLength(Int_t start_point, Int_t end_point)
const
360 if (end_point < 0) end_point = fPoints.size() - 1;
363 for (Int_t i = start_point; i < end_point; ++i)
365 sum += (fPoints[i+1] - fPoints[i]).Mag();
373 Bool_t TEveTrackPropagator::GoToVertex(TEveVectorD& v, TEveVectorD& p)
375 Update(fV, p, kTRUE);
377 if ((v-fV).Mag() < kStepEps)
379 fPoints.push_back(v);
383 return fH.fValid ? LoopToVertex(v, p) : LineToVertex(v);
390 Bool_t TEveTrackPropagator::GoToLineSegment(
const TEveVectorD& s,
const TEveVectorD& r, TEveVectorD& p)
392 Update(fV, p, kTRUE);
397 ClosestPointBetweenLines(s, r, fV, p, v);
403 return LoopToLineSegment(s, r, p);
410 Bool_t TEveTrackPropagator::GoToVertex(TEveVectorF& v, TEveVectorF& p)
412 TEveVectorD vd(v), pd(p);
413 Bool_t result = GoToVertex(vd, pd);
421 Bool_t TEveTrackPropagator::GoToLineSegment(
const TEveVectorF& s,
const TEveVectorF& r, TEveVectorF& p)
423 TEveVectorD sd(s), rd(r), pd(p);
424 Bool_t result = GoToLineSegment(sd, rd, pd);
433 void TEveTrackPropagator::GoToBounds(TEveVectorD& p)
435 Update(fV, p, kTRUE);
437 fH.fValid ? LoopToBounds(p): LineToBounds(p);
443 void TEveTrackPropagator::GoToBounds(TEveVectorF& p)
453 void TEveTrackPropagator::Update(
const TEveVector4D& v,
const TEveVectorD& p,
454 Bool_t full_update, Bool_t enforce_max_step)
456 if (fStepper == kHelix)
458 fH.UpdateHelix(p, fMagFieldObj->GetFieldD(v), !fMagFieldObj->IsConst() || full_update, enforce_max_step);
462 fH.UpdateRK(p, fMagFieldObj->GetFieldD(v));
466 using namespace TMath;
468 Float_t a = fgkB2C * fMagFieldObj->GetMaxFieldMagD() * Abs(fH.fCharge);
474 fH.fPhiStep = fH.fMaxAng * DegToRad();
475 if (fH.fR > fH.fDelta )
477 Double_t ang = 2.0 * ACos(1.0f - fH.fDelta/fH.fR);
478 if (ang < fH.fPhiStep)
483 fH.fRKStep = fH.fR * fH.fPhiStep * Sqrt(1 + fH.fLam*fH.fLam);
484 if (fH.fRKStep > fH.fMaxStep || enforce_max_step)
486 fH.fPhiStep *= fH.fMaxStep / fH.fRKStep;
487 fH.fRKStep = fH.fMaxStep;
492 fH.fRKStep = fH.fMaxStep;
501 void TEveTrackPropagator::Step(
const TEveVector4D &v,
const TEveVectorD &p, TEveVector4D &vOut, TEveVectorD &pOut)
503 if (fStepper == kHelix)
505 fH.Step(v, p, vOut, pOut);
513 Double_t pm = p.Mag();
514 Double_t nm = 1.0 / pm;
515 vecRKIn[3] = p.fX*nm;
516 vecRKIn[4] = p.fY*nm;
517 vecRKIn[5] = p.fZ*nm;
518 vecRKIn[6] = p.Mag();
520 Double_t vecRKOut[7];
521 StepRungeKutta(fH.fRKStep, vecRKIn, vecRKOut);
523 vOut.fX = vecRKOut[0];
524 vOut.fY = vecRKOut[1];
525 vOut.fZ = vecRKOut[2];
526 vOut.fT = v.fT + fH.fRKStep;
528 pOut.fX = vecRKOut[3]*pm;
529 pOut.fY = vecRKOut[4]*pm;
530 pOut.fZ = vecRKOut[5]*pm;
538 void TEveTrackPropagator::LoopToBounds(TEveVectorD& p)
540 const Double_t maxRsq = fMaxR*fMaxR;
542 TEveVector4D currV(fV);
543 TEveVector4D forwV(fV);
544 TEveVectorD forwP (p);
546 Int_t np = fPoints.size();
547 Double_t maxPhi = fMaxOrbs*TMath::TwoPi();
549 while (fH.fPhi < maxPhi && np<fNMax)
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);
563 TEveVectorD d(forwV);
567 fPoints.push_back(d);
572 else if (TMath::Abs(forwV.fZ) > fMaxZ)
574 Double_t t = (fMaxZ - TMath::Abs(currV.fZ)) / TMath::Abs((forwV.fZ - currV.fZ));
577 Warning(
"HelixToBounds",
"In MaxZ crossing expected t>=0 && t<=1: t=%f, z1=%f, z2=%f, MaxZ=%f.",
578 t, currV.fZ, forwV.fZ, fMaxZ);
581 TEveVectorD d(forwV -currV);
584 fPoints.push_back(d);
592 fPoints.push_back(currV);
601 Bool_t TEveTrackPropagator::LoopToVertex(TEveVectorD& v, TEveVectorD& p)
603 const Double_t maxRsq = fMaxR * fMaxR;
605 TEveVector4D currV(fV);
606 TEveVector4D forwV(fV);
607 TEveVectorD forwP(p);
609 Int_t first_point = fPoints.size();
610 Int_t np = first_point;
612 Double_t prod0=0, prod1;
616 Step(currV, p, forwV, forwP);
617 Update(forwV, forwP);
619 if (PointOverVertex(v, forwV, &prod1))
624 if (IsOutsideBounds(forwV, maxRsq, fMaxZ))
630 fPoints.push_back(forwV);
635 }
while (np < fNMax);
638 if (np > first_point)
640 if ((v - currV).Mag() > kStepEps)
642 Double_t step_frac = prod0 / (prod0 - prod1);
647 Float_t orig_max_step = fH.fMaxStep;
648 fH.fMaxStep = step_frac * (forwV - currV).Mag();
649 Update(currV, p, kTRUE, kTRUE);
650 Step(currV, p, forwV, forwP);
653 fPoints.push_back(currV);
655 fH.fMaxStep = orig_max_step;
660 TEveVectorD off(v - currV);
661 off *= 1.0f / currV.fT;
662 DistributeOffset(off, first_point, np, p);
668 fPoints.push_back(v);
678 Bool_t TEveTrackPropagator::LoopToLineSegment(
const TEveVectorD& s,
const TEveVectorD& r, TEveVectorD& p)
680 const Double_t maxRsq = fMaxR * fMaxR;
681 const Double_t rMagInv = 1./r.Mag();
683 TEveVector4D currV(fV);
684 TEveVector4D forwV(fV);
685 TEveVectorD forwP(p);
687 Int_t first_point = fPoints.size();
688 Int_t np = first_point;
694 Step(currV, p, forwV, forwP);
695 Update(forwV, forwP);
697 ClosestPointFromVertexToLineSegment(forwV, s, r, rMagInv, forwC);
701 TEveVectorD b = r; b.Normalize();
702 Double_t x = forwP.Dot(b);
703 TEveVectorD pTPM = forwP - x*b;
704 if (pTPM.Dot(forwC - forwV) < 0)
709 if (IsOutsideBounds(forwV, maxRsq, fMaxZ))
715 fPoints.push_back(forwV);
720 }
while (np < fNMax);
724 ClosestPointBetweenLines(s, r, currV, forwV - currV, v);
727 if (np > first_point)
729 if ((v - currV).Mag() > kStepEps)
731 TEveVector last_step = forwV - currV;
732 TEveVector delta = v - currV;
733 Double_t step_frac = last_step.Dot(delta) / last_step.Mag2();
738 Float_t orig_max_step = fH.fMaxStep;
739 fH.fMaxStep = step_frac * (forwV - currV).Mag();
740 Update(currV, p, kTRUE, kTRUE);
741 Step(currV, p, forwV, forwP);
744 fPoints.push_back(currV);
746 fH.fMaxStep = orig_max_step;
751 TEveVectorD off(v - currV);
752 off *= 1.0f / currV.fT;
753 DistributeOffset(off, first_point, np, p);
759 fPoints.push_back(v);
768 void TEveTrackPropagator::DistributeOffset(
const TEveVectorD& off, Int_t first_point, Int_t np, TEveVectorD& p)
772 TEveVectorD lpd0(fPoints[np-1]);
773 lpd0 -= fPoints[np-2];
776 for (Int_t i = first_point; i < np; ++i)
778 fPoints[i] += off * fPoints[i].fT;
781 TEveVectorD lpd1(fPoints[np-1]);
782 lpd1 -= fPoints[np-2];
786 tt.SetupFromToVec(lpd0, lpd1);
799 Bool_t TEveTrackPropagator::LineToVertex(TEveVectorD& v)
801 TEveVector4D currV = v;
806 fPoints.push_back(currV);
815 void TEveTrackPropagator::LineToBounds(TEveVectorD& p)
817 Double_t tZ = 0, tR = 0, tB = 0;
821 tZ = (fMaxZ - fV.fZ) / p.fZ;
823 tZ = - (fMaxZ + fV.fZ) / p.fZ;
828 Double_t a = p.fX*p.fX + p.fY*p.fY;
829 Double_t b = 2.0 * (fV.fX*p.fX + fV.fY*p.fY);
830 Double_t c = fV.fX*fV.fX + fV.fY*fV.fY - fMaxR*fMaxR;
831 Double_t d = b*b - 4.0*a*c;
833 Double_t sqrtD = TMath::Sqrt(d);
834 tR = (-b - sqrtD) / (2.0 * a);
836 tR = (-b + sqrtD) / (2.0 * a);
838 tB = tR < tZ ? tR : tZ;
842 TEveVectorD nv(fV.fX + p.fX*tB, fV.fY + p.fY*tB, fV.fZ + p.fZ*tB);
850 Bool_t TEveTrackPropagator::HelixIntersectPlane(
const TEveVectorD& p,
851 const TEveVectorD& point,
852 const TEveVectorD& normal,
857 if (fMagFieldObj->IsConst())
858 fH.UpdateHelix(mom, fMagFieldObj->GetFieldD(pos), kFALSE, kFALSE);
860 TEveVectorD n(normal);
861 TEveVectorD delta = pos - point;
862 Double_t d = delta.Dot(n);
870 TEveVector4D pos4(pos);
874 Step(pos4, mom, forwV , forwP);
875 Double_t new_d = (forwV - point).Dot(n);
879 Warning(
"HelixIntersectPlane",
"going away from the plane.");
885 itsect = pos + delta * (d / (d - new_d));
897 Bool_t TEveTrackPropagator::LineIntersectPlane(
const TEveVectorD& p,
898 const TEveVectorD& point,
899 const TEveVectorD& normal,
902 TEveVectorD pos(fV.fX, fV.fY, fV.fZ);
903 TEveVectorD delta = point - pos;
905 Double_t pn = p.Dot(normal);
910 Double_t t = delta.Dot(normal) / pn;
931 Bool_t TEveTrackPropagator::IntersectPlane(
const TEveVectorD& p,
932 const TEveVectorD& point,
933 const TEveVectorD& normal,
936 if (fH.fCharge && fMagFieldObj && p.Perp2() > kPtMinSqr)
937 return HelixIntersectPlane(p, point, normal, itsect);
939 return LineIntersectPlane(p, point, normal, itsect);
946 void TEveTrackPropagator::ClosestPointFromVertexToLineSegment(
const TEveVectorD& v,
947 const TEveVectorD& s,
948 const TEveVectorD& r,
952 TEveVectorD dir = v - s;
953 TEveVectorD b1 = r * rMagInv;
956 Double_t dot = dir.Dot(b1);
957 TEveVectorD dirI = dot * b1;
959 Double_t facX = dot * rMagInv;
973 Bool_t TEveTrackPropagator::ClosestPointBetweenLines(
const TEveVectorD& p0,
974 const TEveVectorD& u,
975 const TEveVectorD& q0,
976 const TEveVectorD& v,
979 TEveVectorD w0 = p0 -q0;
980 Double_t a = u.Mag2();
981 Double_t b = u.Dot(v);
982 Double_t c = v.Mag2();
983 Double_t d = u.Dot(w0);
984 Double_t e = v.Dot(w0);
986 Double_t x = (b*e - c*d)/(a*c -b*b);
987 Bool_t force = (x < 0 || x > 1);
988 out = p0 + TMath::Range(0., 1., x) * u;
995 void TEveTrackPropagator::FillPointSet(TEvePointSet* ps)
const
997 Int_t size = TMath::Min(fNMax, (Int_t)fPoints.size());
999 for (Int_t i = 0; i < size; ++i)
1001 const TEveVector4D& v = fPoints[i];
1002 ps->SetNextPoint(v.fX, v.fY, v.fZ);
1009 void TEveTrackPropagator::RebuildTracks()
1012 RefMap_i i = fBackRefs.begin();
1013 while (i != fBackRefs.end())
1015 track =
dynamic_cast<TEveTrack*
>(i->first);
1017 track->StampObjProps();
1025 void TEveTrackPropagator::SetMagField(Double_t bX, Double_t bY, Double_t bZ)
1027 SetMagFieldObj(
new TEveMagFieldConst(bX, bY, bZ));
1033 void TEveTrackPropagator::SetMagFieldObj(TEveMagField* field, Bool_t own_field)
1035 if (fMagFieldObj && fOwnMagFiledObj)
delete fMagFieldObj;
1037 fMagFieldObj = field;
1038 fOwnMagFiledObj = own_field;
1045 void TEveTrackPropagator::PrintMagField(Double_t x, Double_t y, Double_t z)
const
1047 if (fMagFieldObj) fMagFieldObj->PrintField(x, y, z);
1053 void TEveTrackPropagator::SetMaxR(Double_t x)
1062 void TEveTrackPropagator::SetMaxZ(Double_t x)
1071 void TEveTrackPropagator::SetMaxOrbs(Double_t x)
1081 void TEveTrackPropagator::SetMinAng(Double_t x)
1083 Warning(
"SetMinAng",
"This method was mis-named, use SetMaxAng() instead!");
1090 Double_t TEveTrackPropagator::GetMinAng()
const
1092 Warning(
"GetMinAng",
"This method was mis-named, use GetMaxAng() instead!");
1099 void TEveTrackPropagator::SetMaxAng(Double_t x)
1108 void TEveTrackPropagator::SetMaxStep(Double_t x)
1117 void TEveTrackPropagator::SetDelta(Double_t x)
1126 void TEveTrackPropagator::SetFitDaughters(Bool_t x)
1135 void TEveTrackPropagator::SetFitReferences(Bool_t x)
1144 void TEveTrackPropagator::SetFitDecay(Bool_t x)
1153 void TEveTrackPropagator::SetFitLineSegments(Bool_t x)
1155 fFitLineSegments = x;
1162 void TEveTrackPropagator::SetFitCluster2Ds(Bool_t x)
1171 void TEveTrackPropagator::SetRnrDecay(Bool_t rnr)
1180 void TEveTrackPropagator::SetRnrCluster2Ds(Bool_t rnr)
1182 fRnrCluster2Ds = rnr;
1189 void TEveTrackPropagator::SetRnrDaughters(Bool_t rnr)
1191 fRnrDaughters = rnr;
1198 void TEveTrackPropagator::SetRnrReferences(Bool_t rnr)
1200 fRnrReferences = rnr;
1207 void TEveTrackPropagator::SetRnrFV(Bool_t x)
1216 void TEveTrackPropagator::SetProjTrackBreaking(UChar_t x)
1218 fProjTrackBreaking = x;
1225 void TEveTrackPropagator::SetRnrPTBMarkers(Bool_t x)
1234 void TEveTrackPropagator::StepRungeKutta(Double_t step,
1235 Double_t* vect, Double_t* vout)
1259 Double_t h2, h4, f[4];
1260 Double_t a, b, c, ph,ph2;
1261 Double_t secxs[4],secys[4],seczs[4],hxp[3];
1262 Double_t g1, g2, g3, g4, g5, g6, ang2, dxt, dyt, dzt;
1263 Double_t est, at, bt, ct, cba;
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;
1278 const Double_t hmin = 1e-4;
1279 const Double_t kdlt = 1e-3;
1280 const Double_t kdlt32 = kdlt/32.;
1281 const Double_t kthird = 1./3.;
1282 const Double_t khalf = 0.5;
1283 const Double_t kec = 2.9979251e-3;
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++)
1303 Double_t pinv = kec * fH.fCharge / vect[6];
1310 if (TMath::Abs(h) > TMath::Abs(rest))
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];
1343 est = TMath::Abs(dxt) + TMath::Abs(dyt) + TMath::Abs(dzt);
1345 if (ncut++ > maxcut)
break;
1354 fH.fB = fMagFieldObj->GetFieldD(xt, yt, zt);
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];
1382 est = TMath::Abs(dxt)+TMath::Abs(dyt)+TMath::Abs(dzt);
1383 if (est > 2.*TMath::Abs(h)) {
1384 if (ncut++ > maxcut)
break;
1393 fH.fB = fMagFieldObj->GetFieldD(xt, yt, zt);
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]));
1413 if (est > kdlt && TMath::Abs(h) > hmin) {
1414 if (ncut++ > maxcut)
break;
1421 if (iter++ > maxit)
break;
1426 cba = 1./ TMath::Sqrt(a*a + b*b + c*c);
1434 if (step < 0.) rest = -rest;
1435 if (rest < 1.e-5*TMath::Abs(step))
1437 Float_t dot = (vout[3]*vect[3] + vout[4]*vect[4] + vout[5]*vect[5]);
1438 fH.fPhi += TMath::ACos(dot);
1449 f4 = TMath::Sqrt(f1*f1+f2*f2+f3*f3);
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];
1465 sint = TMath::Sin(tet);
1466 cost = 2.*TMath::Sin(khalf*tet)*TMath::Sin(khalf*tet);
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;