123{
124
125 const char* MethodName= "G4MultiLevelLocator::EstimateIntersectionPoint()";
126
127 G4bool found_approximate_intersection =
false;
128 G4bool there_is_no_intersection =
false;
129
130 G4FieldTrack CurrentA_PointVelocity = CurveStartPointVelocity;
131 G4FieldTrack CurrentB_PointVelocity = CurveEndPointVelocity;
133 G4bool validNormalAtE =
false;
135
136 G4FieldTrack ApproxIntersecPointV(CurveEndPointVelocity);
137 G4bool validIntersectP=
true;
139 G4bool last_AF_intersection =
false;
140
143
144 G4bool first_section =
true;
145 recalculatedEndPoint = false;
146 G4bool restoredFullEndpoint =
false;
147
148 unsigned int substep_no = 0;
149
150
152
153#ifdef G4DEBUG_FIELD
154 unsigned int trigger_substepno_print = 0;
155 const G4double tolerance = 1.0e-8 * CLHEP::mm;
156 unsigned int biggest_depth = 0;
157
158#endif
159
160
161
163 endChangeB("EndPointB"), recApproxPoint("ApproxPoint"),
164 pointH_logger("Trial points 'E': position, normal");
165 unsigned int eventCount = 0;
166
168 {
169
170 endChangeA.clear();
171 endChangeB.clear();
172 recApproxPoint.clear();
173 pointH_logger.clear();
174
175
176 ++eventCount;
178 eventCount, CurrentA_PointVelocity );
180 eventCount, CurrentB_PointVelocity );
181 }
182
183
184
185
186
187
188
189
190
191
192
193 const G4int param_substeps = 5;
194
196
197 G4bool Second_half =
false;
198
199
200
201
202
203
204
205 unsigned int depth = 0;
206 ++fNumCalls;
207
209
211 {
213 substep_no, eventCount,
216 #if (G4DEBUG_FIELD>1)
217 G4ThreeVector StartPosition = CurveStartPointVelocity.GetPosition();
218 if( (TrialPoint - StartPosition).mag2() <
sqr(tolerance))
219 {
221 tolerance, fNumCalls);
222 }
223 #endif
224 }
225
226
227
228
229
230 *ptrInterMedFT[0] = CurveEndPointVelocity;
231 for ( auto idepth=1; idepth<max_depth+1; ++idepth )
232 {
233 *ptrInterMedFT[idepth] = CurveStartPointVelocity;
234 }
235
236
237
239 for (bool & idepth : fin_section_depth)
240 {
241 idepth = true;
242 }
243
244
245 G4FieldTrack SubStart_PointVelocity = CurveStartPointVelocity;
246
247 do
248 {
249 unsigned int substep_no_p = 0;
250 G4bool sub_final_section =
false;
251
252 SubStart_PointVelocity = CurrentA_PointVelocity;
253
254 do
255 {
258
259#ifdef G4DEBUG_FIELD
263 G4double distAB = (Point_B - Point_A).mag();
265 {
266 G4cerr <<
"ERROR> (Start) Point A coincides with or has gone past (end) point B"
267 <<
"MLL: iters = " << substep_no <<
G4endl;
269 G4cerr <<
" Difference = " << distAB - curv_lenAB
270 <<
" exceeds limit of relative dist (10*epsilon)= " << 10*
fiEpsilonStep
273 G4cerr <<
" Len A, B = " << lenA <<
" " << lenB <<
G4endl
274 <<
" Position A: " << Point_A <<
G4endl
275 <<
" Position B: " << Point_B <<
G4endl;
277
278
280 {
282 }
283 }
284#endif
285 if( !validIntersectP )
286 {
288 errmsg << "Assertion FAILURE - invalid (stale) Interection point. Substep: "
289 << substep_no <<
" call: " << fNumCalls <<
G4endl;
291 {
293 }
294 G4Exception(
"G4MultiLevelLocator::EstimateIntersectionPoint",
"GeomNav0004",
296 }
297
298
299
300
303 CurrentB_PointVelocity,
304 CurrentE_Point,
306
307
308#ifdef G4DEBUG_FIELD
310 substep_no, eventCount, ApproxIntersecPointV ) );
312 G4double checkVsEnd= lenB - lenIntsc;
313
314 if( lenIntsc > lenB )
315 {
316 std::ostringstream errmsg;
317 errmsg.precision(17);
319 G4double ratioTol = std::fabs(ratio) / tolerance;
320 errmsg <<
"Intermediate F point is past end B point" <<
G4endl
321 <<
" l( intersection ) = " << lenIntsc <<
G4endl
322 <<
" l( endpoint ) = " << lenB <<
G4endl;
323 errmsg.precision(8);
324 errmsg <<
" l_end - l_inters = " << checkVsEnd <<
G4endl
325 <<
" / l_end = " << ratio <<
G4endl
326 <<
" ratio / tolerance = " << ratioTol <<
G4endl;
327 if( ratioTol < 1.0 )
329 else
331 }
332#endif
333
334 G4ThreeVector CurrentF_Point= ApproxIntersecPointV.GetPosition();
335
336
337
338
339 G4ThreeVector ChordEF_Vector = CurrentF_Point - CurrentE_Point;
340
341 G4ThreeVector NewMomentumDir = ApproxIntersecPointV.GetMomentumDir();
342 G4double MomDir_dot_Norm = NewMomentumDir.
dot( NormalAtEntry );
343
344#ifdef G4DEBUG_FIELD
346 {
350 MomDir_dot_ABchord = (1.0 / ABchord_length)
351 * NewMomentumDir.
dot( ChordAB );
353 ChordEF_Vector, NewMomentumDir, NormalAtEntry, validNormalAtE );
354 G4cout <<
" dot( MomentumDir, ABchord_unit ) = "
355 << MomDir_dot_ABchord <<
G4endl;
356 }
357#endif
359 ( MomDir_dot_Norm >= 0.0 )
360 || (! validNormalAtE );
364 {
365 found_approximate_intersection = true;
366
367
368
369 IntersectedOrRecalculatedFT = ApproxIntersecPointV;
370 IntersectedOrRecalculatedFT.SetPosition( CurrentE_Point );
371
373 {
374
375
377 G4ThreeVector MomentumDir=ApproxIntersecPointV.GetMomentumDirection();
379 CurrentE_Point, CurrentF_Point, MomentumDir,
380 last_AF_intersection, IP, NewSafety,
381 previousSafety, previousSftOrigin );
382 if ( goodCorrection )
383 {
384 IntersectedOrRecalculatedFT = ApproxIntersecPointV;
385 IntersectedOrRecalculatedFT.SetPosition(IP);
386 }
387 }
388
389
390
391
392
393
394 }
395 else
396 {
397
398
399
400
401
403
406 G4bool Intersects_FB =
false;
408 NewSafety, previousSafety,
409 previousSftOrigin,
410 stepLengthAF,
411 PointG );
412 last_AF_intersection = Intersects_AF;
413 if( Intersects_AF )
414 {
415
416
417 CurrentB_PointVelocity = ApproxIntersecPointV;
418 CurrentE_Point = PointG;
419
420 validIntersectP = true;
421
424 validNormalAtE = validNormalLast;
425
426
427
428 fin_section_depth[depth] = false;
429
431 {
432 ++eventCount;
433 endChangeB.push_back(
435 substep_no, eventCount, CurrentB_PointVelocity) );
436 }
437#ifdef G4VERBOSE
439 {
440 G4cout <<
"G4PiF::LI> Investigating intermediate point"
441 << " at s=" << ApproxIntersecPointV.GetCurveLength()
442 << " on way to full s="
443 << CurveEndPointVelocity.GetCurveLength() <<
G4endl;
444 }
445#endif
446 }
447 else
448 {
449
450
451
452
454
457
458
459
460
462 NewSafety, previousSafety,
463 previousSftOrigin,
464 stepLengthFB,
465 PointH );
466 if( Intersects_FB )
467 {
468
469
470
471
472
473
474
475
476
477
478
479
480 CurrentA_PointVelocity = ApproxIntersecPointV;
481 CurrentE_Point = PointH;
482
483 validIntersectP = true;
484
487 validNormalAtE = validNormalH;
488
490 {
491 ++eventCount;
492 endChangeA.push_back(
494 substep_no, eventCount, CurrentA_PointVelocity) );
496
497 intersectH_pn.SetPosition( PointH );
498 intersectH_pn.SetMomentum( NormalAtEntry );
500 substep_no, eventCount, intersectH_pn );
501 }
502 }
503 else
504 {
505 validIntersectP = false;
506 if( fin_section_depth[depth] )
507 {
508
509
510
511
512
513
514
515
516 if( ((Second_half)&&(depth==0)) || (first_section) )
517 {
518 there_is_no_intersection = true;
519 }
520 else
521 {
522
523
524 substep_no_p = param_substeps+2;
525
526
527
528 Second_half = true;
529 sub_final_section = true;
530 }
531 }
532 else
533 {
534 CurrentA_PointVelocity = CurrentB_PointVelocity;
535 CurrentB_PointVelocity = (depth==0) ? CurveEndPointVelocity
536 : *ptrInterMedFT[depth] ;
537 SubStart_PointVelocity = CurrentA_PointVelocity;
538 restoredFullEndpoint = true;
539
540 validIntersectP = false;
541
543 {
544 ++eventCount;
545 endChangeA.push_back(
548 substep_no, eventCount, CurrentA_PointVelocity) );
549 endChangeB.push_back(
552 substep_no, eventCount, CurrentB_PointVelocity) );
553 }
554 }
555 }
556 }
557
558 G4int errorEndPt = 0;
559
560 G4bool recalculatedB=
false;
561 if( driverReIntegrates )
562 {
565 CurrentB_PointVelocity,
566 RevisedB_FT,
567 errorEndPt );
568 if( recalculatedB )
569 {
570 CurrentB_PointVelocity = RevisedB_FT;
571
572
573
574
575
576
577 if ( (fin_section_depth[depth])
578 &&( first_section || ((Second_half)&&(depth==0)) ) )
579 {
580 recalculatedEndPoint = true;
581 IntersectedOrRecalculatedFT = RevisedB_FT;
582
583 }
584
585
586
587
588
589 }
591 {
592 ++eventCount;
593 endChangeB.push_back(
595 substep_no, eventCount, RevisedB_FT ) );
596 }
597 }
598 else
599 {
602 {
603 errorEndPt = 2;
604 }
605 }
606
607 if( errorEndPt > 1 )
608 {
609 std::ostringstream errmsg;
610
612 CurveStartPointVelocity, CurveEndPointVelocity,
614 CurrentA_PointVelocity, CurrentB_PointVelocity,
615 SubStart_PointVelocity, CurrentE_Point,
616 ApproxIntersecPointV, substep_no, substep_no_p, depth);
617
619 {
621 }
622
623 errmsg <<
G4endl <<
" * Location: " << MethodName
624 <<
"- After EndIf(Intersects_AF)" <<
G4endl;
625 errmsg << " * Bool flags: Recalculated = " << recalculatedB
626 << " Intersects_AF = " << Intersects_AF
627 <<
" Intersects_FB = " << Intersects_FB <<
G4endl;
628 errmsg <<
" * Number of calls to MLL:EIP= " << fNumCalls <<
G4endl;
630 }
631 if( restoredFullEndpoint )
632 {
633 fin_section_depth[depth] = restoredFullEndpoint;
634 restoredFullEndpoint = false;
635 }
636 }
637
638
639#ifdef G4DEBUG_FIELD
640 if( trigger_substepno_print == 0)
641 {
642 trigger_substepno_print= fWarnSteps - 20;
643 }
644
645 if( substep_no >= trigger_substepno_print )
646 {
647 G4cout <<
"Difficulty in converging in " << MethodName
648 <<
" Substep no = " << substep_no <<
G4endl;
649 if( substep_no == trigger_substepno_print )
650 {
652 printStatus( CurveStartPointVelocity, CurveEndPointVelocity,
653 -1.0, NewSafety, 0 );
656 } else {
657 G4cout <<
" ** For more information enable 'check mode' in G4MultiLevelLocator "
658 <<
"-- (it saves and can output change records) " <<
G4endl;
659 }
660 }
662 printStatus( CurrentA_PointVelocity, CurrentA_PointVelocity,
663 -1.0, NewSafety, substep_no-1 );
665 printStatus( CurrentA_PointVelocity, CurrentB_PointVelocity,
666 -1.0, NewSafety, substep_no );
667 }
668#endif
669 ++substep_no;
670 ++substep_no_p;
671
672 } while ( ( ! found_approximate_intersection )
673 && ( ! there_is_no_intersection )
674 && validIntersectP
675 && ( substep_no_p <= param_substeps) );
676
677
678 if( (!found_approximate_intersection) && (!there_is_no_intersection) )
679 {
684
686
687
688
689
690 if( (did_len < fraction_done*all_len)
691 && (depth<max_depth) && (!sub_final_section) )
692 {
693#ifdef G4DEBUG_FIELD
695 biggest_depth = std::max(depth, biggest_depth);
696 ++numSplits;
697#endif
698 Second_half = false;
699 ++depth;
700 first_section = false;
701
702 G4double Sub_len = (all_len-did_len)/(2.);
705 integrDriver->AccurateAdvance(midPoint, Sub_len,
fiEpsilonStep);
706
707 ++fNumAdvanceTrials;
708 if( fullAdvance ) { ++fNumAdvanceFull; }
709
712
713 const G4double adequateFraction = (1.0-CLHEP::perThousand);
714 G4bool goodAdvance = (lenAchieved >= adequateFraction * Sub_len);
715 if ( goodAdvance ) { ++fNumAdvanceGood; }
716
717#ifdef G4DEBUG_FIELD
718 else
719 {
720 G4cout <<
"MLL> AdvanceChordLimited not full at depth=" << depth
721 << " total length achieved = " << lenAchieved << " of "
722 << Sub_len << " fraction= ";
723 if (Sub_len != 0.0 ) {
G4cout << lenAchieved / Sub_len; }
724 else {
G4cout <<
"DivByZero"; }
725 G4cout <<
" Good-enough fraction = " << adequateFraction;
726 G4cout <<
" Number of call to mll = " << fNumCalls
727 << " iteration " << substep_no
728 <<
" inner = " << substep_no_p <<
G4endl;
730 G4cout <<
" State at start is = " << CurrentA_PointVelocity
732 <<
" at end (midpoint)= " << midPoint <<
G4endl;
734
736 ReportFieldValue( CurrentA_PointVelocity, "start", equation );
737 ReportFieldValue( midPoint, "midPoint", equation );
738 G4cout <<
" Original Start = "
739 << CurveStartPointVelocity <<
G4endl;
740 G4cout <<
" Original End = "
741 << CurveEndPointVelocity <<
G4endl;
742 G4cout <<
" Original TrialPoint = "
744 G4cout <<
" (this is STRICT mode) "
745 << " num Splits= " << numSplits;
747 }
748#endif
749
750 *ptrInterMedFT[depth] = midPoint;
751 CurrentB_PointVelocity = midPoint;
752
754 {
755 ++eventCount;
756 endChangeB.push_back(
758 substep_no, eventCount, midPoint) );
759 }
760
761
762
763 SubStart_PointVelocity = CurrentA_PointVelocity;
764
765
766
769
773 NewSafety, previousSafety,
774 previousSftOrigin, distAB,
775 PointGe);
776 if( Intersects_AB )
777 {
778 last_AF_intersection = Intersects_AB;
779 CurrentE_Point = PointGe;
780 fin_section_depth[depth] = true;
781
782 validIntersectP = true;
783
786 validNormalAtE = validNormalAB;
787 }
788 else
789 {
790
791
792
793 Second_half = true;
794
795 validIntersectP= false;
796 }
797 }
798
799 G4bool unfinished = Second_half;
800 while ( unfinished && (depth>0) )
801 {
802
803
804
805
806
807 SubStart_PointVelocity = *ptrInterMedFT[depth];
808 CurrentA_PointVelocity = *ptrInterMedFT[depth];
809 CurrentB_PointVelocity = *ptrInterMedFT[depth-1];
810
812 {
813 ++eventCount;
815 substep_no, eventCount, CurrentA_PointVelocity);
816 endChangeA.push_back( chngPop_a );
818 substep_no, eventCount, CurrentB_PointVelocity);
819 endChangeB.push_back( chngPop_b );
820 }
821
822
823
824
825 G4int errorEndPt = -1;
826 G4bool recalculatedB=
false;
827 if( driverReIntegrates )
828 {
829
830
831
832 G4FieldTrack RevisedEndPointFT = CurrentB_PointVelocity;
833 recalculatedB =
835 CurrentB_PointVelocity,
836 RevisedEndPointFT,
837 errorEndPt );
838 if( recalculatedB )
839 {
840 CurrentB_PointVelocity = RevisedEndPointFT;
841
842 if ( depth == 1 )
843 {
844 recalculatedEndPoint = true;
845 IntersectedOrRecalculatedFT = RevisedEndPointFT;
846
847 }
848 }
849 else
850 {
853 {
854 errorEndPt = 2;
855 }
856 }
857
859 {
860 ++eventCount;
861 endChangeB.push_back(
863 substep_no, eventCount, RevisedEndPointFT));
864 }
865 }
866 if( errorEndPt > 1 )
867 {
868 std::ostringstream errmsg;
870 CurveStartPointVelocity, CurveEndPointVelocity,
872 CurrentA_PointVelocity, CurrentB_PointVelocity,
873 SubStart_PointVelocity, CurrentE_Point,
874 ApproxIntersecPointV, substep_no, substep_no_p, depth);
875 errmsg <<
" * Location: " << MethodName <<
"- Second-Half" <<
G4endl;
876 errmsg <<
" * Recalculated = " << recalculatedB <<
G4endl;
878 }
879
885 previousSafety,
886 previousSftOrigin, distAB,
887 PointGi);
888 if( Intersects_AB )
889 {
890 last_AF_intersection = Intersects_AB;
891 CurrentE_Point = PointGi;
892
893 validIntersectP = true;
895 }
896 else
897 {
898 validIntersectP = false;
899 if( depth == 1)
900 {
901 there_is_no_intersection = true;
902 }
903 }
904 depth--;
905 fin_section_depth[depth] = true;
906 unfinished = !validIntersectP;
907 }
908#ifdef G4DEBUG_FIELD
909 if( ! ( validIntersectP || there_is_no_intersection ) )
910 {
911
912 G4cout <<
"MLL - WARNING Potential FAILURE: Conditions not met!"
914 <<
" Depth = " << depth <<
G4endl
915 <<
" Num Substeps= " << substep_no <<
G4endl;
916 G4cout <<
" Found intersection= " << found_approximate_intersection
920 CurveStartPointVelocity, CurveEndPointVelocity,
921 substep_no, CurrentA_PointVelocity,
922 CurrentB_PointVelocity,
923 NewSafety, depth );
925 }
926#endif
927 }
928
929 assert( validIntersectP || there_is_no_intersection
930 || found_approximate_intersection);
931
932 } while ( ( ! found_approximate_intersection )
933 && ( ! there_is_no_intersection )
934 && ( substep_no <= fMaxSteps) );
935
936 if( substep_no > max_no_seen )
937 {
938 max_no_seen = substep_no;
939#ifdef G4DEBUG_FIELD
940 if( max_no_seen > fWarnSteps )
941 {
942 trigger_substepno_print = max_no_seen-20;
943 }
944#endif
945 }
946
947 if( !there_is_no_intersection && !found_approximate_intersection )
948 {
949 if( substep_no >= fMaxSteps)
950 {
951
952
953 recalculatedEndPoint = true;
954 IntersectedOrRecalculatedFT = CurrentA_PointVelocity;
955 found_approximate_intersection = false;
956
957 std::ostringstream message;
959 message << "Convergence is requiring too many substeps: "
960 << substep_no << " ( limit = "<< fMaxSteps << ")"
962 <<
" Abandoning effort to intersect. " <<
G4endl <<
G4endl;
963 message << " Number of calls to MLL: " << fNumCalls;
964 message <<
" iteration = " << substep_no <<
G4endl <<
G4endl;
965
966 message.precision( 12 );
968 G4double full_len = CurveEndPointVelocity.GetCurveLength();
969 message << " Undertaken only length: " << done_len
970 <<
" out of " << full_len <<
" required." <<
G4endl
971 << " Remaining length = " << full_len - done_len;
972
973 message <<
" Start and end-point of requested Step:" <<
G4endl;
974 printStatus( CurveStartPointVelocity, CurveEndPointVelocity,
975 -1.0, NewSafety, 0, message, -1 );
976 message <<
" Start and end-point of current Sub-Step:" <<
G4endl;
977 printStatus( CurrentA_PointVelocity, CurrentA_PointVelocity,
978 -1.0, NewSafety, substep_no-1, message, -1 );
979 printStatus( CurrentA_PointVelocity, CurrentB_PointVelocity,
980 -1.0, NewSafety, substep_no, message, -1 );
981
983 }
984 else if( substep_no >= fWarnSteps)
985 {
986 std::ostringstream message;
987 message << "Many substeps while trying to locate intersection."
989 << " Undertaken length: "
991 <<
" - Needed: " << substep_no <<
" substeps." <<
G4endl
992 << " Warning number = " << fWarnSteps
993 << " and maximum substeps = " << fMaxSteps;
995 }
996 }
997
998 return (!there_is_no_intersection) && found_approximate_intersection;
999
1000}
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cerr
G4GLOB_DLL std::ostream G4cout
double dot(const Hep3Vector &) const
G4FieldTrack ApproxCurvePointV(const G4FieldTrack &curveAPointVelocity, const G4FieldTrack &curveBPointVelocity, const G4ThreeVector ¤tEPoint, G4double epsStep)
G4VIntegrationDriver * GetIntegrationDriver()
G4double GetCurveLength() const
G4ThreeVector GetPosition() const
G4double GetRestMass() const
static std::ostream & ReportEndChanges(std::ostream &os, const G4LocatorChangeLogger &startA, const G4LocatorChangeLogger &endB)
static std::ostream & ReportEndChanges(std::ostream &os, const std::vector< G4LocatorChangeRecord > &startA, const std::vector< G4LocatorChangeRecord > &endB)
virtual void LocateGlobalPointWithinVolume(const G4ThreeVector &position)
virtual G4bool DoesReIntegrate() const =0
G4double fiDeltaIntersection
G4Navigator * GetNavigatorFor()
G4ChordFinder * GetChordFinderFor()
G4ThreeVector GetSurfaceNormal(const G4ThreeVector &CurrentInt_Point, G4bool &validNormal)
void ReportTrialStep(G4int step_no, const G4ThreeVector &ChordAB_v, const G4ThreeVector &ChordEF_v, const G4ThreeVector &NewMomentumDir, const G4ThreeVector &NormalAtEntry, G4bool validNormal)
G4bool IntersectChord(const G4ThreeVector &StartPointA, const G4ThreeVector &EndPointB, G4double &NewSafety, G4double &PreviousSafety, G4ThreeVector &PreviousSftOrigin, G4double &LinearStepLength, G4ThreeVector &IntersectionPoint, G4bool *calledNavigator=nullptr)
G4bool CheckAndReEstimateEndpoint(const G4FieldTrack &CurrentStartA, const G4FieldTrack &EstimatedEndB, G4FieldTrack &RevisedEndPoint, G4int &errorCode)
void ReportProgress(std::ostream &oss, const G4FieldTrack &StartPointVel, const G4FieldTrack &EndPointVel, G4int substep_no, const G4FieldTrack &A_PtVel, const G4FieldTrack &B_PtVel, G4double safetyLast, G4int depth=-1)
G4double GetEpsilonStepFor()
void ReportImmediateHit(const char *MethodName, const G4ThreeVector &StartPosition, const G4ThreeVector &TrialPoint, G4double tolerance, unsigned long int numCalls)
G4bool GetAdjustementOfFoundIntersection()
void printStatus(const G4FieldTrack &startFT, const G4FieldTrack ¤tFT, G4double requestStep, G4double safety, G4int stepNum)
G4bool AdjustmentOfFoundIntersection(const G4ThreeVector &A, const G4ThreeVector &CurrentE_Point, const G4ThreeVector &CurrentF_Point, const G4ThreeVector &MomentumDir, const G4bool IntersectAF, G4ThreeVector &IntersectionPoint, G4double &NewSafety, G4double &fPrevSafety, G4ThreeVector &fPrevSftOrigin)
void ReportReversedPoints(std::ostringstream &ossMsg, const G4FieldTrack &StartPointVel, const G4FieldTrack &EndPointVel, G4double NewSafety, G4double epsStep, const G4FieldTrack &CurrentA_PointVelocity, const G4FieldTrack &CurrentB_PointVelocity, const G4FieldTrack &SubStart_PointVelocity, const G4ThreeVector &CurrentE_Point, const G4FieldTrack &ApproxIntersecPointV, G4int sbstp_no, G4int sbstp_no_p, G4int depth)