Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4VoxelNavigation.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// $Id$
28//
29//
30// class G4VoxelNavigation Implementation
31//
32// Author: P.Kent, 1996
33//
34// --------------------------------------------------------------------
35
36#include "G4VoxelNavigation.hh"
38#include "G4VoxelSafety.hh"
39
40// ********************************************************************
41// Constructor
42// ********************************************************************
43//
45 : fBList(), fVoxelDepth(-1),
46 fVoxelAxisStack(kNavigatorVoxelStackMax,kXAxis),
47 fVoxelNoSlicesStack(kNavigatorVoxelStackMax,0),
48 fVoxelSliceWidthStack(kNavigatorVoxelStackMax,0.),
49 fVoxelNodeNoStack(kNavigatorVoxelStackMax,0),
50 fVoxelHeaderStack(kNavigatorVoxelStackMax,(G4SmartVoxelHeader*)0),
51 fVoxelNode(0), fpVoxelSafety(0), fCheck(false), fBestSafety(false)
52{
53 fLogger = new G4NavigationLogger("G4VoxelNavigation");
55}
56
57// ********************************************************************
58// Destructor
59// ********************************************************************
60//
62{
63 delete fpVoxelSafety;
64 delete fLogger;
65}
66
67// ********************************************************************
68// ComputeStep
69// ********************************************************************
70//
73 const G4ThreeVector& localDirection,
74 const G4double currentProposedStepLength,
75 G4double& newSafety,
76 G4NavigationHistory& history,
77 G4bool& validExitNormal,
78 G4ThreeVector& exitNormal,
79 G4bool& exiting,
80 G4bool& entering,
81 G4VPhysicalVolume *(*pBlockedPhysical),
82 G4int& blockedReplicaNo )
83{
84 G4VPhysicalVolume *motherPhysical, *samplePhysical, *blockedExitedVol=0;
85 G4LogicalVolume *motherLogical;
86 G4VSolid *motherSolid;
87 G4ThreeVector sampleDirection;
88 G4double ourStep=currentProposedStepLength, motherSafety, ourSafety;
89 G4int localNoDaughters, sampleNo;
90
91 G4bool initialNode, noStep;
92 G4SmartVoxelNode *curVoxelNode;
93 G4int curNoVolumes, contentNo;
94 G4double voxelSafety;
95
96 motherPhysical = history.GetTopVolume();
97 motherLogical = motherPhysical->GetLogicalVolume();
98 motherSolid = motherLogical->GetSolid();
99
100 //
101 // Compute mother safety
102 //
103
104 motherSafety = motherSolid->DistanceToOut(localPoint);
105 ourSafety = motherSafety; // Working isotropic safety
106
107#ifdef G4VERBOSE
108 if ( fCheck )
109 {
110 fLogger->PreComputeStepLog (motherPhysical, motherSafety, localPoint);
111 }
112#endif
113
114 //
115 // Compute daughter safeties & intersections
116 //
117
118 // Exiting normal optimisation
119 //
120 if ( exiting && validExitNormal )
121 {
122 if ( localDirection.dot(exitNormal)>=kMinExitingNormalCosine )
123 {
124 // Block exited daughter volume
125 //
126 blockedExitedVol = *pBlockedPhysical;
127 ourSafety = 0;
128 }
129 }
130 exiting = false;
131 entering = false;
132
133 localNoDaughters = motherLogical->GetNoDaughters();
134
135 fBList.Enlarge(localNoDaughters);
136 fBList.Reset();
137
138 initialNode = true;
139 noStep = true;
140
141 while (noStep)
142 {
143 curVoxelNode = fVoxelNode;
144 curNoVolumes = curVoxelNode->GetNoContained();
145 for (contentNo=curNoVolumes-1; contentNo>=0; contentNo--)
146 {
147 sampleNo = curVoxelNode->GetVolume(contentNo);
148 if ( !fBList.IsBlocked(sampleNo) )
149 {
150 fBList.BlockVolume(sampleNo);
151 samplePhysical = motherLogical->GetDaughter(sampleNo);
152 if ( samplePhysical!=blockedExitedVol )
153 {
154 G4AffineTransform sampleTf(samplePhysical->GetRotation(),
155 samplePhysical->GetTranslation());
156 sampleTf.Invert();
157 const G4ThreeVector samplePoint =
158 sampleTf.TransformPoint(localPoint);
159 const G4VSolid *sampleSolid =
160 samplePhysical->GetLogicalVolume()->GetSolid();
161 const G4double sampleSafety =
162 sampleSolid->DistanceToIn(samplePoint);
163#ifdef G4VERBOSE
164 if( fCheck )
165 {
166 fLogger->PrintDaughterLog(sampleSolid,samplePoint,sampleSafety,0);
167 }
168#endif
169 if ( sampleSafety<ourSafety )
170 {
171 ourSafety = sampleSafety;
172 }
173 if ( sampleSafety<=ourStep )
174 {
175 sampleDirection = sampleTf.TransformAxis(localDirection);
176 G4double sampleStep =
177 sampleSolid->DistanceToIn(samplePoint, sampleDirection);
178#ifdef G4VERBOSE
179 if( fCheck )
180 {
181 fLogger->PrintDaughterLog(sampleSolid, samplePoint,
182 sampleSafety, sampleStep);
183 }
184#endif
185 if ( sampleStep<=ourStep )
186 {
187 ourStep = sampleStep;
188 entering = true;
189 exiting = false;
190 *pBlockedPhysical = samplePhysical;
191 blockedReplicaNo = -1;
192#ifdef G4VERBOSE
193 // Check to see that the resulting point is indeed in/on volume.
194 // This check could eventually be made only for successful
195 // candidate.
196
197 if ( fCheck )
198 {
199 fLogger->AlongComputeStepLog (sampleSolid, samplePoint,
200 sampleDirection, localDirection, sampleSafety, sampleStep);
201 }
202#endif
203 }
204 }
205 }
206 }
207 }
208 if (initialNode)
209 {
210 initialNode = false;
211 voxelSafety = ComputeVoxelSafety(localPoint);
212 if ( voxelSafety<ourSafety )
213 {
214 ourSafety = voxelSafety;
215 }
216 if ( currentProposedStepLength<ourSafety )
217 {
218 // Guaranteed physics limited
219 //
220 noStep = false;
221 entering = false;
222 exiting = false;
223 *pBlockedPhysical = 0;
224 ourStep = kInfinity;
225 }
226 else
227 {
228 //
229 // Compute mother intersection if required
230 //
231 if ( motherSafety<=ourStep )
232 {
233 G4double motherStep =
234 motherSolid->DistanceToOut(localPoint,
235 localDirection,
236 true, &validExitNormal, &exitNormal);
237#ifdef G4VERBOSE
238 if ( fCheck )
239 {
240 fLogger->PostComputeStepLog(motherSolid, localPoint, localDirection,
241 motherStep, motherSafety);
242 }
243#endif
244 if ( motherStep<=ourStep )
245 {
246 ourStep = motherStep;
247 exiting = true;
248 entering = false;
249 if ( validExitNormal )
250 {
251 const G4RotationMatrix *rot = motherPhysical->GetRotation();
252 if (rot)
253 {
254 exitNormal *= rot->inverse();
255 }
256 }
257 }
258 else
259 {
260 validExitNormal = false;
261 }
262 }
263 }
264 newSafety = ourSafety;
265 }
266 if (noStep)
267 {
268 noStep = LocateNextVoxel(localPoint, localDirection, ourStep);
269 }
270 } // end -while (noStep)- loop
271
272 return ourStep;
273}
274
275// ********************************************************************
276// ComputeVoxelSafety
277//
278// Computes safety from specified point to voxel boundaries
279// using already located point
280// o collected boundaries for most derived level
281// o adjacent boundaries for previous levels
282// ********************************************************************
283//
286{
287 G4SmartVoxelHeader *curHeader;
288 G4double voxelSafety, curNodeWidth;
289 G4double curNodeOffset, minCurCommonDelta, maxCurCommonDelta;
290 G4int minCurNodeNoDelta, maxCurNodeNoDelta;
291 G4int localVoxelDepth, curNodeNo;
292 EAxis curHeaderAxis;
293
294 localVoxelDepth = fVoxelDepth;
295
296 curHeader = fVoxelHeaderStack[localVoxelDepth];
297 curHeaderAxis = fVoxelAxisStack[localVoxelDepth];
298 curNodeNo = fVoxelNodeNoStack[localVoxelDepth];
299 curNodeWidth = fVoxelSliceWidthStack[localVoxelDepth];
300
301 // Compute linear intersection distance to boundaries of max/min
302 // to collected nodes at current level
303 //
304 curNodeOffset = curNodeNo*curNodeWidth;
305 maxCurNodeNoDelta = fVoxelNode->GetMaxEquivalentSliceNo()-curNodeNo;
306 minCurNodeNoDelta = curNodeNo-fVoxelNode->GetMinEquivalentSliceNo();
307 minCurCommonDelta = localPoint(curHeaderAxis)
308 - curHeader->GetMinExtent() - curNodeOffset;
309 maxCurCommonDelta = curNodeWidth-minCurCommonDelta;
310
311 if ( minCurNodeNoDelta<maxCurNodeNoDelta )
312 {
313 voxelSafety = minCurNodeNoDelta*curNodeWidth;
314 voxelSafety += minCurCommonDelta;
315 }
316 else if (maxCurNodeNoDelta < minCurNodeNoDelta)
317 {
318 voxelSafety = maxCurNodeNoDelta*curNodeWidth;
319 voxelSafety += maxCurCommonDelta;
320 }
321 else // (maxCurNodeNoDelta == minCurNodeNoDelta)
322 {
323 voxelSafety = minCurNodeNoDelta*curNodeWidth;
324 voxelSafety += std::min(minCurCommonDelta,maxCurCommonDelta);
325 }
326
327 // Compute isotropic safety to boundaries of previous levels
328 // [NOT to collected boundaries]
329 //
330 while ( (localVoxelDepth>0) && (voxelSafety>0) )
331 {
332 localVoxelDepth--;
333 curHeader = fVoxelHeaderStack[localVoxelDepth];
334 curHeaderAxis = fVoxelAxisStack[localVoxelDepth];
335 curNodeNo = fVoxelNodeNoStack[localVoxelDepth];
336 curNodeWidth = fVoxelSliceWidthStack[localVoxelDepth];
337 curNodeOffset = curNodeNo*curNodeWidth;
338 minCurCommonDelta = localPoint(curHeaderAxis)
339 - curHeader->GetMinExtent() - curNodeOffset;
340 maxCurCommonDelta = curNodeWidth-minCurCommonDelta;
341
342 if ( minCurCommonDelta<voxelSafety )
343 {
344 voxelSafety = minCurCommonDelta;
345 }
346 if ( maxCurCommonDelta<voxelSafety )
347 {
348 voxelSafety = maxCurCommonDelta;
349 }
350 }
351 if ( voxelSafety<0 )
352 {
353 voxelSafety = 0;
354 }
355
356 return voxelSafety;
357}
358
359// ********************************************************************
360// LocateNextVoxel
361//
362// Finds the next voxel from the current voxel and point
363// in the specified direction
364//
365// Returns false if all voxels considered
366// [current Step ends inside same voxel or leaves all voxels]
367// true otherwise
368// [the information on the next voxel is put into the set of
369// fVoxel* variables & "stacks"]
370// ********************************************************************
371//
372G4bool
374 const G4ThreeVector& localDirection,
375 const G4double currentStep)
376{
377 G4SmartVoxelHeader *workHeader=0, *newHeader=0;
378 G4SmartVoxelProxy *newProxy=0;
379 G4SmartVoxelNode *newVoxelNode=0;
380 G4ThreeVector targetPoint, voxelPoint;
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;
386 G4bool isNewVoxel=false;
387
388 G4double currentDistance = currentStep;
389 static const G4double sigma = 0.5*G4GeometryTolerance::GetInstance()
391
392 // Determine if end of Step within current voxel
393 //
394 for (depth=0; depth<fVoxelDepth; depth++)
395 {
396 targetPoint = localPoint+localDirection*currentDistance;
397 newDistance = currentDistance;
398 workHeader = fVoxelHeaderStack[depth];
399 workHeaderAxis = fVoxelAxisStack[depth];
400 workNodeNo = fVoxelNodeNoStack[depth];
401 workNodeWidth = fVoxelSliceWidthStack[depth];
402 workMinExtent = workHeader->GetMinExtent();
403 workCoord = targetPoint(workHeaderAxis);
404 minVal = workMinExtent+workNodeNo*workNodeWidth;
405
406 if ( minVal<=workCoord+sigma )
407 {
408 maxVal = minVal+workNodeWidth;
409 if ( maxVal<=workCoord-sigma )
410 {
411 // Must consider next voxel
412 //
413 newNodeNo = workNodeNo+1;
414 newHeader = workHeader;
415 newDistance = (maxVal-localPoint(workHeaderAxis))
416 / localDirection(workHeaderAxis);
417 isNewVoxel = true;
418 newDepth = depth;
419 }
420 }
421 else
422 {
423 newNodeNo = workNodeNo-1;
424 newHeader = workHeader;
425 newDistance = (minVal-localPoint(workHeaderAxis))
426 / localDirection(workHeaderAxis);
427 isNewVoxel = true;
428 newDepth = depth;
429 }
430 currentDistance = newDistance;
431 }
432 targetPoint = localPoint+localDirection*currentDistance;
433
434 // Check if end of Step within collected boundaries of current voxel
435 //
436 depth = fVoxelDepth;
437 {
438 workHeader = fVoxelHeaderStack[depth];
439 workHeaderAxis = fVoxelAxisStack[depth];
440 workNodeNo = fVoxelNodeNoStack[depth];
441 workNodeWidth = fVoxelSliceWidthStack[depth];
442 workMinExtent = workHeader->GetMinExtent();
443 workCoord = targetPoint(workHeaderAxis);
444 minVal = workMinExtent+fVoxelNode->GetMinEquivalentSliceNo()*workNodeWidth;
445
446 if ( minVal<=workCoord+sigma )
447 {
448 maxVal = workMinExtent+(fVoxelNode->GetMaxEquivalentSliceNo()+1)
449 *workNodeWidth;
450 if ( maxVal<=workCoord-sigma )
451 {
452 newNodeNo = fVoxelNode->GetMaxEquivalentSliceNo()+1;
453 newHeader = workHeader;
454 newDistance = (maxVal-localPoint(workHeaderAxis))
455 / localDirection(workHeaderAxis);
456 isNewVoxel = true;
457 newDepth = depth;
458 }
459 }
460 else
461 {
462 newNodeNo = fVoxelNode->GetMinEquivalentSliceNo()-1;
463 newHeader = workHeader;
464 newDistance = (minVal-localPoint(workHeaderAxis))
465 / localDirection(workHeaderAxis);
466 isNewVoxel = true;
467 newDepth = depth;
468 }
469 currentDistance = newDistance;
470 }
471 if (isNewVoxel)
472 {
473 // Compute new voxel & adjust voxel stack
474 //
475 // newNodeNo=Candidate node no at
476 // newDepth =refinement depth of crossed voxel boundary
477 // newHeader=Header for crossed voxel
478 // newDistance=distance to crossed voxel boundary (along the track)
479 //
480 if ( (newNodeNo<0) || (newNodeNo>=newHeader->GetNoSlices()))
481 {
482 // Leaving mother volume
483 //
484 isNewVoxel = false;
485 }
486 else
487 {
488 // Compute intersection point on the least refined
489 // voxel boundary that is hit
490 //
491 voxelPoint = localPoint+localDirection*newDistance;
492 fVoxelNodeNoStack[newDepth] = newNodeNo;
493 fVoxelDepth = newDepth;
494 newVoxelNode = 0;
495 while ( !newVoxelNode )
496 {
497 newProxy = newHeader->GetSlice(newNodeNo);
498 if (newProxy->IsNode())
499 {
500 newVoxelNode = newProxy->GetNode();
501 }
502 else
503 {
504 fVoxelDepth++;
505 newHeader = newProxy->GetHeader();
506 newHeaderAxis = newHeader->GetAxis();
507 newHeaderNoSlices = newHeader->GetNoSlices();
508 newHeaderMin = newHeader->GetMinExtent();
509 newHeaderNodeWidth = (newHeader->GetMaxExtent()-newHeaderMin)
510 / newHeaderNoSlices;
511 newNodeNo = G4int( (voxelPoint(newHeaderAxis)-newHeaderMin)
512 / newHeaderNodeWidth );
513 // Rounding protection
514 //
515 if ( newNodeNo<0 )
516 {
517 newNodeNo=0;
518 }
519 else if ( newNodeNo>=newHeaderNoSlices )
520 {
521 newNodeNo = newHeaderNoSlices-1;
522 }
523 // Stack info for stepping
524 //
525 fVoxelAxisStack[fVoxelDepth] = newHeaderAxis;
526 fVoxelNoSlicesStack[fVoxelDepth] = newHeaderNoSlices;
527 fVoxelSliceWidthStack[fVoxelDepth] = newHeaderNodeWidth;
528 fVoxelNodeNoStack[fVoxelDepth] = newNodeNo;
529 fVoxelHeaderStack[fVoxelDepth] = newHeader;
530 }
531 }
532 fVoxelNode = newVoxelNode;
533 }
534 }
535 return isNewVoxel;
536}
537
538// ********************************************************************
539// ComputeSafety
540//
541// Calculates the isotropic distance to the nearest boundary from the
542// specified point in the local coordinate system.
543// The localpoint utilised must be within the current volume.
544// ********************************************************************
545//
548 const G4NavigationHistory& history,
549 const G4double maxLength)
550{
551 G4VPhysicalVolume *motherPhysical, *samplePhysical;
552 G4LogicalVolume *motherLogical;
553 G4VSolid *motherSolid;
554 G4double motherSafety, ourSafety;
555 G4int sampleNo;
556 G4SmartVoxelNode *curVoxelNode;
557 G4int curNoVolumes, contentNo;
558 G4double voxelSafety;
559
560 motherPhysical = history.GetTopVolume();
561 motherLogical = motherPhysical->GetLogicalVolume();
562 motherSolid = motherLogical->GetSolid();
563
564 if( fBestSafety )
565 {
566 return fpVoxelSafety->ComputeSafety( localPoint,*motherPhysical,maxLength );
567 }
568
569 //
570 // Compute mother safety
571 //
572
573 motherSafety = motherSolid->DistanceToOut(localPoint);
574 ourSafety = motherSafety; // Working isotropic safety
575
576 if( motherSafety == 0.0 )
577 {
578 // Check that point is inside mother volume
579 EInside insideMother= motherSolid->Inside(localPoint);
580
581#if 1 // def G4DEBUG_NAVIGATION
582 if( insideMother == kOutside )
583 {
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: "
589 << motherSolid->DistanceToIn( localPoint ) << G4endl;
590 message << " Problem occurred with physical volume: "
591 << " Name: " << motherPhysical->GetName()
592 << " Copy No: " << motherPhysical->GetCopyNo() << G4endl
593 << " Local Point = " << localPoint << G4endl;
594 message << " Description of solid: " << G4endl
595 << *motherSolid << G4endl;
596 G4Exception("G4VoxelNavigation::ComputeSafety()", "GeomNav0003",
597 JustWarning, // FatalException,
598 message);
599 }
600#endif
601#if 1 // def G4DEBUG_NAVIGATION
602 // Following check is NOT for an issue - it is only for information
603 // It is allowed that a solid gives approximate safety - even zero.
604 if( insideMother == kInside ) // && fVerbose )
605 {
606 G4ExceptionDescription messageIn;
607
608 messageIn << " Point is Inside, but safety is Zero ." << G4endl;
609 messageIn << " Inexact safety for volume " << motherPhysical->GetName() << G4endl
610 << " Solid: Name= " << motherSolid->GetName()
611 << " Type= " << motherSolid->GetEntityType() << G4endl;
612 messageIn << " Local point= " << localPoint << G4endl;
613 messageIn << " Solid parameters: " << G4endl << *motherSolid << G4endl;
614 G4Exception("G4VoxelNavigation::ComputeSafety()", "GeomNav0003",
615 JustWarning, messageIn);
616 }
617#endif
618 // if( insideMother != kInside )
619 return 0.0;
620 }
621
622#ifdef G4VERBOSE
623 if( fCheck )
624 {
625 fLogger->ComputeSafetyLog (motherSolid, localPoint, motherSafety, true);
626 }
627#endif
628 //
629 // Compute daughter safeties
630 //
631 // Look only inside the current Voxel only (in the first version).
632 //
633 curVoxelNode = fVoxelNode;
634 curNoVolumes = curVoxelNode->GetNoContained();
635
636 for ( contentNo=curNoVolumes-1; contentNo>=0; contentNo-- )
637 {
638 sampleNo = curVoxelNode->GetVolume(contentNo);
639 samplePhysical = motherLogical->GetDaughter(sampleNo);
640
641 G4AffineTransform sampleTf(samplePhysical->GetRotation(),
642 samplePhysical->GetTranslation());
643 sampleTf.Invert();
644 const G4ThreeVector samplePoint =
645 sampleTf.TransformPoint(localPoint);
646 const G4VSolid *sampleSolid =
647 samplePhysical->GetLogicalVolume()->GetSolid();
648 G4double sampleSafety = sampleSolid->DistanceToIn(samplePoint);
649 if ( sampleSafety<ourSafety )
650 {
651 ourSafety = sampleSafety;
652 }
653#ifdef G4VERBOSE
654 if( fCheck )
655 {
656 fLogger->ComputeSafetyLog (sampleSolid,samplePoint,sampleSafety,false);
657 }
658#endif
659 }
660 voxelSafety = ComputeVoxelSafety(localPoint);
661 if ( voxelSafety<ourSafety )
662 {
663 ourSafety = voxelSafety;
664 }
665 return ourSafety;
666}
667
668// ********************************************************************
669// SetVerboseLevel
670// ********************************************************************
671//
673{
674 if( fLogger ) fLogger->SetVerboseLevel(level);
676}
@ JustWarning
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
double dot(const Hep3Vector &) const
HepRotation inverse() const
G4AffineTransform & Invert()
G4ThreeVector TransformPoint(const G4ThreeVector &vec) const
G4ThreeVector TransformAxis(const G4ThreeVector &axis) const
void BlockVolume(const G4int v)
void Enlarge(const G4int nv)
G4bool IsBlocked(const G4int v) const
G4double GetSurfaceTolerance() const
static G4GeometryTolerance * GetInstance()
G4VSolid * GetSolid() const
G4int 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 PostComputeStepLog(const G4VSolid *motherSolid, const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, G4double motherStep, G4double motherSafety) const
void PrintDaughterLog(const G4VSolid *sampleSolid, const G4ThreeVector &samplePoint, G4double sampleSafety, G4double sampleStep) const
void ComputeSafetyLog(const G4VSolid *solid, const G4ThreeVector &point, G4double safety, G4bool banner) const
void AlongComputeStepLog(const G4VSolid *sampleSolid, const G4ThreeVector &samplePoint, const G4ThreeVector &sampleDirection, const G4ThreeVector &localDirection, G4double sampleSafety, G4double sampleStep) const
G4double GetMinExtent() const
EAxis GetAxis() const
G4int GetMaxEquivalentSliceNo() const
G4int GetNoContained() const
G4int GetVolume(G4int pVolumeNo) const
G4int GetMinEquivalentSliceNo() const
G4bool IsNode() const
G4SmartVoxelNode * GetNode() const
G4SmartVoxelHeader * GetHeader() const
const G4RotationMatrix * GetRotation() const
G4LogicalVolume * GetLogicalVolume() const
virtual G4int GetCopyNo() const =0
const G4String & GetName() const
const G4ThreeVector & GetTranslation() const
G4String GetName() const
virtual EInside Inside(const G4ThreeVector &p) const =0
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=0, G4ThreeVector *n=0) const =0
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const =0
virtual G4GeometryType GetEntityType() const =0
G4NavigationLogger * fLogger
virtual G4double ComputeSafety(const G4ThreeVector &globalpoint, const G4NavigationHistory &history, const G4double pMaxLength=DBL_MAX)
virtual 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)
std::vector< G4double > fVoxelSliceWidthStack
std::vector< EAxis > fVoxelAxisStack
G4VoxelSafety * fpVoxelSafety
G4SmartVoxelNode * fVoxelNode
G4bool LocateNextVoxel(const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, const G4double currentStep)
virtual ~G4VoxelNavigation()
std::vector< G4int > fVoxelNodeNoStack
G4BlockingList fBList
std::vector< G4SmartVoxelHeader * > fVoxelHeaderStack
std::vector< G4int > fVoxelNoSlicesStack
G4double ComputeVoxelSafety(const G4ThreeVector &localPoint) const
void SetVerboseLevel(G4int level)
void SetVerboseLevel(G4int level)
G4double ComputeSafety(const G4ThreeVector &localPoint, const G4VPhysicalVolume &currentPhysical, G4double maxLength=DBL_MAX)
EAxis
Definition: geomdefs.hh:54
@ kXAxis
Definition: geomdefs.hh:54
EInside
Definition: geomdefs.hh:58
@ kInside
Definition: geomdefs.hh:58
@ kOutside
Definition: geomdefs.hh:58
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76