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 (
auto idepth=0; idepth<
max_depth; ++idepth )
240 {
241 fin_section_depth[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
281 }
282 }
283#endif
284 if( !validIntersectP ){
286 errmsg << "Assertion FAILURE - invalid (stale) Interection point. Substep: "
287 << substep_no <<
" call: " << fNumCalls <<
G4endl;
290 G4Exception(
"G4MultiLevelLocator::EstimateIntersectionPoint",
"GeomNav0004",
292 }
293
294
295
296
299 CurrentB_PointVelocity,
300 CurrentE_Point,
302
303
304#ifdef G4DEBUG_FIELD
306 substep_no, eventCount, ApproxIntersecPointV ) );
308 G4double checkVsEnd= lenB - lenIntsc;
309
310 if( lenIntsc > lenB )
311 {
312 std::ostringstream errmsg;
313 errmsg.precision(17);
315 G4double ratioTol = std::fabs(ratio) / tolerance;
316 errmsg <<
"Intermediate F point is past end B point" <<
G4endl
317 <<
" l( intersection ) = " << lenIntsc <<
G4endl
318 <<
" l( endpoint ) = " << lenB <<
G4endl;
319 errmsg.precision(8);
320 errmsg <<
" l_end - l_inters = " << checkVsEnd <<
G4endl
321 <<
" / l_end = " << ratio <<
G4endl
322 <<
" ratio / tolerance = " << ratioTol <<
G4endl;
323 if( ratioTol < 1.0 )
325 else
327 }
328#endif
329
330 G4ThreeVector CurrentF_Point= ApproxIntersecPointV.GetPosition();
331
332
333
334
335 G4ThreeVector ChordEF_Vector = CurrentF_Point - CurrentE_Point;
336
337 G4ThreeVector NewMomentumDir = ApproxIntersecPointV.GetMomentumDir();
338 G4double MomDir_dot_Norm = NewMomentumDir.
dot( NormalAtEntry );
339
340#ifdef G4DEBUG_FIELD
342 {
346 MomDir_dot_ABchord = (1.0 / ABchord_length)
347 * NewMomentumDir.
dot( ChordAB );
349 ChordEF_Vector, NewMomentumDir, NormalAtEntry, validNormalAtE );
350 G4cout <<
" dot( MomentumDir, ABchord_unit ) = "
351 << MomDir_dot_ABchord <<
G4endl;
352 }
353#endif
355 ( MomDir_dot_Norm >= 0.0 )
356 || (! validNormalAtE );
360 {
361 found_approximate_intersection = true;
362
363
364
365 IntersectedOrRecalculatedFT = ApproxIntersecPointV;
366 IntersectedOrRecalculatedFT.SetPosition( CurrentE_Point );
367
369 {
370
371
373 G4ThreeVector MomentumDir=ApproxIntersecPointV.GetMomentumDirection();
375 CurrentE_Point, CurrentF_Point, MomentumDir,
376 last_AF_intersection, IP, NewSafety,
377 previousSafety, previousSftOrigin );
378 if ( goodCorrection )
379 {
380 IntersectedOrRecalculatedFT = ApproxIntersecPointV;
381 IntersectedOrRecalculatedFT.SetPosition(IP);
382 }
383 }
384
385
386
387
388
389
390 }
391 else
392 {
393
394
395
396
397
399
402 G4bool Intersects_FB =
false;
404 NewSafety, previousSafety,
405 previousSftOrigin,
406 stepLengthAF,
407 PointG );
408 last_AF_intersection = Intersects_AF;
409 if( Intersects_AF )
410 {
411
412
413 CurrentB_PointVelocity = ApproxIntersecPointV;
414 CurrentE_Point = PointG;
415
416 validIntersectP = true;
417
420 validNormalAtE = validNormalLast;
421
422
423
424 fin_section_depth[depth] = false;
425
427 {
428 ++eventCount;
429 endChangeB.push_back(
431 substep_no, eventCount, CurrentB_PointVelocity) );
432 }
433#ifdef G4VERBOSE
435 {
436 G4cout <<
"G4PiF::LI> Investigating intermediate point"
437 << " at s=" << ApproxIntersecPointV.GetCurveLength()
438 << " on way to full s="
439 << CurveEndPointVelocity.GetCurveLength() <<
G4endl;
440 }
441#endif
442 }
443 else
444 {
445
446
447
448
450
453
454
455
456
458 NewSafety, previousSafety,
459 previousSftOrigin,
460 stepLengthFB,
461 PointH );
462 if( Intersects_FB )
463 {
464
465
466
467
468
469
470
471
472
473
474
475
476 CurrentA_PointVelocity = ApproxIntersecPointV;
477 CurrentE_Point = PointH;
478
479 validIntersectP = true;
480
483 validNormalAtE = validNormalH;
484
486 {
487 ++eventCount;
488 endChangeA.push_back(
490 substep_no, eventCount, CurrentA_PointVelocity) );
492
493 intersectH_pn.SetPosition( PointH );
494 intersectH_pn.SetMomentum( NormalAtEntry );
496 substep_no, eventCount, intersectH_pn );
497 }
498 }
499 else
500 {
501 validIntersectP = false;
502 if( fin_section_depth[depth] )
503 {
504
505
506
507
508
509
510
511
512 if( ((Second_half)&&(depth==0)) || (first_section) )
513 {
514 there_is_no_intersection = true;
515 }
516 else
517 {
518
519
520 substep_no_p = param_substeps+2;
521
522
523
524 Second_half = true;
525 sub_final_section = true;
526 }
527 }
528 else
529 {
530 CurrentA_PointVelocity = CurrentB_PointVelocity;
531 CurrentB_PointVelocity = (depth==0) ? CurveEndPointVelocity
532 : *ptrInterMedFT[depth] ;
533 SubStart_PointVelocity = CurrentA_PointVelocity;
534 restoredFullEndpoint = true;
535
536 validIntersectP = false;
537
539 {
540 ++eventCount;
541 endChangeA.push_back(
544 substep_no, eventCount, CurrentA_PointVelocity) );
545 endChangeB.push_back(
548 substep_no, eventCount, CurrentB_PointVelocity) );
549 }
550 }
551 }
552 }
553
554 G4int errorEndPt = 0;
555
556 G4bool recalculatedB=
false;
557 if( driverReIntegrates )
558 {
561 CurrentB_PointVelocity,
562 RevisedB_FT,
563 errorEndPt );
564 if( recalculatedB )
565 {
566 CurrentB_PointVelocity = RevisedB_FT;
567
568
569
570
571
572
573 if ( (fin_section_depth[depth])
574 &&( first_section || ((Second_half)&&(depth==0)) ) )
575 {
576 recalculatedEndPoint = true;
577 IntersectedOrRecalculatedFT = RevisedB_FT;
578
579 }
580
581
582
583
584
585 }
587 {
588 ++eventCount;
589 endChangeB.push_back(
591 substep_no, eventCount, RevisedB_FT ) );
592 }
593 }
594 else
595 {
597 errorEndPt = 2;
598 }
599
600 if( errorEndPt > 1 )
601 {
602 std::ostringstream errmsg;
603
605 CurveStartPointVelocity, CurveEndPointVelocity,
607 CurrentA_PointVelocity, CurrentB_PointVelocity,
608 SubStart_PointVelocity, CurrentE_Point,
609 ApproxIntersecPointV, substep_no, substep_no_p, depth);
610
613 }
614
615 errmsg <<
G4endl <<
" * Location: " << MethodName
616 <<
"- After EndIf(Intersects_AF)" <<
G4endl;
617 errmsg << " * Bool flags: Recalculated = " << recalculatedB
618 << " Intersects_AF = " << Intersects_AF
619 <<
" Intersects_FB = " << Intersects_FB <<
G4endl;
620 errmsg <<
" * Number of calls to MLL:EIP= " << fNumCalls <<
G4endl;
622 }
623 if( restoredFullEndpoint )
624 {
625 fin_section_depth[depth] = restoredFullEndpoint;
626 restoredFullEndpoint = false;
627 }
628 }
629
630
631#ifdef G4DEBUG_FIELD
632 if( trigger_substepno_print == 0)
633 {
634 trigger_substepno_print= fWarnSteps - 20;
635 }
636
637 if( substep_no >= trigger_substepno_print )
638 {
639 G4cout <<
"Difficulty in converging in " << MethodName
640 <<
" Substep no = " << substep_no <<
G4endl;
641 if( substep_no == trigger_substepno_print )
642 {
644 printStatus( CurveStartPointVelocity, CurveEndPointVelocity,
645 -1.0, NewSafety, 0 );
648 } else {
649 G4cout <<
" ** For more information enable 'check mode' in G4MultiLevelLocator "
650 <<
"-- (it saves and can output change records) " <<
G4endl;
651 }
652 }
654 printStatus( CurrentA_PointVelocity, CurrentA_PointVelocity,
655 -1.0, NewSafety, substep_no-1 );
657 printStatus( CurrentA_PointVelocity, CurrentB_PointVelocity,
658 -1.0, NewSafety, substep_no );
659 }
660#endif
661 ++substep_no;
662 ++substep_no_p;
663
664 } while ( ( ! found_approximate_intersection )
665 && ( ! there_is_no_intersection )
666 && validIntersectP
667 && ( substep_no_p <= param_substeps) );
668
669
670 if( (!found_approximate_intersection) && (!there_is_no_intersection) )
671 {
676
678
679
680
681
682 if( (did_len < fraction_done*all_len)
683 && (depth<max_depth) && (!sub_final_section) )
684 {
685#ifdef G4DEBUG_FIELD
687 biggest_depth = std::max(depth, biggest_depth);
688 ++numSplits;
689#endif
690 Second_half = false;
691 ++depth;
692 first_section = false;
693
694 G4double Sub_len = (all_len-did_len)/(2.);
697 integrDriver->AccurateAdvance(midPoint, Sub_len,
fiEpsilonStep);
698
699 ++fNumAdvanceTrials;
700 if( fullAdvance ) { ++fNumAdvanceFull; }
701
704
705 const G4double adequateFraction = (1.0-CLHEP::perThousand);
706 G4bool goodAdvance = (lenAchieved >= adequateFraction * Sub_len);
707 if ( goodAdvance ) { ++fNumAdvanceGood; }
708
709#ifdef G4DEBUG_FIELD
710 else
711 {
712 G4cout <<
"MLL> AdvanceChordLimited not full at depth=" << depth
713 << " total length achieved = " << lenAchieved << " of "
714 << Sub_len << " fraction= ";
715 if (Sub_len != 0.0 ) {
G4cout << lenAchieved / Sub_len; }
716 else {
G4cout <<
"DivByZero"; }
717 G4cout <<
" Good-enough fraction = " << adequateFraction;
718 G4cout <<
" Number of call to mll = " << fNumCalls
719 << " iteration " << substep_no
720 <<
" inner = " << substep_no_p <<
G4endl;
722 G4cout <<
" State at start is = " << CurrentA_PointVelocity
724 <<
" at end (midpoint)= " << midPoint <<
G4endl;
726
728 ReportFieldValue( CurrentA_PointVelocity, "start", equation );
729 ReportFieldValue( midPoint, "midPoint", equation );
730 G4cout <<
" Original Start = "
731 << CurveStartPointVelocity <<
G4endl;
732 G4cout <<
" Original End = "
733 << CurveEndPointVelocity <<
G4endl;
734 G4cout <<
" Original TrialPoint = "
736 G4cout <<
" (this is STRICT mode) "
737 << " num Splits= " << numSplits;
739 }
740#endif
741
742 *ptrInterMedFT[depth] = midPoint;
743 CurrentB_PointVelocity = midPoint;
744
746 {
747 ++eventCount;
748 endChangeB.push_back(
750 substep_no, eventCount, midPoint) );
751 }
752
753
754
755 SubStart_PointVelocity = CurrentA_PointVelocity;
756
757
758
761
765 NewSafety, previousSafety,
766 previousSftOrigin, distAB,
767 PointGe);
768 if( Intersects_AB )
769 {
770 last_AF_intersection = Intersects_AB;
771 CurrentE_Point = PointGe;
772 fin_section_depth[depth] = true;
773
774 validIntersectP = true;
775
778 validNormalAtE = validNormalAB;
779 }
780 else
781 {
782
783
784
785 Second_half = true;
786
787 validIntersectP= false;
788 }
789 }
790
791 G4bool unfinished = Second_half;
792 while ( unfinished && (depth>0) )
793 {
794
795
796
797
798
799 SubStart_PointVelocity = *ptrInterMedFT[depth];
800 CurrentA_PointVelocity = *ptrInterMedFT[depth];
801 CurrentB_PointVelocity = *ptrInterMedFT[depth-1];
802
804 {
805 ++eventCount;
807 substep_no, eventCount, CurrentA_PointVelocity);
808 endChangeA.push_back( chngPop_a );
810 substep_no, eventCount, CurrentB_PointVelocity);
811 endChangeB.push_back( chngPop_b );
812 }
813
814
815
816
817 G4int errorEndPt = -1;
818 G4bool recalculatedB=
false;
819 if( driverReIntegrates )
820 {
821
822
823
824 G4FieldTrack RevisedEndPointFT = CurrentB_PointVelocity;
825 recalculatedB =
827 CurrentB_PointVelocity,
828 RevisedEndPointFT,
829 errorEndPt );
830 if( recalculatedB )
831 {
832 CurrentB_PointVelocity = RevisedEndPointFT;
833
834 if ( depth == 1 )
835 {
836 recalculatedEndPoint = true;
837 IntersectedOrRecalculatedFT = RevisedEndPointFT;
838
839 }
840 }
841 else
842 {
844 errorEndPt = 2;
845 }
846
848 {
849 ++eventCount;
850 endChangeB.push_back(
852 substep_no, eventCount, RevisedEndPointFT));
853 }
854 }
855 if( errorEndPt > 1 )
856 {
857 std::ostringstream errmsg;
859 CurveStartPointVelocity, CurveEndPointVelocity,
861 CurrentA_PointVelocity, CurrentB_PointVelocity,
862 SubStart_PointVelocity, CurrentE_Point,
863 ApproxIntersecPointV, substep_no, substep_no_p, depth);
864 errmsg <<
" * Location: " << MethodName <<
"- Second-Half" <<
G4endl;
865 errmsg <<
" * Recalculated = " << recalculatedB <<
G4endl;
867 }
868
874 previousSafety,
875 previousSftOrigin, distAB,
876 PointGi);
877 if( Intersects_AB )
878 {
879 last_AF_intersection = Intersects_AB;
880 CurrentE_Point = PointGi;
881
882 validIntersectP = true;
884 }
885 else
886 {
887 validIntersectP = false;
888 if( depth == 1)
889 {
890 there_is_no_intersection = true;
891 }
892 }
893 depth--;
894 fin_section_depth[depth] = true;
895 unfinished = !validIntersectP;
896 }
897#ifdef G4DEBUG_FIELD
898 if( ! ( validIntersectP || there_is_no_intersection ) )
899 {
900
901 G4cout <<
"MLL - WARNING Potential FAILURE: Conditions not met!"
903 <<
" Depth = " << depth <<
G4endl
904 <<
" Num Substeps= " << substep_no <<
G4endl;
905 G4cout <<
" Found intersection= " << found_approximate_intersection
909 CurveStartPointVelocity, CurveEndPointVelocity,
910 substep_no, CurrentA_PointVelocity,
911 CurrentB_PointVelocity,
912 NewSafety, depth );
914 }
915#endif
916 }
917
918 assert( validIntersectP || there_is_no_intersection
919 || found_approximate_intersection);
920
921 } while ( ( ! found_approximate_intersection )
922 && ( ! there_is_no_intersection )
923 && ( substep_no <= fMaxSteps) );
924
925 if( substep_no > max_no_seen )
926 {
927 max_no_seen = substep_no;
928#ifdef G4DEBUG_FIELD
929 if( max_no_seen > fWarnSteps )
930 {
931 trigger_substepno_print = max_no_seen-20;
932 }
933#endif
934 }
935
936 if( !there_is_no_intersection && !found_approximate_intersection )
937 {
938 if( substep_no >= fMaxSteps)
939 {
940
941
942 recalculatedEndPoint = true;
943 IntersectedOrRecalculatedFT = CurrentA_PointVelocity;
944 found_approximate_intersection = false;
945
946 std::ostringstream message;
948 message << "Convergence is requiring too many substeps: "
949 << substep_no << " ( limit = "<< fMaxSteps << ")"
951 <<
" Abandoning effort to intersect. " <<
G4endl <<
G4endl;
952 message << " Number of calls to MLL: " << fNumCalls;
953 message <<
" iteration = " << substep_no <<
G4endl <<
G4endl;
954
955 message.precision( 12 );
957 G4double full_len = CurveEndPointVelocity.GetCurveLength();
958 message << " Undertaken only length: " << done_len
959 <<
" out of " << full_len <<
" required." <<
G4endl
960 << " Remaining length = " << full_len - done_len;
961
962 message <<
" Start and end-point of requested Step:" <<
G4endl;
963 printStatus( CurveStartPointVelocity, CurveEndPointVelocity,
964 -1.0, NewSafety, 0, message, -1 );
965 message <<
" Start and end-point of current Sub-Step:" <<
G4endl;
966 printStatus( CurrentA_PointVelocity, CurrentA_PointVelocity,
967 -1.0, NewSafety, substep_no-1, message, -1 );
968 printStatus( CurrentA_PointVelocity, CurrentB_PointVelocity,
969 -1.0, NewSafety, substep_no, message, -1 );
970
972 }
973 else if( substep_no >= fWarnSteps)
974 {
975 std::ostringstream message;
976 message << "Many substeps while trying to locate intersection."
978 << " Undertaken length: "
980 <<
" - Needed: " << substep_no <<
" substeps." <<
G4endl
981 << " Warning number = " << fWarnSteps
982 << " and maximum substeps = " << fMaxSteps;
984 }
985 }
986
987 return (!there_is_no_intersection) && found_approximate_intersection;
988
989}
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)