Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4Box Class Reference

#include <G4Box.hh>

+ Inheritance diagram for G4Box:

Public Member Functions

 G4Box (const G4String &pName, G4double pX, G4double pY, G4double pZ)
 
 ~G4Box () override
 
void ComputeDimensions (G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep) override
 
void BoundingLimits (G4ThreeVector &pMin, G4ThreeVector &pMax) const override
 
G4bool CalculateExtent (const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const override
 
G4double GetXHalfLength () const
 
G4double GetYHalfLength () const
 
G4double GetZHalfLength () const
 
void SetXHalfLength (G4double dx)
 
void SetYHalfLength (G4double dy)
 
void SetZHalfLength (G4double dz)
 
G4double GetCubicVolume () override
 
G4double GetSurfaceArea () override
 
EInside Inside (const G4ThreeVector &p) const override
 
G4ThreeVector SurfaceNormal (const G4ThreeVector &p) const override
 
G4double DistanceToIn (const G4ThreeVector &p, const G4ThreeVector &v) const override
 
G4double DistanceToIn (const G4ThreeVector &p) const override
 
G4double DistanceToOut (const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=nullptr, G4ThreeVector *n=nullptr) const override
 
G4double DistanceToOut (const G4ThreeVector &p) const override
 
G4GeometryType GetEntityType () const override
 
G4ThreeVector GetPointOnSurface () const override
 
G4VSolidClone () const override
 
std::ostream & StreamInfo (std::ostream &os) const override
 
void DescribeYourselfTo (G4VGraphicsScene &scene) const override
 
G4VisExtent GetExtent () const override
 
G4PolyhedronCreatePolyhedron () const override
 
 G4Box (__void__ &)
 
 G4Box (const G4Box &rhs)
 
G4Boxoperator= (const G4Box &rhs)
 
- Public Member Functions inherited from G4CSGSolid
 G4CSGSolid (const G4String &pName)
 
virtual ~G4CSGSolid ()
 
std::ostream & StreamInfo (std::ostream &os) const override
 
G4PolyhedronGetPolyhedron () const override
 
 G4CSGSolid (__void__ &)
 
 G4CSGSolid (const G4CSGSolid &rhs)
 
G4CSGSolidoperator= (const G4CSGSolid &rhs)
 
- Public Member Functions inherited from G4VSolid
 G4VSolid (const G4String &name)
 
virtual ~G4VSolid ()
 
G4bool operator== (const G4VSolid &s) const
 
G4String GetName () const
 
void SetName (const G4String &name)
 
G4double GetTolerance () const
 
void DumpInfo () const
 
virtual const G4VSolidGetConstituentSolid (G4int no) const
 
virtual G4VSolidGetConstituentSolid (G4int no)
 
virtual const G4DisplacedSolidGetDisplacedSolidPtr () const
 
virtual G4DisplacedSolidGetDisplacedSolidPtr ()
 
 G4VSolid (__void__ &)
 
 G4VSolid (const G4VSolid &rhs)
 
G4VSolidoperator= (const G4VSolid &rhs)
 
G4double EstimateCubicVolume (G4int nStat, G4double epsilon) const
 
G4double EstimateSurfaceArea (G4int nStat, G4double ell) const
 

Additional Inherited Members

- Protected Member Functions inherited from G4CSGSolid
G4double GetRadiusInRing (G4double rmin, G4double rmax) const
 
- Protected Member Functions inherited from G4VSolid
void CalculateClippedPolygonExtent (G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipCrossSection (G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipBetweenSections (G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipPolygon (G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis) const
 
- Protected Attributes inherited from G4CSGSolid
G4double fCubicVolume = 0.0
 
G4double fSurfaceArea = 0.0
 
G4bool fRebuildPolyhedron = false
 
G4PolyhedronfpPolyhedron = nullptr
 
- Protected Attributes inherited from G4VSolid
G4double kCarTolerance
 

Detailed Description

Definition at line 55 of file G4Box.hh.

Constructor & Destructor Documentation

◆ G4Box() [1/3]

G4Box::G4Box ( const G4String & pName,
G4double pX,
G4double pY,
G4double pZ )

Definition at line 52 of file G4Box.cc.

56 : G4CSGSolid(pName), fDx(pX), fDy(pY), fDz(pZ)
57{
58 delta = 0.5*kCarTolerance;
59 if (pX < 2*kCarTolerance ||
60 pY < 2*kCarTolerance ||
61 pZ < 2*kCarTolerance) // limit to thickness of surfaces
62 {
63 std::ostringstream message;
64 message << "Dimensions too small for Solid: " << GetName() << "!" << G4endl
65 << " hX, hY, hZ = " << pX << ", " << pY << ", " << pZ;
66 G4Exception("G4Box::G4Box()", "GeomSolids0002", FatalException, message);
67 }
68}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
#define G4endl
Definition G4ios.hh:67
G4CSGSolid(const G4String &pName)
Definition G4CSGSolid.cc:49
G4String GetName() const
G4double kCarTolerance
Definition G4VSolid.hh:299

Referenced by Clone().

◆ ~G4Box()

G4Box::~G4Box ( )
overridedefault

◆ G4Box() [2/3]

G4Box::G4Box ( __void__ & a)

Definition at line 75 of file G4Box.cc.

76 : G4CSGSolid(a)
77{
78}

◆ G4Box() [3/3]

G4Box::G4Box ( const G4Box & rhs)
default

Member Function Documentation

◆ BoundingLimits()

void G4Box::BoundingLimits ( G4ThreeVector & pMin,
G4ThreeVector & pMax ) const
overridevirtual

Reimplemented from G4VSolid.

Definition at line 202 of file G4Box.cc.

203{
204 pMin.set(-fDx,-fDy,-fDz);
205 pMax.set( fDx, fDy, fDz);
206
207 // Check correctness of the bounding box
208 //
209 if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
210 {
211 std::ostringstream message;
212 message << "Bad bounding box (min >= max) for solid: "
213 << GetName() << " !"
214 << "\npMin = " << pMin
215 << "\npMax = " << pMax;
216 G4Exception("G4Box::BoundingLimits()", "GeomMgt0001", JustWarning, message);
217 DumpInfo();
218 }
219}
@ JustWarning
double z() const
double x() const
double y() const
void set(double x, double y, double z)
void DumpInfo() const

Referenced by CalculateExtent().

◆ CalculateExtent()

G4bool G4Box::CalculateExtent ( const EAxis pAxis,
const G4VoxelLimits & pVoxelLimit,
const G4AffineTransform & pTransform,
G4double & pMin,
G4double & pMax ) const
overridevirtual

Implements G4VSolid.

Definition at line 225 of file G4Box.cc.

229{
230 G4ThreeVector bmin, bmax;
231
232 // Get bounding box
233 BoundingLimits(bmin,bmax);
234
235 // Find extent
236 G4BoundingEnvelope bbox(bmin,bmax);
237 return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
238}
void BoundingLimits(G4ThreeVector &pMin, G4ThreeVector &pMax) const override
Definition G4Box.cc:202

◆ Clone()

G4VSolid * G4Box::Clone ( ) const
overridevirtual

Reimplemented from G4VSolid.

Definition at line 514 of file G4Box.cc.

515{
516 return new G4Box(*this);
517}
G4Box(const G4String &pName, G4double pX, G4double pY, G4double pZ)
Definition G4Box.cc:52

◆ ComputeDimensions()

void G4Box::ComputeDimensions ( G4VPVParameterisation * p,
const G4int n,
const G4VPhysicalVolume * pRep )
overridevirtual

Reimplemented from G4VSolid.

Definition at line 191 of file G4Box.cc.

194{
195 p->ComputeDimensions(*this,n,pRep);
196}
virtual void ComputeDimensions(G4Box &, const G4int, const G4VPhysicalVolume *) const

◆ CreatePolyhedron()

G4Polyhedron * G4Box::CreatePolyhedron ( ) const
overridevirtual

Reimplemented from G4VSolid.

Definition at line 533 of file G4Box.cc.

534{
535 return new G4PolyhedronBox (fDx, fDy, fDz);
536}

Referenced by G4GMocrenFileSceneHandler::AddSolid().

◆ DescribeYourselfTo()

void G4Box::DescribeYourselfTo ( G4VGraphicsScene & scene) const
overridevirtual

Implements G4VSolid.

Definition at line 523 of file G4Box.cc.

524{
525 scene.AddSolid (*this);
526}
virtual void AddSolid(const G4Box &)=0

◆ DistanceToIn() [1/2]

G4double G4Box::DistanceToIn ( const G4ThreeVector & p) const
overridevirtual

Implements G4VSolid.

Definition at line 357 of file G4Box.cc.

358{
359 G4double dist = std::max(std::max(
360 std::abs(p.x())-fDx,
361 std::abs(p.y())-fDy),
362 std::abs(p.z())-fDz);
363 return (dist > 0) ? dist : 0.;
364}
double G4double
Definition G4Types.hh:83

◆ DistanceToIn() [2/2]

G4double G4Box::DistanceToIn ( const G4ThreeVector & p,
const G4ThreeVector & v ) const
overridevirtual

Implements G4VSolid.

Definition at line 320 of file G4Box.cc.

322{
323 // Check if point is on the surface and traveling away
324 //
325 if ((std::abs(p.x()) - fDx) >= -delta && p.x()*v.x() >= 0) return kInfinity;
326 if ((std::abs(p.y()) - fDy) >= -delta && p.y()*v.y() >= 0) return kInfinity;
327 if ((std::abs(p.z()) - fDz) >= -delta && p.z()*v.z() >= 0) return kInfinity;
328
329 // Find intersection
330 //
331 G4double invx = (v.x() == 0) ? DBL_MAX : -1./v.x();
332 G4double dx = std::copysign(fDx,invx);
333 G4double txmin = (p.x() - dx)*invx;
334 G4double txmax = (p.x() + dx)*invx;
335
336 G4double invy = (v.y() == 0) ? DBL_MAX : -1./v.y();
337 G4double dy = std::copysign(fDy,invy);
338 G4double tymin = std::max(txmin,(p.y() - dy)*invy);
339 G4double tymax = std::min(txmax,(p.y() + dy)*invy);
340
341 G4double invz = (v.z() == 0) ? DBL_MAX : -1./v.z();
342 G4double dz = std::copysign(fDz,invz);
343 G4double tmin = std::max(tymin,(p.z() - dz)*invz);
344 G4double tmax = std::min(tymax,(p.z() + dz)*invz);
345
346 if (tmax <= tmin + delta) return kInfinity; // touch or no hit
347 return (tmin < delta) ? 0. : tmin;
348}
#define DBL_MAX
Definition templates.hh:62

Referenced by G4Voxelizer::DistanceToFirst().

◆ DistanceToOut() [1/2]

G4double G4Box::DistanceToOut ( const G4ThreeVector & p) const
overridevirtual

Implements G4VSolid.

Definition at line 437 of file G4Box.cc.

438{
439#ifdef G4CSGDEBUG
440 if( Inside(p) == kOutside )
441 {
442 std::ostringstream message;
443 G4int oldprc = message.precision(16);
444 message << "Point p is outside (!?) of solid: " << GetName() << G4endl;
445 message << "Position:\n";
446 message << " p.x() = " << p.x()/mm << " mm\n";
447 message << " p.y() = " << p.y()/mm << " mm\n";
448 message << " p.z() = " << p.z()/mm << " mm";
449 G4cout.precision(oldprc);
450 G4Exception("G4Box::DistanceToOut(p)", "GeomSolids1002",
451 JustWarning, message );
452 DumpInfo();
453 }
454#endif
455 G4double dist = std::min(std::min(
456 fDx-std::abs(p.x()),
457 fDy-std::abs(p.y())),
458 fDz-std::abs(p.z()));
459 return (dist > 0) ? dist : 0.;
460}
int G4int
Definition G4Types.hh:85
G4GLOB_DLL std::ostream G4cout
EInside Inside(const G4ThreeVector &p) const override
Definition G4Box.cc:244
@ kOutside
Definition geomdefs.hh:68

◆ DistanceToOut() [2/2]

G4double G4Box::DistanceToOut ( const G4ThreeVector & p,
const G4ThreeVector & v,
const G4bool calcNorm = false,
G4bool * validNorm = nullptr,
G4ThreeVector * n = nullptr ) const
overridevirtual

Implements G4VSolid.

Definition at line 372 of file G4Box.cc.

376{
377 // Check if point is on the surface and traveling away
378 //
379 if ((std::abs(p.x()) - fDx) >= -delta && p.x()*v.x() > 0)
380 {
381 if (calcNorm)
382 {
383 *validNorm = true;
384 n->set((p.x() < 0) ? -1. : 1., 0., 0.);
385 }
386 return 0.;
387 }
388 if ((std::abs(p.y()) - fDy) >= -delta && p.y()*v.y() > 0)
389 {
390 if (calcNorm)
391 {
392 *validNorm = true;
393 n->set(0., (p.y() < 0) ? -1. : 1., 0.);
394 }
395 return 0.;
396 }
397 if ((std::abs(p.z()) - fDz) >= -delta && p.z()*v.z() > 0)
398 {
399 if (calcNorm)
400 {
401 *validNorm = true;
402 n->set(0., 0., (p.z() < 0) ? -1. : 1.);
403 }
404 return 0.;
405 }
406
407 // Find intersection
408 //
409 G4double vx = v.x();
410 G4double tx = (vx == 0) ? DBL_MAX : (std::copysign(fDx,vx) - p.x())/vx;
411
412 G4double vy = v.y();
413 G4double ty = (vy == 0) ? tx : (std::copysign(fDy,vy) - p.y())/vy;
414 G4double txy = std::min(tx,ty);
415
416 G4double vz = v.z();
417 G4double tz = (vz == 0) ? txy : (std::copysign(fDz,vz) - p.z())/vz;
418 G4double tmax = std::min(txy,tz);
419
420 // Set normal, if required, and return distance
421 //
422 if (calcNorm)
423 {
424 *validNorm = true;
425 if (tmax == tx) n->set((v.x() < 0) ? -1. : 1., 0., 0.);
426 else if (tmax == ty) n->set(0., (v.y() < 0) ? -1. : 1., 0.);
427 else n->set(0., 0., (v.z() < 0) ? -1. : 1.);
428 }
429 return tmax;
430}

◆ GetCubicVolume()

G4double G4Box::GetCubicVolume ( )
inlineoverridevirtual

Reimplemented from G4VSolid.

◆ GetEntityType()

G4GeometryType G4Box::GetEntityType ( ) const
overridevirtual

Implements G4VSolid.

Definition at line 466 of file G4Box.cc.

467{
468 return {"G4Box"};
469}

◆ GetExtent()

G4VisExtent G4Box::GetExtent ( ) const
overridevirtual

Reimplemented from G4VSolid.

Definition at line 528 of file G4Box.cc.

529{
530 return { -fDx, fDx, -fDy, fDy, -fDz, fDz };
531}

◆ GetPointOnSurface()

G4ThreeVector G4Box::GetPointOnSurface ( ) const
overridevirtual

Reimplemented from G4VSolid.

Definition at line 495 of file G4Box.cc.

496{
497 G4double sxy = fDx*fDy, sxz = fDx*fDz, syz = fDy*fDz;
498 G4double select = (sxy + sxz + syz)*G4QuickRand();
499 G4double u = 2.*G4QuickRand() - 1.;
500 G4double v = 2.*G4QuickRand() - 1.;
501
502 if (select < sxy)
503 return { u*fDx, v*fDy, ((select < 0.5*sxy) ? -fDz : fDz) };
504 else if (select < sxy + sxz)
505 return { u*fDx, ((select < sxy + 0.5*sxz) ? -fDy : fDy), v*fDz };
506 else
507 return { ((select < sxy + sxz + 0.5*syz) ? -fDx : fDx), u*fDy, v*fDz };
508}
G4double G4QuickRand()

◆ GetSurfaceArea()

G4double G4Box::GetSurfaceArea ( )
inlineoverridevirtual

Reimplemented from G4VSolid.

◆ GetXHalfLength()

◆ GetYHalfLength()

◆ GetZHalfLength()

◆ Inside()

EInside G4Box::Inside ( const G4ThreeVector & p) const
overridevirtual

Implements G4VSolid.

Definition at line 244 of file G4Box.cc.

245{
246 G4double dist = std::max(std::max(
247 std::abs(p.x())-fDx,
248 std::abs(p.y())-fDy),
249 std::abs(p.z())-fDz);
250 return (dist > delta) ? kOutside :
251 ((dist > -delta) ? kSurface : kInside);
252}
@ kInside
Definition geomdefs.hh:70
@ kSurface
Definition geomdefs.hh:69

Referenced by DistanceToOut().

◆ operator=()

G4Box & G4Box::operator= ( const G4Box & rhs)

Definition at line 96 of file G4Box.cc.

97{
98 // Check assignment to self
99 //
100 if (this == &rhs) { return *this; }
101
102 // Copy base class data
103 //
105
106 // Copy data
107 //
108 fDx = rhs.fDx;
109 fDy = rhs.fDy;
110 fDz = rhs.fDz;
111 delta = rhs.delta;
112
113 return *this;
114}
G4CSGSolid & operator=(const G4CSGSolid &rhs)
Definition G4CSGSolid.cc:89

◆ SetXHalfLength()

void G4Box::SetXHalfLength ( G4double dx)

Definition at line 120 of file G4Box.cc.

121{
122 if(dx > 2*kCarTolerance) // limit to thickness of surfaces
123 {
124 fDx = dx;
125 }
126 else
127 {
128 std::ostringstream message;
129 message << "Dimension X too small for solid: " << GetName() << "!"
130 << G4endl
131 << " hX = " << dx;
132 G4Exception("G4Box::SetXHalfLength()", "GeomSolids0002",
133 FatalException, message);
134 }
135 fCubicVolume = 0.;
136 fSurfaceArea = 0.;
137 fRebuildPolyhedron = true;
138}
G4double fSurfaceArea
Definition G4CSGSolid.hh:69
G4double fCubicVolume
Definition G4CSGSolid.hh:68
G4bool fRebuildPolyhedron
Definition G4CSGSolid.hh:70

Referenced by G4ParameterisationBoxX::ComputeDimensions(), G4ParameterisationBoxY::ComputeDimensions(), G4ParameterisationBoxZ::ComputeDimensions(), and G4STRead::Read().

◆ SetYHalfLength()

void G4Box::SetYHalfLength ( G4double dy)

Definition at line 144 of file G4Box.cc.

145{
146 if(dy > 2*kCarTolerance) // limit to thickness of surfaces
147 {
148 fDy = dy;
149 }
150 else
151 {
152 std::ostringstream message;
153 message << "Dimension Y too small for solid: " << GetName() << "!\n"
154 << " hY = " << dy;
155 G4Exception("G4Box::SetYHalfLength()", "GeomSolids0002",
156 FatalException, message);
157 }
158 fCubicVolume = 0.;
159 fSurfaceArea = 0.;
160 fRebuildPolyhedron = true;
161}

Referenced by G4ParameterisationBoxX::ComputeDimensions(), G4ParameterisationBoxY::ComputeDimensions(), G4ParameterisationBoxZ::ComputeDimensions(), and G4STRead::Read().

◆ SetZHalfLength()

void G4Box::SetZHalfLength ( G4double dz)

Definition at line 167 of file G4Box.cc.

168{
169 if(dz > 2*kCarTolerance) // limit to thickness of surfaces
170 {
171 fDz = dz;
172 }
173 else
174 {
175 std::ostringstream message;
176 message << "Dimension Z too small for solid: " << GetName() << "!\n"
177 << " hZ = " << dz;
178 G4Exception("G4Box::SetZHalfLength()", "GeomSolids0002",
179 FatalException, message);
180 }
181 fCubicVolume = 0.;
182 fSurfaceArea = 0.;
183 fRebuildPolyhedron = true;
184}

Referenced by G4ParameterisationBoxX::ComputeDimensions(), G4ParameterisationBoxY::ComputeDimensions(), G4ParameterisationBoxZ::ComputeDimensions(), and G4STRead::Read().

◆ StreamInfo()

std::ostream & G4Box::StreamInfo ( std::ostream & os) const
overridevirtual

Implements G4VSolid.

Definition at line 475 of file G4Box.cc.

476{
477 G4long oldprc = os.precision(16);
478 os << "-----------------------------------------------------------\n"
479 << " *** Dump for solid - " << GetName() << " ***\n"
480 << " ===================================================\n"
481 << "Solid type: G4Box\n"
482 << "Parameters: \n"
483 << " half length X: " << fDx/mm << " mm \n"
484 << " half length Y: " << fDy/mm << " mm \n"
485 << " half length Z: " << fDz/mm << " mm \n"
486 << "-----------------------------------------------------------\n";
487 os.precision(oldprc);
488 return os;
489}
long G4long
Definition G4Types.hh:87

◆ SurfaceNormal()

G4ThreeVector G4Box::SurfaceNormal ( const G4ThreeVector & p) const
overridevirtual

Implements G4VSolid.

Definition at line 258 of file G4Box.cc.

259{
260 G4ThreeVector norm(0,0,0);
261 G4double px = p.x();
262 if (std::abs(std::abs(px) - fDx) <= delta) norm.setX(px < 0 ? -1. : 1.);
263 G4double py = p.y();
264 if (std::abs(std::abs(py) - fDy) <= delta) norm.setY(py < 0 ? -1. : 1.);
265 G4double pz = p.z();
266 if (std::abs(std::abs(pz) - fDz) <= delta) norm.setZ(pz < 0 ? -1. : 1.);
267
268 G4double nside = norm.mag2(); // number of sides = magnitude squared
269 if (nside == 1)
270 return norm;
271 else if (nside > 1)
272 return norm.unit(); // edge or corner
273 else
274 {
275 // Point is not on the surface
276 //
277#ifdef G4CSGDEBUG
278 std::ostringstream message;
279 G4int oldprc = message.precision(16);
280 message << "Point p is not on surface (!?) of solid: "
281 << GetName() << G4endl;
282 message << "Position:\n";
283 message << " p.x() = " << p.x()/mm << " mm\n";
284 message << " p.y() = " << p.y()/mm << " mm\n";
285 message << " p.z() = " << p.z()/mm << " mm";
286 G4cout.precision(oldprc);
287 G4Exception("G4Box::SurfaceNormal(p)", "GeomSolids1002",
288 JustWarning, message );
289 DumpInfo();
290#endif
291 return ApproxSurfaceNormal(p);
292 }
293}

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