45   : fBList(), fVoxelDepth(-1),
 
   46     fVoxelAxisStack(kNavigatorVoxelStackMax,
kXAxis),
 
   47     fVoxelNoSlicesStack(kNavigatorVoxelStackMax,0),
 
   48     fVoxelSliceWidthStack(kNavigatorVoxelStackMax,0.),
 
   49     fVoxelNodeNoStack(kNavigatorVoxelStackMax,0),
 
   51     fVoxelNode(0), fpVoxelSafety(0), fCheck(false), fBestSafety(false)
 
   74                                 const G4double currentProposedStepLength,
 
   82                                       G4int& blockedReplicaNo )
 
   88   G4double ourStep=currentProposedStepLength, motherSafety, ourSafety;
 
   89   G4int localNoDaughters, sampleNo;
 
   91   G4bool initialNode, noStep;
 
   93   G4int curNoVolumes, contentNo;
 
   98   motherSolid = motherLogical->
GetSolid();
 
  105   ourSafety = motherSafety;                 
 
  120   if ( exiting && validExitNormal )
 
  122     if ( localDirection.
dot(exitNormal)>=kMinExitingNormalCosine )
 
  126       blockedExitedVol = *pBlockedPhysical;
 
  145     for (contentNo=curNoVolumes-1; contentNo>=0; contentNo--)
 
  147       sampleNo = curVoxelNode->
GetVolume(contentNo);
 
  151         samplePhysical = motherLogical->
GetDaughter(sampleNo);
 
  152         if ( samplePhysical!=blockedExitedVol )
 
  158                      sampleTf.TransformPoint(localPoint);
 
  169           if ( sampleSafety<ourSafety )
 
  171             ourSafety = sampleSafety;
 
  173           if ( sampleSafety<=ourStep )
 
  175             sampleDirection = sampleTf.TransformAxis(localDirection);
 
  177                      sampleSolid->
DistanceToIn(samplePoint, sampleDirection);
 
  182                                         sampleSafety, sampleStep);
 
  185             if ( sampleStep<=ourStep )
 
  187               ourStep = sampleStep;
 
  190               *pBlockedPhysical = samplePhysical;
 
  191               blockedReplicaNo = -1;
 
  200                   sampleDirection, localDirection, sampleSafety, sampleStep);
 
  212       if ( voxelSafety<ourSafety )
 
  214         ourSafety = voxelSafety;
 
  216       if ( currentProposedStepLength<ourSafety )
 
  223         *pBlockedPhysical = 0;
 
  231         if ( motherSafety<=ourStep )
 
  236                                          true, &validExitNormal, &exitNormal);
 
  241                                         motherStep, motherSafety);
 
  244           if ( motherStep<=ourStep )
 
  246             ourStep = motherStep;
 
  249             if ( validExitNormal )
 
  260             validExitNormal = 
false;
 
  264       newSafety = ourSafety;
 
  289   G4double curNodeOffset, minCurCommonDelta, maxCurCommonDelta;
 
  290   G4int minCurNodeNoDelta, maxCurNodeNoDelta;
 
  291   G4int localVoxelDepth, curNodeNo;
 
  304   curNodeOffset = curNodeNo*curNodeWidth;
 
  307   minCurCommonDelta = localPoint(curHeaderAxis)
 
  309   maxCurCommonDelta = curNodeWidth-minCurCommonDelta;
 
  311   if ( minCurNodeNoDelta<maxCurNodeNoDelta )
 
  313     voxelSafety = minCurNodeNoDelta*curNodeWidth;
 
  314     voxelSafety += minCurCommonDelta;
 
  316   else if (maxCurNodeNoDelta < minCurNodeNoDelta)
 
  318     voxelSafety = maxCurNodeNoDelta*curNodeWidth;
 
  319     voxelSafety += maxCurCommonDelta;
 
  323     voxelSafety = minCurNodeNoDelta*curNodeWidth;
 
  324     voxelSafety += std::min(minCurCommonDelta,maxCurCommonDelta);
 
  330   while ( (localVoxelDepth>0) && (voxelSafety>0) )
 
  337     curNodeOffset = curNodeNo*curNodeWidth;
 
  338     minCurCommonDelta = localPoint(curHeaderAxis)
 
  340     maxCurCommonDelta = curNodeWidth-minCurCommonDelta;
 
  342     if ( minCurCommonDelta<voxelSafety )
 
  344       voxelSafety = minCurCommonDelta;
 
  346     if ( maxCurCommonDelta<voxelSafety )
 
  348       voxelSafety = maxCurCommonDelta;
 
  381   G4double workNodeWidth, workMinExtent, workCoord;
 
  382   G4double minVal, maxVal, newDistance=0.;
 
  383   G4double newHeaderMin, newHeaderNodeWidth;
 
  384   G4int depth=0, newDepth=0, workNodeNo=0, newNodeNo=0, newHeaderNoSlices=0;
 
  385   EAxis workHeaderAxis, newHeaderAxis;
 
  388   G4double currentDistance = currentStep;
 
  396     targetPoint = localPoint+localDirection*currentDistance;
 
  397     newDistance = currentDistance;
 
  403     workCoord = targetPoint(workHeaderAxis);
 
  404     minVal = workMinExtent+workNodeNo*workNodeWidth;
 
  406     if ( minVal<=workCoord+sigma )
 
  408       maxVal = minVal+workNodeWidth;
 
  409       if ( maxVal<=workCoord-sigma )
 
  413         newNodeNo = workNodeNo+1;
 
  414         newHeader = workHeader;
 
  415         newDistance = (maxVal-localPoint(workHeaderAxis))
 
  416                     / localDirection(workHeaderAxis);
 
  423       newNodeNo = workNodeNo-1;
 
  424       newHeader = workHeader;
 
  425       newDistance = (minVal-localPoint(workHeaderAxis))
 
  426                   / localDirection(workHeaderAxis);
 
  430     currentDistance = newDistance;
 
  432   targetPoint = localPoint+localDirection*currentDistance;
 
  443     workCoord = targetPoint(workHeaderAxis);
 
  446     if ( minVal<=workCoord+sigma )
 
  450       if ( maxVal<=workCoord-sigma )
 
  453         newHeader = workHeader;
 
  454         newDistance = (maxVal-localPoint(workHeaderAxis))
 
  455                     / localDirection(workHeaderAxis);
 
  463       newHeader = workHeader;
 
  464       newDistance = (minVal-localPoint(workHeaderAxis))
 
  465                   / localDirection(workHeaderAxis);
 
  469     currentDistance = newDistance;
 
  480     if ( (newNodeNo<0) || (newNodeNo>=newHeader->GetNoSlices()))
 
  491       voxelPoint = localPoint+localDirection*newDistance;
 
  493       fVoxelDepth = newDepth;
 
  495       while ( !newVoxelNode )
 
  497         newProxy = newHeader->GetSlice(newNodeNo);
 
  500           newVoxelNode = newProxy->
GetNode();
 
  506           newHeaderAxis = newHeader->
GetAxis();
 
  507           newHeaderNoSlices = newHeader->GetNoSlices();
 
  508           newHeaderMin = newHeader->GetMinExtent();
 
  509           newHeaderNodeWidth = (newHeader->GetMaxExtent()-newHeaderMin)
 
  511           newNodeNo = 
G4int( (voxelPoint(newHeaderAxis)-newHeaderMin)
 
  512                              / newHeaderNodeWidth );
 
  519           else if ( newNodeNo>=newHeaderNoSlices )
 
  521                  newNodeNo = newHeaderNoSlices-1;
 
  557   G4int curNoVolumes, contentNo;
 
  562   motherSolid = motherLogical->
GetSolid();
 
  574   ourSafety = motherSafety;                 
 
  576   if( motherSafety == 0.0 )
 
  578 #ifdef G4DEBUG_NAVIGATION 
  585       message << 
"Safety method called for location outside current Volume." << 
G4endl 
  586          << 
"Location for safety is Outside this volume. " << 
G4endl 
  587          << 
"The approximate distance to the solid " 
  588          << 
"(safety from outside) is: " 
  590       message << 
"  Problem occurred with physical volume: " 
  591          << 
" Name: " << motherPhysical->
GetName()
 
  593          << 
"    Local Point = " << localPoint << 
G4endl;
 
  594       message << 
"  Description of solid: " << G4endl
 
  595             << *motherSolid << 
G4endl;
 
  596       G4Exception(
"G4VoxelNavigation::ComputeSafety()", 
"GeomNav0003",
 
  608       messageIn << 
" Point is Inside, but safety is Zero ."  << 
G4endl;
 
  609       messageIn << 
" Inexact safety for volume " << motherPhysical->
GetName() << G4endl
 
  610              << 
"  Solid: Name= " << motherSolid->
GetName()
 
  612       messageIn << 
"  Local point= " << localPoint << 
G4endl;
 
  613       messageIn << 
"  Solid parameters: " << G4endl << *motherSolid << 
G4endl;
 
  614       G4Exception(
"G4VoxelNavigation::ComputeSafety()", 
"GeomNav0003",
 
  636   for ( contentNo=curNoVolumes-1; contentNo>=0; contentNo-- )
 
  638     sampleNo = curVoxelNode->
GetVolume(contentNo);
 
  639     samplePhysical = motherLogical->
GetDaughter(sampleNo);
 
  645                           sampleTf.TransformPoint(localPoint);
 
  649     if ( sampleSafety<ourSafety )
 
  651       ourSafety = sampleSafety;
 
  661   if ( voxelSafety<ourSafety )
 
  663     ourSafety = voxelSafety;