Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4VTwistSurface.hh
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//
30// --------------------------------------------------------------------
31// GEANT 4 class header file
32//
33//
34// G4VTwistSurface
35//
36// Class description:
37//
38// Abstract base class for boundary surface of G4VSolid.
39
40// Author:
41// 01-Aug-2002 - Kotoyo Hoshina ([email protected])
42//
43// History:
44// 13-Nov-2003 - O.Link ([email protected]), Integration in Geant4
45// from original version in Jupiter-2.5.02 application.
46// --------------------------------------------------------------------
47#ifndef __G4VTWISTSURFACE__
48#define __G4VTWISTSURFACE__
49
51
52#include "G4VSolid.hh"
53#include "geomdefs.hh"
54
55#include "G4RotationMatrix.hh"
56
57#define G4VSURFACENXX 10
58
60{
61 public: // without description
62
65
66 public: // with description
67
68 G4VTwistSurface (const G4String &name);
69 G4VTwistSurface (const G4String &name,
70 const G4RotationMatrix &rot,
71 const G4ThreeVector &tlate,
72 G4int handedness,
73 const EAxis axis1,
74 const EAxis axis2,
75 G4double axis0min = -kInfinity,
76 G4double axis1min = -kInfinity,
77 G4double axis0max = kInfinity,
78 G4double axis1max = kInfinity);
79
80 virtual ~G4VTwistSurface();
81
82 virtual G4int AmIOnLeftSide(const G4ThreeVector &me,
83 const G4ThreeVector &vec,
84 G4bool withTol = true);
85
86 virtual G4double DistanceToBoundary( G4int areacode,
87 G4ThreeVector &xx,
88 const G4ThreeVector &p) ;
89
90
91 virtual G4double DistanceToIn(const G4ThreeVector &gp,
92 const G4ThreeVector &gv,
93 G4ThreeVector &gxxbest);
94 virtual G4double DistanceToOut(const G4ThreeVector &gp,
95 const G4ThreeVector &gv,
96 G4ThreeVector &gxxbest);
97 virtual G4double DistanceTo(const G4ThreeVector &gp,
98 G4ThreeVector &gxx);
99
101 const G4ThreeVector &gv,
102 G4ThreeVector gxx[],
103 G4double distance[],
104 G4int areacode[],
105 G4bool isvalid[],
106 EValidate validate=kValidateWithTol) = 0;
107
109 G4ThreeVector gxx[],
110 G4double distance[],
111 G4int areacode[]) = 0;
112
113 void DebugPrint() const;
114
115 // get methods
116
117 virtual G4ThreeVector GetNormal(const G4ThreeVector &xx,G4bool isGlobal) = 0;
118
119 virtual G4String GetName() const { return fName; }
120 virtual void GetBoundaryParameters(const G4int &areacode,
121 G4ThreeVector &d,
122 G4ThreeVector &x0,
123 G4int &boundarytype) const;
124 virtual G4ThreeVector GetBoundaryAtPZ(G4int areacode,
125 const G4ThreeVector &p) const;
126
128 const G4ThreeVector &v,
129 const G4ThreeVector &x0,
130 const G4ThreeVector &n0,
131 G4ThreeVector &xx);
132
134 const G4ThreeVector &x0,
135 const G4ThreeVector &n0,
136 G4ThreeVector &xx);
137
139 const G4ThreeVector &x0,
140 const G4ThreeVector &t1,
141 const G4ThreeVector &t2,
142 G4ThreeVector &xx,
143 G4ThreeVector &n);
144
146 const G4ThreeVector &x0,
147 const G4ThreeVector &d,
148 G4ThreeVector &xx);
149
150 inline G4bool IsAxis0 (G4int areacode) const;
151 inline G4bool IsAxis1 (G4int areacode) const;
152 inline G4bool IsOutside (G4int areacode) const;
153 inline G4bool IsInside (G4int areacode, G4bool testbitmode = false) const;
154 inline G4bool IsBoundary (G4int areacode, G4bool testbitmode = false) const;
155 inline G4bool IsCorner (G4int areacode, G4bool testbitmode = false) const;
156 inline G4bool IsValidNorm() const { return fIsValidNorm; }
157 G4bool IsSameBoundary (G4VTwistSurface *surface1, G4int areacode1,
158 G4VTwistSurface *surface2, G4int areacode2 ) const;
159 inline G4int GetAxisType(G4int areacode, G4int whichaxis) const;
160
165
166 // set methods
167
168 inline void SetAxis(G4int i, const EAxis axis) { fAxis[i] = axis; }
169 inline void SetNeighbours(G4VTwistSurface* axis0min, G4VTwistSurface* axis1min,
170 G4VTwistSurface* axis0max, G4VTwistSurface* axis1max);
171
173 G4bool isGlobal = false ) = 0 ;
176 virtual G4double GetSurfaceArea() = 0 ;
177 virtual void GetFacets(G4int m, G4int n, G4double xyz[][3],
178 G4int faces[][4], G4int iside) = 0 ;
179 G4int GetNode( G4int i, G4int j, G4int m, G4int n, G4int iside ) ;
180 G4int GetFace( G4int i, G4int j, G4int m, G4int n, G4int iside ) ;
181 G4int GetEdgeVisibility( G4int i, G4int j, G4int m, G4int n, G4int number, G4int orientation) ;
182
183
184 public: // without description
185
186 G4VTwistSurface(__void__&);
187 // Fake default constructor for usage restricted to direct object
188 // persistency for clients requiring preallocation of memory for
189 // persistifiable objects.
190
191 protected: // with description
192
193 // get methods
194
195 inline G4VTwistSurface** GetNeighbours() { return fNeighbours; }
196 inline G4int GetNeighbours(G4int areacode, G4VTwistSurface* surfaces[]);
197 inline G4ThreeVector GetCorner(G4int areacode) const;
198 void GetBoundaryAxis(G4int areacode, EAxis axis[]) const;
199 void GetBoundaryLimit(G4int areacode, G4double limit[]) const;
200 virtual G4int GetAreaCode(const G4ThreeVector &xx, G4bool withtol=true) = 0;
201
202 // set methods
203
204 virtual void SetBoundary(const G4int &axiscode,
205 const G4ThreeVector &direction,
206 const G4ThreeVector &x0,
207 const G4int &boundarytype);
208 // areacode must be one of them:
209 // sAxis0 & sAxisMin, sAxis0 & sAxisMax,
210 // sAxis1 & sAxisMin, sAxis1 & sAxisMax.
211 // boundarytype represents the shape of locus
212 // from the start point to end point of boundary.
213 // ex.
214 // sAxisRho = linear line which start point is fixed at origin.
215 // sAxisPhi = part of circle which center placed at the origin.
216
217 void SetCorner(G4int areacode, G4double x, G4double y, G4double z);
218
219 private:
220
221 virtual void SetBoundaries() = 0;
222 virtual void SetCorners() = 0;
223
224 // data members ---------------------------------------------------------
225
226 public:
227
228 static const G4int sOutside ;
229 static const G4int sInside ;
230 static const G4int sBoundary;
231 static const G4int sCorner;
232 static const G4int sC0Min1Min;
233 static const G4int sC0Max1Min;
234 static const G4int sC0Max1Max;
235 static const G4int sC0Min1Max;
236 static const G4int sAxisMin;
237 static const G4int sAxisMax;
238 static const G4int sAxisX;
239 static const G4int sAxisY;
240 static const G4int sAxisZ;
241 static const G4int sAxisRho;
242 static const G4int sAxisPhi;
243 static const G4int sAxis0;
244 static const G4int sAxis1;
245 static const G4int sSizeMask;
246 static const G4int sAxisMask;
247 static const G4int sAreaMask;
248
249 protected:
250
252 {
253 public:
254
256 virtual ~CurrentStatus();
257
258 inline G4ThreeVector GetXX(G4int i) const { return fXX[i]; }
259 inline G4double GetDistance(G4int i) const { return fDistance[i]; }
260 inline G4int GetAreacode(G4int i) const { return fAreacode[i]; }
261 inline G4int GetNXX() const { return fNXX; }
262 inline G4bool IsDone() const { return fDone; }
263 inline G4bool IsValid(G4int i) const { return fIsValid[i]; }
264
265 void SetCurrentStatus(G4int i,
266 G4ThreeVector &xx,
267 G4double &dist,
268 G4int &areacode,
269 G4bool &isvalid,
270 G4int nxx,
271 EValidate validate,
272 const G4ThreeVector *p,
273 const G4ThreeVector *v = 0);
274
275 void ResetfDone(EValidate validate,
276 const G4ThreeVector *p,
277 const G4ThreeVector *v = 0);
278
279
280 void DebugPrint() const;
281
282 private:
283
284 G4double fDistance[G4VSURFACENXX];
286 G4int fAreacode[G4VSURFACENXX];
287 G4bool fIsValid[G4VSURFACENXX];
288 G4int fNXX;
289 G4ThreeVector fLastp;
290 G4ThreeVector fLastv;
291 EValidate fLastValidate;
292 G4bool fDone;
293 };
294
295 class Boundary
296 {
297 public:
298 Boundary();
299 virtual ~Boundary();
300
301 void SetFields(const G4int &areacode,
302 const G4ThreeVector &d,
303 const G4ThreeVector &x0,
304 const G4int &boundarytype);
305
306 G4bool IsEmpty() const;
307
308 G4bool GetBoundaryParameters(const G4int &areacode,
309 G4ThreeVector &d,
310 G4ThreeVector &x0,
311 G4int &boundarytype) const;
312
313 private:
314 G4int fBoundaryAcode;
315 G4ThreeVector fBoundaryDirection;
316 G4ThreeVector fBoundaryX0;
317 G4int fBoundaryType;
318 };
319
329 {
330 public:
333 };
337
338 private:
339
340 G4VTwistSurface *fNeighbours[4]; // {0,1,2,3} = sAxis0min, sAxis1min,
341 // sAxis0max, sAxis1max
342 G4ThreeVector fCorners[4]; // corners of the surface in local coordinate
343 Boundary fBoundaries[4]; // boundaries of the surface.
344 G4String fName;
345
346 class G4SurfSideQuery
347 {
348 public:
349 G4ThreeVector me;
350 G4ThreeVector vec;
351 G4bool withTol;
352 G4int amIOnLeftSide;
353 };
354 G4SurfSideQuery fAmIOnLeftSide;
355};
356
357//========================================================
358// inline functions
359//========================================================
360
362{
363 G4double phi ; // parameter phi
364 G4double u ; // parameter u
365 G4ThreeVector xx ; // intersection point in cartesian
366 G4double distance ; // distance to intersection
367 G4int areacode; // the areacode of the intersection
368 G4bool isvalid ; // valid intersection ??
369
370};
371
372inline
374{
375 return a.distance < b.distance ;
376}
377
378inline
380{
381 return ( ( a.xx - b.xx ).mag() < 1E-9*CLHEP::mm ) ;
382}
383
384#include "G4VTwistSurface.icc"
385
386#endif
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4bool DistanceSort(const Intersection &a, const Intersection &b)
G4bool EqualIntersection(const Intersection &a, const Intersection &b)
#define G4VSURFACENXX
void SetFields(const G4int &areacode, const G4ThreeVector &d, const G4ThreeVector &x0, const G4int &boundarytype)
G4bool GetBoundaryParameters(const G4int &areacode, G4ThreeVector &d, G4ThreeVector &x0, G4int &boundarytype) const
G4int GetAreacode(G4int i) const
G4double GetDistance(G4int i) const
void SetCurrentStatus(G4int i, G4ThreeVector &xx, G4double &dist, G4int &areacode, G4bool &isvalid, G4int nxx, EValidate validate, const G4ThreeVector *p, const G4ThreeVector *v=0)
G4bool IsValid(G4int i) const
G4ThreeVector GetXX(G4int i) const
void ResetfDone(EValidate validate, const G4ThreeVector *p, const G4ThreeVector *v=0)
virtual G4int AmIOnLeftSide(const G4ThreeVector &me, const G4ThreeVector &vec, G4bool withTol=true)
static const G4int sAxisMask
static const G4int sC0Min1Min
static const G4int sC0Min1Max
virtual void GetFacets(G4int m, G4int n, G4double xyz[][3], G4int faces[][4], G4int iside)=0
G4bool IsAxis1(G4int areacode) const
G4double DistanceToPlane(const G4ThreeVector &p, const G4ThreeVector &x0, const G4ThreeVector &n0, G4ThreeVector &xx)
G4int GetNode(G4int i, G4int j, G4int m, G4int n, G4int iside)
static const G4int sOutside
void SetAxis(G4int i, const EAxis axis)
virtual ~G4VTwistSurface()
G4ThreeVector ComputeGlobalDirection(const G4ThreeVector &lp) const
G4bool IsCorner(G4int areacode, G4bool testbitmode=false) const
static const G4int sAxisMax
static const G4int sAxis0
virtual G4double GetBoundaryMin(G4double)=0
G4int GetFace(G4int i, G4int j, G4int m, G4int n, G4int iside)
G4double fAxisMax[2]
G4bool IsValidNorm() const
void GetBoundaryAxis(G4int areacode, EAxis axis[]) const
virtual G4double DistanceTo(const G4ThreeVector &gp, G4ThreeVector &gxx)
G4bool IsAxis0(G4int areacode) const
G4RotationMatrix fRot
G4int GetEdgeVisibility(G4int i, G4int j, G4int m, G4int n, G4int number, G4int orientation)
virtual G4int DistanceToSurface(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector gxx[], G4double distance[], G4int areacode[], G4bool isvalid[], EValidate validate=kValidateWithTol)=0
G4VTwistSurface ** GetNeighbours()
G4double DistanceToLine(const G4ThreeVector &p, const G4ThreeVector &x0, const G4ThreeVector &d, G4ThreeVector &xx)
G4ThreeVector ComputeLocalDirection(const G4ThreeVector &gp) const
void GetBoundaryLimit(G4int areacode, G4double limit[]) const
void DebugPrint() const
G4int GetAxisType(G4int areacode, G4int whichaxis) const
static const G4int sAxisPhi
static const G4int sAxisMin
static const G4int sC0Max1Max
virtual G4double DistanceToOut(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
virtual G4double DistanceToIn(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
static const G4int sAxis1
virtual G4ThreeVector GetBoundaryAtPZ(G4int areacode, const G4ThreeVector &p) const
G4bool IsInside(G4int areacode, G4bool testbitmode=false) const
virtual G4ThreeVector SurfacePoint(G4double, G4double, G4bool isGlobal=false)=0
G4ThreeVector fTrans
void SetNeighbours(G4VTwistSurface *axis0min, G4VTwistSurface *axis1min, G4VTwistSurface *axis0max, G4VTwistSurface *axis1max)
virtual void SetBoundary(const G4int &axiscode, const G4ThreeVector &direction, const G4ThreeVector &x0, const G4int &boundarytype)
G4ThreeVector ComputeLocalPoint(const G4ThreeVector &gp) const
virtual G4double GetBoundaryMax(G4double)=0
static const G4int sAxisRho
void SetCorner(G4int areacode, G4double x, G4double y, G4double z)
G4ThreeVector GetCorner(G4int areacode) const
virtual G4int GetAreaCode(const G4ThreeVector &xx, G4bool withtol=true)=0
static const G4int sBoundary
static const G4int sAxisZ
G4bool IsOutside(G4int areacode) const
virtual G4double DistanceToBoundary(G4int areacode, G4ThreeVector &xx, const G4ThreeVector &p)
G4double fAxisMin[2]
virtual G4int DistanceToSurface(const G4ThreeVector &gp, G4ThreeVector gxx[], G4double distance[], G4int areacode[])=0
static const G4int sCorner
static const G4int sC0Max1Min
static const G4int sInside
G4bool IsSameBoundary(G4VTwistSurface *surface1, G4int areacode1, G4VTwistSurface *surface2, G4int areacode2) const
virtual G4String GetName() const
CurrentStatus fCurStatWithV
virtual G4ThreeVector GetNormal(const G4ThreeVector &xx, G4bool isGlobal)=0
G4int GetNeighbours(G4int areacode, G4VTwistSurface *surfaces[])
static const G4int sAxisY
static const G4int sSizeMask
static const G4int sAxisX
G4double DistanceToPlaneWithV(const G4ThreeVector &p, const G4ThreeVector &v, const G4ThreeVector &x0, const G4ThreeVector &n0, G4ThreeVector &xx)
static const G4int sAreaMask
G4bool IsBoundary(G4int areacode, G4bool testbitmode=false) const
G4ThreeVector ComputeGlobalPoint(const G4ThreeVector &lp) const
G4double DistanceToPlane(const G4ThreeVector &p, const G4ThreeVector &x0, const G4ThreeVector &t1, const G4ThreeVector &t2, G4ThreeVector &xx, G4ThreeVector &n)
G4SurfCurNormal fCurrentNormal
virtual G4double GetSurfaceArea()=0
virtual void GetBoundaryParameters(const G4int &areacode, G4ThreeVector &d, G4ThreeVector &x0, G4int &boundarytype) const
CurrentStatus fCurStat
EAxis
Definition: geomdefs.hh:54
G4ThreeVector xx