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
G4UHype.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 G4UHype wrapper class
27//
28// 16-10-2017 G.Cosmo, CERN
29// --------------------------------------------------------------------
30
31#include "G4Hype.hh"
32
33#include "G4UHype.hh"
34
35#if ( defined(G4GEOM_USE_USOLIDS) || defined(G4GEOM_USE_PARTIAL_USOLIDS) )
36
37#include "G4AffineTransform.hh"
39#include "G4BoundingEnvelope.hh"
40#include "G4Polyhedron.hh"
41
42////////////////////////////////////////////////////////////////////////
43//
44// Constructor
45
46G4UHype::G4UHype(const G4String& pName,
47 G4double newInnerRadius,
48 G4double newOuterRadius,
49 G4double newInnerStereo,
50 G4double newOuterStereo,
51 G4double newHalfLenZ)
52 : Base_t(pName, newInnerRadius, newOuterRadius,
53 newInnerStereo, newOuterStereo, newHalfLenZ)
54{ }
55
56//////////////////////////////////////////////////////////////////////////
57//
58// Fake default constructor - sets only member data and allocates memory
59// for usage restricted to object persistency.
60
61G4UHype::G4UHype( __void__& a )
62 : Base_t(a)
63{ }
64
65//////////////////////////////////////////////////////////////////////////
66//
67// Destructor
68
69G4UHype::~G4UHype() { }
70
71//////////////////////////////////////////////////////////////////////////
72//
73// Copy constructor
74
75G4UHype::G4UHype(const G4UHype& rhs)
76 : Base_t(rhs)
77{ }
78
79//////////////////////////////////////////////////////////////////////////
80//
81// Assignment operator
82
83G4UHype& G4UHype::operator = (const G4UHype& 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 G4UHype::GetInnerRadius () const
101{
102 return GetRmin();
103}
104
105G4double G4UHype::GetOuterRadius () const
106{
107 return GetRmax();
108}
109
110G4double G4UHype::GetZHalfLength () const
111{
112 return GetDz();
113}
114
115G4double G4UHype::GetInnerStereo () const
116{
117 return GetStIn();
118}
119
120G4double G4UHype::GetOuterStereo () const
121{
122 return GetStOut();
123}
124
125//////////////////////////////////////////////////////////////////////////
126//
127// Modifiers
128
129void G4UHype::SetInnerRadius (G4double newIRad)
130{
131 SetParameters(newIRad, GetRmax(), GetStIn(), GetStOut(), GetDz());
132 fRebuildPolyhedron = true;
133}
134
135void G4UHype::SetOuterRadius (G4double newORad)
136{
137 SetParameters(GetRmin(), newORad, GetStIn(), GetStOut(), GetDz());
138 fRebuildPolyhedron = true;
139}
140
141void G4UHype::SetZHalfLength (G4double newHLZ)
142{
143 SetParameters(GetRmin(), GetRmax(), GetStIn(), GetStOut(), newHLZ);
144 fRebuildPolyhedron = true;
145}
146
147void G4UHype::SetInnerStereo (G4double newISte)
148{
149 SetParameters(GetRmin(), GetRmax(), newISte, GetStOut(), GetDz());
150 fRebuildPolyhedron = true;
151}
152
153void G4UHype::SetOuterStereo (G4double newOSte)
154{
155 SetParameters(GetRmin(), GetRmax(), GetStIn(), newOSte, GetDz());
156 fRebuildPolyhedron = true;
157}
158
159
160////////////////////////////////////////////////////////////////////////
161//
162// Dispatch to parameterisation for replication mechanism dimension
163// computation & modification.
164
165void G4UHype::ComputeDimensions(G4VPVParameterisation* p,
166 const G4int n,
167 const G4VPhysicalVolume* pRep)
168{
169 p->ComputeDimensions(*(G4Hype*)this,n,pRep);
170}
171
172
173//////////////////////////////////////////////////////////////////////////
174//
175// Make a clone of the object
176
177G4VSolid* G4UHype::Clone() const
178{
179 return new G4UHype(*this);
180}
181
182//////////////////////////////////////////////////////////////////////////
183//
184// Get bounding box
185
186void G4UHype::BoundingLimits(G4ThreeVector& pMin,
187 G4ThreeVector& pMax) const
188{
189 G4double endORadius = GetEndInnerRadius();
190 pMin.set(-endORadius,-endORadius,-GetDz());
191 pMax.set( endORadius, endORadius, GetDz());
192
193 // Check correctness of the bounding box
194 //
195 if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
196 {
197 std::ostringstream message;
198 message << "Bad bounding box (min >= max) for solid: "
199 << GetName() << " !"
200 << "\npMin = " << pMin
201 << "\npMax = " << pMax;
202 G4Exception("G4UHype::BoundingLimits()", "GeomMgt0001",
203 JustWarning, message);
204 StreamInfo(G4cout);
205 }
206}
207
208//////////////////////////////////////////////////////////////////////////
209//
210// Calculate extent under transform and specified limit
211
212G4bool
213G4UHype::CalculateExtent(const EAxis pAxis,
214 const G4VoxelLimits& pVoxelLimit,
215 const G4AffineTransform& pTransform,
216 G4double& pMin, G4double& pMax) const
217{
218 G4ThreeVector bmin, bmax;
219
220 // Get bounding box
221 BoundingLimits(bmin,bmax);
222
223 // Find extent
224 G4BoundingEnvelope bbox(bmin,bmax);
225 return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
226}
227
228////////////////////////////////////////////////////////////////////////
229//
230// CreatePolyhedron
231//
232G4Polyhedron* G4UHype::CreatePolyhedron() const
233{
234 return new G4PolyhedronHype(GetRmin(), GetRmax(),
235 GetTIn2(), GetTOut2(), GetDz());
236}
237
238#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)
Definition: G4Hype.hh:69
virtual void ComputeDimensions(G4Box &, const G4int, const G4VPhysicalVolume *) const
EAxis
Definition: geomdefs.hh:54