278 G4bool SuspiciousDaughterDist = ( sampleStep >= motherStep )
285 msg <<
" WARNING - Called with 'infinite' step. " <<
G4endl;
286 msg <<
" Checks have no meaning if daughter step is infinite." <<
G4endl;
289 msg <<
" sampleStep < kInfinity " << (sampleStep<
kInfinity) << G4endl;
291 msg <<
" Returning immediately.";
292 G4Exception(
"G4NavigationLogger::CheckDaughterEntryPoint()",
306 G4ThreeVector localExitMotherPos= localPoint+motherStep*localDirection;
312 G4ThreeVector localEntryInDaughter = localPoint+sampleStep*localDirection;
313 EInside insideMother= motherSolid->
Inside( localEntryInDaughter );
315 G4String solidResponse =
"-kInside-";
316 if (insideMother ==
kOutside) { solidResponse =
"-kOutside-"; }
317 else if (insideMother ==
kSurface) { solidResponse =
"-kSurface-"; }
319 G4double distToReEntry = distExitToReEntry + motherStep;
320 G4ThreeVector localReEntryPoint = localPoint+distToReEntry*localDirection;
323 G4bool DaughterEntryIsOutside = SuspiciousDaughterDist
324 && ( (sampleStep < distToReEntry) || (insideMother ==
kOutside ) );
328 G4ThreeVector sampleEntryPoint= samplePoint+sampleStep*sampleDirection;
331 G4double sampleExitDist = sampleStep+sampleCrossingDist;
332 G4ThreeVector sampleExitPoint= samplePoint+sampleExitDist*sampleDirection;
334 G4bool TransitProblem = ( (sampleStep < motherStep)
335 && (sampleExitDist > motherStep + kCarTolerance) )
336 || ( EntryIsMotherExit && (sampleCrossingDist > kCarTolerance) );
338 if( DaughterEntryIsOutside
340 || (SuspiciousDaughterDist && (fVerbose > 3) ) )
345 if( DaughterEntryIsOutside )
347 msg <<
"WARNING> Intersection distance to Daughter volume is further"
348 <<
" than the distance to boundary." <<
G4endl
349 <<
" It appears that part of the daughter volume is *outside*"
350 <<
" this mother. " <<
G4endl;
351 msg <<
" One of the following checks signaled a problem:" << G4endl
352 <<
" -sampleStep (dist to daugh) < mother-exit dist + distance "
353 <<
"to ReEntry point for mother " << G4endl
354 <<
" -position of daughter intersection is outside mother volume."
357 else if( TransitProblem )
359 G4double protrusion = sampleExitDist - motherStep;
361 msg <<
"WARNING> Daughter volume extends beyond mother boundary. "
363 if ( ( sampleStep < motherStep )
364 && (sampleExitDist > motherStep + kCarTolerance ) )
367 msg <<
" Crossing distance in the daughter causes is to extend"
368 <<
" beyond the mother exit. " <<
G4endl;
369 msg <<
" Length protruding = " << protrusion <<
G4endl;
371 if( EntryIsMotherExit )
374 msg <<
" Intersection distance to Daughter is within "
375 <<
" tolerance of the distance" <<
G4endl;
376 msg <<
" to the mother boundary * and * " <<
G4endl;
377 msg <<
" the crossing distance in the daughter is > tolerance."
383 msg <<
"NearMiss> Intersection to Daughter volume is in extension past the"
384 <<
" current exit point of the mother volume." <<
G4endl;
385 msg <<
" This is not an error - just an unusual occurence,"
386 <<
" possible in the case of concave volume. " <<
G4endl;
388 msg <<
"---- Information about intersection with daughter, mother: "
390 msg <<
" sampleStep (daughter) = " << sampleStep << G4endl
391 <<
" motherStep = " << motherStep << G4endl
392 <<
" distToRentry(mother) = " << distToReEntry << G4endl
393 <<
" Inside(entry pnt daug): " << solidResponse << G4endl
394 <<
" dist across daughter = " << sampleCrossingDist <<
G4endl;
395 msg <<
" Mother Name (Solid) : " << motherSolid->
GetName() << G4endl
396 <<
" In local (mother) coordinates: " << G4endl
397 <<
" Starting Point = " << localPoint << G4endl
398 <<
" Direction = " << localDirection << G4endl
399 <<
" Exit Point (mother)= " << localExitMotherPos << G4endl
400 <<
" Entry Point (daughter)= " << localPoint+sampleStep*localDirection
404 msg <<
" ReEntry Point (mother)= " << localReEntryPoint <<
G4endl;
408 msg <<
" No ReEntry - track does not encounter mother volume again! "
411 msg <<
" Daughter Name (Solid): " << sampleSolid->
GetName() << G4endl
412 <<
" In daughter coordinates: " << G4endl
413 <<
" Starting Point = " << samplePoint << G4endl
414 <<
" Direction = " << sampleDirection << G4endl
415 <<
" Entry Point (daughter)= " << sampleEntryPoint
417 msg <<
" Description of mother solid: " << G4endl
418 << *motherSolid << G4endl
419 <<
" Description of daughter solid: " << G4endl
420 << *sampleSolid <<
G4endl;
421 G4String fType = fId +
"::ComputeStep()";
423 if( DaughterEntryIsOutside || TransitProblem )
430 <<
" -- Checked distance of Entry to daughter vs exit of mother"
static const G4double kInfinity
std::ostringstream G4ExceptionDescription
G4double GetTolerance() const
G4GLOB_DLL std::ostream G4cout
virtual EInside Inside(const G4ThreeVector &p) const =0
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const =0
const G4double kCarTolerance
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
static constexpr double millimeter
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=0, G4ThreeVector *n=0) const =0