49 #define State(X)  fpTrackState->X    50 #define fNewTrack State(fNewTrack)    51 #define fLimitedStep State(fLimitedStep)    52 #define fLimitTruth State(fLimitTruth)    53 #define fCurrentStepSize State(fCurrentStepSize)    54 #define fNoGeometriesLimiting State(fNoGeometriesLimiting)    55 #define fPreSafetyLocation State(fPreSafetyLocation)    56 #define fPreSafetyMinValue State(fPreSafetyMinValue)    57 #define fPreSafetyValues State(fPreSafetyValues)    58 #define fPreStepLocation  State(fPreStepLocation)    59 #define fMinSafety_PreStepPt State(fMinSafety_PreStepPt)    60 #define fCurrentPreStepSafety State(fCurrentPreStepSafety)    61 #define fPreStepCenterRenewed State(fPreStepCenterRenewed)    62 #define fMinStep State(fMinStep)    63 #define fTrueMinStep State(fTrueMinStep)    64 #define fLocatedVolume State(fLocatedVolume)    65 #define fLastLocatedPosition State(fLastLocatedPosition)    66 #define fEndState State(fEndState)    67 #define fFieldExertedForce State(fFieldExertedForce)    68 #define fRelocatedPoint State(fRelocatedPoint)    69 #define fSafetyLocation State(fSafetyLocation)    70 #define fMinSafety_atSafLocation State(fMinSafety_atSafLocation)    71 #define fNewSafetyComputed State(fNewSafetyComputed)    72 #define fLastStepNo State(fLastStepNo)    73 #define fCurrentStepNo State(fCurrentStepNo)   107    for( 
G4int num=0; num< G4ITNavigator::fMaxNav; ++num )
   165 #ifdef G4DEBUG_PATHFINDER   169     G4cout << 
" G4ITPathFinder::ComputeStep - entered " << 
G4endl;
   170     G4cout << 
"   - stepNo = "  << std::setw(4) << stepNo  << 
" "   171            << 
" navigatorId = " << std::setw(2) << navigatorNo  << 
" "   172            << 
" proposed step len = " << proposedStepLength << 
" " << 
G4endl;
   173     G4cout << 
" PF::ComputeStep requested step "    181     std::ostringstream message;
   182     message << 
"Bad Navigator ID !" << 
G4endl   183             << 
"        Requested Navigator ID = " << navigatorNo << 
G4endl   185     G4Exception(
"G4ITPathFinder::ComputeStep()", 
"GeomNav0002",
   208 #ifdef G4DEBUG_PATHFINDER   211           G4double moveLen= std::sqrt( moveLenSq ); 
   212           G4cout << 
" G4ITPathFinder::ComputeStep : Point moved since last step "   213                  << 
" -- at step # = " << stepNo << 
G4endl   214                  << 
" by " << moveLen  << 
" to " << newPosition << 
G4endl;      
   221        Locate( newPosition, newDirection ); 
   255 #ifdef  G4DEBUG_PATHFINDER   259       std::ostringstream message;
   260       message << 
"Number of geometries limiting the step not set." << 
G4endl   261               << 
"        Number of geometries limiting step = "   268 #ifdef G4DEBUG_PATHFINDER         273        std::ostringstream message;
   274        message << 
"Problem in step size request." << 
G4endl   275                << 
"        Error can be caused by incorrect process ordering."   276                << 
"        Being requested to make a step which is shorter"   277                << 
" than the minimum Step " << 
G4endl   278                << 
"        already computed for any Navigator/geometry during"   279                << 
" this tracking-step: " << 
G4endl   280                << 
"        This can happen due to an error in process ordering."   282                << 
"        Check that all physics processes are registered"   284                << 
"        before all processes with a navigator/geometry."   286                << 
"        If using pre-packaged physics list and/or"   288                << 
"        functionality, please report this error."   290                << 
"        Additional information for problem: "  << 
G4endl   291                << 
"        Steps request/proposed = " << proposedStepLength
   295                << 
"        MinimumStep (navraw)  = " << 
fMinStep   297                << 
"        Navigator raw return value" << 
G4endl   298                << 
"        Requested step now = " << proposedStepLength
   300                << 
"        Difference min-req = "   302                << 
"     -- Step info> stepNo= " << stepNo
   317            G4cout << 
" G4P::CS -> Not calling DoNextLinearStep: "    318                   << 
" stepNo= " << stepNo << 
" last= " << 
fLastStepNo    336 #ifdef G4DEBUG_PATHFINDER   339     G4cout << 
" G4ITPathFinder::ComputeStep returns "   341            << 
" for Navigator " << navigatorNo 
   342            << 
" Limited step = " << limitedStep 
   343            << 
" Safety(mm) = " << pNewSafety / 
mm    375   std::vector<G4ITNavigator*>::iterator pNavigatorIter;
   380     std::ostringstream message;
   381     message << 
"Too many active Navigators / worlds." << 
G4endl   382             << 
"        Transportation Manager has "   384             << 
"        This is more than the number allowed = "   385             << G4ITNavigator::fMaxNav << 
" !";
   386     G4Exception(
"G4ITPathFinder::PrepareNewTrack()", 
"GeomNav0002",
   408   if( fNoActiveNavigators > 1 )
   410      Locate( position, direction, 
false );   
   448     std::ostringstream message;
   449     message << 
"Endpoint moved between value returned by ComputeStep()"   450             << 
" and call to Locate(). " << 
G4endl   451             << 
"          Change of " << Quantity << 
" is "   453             << 
"          and its vector is "   454             << (1.0/
mm) * moveVec << 
" mm " << 
G4endl   455             << 
"          Endpoint of ComputeStep() was " << OldVector << 
G4endl   456             << 
"          and current position to locate is " << NewVector;
   457     G4Exception(
"G4ITPathFinder::ReportMove()", 
"GeomNav1002",
   469   std::vector<G4ITNavigator*>::iterator pNavIter=
   478      ReportMove( position, lastEndPosition, 
"Position" ); 
   482 #ifdef G4DEBUG_PATHFINDER   486     G4cout << 
" G4ITPathFinder::Locate : entered " << 
G4endl;
   488     G4cout << 
"   Locating at position " << position
   489            << 
"  with direction " << direction 
   490            << 
"  relative= " << relative << 
G4endl;
   493        G4cout << 
"  lastEndPosition = " << lastEndPosition
   494               << 
"  moveVec = " << moveVec
   508      if( 
fLimitTruth[num] ) { (*pNavIter)->SetGeometricallyLimitedStep(); }
   511      (*pNavIter)->LocateGlobalPointAndSetup( position, &direction,
   523 #ifdef G4DEBUG_PATHFINDER   527               << 
"  gives volume= " << pLocated ; 
   530          G4cout << 
"  name = '" << pLocated->GetName() << 
"'"; 
   531          G4cout << 
" - CopyNo= " << pLocated->GetCopyNo(); 
   545   std::vector<G4ITNavigator*>::iterator pNavIter=
   548 #ifdef G4DEBUG_PATHFINDER   573   G4double distCheckEnd_sq= ( moveLenEndPosSq - endPointSafety_Est1 
   574                                                *endPointSafety_Est1 ); 
   578   G4bool longMoveEnd = distCheckEnd_sq > 0.0; 
   579   G4bool longMoveSaf = distCheckSaf_sq > 0.0; 
   583   if( (!
fNewTrack) && ( longMoveEnd && longMoveSaf ) )
   594      G4double  distCheckRevisedEnd= moveLenEndPosSq-revisedSafety*revisedSafety;
   596      G4bool  longMoveRevisedEnd=  ( distCheckRevisedEnd > 0. ) ; 
   599      G4double  moveLenEndPosition= std::sqrt( moveLenEndPosSq );
   600      moveMinusSafety = moveLenEndPosition - revisedSafety; 
   602      if ( longMoveRevisedEnd && (moveMinusSafety > 0.0 )
   603        && ( revisedSafety > 0.0 ) )
   610            G4cout << 
" G4PF:Relocate> Ratio to revised safety is "    611                   << std::fabs(moveMinusSafety)/revisedSafety << 
G4endl;
   614         G4double  absMoveMinusSafety= std::fabs(moveMinusSafety);
   615         G4bool smallRatio= absMoveMinusSafety < kRadTolerance * revisedSafety ; 
   618                                                 std::fabs(position.
y())), 
   619                                       std::fabs(position.
z()) );
   620         G4bool smallValue= absMoveMinusSafety < cErrorTolerance * maxCoordPos;
   621         if( ! (smallRatio || smallValue) )
   623            G4cout << 
" G4PF:Relocate> Ratio to revised safety is "    624                   << std::fabs(moveMinusSafety)/revisedSafety << 
G4endl;
   625            G4cout << 
" Difference of move and safety is not very small."   630           moveMinusSafety = 0.0; 
   631           longMoveRevisedEnd = 
false;   
   633           G4cout << 
" Difference of move & safety is very small in magnitude, "   634                  << absMoveMinusSafety << 
G4endl;
   637             G4cout << 
" ratio to safety " << revisedSafety 
   638                    << 
" is " <<  absMoveMinusSafety / revisedSafety
   639                    << 
"smaller than " << kRadTolerance << 
" of safety ";
   643             G4cout << 
" as fraction " << absMoveMinusSafety / maxCoordPos 
   644                    << 
" of position vector max-coord " << maxCoordPos
   645                    << 
" smaller than " << cErrorTolerance ;
   647           G4cout << 
" -- reset moveMinusSafety to "   648                  << moveMinusSafety << 
G4endl;
   652      if ( longMoveEnd && longMoveSaf
   653        && longMoveRevisedEnd && (moveMinusSafety>0.0) )
   656         std::ostringstream message;
   657         message << 
"ReLocation is further than end-safety value." << 
G4endl   658                 << 
" Moved from last endpoint by " << moveLenEndPosition 
   659                 << 
" compared to end safety (from preStep point) = "    660                 << endPointSafety_Est1 << 
G4endl   667                 << 
"  --> last EndStep Location was " << lastEndPosition
   669                 << 
"       safety value =  " << endPointSafety_Est1 
   670                 << 
" raw-value = " << endPointSafety_raw << 
G4endl   671                 << 
"  --> Calling again at this endpoint, we get "   672                 <<  revisedSafety << 
" as safety value."  << 
G4endl   673                 << 
"  --> last position for safety " << fSafetyLocation
   677                 << 
"       move from safety location = "   678                 << std::sqrt(moveLenSafSq) << 
G4endl   679                 << 
"         again= " << moveVecSafety.
mag() << 
G4endl   680                 << 
"       safety - Move-from-end= "    681                 << revisedSafety - moveLenEndPosition
   682                 << 
" (negative is Bad.)" << 
G4endl   683                 << 
" Debug:  distCheckRevisedEnd = "   684                 << distCheckRevisedEnd;
   685         ReportMove( lastEndPosition, position, 
"Position" ); 
   686         G4Exception(
"G4ITPathFinder::ReLocate", 
"GeomNav0003",
   688         G4cout.precision(oldPrec); 
   695     G4cout << 
" G4ITPathFinder::ReLocate : entered " << 
G4endl;
   697     G4cout << 
"  *Re*Locating at position " << position  << 
G4endl; 
   702        G4cout << 
"  lastEndPosition = " << lastEndPosition
   703               << 
"  moveVec from step-end = " << moveVecEndPos
   708 #endif // G4DEBUG_PATHFINDER   714      (*pNavIter)->LocateGlobalPointWithinVolume( position ); 
   726 #ifdef G4DEBUG_PATHFINDER   729     G4cout << 
" G4ITPathFinder::ReLocate : exiting "   743    std::vector<G4ITNavigator*>::iterator pNavigatorIter;
   748       G4double safety = (*pNavigatorIter)->ComputeSafety( position,
true );
   749       if( safety < minSafety ) { minSafety = safety; } 
   756 #ifdef G4DEBUG_PATHFINDER   759      G4cout << 
" G4ITPathFinder::ComputeSafety - returns "   760             << minSafety << 
" at location " << position << 
G4endl;
   772 #ifdef G4DEBUG_PATHFINDER   775     G4cout << 
"G4ITPathFinder::CreateTouchableHandle : navId = "   781   touchHist= 
GetNavigator(navId) -> CreateTouchableHistory(); 
   784   if( locatedVolume == 0 )
   791 #ifdef G4DEBUG_PATHFINDER   795     if( locatedVolume ) { VolumeName= locatedVolume->
GetName(); }
   796     G4cout << 
" Touchable History created at address " << touchHist
   797            << 
"  volume = " << locatedVolume << 
" name= " << VolumeName
   809   std::vector<G4ITNavigator*>::iterator pNavigatorIter;
   813   const G4int IdTransport= 0;  
   816 #ifdef G4DEBUG_PATHFINDER   819     G4cout << 
" G4ITPathFinder::DoNextLinearStep : entered " << 
G4endl;
   820     G4cout << 
"   Input field track= " << initialState << 
G4endl;
   821     G4cout << 
"   Requested step= " << proposedStepLength << 
G4endl;
   838   MagShift= std::sqrt(MagSqShift) ;
   840 #ifdef G4PATHFINDER_OPTIMISATION   852   if( proposedStepLength < fullSafety ) 
   863         minSafety= 
std::min( safety, minSafety ); 
   868 #ifdef G4DEBUG_PATHFINDER   871        G4cout << 
"G4ITPathFinder::DoNextLinearStep : Quick Stepping. " << 
G4endl   872                << 
" proposedStepLength " <<  proposedStepLength
   873                << 
" < (full) safety = " << fullSafety 
   874                << 
" at " << initialPosition 
   880 #endif   // End of G4PATHFINDER_OPTIMISATION 1   894 #ifdef G4PATHFINDER_OPTIMISATION   895         if( proposedStepLength <= safety )  
   901 #ifdef G4DEBUG_PATHFINDER   903            G4cout << 
"G4ITNavigator::ComputeStep> small proposed step = "   904                   << proposedStepLength
   905                   << 
" <=  safety = " << safety << 
" for nav " << num 
   906                   << 
" Step fully taken. " << 
G4endl;
   910 #endif   // End of G4PATHFINDER_OPTIMISATION 2   912 #ifdef G4DEBUG_PATHFINDER   915            step= (*pNavigatorIter)->ComputeStep( initialPosition, 
   924 #ifdef G4DEBUG_PATHFINDER   928              G4cout << 
"G4ITNavigator::ComputeStep> long  proposed step = "   929                     << proposedStepLength
   930                     << 
"  >  safety = " << previousSafety
   931                     << 
" for nav " << num 
   932                     << 
" .  New safety = " << safety << 
" step= " << step
   946         minSafety= 
std::min( safety, minSafety ); 
   948 #ifdef G4DEBUG_PATHFINDER   951           G4cout << 
"G4ITPathFinder::DoNextLinearStep : Navigator ["   952                  << num << 
"] -- step size " << step << 
G4endl;
   960      fPreSafetyLocation=  initialPosition; 
   973      minStep = proposedStepLength;   
   982   endPosition= initialPosition + minStep * initialDirection ; 
   984 #ifdef G4DEBUG_PATHFINDER   987     G4cout << 
"G4ITPathFinder::DoNextLinearStep : "   988            << 
" initialPosition = " << initialPosition 
   989            << 
" and endPosition = " << endPosition<< 
G4endl;
   994   fEndState.SetProperTimeOfFlight( -1.000 );   
  1010 #ifdef G4DEBUG_PATHFINDER  1013     G4cout << 
" G4ITPathFinder::DoNextLinearStep : exits returning "  1027   G4int num=-1, last=-1; 
  1031   const G4int IdTransport= 0;  
  1038   if( transportLimited )  { 
  1065   if( (last > -1) && (noLimited == 1 ) )
  1070 #ifdef G4DEBUG_PATHFINDER  1075       G4cout << 
" G4ITPathFinder::WhichLimited - exiting. " << 
G4endl;
  1085   G4cout << 
"G4ITPathFinder::PrintLimited reports: " ;
  1091     G4cout << std::setw(5) << 
" Step#"  << 
" "  1092            << std::setw(5) << 
" NavId"  << 
" "  1093            << std::setw(12) << 
" step-size " << 
" "  1094            << std::setw(12) << 
" raw-size "  << 
" "  1095            << std::setw(12) << 
" pre-safety " << 
" "   1096            << std::setw(15) << 
" Limited / flag"  << 
" "  1097            << std::setw(15) << 
"  World "  << 
" "  1112            << std::setw(5) << num  << 
" "  1113            << std::setw(12) << stepLen << 
" "  1114            << std::setw(12) << rawStep << 
" "  1116            << std::setw(5) << (
fLimitTruth[num] ? 
"YES" : 
" NO") << 
" ";
  1118     G4cout << 
" " << std::setw(15) << limitedStr << 
" ";  
  1119     G4cout.precision(oldPrec); 
  1128            WorldName = pWorld->
GetName(); 
  1131     G4cout << 
" " << WorldName ; 
  1137     G4cout << 
" G4ITPathFinder::PrintLimited - exiting. " << 
G4endl;
  1146   const G4double toleratedRelativeError= 1.0e-10; 
  1152 #ifdef G4DEBUG_PATHFINDER  1156     G4cout << 
" G4ITPathFinder::DoNextCurvedStep ****** " << 
G4endl;
  1157     G4cout << 
" Initial value of field track is " << fieldTrack 
  1158            << 
" and proposed step= " << proposedStepLength  << 
G4endl;
  1171         safety= 
fpNavigator[numNav]->ComputeSafety( startPoint, 
false );
  1174         minSafety = 
std::min( safety, minSafety ); 
  1215 #ifdef G4DEBUG_PATHFINDER  1218     G4cout << 
"G4ITPathFinder::DoNextCurvedStep : " << 
G4endl  1219            << 
" initialState = " << initialState << 
G4endl  1221     G4cout << 
"G4ITPathFinder::DoNextCurvedStep : "  1222            << 
" minStep = " << minStep 
  1223            << 
" proposedStepLength " << proposedStepLength 
  1224            << 
" safety = " << newSafety << 
G4endl;
  1228   if( minStep < proposedStepLength ) 
  1236       G4double finalStep, lastPreSafety=0.0, minStepLast;
  1241                                                      minStepLast, didLimit );
  1250         diffStep = (finalStep-minStepLast);
  1251         if ( std::abs(diffStep) <= toleratedRelativeError * finalStep ) 
  1255         currentStepSize += diffStep; 
  1272       if( limited ) { noLimited++; }
  1274 #ifdef G4DEBUG_PATHFINDER  1275       G4bool StepError= (currentStepSize < 0) 
  1276                    || ( (minStepLast != 
kInfinity) && (diffStep < 0) ) ; 
  1281         G4cout << 
" G4ITPathFinder::ComputeStep. Geometry " << numNav
  1283                << 
" from final-step= " << finalStep 
  1285                << 
" minStepLast= "  << minStepLast 
  1286                << 
"  limited = " << (
fLimitTruth[numNav] ? 
"YES" : 
" NO")
  1288         G4cout << 
"  status = " << limitedString << 
" #= " << didLimit
  1293           std::ostringstream message;
  1294           message << 
"Incorrect calculation of step size for one navigator"  1296                   << 
"        currentStepSize = " << currentStepSize 
  1297                   << 
", diffStep= " << diffStep << G4endl
  1298                   << 
"ERROR in computing step size for this navigator.";
  1308   else if ( (minStep == proposedStepLength)  
  1310             || ( std::abs(minStep-proposedStepLength)
  1311                < toleratedRelativeError * proposedStepLength ) )
  1320     currentStepSize= minStep;
  1332     std::ostringstream message;
  1333     message << 
"Incorrect calculation of step size for one navigator." << 
G4endl  1334             << 
"        currentStepSize = " << minStep << 
" is larger than "  1335             << 
" proposed StepSize = " << proposedStepLength << 
".";
  1340 #ifdef G4DEBUG_PATHFINDER  1343     G4cout << 
" Exiting G4ITPathFinder::DoNextCurvedStep " << 
G4endl;
  1355                   StrUnique(
"Unique"),
  1356                   StrUndefined(
"Undefined"),
  1357                   StrSharedTransport(
"SharedTransport"),  
  1358                   StrSharedOther(
"SharedOther");
  1363      case kDoNot:  limitedStr= &StrDoNot; 
break;
  1364      case kUnique: limitedStr = &StrUnique; 
break; 
  1366      case kSharedOther: limitedStr = &StrSharedOther; 
break;
  1367      default: limitedStr = &StrUndefined; 
break;
 void ReLocate(const G4ThreeVector &position)
 
G4ITMultiNavigator * fpMultiNavigator
 
static G4ITPathFinder * GetInstance()
 
#define fCurrentPreStepSafety
 
static const G4double kInfinity
 
#define fNoGeometriesLimiting
 
void EnableParallelNavigation(G4bool parallel)
 
const G4NavigationHistory * GetHistory() const
 
void EnableParallelNavigation(G4bool enableChoice=true)
 
void Locate(const G4ThreeVector &position, const G4ThreeVector &direction, G4bool relativeSearch=true)
 
void PrepareNewTrack(const G4ThreeVector &position, const G4ThreeVector &direction, G4VPhysicalVolume *massStartVol=0)
 
void ReportMove(const G4ThreeVector &OldV, const G4ThreeVector &NewV, const G4String &Quantity) const
 
G4double GetSurfaceTolerance() const
 
#define fPreStepCenterRenewed
 
G4ReferenceCountedHandle< G4VTouchable > G4TouchableHandle
 
#define fPreSafetyMinValue
 
static G4ITTransportationManager * GetTransportationManager()
 
G4double DoNextLinearStep(const G4FieldTrack &FieldTrack, G4double proposedStepLength)
 
G4GLOB_DLL std::ostream G4cout
 
G4double GetRadialTolerance() const
 
static G4ThreadLocal G4ITPathFinder * fpPathFinder
 
#define fLastLocatedPosition
 
G4double ComputeSafety(const G4ThreeVector &globalPoint)
 
#define fMinSafety_atSafLocation
 
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
 
G4double ObtainFinalStep(G4int navigatorId, G4double &pNewSafety, G4double &minStepLast, ELimited &limitedStep)
 
static const G4double minSafety
 
G4double DoNextCurvedStep(const G4FieldTrack &FieldTrack, G4double proposedStepLength, G4VPhysicalVolume *pCurrentPhysVolume)
 
const G4String & GetName() const
 
std::vector< G4ITNavigator * >::iterator GetActiveNavigatorsIterator()
 
#define fMinSafety_PreStepPt
 
G4String & LimitedString(ELimited lim)
 
G4ITSafetyHelper * GetSafetyHelper() const
 
#define fPreSafetyLocation
 
G4ITNavigator * GetNavigator(G4int n) const
 
G4TouchableHandle CreateTouchableHandle(G4int navId) const
 
G4int fNoActiveNavigators
 
void UpdateYourself(G4VPhysicalVolume *pPhysVol, const G4NavigationHistory *history=0)
 
G4ThreeVector GetPosition() const
 
G4double ComputeStep(const G4FieldTrack &pFieldTrack, G4double pCurrentProposedStepLength, G4int navigatorId, G4int stepNo, G4double &pNewSafety, ELimited &limitedStep, G4FieldTrack &EndState, G4VPhysicalVolume *currentVolume)
 
G4ThreeVector GetMomentumDirection() const
 
void PushPostSafetyToPreSafety()
 
static G4GeometryTolerance * GetInstance()
 
G4ITNavigator * fpNavigator[G4ITNavigator::fMaxNav]
 
G4GLOB_DLL std::ostream G4cerr
 
G4ITTransportationManager * fpTransportManager
 
#define fNewSafetyComputed