Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4UEllipticalTube.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 G4UEllipticalTube wrapper class
27//
28// 13-08-2019 Gabriele Cosmo, CERN
29// --------------------------------------------------------------------
30
31#include "G4EllipticalTube.hh"
32#include "G4UEllipticalTube.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
47G4UEllipticalTube::G4UEllipticalTube(const G4String& pName,
48 G4double dx,
49 G4double dy,
50 G4double dz )
51 : Base_t(pName, dx, dy, dz)
52{ }
53
54//////////////////////////////////////////////////////////////////////////
55//
56// Fake default constructor - sets only member data and allocates memory
57// for usage restricted to object persistency.
58
59G4UEllipticalTube::G4UEllipticalTube( __void__& a )
60 : Base_t(a)
61{ }
62
63//////////////////////////////////////////////////////////////////////////
64//
65// Destructor
66
67G4UEllipticalTube::~G4UEllipticalTube() = default;
68
69//////////////////////////////////////////////////////////////////////////
70//
71// Copy constructor
72
73G4UEllipticalTube::G4UEllipticalTube(const G4UEllipticalTube& rhs)
74 : Base_t(rhs)
75{ }
76
77//////////////////////////////////////////////////////////////////////////
78//
79// Assignment operator
80
81G4UEllipticalTube& G4UEllipticalTube::operator = (const G4UEllipticalTube& rhs)
82{
83 // Check assignment to self
84 //
85 if (this == &rhs) { return *this; }
86
87 // Copy base class data
88 //
89 Base_t::operator=(rhs);
90
91 return *this;
92}
93
94//////////////////////////////////////////////////////////////////////////
95//
96// Accessors
97
98G4double G4UEllipticalTube::GetDx() const
99{
100 return Base_t::GetDx();
101}
102
103G4double G4UEllipticalTube::GetDy() const
104{
105 return Base_t::GetDy();
106}
107
108G4double G4UEllipticalTube::GetDz() const
109{
110 return Base_t::GetDz();
111}
112
113//////////////////////////////////////////////////////////////////////////
114//
115// Modifiers
116
117void G4UEllipticalTube::SetDx(G4double dx)
118{
119 Base_t::SetDx(dx);
120}
121
122void G4UEllipticalTube::SetDy(G4double dy)
123{
124 Base_t::SetDy(dy);
125}
126
127void G4UEllipticalTube::SetDz(G4double dz)
128{
129 Base_t::SetDz(dz);
130}
131
132//////////////////////////////////////////////////////////////////////////
133//
134// Make a clone of the object
135
136G4VSolid* G4UEllipticalTube::Clone() const
137{
138 return new G4UEllipticalTube(*this);
139}
140
141//////////////////////////////////////////////////////////////////////////
142//
143// Get bounding box
144
145void G4UEllipticalTube::BoundingLimits(G4ThreeVector& pMin,
146 G4ThreeVector& pMax) const
147{
148 G4double dx = GetDx();
149 G4double dy = GetDy();
150 G4double dz = GetDz();
151
152 pMin.set(-dx,-dy,-dz);
153 pMax.set( dx, dy, dz);
154}
155
156//////////////////////////////////////////////////////////////////////////
157//
158// Calculate extent under transform and specified limit
159
160G4bool
161G4UEllipticalTube::CalculateExtent(const EAxis pAxis,
162 const G4VoxelLimits& pVoxelLimit,
163 const G4AffineTransform& pTransform,
164 G4double& pMin, G4double& pMax) const
165{
166 G4ThreeVector bmin, bmax;
167 G4bool exist;
168
169 // Check bounding box (bbox)
170 //
171 BoundingLimits(bmin,bmax);
172 G4BoundingEnvelope bbox(bmin,bmax);
173#ifdef G4BBOX_EXTENT
174 return bbox.CalculateExtent(pAxis,pVoxelLimit, pTransform, pMin, pMax);
175#endif
176 if (bbox.BoundingBoxVsVoxelLimits(pAxis, pVoxelLimit, pTransform, pMin, pMax))
177 {
178 return exist = pMin < pMax;
179 }
180
181 G4double dx = GetDx();
182 G4double dy = GetDy();
183 G4double dz = GetDz();
184
185 // Set bounding envelope (benv) and calculate extent
186 //
187 const G4int NSTEPS = 24; // number of steps for whole circle
188 G4double ang = twopi/NSTEPS;
189
190 G4double sinHalf = std::sin(0.5*ang);
191 G4double cosHalf = std::cos(0.5*ang);
192 G4double sinStep = 2.*sinHalf*cosHalf;
193 G4double cosStep = 1. - 2.*sinHalf*sinHalf;
194 G4double sx = dx/cosHalf;
195 G4double sy = dy/cosHalf;
196
197 G4double sinCur = sinHalf;
198 G4double cosCur = cosHalf;
199 G4ThreeVectorList baseA(NSTEPS), baseB(NSTEPS);
200 for (G4int k=0; k<NSTEPS; ++k)
201 {
202 baseA[k].set(sx*cosCur,sy*sinCur,-dz);
203 baseB[k].set(sx*cosCur,sy*sinCur, dz);
204
205 G4double sinTmp = sinCur;
206 sinCur = sinCur*cosStep + cosCur*sinStep;
207 cosCur = cosCur*cosStep - sinTmp*sinStep;
208 }
209
210 std::vector<const G4ThreeVectorList *> polygons(2);
211 polygons[0] = &baseA;
212 polygons[1] = &baseB;
213 G4BoundingEnvelope benv(bmin, bmax, polygons);
214 exist = benv.CalculateExtent(pAxis, pVoxelLimit, pTransform, pMin, pMax);
215 return exist;
216}
217
218////////////////////////////////////////////////////////////////////////
219//
220// CreatePolyhedron
221//
222G4Polyhedron* G4UEllipticalTube::CreatePolyhedron() const
223{
224 // create cylinder with radius=1...
225 //
226 G4Polyhedron* eTube = new G4PolyhedronTube(0., 1., GetDz());
227
228 // apply non-uniform scaling...
229 //
230 eTube->Transform(G4Scale3D(GetDx(), GetDy(), 1.));
231 return eTube;
232}
233
234#endif // G4GEOM_USE_USOLIDS
std::vector< G4ThreeVector > G4ThreeVectorList
HepGeom::Scale3D G4Scale3D
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
void set(double x, double y, double z)
HepPolyhedron & Transform(const G4Transform3D &t)
EAxis
Definition geomdefs.hh:54