Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4BooleanSolid.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// Implementation for the abstract base class for solids created by boolean
30// operations between other solids
31//
32// History:
33//
34// 10.09.98 V.Grichine, created
35//
36// --------------------------------------------------------------------
37
38#include "G4BooleanSolid.hh"
39#include "G4VSolid.hh"
40#include "G4Polyhedron.hh"
42#include "Randomize.hh"
43
44//////////////////////////////////////////////////////////////////
45//
46// Constructor
47
49 G4VSolid* pSolidA ,
50 G4VSolid* pSolidB ) :
51 G4VSolid(pName), fAreaRatio(0.), fStatistics(1000000), fCubVolEpsilon(0.001),
52 fAreaAccuracy(-1.), fCubicVolume(0.), fSurfaceArea(0.),
53 fpPolyhedron(0), createdDisplacedSolid(false)
54{
55 fPtrSolidA = pSolidA ;
56 fPtrSolidB = pSolidB ;
57}
58
59//////////////////////////////////////////////////////////////////
60//
61// Constructor
62
64 G4VSolid* pSolidA ,
65 G4VSolid* pSolidB ,
66 G4RotationMatrix* rotMatrix,
67 const G4ThreeVector& transVector ) :
68 G4VSolid(pName), fAreaRatio(0.), fStatistics(1000000), fCubVolEpsilon(0.001),
69 fAreaAccuracy(-1.), fCubicVolume(0.), fSurfaceArea(0.),
70 fpPolyhedron(0), createdDisplacedSolid(true)
71{
72 fPtrSolidA = pSolidA ;
73 fPtrSolidB = new G4DisplacedSolid("placedB",pSolidB,rotMatrix,transVector) ;
74}
75
76//////////////////////////////////////////////////////////////////
77//
78// Constructor
79
81 G4VSolid* pSolidA ,
82 G4VSolid* pSolidB ,
83 const G4Transform3D& transform ) :
84 G4VSolid(pName), fAreaRatio(0.), fStatistics(1000000), fCubVolEpsilon(0.001),
85 fAreaAccuracy(-1.), fCubicVolume(0.), fSurfaceArea(0.),
86 fpPolyhedron(0), createdDisplacedSolid(true)
87{
88 fPtrSolidA = pSolidA ;
89 fPtrSolidB = new G4DisplacedSolid("placedB",pSolidB,transform) ;
90}
91
92///////////////////////////////////////////////////////////////
93//
94// Fake default constructor - sets only member data and allocates memory
95// for usage restricted to object persistency.
96
98 : G4VSolid(a), fPtrSolidA(0), fPtrSolidB(0), fAreaRatio(0.),
99 fStatistics(1000000), fCubVolEpsilon(0.001),
100 fAreaAccuracy(-1.), fCubicVolume(0.), fSurfaceArea(0.),
101 fpPolyhedron(0), createdDisplacedSolid(false)
102{
103}
104
105///////////////////////////////////////////////////////////////
106//
107// Destructor deletes transformation contents of the created displaced solid
108
110{
111 if(createdDisplacedSolid)
112 {
113 ((G4DisplacedSolid*)fPtrSolidB)->CleanTransformations();
114 }
115 delete fpPolyhedron;
116}
117
118///////////////////////////////////////////////////////////////
119//
120// Copy constructor
121
123 : G4VSolid (rhs), fPtrSolidA(rhs.fPtrSolidA), fPtrSolidB(rhs.fPtrSolidB),
124 fAreaRatio(rhs.fAreaRatio),
125 fStatistics(rhs.fStatistics), fCubVolEpsilon(rhs.fCubVolEpsilon),
126 fAreaAccuracy(rhs.fAreaAccuracy), fCubicVolume(rhs.fCubicVolume),
127 fSurfaceArea(rhs.fSurfaceArea), fpPolyhedron(0),
128 createdDisplacedSolid(rhs.createdDisplacedSolid)
129{
130}
131
132///////////////////////////////////////////////////////////////
133//
134// Assignment operator
135
137{
138 // Check assignment to self
139 //
140 if (this == &rhs) { return *this; }
141
142 // Copy base class data
143 //
145
146 // Copy data
147 //
150 fStatistics= rhs.fStatistics; fCubVolEpsilon= rhs.fCubVolEpsilon;
151 fAreaAccuracy= rhs.fAreaAccuracy; fCubicVolume= rhs.fCubicVolume;
152 fSurfaceArea= rhs.fSurfaceArea; fpPolyhedron= 0;
153 createdDisplacedSolid= rhs.createdDisplacedSolid;
154
155 return *this;
156}
157
158///////////////////////////////////////////////////////////////
159//
160// If Solid is made up from a Boolean operation of two solids,
161// return the corresponding solid (for no=0 and 1)
162// If the solid is not a "Boolean", return 0
163
165{
166 const G4VSolid* subSolid=0;
167 if( no == 0 )
168 subSolid = fPtrSolidA;
169 else if( no == 1 )
170 subSolid = fPtrSolidB;
171 else
172 {
173 DumpInfo();
174 G4Exception("G4BooleanSolid::GetConstituentSolid()",
175 "GeomSolids0002", FatalException, "Invalid solid index.");
176 }
177
178 return subSolid;
179}
180
181///////////////////////////////////////////////////////////////
182//
183// If Solid is made up from a Boolean operation of two solids,
184// return the corresponding solid (for no=0 and 1)
185// If the solid is not a "Boolean", return 0
186
188{
189 G4VSolid* subSolid=0;
190 if( no == 0 )
191 subSolid = fPtrSolidA;
192 else if( no == 1 )
193 subSolid = fPtrSolidB;
194 else
195 {
196 DumpInfo();
197 G4Exception("G4BooleanSolid::GetConstituentSolid()",
198 "GeomSolids0002", FatalException, "Invalid solid index.");
199 }
200
201 return subSolid;
202}
203
204//////////////////////////////////////////////////////////////////////////
205//
206// Returns entity type
207
209{
210 return G4String("G4BooleanSolid");
211}
212
213//////////////////////////////////////////////////////////////////////////
214//
215// Stream object contents to an output stream
216
217std::ostream& G4BooleanSolid::StreamInfo(std::ostream& os) const
218{
219 os << "-----------------------------------------------------------\n"
220 << " *** Dump for Boolean solid - " << GetName() << " ***\n"
221 << " ===================================================\n"
222 << " Solid type: " << GetEntityType() << "\n"
223 << " Parameters of constituent solids: \n"
224 << "===========================================================\n";
227 os << "===========================================================\n";
228
229 return os;
230}
231
232//////////////////////////////////////////////////////////////////////////
233//
234// Returns a point (G4ThreeVector) randomly and uniformly selected
235// on the solid surface
236//
237
239{
240 G4double rand;
242
243 do
244 {
245 rand = G4UniformRand();
246
247 if (rand < GetAreaRatio()) { p = fPtrSolidA->GetPointOnSurface(); }
248 else { p = fPtrSolidB->GetPointOnSurface(); }
249 } while (Inside(p) != kSurface);
250
251 return p;
252}
253
254//////////////////////////////////////////////////////////////////////////
255//
256// Returns polyhedron for visualization
257
259{
260 if (!fpPolyhedron ||
262 fpPolyhedron->GetNumberOfRotationSteps())
263 {
264 delete fpPolyhedron;
265 fpPolyhedron = CreatePolyhedron();
266 }
267 return fpPolyhedron;
268}
269
270//////////////////////////////////////////////////////////////////////////
271//
272// Stacks polyhedra for processing. Returns top polyhedron.
273
276 const G4VSolid* solid) const
277{
279 const G4String& type = solid->GetEntityType();
280 if (type == "G4UnionSolid")
281 { operation = HepPolyhedronProcessor::UNION; }
282 else if (type == "G4IntersectionSolid")
284 else if (type == "G4SubtractionSolid")
286 else
287 {
288 std::ostringstream message;
289 message << "Solid - " << solid->GetName()
290 << " - Unrecognised composite solid" << G4endl
291 << " Returning NULL !";
292 G4Exception("StackPolyhedron()", "GeomSolids1001", JustWarning, message);
293 return 0;
294 }
295
296 G4Polyhedron* top = 0;
297 const G4VSolid* solidA = solid->GetConstituentSolid(0);
298 const G4VSolid* solidB = solid->GetConstituentSolid(1);
299
300 if (solidA->GetConstituentSolid(0))
301 {
302 top = StackPolyhedron(processor, solidA);
303 }
304 else
305 {
306 top = solidA->GetPolyhedron();
307 }
308 G4Polyhedron* operand = solidB->GetPolyhedron();
309 processor.push_back (operation, *operand);
310
311 return top;
312}
@ JustWarning
@ FatalException
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
#define G4UniformRand()
Definition: Randomize.hh:53
virtual G4Polyhedron * GetPolyhedron() const
std::ostream & StreamInfo(std::ostream &os) const
G4VSolid * fPtrSolidA
G4BooleanSolid & operator=(const G4BooleanSolid &rhs)
virtual G4GeometryType GetEntityType() const
G4VSolid * fPtrSolidB
virtual ~G4BooleanSolid()
G4ThreeVector GetPointOnSurface() const
G4double GetAreaRatio() const
G4BooleanSolid(const G4String &pName, G4VSolid *pSolidA, G4VSolid *pSolidB)
G4Polyhedron * StackPolyhedron(HepPolyhedronProcessor &, const G4VSolid *) const
virtual const G4VSolid * GetConstituentSolid(G4int no) const
G4int GetNumberOfRotationStepsAtTimeOfCreation() const
G4String GetName() const
virtual const G4VSolid * GetConstituentSolid(G4int no) const
Definition: G4VSolid.cc:167
virtual std::ostream & StreamInfo(std::ostream &os) const =0
virtual EInside Inside(const G4ThreeVector &p) const =0
void DumpInfo() const
virtual G4ThreeVector GetPointOnSurface() const
Definition: G4VSolid.cc:152
virtual G4Polyhedron * GetPolyhedron() const
Definition: G4VSolid.cc:647
virtual G4Polyhedron * CreatePolyhedron() const
Definition: G4VSolid.cc:637
G4VSolid & operator=(const G4VSolid &rhs)
Definition: G4VSolid.cc:110
virtual G4GeometryType GetEntityType() const =0
static G4int GetNumberOfRotationSteps()
@ kSurface
Definition: geomdefs.hh:58
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
#define processor
Definition: xmlparse.cc:600