Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4UEllipsoid.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// Implementation for G4UEllipsoid wrapper class
27//
28// 13-08-2019 Gabriele Cosmo, CERN
29// --------------------------------------------------------------------
30
31#include "G4Ellipsoid.hh"
32#include "G4UEllipsoid.hh"
33
34#if ( defined(G4GEOM_USE_USOLIDS) || defined(G4GEOM_USE_PARTIAL_USOLIDS) )
35
36#include "G4AffineTransform.hh"
39#include "G4BoundingEnvelope.hh"
40#include "G4Polyhedron.hh"
41
42////////////////////////////////////////////////////////////////////////
43//
44// Constructor - check & set half widths
45
46
47G4UEllipsoid::G4UEllipsoid(const G4String& pName,
48 G4double dx,
49 G4double dy,
50 G4double dz,
51 G4double bcut,
52 G4double tcut )
53 : Base_t(pName, dx, dy, dz, bcut, tcut)
54{ }
55
56//////////////////////////////////////////////////////////////////////////
57//
58// Fake default constructor - sets only member data and allocates memory
59// for usage restricted to object persistency.
60
61G4UEllipsoid::G4UEllipsoid( __void__& a )
62 : Base_t(a)
63{ }
64
65//////////////////////////////////////////////////////////////////////////
66//
67// Destructor
68
69G4UEllipsoid::~G4UEllipsoid() { }
70
71//////////////////////////////////////////////////////////////////////////
72//
73// Copy constructor
74
75G4UEllipsoid::G4UEllipsoid(const G4UEllipsoid& rhs)
76 : Base_t(rhs)
77{ }
78
79//////////////////////////////////////////////////////////////////////////
80//
81// Assignment operator
82
83G4UEllipsoid& G4UEllipsoid::operator = (const G4UEllipsoid& rhs)
84{
85 // Check assignment to self
86 //
87 if (this == &rhs) { return *this; }
88
89 // Copy base class data
90 //
91 Base_t::operator=(rhs);
92
93 return *this;
94}
95
96//////////////////////////////////////////////////////////////////////////
97//
98// Accessors
99
100G4double G4UEllipsoid::GetDx() const
101{
102 return Base_t::GetDx();
103}
104
105G4double G4UEllipsoid::GetDy() const
106{
107 return Base_t::GetDy();
108}
109
110G4double G4UEllipsoid::GetDz() const
111{
112 return Base_t::GetDz();
113}
114
115G4double G4UEllipsoid::GetSemiAxisMax (G4int i) const
116{
117 return (i==0) ? GetDx()
118 : (i==1) ? GetDy()
119 : GetDz();
120}
121
122G4double G4UEllipsoid::GetZBottomCut() const
123{
124 return Base_t::GetZBottomCut();
125}
126
127G4double G4UEllipsoid::GetZTopCut() const
128{
129 return Base_t::GetZTopCut();
130}
131
132//////////////////////////////////////////////////////////////////////////
133//
134// Modifiers
135
136void G4UEllipsoid::SetSemiAxis (G4double x, G4double y, G4double z)
137{
138 Base_t::SetSemiAxes(x, y, z);
139}
140
141void G4UEllipsoid::SetZCuts (G4double newzBottomCut, G4double newzTopCut)
142{
143 Base_t::SetZCuts(newzBottomCut, newzTopCut);
144}
145
146//////////////////////////////////////////////////////////////////////////
147//
148// Make a clone of the object
149
150G4VSolid* G4UEllipsoid::Clone() const
151{
152 return new G4UEllipsoid(*this);
153}
154
155//////////////////////////////////////////////////////////////////////////
156//
157// Get bounding box
158
159void G4UEllipsoid::BoundingLimits(G4ThreeVector& pMin,
160 G4ThreeVector& pMax) const
161{
162 G4double dx = GetDx();
163 G4double dy = GetDy();
164 G4double dz = GetDz();
165 G4double zmin = std::max(-dz,GetZBottomCut());
166 G4double zmax = std::min( dz,GetZTopCut());
167 pMin.set(-dx,-dy,zmin);
168 pMax.set( dx, dy,zmax);
169
170 // Check correctness of the bounding box
171 //
172 if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
173 {
174 std::ostringstream message;
175 message << "Bad bounding box (min >= max) for solid: "
176 << GetName() << " !"
177 << "\npMin = " << pMin
178 << "\npMax = " << pMax;
179 G4Exception("G4UEllipsoid::BoundingLimits()", "GeomMgt0001",
180 JustWarning, message);
181 StreamInfo(G4cout);
182 }
183}
184
185//////////////////////////////////////////////////////////////////////////
186//
187// Calculate extent under transform and specified limit
188
189G4bool
190G4UEllipsoid::CalculateExtent(const EAxis pAxis,
191 const G4VoxelLimits& pVoxelLimit,
192 const G4AffineTransform& pTransform,
193 G4double& pMin, G4double& pMax) const
194{
195 G4ThreeVector bmin, bmax;
196
197 // Get bounding box
198 BoundingLimits(bmin,bmax);
199
200 // Find extent
201 G4BoundingEnvelope bbox(bmin,bmax);
202 return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
203}
204
205////////////////////////////////////////////////////////////////////////
206//
207// CreatePolyhedron
208
209G4Polyhedron* G4UEllipsoid::CreatePolyhedron() const
210{
211 return new G4PolyhedronEllipsoid(GetDx(), GetDy(), GetDz(),
212 GetZBottomCut(), GetZTopCut());
213}
214
215#endif // G4GEOM_USE_USOLIDS
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cout
double z() const
double x() const
double y() const
void set(double x, double y, double z)
EAxis
Definition: geomdefs.hh:54