66 const G4double currentProposedStepLength,
74 G4int& blockedReplicaNo)
77 *blockedExitedVol =
nullptr;
81 G4double ourStep = currentProposedStepLength, ourSafety;
83 G4int localNoDaughters, sampleNo;
84 G4bool motherValidExitNormal =
false;
89 motherSolid = motherLogical->
GetSolid();
94 ourSafety = motherSafety;
99 if ( fCheck && ( (localNoDaughters>0) || (ourStep < motherSafety) ) )
109 if ( exiting && validExitNormal )
111 if ( localDirection.
dot(exitNormal)>=kMinExitingNormalCosine )
115 blockedExitedVol = (*pBlockedPhysical);
133 &motherValidExitNormal,
136 if( (motherStep >= kInfinity) || (motherStep < 0.0) )
141 ourStep = motherStep = 0.0;
147 validExitNormal = motherValidExitNormal;
148 exitNormal = motherExitNormal;
150 *pBlockedPhysical =
nullptr;
151 blockedReplicaNo = 0;
159 for ( sampleNo=localNoDaughters-1; sampleNo>=0; sampleNo--)
161 samplePhysical = motherLogical->
GetDaughter(sampleNo);
162 if ( samplePhysical!=blockedExitedVol )
173 if ( sampleSafety<ourSafety )
175 ourSafety=sampleSafety;
178 if ( sampleSafety<=ourStep )
188 sampleDirection, sampleStep);
191 if ( sampleStep<=ourStep )
193 ourStep = sampleStep;
196 *pBlockedPhysical = samplePhysical;
197 blockedReplicaNo = -1;
202 sampleDirection, localDirection,
203 sampleSafety, sampleStep);
209 if( fCheck && (sampleStep < kInfinity) && (sampleStep >= motherStep) )
214 samplePoint, sampleDirection,
216 localPoint, localDirection,
217 motherStep, sampleStep);
231 if ( currentProposedStepLength<ourSafety )
237 *pBlockedPhysical =
nullptr;
244 if ( motherSafety<=ourStep )
251 &motherValidExitNormal,
258 motherStep, motherSafety);
259 if( motherValidExitNormal )
266 "From motherSolid::DistanceToOut" );
271 if( (motherStep >= kInfinity) || (motherStep < 0.0) )
280 ourStep = motherStep = 0.0;
287 validExitNormal =
false;
288 *pBlockedPhysical =
nullptr;
289 blockedReplicaNo = 0;
294 if ( motherStep<=ourStep )
296 ourStep = motherStep;
299 validExitNormal = motherValidExitNormal;
300 exitNormal = motherExitNormal;
302 if ( motherValidExitNormal )
313 "From RotationMatrix" );
320 validExitNormal =
false;
324 newSafety = ourSafety;
340 G4int localNoDaughters, sampleNo;
344 motherSolid = motherLogical->
GetSolid();
349 ourSafety = motherSafety;
361 for ( sampleNo=localNoDaughters-1; sampleNo>=0; sampleNo-- )
363 samplePhysical = motherLogical->
GetDaughter(sampleNo);
373 if ( sampleSafety<ourSafety )
375 ourSafety = sampleSafety;
381 sampleSafety,
false,
false);
CLHEP::Hep3Vector G4ThreeVector
double dot(const Hep3Vector &) const
HepRotation inverse() const
G4VSolid * GetSolid() const
size_t GetNoDaughters() const
G4VPhysicalVolume * GetDaughter(const G4int i) const
G4VPhysicalVolume * GetTopVolume() const
void SetVerboseLevel(G4int level)
void PreComputeStepLog(const G4VPhysicalVolume *motherPhysical, G4double motherSafety, const G4ThreeVector &localPoint) const
void CheckDaughterEntryPoint(const G4VSolid *sampleSolid, const G4ThreeVector &samplePoint, const G4ThreeVector &sampleDirection, const G4VSolid *motherSolid, const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, G4double motherStep, G4double sampleStep) const
G4int GetVerboseLevel() const
void PrintDaughterLog(const G4VSolid *sampleSolid, const G4ThreeVector &samplePoint, G4double sampleSafety, G4bool onlySafety, const G4ThreeVector &sampleDirection, G4double sampleStep) const
G4bool CheckAndReportBadNormal(const G4ThreeVector &unitNormal, const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, G4double step, const G4VSolid *solid, const char *msg) const
void ComputeSafetyLog(const G4VSolid *solid, const G4ThreeVector &point, G4double safety, G4bool isMotherVolume, G4int banner=-1) const
void PostComputeStepLog(const G4VSolid *motherSolid, const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, G4double motherStep, G4double motherSafety) const
void ReportOutsideMother(const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, const G4VPhysicalVolume *motherPV, G4double tDist=30.0 *CLHEP::cm) const
void AlongComputeStepLog(const G4VSolid *sampleSolid, const G4ThreeVector &samplePoint, const G4ThreeVector &sampleDirection, const G4ThreeVector &localDirection, G4double sampleSafety, G4double sampleStep) const
G4double ComputeStep(const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, const G4double currentProposedStepLength, G4double &newSafety, G4NavigationHistory &history, G4bool &validExitNormal, G4ThreeVector &exitNormal, G4bool &exiting, G4bool &entering, G4VPhysicalVolume *(*pBlockedPhysical), G4int &blockedReplicaNo)
G4int GetVerboseLevel() const
G4double ComputeSafety(const G4ThreeVector &globalpoint, const G4NavigationHistory &history, const G4double pMaxLength=DBL_MAX)
void SetVerboseLevel(G4int level)
const G4RotationMatrix * GetRotation() const
const G4ThreeVector GetTranslation() const
G4LogicalVolume * GetLogicalVolume() const
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=nullptr, G4ThreeVector *n=nullptr) const =0
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const =0