Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ParameterisedNavigation.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 G4ParameterisedNavigation Implementation
31//
32// Initial Author: P.Kent, 1996
33// Revisions:
34// J. Apostolakis 24 Nov 2005, Revised/fixed treatment of nested params
35// J. Apostolakis 4 Feb 2005, Reintroducting multi-level parameterisation
36// for materials only - see note 1 below
37// G. Cosmo 11 Mar 2004, Added Check mode
38// G. Cosmo 15 May 2002, Extended to 3-d voxelisation, made subclass
39// J. Apostolakis 5 Mar 1998, Enabled parameterisation of mat & solid type
40// --------------------------------------------------------------------
41
42// Note 1: Design/implementation note for extensions - JAp, March 1st, 2005
43// We cannot make the solid, dimensions and transformation dependent on
44// parent because the voxelisation will not have access to this.
45// So the following can NOT be done:
46// sampleSolid = curParam->ComputeSolid(num, curPhysical, pParentTouch);
47// sampleSolid->ComputeDimensions(curParam, num, curPhysical, pParentTouch);
48// curParam->ComputeTransformation(num, curPhysical, pParentTouch);
49
51#include "G4TouchableHistory.hh"
53
54// ********************************************************************
55// Constructor
56// ********************************************************************
57//
59 : fVoxelAxis(kUndefined), fVoxelNoSlices(0), fVoxelSliceWidth(0.),
60 fVoxelNodeNo(0), fVoxelHeader(0)
61{
62}
63
64// ***************************************************************************
65// Destructor
66// ***************************************************************************
67//
69{
70}
71
72// ***************************************************************************
73// ComputeStep
74// ***************************************************************************
75//
77 ComputeStep(const G4ThreeVector& localPoint,
78 const G4ThreeVector& localDirection,
79 const G4double currentProposedStepLength,
80 G4double& newSafety,
81 G4NavigationHistory& history,
82 G4bool& validExitNormal,
83 G4ThreeVector& exitNormal,
84 G4bool& exiting,
85 G4bool& entering,
86 G4VPhysicalVolume *(*pBlockedPhysical),
87 G4int& blockedReplicaNo)
88{
89 G4VPhysicalVolume *motherPhysical, *samplePhysical;
90 G4VPVParameterisation *sampleParam;
91 G4LogicalVolume *motherLogical;
92 G4VSolid *motherSolid, *sampleSolid;
93 G4ThreeVector sampleDirection;
94 G4double ourStep=currentProposedStepLength, motherSafety, ourSafety;
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 G4Exception("G4ParameterisedNavigation::ComputeStep()",
153 "GeomNav1002", JustWarning, message,
154 "Point is a little outside Current Volume.");
155 }
156 }
157#endif
158
159 //
160 // Compute daughter safeties & intersections
161 //
162
163 initialNode = true;
164 noStep = true;
165
166 // By definition, parameterised volumes exist as first
167 // daughter of the mother volume
168 //
169 samplePhysical = motherLogical->GetDaughter(0);
170 samplePhysical->GetReplicationData(axis,nReplicas,width,offset,consuming);
171 fBList.Enlarge(nReplicas);
172 fBList.Reset();
173
174 // Exiting normal optimisation
175 //
176 if (exiting && (*pBlockedPhysical==samplePhysical) && validExitNormal)
177 {
178 if (localDirection.dot(exitNormal)>=kMinExitingNormalCosine)
179 {
180 // Block exited daughter replica; Must be on boundary => zero safety
181 //
182 fBList.BlockVolume(blockedReplicaNo);
183 ourSafety = 0;
184 }
185 }
186 exiting = false;
187 entering = false;
188
189 sampleParam = samplePhysical->GetParameterisation();
190
191 do
192 {
193 curVoxelNode = fVoxelNode;
194 curNoVolumes = curVoxelNode->GetNoContained();
195
196 for ( contentNo=curNoVolumes-1; contentNo>=0; contentNo-- )
197 {
198 sampleNo = curVoxelNode->GetVolume(contentNo);
199 if ( !fBList.IsBlocked(sampleNo) )
200 {
201 fBList.BlockVolume(sampleNo);
202
203 // Call virtual methods, and copy information if needed
204 //
205 sampleSolid = IdentifyAndPlaceSolid( sampleNo, samplePhysical,
206 sampleParam );
207
208 G4AffineTransform sampleTf(samplePhysical->GetRotation(),
209 samplePhysical->GetTranslation());
210 sampleTf.Invert();
211 const G4ThreeVector samplePoint = sampleTf.TransformPoint(localPoint);
212 const G4double sampleSafety = sampleSolid->DistanceToIn(samplePoint);
213 if ( sampleSafety<ourSafety )
214 {
215 ourSafety = sampleSafety;
216 }
217 if ( sampleSafety<=ourStep )
218 {
219 sampleDirection = sampleTf.TransformAxis(localDirection);
220 G4double sampleStep =
221 sampleSolid->DistanceToIn(samplePoint, sampleDirection);
222 if ( sampleStep<=ourStep )
223 {
224 ourStep = sampleStep;
225 entering = true;
226 exiting = false;
227 *pBlockedPhysical = samplePhysical;
228 blockedReplicaNo = sampleNo;
229#ifdef G4VERBOSE
230 // Check to see that the resulting point is indeed in/on volume.
231 // This check could eventually be made only for successful
232 // candidate.
233
234 if ( ( fCheck ) && ( sampleStep < kInfinity ) )
235 {
236 G4ThreeVector intersectionPoint;
237 intersectionPoint= samplePoint + sampleStep * sampleDirection;
238 EInside insideIntPt= sampleSolid->Inside(intersectionPoint);
239 if( insideIntPt != kSurface )
240 {
241 G4int oldcoutPrec = G4cout.precision(16);
242 std::ostringstream message;
243 message << "Navigator gets conflicting response from Solid."
244 << G4endl
245 << " Inaccurate solid DistanceToIn"
246 << " for solid " << sampleSolid->GetName() << G4endl
247 << " Solid gave DistanceToIn = "
248 << sampleStep << " yet returns " ;
249 if( insideIntPt == kInside )
250 message << "-kInside-";
251 else if( insideIntPt == kOutside )
252 message << "-kOutside-";
253 else
254 message << "-kSurface-";
255 message << " for this point !" << G4endl
256 << " Point = " << intersectionPoint
257 << G4endl;
258 if ( insideIntPt != kInside )
259 message << " DistanceToIn(p) = "
260 << sampleSolid->DistanceToIn(intersectionPoint);
261 if ( insideIntPt != kOutside )
262 message << " DistanceToOut(p) = "
263 << sampleSolid->DistanceToOut(intersectionPoint);
264 G4Exception("G4ParameterisedNavigation::ComputeStep()",
265 "GeomNav1002", JustWarning, message);
266 G4cout.precision(oldcoutPrec);
267 }
268 }
269#endif
270 }
271 }
272 }
273 }
274
275 if ( initialNode )
276 {
277 initialNode = false;
278 voxelSafety = ComputeVoxelSafety(localPoint,axis);
279 if ( voxelSafety<ourSafety )
280 {
281 ourSafety = voxelSafety;
282 }
283 if ( currentProposedStepLength<ourSafety )
284 {
285 // Guaranteed physics limited
286 //
287 noStep = false;
288 entering = false;
289 exiting = false;
290 *pBlockedPhysical = 0;
291 ourStep = kInfinity;
292 }
293 else
294 {
295 //
296 // Compute mother intersection if required
297 //
298 if ( motherSafety<=ourStep )
299 {
300 G4double motherStep = motherSolid->DistanceToOut(localPoint,
301 localDirection,
302 true,
303 &validExitNormal,
304 &exitNormal);
305#ifdef G4VERBOSE
306 if ( fCheck )
307 if( ( motherStep < 0.0 ) || ( motherStep >= kInfinity) )
308 {
309 G4int oldPrOut= G4cout.precision(16);
310 G4int oldPrErr= G4cerr.precision(16);
311 std::ostringstream message;
312 message << "Current point is outside the current solid !"
313 << G4endl
314 << " Problem in Navigation" << G4endl
315 << " Point (local coordinates): "
316 << localPoint << G4endl
317 << " Local Direction: "
318 << localDirection << G4endl
319 << " Solid: " << motherSolid->GetName();
320 motherSolid->DumpInfo();
321 G4Exception("G4ParameterisedNavigation::ComputeStep()",
322 "GeomNav0003", FatalException, message);
323 G4cout.precision(oldPrOut);
324 G4cerr.precision(oldPrErr);
325 }
326#endif
327 if ( motherStep<=ourStep )
328 {
329 ourStep = motherStep;
330 exiting = true;
331 entering = false;
332 if ( validExitNormal )
333 {
334 const G4RotationMatrix *rot = motherPhysical->GetRotation();
335 if (rot)
336 {
337 exitNormal *= rot->inverse();
338 }
339 }
340 }
341 else
342 {
343 validExitNormal = false;
344 }
345 }
346 }
347 newSafety=ourSafety;
348 }
349 if (noStep)
350 {
351 noStep = LocateNextVoxel(localPoint, localDirection, ourStep, axis);
352 }
353 } while (noStep);
354
355 return ourStep;
356}
357
358// ***************************************************************************
359// ComputeSafety
360// ***************************************************************************
361//
364 const G4NavigationHistory& history,
365 const G4double )
366{
367 G4VPhysicalVolume *motherPhysical, *samplePhysical;
368 G4VPVParameterisation *sampleParam;
369 G4LogicalVolume *motherLogical;
370 G4VSolid *motherSolid, *sampleSolid;
371 G4double motherSafety, ourSafety;
372 G4int sampleNo, curVoxelNodeNo;
373
374 G4SmartVoxelNode *curVoxelNode;
375 G4int curNoVolumes, contentNo;
376 G4double voxelSafety;
377
378 // Replication data
379 //
380 EAxis axis;
381 G4int nReplicas;
382 G4double width, offset;
383 G4bool consuming;
384
385 motherPhysical = history.GetTopVolume();
386 motherLogical = motherPhysical->GetLogicalVolume();
387 motherSolid = motherLogical->GetSolid();
388
389 //
390 // Compute mother safety
391 //
392
393 motherSafety = motherSolid->DistanceToOut(localPoint);
394 ourSafety = motherSafety; // Working isotropic safety
395
396 //
397 // Compute daughter safeties
398 //
399
400 // By definition, parameterised volumes exist as first
401 // daughter of the mother volume
402 //
403 samplePhysical = motherLogical->GetDaughter(0);
404 samplePhysical->GetReplicationData(axis, nReplicas,
405 width, offset, consuming);
406 sampleParam = samplePhysical->GetParameterisation();
407
408 // Look inside the current Voxel only at the current point
409 //
410 if ( axis==kUndefined ) // 3D case: current voxel node is retrieved
411 { // from G4VoxelNavigation.
412 curVoxelNode = fVoxelNode;
413 }
414 else // 1D case: current voxel node is computed here.
415 {
416 curVoxelNodeNo = G4int((localPoint(fVoxelAxis)
417 -fVoxelHeader->GetMinExtent()) / fVoxelSliceWidth );
418 curVoxelNode = fVoxelHeader->GetSlice(curVoxelNodeNo)->GetNode();
419 fVoxelNodeNo = curVoxelNodeNo;
420 fVoxelNode = curVoxelNode;
421 }
422 curNoVolumes = curVoxelNode->GetNoContained();
423
424 for ( contentNo=curNoVolumes-1; contentNo>=0; contentNo-- )
425 {
426 sampleNo = curVoxelNode->GetVolume(contentNo);
427
428 // Call virtual methods, and copy information if needed
429 //
430 sampleSolid= IdentifyAndPlaceSolid( sampleNo,samplePhysical,sampleParam );
431
432 G4AffineTransform sampleTf(samplePhysical->GetRotation(),
433 samplePhysical->GetTranslation());
434 sampleTf.Invert();
435 const G4ThreeVector samplePoint = sampleTf.TransformPoint(localPoint);
436 G4double sampleSafety = sampleSolid->DistanceToIn(samplePoint);
437 if ( sampleSafety<ourSafety )
438 {
439 ourSafety = sampleSafety;
440 }
441 }
442
443 voxelSafety = ComputeVoxelSafety(localPoint,axis);
444 if ( voxelSafety<ourSafety )
445 {
446 ourSafety=voxelSafety;
447 }
448
449 return ourSafety;
450}
451
452// ********************************************************************
453// ComputeVoxelSafety
454//
455// Computes safety from specified point to collected voxel boundaries
456// using already located point.
457// ********************************************************************
458//
459G4double G4ParameterisedNavigation::
460ComputeVoxelSafety(const G4ThreeVector& localPoint,
461 const EAxis pAxis) const
462{
463 // If no best axis is specified, adopt default
464 // strategy as for placements
465 //
466 if ( pAxis==kUndefined )
467 {
468 return G4VoxelNavigation::ComputeVoxelSafety(localPoint);
469 }
470
471 G4double voxelSafety, plusVoxelSafety, minusVoxelSafety;
472 G4double curNodeOffset, minCurCommonDelta, maxCurCommonDelta;
473 G4int minCurNodeNoDelta, maxCurNodeNoDelta;
474
475 // Compute linear intersection distance to boundaries of max/min
476 // to collected nodes at current level
477 //
478 curNodeOffset = fVoxelNodeNo*fVoxelSliceWidth;
479 minCurCommonDelta = localPoint(fVoxelAxis)
480 - fVoxelHeader->GetMinExtent()-curNodeOffset;
481 maxCurNodeNoDelta = fVoxelNode->GetMaxEquivalentSliceNo()-fVoxelNodeNo;
482 minCurNodeNoDelta = fVoxelNodeNo-fVoxelNode->GetMinEquivalentSliceNo();
483 maxCurCommonDelta = fVoxelSliceWidth-minCurCommonDelta;
484 plusVoxelSafety = minCurNodeNoDelta*fVoxelSliceWidth+minCurCommonDelta;
485 minusVoxelSafety = maxCurNodeNoDelta*fVoxelSliceWidth+maxCurCommonDelta;
486 voxelSafety = std::min(plusVoxelSafety,minusVoxelSafety);
487
488 if ( voxelSafety<0 )
489 {
490 voxelSafety = 0;
491 }
492
493 return voxelSafety;
494}
495
496// ********************************************************************
497// LocateNextVoxel
498//
499// Finds the next voxel from the current voxel and point
500// in the specified direction.
501//
502// Returns false if all voxels considered
503// true otherwise
504// [current Step ends inside same voxel or leaves all voxels]
505// ********************************************************************
506//
507G4bool G4ParameterisedNavigation::
508LocateNextVoxel( const G4ThreeVector& localPoint,
509 const G4ThreeVector& localDirection,
510 const G4double currentStep,
511 const EAxis pAxis)
512{
513 // If no best axis is specified, adopt default
514 // location strategy as for placements
515 //
516 if ( pAxis==kUndefined )
517 {
518 return G4VoxelNavigation::LocateNextVoxel(localPoint,
519 localDirection,
520 currentStep);
521 }
522
523 G4bool isNewVoxel;
524 G4int newNodeNo;
525 G4double minVal, maxVal, curMinExtent, curCoord;
526
527 curMinExtent = fVoxelHeader->GetMinExtent();
528 curCoord = localPoint(fVoxelAxis)+currentStep*localDirection(fVoxelAxis);
529 minVal = curMinExtent+fVoxelNode->GetMinEquivalentSliceNo()*fVoxelSliceWidth;
530 isNewVoxel = false;
531
532 if ( minVal<=curCoord )
533 {
534 maxVal = curMinExtent
535 + (fVoxelNode->GetMaxEquivalentSliceNo()+1)*fVoxelSliceWidth;
536 if ( maxVal<curCoord )
537 {
538 newNodeNo = fVoxelNode->GetMaxEquivalentSliceNo()+1;
539 if ( newNodeNo<fVoxelHeader->GetNoSlices() )
540 {
541 fVoxelNodeNo = newNodeNo;
542 fVoxelNode = fVoxelHeader->GetSlice(newNodeNo)->GetNode();
543 isNewVoxel = true;
544 }
545 }
546 }
547 else
548 {
549 newNodeNo = fVoxelNode->GetMinEquivalentSliceNo()-1;
550
551 // Must locate from newNodeNo no and down to setup stack and fVoxelNode
552 // Repeat or earlier code...
553 //
554 if ( newNodeNo>=0 )
555 {
556 fVoxelNodeNo = newNodeNo;
557 fVoxelNode = fVoxelHeader->GetSlice(newNodeNo)->GetNode();
558 isNewVoxel = true;
559 }
560 }
561 return isNewVoxel;
562}
563
564// ********************************************************************
565// LevelLocate
566// ********************************************************************
567//
568G4bool
570 const G4VPhysicalVolume* blockedVol,
571 const G4int blockedNum,
572 const G4ThreeVector& globalPoint,
573 const G4ThreeVector* globalDirection,
574 const G4bool pLocatedOnEdge,
575 G4ThreeVector& localPoint )
576{
577 G4SmartVoxelHeader *motherVoxelHeader;
578 G4SmartVoxelNode *motherVoxelNode;
579 G4VPhysicalVolume *motherPhysical, *pPhysical;
580 G4VPVParameterisation *pParam;
581 G4LogicalVolume *motherLogical;
582 G4VSolid *pSolid;
583 G4ThreeVector samplePoint;
584 G4int voxelNoDaughters, replicaNo;
585
586 motherPhysical = history.GetTopVolume();
587 motherLogical = motherPhysical->GetLogicalVolume();
588 motherVoxelHeader = motherLogical->GetVoxelHeader();
589
590 // Find the voxel containing the point
591 //
592 motherVoxelNode = ParamVoxelLocate(motherVoxelHeader,localPoint);
593
594 voxelNoDaughters = motherVoxelNode->GetNoContained();
595 if ( voxelNoDaughters==0 ) { return false; }
596
597 pPhysical = motherLogical->GetDaughter(0);
598 pParam = pPhysical->GetParameterisation();
599
600 // Save parent history in touchable history
601 // ... for use as parent t-h in ComputeMaterial method of param
602 //
603 G4TouchableHistory parentTouchable( history );
604
605 // Search replicated daughter volume
606 //
607 for ( register int sampleNo=voxelNoDaughters-1; sampleNo>=0; sampleNo-- )
608 {
609 replicaNo = motherVoxelNode->GetVolume(sampleNo);
610 if ( (replicaNo!=blockedNum) || (pPhysical!=blockedVol) )
611 {
612 // Obtain solid (as it can vary) and obtain its parameters
613 //
614 pSolid = IdentifyAndPlaceSolid( replicaNo, pPhysical, pParam );
615
616 // Setup history
617 //
618 history.NewLevel(pPhysical, kParameterised, replicaNo);
619 samplePoint = history.GetTopTransform().TransformPoint(globalPoint);
620 if ( !G4AuxiliaryNavServices::CheckPointOnSurface( pSolid, samplePoint,
621 globalDirection, history.GetTopTransform(), pLocatedOnEdge) )
622 {
623 history.BackLevel();
624 }
625 else
626 {
627 // Enter this daughter
628 //
629 localPoint = samplePoint;
630
631 // Set the correct copy number in physical
632 //
633 pPhysical->SetCopyNo(replicaNo);
634
635 // Set the correct solid and material in Logical Volume
636 //
637 G4LogicalVolume *pLogical = pPhysical->GetLogicalVolume();
638 pLogical->SetSolid(pSolid);
639 pLogical->UpdateMaterial(pParam->ComputeMaterial(replicaNo,
640 pPhysical, &parentTouchable) );
641 return true;
642 }
643 }
644 }
645 return false;
646}
@ JustWarning
@ FatalException
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
double dot(const Hep3Vector &) const
HepRotation inverse() const
G4AffineTransform & Invert()
G4ThreeVector TransformPoint(const G4ThreeVector &vec) const
G4ThreeVector TransformAxis(const G4ThreeVector &axis) const
static G4bool CheckPointOnSurface(const G4VSolid *sampleSolid, const G4ThreeVector &localPoint, const G4ThreeVector *globalDirection, const G4AffineTransform &sampleTransform, const G4bool locatedOnEdge)
void BlockVolume(const G4int v)
void Enlarge(const G4int nv)
G4bool IsBlocked(const G4int v) const
G4VSolid * GetSolid() const
G4VPhysicalVolume * GetDaughter(const G4int i) const
void SetSolid(G4VSolid *pSolid)
G4SmartVoxelHeader * GetVoxelHeader() const
void UpdateMaterial(G4Material *pMaterial)
void NewLevel(G4VPhysicalVolume *pNewMother, EVolume vType=kNormal, G4int nReplica=-1)
const G4AffineTransform & GetTopTransform() const
G4VPhysicalVolume * GetTopVolume() const
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)
G4SmartVoxelNode * ParamVoxelLocate(G4SmartVoxelHeader *pHead, const G4ThreeVector &localPoint)
G4bool LevelLocate(G4NavigationHistory &history, const G4VPhysicalVolume *blockedVol, const G4int blockedNum, const G4ThreeVector &globalPoint, const G4ThreeVector *globalDirection, const G4bool pLocatedOnEdge, G4ThreeVector &localPoint)
G4double ComputeSafety(const G4ThreeVector &localPoint, const G4NavigationHistory &history, const G4double pProposedMaxLength=DBL_MAX)
G4double GetMinExtent() const
G4SmartVoxelProxy * GetSlice(G4int n) const
G4int GetMaxEquivalentSliceNo() const
G4int GetNoContained() const
G4int GetVolume(G4int pVolumeNo) const
G4int GetMinEquivalentSliceNo() const
G4SmartVoxelNode * GetNode() const
virtual G4Material * ComputeMaterial(const G4int repNo, G4VPhysicalVolume *currentVol, const G4VTouchable *parentTouch=0)
const G4RotationMatrix * GetRotation() const
virtual void SetCopyNo(G4int CopyNo)=0
G4LogicalVolume * GetLogicalVolume() const
virtual void GetReplicationData(EAxis &axis, G4int &nReplicas, G4double &width, G4double &offset, G4bool &consuming) const =0
const G4String & GetName() const
virtual G4VPVParameterisation * GetParameterisation() const =0
const G4ThreeVector & GetTranslation() const
G4String GetName() const
G4double GetTolerance() const
virtual EInside Inside(const G4ThreeVector &p) const =0
void DumpInfo() const
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
G4SmartVoxelNode * fVoxelNode
G4bool LocateNextVoxel(const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, const G4double currentStep)
G4BlockingList fBList
G4double ComputeVoxelSafety(const G4ThreeVector &localPoint) const
EAxis
Definition: geomdefs.hh:54
@ kUndefined
Definition: geomdefs.hh:54
EInside
Definition: geomdefs.hh:58
@ kInside
Definition: geomdefs.hh:58
@ kOutside
Definition: geomdefs.hh:58
@ kSurface
Definition: geomdefs.hh:58
@ kParameterised
Definition: geomdefs.hh:68
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41