Geant4-11
Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes
G4ParameterisedNavigation Class Reference

#include <G4ParameterisedNavigation.hh>

Inheritance diagram for G4ParameterisedNavigation:
G4VoxelNavigation

Public Member Functions

void CheckMode (G4bool mode)
 
G4double ComputeSafety (const G4ThreeVector &localPoint, const G4NavigationHistory &history, const G4double pProposedMaxLength=DBL_MAX)
 
G4double ComputeStep (const G4ThreeVector &globalPoint, const G4ThreeVector &globalDirection, const G4double currentProposedStepLength, G4double &newSafety, G4NavigationHistory &history, G4bool &validExitNormal, G4ThreeVector &exitNormal, G4bool &exiting, G4bool &entering, G4VPhysicalVolume *(*pBlockedPhysical), G4int &blockedReplicaNo)
 
void EnableBestSafety (G4bool flag=false)
 
 G4ParameterisedNavigation ()
 
G4int GetVerboseLevel () const
 
G4bool LevelLocate (G4NavigationHistory &history, const G4VPhysicalVolume *blockedVol, const G4int blockedNum, const G4ThreeVector &globalPoint, const G4ThreeVector *globalDirection, const G4bool pLocatedOnEdge, G4ThreeVector &localPoint)
 
G4SmartVoxelNodeParamVoxelLocate (G4SmartVoxelHeader *pHead, const G4ThreeVector &localPoint)
 
void SetVerboseLevel (G4int level)
 
G4SmartVoxelNodeVoxelLocate (G4SmartVoxelHeader *pHead, const G4ThreeVector &localPoint)
 
 ~G4ParameterisedNavigation ()
 

Protected Member Functions

G4double ComputeVoxelSafety (const G4ThreeVector &localPoint) const
 
G4bool LocateNextVoxel (const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, const G4double currentStep)
 
G4SmartVoxelNodeVoxelLocateLight (G4SmartVoxelHeader *pHead, const G4ThreeVector &localPoint) const
 

Protected Attributes

G4bool fBestSafety = false
 
G4BlockingList fBList
 
G4bool fCheck = false
 
G4double fHalfTolerance
 
G4NavigationLoggerfLogger
 
G4VoxelSafetyfpVoxelSafety = nullptr
 
std::vector< EAxisfVoxelAxisStack
 
G4int fVoxelDepth = -1
 
std::vector< G4SmartVoxelHeader * > fVoxelHeaderStack
 
G4SmartVoxelNodefVoxelNode = nullptr
 
std::vector< G4intfVoxelNodeNoStack
 
std::vector< G4intfVoxelNoSlicesStack
 
std::vector< G4doublefVoxelSliceWidthStack
 

Private Member Functions

void AlongComputeStepLog (const G4VSolid *sampleSolid, const G4ThreeVector &samplePoint, const G4ThreeVector &sampleDirection, const G4ThreeVector &localDirection, G4double sampleSafety, G4double sampleStep)
 
void ComputeSafetyLog (const G4VSolid *solid, const G4ThreeVector &point, G4double safety, G4bool banner)
 
G4double ComputeVoxelSafety (const G4ThreeVector &localPoint, const EAxis pAxis) const
 
G4VPhysicalVolumeCreateVolumeWithParent (G4VPhysicalVolume *curPhysical, const G4NavigationHistory &hist)
 
G4VSolidIdentifyAndPlaceSolid (G4int num, G4VPhysicalVolume *apparentPhys, G4VPVParameterisation *curParam)
 
G4bool LocateNextVoxel (const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, const G4double currentStep, const EAxis pAxis)
 
void PostComputeStepLog (const G4VSolid *motherSolid, const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, G4double motherStep, G4double motherSafety)
 
void PreComputeStepLog (const G4VPhysicalVolume *motherPhysical, G4double motherSafety, const G4ThreeVector &localPoint)
 
void PrintDaughterLog (const G4VSolid *sampleSolid, const G4ThreeVector &samplePoint, G4double sampleSafety, G4double sampleStep)
 

Private Attributes

EAxis fVoxelAxis = kUndefined
 
G4SmartVoxelHeaderfVoxelHeader = nullptr
 
size_t fVoxelNodeNo = 0
 
G4int fVoxelNoSlices = 0
 
G4double fVoxelSliceWidth = 0.0
 

Detailed Description

Definition at line 54 of file G4ParameterisedNavigation.hh.

Constructor & Destructor Documentation

◆ G4ParameterisedNavigation()

G4ParameterisedNavigation::G4ParameterisedNavigation ( )

Definition at line 56 of file G4ParameterisedNavigation.cc.

57{
58}

◆ ~G4ParameterisedNavigation()

G4ParameterisedNavigation::~G4ParameterisedNavigation ( )

Definition at line 64 of file G4ParameterisedNavigation.cc.

65{
66}

Member Function Documentation

◆ AlongComputeStepLog()

void G4VoxelNavigation::AlongComputeStepLog ( const G4VSolid sampleSolid,
const G4ThreeVector samplePoint,
const G4ThreeVector sampleDirection,
const G4ThreeVector localDirection,
G4double  sampleSafety,
G4double  sampleStep 
)
privateinherited

◆ CheckMode()

void G4VoxelNavigation::CheckMode ( G4bool  mode)
inlineinherited

◆ ComputeSafety()

G4double G4ParameterisedNavigation::ComputeSafety ( const G4ThreeVector localPoint,
const G4NavigationHistory history,
const G4double  pProposedMaxLength = DBL_MAX 
)
virtual

Reimplemented from G4VoxelNavigation.

Definition at line 396 of file G4ParameterisedNavigation.cc.

399{
400 G4VPhysicalVolume *motherPhysical, *samplePhysical;
401 G4VPVParameterisation *sampleParam;
402 G4LogicalVolume *motherLogical;
403 G4VSolid *motherSolid, *sampleSolid;
404 G4double motherSafety, ourSafety;
405 G4int sampleNo, curVoxelNodeNo;
406
407 G4SmartVoxelNode *curVoxelNode;
408 G4int curNoVolumes, contentNo;
409 G4double voxelSafety;
410
411 // Replication data
412 //
413 EAxis axis;
414 G4int nReplicas;
415 G4double width, offset;
416 G4bool consuming;
417
418 motherPhysical = history.GetTopVolume();
419 motherLogical = motherPhysical->GetLogicalVolume();
420 motherSolid = motherLogical->GetSolid();
421
422 //
423 // Compute mother safety
424 //
425
426 motherSafety = motherSolid->DistanceToOut(localPoint);
427 ourSafety = motherSafety; // Working isotropic safety
428
429 //
430 // Compute daughter safeties
431 //
432
433 // By definition, parameterised volumes exist as first
434 // daughter of the mother volume
435 //
436 samplePhysical = motherLogical->GetDaughter(0);
437 samplePhysical->GetReplicationData(axis, nReplicas,
438 width, offset, consuming);
439 sampleParam = samplePhysical->GetParameterisation();
440
441 // Look inside the current Voxel only at the current point
442 //
443 if ( axis==kUndefined ) // 3D case: current voxel node is retrieved
444 { // from G4VoxelNavigation.
445 curVoxelNode = fVoxelNode;
446 }
447 else // 1D case: current voxel node is computed here.
448 {
449 curVoxelNodeNo = G4int((localPoint(fVoxelAxis)
451 curVoxelNode = fVoxelHeader->GetSlice(curVoxelNodeNo)->GetNode();
452 fVoxelNodeNo = curVoxelNodeNo;
453 fVoxelNode = curVoxelNode;
454 }
455 curNoVolumes = curVoxelNode->GetNoContained();
456
457 for ( contentNo=curNoVolumes-1; contentNo>=0; contentNo-- )
458 {
459 sampleNo = curVoxelNode->GetVolume(contentNo);
460
461 // Call virtual methods, and copy information if needed
462 //
463 sampleSolid= IdentifyAndPlaceSolid( sampleNo,samplePhysical,sampleParam );
464
465 G4AffineTransform sampleTf(samplePhysical->GetRotation(),
466 samplePhysical->GetTranslation());
467 sampleTf.Invert();
468 const G4ThreeVector samplePoint = sampleTf.TransformPoint(localPoint);
469 G4double sampleSafety = sampleSolid->DistanceToIn(samplePoint);
470 if ( sampleSafety<ourSafety )
471 {
472 ourSafety = sampleSafety;
473 }
474 }
475
476 voxelSafety = ComputeVoxelSafety(localPoint,axis);
477 if ( voxelSafety<ourSafety )
478 {
479 ourSafety=voxelSafety;
480 }
481
482 return ourSafety;
483}
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4VSolid * GetSolid() const
G4VPhysicalVolume * GetDaughter(const G4int i) const
G4VSolid * IdentifyAndPlaceSolid(G4int num, G4VPhysicalVolume *apparentPhys, G4VPVParameterisation *curParam)
G4double ComputeVoxelSafety(const G4ThreeVector &localPoint, const EAxis pAxis) const
G4double GetMinExtent() const
G4SmartVoxelProxy * GetSlice(G4int n) const
G4int GetVolume(G4int pVolumeNo) const
std::size_t GetNoContained() const
G4SmartVoxelNode * GetNode() const
const G4RotationMatrix * GetRotation() const
const G4ThreeVector GetTranslation() const
G4LogicalVolume * GetLogicalVolume() const
virtual void GetReplicationData(EAxis &axis, G4int &nReplicas, G4double &width, G4double &offset, G4bool &consuming) const =0
virtual G4VPVParameterisation * GetParameterisation() const =0
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
G4SmartVoxelNode * fVoxelNode
EAxis
Definition: geomdefs.hh:54
@ kUndefined
Definition: geomdefs.hh:61
def history()
Definition: g4zmq.py:84

References ComputeVoxelSafety(), G4VSolid::DistanceToIn(), G4VSolid::DistanceToOut(), fVoxelAxis, fVoxelHeader, G4VoxelNavigation::fVoxelNode, fVoxelNodeNo, fVoxelSliceWidth, G4LogicalVolume::GetDaughter(), G4VPhysicalVolume::GetLogicalVolume(), G4SmartVoxelHeader::GetMinExtent(), G4SmartVoxelNode::GetNoContained(), G4SmartVoxelProxy::GetNode(), G4VPhysicalVolume::GetParameterisation(), G4VPhysicalVolume::GetReplicationData(), G4VPhysicalVolume::GetRotation(), G4SmartVoxelHeader::GetSlice(), G4LogicalVolume::GetSolid(), G4VPhysicalVolume::GetTranslation(), G4SmartVoxelNode::GetVolume(), g4zmq::history(), IdentifyAndPlaceSolid(), G4AffineTransform::Invert(), kUndefined, and G4AffineTransform::TransformPoint().

Referenced by G4Navigator::ComputeSafety(), G4ITNavigator1::ComputeSafety(), and G4ITNavigator2::ComputeSafety().

◆ ComputeSafetyLog()

void G4VoxelNavigation::ComputeSafetyLog ( const G4VSolid solid,
const G4ThreeVector point,
G4double  safety,
G4bool  banner 
)
privateinherited

◆ ComputeStep()

G4double G4ParameterisedNavigation::ComputeStep ( const G4ThreeVector globalPoint,
const G4ThreeVector globalDirection,
const G4double  currentProposedStepLength,
G4double newSafety,
G4NavigationHistory history,
G4bool validExitNormal,
G4ThreeVector exitNormal,
G4bool exiting,
G4bool entering,
G4VPhysicalVolume **  pBlockedPhysical,
G4int blockedReplicaNo 
)
virtual

Reimplemented from G4VoxelNavigation.

Definition at line 72 of file G4ParameterisedNavigation.cc.

84{
85 G4VPhysicalVolume *motherPhysical, *samplePhysical;
86 G4VPVParameterisation *sampleParam;
87 G4LogicalVolume *motherLogical;
88 G4VSolid *motherSolid, *sampleSolid;
89 G4ThreeVector sampleDirection;
90 G4double ourStep=currentProposedStepLength, ourSafety;
91 G4double motherSafety, motherStep = DBL_MAX;
92 G4bool motherValidExitNormal = false;
93 G4ThreeVector motherExitNormal;
94
95 G4int sampleNo;
96
97 G4bool initialNode, noStep;
98 G4SmartVoxelNode *curVoxelNode;
99 G4int curNoVolumes, contentNo;
100 G4double voxelSafety;
101
102 // Replication data
103 //
104 EAxis axis;
105 G4int nReplicas;
106 G4double width, offset;
107 G4bool consuming;
108
109 motherPhysical = history.GetTopVolume();
110 motherLogical = motherPhysical->GetLogicalVolume();
111 motherSolid = motherLogical->GetSolid();
112
113 //
114 // Compute mother safety
115 //
116
117 motherSafety = motherSolid->DistanceToOut(localPoint);
118 ourSafety = motherSafety; // Working isotropic safety
119
120#ifdef G4VERBOSE
121 if ( fCheck )
122 {
123 if( motherSafety < 0.0 )
124 {
125 motherSolid->DumpInfo();
126 std::ostringstream message;
127 message << "Negative Safety In Voxel Navigation !" << G4endl
128 << " Current solid " << motherSolid->GetName()
129 << " gave negative safety: " << motherSafety << G4endl
130 << " for the current (local) point " << localPoint;
131 G4Exception("G4ParameterisedNavigation::ComputeStep()",
132 "GeomNav0003", FatalException, message);
133 }
134 if( motherSolid->Inside(localPoint) == kOutside )
135 {
136 std::ostringstream message;
137 message << "Point is outside Current Volume !" << G4endl
138 << " Point " << localPoint
139 << " is outside current volume " << motherPhysical->GetName()
140 << G4endl;
141 G4double estDistToSolid = motherSolid->DistanceToIn(localPoint);
142 G4cout << " Estimated isotropic distance to solid (distToIn)= "
143 << estDistToSolid;
144 if( estDistToSolid > 100.0 * motherSolid->GetTolerance() )
145 {
146 motherSolid->DumpInfo();
147 G4Exception("G4ParameterisedNavigation::ComputeStep()",
148 "GeomNav0003", FatalException, message,
149 "Point is far outside Current Volume !");
150 }
151 else
152 {
153 G4Exception("G4ParameterisedNavigation::ComputeStep()",
154 "GeomNav1002", JustWarning, message,
155 "Point is a little outside Current Volume.");
156 }
157 }
158
159 // Compute early:
160 // a) to check whether point is (wrongly) outside
161 // (signaled if step < 0 or step == kInfinity )
162 // b) to check value against answer of daughters!
163 //
164 motherStep = motherSolid->DistanceToOut(localPoint,
165 localDirection,
166 true,
167 &motherValidExitNormal,
168 &motherExitNormal);
169
170 if( (motherStep >= kInfinity) || (motherStep < 0.0) )
171 {
172 // Error - indication of being outside solid !!
173 //
174 fLogger->ReportOutsideMother(localPoint, localDirection, motherPhysical);
175
176 ourStep = motherStep = 0.0;
177 exiting = true;
178 entering = false;
179
180 // If we are outside the solid does the normal make sense?
181 validExitNormal = motherValidExitNormal;
182 exitNormal = motherExitNormal;
183
184 *pBlockedPhysical = nullptr; // or motherPhysical ?
185 blockedReplicaNo = 0; // or motherReplicaNumber ?
186
187 newSafety = 0.0;
188 return ourStep;
189 }
190 }
191#endif
192
193 initialNode = true;
194 noStep = true;
195
196 // By definition, the parameterised volume is the first
197 // (and only) daughter of the mother volume
198 //
199 samplePhysical = motherLogical->GetDaughter(0);
200 samplePhysical->GetReplicationData(axis,nReplicas,width,offset,consuming);
201 fBList.Enlarge(nReplicas);
202 fBList.Reset();
203
204 // Exiting normal optimisation
205 //
206 if (exiting && (*pBlockedPhysical==samplePhysical) && validExitNormal)
207 {
208 if (localDirection.dot(exitNormal)>=kMinExitingNormalCosine)
209 {
210 // Block exited daughter replica; Must be on boundary => zero safety
211 //
212 fBList.BlockVolume(blockedReplicaNo);
213 ourSafety = 0;
214 }
215 }
216 exiting = false;
217 entering = false;
218
219 sampleParam = samplePhysical->GetParameterisation();
220
221 // Loop over voxels & compute daughter safeties & intersections
222
223 do
224 {
225 curVoxelNode = fVoxelNode;
226 curNoVolumes = curVoxelNode->GetNoContained();
227
228 for ( contentNo=curNoVolumes-1; contentNo>=0; contentNo-- )
229 {
230 sampleNo = curVoxelNode->GetVolume(contentNo);
231 if ( !fBList.IsBlocked(sampleNo) )
232 {
233 fBList.BlockVolume(sampleNo);
234
235 // Call virtual methods, and copy information if needed
236 //
237 sampleSolid = IdentifyAndPlaceSolid( sampleNo, samplePhysical,
238 sampleParam );
239
240 G4AffineTransform sampleTf(samplePhysical->GetRotation(),
241 samplePhysical->GetTranslation());
242 sampleTf.Invert();
243 const G4ThreeVector samplePoint = sampleTf.TransformPoint(localPoint);
244 const G4double sampleSafety = sampleSolid->DistanceToIn(samplePoint);
245 if ( sampleSafety<ourSafety )
246 {
247 ourSafety = sampleSafety;
248 }
249 if ( sampleSafety<=ourStep )
250 {
251 sampleDirection = sampleTf.TransformAxis(localDirection);
252 G4double sampleStep =
253 sampleSolid->DistanceToIn(samplePoint, sampleDirection);
254 if ( sampleStep<=ourStep )
255 {
256 ourStep = sampleStep;
257 entering = true;
258 exiting = false;
259 *pBlockedPhysical = samplePhysical;
260 blockedReplicaNo = sampleNo;
261#ifdef G4VERBOSE
262 // Check to see that the resulting point is indeed in/on volume.
263 // This check could eventually be made only for successful
264 // candidate.
265
266 if ( ( fCheck ) && ( sampleStep < kInfinity ) )
267 {
268 G4ThreeVector intersectionPoint;
269 intersectionPoint = samplePoint + sampleStep * sampleDirection;
270 EInside insideIntPt = sampleSolid->Inside(intersectionPoint);
271 if( insideIntPt != kSurface )
272 {
273 G4int oldcoutPrec = G4cout.precision(16);
274 std::ostringstream message;
275 message << "Navigator gets conflicting response from Solid."
276 << G4endl
277 << " Inaccurate solid DistanceToIn"
278 << " for solid " << sampleSolid->GetName() << G4endl
279 << " Solid gave DistanceToIn = "
280 << sampleStep << " yet returns " ;
281 if( insideIntPt == kInside )
282 message << "-kInside-";
283 else if( insideIntPt == kOutside )
284 message << "-kOutside-";
285 else
286 message << "-kSurface-";
287 message << " for this point !" << G4endl
288 << " Point = " << intersectionPoint
289 << G4endl;
290 if ( insideIntPt != kInside )
291 message << " DistanceToIn(p) = "
292 << sampleSolid->DistanceToIn(intersectionPoint);
293 if ( insideIntPt != kOutside )
294 message << " DistanceToOut(p) = "
295 << sampleSolid->DistanceToOut(intersectionPoint);
296 G4Exception("G4ParameterisedNavigation::ComputeStep()",
297 "GeomNav1002", JustWarning, message);
298 G4cout.precision(oldcoutPrec);
299 }
300 }
301#endif
302 }
303 }
304 }
305 }
306
307 if ( initialNode )
308 {
309 initialNode = false;
310 voxelSafety = ComputeVoxelSafety(localPoint,axis);
311 if ( voxelSafety<ourSafety )
312 {
313 ourSafety = voxelSafety;
314 }
315 if ( currentProposedStepLength<ourSafety )
316 {
317 // Guaranteed physics limited
318 //
319 noStep = false;
320 entering = false;
321 exiting = false;
322 *pBlockedPhysical = nullptr;
323 ourStep = kInfinity;
324 }
325 else
326 {
327 // Consider intersection with mother solid
328 //
329 if ( motherSafety<=ourStep )
330 {
331 if ( !fCheck )
332 {
333 motherStep = motherSolid->DistanceToOut(localPoint,
334 localDirection,
335 true,
336 &motherValidExitNormal,
337 &motherExitNormal);
338 }
339
340 if( ( motherStep < 0.0 ) || ( motherStep >= kInfinity) )
341 {
342#ifdef G4VERBOSE
343 fLogger->ReportOutsideMother(localPoint, localDirection,
344 motherPhysical);
345#endif
346 ourStep = motherStep = 0.0;
347 // Rely on the code below to set the remaining state, i.e.
348 // exiting, entering, exitNormal & validExitNormal,
349 // pBlockedPhysical etc.
350 }
351#ifdef G4VERBOSE
352 if( motherValidExitNormal && ( fCheck || (motherStep<=ourStep)) )
353 {
354 fLogger->CheckAndReportBadNormal(motherExitNormal,
355 localPoint, localDirection,
356 motherStep, motherSolid,
357 "From motherSolid::DistanceToOut");
358 }
359#endif
360 if ( motherStep<=ourStep )
361 {
362 ourStep = motherStep;
363 exiting = true;
364 entering = false;
365 if ( validExitNormal )
366 {
367 const G4RotationMatrix* rot = motherPhysical->GetRotation();
368 if (rot)
369 {
370 exitNormal *= rot->inverse();
371 }
372 }
373 }
374 else
375 {
376 validExitNormal = false;
377 }
378 }
379 }
380 newSafety = ourSafety;
381 }
382 if (noStep)
383 {
384 noStep = LocateNextVoxel(localPoint, localDirection, ourStep, axis);
385 }
386 } while (noStep);
387
388 return ourStep;
389}
@ JustWarning
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
HepRotation inverse() const
void BlockVolume(const G4int v)
void Enlarge(const G4int nv)
G4bool IsBlocked(const G4int v) const
G4bool CheckAndReportBadNormal(const G4ThreeVector &unitNormal, const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, G4double step, const G4VSolid *solid, const char *msg) const
void ReportOutsideMother(const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, const G4VPhysicalVolume *motherPV, G4double tDist=30.0 *CLHEP::cm) const
G4bool LocateNextVoxel(const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, const G4double currentStep, const EAxis pAxis)
const G4String & GetName() const
G4String GetName() const
G4double GetTolerance() const
virtual EInside Inside(const G4ThreeVector &p) const =0
void DumpInfo() const
G4NavigationLogger * fLogger
G4BlockingList fBList
EInside
Definition: geomdefs.hh:67
@ kInside
Definition: geomdefs.hh:70
@ kOutside
Definition: geomdefs.hh:68
@ kSurface
Definition: geomdefs.hh:69
static const double kMinExitingNormalCosine
Definition: geomdefs.hh:45
static const G4double kInfinity
Definition: geomdefs.hh:41
#define DBL_MAX
Definition: templates.hh:62

References G4BlockingList::BlockVolume(), G4NavigationLogger::CheckAndReportBadNormal(), ComputeVoxelSafety(), DBL_MAX, G4VSolid::DistanceToIn(), G4VSolid::DistanceToOut(), CLHEP::Hep3Vector::dot(), G4VSolid::DumpInfo(), G4BlockingList::Enlarge(), FatalException, G4VoxelNavigation::fBList, G4VoxelNavigation::fCheck, G4VoxelNavigation::fLogger, G4VoxelNavigation::fVoxelNode, G4cout, G4endl, G4Exception(), G4LogicalVolume::GetDaughter(), G4VPhysicalVolume::GetLogicalVolume(), G4VPhysicalVolume::GetName(), G4VSolid::GetName(), G4SmartVoxelNode::GetNoContained(), G4VPhysicalVolume::GetParameterisation(), G4VPhysicalVolume::GetReplicationData(), G4VPhysicalVolume::GetRotation(), G4LogicalVolume::GetSolid(), G4VSolid::GetTolerance(), G4VPhysicalVolume::GetTranslation(), G4SmartVoxelNode::GetVolume(), g4zmq::history(), IdentifyAndPlaceSolid(), G4VSolid::Inside(), CLHEP::HepRotation::inverse(), G4AffineTransform::Invert(), G4BlockingList::IsBlocked(), JustWarning, kInfinity, kInside, kMinExitingNormalCosine, kOutside, kSurface, LocateNextVoxel(), G4NavigationLogger::ReportOutsideMother(), G4BlockingList::Reset(), G4AffineTransform::TransformAxis(), and G4AffineTransform::TransformPoint().

Referenced by G4Navigator::ComputeStep(), G4ITNavigator1::ComputeStep(), and G4ITNavigator2::ComputeStep().

◆ ComputeVoxelSafety() [1/2]

G4double G4VoxelNavigation::ComputeVoxelSafety ( const G4ThreeVector localPoint) const
protectedinherited

Definition at line 383 of file G4VoxelNavigation.cc.

384{
385 G4SmartVoxelHeader *curHeader;
386 G4double voxelSafety, curNodeWidth;
387 G4double curNodeOffset, minCurCommonDelta, maxCurCommonDelta;
388 G4int minCurNodeNoDelta, maxCurNodeNoDelta;
389 G4int localVoxelDepth, curNodeNo;
390 EAxis curHeaderAxis;
391
392 localVoxelDepth = fVoxelDepth;
393
394 curHeader = fVoxelHeaderStack[localVoxelDepth];
395 curHeaderAxis = fVoxelAxisStack[localVoxelDepth];
396 curNodeNo = fVoxelNodeNoStack[localVoxelDepth];
397 curNodeWidth = fVoxelSliceWidthStack[localVoxelDepth];
398
399 // Compute linear intersection distance to boundaries of max/min
400 // to collected nodes at current level
401 //
402 curNodeOffset = curNodeNo*curNodeWidth;
403 maxCurNodeNoDelta = fVoxelNode->GetMaxEquivalentSliceNo()-curNodeNo;
404 minCurNodeNoDelta = curNodeNo-fVoxelNode->GetMinEquivalentSliceNo();
405 minCurCommonDelta = localPoint(curHeaderAxis)
406 - curHeader->GetMinExtent() - curNodeOffset;
407 maxCurCommonDelta = curNodeWidth-minCurCommonDelta;
408
409 if ( minCurNodeNoDelta<maxCurNodeNoDelta )
410 {
411 voxelSafety = minCurNodeNoDelta*curNodeWidth;
412 voxelSafety += minCurCommonDelta;
413 }
414 else if (maxCurNodeNoDelta < minCurNodeNoDelta)
415 {
416 voxelSafety = maxCurNodeNoDelta*curNodeWidth;
417 voxelSafety += maxCurCommonDelta;
418 }
419 else // (maxCurNodeNoDelta == minCurNodeNoDelta)
420 {
421 voxelSafety = minCurNodeNoDelta*curNodeWidth;
422 voxelSafety += std::min(minCurCommonDelta,maxCurCommonDelta);
423 }
424
425 // Compute isotropic safety to boundaries of previous levels
426 // [NOT to collected boundaries]
427
428 // Loop checking, 07.10.2016, JA
429 while ( (localVoxelDepth>0) && (voxelSafety>0) )
430 {
431 localVoxelDepth--;
432 curHeader = fVoxelHeaderStack[localVoxelDepth];
433 curHeaderAxis = fVoxelAxisStack[localVoxelDepth];
434 curNodeNo = fVoxelNodeNoStack[localVoxelDepth];
435 curNodeWidth = fVoxelSliceWidthStack[localVoxelDepth];
436 curNodeOffset = curNodeNo*curNodeWidth;
437 minCurCommonDelta = localPoint(curHeaderAxis)
438 - curHeader->GetMinExtent() - curNodeOffset;
439 maxCurCommonDelta = curNodeWidth-minCurCommonDelta;
440
441 if ( minCurCommonDelta<voxelSafety )
442 {
443 voxelSafety = minCurCommonDelta;
444 }
445 if ( maxCurCommonDelta<voxelSafety )
446 {
447 voxelSafety = maxCurCommonDelta;
448 }
449 }
450 if ( voxelSafety<0 )
451 {
452 voxelSafety = 0;
453 }
454
455 return voxelSafety;
456}
G4int GetMaxEquivalentSliceNo() const
G4int GetMinEquivalentSliceNo() const
std::vector< G4double > fVoxelSliceWidthStack
std::vector< EAxis > fVoxelAxisStack
std::vector< G4int > fVoxelNodeNoStack
std::vector< G4SmartVoxelHeader * > fVoxelHeaderStack
T min(const T t1, const T t2)
brief Return the smallest of the two arguments

References G4VoxelNavigation::fVoxelAxisStack, G4VoxelNavigation::fVoxelDepth, G4VoxelNavigation::fVoxelHeaderStack, G4VoxelNavigation::fVoxelNode, G4VoxelNavigation::fVoxelNodeNoStack, G4VoxelNavigation::fVoxelSliceWidthStack, G4SmartVoxelNode::GetMaxEquivalentSliceNo(), G4SmartVoxelNode::GetMinEquivalentSliceNo(), G4SmartVoxelHeader::GetMinExtent(), and G4INCL::Math::min().

Referenced by G4VoxelNavigation::ComputeSafety(), G4VoxelNavigation::ComputeStep(), and ComputeVoxelSafety().

◆ ComputeVoxelSafety() [2/2]

G4double G4ParameterisedNavigation::ComputeVoxelSafety ( const G4ThreeVector localPoint,
const EAxis  pAxis 
) const
private

Definition at line 492 of file G4ParameterisedNavigation.cc.

495{
496 // If no best axis is specified, adopt default
497 // strategy as for placements
498 //
499 if ( pAxis==kUndefined )
500 {
501 return G4VoxelNavigation::ComputeVoxelSafety(localPoint);
502 }
503
504 G4double voxelSafety, plusVoxelSafety, minusVoxelSafety;
505 G4double curNodeOffset, minCurCommonDelta, maxCurCommonDelta;
506 G4int minCurNodeNoDelta, maxCurNodeNoDelta;
507
508 // Compute linear intersection distance to boundaries of max/min
509 // to collected nodes at current level
510 //
511 curNodeOffset = fVoxelNodeNo*fVoxelSliceWidth;
512 minCurCommonDelta = localPoint(fVoxelAxis)
513 - fVoxelHeader->GetMinExtent()-curNodeOffset;
514 maxCurNodeNoDelta = fVoxelNode->GetMaxEquivalentSliceNo()-fVoxelNodeNo;
515 minCurNodeNoDelta = fVoxelNodeNo-fVoxelNode->GetMinEquivalentSliceNo();
516 maxCurCommonDelta = fVoxelSliceWidth-minCurCommonDelta;
517 plusVoxelSafety = minCurNodeNoDelta*fVoxelSliceWidth+minCurCommonDelta;
518 minusVoxelSafety = maxCurNodeNoDelta*fVoxelSliceWidth+maxCurCommonDelta;
519 voxelSafety = std::min(plusVoxelSafety,minusVoxelSafety);
520
521 if ( voxelSafety<0 )
522 {
523 voxelSafety = 0;
524 }
525
526 return voxelSafety;
527}
G4double ComputeVoxelSafety(const G4ThreeVector &localPoint) const

References G4VoxelNavigation::ComputeVoxelSafety(), fVoxelAxis, fVoxelHeader, G4VoxelNavigation::fVoxelNode, fVoxelNodeNo, fVoxelSliceWidth, G4SmartVoxelNode::GetMaxEquivalentSliceNo(), G4SmartVoxelNode::GetMinEquivalentSliceNo(), G4SmartVoxelHeader::GetMinExtent(), kUndefined, and G4INCL::Math::min().

Referenced by ComputeSafety(), and ComputeStep().

◆ CreateVolumeWithParent()

G4VPhysicalVolume * G4ParameterisedNavigation::CreateVolumeWithParent ( G4VPhysicalVolume curPhysical,
const G4NavigationHistory hist 
)
private

◆ EnableBestSafety()

void G4VoxelNavigation::EnableBestSafety ( G4bool  flag = false)
inlineinherited

◆ GetVerboseLevel()

G4int G4VoxelNavigation::GetVerboseLevel ( ) const
inlineinherited

◆ IdentifyAndPlaceSolid()

G4VSolid * G4ParameterisedNavigation::IdentifyAndPlaceSolid ( G4int  num,
G4VPhysicalVolume apparentPhys,
G4VPVParameterisation curParam 
)
inlineprivate

◆ LevelLocate()

G4bool G4ParameterisedNavigation::LevelLocate ( G4NavigationHistory history,
const G4VPhysicalVolume blockedVol,
const G4int  blockedNum,
const G4ThreeVector globalPoint,
const G4ThreeVector globalDirection,
const G4bool  pLocatedOnEdge,
G4ThreeVector localPoint 
)
virtual

Reimplemented from G4VoxelNavigation.

Definition at line 602 of file G4ParameterisedNavigation.cc.

609{
610 G4SmartVoxelHeader *motherVoxelHeader;
611 G4SmartVoxelNode *motherVoxelNode;
612 G4VPhysicalVolume *motherPhysical, *pPhysical;
613 G4VPVParameterisation *pParam;
614 G4LogicalVolume *motherLogical;
615 G4VSolid *pSolid;
616 G4ThreeVector samplePoint;
617 G4int voxelNoDaughters, replicaNo;
618
619 motherPhysical = history.GetTopVolume();
620 motherLogical = motherPhysical->GetLogicalVolume();
621 motherVoxelHeader = motherLogical->GetVoxelHeader();
622
623 // Find the voxel containing the point
624 //
625 motherVoxelNode = ParamVoxelLocate(motherVoxelHeader,localPoint);
626
627 voxelNoDaughters = motherVoxelNode->GetNoContained();
628 if ( voxelNoDaughters==0 ) { return false; }
629
630 pPhysical = motherLogical->GetDaughter(0);
631 pParam = pPhysical->GetParameterisation();
632
633 // Save parent history in touchable history
634 // ... for use as parent t-h in ComputeMaterial method of param
635 //
636 G4TouchableHistory parentTouchable( history );
637
638 // Search replicated daughter volume
639 //
640 for ( auto sampleNo=voxelNoDaughters-1; sampleNo>=0; sampleNo-- )
641 {
642 replicaNo = motherVoxelNode->GetVolume(sampleNo);
643 if ( (replicaNo!=blockedNum) || (pPhysical!=blockedVol) )
644 {
645 // Obtain solid (as it can vary) and obtain its parameters
646 //
647 pSolid = IdentifyAndPlaceSolid( replicaNo, pPhysical, pParam );
648
649 // Setup history
650 //
651 history.NewLevel(pPhysical, kParameterised, replicaNo);
652 samplePoint = history.GetTopTransform().TransformPoint(globalPoint);
653 if ( !G4AuxiliaryNavServices::CheckPointOnSurface( pSolid, samplePoint,
654 globalDirection, history.GetTopTransform(), pLocatedOnEdge) )
655 {
656 history.BackLevel();
657 }
658 else
659 {
660 // Enter this daughter
661 //
662 localPoint = samplePoint;
663
664 // Set the correct copy number in physical
665 //
666 pPhysical->SetCopyNo(replicaNo);
667
668 // Set the correct solid and material in Logical Volume
669 //
670 G4LogicalVolume *pLogical = pPhysical->GetLogicalVolume();
671 pLogical->SetSolid(pSolid);
672 pLogical->UpdateMaterial(pParam->ComputeMaterial(replicaNo,
673 pPhysical, &parentTouchable) );
674 return true;
675 }
676 }
677 }
678 return false;
679}
static G4bool CheckPointOnSurface(const G4VSolid *sampleSolid, const G4ThreeVector &localPoint, const G4ThreeVector *globalDirection, const G4AffineTransform &sampleTransform, const G4bool locatedOnEdge)
void SetSolid(G4VSolid *pSolid)
G4SmartVoxelHeader * GetVoxelHeader() const
void UpdateMaterial(G4Material *pMaterial)
G4SmartVoxelNode * ParamVoxelLocate(G4SmartVoxelHeader *pHead, const G4ThreeVector &localPoint)
virtual G4Material * ComputeMaterial(const G4int repNo, G4VPhysicalVolume *currentVol, const G4VTouchable *parentTouch=nullptr)
virtual void SetCopyNo(G4int CopyNo)=0
@ kParameterised
Definition: geomdefs.hh:86

References G4AuxiliaryNavServices::CheckPointOnSurface(), G4VPVParameterisation::ComputeMaterial(), G4LogicalVolume::GetDaughter(), G4VPhysicalVolume::GetLogicalVolume(), G4SmartVoxelNode::GetNoContained(), G4VPhysicalVolume::GetParameterisation(), G4SmartVoxelNode::GetVolume(), G4LogicalVolume::GetVoxelHeader(), g4zmq::history(), IdentifyAndPlaceSolid(), kParameterised, ParamVoxelLocate(), G4VPhysicalVolume::SetCopyNo(), G4LogicalVolume::SetSolid(), and G4LogicalVolume::UpdateMaterial().

Referenced by G4ITNavigator1::LocateGlobalPointAndSetup(), G4ITNavigator2::LocateGlobalPointAndSetup(), and G4Navigator::LocateGlobalPointAndSetup().

◆ LocateNextVoxel() [1/2]

G4bool G4VoxelNavigation::LocateNextVoxel ( const G4ThreeVector localPoint,
const G4ThreeVector localDirection,
const G4double  currentStep 
)
protectedinherited

Definition at line 472 of file G4VoxelNavigation.cc.

475{
476 G4SmartVoxelHeader *workHeader=nullptr, *newHeader=nullptr;
477 G4SmartVoxelProxy *newProxy=nullptr;
478 G4SmartVoxelNode *newVoxelNode=nullptr;
479 G4ThreeVector targetPoint, voxelPoint;
480 G4double workNodeWidth, workMinExtent, workCoord;
481 G4double minVal, maxVal, newDistance=0.;
482 G4double newHeaderMin, newHeaderNodeWidth;
483 G4int depth=0, newDepth=0, workNodeNo=0, newNodeNo=0, newHeaderNoSlices=0;
484 EAxis workHeaderAxis, newHeaderAxis;
485 G4bool isNewVoxel = false;
486
487 G4double currentDistance = currentStep;
488
489 // Determine if end of Step within current voxel
490 //
491 for (depth=0; depth<fVoxelDepth; ++depth)
492 {
493 targetPoint = localPoint+localDirection*currentDistance;
494 newDistance = currentDistance;
495 workHeader = fVoxelHeaderStack[depth];
496 workHeaderAxis = fVoxelAxisStack[depth];
497 workNodeNo = fVoxelNodeNoStack[depth];
498 workNodeWidth = fVoxelSliceWidthStack[depth];
499 workMinExtent = workHeader->GetMinExtent();
500 workCoord = targetPoint(workHeaderAxis);
501 minVal = workMinExtent+workNodeNo*workNodeWidth;
502
503 if ( minVal<=workCoord+fHalfTolerance )
504 {
505 maxVal = minVal+workNodeWidth;
506 if ( maxVal<=workCoord-fHalfTolerance )
507 {
508 // Must consider next voxel
509 //
510 newNodeNo = workNodeNo+1;
511 newHeader = workHeader;
512 newDistance = (maxVal-localPoint(workHeaderAxis))
513 / localDirection(workHeaderAxis);
514 isNewVoxel = true;
515 newDepth = depth;
516 }
517 }
518 else
519 {
520 newNodeNo = workNodeNo-1;
521 newHeader = workHeader;
522 newDistance = (minVal-localPoint(workHeaderAxis))
523 / localDirection(workHeaderAxis);
524 isNewVoxel = true;
525 newDepth = depth;
526 }
527 currentDistance = newDistance;
528 }
529 targetPoint = localPoint+localDirection*currentDistance;
530
531 // Check if end of Step within collected boundaries of current voxel
532 //
533 depth = fVoxelDepth;
534 {
535 workHeader = fVoxelHeaderStack[depth];
536 workHeaderAxis = fVoxelAxisStack[depth];
537 workNodeNo = fVoxelNodeNoStack[depth];
538 workNodeWidth = fVoxelSliceWidthStack[depth];
539 workMinExtent = workHeader->GetMinExtent();
540 workCoord = targetPoint(workHeaderAxis);
541 minVal = workMinExtent+fVoxelNode->GetMinEquivalentSliceNo()*workNodeWidth;
542
543 if ( minVal<=workCoord+fHalfTolerance )
544 {
545 maxVal = workMinExtent+(fVoxelNode->GetMaxEquivalentSliceNo()+1)
546 *workNodeWidth;
547 if ( maxVal<=workCoord-fHalfTolerance )
548 {
549 newNodeNo = fVoxelNode->GetMaxEquivalentSliceNo()+1;
550 newHeader = workHeader;
551 newDistance = (maxVal-localPoint(workHeaderAxis))
552 / localDirection(workHeaderAxis);
553 isNewVoxel = true;
554 newDepth = depth;
555 }
556 }
557 else
558 {
559 newNodeNo = fVoxelNode->GetMinEquivalentSliceNo()-1;
560 newHeader = workHeader;
561 newDistance = (minVal-localPoint(workHeaderAxis))
562 / localDirection(workHeaderAxis);
563 isNewVoxel = true;
564 newDepth = depth;
565 }
566 currentDistance = newDistance;
567 }
568 if (isNewVoxel)
569 {
570 // Compute new voxel & adjust voxel stack
571 //
572 // newNodeNo=Candidate node no at
573 // newDepth =refinement depth of crossed voxel boundary
574 // newHeader=Header for crossed voxel
575 // newDistance=distance to crossed voxel boundary (along the track)
576 //
577 if ( (newNodeNo<0) || (newNodeNo>=G4int(newHeader->GetNoSlices())))
578 {
579 // Leaving mother volume
580 //
581 isNewVoxel = false;
582 }
583 else
584 {
585 // Compute intersection point on the least refined
586 // voxel boundary that is hit
587 //
588 voxelPoint = localPoint+localDirection*newDistance;
589 fVoxelNodeNoStack[newDepth] = newNodeNo;
590 fVoxelDepth = newDepth;
591 newVoxelNode = 0;
592 while ( !newVoxelNode )
593 {
594 newProxy = newHeader->GetSlice(newNodeNo);
595 if (newProxy->IsNode())
596 {
597 newVoxelNode = newProxy->GetNode();
598 }
599 else
600 {
601 ++fVoxelDepth;
602 newHeader = newProxy->GetHeader();
603 newHeaderAxis = newHeader->GetAxis();
604 newHeaderNoSlices = newHeader->GetNoSlices();
605 newHeaderMin = newHeader->GetMinExtent();
606 newHeaderNodeWidth = (newHeader->GetMaxExtent()-newHeaderMin)
607 / newHeaderNoSlices;
608 newNodeNo = G4int( (voxelPoint(newHeaderAxis)-newHeaderMin)
609 / newHeaderNodeWidth );
610 // Rounding protection
611 //
612 if ( newNodeNo<0 )
613 {
614 newNodeNo=0;
615 }
616 else if ( newNodeNo>=newHeaderNoSlices )
617 {
618 newNodeNo = newHeaderNoSlices-1;
619 }
620 // Stack info for stepping
621 //
622 fVoxelAxisStack[fVoxelDepth] = newHeaderAxis;
623 fVoxelNoSlicesStack[fVoxelDepth] = newHeaderNoSlices;
624 fVoxelSliceWidthStack[fVoxelDepth] = newHeaderNodeWidth;
625 fVoxelNodeNoStack[fVoxelDepth] = newNodeNo;
626 fVoxelHeaderStack[fVoxelDepth] = newHeader;
627 }
628 }
629 fVoxelNode = newVoxelNode;
630 }
631 }
632 return isNewVoxel;
633}
EAxis GetAxis() const
G4bool IsNode() const
G4SmartVoxelHeader * GetHeader() const
std::vector< G4int > fVoxelNoSlicesStack

References G4VoxelNavigation::fHalfTolerance, G4VoxelNavigation::fVoxelAxisStack, G4VoxelNavigation::fVoxelDepth, G4VoxelNavigation::fVoxelHeaderStack, G4VoxelNavigation::fVoxelNode, G4VoxelNavigation::fVoxelNodeNoStack, G4VoxelNavigation::fVoxelNoSlicesStack, G4VoxelNavigation::fVoxelSliceWidthStack, G4SmartVoxelHeader::GetAxis(), G4SmartVoxelProxy::GetHeader(), G4SmartVoxelNode::GetMaxEquivalentSliceNo(), G4SmartVoxelNode::GetMinEquivalentSliceNo(), G4SmartVoxelHeader::GetMinExtent(), G4SmartVoxelProxy::GetNode(), and G4SmartVoxelProxy::IsNode().

Referenced by G4VoxelNavigation::ComputeStep(), and LocateNextVoxel().

◆ LocateNextVoxel() [2/2]

G4bool G4ParameterisedNavigation::LocateNextVoxel ( const G4ThreeVector localPoint,
const G4ThreeVector localDirection,
const G4double  currentStep,
const EAxis  pAxis 
)
private

Definition at line 540 of file G4ParameterisedNavigation.cc.

545{
546 // If no best axis is specified, adopt default
547 // location strategy as for placements
548 //
549 if ( pAxis==kUndefined )
550 {
551 return G4VoxelNavigation::LocateNextVoxel(localPoint,
552 localDirection,
553 currentStep);
554 }
555
556 G4bool isNewVoxel;
557 G4int newNodeNo;
558 G4double minVal, maxVal, curMinExtent, curCoord;
559
560 curMinExtent = fVoxelHeader->GetMinExtent();
561 curCoord = localPoint(fVoxelAxis)+currentStep*localDirection(fVoxelAxis);
562 minVal = curMinExtent+fVoxelNode->GetMinEquivalentSliceNo()*fVoxelSliceWidth;
563 isNewVoxel = false;
564
565 if ( minVal<=curCoord )
566 {
567 maxVal = curMinExtent
569 if ( maxVal<curCoord )
570 {
571 newNodeNo = fVoxelNode->GetMaxEquivalentSliceNo()+1;
572 if ( newNodeNo<G4int(fVoxelHeader->GetNoSlices()) )
573 {
574 fVoxelNodeNo = newNodeNo;
575 fVoxelNode = fVoxelHeader->GetSlice(newNodeNo)->GetNode();
576 isNewVoxel = true;
577 }
578 }
579 }
580 else
581 {
582 newNodeNo = fVoxelNode->GetMinEquivalentSliceNo()-1;
583
584 // Must locate from newNodeNo no and down to setup stack and fVoxelNode
585 // Repeat or earlier code...
586 //
587 if ( newNodeNo>=0 )
588 {
589 fVoxelNodeNo = newNodeNo;
590 fVoxelNode = fVoxelHeader->GetSlice(newNodeNo)->GetNode();
591 isNewVoxel = true;
592 }
593 }
594 return isNewVoxel;
595}
size_t GetNoSlices() const
G4bool LocateNextVoxel(const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, const G4double currentStep)

References fVoxelAxis, fVoxelHeader, G4VoxelNavigation::fVoxelNode, fVoxelNodeNo, fVoxelSliceWidth, G4SmartVoxelNode::GetMaxEquivalentSliceNo(), G4SmartVoxelNode::GetMinEquivalentSliceNo(), G4SmartVoxelHeader::GetMinExtent(), G4SmartVoxelProxy::GetNode(), G4SmartVoxelHeader::GetNoSlices(), G4SmartVoxelHeader::GetSlice(), kUndefined, and G4VoxelNavigation::LocateNextVoxel().

Referenced by ComputeStep().

◆ ParamVoxelLocate()

G4SmartVoxelNode * G4ParameterisedNavigation::ParamVoxelLocate ( G4SmartVoxelHeader pHead,
const G4ThreeVector localPoint 
)
inline

◆ PostComputeStepLog()

void G4VoxelNavigation::PostComputeStepLog ( const G4VSolid motherSolid,
const G4ThreeVector localPoint,
const G4ThreeVector localDirection,
G4double  motherStep,
G4double  motherSafety 
)
privateinherited

◆ PreComputeStepLog()

void G4VoxelNavigation::PreComputeStepLog ( const G4VPhysicalVolume motherPhysical,
G4double  motherSafety,
const G4ThreeVector localPoint 
)
privateinherited

◆ PrintDaughterLog()

void G4VoxelNavigation::PrintDaughterLog ( const G4VSolid sampleSolid,
const G4ThreeVector samplePoint,
G4double  sampleSafety,
G4double  sampleStep 
)
inlineprivateinherited

◆ SetVerboseLevel()

void G4VoxelNavigation::SetVerboseLevel ( G4int  level)
inherited

◆ VoxelLocate()

G4SmartVoxelNode * G4VoxelNavigation::VoxelLocate ( G4SmartVoxelHeader pHead,
const G4ThreeVector localPoint 
)
inherited

◆ VoxelLocateLight()

G4SmartVoxelNode * G4VoxelNavigation::VoxelLocateLight ( G4SmartVoxelHeader pHead,
const G4ThreeVector localPoint 
) const
protectedinherited

Field Documentation

◆ fBestSafety

G4bool G4VoxelNavigation::fBestSafety = false
protectedinherited

Definition at line 186 of file G4VoxelNavigation.hh.

Referenced by G4VoxelNavigation::ComputeSafety().

◆ fBList

G4BlockingList G4VoxelNavigation::fBList
protectedinherited

Definition at line 146 of file G4VoxelNavigation.hh.

Referenced by ComputeStep(), and G4VoxelNavigation::ComputeStep().

◆ fCheck

G4bool G4VoxelNavigation::fCheck = false
protectedinherited

◆ fHalfTolerance

G4double G4VoxelNavigation::fHalfTolerance
protectedinherited

◆ fLogger

G4NavigationLogger* G4VoxelNavigation::fLogger
protectedinherited

◆ fpVoxelSafety

G4VoxelSafety* G4VoxelNavigation::fpVoxelSafety = nullptr
protectedinherited

◆ fVoxelAxis

EAxis G4ParameterisedNavigation::fVoxelAxis = kUndefined
private

◆ fVoxelAxisStack

std::vector<EAxis> G4VoxelNavigation::fVoxelAxisStack
protectedinherited

◆ fVoxelDepth

G4int G4VoxelNavigation::fVoxelDepth = -1
protectedinherited

◆ fVoxelHeader

G4SmartVoxelHeader* G4ParameterisedNavigation::fVoxelHeader = nullptr
private

◆ fVoxelHeaderStack

std::vector<G4SmartVoxelHeader*> G4VoxelNavigation::fVoxelHeaderStack
protectedinherited

◆ fVoxelNode

G4SmartVoxelNode* G4VoxelNavigation::fVoxelNode = nullptr
protectedinherited

◆ fVoxelNodeNo

size_t G4ParameterisedNavigation::fVoxelNodeNo = 0
private

◆ fVoxelNodeNoStack

std::vector<G4int> G4VoxelNavigation::fVoxelNodeNoStack
protectedinherited

◆ fVoxelNoSlices

G4int G4ParameterisedNavigation::fVoxelNoSlices = 0
private

Definition at line 115 of file G4ParameterisedNavigation.hh.

◆ fVoxelNoSlicesStack

std::vector<G4int> G4VoxelNavigation::fVoxelNoSlicesStack
protectedinherited

Definition at line 160 of file G4VoxelNavigation.hh.

Referenced by G4VoxelNavigation::LocateNextVoxel().

◆ fVoxelSliceWidth

G4double G4ParameterisedNavigation::fVoxelSliceWidth = 0.0
private

◆ fVoxelSliceWidthStack

std::vector<G4double> G4VoxelNavigation::fVoxelSliceWidthStack
protectedinherited

The documentation for this class was generated from the following files: