Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4VIntersectionLocator Class Referenceabstract

#include <G4VIntersectionLocator.hh>

+ Inheritance diagram for G4VIntersectionLocator:

Public Member Functions

 G4VIntersectionLocator (G4Navigator *theNavigator)
 
virtual ~G4VIntersectionLocator ()
 
virtual G4bool EstimateIntersectionPoint (const G4FieldTrack &curveStartPointTangent, const G4FieldTrack &curveEndPointTangent, const G4ThreeVector &trialPoint, G4FieldTrack &intersectPointTangent, G4bool &recalculatedEndPoint, G4double &fPreviousSafety, G4ThreeVector &fPreviousSftOrigin)=0
 
void printStatus (const G4FieldTrack &startFT, const G4FieldTrack &currentFT, G4double requestStep, G4double safety, G4int stepNum)
 
G4bool IntersectChord (const G4ThreeVector &StartPointA, const G4ThreeVector &EndPointB, G4double &NewSafety, G4double &PreviousSafety, G4ThreeVector &PreviousSftOrigin, G4double &LinearStepLength, G4ThreeVector &IntersectionPoint, G4bool *calledNavigator=nullptr)
 
void SetEpsilonStepFor (G4double EpsilonStep)
 
void SetDeltaIntersectionFor (G4double deltaIntersection)
 
void SetNavigatorFor (G4Navigator *fNavigator)
 
void SetChordFinderFor (G4ChordFinder *fCFinder)
 
void SetVerboseFor (G4int fVerbose)
 
G4int GetVerboseFor ()
 
G4double GetDeltaIntersectionFor ()
 
G4double GetEpsilonStepFor ()
 
G4NavigatorGetNavigatorFor ()
 
G4ChordFinderGetChordFinderFor ()
 
void SetSafetyParametersFor (G4bool UseSafety)
 
void AddAdjustementOfFoundIntersection (G4bool UseCorrection)
 
G4bool GetAdjustementOfFoundIntersection ()
 
void AdjustIntersections (G4bool UseCorrection)
 
G4bool AreIntersectionsAdjusted ()
 
void SetCheckMode (G4bool value)
 
G4bool GetCheckMode ()
 

Static Public Member Functions

static void printStatus (const G4FieldTrack &startFT, const G4FieldTrack &currentFT, G4double requestStep, G4double safety, G4int stepNum, std::ostream &oss, G4int verboseLevel)
 

Protected Member Functions

G4FieldTrack ReEstimateEndpoint (const G4FieldTrack &CurrentStateA, const G4FieldTrack &EstimtdEndStateB, G4double linearDistSq, G4double curveDist)
 
G4bool CheckAndReEstimateEndpoint (const G4FieldTrack &CurrentStartA, const G4FieldTrack &EstimatedEndB, G4FieldTrack &RevisedEndPoint, G4int &errorCode)
 
G4ThreeVector GetSurfaceNormal (const G4ThreeVector &CurrentInt_Point, G4bool &validNormal)
 
G4ThreeVector GetGlobalSurfaceNormal (const G4ThreeVector &CurrentE_Point, G4bool &validNormal)
 
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 ReportTrialStep (G4int step_no, const G4ThreeVector &ChordAB_v, const G4ThreeVector &ChordEF_v, const G4ThreeVector &NewMomentumDir, const G4ThreeVector &NormalAtEntry, G4bool validNormal)
 
G4bool LocateGlobalPointWithinVolumeAndCheck (const G4ThreeVector &pos)
 
void LocateGlobalPointWithinVolumeCheckAndReport (const G4ThreeVector &pos, const G4String &CodeLocationInfo, G4int CheckMode)
 
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)
 
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)
 
void ReportImmediateHit (const char *MethodName, const G4ThreeVector &StartPosition, const G4ThreeVector &TrialPoint, G4double tolerance, unsigned long int numCalls)
 

Protected Attributes

G4double kCarTolerance
 
G4int fVerboseLevel = 0
 
G4bool fUseNormalCorrection = false
 
G4bool fCheckMode = false
 
G4bool fiUseSafety = false
 
G4NavigatorfiNavigator
 
G4ChordFinderfiChordFinder = nullptr
 
G4double fiEpsilonStep = -1.0
 
G4double fiDeltaIntersection = -1.0
 
G4NavigatorfHelpingNavigator
 
G4TouchableHistoryfpTouchable = nullptr
 

Detailed Description

Definition at line 49 of file G4VIntersectionLocator.hh.

Constructor & Destructor Documentation

◆ G4VIntersectionLocator()

G4VIntersectionLocator::G4VIntersectionLocator ( G4Navigator theNavigator)

Definition at line 45 of file G4VIntersectionLocator.cc.

46 : fiNavigator(theNavigator)
47{
49
50 if( fiNavigator->GetExternalNavigation() == nullptr )
51 {
53 }
54 else // Must clone the navigator, together with External Navigation
55 {
57 }
58}
G4double GetSurfaceTolerance() const
static G4GeometryTolerance * GetInstance()
G4VExternalNavigation * GetExternalNavigation() const
G4Navigator * Clone() const

◆ ~G4VIntersectionLocator()

G4VIntersectionLocator::~G4VIntersectionLocator ( )
virtual

Definition at line 64 of file G4VIntersectionLocator.cc.

65{
66 delete fHelpingNavigator;
67 delete fpTouchable;
68}
G4TouchableHistory * fpTouchable

Member Function Documentation

◆ AddAdjustementOfFoundIntersection()

void G4VIntersectionLocator::AddAdjustementOfFoundIntersection ( G4bool  UseCorrection)
inline

◆ AdjustIntersections()

void G4VIntersectionLocator::AdjustIntersections ( G4bool  UseCorrection)
inline

◆ AdjustmentOfFoundIntersection()

G4bool G4VIntersectionLocator::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 
)
protected

Definition at line 439 of file G4VIntersectionLocator.cc.

449{
450 G4double dist,lambda;
451 G4ThreeVector Normal, NewPoint, Point_G;
452 G4bool goodAdjust = false, Intersects_FP = false, validNormal = false;
453
454 // Get SurfaceNormal of Intersecting Solid
455 //
456 Normal = GetGlobalSurfaceNormal(CurrentE_Point,validNormal);
457 if(!validNormal) { return false; }
458
459 // Intersection between Line and Plane
460 //
461 G4double n_d_m = Normal.dot(MomentumDir);
462 if ( std::abs(n_d_m)>kCarTolerance )
463 {
464#ifdef G4VERBOSE
465 if ( fVerboseLevel>1 )
466 {
467 G4Exception("G4VIntersectionLocator::AdjustmentOfFoundIntersection()",
468 "GeomNav0003", JustWarning,
469 "No intersection. Parallels lines!");
470 }
471#endif
472 lambda =- Normal.dot(CurrentF_Point-CurrentE_Point)/n_d_m;
473
474 // New candidate for Intersection
475 //
476 NewPoint = CurrentF_Point+lambda*MomentumDir;
477
478 // Distance from CurrentF to Calculated Intersection
479 //
480 dist = std::abs(lambda);
481
482 if ( dist<kCarTolerance*0.001 ) { return false; }
483
484 // Calculation of new intersection point on the path.
485 //
486 if ( IntersectAF ) // First part intersects
487 {
488 G4double stepLengthFP;
489 G4ThreeVector Point_P = CurrentA_Point;
491 Intersects_FP = IntersectChord( Point_P, NewPoint, NewSafety,
493 stepLengthFP, Point_G );
494
495 }
496 else // Second part intersects
497 {
498 G4double stepLengthFP;
500 Intersects_FP = IntersectChord( CurrentF_Point, NewPoint, NewSafety,
502 stepLengthFP, Point_G );
503 }
504 if ( Intersects_FP )
505 {
506 goodAdjust = true;
507 IntersectionPoint = Point_G;
508 }
509 }
510
511 return goodAdjust;
512}
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
#define fPreviousSftOrigin
#define fPreviousSafety
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
double dot(const Hep3Vector &) const
virtual void LocateGlobalPointWithinVolume(const G4ThreeVector &position)
Definition: G4Navigator.cc:600
G4ThreeVector GetGlobalSurfaceNormal(const G4ThreeVector &CurrentE_Point, G4bool &validNormal)
G4Navigator * GetNavigatorFor()
G4bool IntersectChord(const G4ThreeVector &StartPointA, const G4ThreeVector &EndPointB, G4double &NewSafety, G4double &PreviousSafety, G4ThreeVector &PreviousSftOrigin, G4double &LinearStepLength, G4ThreeVector &IntersectionPoint, G4bool *calledNavigator=nullptr)

Referenced by G4BrentLocator::EstimateIntersectionPoint(), G4MultiLevelLocator::EstimateIntersectionPoint(), and G4SimpleLocator::EstimateIntersectionPoint().

◆ AreIntersectionsAdjusted()

G4bool G4VIntersectionLocator::AreIntersectionsAdjusted ( )
inline

Definition at line 118 of file G4VIntersectionLocator.hh.

◆ CheckAndReEstimateEndpoint()

G4bool G4VIntersectionLocator::CheckAndReEstimateEndpoint ( const G4FieldTrack CurrentStartA,
const G4FieldTrack EstimatedEndB,
G4FieldTrack RevisedEndPoint,
G4int errorCode 
)
protected

Definition at line 329 of file G4VIntersectionLocator.cc.

334{
335 G4double linDistSq, curveDist;
336
337 G4bool recalculated = false;
338 curveError= 0;
339
340 linDistSq = ( EstimatedEndB.GetPosition()
341 - CurrentStartA.GetPosition() ).mag2();
342 curveDist = EstimatedEndB.GetCurveLength()
343 - CurrentStartA.GetCurveLength();
344 if( (curveDist>=0.0)
345 && (curveDist*curveDist *(1.0+2.0*fiEpsilonStep ) < linDistSq ) )
346 {
347 G4FieldTrack newEndPointFT = EstimatedEndB; // Unused
348
349 if (curveDist>0.0)
350 {
351 // Re-integrate to obtain a new B
352 RevisedEndPoint = ReEstimateEndpoint( CurrentStartA,
353 EstimatedEndB,
354 linDistSq,
355 curveDist );
356 recalculated = true;
357 }
358 else
359 {
360 // Zero length -> no advance!
361 newEndPointFT = CurrentStartA;
362 recalculated = true;
363 curveError = 1; // Unexpected co-incidence - milder mixup
364
365 G4Exception("G4MultiLevelLocator::EstimateIntersectionPoint()",
366 "GeomNav1002", JustWarning,
367 "A & B are at equal distance in 2nd half. A & B will coincide." );
368 }
369 }
370
371 // Sanity check
372 //
373 if( curveDist < 0.0 )
374 {
375 curveError = 2; // Real mixup
376 }
377 return recalculated;
378}
G4double GetCurveLength() const
G4ThreeVector GetPosition() const
G4FieldTrack ReEstimateEndpoint(const G4FieldTrack &CurrentStateA, const G4FieldTrack &EstimtdEndStateB, G4double linearDistSq, G4double curveDist)

Referenced by G4MultiLevelLocator::EstimateIntersectionPoint().

◆ EstimateIntersectionPoint()

virtual G4bool G4VIntersectionLocator::EstimateIntersectionPoint ( const G4FieldTrack curveStartPointTangent,
const G4FieldTrack curveEndPointTangent,
const G4ThreeVector trialPoint,
G4FieldTrack intersectPointTangent,
G4bool recalculatedEndPoint,
G4double fPreviousSafety,
G4ThreeVector fPreviousSftOrigin 
)
pure virtual

◆ GetAdjustementOfFoundIntersection()

G4bool G4VIntersectionLocator::GetAdjustementOfFoundIntersection ( )
inline

◆ GetCheckMode()

G4bool G4VIntersectionLocator::GetCheckMode ( )
inline

◆ GetChordFinderFor()

◆ GetDeltaIntersectionFor()

G4double G4VIntersectionLocator::GetDeltaIntersectionFor ( )
inline

◆ GetEpsilonStepFor()

◆ GetGlobalSurfaceNormal()

G4ThreeVector G4VIntersectionLocator::GetGlobalSurfaceNormal ( const G4ThreeVector CurrentE_Point,
G4bool validNormal 
)
protected

Definition at line 563 of file G4VIntersectionLocator.cc.

566{
567 G4ThreeVector localNormal = GetLocalSurfaceNormal(CurrentE_Point,validNormal);
568 G4AffineTransform localToGlobal = // Must use the same Navigator !!
570 G4ThreeVector globalNormal = localToGlobal.TransformAxis( localNormal );
571
572#ifdef G4DEBUG_FIELD
573 if( validNormal && ( std::fabs(globalNormal.mag2() - 1.0) > perThousand ) )
574 {
575 std::ostringstream message;
576 message << "**************************************************************"
577 << G4endl;
578 message << " Bad Normal in G4VIntersectionLocator::GetGlobalSurfaceNormal "
579 << G4endl;
580 message << " * Constituents: " << G4endl;
581 message << " Local Normal= " << localNormal << G4endl;
582 message << " Transform: " << G4endl
583 << " Net Translation= " << localToGlobal.NetTranslation()
584 << G4endl
585 << " Net Rotation = " << localToGlobal.NetRotation()
586 << G4endl;
587 message << " * Result: " << G4endl;
588 message << " Global Normal= " << localNormal << G4endl;
589 message << "**************************************************************";
590 G4Exception("G4VIntersectionLocator::GetGlobalSurfaceNormal()",
591 "GeomNav1002", JustWarning, message);
592 }
593#endif
594
595 return globalNormal;
596}
#define G4endl
Definition: G4ios.hh:57
double mag2() const
G4ThreeVector NetTranslation() const
G4RotationMatrix NetRotation() const
G4ThreeVector TransformAxis(const G4ThreeVector &axis) const
const G4AffineTransform GetLocalToGlobalTransform() const

Referenced by AdjustmentOfFoundIntersection().

◆ GetNavigatorFor()

◆ GetSurfaceNormal()

G4ThreeVector G4VIntersectionLocator::GetSurfaceNormal ( const G4ThreeVector CurrentInt_Point,
G4bool validNormal 
)
protected

Definition at line 518 of file G4VIntersectionLocator.cc.

521{
522 G4ThreeVector NormalAtEntry; // ( -10. , -10., -10. );
523
524 G4ThreeVector NormalAtEntryLast, NormalAtEntryGlobal, diffNormals;
525 G4bool validNormalLast;
526
527 // Relies on a call to Navigator::ComputeStep in IntersectChord before
528 // this call
529 //
530 NormalAtEntryLast = GetLastSurfaceNormal( CurrentInt_Point, validNormalLast );
531 // May return valid=false in cases, including
532 // - if the candidate volume was not found (eg exiting world), or
533 // - a replica was involved -- determined the step size.
534 // (This list is not complete.)
535
536#ifdef G4DEBUG_FIELD
537 if ( validNormalLast
538 && ( std::fabs(NormalAtEntryLast.mag2() - 1.0) > perThousand ) )
539 {
540 std::ostringstream message;
541 message << "PROBLEM: Normal is not unit - magnitude = "
542 << NormalAtEntryLast.mag() << G4endl;
543 message << " at trial intersection point " << CurrentInt_Point << G4endl;
544 message << " Obtained from Get *Last* Surface Normal.";
545 G4Exception("G4VIntersectionLocator::GetSurfaceNormal()",
546 "GeomNav1002", JustWarning, message);
547 }
548#endif
549
550 if( validNormalLast )
551 {
552 NormalAtEntry = NormalAtEntryLast;
553 }
554 validNormal = validNormalLast;
555
556 return NormalAtEntry;
557}
double mag() const

Referenced by G4BrentLocator::EstimateIntersectionPoint(), G4MultiLevelLocator::EstimateIntersectionPoint(), and G4SimpleLocator::EstimateIntersectionPoint().

◆ GetVerboseFor()

G4int G4VIntersectionLocator::GetVerboseFor ( )
inline

◆ IntersectChord()

G4bool G4VIntersectionLocator::IntersectChord ( const G4ThreeVector StartPointA,
const G4ThreeVector EndPointB,
G4double NewSafety,
G4double PreviousSafety,
G4ThreeVector PreviousSftOrigin,
G4double LinearStepLength,
G4ThreeVector IntersectionPoint,
G4bool calledNavigator = nullptr 
)
inline

◆ LocateGlobalPointWithinVolumeAndCheck()

G4bool G4VIntersectionLocator::LocateGlobalPointWithinVolumeAndCheck ( const G4ThreeVector pos)
protected

Definition at line 674 of file G4VIntersectionLocator.cc.

676{
677 G4bool good = true;
679 const G4String
680 MethodName("G4VIntersectionLocator::LocateGlobalPointWithinVolumeAndCheck()");
681
682 if( fCheckMode )
683 {
684 G4bool navCheck= nav->IsCheckModeActive(); // Recover original value
685 nav->CheckMode(true);
686
687 // Identify the current volume
688
690 G4VPhysicalVolume* motherPhys = startTH->GetVolume();
691 G4VSolid* motherSolid = startTH->GetSolid();
693 G4int motherCopyNo = motherPhys->GetCopyNo();
694
695 // Let's check that the point is inside the current solid
696 G4ThreeVector localPosition = transform.TransformPoint(position);
697 EInside inMother = motherSolid->Inside( localPosition );
698 if( inMother != kInside )
699 {
700 std::ostringstream message;
701 message << "Position located "
702 << ( inMother == kSurface ? " on Surface " : " outside " )
703 << "expected volume" << G4endl
704 << " Safety (from Outside) = "
705 << motherSolid->DistanceToIn(localPosition);
706 G4Exception("G4VIntersectionLocator::LocateGlobalPointWithinVolumeAndCheck()",
707 "GeomNav1002", JustWarning, message);
708 }
709
710 // 1. Simple next step - quick relocation and check result.
711 // nav->LocateGlobalPointWithinVolume( position );
712
713 // 2. Full relocation - to cross-check answer !
715 if( (nextPhysical != motherPhys)
716 || (nextPhysical->GetCopyNo() != motherCopyNo )
717 )
718 {
719 G4Exception("G4VIntersectionLocator::LocateGlobalPointWithinVolumeAndCheck()",
720 "GeomNav1002", JustWarning,
721 "Position located outside expected volume.");
722 }
723 nav->CheckMode(navCheck); // Recover original value
724 }
725 else
726 {
728 }
729 return good;
730}
int G4int
Definition: G4Types.hh:85
G4ThreeVector TransformPoint(const G4ThreeVector &vec) const
void CheckMode(G4bool mode)
virtual G4TouchableHistoryHandle CreateTouchableHistoryHandle() const
virtual G4VPhysicalVolume * LocateGlobalPointAndSetup(const G4ThreeVector &point, const G4ThreeVector *direction=nullptr, const G4bool pRelativeSearch=true, const G4bool ignoreDirection=true)
Definition: G4Navigator.cc:132
G4bool IsCheckModeActive() const
const G4AffineTransform & GetGlobalToLocalTransform() const
virtual G4int GetCopyNo() const =0
virtual EInside Inside(const G4ThreeVector &p) const =0
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const =0
EInside
Definition: geomdefs.hh:67
@ kInside
Definition: geomdefs.hh:70
@ kSurface
Definition: geomdefs.hh:69

Referenced by LocateGlobalPointWithinVolumeCheckAndReport().

◆ LocateGlobalPointWithinVolumeCheckAndReport()

void G4VIntersectionLocator::LocateGlobalPointWithinVolumeCheckAndReport ( const G4ThreeVector pos,
const G4String CodeLocationInfo,
G4int  CheckMode 
)
protected

Definition at line 736 of file G4VIntersectionLocator.cc.

740{
741 // Save value of Check mode first
742 G4bool oldCheck = GetCheckMode();
743
745 if( !ok )
746 {
747 std::ostringstream message;
748 message << "Failed point location." << G4endl
749 << " Code Location info: " << CodeLocationInfo;
750 G4Exception("G4VIntersectionLocator::LocateGlobalPointWithinVolumeCheckAndReport()",
751 "GeomNav1002", JustWarning, message);
752 }
753
754 SetCheckMode( oldCheck );
755}
G4bool LocateGlobalPointWithinVolumeAndCheck(const G4ThreeVector &pos)

◆ printStatus() [1/2]

void G4VIntersectionLocator::printStatus ( const G4FieldTrack startFT,
const G4FieldTrack currentFT,
G4double  requestStep,
G4double  safety,
G4int  stepNum 
)

Definition at line 75 of file G4VIntersectionLocator.cc.

80{
81 std::ostringstream os;
82 printStatus( StartFT,CurrentFT,requestStep,safety,stepNo,os,fVerboseLevel);
83 G4cout << os.str();
84}
G4GLOB_DLL std::ostream G4cout
void printStatus(const G4FieldTrack &startFT, const G4FieldTrack &currentFT, G4double requestStep, G4double safety, G4int stepNum)

Referenced by G4BrentLocator::EstimateIntersectionPoint(), G4MultiLevelLocator::EstimateIntersectionPoint(), G4SimpleLocator::EstimateIntersectionPoint(), printStatus(), ReportProgress(), and ReportReversedPoints().

◆ printStatus() [2/2]

void G4VIntersectionLocator::printStatus ( const G4FieldTrack startFT,
const G4FieldTrack currentFT,
G4double  requestStep,
G4double  safety,
G4int  stepNum,
std::ostream &  oss,
G4int  verboseLevel 
)
static

Definition at line 91 of file G4VIntersectionLocator.cc.

98{
99 // const G4int verboseLevel= fVerboseLevel;
100 const G4ThreeVector StartPosition = StartFT.GetPosition();
101 const G4ThreeVector StartUnitVelocity = StartFT.GetMomentumDir();
102 const G4ThreeVector CurrentPosition = CurrentFT.GetPosition();
103 const G4ThreeVector CurrentUnitVelocity = CurrentFT.GetMomentumDir();
104
105 G4double step_len = CurrentFT.GetCurveLength() - StartFT.GetCurveLength();
106 G4long oldprc; // cout/cerr precision settings
107
108 if( ((stepNo == 0) && (verboseLevel <3)) || (verboseLevel >= 3) )
109 {
110 oldprc = os.precision(4);
111 os << std::setw( 6) << " "
112 << std::setw( 25) << " Current Position and Direction" << " "
113 << G4endl;
114 os << std::setw( 5) << "Step#"
115 << std::setw(10) << " s " << " "
116 << std::setw(10) << "X(mm)" << " "
117 << std::setw(10) << "Y(mm)" << " "
118 << std::setw(10) << "Z(mm)" << " "
119 << std::setw( 7) << " N_x " << " "
120 << std::setw( 7) << " N_y " << " "
121 << std::setw( 7) << " N_z " << " " ;
122 os << std::setw( 7) << " Delta|N|" << " "
123 << std::setw( 9) << "StepLen" << " "
124 << std::setw(12) << "StartSafety" << " "
125 << std::setw( 9) << "PhsStep" << " ";
126 os << G4endl;
127 os.precision(oldprc);
128 }
129 if((stepNo == 0) && (verboseLevel <=3))
130 {
131 // Recurse to print the start values
132 //
133 printStatus( StartFT, StartFT, -1.0, safety, -1, os, verboseLevel);
134 }
135 if( verboseLevel <= 3 )
136 {
137 if( stepNo >= 0)
138 {
139 os << std::setw( 4) << stepNo << " ";
140 }
141 else
142 {
143 os << std::setw( 5) << "Start" ;
144 }
145 oldprc = os.precision(8);
146 os << std::setw(10) << CurrentFT.GetCurveLength() << " ";
147 os << std::setw(10) << CurrentPosition.x() << " "
148 << std::setw(10) << CurrentPosition.y() << " "
149 << std::setw(10) << CurrentPosition.z() << " ";
150 os.precision(4);
151 os << std::setw( 7) << CurrentUnitVelocity.x() << " "
152 << std::setw( 7) << CurrentUnitVelocity.y() << " "
153 << std::setw( 7) << CurrentUnitVelocity.z() << " ";
154 os.precision(3);
155 os << std::setw( 7)
156 << CurrentFT.GetMomentum().mag()- StartFT.GetMomentum().mag()
157 << " ";
158 os << std::setw( 9) << step_len << " ";
159 os << std::setw(12) << safety << " ";
160 if( requestStep != -1.0 )
161 {
162 os << std::setw( 9) << requestStep << " ";
163 }
164 else
165 {
166 os << std::setw( 9) << "Init/NotKnown" << " ";
167 }
168 os << G4endl;
169 os.precision(oldprc);
170 }
171 else // if( verboseLevel > 3 )
172 {
173 // Multi-line output
174
175 os << "Step taken was " << step_len
176 << " out of PhysicalStep= " << requestStep << G4endl;
177 os << "Final safety is: " << safety << G4endl;
178 os << "Chord length = " << (CurrentPosition-StartPosition).mag()
179 << G4endl;
180 os << G4endl;
181 }
182}
long G4long
Definition: G4Types.hh:87
double z() const
double x() const
double y() const

◆ ReEstimateEndpoint()

G4FieldTrack G4VIntersectionLocator::ReEstimateEndpoint ( const G4FieldTrack CurrentStateA,
const G4FieldTrack EstimtdEndStateB,
G4double  linearDistSq,
G4double  curveDist 
)
protected

Definition at line 188 of file G4VIntersectionLocator.cc.

197{
198 G4FieldTrack newEndPoint( CurrentStateA );
199 auto integrDriver = GetChordFinderFor()->GetIntegrationDriver();
200
201 G4FieldTrack retEndPoint( CurrentStateA );
202 G4bool goodAdvance;
203 G4int itrial = 0;
204 const G4int no_trials = 20;
205
206
207 G4double endCurveLen= EstimatedEndStateB.GetCurveLength();
208
209 do // Loop checking, 07.10.2016, JA
210 {
211 G4double currentCurveLen = newEndPoint.GetCurveLength();
212 G4double advanceLength = endCurveLen - currentCurveLen ;
213 if (std::abs(advanceLength)<kCarTolerance)
214 {
215 goodAdvance=true;
216 }
217 else
218 {
219 goodAdvance = integrDriver->AccurateAdvance(newEndPoint, advanceLength,
221 }
222 }
223 while( !goodAdvance && (++itrial < no_trials) );
224
225 if( goodAdvance )
226 {
227 retEndPoint = newEndPoint;
228 }
229 else
230 {
231 retEndPoint = EstimatedEndStateB; // Could not improve without major work !!
232 }
233
234 // All the work is done
235 // below are some diagnostics only -- before the return!
236 //
237 const G4String MethodName("G4VIntersectionLocator::ReEstimateEndpoint()");
238
239#ifdef G4VERBOSE
240 G4int latest_good_trials = 0;
241 if( itrial > 1)
242 {
243 if( fVerboseLevel > 0 )
244 {
245 G4cout << MethodName << " called - goodAdv= " << goodAdvance
246 << " trials = " << itrial
247 << " previous good= " << latest_good_trials
248 << G4endl;
249 }
250 latest_good_trials = 0;
251 }
252 else
253 {
254 ++latest_good_trials;
255 }
256#endif
257
258#ifdef G4DEBUG_FIELD
259 G4double lengthDone = newEndPoint.GetCurveLength()
260 - CurrentStateA.GetCurveLength();
261 if( !goodAdvance )
262 {
263 if( fVerboseLevel >= 3 )
264 {
265 G4cout << MethodName << "> AccurateAdvance failed " ;
266 G4cout << " in " << itrial << " integration trials/steps. " << G4endl;
267 G4cout << " It went only " << lengthDone << " instead of " << curveDist
268 << " -- a difference of " << curveDist - lengthDone << G4endl;
269 G4cout << " ReEstimateEndpoint> Reset endPoint to original value!"
270 << G4endl;
271 }
272 }
273 G4double linearDist = ( EstimatedEndStateB.GetPosition()
274 - CurrentStateA.GetPosition() ).mag();
275 static G4int noInaccuracyWarnings = 0;
276 G4int maxNoWarnings = 10;
277 if ( (noInaccuracyWarnings < maxNoWarnings )
278 || (fVerboseLevel > 1) )
279 {
280 G4ThreeVector move = newEndPoint.GetPosition()
281 - EstimatedEndStateB.GetPosition();
282 std::ostringstream message;
283 message.precision(12);
284 message << " Integration inaccuracy requires"
285 << " an adjustment in the step's endpoint." << G4endl
286 << " Two mid-points are further apart than their"
287 << " curve length difference" << G4endl
288 << " Dist = " << linearDist
289 << " curve length = " << curveDist << G4endl;
290 message << " Correction applied is " << move.mag() << G4endl
291 << " Old Estimated B position= "
292 << EstimatedEndStateB.GetPosition() << G4endl
293 << " Recalculated Position= "
294 << newEndPoint.GetPosition() << G4endl
295 << " Change ( new - old ) = " << move;
296 G4Exception("G4VIntersectionLocator::ReEstimateEndpoint()",
297 "GeomNav1002", JustWarning, message);
298 }
299/*
300#else
301 // Statistics on the RMS value of the corrections
302
303 static G4ThreadLocal G4int noCorrections = 0;
304 ++noCorrections;
305 if( goodAdvance )
306 {
307 static G4ThreadLocal G4double sumCorrectionsSq;
308 sumCorrectionsSq += (EstimatedEndStateB.GetPosition() -
309 newEndPoint.GetPosition()).mag2();
310 }
311*/
312#endif
313
314 return retEndPoint;
315}
G4VIntegrationDriver * GetIntegrationDriver()
G4ChordFinder * GetChordFinderFor()
G4double GetEpsilonStepFor()

Referenced by CheckAndReEstimateEndpoint(), G4BrentLocator::EstimateIntersectionPoint(), and G4SimpleLocator::EstimateIntersectionPoint().

◆ ReportImmediateHit()

void G4VIntersectionLocator::ReportImmediateHit ( const char *  MethodName,
const G4ThreeVector StartPosition,
const G4ThreeVector TrialPoint,
G4double  tolerance,
unsigned long int  numCalls 
)
protected

Definition at line 845 of file G4VIntersectionLocator.cc.

850{
851 static G4ThreadLocal unsigned int occurredOnTop= 0;
852 static G4ThreadLocal G4ThreeVector* ptrLast = nullptr;
853 if( ptrLast == nullptr )
854 {
855 ptrLast= new G4ThreeVector( DBL_MAX, DBL_MAX, DBL_MAX );
856 G4AutoDelete::Register(ptrLast);
857 }
858 G4ThreeVector &lastStart= *ptrLast;
859
860 if( (TrialPoint - StartPosition).mag2() < tolerance*tolerance)
861 {
862 static G4ThreadLocal unsigned int numUnmoved = 0;
863 static G4ThreadLocal unsigned int numStill = 0; // Still at same point
864
865 G4cout << "Intersection F == start A in " << MethodName;
866 G4cout << "Start Point: " << StartPosition << G4endl;
867 G4cout << " Start-Trial: " << TrialPoint - StartPosition;
868 G4cout << " Start-last: " << StartPosition - lastStart;
869
870 if( (StartPosition - lastStart).mag() < tolerance )
871 {
872 // We are at position of last 'Start' position - ie unmoved
873 ++numUnmoved;
874 ++numStill;
875 G4cout << " { Unmoved: " << " still#= " << numStill
876 << " total # = " << numUnmoved << " } - ";
877 }
878 else
879 {
880 numStill = 0;
881 }
882 G4cout << " Occurred: " << ++occurredOnTop;
883 G4cout << " out of total calls= " << numCalls;
884 G4cout << G4endl;
885 lastStart = StartPosition;
886 }
887} // End of ReportImmediateHit()
CLHEP::Hep3Vector G4ThreeVector
void Register(T *inst)
Definition: G4AutoDelete.hh:65
#define DBL_MAX
Definition: templates.hh:62
#define G4ThreadLocal
Definition: tls.hh:77

Referenced by G4MultiLevelLocator::EstimateIntersectionPoint().

◆ ReportProgress()

void G4VIntersectionLocator::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 
)
protected

Definition at line 813 of file G4VIntersectionLocator.cc.

822{
823 oss << "ReportProgress: Current status of intersection search: " << G4endl;
824 if( depth > 0 ) oss << " Depth= " << depth;
825 oss << " Substep no = " << substep_no << G4endl;
826 G4int verboseLevel = 5;
827 G4double safetyPrev = -1.0; // Add as argument ?
828
829 printStatus( StartPointVel, EndPointVel, -1.0, -1.0, -1,
830 oss, verboseLevel);
831 oss << " * Start and end-point of requested Step:" << G4endl;
832 oss << " ** State of point A: ";
833 printStatus( A_PtVel, A_PtVel, -1.0, safetyPrev, substep_no-1,
834 oss, verboseLevel);
835 oss << " ** State of point B: ";
836 printStatus( A_PtVel, B_PtVel, -1.0, safetyLast, substep_no,
837 oss, verboseLevel);
838}

Referenced by G4MultiLevelLocator::EstimateIntersectionPoint().

◆ ReportReversedPoints()

void G4VIntersectionLocator::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 
)
protected

Definition at line 761 of file G4VIntersectionLocator.cc.

772{
773 // Expect that 'msg' can hold the name of the calling method
774
775 // FieldTrack 'points' A and B have been tangled
776 // Whereas A should be before B, it is found that curveLen(B) < curveLen(A)
777 G4int verboseLevel= 5;
778 G4double curveDist = B_PtVel.GetCurveLength() - A_PtVel.GetCurveLength();
779 G4VIntersectionLocator::printStatus( A_PtVel, B_PtVel,
780 -1.0, NewSafety, substep_no, msg, verboseLevel );
781 msg << "Error in advancing propagation." << G4endl
782 << " The final curve point is NOT further along"
783 << " than the original!" << G4endl
784 << " Going *backwards* from len(A) = " << A_PtVel.GetCurveLength()
785 << " to len(B) = " << B_PtVel.GetCurveLength() << G4endl
786 << " Curve distance is " << curveDist / CLHEP::millimeter << " mm "
787 << G4endl
788 << " Point A' (start) is " << A_PtVel << G4endl
789 << " Point B' (end) is " << B_PtVel << G4endl;
790 msg << " fEpsStep= " << epsStep << G4endl << G4endl;
791
792 G4long oldprc = msg.precision(20);
793 msg << " In full precision, the position, momentum, E_kin, length, rest mass "
794 << " ... are: " << G4endl;
795 msg << " Point A[0] (Curve start) is " << StartPointVel << G4endl
796 << " Point S (Sub start) is " << SubStart_PtVel
797 << " Point A' (Current start) is " << A_PtVel << G4endl
798 << " Point E (Trial Point) is " << E_Point << G4endl
799 << " Point F (Intersection) is " << ApproxIntersecPointV << G4endl
800 << " Point B' (Current end) is " << B_PtVel << G4endl
801 << " Point B[0] (Curve end) is " << EndPointVel << G4endl
802 << G4endl
803 << " LocateIntersection parameters are : " << G4endl
804 << " Substep no (total) = " << substep_no << G4endl
805 << " Substep no = " << substep_no_p << " at depth= " << depth;
806 msg.precision(oldprc);
807}

Referenced by G4MultiLevelLocator::EstimateIntersectionPoint().

◆ ReportTrialStep()

void G4VIntersectionLocator::ReportTrialStep ( G4int  step_no,
const G4ThreeVector ChordAB_v,
const G4ThreeVector ChordEF_v,
const G4ThreeVector NewMomentumDir,
const G4ThreeVector NormalAtEntry,
G4bool  validNormal 
)
protected

Definition at line 618 of file G4VIntersectionLocator.cc.

624{
625 G4double ABchord_length = ChordAB_v.mag();
626 G4double MomDir_dot_Norm = NewMomentumDir.dot( NormalAtEntry );
627 G4double MomDir_dot_ABchord;
628 MomDir_dot_ABchord = (1.0 / ABchord_length) * NewMomentumDir.dot( ChordAB_v );
629
630 std::ostringstream outStream;
631 outStream << std::setw(6) << " Step# "
632 << std::setw(17) << " |ChordEF|(mag)" << " "
633 << std::setw(18) << " uMomentum.Normal" << " "
634 << std::setw(18) << " uMomentum.ABdir " << " "
635 << std::setw(16) << " AB-dist " << " "
636 << " Chord Vector (EF) "
637 << G4endl;
638 outStream.precision(7);
639 outStream << " " << std::setw(5) << step_no
640 << " " << std::setw(18) << ChordEF_v.mag()
641 << " " << std::setw(18) << MomDir_dot_Norm
642 << " " << std::setw(18) << MomDir_dot_ABchord
643 << " " << std::setw(12) << ABchord_length
644 << " " << ChordEF_v
645 << G4endl;
646 outStream << " MomentumDir= " << " " << NewMomentumDir
647 << " Normal at Entry E= " << NormalAtEntry
648 << " AB chord = " << ChordAB_v
649 << G4endl;
650 G4cout << outStream.str();
651
652 if( ( std::fabs(NormalAtEntry.mag2() - 1.0) > perThousand ) )
653 {
654 std::ostringstream message;
655 message << "Normal is not unit - mag= " << NormalAtEntry.mag() << G4endl
656 << " ValidNormalAtE = " << validNormal;
657 G4Exception("G4VIntersectionLocator::ReportTrialStep()",
658 "GeomNav1002", JustWarning, message);
659 }
660 return;
661}

Referenced by G4BrentLocator::EstimateIntersectionPoint(), G4MultiLevelLocator::EstimateIntersectionPoint(), and G4SimpleLocator::EstimateIntersectionPoint().

◆ SetCheckMode()

void G4VIntersectionLocator::SetCheckMode ( G4bool  value)
inline

Definition at line 130 of file G4VIntersectionLocator.hh.

130{ fCheckMode = value; }

Referenced by LocateGlobalPointWithinVolumeCheckAndReport().

◆ SetChordFinderFor()

void G4VIntersectionLocator::SetChordFinderFor ( G4ChordFinder fCFinder)
inline

◆ SetDeltaIntersectionFor()

void G4VIntersectionLocator::SetDeltaIntersectionFor ( G4double  deltaIntersection)
inline

◆ SetEpsilonStepFor()

void G4VIntersectionLocator::SetEpsilonStepFor ( G4double  EpsilonStep)
inline

◆ SetNavigatorFor()

void G4VIntersectionLocator::SetNavigatorFor ( G4Navigator fNavigator)
inline

◆ SetSafetyParametersFor()

void G4VIntersectionLocator::SetSafetyParametersFor ( G4bool  UseSafety)
inline

◆ SetVerboseFor()

void G4VIntersectionLocator::SetVerboseFor ( G4int  fVerbose)
inline

Member Data Documentation

◆ fCheckMode

◆ fHelpingNavigator

G4Navigator* G4VIntersectionLocator::fHelpingNavigator
protected

◆ fiChordFinder

G4ChordFinder* G4VIntersectionLocator::fiChordFinder = nullptr
protected

Definition at line 261 of file G4VIntersectionLocator.hh.

◆ fiDeltaIntersection

G4double G4VIntersectionLocator::fiDeltaIntersection = -1.0
protected

◆ fiEpsilonStep

G4double G4VIntersectionLocator::fiEpsilonStep = -1.0
protected

◆ fiNavigator

G4Navigator* G4VIntersectionLocator::fiNavigator
protected

Definition at line 259 of file G4VIntersectionLocator.hh.

Referenced by G4VIntersectionLocator().

◆ fiUseSafety

G4bool G4VIntersectionLocator::fiUseSafety = false
protected

Definition at line 257 of file G4VIntersectionLocator.hh.

◆ fpTouchable

G4TouchableHistory* G4VIntersectionLocator::fpTouchable = nullptr
protected

Definition at line 270 of file G4VIntersectionLocator.hh.

Referenced by ~G4VIntersectionLocator().

◆ fUseNormalCorrection

G4bool G4VIntersectionLocator::fUseNormalCorrection = false
protected

Definition at line 255 of file G4VIntersectionLocator.hh.

Referenced by AreIntersectionsAdjusted().

◆ fVerboseLevel

◆ kCarTolerance


The documentation for this class was generated from the following files: