47 fUseNormalCorrection(false),
48 fiNavigator( theNavigator ),
50 fiEpsilonStep( -1.0 ),
51 fiDeltaIntersection( -1.0 ),
90 if( ((stepNo == 0) && (verboseLevel <3)) || (verboseLevel >= 3) )
92 oldprc =
G4cout.precision(4);
93 G4cout << std::setw( 6) <<
" "
94 << std::setw( 25) <<
" Current Position and Direction" <<
" "
96 G4cout << std::setw( 5) <<
"Step#"
97 << std::setw(10) <<
" s " <<
" "
98 << std::setw(10) <<
"X(mm)" <<
" "
99 << std::setw(10) <<
"Y(mm)" <<
" "
100 << std::setw(10) <<
"Z(mm)" <<
" "
101 << std::setw( 7) <<
" N_x " <<
" "
102 << std::setw( 7) <<
" N_y " <<
" "
103 << std::setw( 7) <<
" N_z " <<
" " ;
104 G4cout << std::setw( 7) <<
" Delta|N|" <<
" "
105 << std::setw( 9) <<
"StepLen" <<
" "
106 << std::setw(12) <<
"StartSafety" <<
" "
107 << std::setw( 9) <<
"PhsStep" <<
" ";
111 if((stepNo == 0) && (verboseLevel <=3))
117 if( verboseLevel <= 3 )
121 G4cout << std::setw( 4) << stepNo <<
" ";
125 G4cout << std::setw( 5) <<
"Start" ;
127 oldprc =
G4cout.precision(8);
129 G4cout << std::setw(10) << CurrentPosition.
x() <<
" "
130 << std::setw(10) << CurrentPosition.
y() <<
" "
131 << std::setw(10) << CurrentPosition.
z() <<
" ";
133 G4cout << std::setw( 7) << CurrentUnitVelocity.
x() <<
" "
134 << std::setw( 7) << CurrentUnitVelocity.
y() <<
" "
135 << std::setw( 7) << CurrentUnitVelocity.
z() <<
" ";
140 G4cout << std::setw( 9) << step_len <<
" ";
141 G4cout << std::setw(12) << safety <<
" ";
142 if( requestStep != -1.0 )
144 G4cout << std::setw( 9) << requestStep <<
" ";
148 G4cout << std::setw( 9) <<
"Init/NotKnown" <<
" ";
157 G4cout <<
"Step taken was " << step_len
158 <<
" out of PhysicalStep= " << requestStep <<
G4endl;
160 G4cout <<
"Chord length = " << (CurrentPosition-StartPosition).mag()
182 const G4int no_trials= 20;
188 G4double advanceLength= endCurveLen - currentCurveLen ;
199 while( !goodAdvance && (++itrial < no_trials) );
203 retEndPoint= newEndPoint;
207 retEndPoint= EstimatedEndStateB;
213 static const G4String MethodName(
"G4VIntersectionLocator::ReEstimateEndpoint");
216 G4int latest_good_trials=0;
221 G4cout << MethodName <<
" called - goodAdv= " << goodAdvance
222 <<
" trials = " << itrial
223 <<
" previous good= " << latest_good_trials
226 latest_good_trials=0;
230 latest_good_trials++;
241 G4cout << MethodName <<
"> AccurateAdvance failed " ;
242 G4cout <<
" in " << itrial <<
" integration trials/steps. " <<
G4endl;
243 G4cout <<
" It went only " << lengthDone <<
" instead of " << curveDist
244 <<
" -- a difference of " << curveDist - lengthDone <<
G4endl;
245 G4cout <<
" ReEstimateEndpoint> Reset endPoint to original value!"
250 static G4int noInaccuracyWarnings = 0;
251 G4int maxNoWarnings = 10;
252 if ( (noInaccuracyWarnings < maxNoWarnings )
255 G4cerr <<
"G4PropagatorInField::LocateIntersectionPoint():"
257 <<
" Warning: Integration inaccuracy requires"
258 <<
" an adjustment in the step's endpoint." <<
G4endl
259 <<
" Two mid-points are further apart than their"
260 <<
" curve length difference" <<
G4endl
261 <<
" Dist = " << std::sqrt(linearDistSq)
262 <<
" curve length = " << curveDist <<
G4endl;
263 G4cerr <<
" Correction applied is "
270 static G4int noCorrections=0;
271 static G4double sumCorrectionsSq = 0;
275 sumCorrectionsSq += (EstimatedEndStateB.
GetPosition() -
278 linearDistSq -= curveDist;
315 if( (pLogical != 0) && ( (pSolid=pLogical->
GetSolid()) !=0 ) )
327 if( std::fabs(Normal.mag2() - 1.0 ) > perMille)
329 G4cerr <<
"PROBLEM in G4VIntersectionLocator::GetLocalSurfaceNormal."
331 G4cerr <<
" Normal is not unit - mag=" << Normal.mag() <<
G4endl;
332 G4cerr <<
" at trial local point " << CurrentE_Point <<
G4endl;
360 G4bool goodAdjust=
false, Intersects_FP=
false, validNormal=
false;
365 if(!validNormal) {
return false; }
376 <<
"G4VIntersectionLocator::AdjustementOfFoundIntersection()"
378 <<
" No intersection. Parallels lines!" <<
G4endl;
381 lambda =- Normal.
dot(CurrentF_Point-CurrentE_Point)/n_d_m;
385 NewPoint = CurrentF_Point+lambda*MomentumDir;
389 dist = std::abs(lambda);
401 fPreviousSafety, fPreviousSftOrigin,
402 stepLengthFP, Point_G );
409 Intersects_FP =
IntersectChord( CurrentF_Point, NewPoint, NewSafety,
410 fPreviousSafety, fPreviousSftOrigin,
411 stepLengthFP, Point_G );
416 IntersectionPoint = Point_G;
429 G4ThreeVector NormalAtEntryLast, NormalAtEntryGlobal, diffNormals;
435 NormalAtEntryLast = GetLastSurfaceNormal( CurrentInt_Point, validNormalLast );
443 && ( std::fabs(NormalAtEntryLast.
mag2() - 1.0) > perThousand ) )
445 std::ostringstream message;
446 message <<
"G4VIntersectionLocator::GetSurfaceNormal -- identified problem."
448 message <<
"PROBLEM: Normal is not unit - magnitude = "
450 message <<
" at trial intersection point " << CurrentInt_Point <<
G4endl;
451 message <<
" Obtained from Get *Last* Surface Normal." <<
G4endl;
452 G4Exception(
"G4VIntersectionLocator::GetGlobalSurfaceNormal()",
457 if( validNormalLast )
459 NormalAtEntry=NormalAtEntryLast;
461 validNormal = validNormalLast;
463 return NormalAtEntry;
471 GetLocalSurfaceNormal( CurrentE_Point, validNormal );
478 if( validNormal && ( std::fabs(globalNormal.
mag2() - 1.0) > perThousand ) )
480 std::ostringstream message;
481 message <<
"**************************************************************"
483 message <<
" Bad Normal in G4VIntersectionLocator::GetGlobalSurfaceNormal "
485 message <<
" * Constituents: " <<
G4endl;
486 message <<
" Local Normal= " << localNormal <<
G4endl;
487 message <<
" Transform: " <<
G4endl
490 <<
" Net Rotation = " << localToGlobal.
NetRotation()
492 message <<
" * Result: " <<
G4endl;
493 message <<
" Global Normal= " << localNormal <<
G4endl;
494 message <<
"**************************************************************"
496 G4Exception(
"G4VIntersectionLocator::GetGlobalSurfaceNormal()",
505G4VIntersectionLocator::GetLastSurfaceNormal(
const G4ThreeVector& intersectPoint,
506 G4bool& normalIsValid)
const
511 normalIsValid= validNorm;
524 G4double MomDir_dot_Norm = NewMomentumDir.
dot( NormalAtEntry ) ;
526 MomDir_dot_ABchord= (1.0 / ABchord_length) * NewMomentumDir.
dot( ChordAB_v );
528 std::ostringstream outStream;
530 << std::setw(6) <<
" Step# "
531 << std::setw(17) <<
" |ChordEF|(mag)" <<
" "
532 << std::setw(18) <<
" uMomentum.Normal" <<
" "
533 << std::setw(18) <<
" uMomentum.ABdir " <<
" "
534 << std::setw(16) <<
" AB-dist " <<
" "
535 <<
" Chord Vector (EF) "
537 outStream.precision(7);
539 <<
" " << std::setw(5) << step_no
540 <<
" " << std::setw(18) << ChordEF_v.
mag()
541 <<
" " << std::setw(18) << MomDir_dot_Norm
542 <<
" " << std::setw(18) << MomDir_dot_ABchord
543 <<
" " << std::setw(12) << ABchord_length
547 <<
" MomentumDir= " <<
" " << NewMomentumDir
548 <<
" Normal at Entry E= " << NormalAtEntry
549 <<
" AB chord = " << ChordAB_v
551 G4cout << outStream.str();
553 if( ( std::fabs(NormalAtEntry.
mag2() - 1.0) > perThousand ) )
555 G4cerr <<
" PROBLEM in G4VIntersectionLocator::ReportTrialStep " <<
G4endl
556 <<
" Normal is not unit - mag=" << NormalAtEntry.
mag()
557 <<
" ValidNormalAtE = " << validNormal
CLHEP::Hep3Vector G4ThreeVector
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
double dot(const Hep3Vector &) const
G4MagInt_Driver * GetIntegrationDriver()
const G4ThreeVector & GetMomentumDir() const
G4double GetCurveLength() const
G4ThreeVector GetPosition() const
G4ThreeVector GetMomentum() const
G4double GetSurfaceTolerance() const
static G4GeometryTolerance * GetInstance()
G4VSolid * GetSolid() const
G4bool AccurateAdvance(G4FieldTrack &y_current, G4double hstep, G4double eps, G4double hinitial=0.0)
const G4AffineTransform & GetTopTransform() const
G4TouchableHistory * CreateTouchableHistory() const
virtual void LocateGlobalPointWithinVolume(const G4ThreeVector &position)
virtual G4ThreeVector GetGlobalExitNormal(const G4ThreeVector &point, G4bool *valid)
const G4AffineTransform GetLocalToGlobalTransform() const
void SetWorldVolume(G4VPhysicalVolume *pWorld)
virtual G4VPhysicalVolume * LocateGlobalPointAndSetup(const G4ThreeVector &point, const G4ThreeVector *direction=0, const G4bool pRelativeSearch=true, const G4bool ignoreDirection=true)
const G4NavigationHistory * GetHistory() const
G4ThreeVector GetGlobalSurfaceNormal(const G4ThreeVector &CurrentE_Point, G4bool &validNormal)
G4Navigator * fiNavigator
G4Navigator * fHelpingNavigator
G4Navigator * GetNavigatorFor()
G4ChordFinder * GetChordFinderFor()
G4VIntersectionLocator(G4Navigator *theNavigator)
G4TouchableHistory * fpTouchable
virtual ~G4VIntersectionLocator()
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=0)
G4double GetEpsilonStepFor()
G4FieldTrack ReEstimateEndpoint(const G4FieldTrack &CurrentStateA, const G4FieldTrack &EstimtdEndStateB, G4double linearDistSq, G4double curveDist)
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 printStatus(const G4FieldTrack &startFT, const G4FieldTrack ¤tFT, G4double requestStep, G4double safety, G4int step)
G4LogicalVolume * GetLogicalVolume() const
virtual EInside Inside(const G4ThreeVector &p) const =0
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=0, G4ThreeVector *n=0) const =0
virtual G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const =0
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)