Geant4-11
Data Structures | Public Types | Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes
G4TwistTubsHypeSide Class Reference

#include <G4TwistTubsHypeSide.hh>

Inheritance diagram for G4TwistTubsHypeSide:
G4VTwistSurface

Data Structures

class  Insidetype
 

Public Types

enum  EValidate { kDontValidate = 0 , kValidateWithTol = 1 , kValidateWithoutTol = 2 , kUninitialized = 3 }
 

Public Member Functions

virtual G4int AmIOnLeftSide (const G4ThreeVector &me, const G4ThreeVector &vec, G4bool withTol=true)
 
G4ThreeVector ComputeGlobalDirection (const G4ThreeVector &lp) const
 
G4ThreeVector ComputeGlobalPoint (const G4ThreeVector &lp) const
 
G4ThreeVector ComputeLocalDirection (const G4ThreeVector &gp) const
 
G4ThreeVector ComputeLocalPoint (const G4ThreeVector &gp) const
 
void DebugPrint () const
 
virtual G4double DistanceTo (const G4ThreeVector &gp, G4ThreeVector &gxx)
 
virtual G4double DistanceToBoundary (G4int areacode, G4ThreeVector &xx, const G4ThreeVector &p)
 
virtual G4double DistanceToIn (const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
 
G4double DistanceToLine (const G4ThreeVector &p, const G4ThreeVector &x0, const G4ThreeVector &d, G4ThreeVector &xx)
 
virtual G4double DistanceToOut (const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
 
G4double DistanceToPlane (const G4ThreeVector &p, const G4ThreeVector &x0, const G4ThreeVector &n0, G4ThreeVector &xx)
 
G4double DistanceToPlane (const G4ThreeVector &p, const G4ThreeVector &x0, const G4ThreeVector &t1, const G4ThreeVector &t2, G4ThreeVector &xx, G4ThreeVector &n)
 
G4double DistanceToPlaneWithV (const G4ThreeVector &p, const G4ThreeVector &v, const G4ThreeVector &x0, const G4ThreeVector &n0, G4ThreeVector &xx)
 
virtual G4int DistanceToSurface (const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector gxx[], G4double distance[], G4int areacode[], G4bool isvalid[], EValidate validate=kValidateWithTol)
 
virtual G4int DistanceToSurface (const G4ThreeVector &gp, G4ThreeVector gxx[], G4double distance[], G4int areacode[])
 
 G4TwistTubsHypeSide (__void__ &)
 
 G4TwistTubsHypeSide (const G4String &name, const G4RotationMatrix &rot, const G4ThreeVector &tlate, const G4int handedness, const G4double kappa, const G4double tanstereo, const G4double r0, const EAxis axis0=kPhi, const EAxis axis1=kZAxis, G4double axis0min=-kInfinity, G4double axis1min=-kInfinity, G4double axis0max=kInfinity, G4double axis1max=kInfinity)
 
 G4TwistTubsHypeSide (const G4String &name, G4double EndInnerRadius[2], G4double EndOuterRadius[2], G4double DPhi, G4double EndPhi[2], G4double EndZ[2], G4double InnerRadius, G4double OuterRadius, G4double Kappa, G4double TanInnerStereo, G4double TanOuterStereo, G4int handedness)
 
G4int GetAxisType (G4int areacode, G4int whichaxis) const
 
virtual G4ThreeVector GetBoundaryAtPZ (G4int areacode, const G4ThreeVector &p) const
 
virtual G4double GetBoundaryMax (G4double phi)
 
virtual G4double GetBoundaryMin (G4double phi)
 
virtual void GetBoundaryParameters (const G4int &areacode, G4ThreeVector &d, G4ThreeVector &x0, G4int &boundarytype) const
 
G4int GetEdgeVisibility (G4int i, G4int j, G4int m, G4int n, G4int number, G4int orientation)
 
G4int GetFace (G4int i, G4int j, G4int m, G4int n, G4int iside)
 
virtual void GetFacets (G4int m, G4int n, G4double xyz[][3], G4int faces[][4], G4int iside)
 
virtual G4String GetName () const
 
G4int GetNode (G4int i, G4int j, G4int m, G4int n, G4int iside)
 
virtual G4ThreeVector GetNormal (const G4ThreeVector &xx, G4bool isGlobal=false)
 
virtual G4double GetRhoAtPZ (const G4ThreeVector &p, G4bool isglobal=false) const
 
virtual G4double GetSurfaceArea ()
 
virtual EInside Inside (const G4ThreeVector &gp)
 
G4bool IsAxis0 (G4int areacode) const
 
G4bool IsAxis1 (G4int areacode) const
 
G4bool IsBoundary (G4int areacode, G4bool testbitmode=false) const
 
G4bool IsCorner (G4int areacode, G4bool testbitmode=false) const
 
G4bool IsInside (G4int areacode, G4bool testbitmode=false) const
 
G4bool IsOutside (G4int areacode) const
 
G4bool IsSameBoundary (G4VTwistSurface *surface1, G4int areacode1, G4VTwistSurface *surface2, G4int areacode2) const
 
G4bool IsValidNorm () const
 
void SetAxis (G4int i, const EAxis axis)
 
void SetNeighbours (G4VTwistSurface *ax0min, G4VTwistSurface *ax1min, G4VTwistSurface *ax0max, G4VTwistSurface *ax1max)
 
virtual G4ThreeVector SurfacePoint (G4double, G4double, G4bool isGlobal=false)
 
virtual ~G4TwistTubsHypeSide ()
 

Static Public Attributes

static const G4int sAreaMask = 0XF0000000
 
static const G4int sAxis0 = 0x0000FF00
 
static const G4int sAxis1 = 0x000000FF
 
static const G4int sAxisMask = 0x0000FCFC
 
static const G4int sAxisMax = 0x00000202
 
static const G4int sAxisMin = 0x00000101
 
static const G4int sAxisPhi = 0x00001414
 
static const G4int sAxisRho = 0x00001010
 
static const G4int sAxisX = 0x00000404
 
static const G4int sAxisY = 0x00000808
 
static const G4int sAxisZ = 0x00000C0C
 
static const G4int sBoundary = 0x20000000
 
static const G4int sC0Max1Max = 0x40000202
 
static const G4int sC0Max1Min = 0x40000201
 
static const G4int sC0Min1Max = 0x40000102
 
static const G4int sC0Min1Min = 0x40000101
 
static const G4int sCorner = 0x40000000
 
static const G4int sInside = 0x10000000
 
static const G4int sOutside = 0x00000000
 
static const G4int sSizeMask = 0x00000303
 

Protected Member Functions

void GetBoundaryAxis (G4int areacode, EAxis axis[]) const
 
void GetBoundaryLimit (G4int areacode, G4double limit[]) const
 
G4ThreeVector GetCorner (G4int areacode) const
 
G4VTwistSurface ** GetNeighbours ()
 
G4int GetNeighbours (G4int areacode, G4VTwistSurface *surfaces[])
 
virtual void SetBoundary (const G4int &axiscode, const G4ThreeVector &direction, const G4ThreeVector &x0, const G4int &boundarytype)
 
void SetCorner (G4int areacode, G4double x, G4double y, G4double z)
 

Protected Attributes

EAxis fAxis [2]
 
G4double fAxisMax [2]
 
G4double fAxisMin [2]
 
G4SurfCurNormal fCurrentNormal
 
CurrentStatus fCurStat
 
CurrentStatus fCurStatWithV
 
G4int fHandedness
 
G4bool fIsValidNorm
 
G4RotationMatrix fRot
 
G4ThreeVector fTrans
 
G4double kCarTolerance
 

Private Member Functions

virtual G4int GetAreaCode (const G4ThreeVector &xx, G4bool withTol=true)
 
virtual G4int GetAreaCodeInPhi (const G4ThreeVector &xx, G4bool withTol=true)
 
virtual void SetBoundaries ()
 
virtual void SetCorners ()
 
virtual void SetCorners (G4double EndInnerRadius[2], G4double EndOuterRadius[2], G4double DPhi, G4double EndPhi[2], G4double EndZ[2])
 

Private Attributes

G4SurfSideQuery fAmIOnLeftSide
 
Boundary fBoundaries [4]
 
G4ThreeVector fCorners [4]
 
G4double fDPhi
 
Insidetype fInside
 
G4double fKappa
 
G4String fName
 
G4VTwistSurfacefNeighbours [4]
 
G4double fR0
 
G4double fR02
 
G4double fTan2Stereo
 
G4double fTanStereo
 

Detailed Description

Definition at line 43 of file G4TwistTubsHypeSide.hh.

Member Enumeration Documentation

◆ EValidate

Enumerator
kDontValidate 
kValidateWithTol 
kValidateWithoutTol 
kUninitialized 

Definition at line 52 of file G4VTwistSurface.hh.

Constructor & Destructor Documentation

◆ G4TwistTubsHypeSide() [1/3]

G4TwistTubsHypeSide::G4TwistTubsHypeSide ( const G4String name,
const G4RotationMatrix rot,
const G4ThreeVector tlate,
const G4int  handedness,
const G4double  kappa,
const G4double  tanstereo,
const G4double  r0,
const EAxis  axis0 = kPhi,
const EAxis  axis1 = kZAxis,
G4double  axis0min = -kInfinity,
G4double  axis1min = -kInfinity,
G4double  axis0max = kInfinity,
G4double  axis1max = kInfinity 
)

Definition at line 40 of file G4TwistTubsHypeSide.cc.

53 : G4VTwistSurface(name, rot, tlate, handedness, axis0, axis1,
54 axis0min, axis1min, axis0max, axis1max),
55 fKappa(kappa), fTanStereo(tanstereo),
56 fTan2Stereo(tanstereo*tanstereo), fR0(r0), fR02(r0*r0), fDPhi(twopi)
57{
58 if ( (axis0 == kZAxis) && (axis1 == kPhi) )
59 {
60 G4Exception("G4TwistTubsHypeSide::G4TwistTubsHypeSide()",
61 "GeomSolids0002", FatalErrorInArgument,
62 "Should swap axis0 and axis1!");
63 }
66 fIsValidNorm = false;
67 SetCorners();
69}
@ FatalErrorInArgument
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
static constexpr double twopi
Definition: G4SIunits.hh:56
void set(double x, double y, double z)
virtual void SetBoundaries()
G4VTwistSurface(const G4String &name)
@ kPhi
Definition: geomdefs.hh:60
@ kZAxis
Definition: geomdefs.hh:57
@ kOutside
Definition: geomdefs.hh:68
static const G4double kInfinity
Definition: geomdefs.hh:41
const char * name(G4int ptype)

References FatalErrorInArgument, fInside, G4VTwistSurface::fIsValidNorm, G4Exception(), G4TwistTubsHypeSide::Insidetype::gp, G4TwistTubsHypeSide::Insidetype::inside, kInfinity, kOutside, kPhi, kZAxis, CLHEP::Hep3Vector::set(), SetBoundaries(), and SetCorners().

◆ G4TwistTubsHypeSide() [2/3]

G4TwistTubsHypeSide::G4TwistTubsHypeSide ( const G4String name,
G4double  EndInnerRadius[2],
G4double  EndOuterRadius[2],
G4double  DPhi,
G4double  EndPhi[2],
G4double  EndZ[2],
G4double  InnerRadius,
G4double  OuterRadius,
G4double  Kappa,
G4double  TanInnerStereo,
G4double  TanOuterStereo,
G4int  handedness 
)

Definition at line 71 of file G4TwistTubsHypeSide.cc.

84{
85
86 fHandedness = handedness; // +z = +ve, -z = -ve
87 fAxis[0] = kPhi;
88 fAxis[1] = kZAxis;
89 fAxisMin[0] = kInfinity; // we cannot fix boundary min of Phi,
90 fAxisMax[0] = kInfinity; // because it depends on z.
91 fAxisMin[1] = EndZ[0];
92 fAxisMax[1] = EndZ[1];
93 fKappa = Kappa;
94 fDPhi = DPhi ;
95
96 if (handedness < 0) // inner hyperbolic surface
97 {
98 fTanStereo = TanInnerStereo;
99 fR0 = InnerRadius;
100 }
101 else // outer hyperbolic surface
102 {
103 fTanStereo = TanOuterStereo;
104 fR0 = OuterRadius;
105 }
107 fR02 = fR0 * fR0;
108
109 fTrans.set(0, 0, 0);
110 fIsValidNorm = false;
111
114
115 SetCorners(EndInnerRadius, EndOuterRadius, DPhi, EndPhi, EndZ) ;
116
118}
G4double fAxisMax[2]
G4ThreeVector fTrans
G4double fAxisMin[2]

References G4VTwistSurface::fAxis, G4VTwistSurface::fAxisMax, G4VTwistSurface::fAxisMin, fDPhi, G4VTwistSurface::fHandedness, fInside, G4VTwistSurface::fIsValidNorm, fKappa, fR0, fR02, fTan2Stereo, fTanStereo, G4VTwistSurface::fTrans, G4TwistTubsHypeSide::Insidetype::gp, G4TwistTubsHypeSide::Insidetype::inside, kInfinity, kOutside, kPhi, kZAxis, CLHEP::Hep3Vector::set(), SetBoundaries(), and SetCorners().

◆ ~G4TwistTubsHypeSide()

G4TwistTubsHypeSide::~G4TwistTubsHypeSide ( )
virtual

Definition at line 132 of file G4TwistTubsHypeSide.cc.

133{
134}

◆ G4TwistTubsHypeSide() [3/3]

G4TwistTubsHypeSide::G4TwistTubsHypeSide ( __void__ &  a)

Definition at line 123 of file G4TwistTubsHypeSide.cc.

124 : G4VTwistSurface(a), fKappa(0.), fTanStereo(0.), fTan2Stereo(0.),
125 fR0(0.), fR02(0.), fDPhi(0.)
126{
127}

Member Function Documentation

◆ AmIOnLeftSide()

G4int G4VTwistSurface::AmIOnLeftSide ( const G4ThreeVector me,
const G4ThreeVector vec,
G4bool  withTol = true 
)
virtualinherited

Definition at line 147 of file G4VTwistSurface.cc.

150{
151 // AmIOnLeftSide returns phi-location of "me"
152 // (phi relation between me and vec projected on z=0 plane).
153 // If "me" is on -ve-phi-side of "vec", it returns 1.
154 // On the other hand, if "me" is on +ve-phi-side of "vec",
155 // it returns -1.
156 // (The return value represents z-coordinate of normal vector
157 // of me.cross(vec).)
158 // If me is on boundary of vec, return 0.
159
160 const G4double kAngTolerance
162
163 G4RotationMatrix unitrot;
164 const G4RotationMatrix rottol = unitrot.rotateZ(0.5*kAngTolerance);
165 const G4RotationMatrix invrottol = unitrot.rotateZ(-1.*kAngTolerance);
166
167 if (fAmIOnLeftSide.me == me
168 && fAmIOnLeftSide.vec == vec
169 && fAmIOnLeftSide.withTol == withtol)
170 {
172 }
173
174 fAmIOnLeftSide.me = me;
175 fAmIOnLeftSide.vec = vec;
176 fAmIOnLeftSide.withTol = withtol;
177
178 G4ThreeVector met = (G4ThreeVector(me.x(), me.y(), 0.)).unit();
179 G4ThreeVector vect = (G4ThreeVector(vec.x(), vec.y(), 0.)).unit();
180
181 G4ThreeVector ivect = invrottol * vect;
182 G4ThreeVector rvect = rottol * vect;
183
184 G4double metcrossvect = met.x() * vect.y() - met.y() * vect.x();
185
186 if (withtol)
187 {
188 if (met.x() * ivect.y() - met.y() * ivect.x() > 0 &&
189 metcrossvect >= 0) {
191 } else if (met.x() * rvect.y() - met.y() * rvect.x() < 0 &&
192 metcrossvect <= 0) {
194 } else {
196 }
197 }
198 else
199 {
200 if (metcrossvect > 0) {
202 } else if (metcrossvect < 0 ) {
204 } else {
206 }
207 }
208
209#ifdef G4TWISTDEBUG
210 G4cout << " === G4VTwistSurface::AmIOnLeftSide() =============="
211 << G4endl;
212 G4cout << " Name , returncode : " << fName << " "
214 G4cout << " me, vec : " << std::setprecision(14) << me
215 << " " << vec << G4endl;
216 G4cout << " met, vect : " << met << " " << vect << G4endl;
217 G4cout << " ivec, rvec : " << ivect << " " << rvect << G4endl;
218 G4cout << " met x vect : " << metcrossvect << G4endl;
219 G4cout << " met x ivec : " << met.cross(ivect) << G4endl;
220 G4cout << " met x rvec : " << met.cross(rvect) << G4endl;
221 G4cout << " =============================================="
222 << G4endl;
223#endif
224
226}
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
double x() const
double y() const
Hep3Vector cross(const Hep3Vector &) const
HepRotation & rotateZ(double delta)
Definition: Rotation.cc:87
static G4GeometryTolerance * GetInstance()
G4double GetAngularTolerance() const
G4SurfSideQuery fAmIOnLeftSide

References G4VTwistSurface::G4SurfSideQuery::amIOnLeftSide, CLHEP::Hep3Vector::cross(), G4VTwistSurface::fAmIOnLeftSide, G4VTwistSurface::fName, G4cout, G4endl, G4GeometryTolerance::GetAngularTolerance(), G4GeometryTolerance::GetInstance(), G4VTwistSurface::G4SurfSideQuery::me, CLHEP::HepRotation::rotateZ(), G4VTwistSurface::G4SurfSideQuery::vec, G4VTwistSurface::G4SurfSideQuery::withTol, CLHEP::Hep3Vector::x(), and CLHEP::Hep3Vector::y().

Referenced by G4TwistTubsSide::DistanceToSurface(), G4TwistTubsFlatSide::GetAreaCode(), and GetAreaCodeInPhi().

◆ ComputeGlobalDirection()

G4ThreeVector G4VTwistSurface::ComputeGlobalDirection ( const G4ThreeVector lp) const
inlineinherited

◆ ComputeGlobalPoint()

G4ThreeVector G4VTwistSurface::ComputeGlobalPoint ( const G4ThreeVector lp) const
inlineinherited

◆ ComputeLocalDirection()

G4ThreeVector G4VTwistSurface::ComputeLocalDirection ( const G4ThreeVector gp) const
inlineinherited

◆ ComputeLocalPoint()

G4ThreeVector G4VTwistSurface::ComputeLocalPoint ( const G4ThreeVector gp) const
inlineinherited

◆ DebugPrint()

void G4VTwistSurface::DebugPrint ( ) const
inherited

Definition at line 1139 of file G4VTwistSurface.cc.

1140{
1145
1146 G4cout << "/* G4VTwistSurface::DebugPrint():--------------------------"
1147 << G4endl;
1148 G4cout << "/* Name = " << fName << G4endl;
1149 G4cout << "/* Axis = " << std::hex << fAxis[0] << " "
1150 << std::hex << fAxis[1]
1151 << " (0,1,2,3,5 = kXAxis,kYAxis,kZAxis,kRho,kPhi)"
1152 << std::dec << G4endl;
1153 G4cout << "/* BoundaryLimit(in local) fAxis0(min, max) = ("<<fAxisMin[0]
1154 << ", " << fAxisMax[0] << ")" << G4endl;
1155 G4cout << "/* BoundaryLimit(in local) fAxis1(min, max) = ("<<fAxisMin[1]
1156 << ", " << fAxisMax[1] << ")" << G4endl;
1157 G4cout << "/* Cornar point sC0Min1Min = " << A << G4endl;
1158 G4cout << "/* Cornar point sC0Max1Min = " << B << G4endl;
1159 G4cout << "/* Cornar point sC0Max1Max = " << C << G4endl;
1160 G4cout << "/* Cornar point sC0Min1Max = " << D << G4endl;
1161 G4cout << "/*---------------------------------------------------------"
1162 << G4endl;
1163}
G4double C(G4double temp)
G4double B(G4double temperature)
G4double D(G4double temp)
const G4double A[17]
static const G4int sC0Min1Min
static const G4int sC0Min1Max
G4RotationMatrix fRot
static const G4int sC0Max1Max
G4ThreeVector GetCorner(G4int areacode) const
static const G4int sC0Max1Min

References A, B(), C(), D(), G4VTwistSurface::fAxis, G4VTwistSurface::fAxisMax, G4VTwistSurface::fAxisMin, G4VTwistSurface::fName, G4VTwistSurface::fRot, G4VTwistSurface::fTrans, G4cout, G4endl, G4VTwistSurface::GetCorner(), G4VTwistSurface::sC0Max1Max, G4VTwistSurface::sC0Max1Min, G4VTwistSurface::sC0Min1Max, and G4VTwistSurface::sC0Min1Min.

◆ DistanceTo()

G4double G4VTwistSurface::DistanceTo ( const G4ThreeVector gp,
G4ThreeVector gxx 
)
virtualinherited

Definition at line 577 of file G4VTwistSurface.cc.

579{
580#ifdef G4TWISTDEBUG
581 G4cout << "~~~~~ G4VTwistSurface::DistanceTo(p) - Start ~~~~~~~~~" << G4endl;
582 G4cout << " Name : " << fName << G4endl;
583 G4cout << " gp : " << gp << G4endl;
584 G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl;
585#endif
586
587
589 G4double distance[G4VSURFACENXX] ;
590 G4int areacode[G4VSURFACENXX] ;
591
592 for (G4int i = 0 ; i<G4VSURFACENXX ; ++i )
593 {
594 distance[i] = kInfinity ;
595 areacode[i] = sOutside ;
596 }
597
598 DistanceToSurface(gp, gxx, distance, areacode);
599 gxxbest = gxx[0];
600
601#ifdef G4TWISTDEBUG
602 G4cout << "~~~~~ G4VTwistSurface::DistanceTo(p) - return ~~~~~~~~" << G4endl;
603 G4cout << " Name : " << fName << G4endl;
604 G4cout << " gxx : " << gxxbest << G4endl;
605 G4cout << " bestdist : " << distance[0] << G4endl;
606 G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl;
607#endif
608
609 return distance[0];
610}
int G4int
Definition: G4Types.hh:85
#define G4VSURFACENXX
static const G4int sOutside
virtual G4int DistanceToSurface(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector gxx[], G4double distance[], G4int areacode[], G4bool isvalid[], EValidate validate=kValidateWithTol)=0

References G4VTwistSurface::DistanceToSurface(), G4VTwistSurface::fName, G4cout, G4endl, G4VSURFACENXX, kInfinity, and G4VTwistSurface::sOutside.

Referenced by G4TwistedTubs::DistanceToIn(), G4VTwistedFaceted::DistanceToIn(), G4TwistedTubs::DistanceToOut(), G4VTwistedFaceted::DistanceToOut(), G4TwistedTubs::SurfaceNormal(), and G4VTwistedFaceted::SurfaceNormal().

◆ DistanceToBoundary()

G4double G4VTwistSurface::DistanceToBoundary ( G4int  areacode,
G4ThreeVector xx,
const G4ThreeVector p 
)
virtualinherited

Definition at line 231 of file G4VTwistSurface.cc.

234{
235 // DistanceToBoundary
236 //
237 // return distance to nearest boundary from arbitrary point p
238 // in local coodinate.
239 // Argument areacode must be one of them:
240 // sAxis0 & sAxisMin, sAxis0 & sAxisMax,
241 // sAxis1 & sAxisMin, sAxis1 & sAxisMax.
242 //
243
244 G4ThreeVector d; // direction vector of the boundary
245 G4ThreeVector x0; // reference point of the boundary
246 G4double dist = kInfinity;
247 G4int boundarytype;
248
249 if (IsAxis0(areacode) && IsAxis1(areacode))
250 {
251 std::ostringstream message;
252 message << "Point is in the corner area." << G4endl
253 << " Point is in the corner area. This function returns"
254 << G4endl
255 << " a direction vector of a boundary line." << G4endl
256 << " areacode = " << areacode;
257 G4Exception("G4VTwistSurface::DistanceToBoundary()", "GeomSolids0003",
258 FatalException, message);
259 }
260 else if (IsAxis0(areacode) || IsAxis1(areacode))
261 {
262 GetBoundaryParameters(areacode, d, x0, boundarytype);
263 if (boundarytype == sAxisPhi)
264 {
265 G4double t = x0.getRho() / p.getRho();
266 xx.set(t*p.x(), t*p.y(), x0.z());
267 dist = (xx - p).mag();
268 }
269 else
270 {
271 // linear boundary
272 // sAxisX, sAxisY, sAxisZ, sAxisRho
273 dist = DistanceToLine(p, x0, d, xx);
274 }
275 }
276 else
277 {
278 std::ostringstream message;
279 message << "Bad areacode of boundary." << G4endl
280 << " areacode = " << areacode;
281 G4Exception("G4VTwistSurface::DistanceToBoundary()", "GeomSolids0003",
282 FatalException, message);
283 }
284 return dist;
285}
@ FatalException
double z() const
double getRho() const
G4bool IsAxis1(G4int areacode) const
G4bool IsAxis0(G4int areacode) const
G4double DistanceToLine(const G4ThreeVector &p, const G4ThreeVector &x0, const G4ThreeVector &d, G4ThreeVector &xx)
static const G4int sAxisPhi
virtual void GetBoundaryParameters(const G4int &areacode, G4ThreeVector &d, G4ThreeVector &x0, G4int &boundarytype) const

References G4VTwistSurface::DistanceToLine(), FatalException, G4endl, G4Exception(), G4VTwistSurface::GetBoundaryParameters(), CLHEP::Hep3Vector::getRho(), G4VTwistSurface::IsAxis0(), G4VTwistSurface::IsAxis1(), kInfinity, G4VTwistSurface::sAxisPhi, CLHEP::Hep3Vector::set(), CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), and CLHEP::Hep3Vector::z().

Referenced by G4TwistTubsSide::DistanceToSurface().

◆ DistanceToIn()

G4double G4VTwistSurface::DistanceToIn ( const G4ThreeVector gp,
const G4ThreeVector gv,
G4ThreeVector gxxbest 
)
virtualinherited

Definition at line 290 of file G4VTwistSurface.cc.

293{
294#ifdef G4TWISTDEBUG
295 G4cout << " ~~~~ G4VTwistSurface::DistanceToIn(p,v) - Start ~~~~" << G4endl;
296 G4cout << " Name : " << fName << G4endl;
297 G4cout << " gp : " << gp << G4endl;
298 G4cout << " gv : " << gv << G4endl;
299 G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl;
300#endif
301
303 G4double distance[G4VSURFACENXX] ;
304 G4int areacode[G4VSURFACENXX] ;
305 G4bool isvalid[G4VSURFACENXX] ;
306
307 for (G4int i = 0 ; i<G4VSURFACENXX ; ++i )
308 {
309 distance[i] = kInfinity ;
310 areacode[i] = sOutside ;
311 isvalid[i] = false ;
312 }
313
314 G4double bestdistance = kInfinity;
315#ifdef G4TWISTDEBUG
316 G4int besti = -1;
317#endif
319
320 G4int nxx = DistanceToSurface(gp, gv, gxx, distance, areacode,
321 isvalid, kValidateWithTol);
322
323 for (G4int i=0; i<nxx; ++i)
324 {
325
326 // skip this intersection if:
327 // - invalid intersection
328 // - particle goes outword the surface
329
330 if (!isvalid[i])
331 {
332 // xx[i] is sOutside or distance[i] < 0
333 continue;
334 }
335
336 G4ThreeVector normal = GetNormal(gxx[i], true);
337
338 if ((normal * gv) >= 0)
339 {
340
341#ifdef G4TWISTDEBUG
342 G4cout << " G4VTwistSurface::DistanceToIn(p,v): "
343 << "particle goes outword the surface." << G4endl;
344#endif
345 continue;
346 }
347
348 //
349 // accept this intersection if the intersection is inside.
350 //
351
352 if (IsInside(areacode[i]))
353 {
354 if (distance[i] < bestdistance)
355 {
356 bestdistance = distance[i];
357 bestgxx = gxx[i];
358#ifdef G4TWISTDEBUG
359 besti = i;
360 G4cout << " G4VTwistSurface::DistanceToIn(p,v): "
361 << " areacode sInside name, distance = "
362 << fName << " "<< bestdistance << G4endl;
363#endif
364 }
365
366 //
367 // else, the intersection is on boundary or corner.
368 //
369
370 }
371 else
372 {
373 G4VTwistSurface* neighbours[2];
374 G4bool isaccepted[2] = {false, false};
375 G4int nneighbours = GetNeighbours(areacode[i], neighbours);
376
377 for (G4int j=0; j<nneighbours; ++j)
378 {
379 // if on corner, nneighbours = 2.
380 // if on boundary, nneighbours = 1.
381
383 G4double tmpdist[G4VSURFACENXX] ;
384 G4int tmpareacode[G4VSURFACENXX] ;
385 G4bool tmpisvalid[G4VSURFACENXX] ;
386
387 for (G4int l = 0 ; l<G4VSURFACENXX ; ++l )
388 {
389 tmpdist[l] = kInfinity ;
390 tmpareacode[l] = sOutside ;
391 tmpisvalid[l] = false ;
392 }
393
394 G4int tmpnxx = neighbours[j]->DistanceToSurface(
395 gp, gv, tmpgxx, tmpdist,
396 tmpareacode, tmpisvalid,
398 G4ThreeVector neighbournormal;
399
400 for (G4int k=0; k< tmpnxx; ++k)
401 {
402 //
403 // if tmpxx[k] is valid && sInside, the final winner must
404 // be neighbour surface. return kInfinity.
405 // else , choose tmpxx on same boundary of xx, then check normal
406 //
407
408 if (IsInside(tmpareacode[k]))
409 {
410#ifdef G4TWISTDEBUG
411 G4cout << " G4VTwistSurface:DistanceToIn(p,v): "
412 << " intersection "<< tmpgxx[k] << G4endl
413 << " is inside of neighbour surface of " << fName
414 << " . returning kInfinity." << G4endl;
415 G4cout << "~~ G4VTwistSurface::DistanceToIn(p,v) - return ~~"
416 << G4endl;
417 G4cout << " No intersections " << G4endl;
418 G4cout << " Name : " << fName << G4endl;
419 G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
420 << G4endl;
421#endif
422 if (tmpisvalid[k]) return kInfinity;
423 continue;
424
425 //
426 // if tmpxx[k] is valid && sInside, the final winner must
427 // be neighbour surface. return .
428 //
429
430 }
431 else if (IsSameBoundary(this,areacode[i],
432 neighbours[j], tmpareacode[k]))
433 {
434 // tmpxx[k] is same boundary (or corner) of xx.
435
436 neighbournormal = neighbours[j]->GetNormal(tmpgxx[k], true);
437 if (neighbournormal * gv < 0) isaccepted[j] = true;
438 }
439 }
440
441 // if nneighbours = 1, chabge isaccepted[1] before
442 // exiting neighboursurface loop.
443
444 if (nneighbours == 1) isaccepted[1] = true;
445
446 } // neighboursurface loop end
447
448 // now, we can accept xx intersection
449
450 if (isaccepted[0] == true && isaccepted[1] == true)
451 {
452 if (distance[i] < bestdistance)
453 {
454 bestdistance = distance[i];
455 gxxbest = gxx[i];
456#ifdef G4TWISTDEBUG
457 besti = i;
458 G4cout << " G4VTwistSurface::DistanceToIn(p,v): "
459 << " areacode sBoundary & sBoundary distance = "
460 << fName << " " << distance[i] << G4endl;
461#endif
462 }
463 }
464 } // else end
465 } // intersection loop end
466
467 gxxbest = bestgxx;
468
469#ifdef G4TWISTDEBUG
470 if (besti < 0)
471 {
472 G4cout << "~~~ G4VTwistSurface::DistanceToIn(p,v) - return ~~~" << G4endl;
473 G4cout << " No intersections " << G4endl;
474 G4cout << " Name : " << fName << G4endl;
475 G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl;
476 }
477 else
478 {
479 G4cout << "~~~ G4VTwistSurface::DistanceToIn(p,v) : return ~~~" << G4endl;
480 G4cout << " Name, i : " << fName << " , " << besti << G4endl;
481 G4cout << " gxx[i] : " << gxxbest << G4endl;
482 G4cout << " bestdist : " << bestdistance << G4endl;
483 G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl;
484 }
485
486#endif
487
488 return bestdistance;
489}
bool G4bool
Definition: G4Types.hh:86
G4VTwistSurface ** GetNeighbours()
G4bool IsInside(G4int areacode, G4bool testbitmode=false) const
G4bool IsSameBoundary(G4VTwistSurface *surface1, G4int areacode1, G4VTwistSurface *surface2, G4int areacode2) const
virtual G4ThreeVector GetNormal(const G4ThreeVector &xx, G4bool isGlobal)=0
static double normal(HepRandomEngine *eptr)
Definition: RandPoisson.cc:79

References G4VTwistSurface::DistanceToSurface(), G4VTwistSurface::fName, G4cout, G4endl, G4VSURFACENXX, G4VTwistSurface::GetNeighbours(), G4VTwistSurface::GetNormal(), G4VTwistSurface::IsInside(), G4VTwistSurface::IsSameBoundary(), kInfinity, G4VTwistSurface::kValidateWithTol, CLHEP::normal(), and G4VTwistSurface::sOutside.

Referenced by G4TwistedTubs::DistanceToIn(), and G4VTwistedFaceted::DistanceToIn().

◆ DistanceToLine()

G4double G4VTwistSurface::DistanceToLine ( const G4ThreeVector p,
const G4ThreeVector x0,
const G4ThreeVector d,
G4ThreeVector xx 
)
inlineinherited

◆ DistanceToOut()

G4double G4VTwistSurface::DistanceToOut ( const G4ThreeVector gp,
const G4ThreeVector gv,
G4ThreeVector gxxbest 
)
virtualinherited

Definition at line 494 of file G4VTwistSurface.cc.

497{
498#ifdef G4TWISTDEBUG
499 G4cout << "~~~~~ G4VTwistSurface::DistanceToOut(p,v) - Start ~~~~" << G4endl;
500 G4cout << " Name : " << fName << G4endl;
501 G4cout << " gp : " << gp << G4endl;
502 G4cout << " gv : " << gv << G4endl;
503 G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl;
504#endif
505
507 G4double distance[G4VSURFACENXX];
508 G4int areacode[G4VSURFACENXX];
509 G4bool isvalid[G4VSURFACENXX];
510
511 for ( G4int i = 0 ; i<G4VSURFACENXX ; ++i )
512 {
513 distance[i] = kInfinity ;
514 areacode[i] = sOutside ;
515 isvalid[i] = false ;
516 }
517
518 G4int nxx;
519 G4double bestdistance = kInfinity;
520
521 nxx = DistanceToSurface(gp, gv, gxx, distance, areacode,
522 isvalid, kValidateWithTol);
523
524 for (G4int i=0; i<nxx; ++i)
525 {
526 if (!(isvalid[i]))
527 {
528 continue;
529 }
530
531 G4ThreeVector normal = GetNormal(gxx[i], true);
532 if (normal * gv <= 0)
533 {
534 // particle goes toword inside of solid, return kInfinity
535#ifdef G4TWISTDEBUG
536 G4cout << " G4VTwistSurface::DistanceToOut(p,v): normal*gv < 0 "
537 << fName << " " << normal
538 << G4endl;
539#endif
540 }
541 else
542 {
543 // gxx[i] is accepted.
544 if (distance[i] < bestdistance)
545 {
546 bestdistance = distance[i];
547 gxxbest = gxx[i];
548 }
549 }
550 }
551
552#ifdef G4TWISTDEBUG
553 if (besti < 0)
554 {
555 G4cout << "~~ G4VTwistSurface::DistanceToOut(p,v) - return ~~" << G4endl;
556 G4cout << " No intersections " << G4endl;
557 G4cout << " Name : " << fName << G4endl;
558 G4cout << " bestdist : " << bestdistance << G4endl;
559 G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl;
560 }
561 else
562 {
563 G4cout << "~~ G4VTwistSurface::DistanceToOut(p,v) : return ~~" << G4endl;
564 G4cout << " Name, i : " << fName << " , " << i << G4endl;
565 G4cout << " gxx[i] : " << gxxbest << G4endl;
566 G4cout << " bestdist : " << bestdistance << G4endl;
567 G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl;
568 }
569#endif
570
571 return bestdistance;
572}

References G4VTwistSurface::DistanceToSurface(), G4VTwistSurface::fName, G4cout, G4endl, G4VSURFACENXX, G4VTwistSurface::GetNormal(), kInfinity, G4VTwistSurface::kValidateWithTol, CLHEP::normal(), and G4VTwistSurface::sOutside.

Referenced by G4TwistedTubs::DistanceToOut(), and G4VTwistedFaceted::DistanceToOut().

◆ DistanceToPlane() [1/2]

G4double G4VTwistSurface::DistanceToPlane ( const G4ThreeVector p,
const G4ThreeVector x0,
const G4ThreeVector n0,
G4ThreeVector xx 
)
inlineinherited

◆ DistanceToPlane() [2/2]

G4double G4VTwistSurface::DistanceToPlane ( const G4ThreeVector p,
const G4ThreeVector x0,
const G4ThreeVector t1,
const G4ThreeVector t2,
G4ThreeVector xx,
G4ThreeVector n 
)
inlineinherited

◆ DistanceToPlaneWithV()

G4double G4VTwistSurface::DistanceToPlaneWithV ( const G4ThreeVector p,
const G4ThreeVector v,
const G4ThreeVector x0,
const G4ThreeVector n0,
G4ThreeVector xx 
)
inlineinherited

◆ DistanceToSurface() [1/2]

G4int G4TwistTubsHypeSide::DistanceToSurface ( const G4ThreeVector gp,
const G4ThreeVector gv,
G4ThreeVector  gxx[],
G4double  distance[],
G4int  areacode[],
G4bool  isvalid[],
EValidate  validate = kValidateWithTol 
)
virtual

Implements G4VTwistSurface.

Definition at line 251 of file G4TwistTubsHypeSide.cc.

258{
259 // Decide if and where a line intersects with a hyperbolic
260 // surface (of infinite extent)
261 //
262 // Arguments:
263 // p - (in) Point on trajectory
264 // v - (in) Vector along trajectory
265 // r2 - (in) Square of radius at z = 0
266 // tan2phi - (in) std::tan(stereo)**2
267 // s - (out) Up to two points of intersection, where the
268 // intersection point is p + s*v, and if there are
269 // two intersections, s[0] < s[1]. May be negative.
270 // Returns:
271 // The number of intersections. If 0, the trajectory misses.
272 //
273 //
274 // Equation of a line:
275 //
276 // x = x0 + s*tx y = y0 + s*ty z = z0 + s*tz
277 //
278 // Equation of a hyperbolic surface:
279 //
280 // x**2 + y**2 = r**2 + (z*tanPhi)**2
281 //
282 // Solution is quadratic:
283 //
284 // a*s**2 + b*s + c = 0
285 //
286 // where:
287 //
288 // a = tx**2 + ty**2 - (tz*tanPhi)**2
289 //
290 // b = 2*( x0*tx + y0*ty - z0*tz*tanPhi**2 )
291 //
292 // c = x0**2 + y0**2 - r**2 - (z0*tanPhi)**2
293 //
294
295 fCurStatWithV.ResetfDone(validate, &gp, &gv);
296
297 if (fCurStatWithV.IsDone())
298 {
299 for (G4int i=0; i<fCurStatWithV.GetNXX(); ++i)
300 {
301 gxx[i] = fCurStatWithV.GetXX(i);
302 distance[i] = fCurStatWithV.GetDistance(i);
303 areacode[i] = fCurStatWithV.GetAreacode(i);
304 isvalid[i] = fCurStatWithV.IsValid(i);
305 }
306 return fCurStatWithV.GetNXX();
307 }
308 else // initialize
309 {
310 for (auto i=0; i<2; ++i)
311 {
312 distance[i] = kInfinity;
313 areacode[i] = sOutside;
314 isvalid[i] = false;
316 }
317 }
318
321 G4ThreeVector xx[2];
322
323 //
324 // special case! p is on origin.
325 //
326
327 if (p.mag() == 0)
328 {
329 // p is origin.
330 // unique solution of 2-dimension question in r-z plane
331 // Equations:
332 // r^2 = fR02 + z^2*fTan2Stere0
333 // r = beta*z
334 // where
335 // beta = vrho / vz
336 // Solution (z value of intersection point):
337 // xxz = +- std::sqrt (fR02 / (beta^2 - fTan2Stereo))
338 //
339
340 G4double vz = v.z();
341 G4double absvz = std::fabs(vz);
342 G4double vrho = v.getRho();
343 G4double vslope = vrho/vz;
344 G4double vslope2 = vslope * vslope;
345 if (vrho == 0 || (vrho/absvz) <= (absvz*std::fabs(fTanStereo)/absvz))
346 {
347 // vz/vrho is bigger than slope of asymptonic line
348 distance[0] = kInfinity;
349 fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0],
350 isvalid[0], 0, validate, &gp, &gv);
351 return 0;
352 }
353
354 if (vz)
355 {
356 G4double xxz = std::sqrt(fR02 / (vslope2 - fTan2Stereo))
357 * (vz / std::fabs(vz)) ;
358 G4double t = xxz / vz;
359 xx[0].set(t*v.x(), t*v.y(), xxz);
360 }
361 else
362 {
363 // p.z = 0 && v.z =0
364 xx[0].set(v.x()*fR0, v.y()*fR0, 0); // v is a unit vector.
365 }
366 distance[0] = xx[0].mag();
367 gxx[0] = ComputeGlobalPoint(xx[0]);
368
369 if (validate == kValidateWithTol)
370 {
371 areacode[0] = GetAreaCode(xx[0]);
372 if (!IsOutside(areacode[0]))
373 {
374 if (distance[0] >= 0) isvalid[0] = true;
375 }
376 }
377 else if (validate == kValidateWithoutTol)
378 {
379 areacode[0] = GetAreaCode(xx[0], false);
380 if (IsInside(areacode[0]))
381 {
382 if (distance[0] >= 0) isvalid[0] = true;
383 }
384 }
385 else // kDontValidate
386 {
387 areacode[0] = sInside;
388 if (distance[0] >= 0) isvalid[0] = true;
389 }
390
391 fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0],
392 isvalid[0], 1, validate, &gp, &gv);
393 return 1;
394 }
395
396 //
397 // special case end.
398 //
399
400 G4double a = v.x()*v.x() + v.y()*v.y() - v.z()*v.z()*fTan2Stereo;
401 G4double b = 2.0
402 * ( p.x() * v.x() + p.y() * v.y() - p.z() * v.z() * fTan2Stereo );
403 G4double c = p.x()*p.x() + p.y()*p.y() - fR02 - p.z()*p.z()*fTan2Stereo;
404 G4double D = b*b - 4*a*c; //discriminant
405 G4int vout = 0;
406
407 if (std::fabs(a) < DBL_MIN)
408 {
409 if (std::fabs(b) > DBL_MIN) // single solution
410 {
411 distance[0] = -c/b;
412 xx[0] = p + distance[0]*v;
413 gxx[0] = ComputeGlobalPoint(xx[0]);
414
415 if (validate == kValidateWithTol)
416 {
417 areacode[0] = GetAreaCode(xx[0]);
418 if (!IsOutside(areacode[0]))
419 {
420 if (distance[0] >= 0) isvalid[0] = true;
421 }
422 }
423 else if (validate == kValidateWithoutTol)
424 {
425 areacode[0] = GetAreaCode(xx[0], false);
426 if (IsInside(areacode[0]))
427 {
428 if (distance[0] >= 0) isvalid[0] = true;
429 }
430 }
431 else // kDontValidate
432 {
433 areacode[0] = sInside;
434 if (distance[0] >= 0) isvalid[0] = true;
435 }
436
437 fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0],
438 isvalid[0], 1, validate, &gp, &gv);
439 vout = 1;
440 }
441 else
442 {
443 // if a=b=0 and c != 0, p is origin and v is parallel to asymptotic line
444 // if a=b=c=0, p is on surface and v is paralell to stereo wire.
445 // return distance = infinity
446
447 fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0],
448 isvalid[0], 0, validate, &gp, &gv);
449 vout = 0;
450 }
451 }
452 else if (D > DBL_MIN) // double solutions
453 {
454 D = std::sqrt(D);
455 G4double factor = 0.5/a;
456 G4double tmpdist[2] = {kInfinity, kInfinity};
457 G4ThreeVector tmpxx[2] ;
458 G4int tmpareacode[2] = {sOutside, sOutside};
459 G4bool tmpisvalid[2] = {false, false};
460
461 for (auto i=0; i<2; ++i)
462 {
463 tmpdist[i] = factor*(-b - D);
464 D = -D;
465 tmpxx[i] = p + tmpdist[i]*v;
466
467 if (validate == kValidateWithTol)
468 {
469 tmpareacode[i] = GetAreaCode(tmpxx[i]);
470 if (!IsOutside(tmpareacode[i]))
471 {
472 if (tmpdist[i] >= 0) tmpisvalid[i] = true;
473 continue;
474 }
475 }
476 else if (validate == kValidateWithoutTol)
477 {
478 tmpareacode[i] = GetAreaCode(tmpxx[i], false);
479 if (IsInside(tmpareacode[i]))
480 {
481 if (tmpdist[i] >= 0) tmpisvalid[i] = true;
482 continue;
483 }
484 }
485 else // kDontValidate
486 {
487 tmpareacode[i] = sInside;
488 if (tmpdist[i] >= 0) tmpisvalid[i] = true;
489 continue;
490 }
491 }
492
493 if (tmpdist[0] <= tmpdist[1])
494 {
495 distance[0] = tmpdist[0];
496 distance[1] = tmpdist[1];
497 xx[0] = tmpxx[0];
498 xx[1] = tmpxx[1];
499 gxx[0] = ComputeGlobalPoint(tmpxx[0]);
500 gxx[1] = ComputeGlobalPoint(tmpxx[1]);
501 areacode[0] = tmpareacode[0];
502 areacode[1] = tmpareacode[1];
503 isvalid[0] = tmpisvalid[0];
504 isvalid[1] = tmpisvalid[1];
505 }
506 else
507 {
508 distance[0] = tmpdist[1];
509 distance[1] = tmpdist[0];
510 xx[0] = tmpxx[1];
511 xx[1] = tmpxx[0];
512 gxx[0] = ComputeGlobalPoint(tmpxx[1]);
513 gxx[1] = ComputeGlobalPoint(tmpxx[0]);
514 areacode[0] = tmpareacode[1];
515 areacode[1] = tmpareacode[0];
516 isvalid[0] = tmpisvalid[1];
517 isvalid[1] = tmpisvalid[0];
518 }
519
520 fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0],
521 isvalid[0], 2, validate, &gp, &gv);
522 fCurStatWithV.SetCurrentStatus(1, gxx[1], distance[1], areacode[1],
523 isvalid[1], 2, validate, &gp, &gv);
524 vout = 2;
525 }
526 else
527 {
528 // if D<0, no solution
529 // if D=0, just grazing the surfaces, return kInfinity
530
531 fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0],
532 isvalid[0], 0, validate, &gp, &gv);
533 vout = 0;
534 }
535 return vout;
536}
double mag() const
virtual G4int GetAreaCode(const G4ThreeVector &xx, G4bool withTol=true)
G4int GetAreacode(G4int i) const
G4double GetDistance(G4int i) const
G4bool IsValid(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=nullptr)
G4ThreeVector GetXX(G4int i) const
void ResetfDone(EValidate validate, const G4ThreeVector *p, const G4ThreeVector *v=nullptr)
G4ThreeVector ComputeLocalDirection(const G4ThreeVector &gp) const
G4ThreeVector ComputeLocalPoint(const G4ThreeVector &gp) const
G4bool IsOutside(G4int areacode) const
static const G4int sInside
CurrentStatus fCurStatWithV
G4ThreeVector ComputeGlobalPoint(const G4ThreeVector &lp) const
#define DBL_MIN
Definition: templates.hh:54

References G4VTwistSurface::ComputeGlobalPoint(), G4VTwistSurface::ComputeLocalDirection(), G4VTwistSurface::ComputeLocalPoint(), D(), DBL_MIN, G4VTwistSurface::fCurStatWithV, fR0, fR02, fTan2Stereo, fTanStereo, GetAreaCode(), G4VTwistSurface::CurrentStatus::GetAreacode(), G4VTwistSurface::CurrentStatus::GetDistance(), G4VTwistSurface::CurrentStatus::GetNXX(), CLHEP::Hep3Vector::getRho(), G4VTwistSurface::CurrentStatus::GetXX(), G4VTwistSurface::CurrentStatus::IsDone(), G4VTwistSurface::IsInside(), G4VTwistSurface::IsOutside(), G4VTwistSurface::CurrentStatus::IsValid(), kInfinity, G4VTwistSurface::kValidateWithoutTol, G4VTwistSurface::kValidateWithTol, CLHEP::Hep3Vector::mag(), G4VTwistSurface::CurrentStatus::ResetfDone(), CLHEP::Hep3Vector::set(), G4VTwistSurface::CurrentStatus::SetCurrentStatus(), G4VTwistSurface::sInside, G4VTwistSurface::sOutside, CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), and CLHEP::Hep3Vector::z().

◆ DistanceToSurface() [2/2]

G4int G4TwistTubsHypeSide::DistanceToSurface ( const G4ThreeVector gp,
G4ThreeVector  gxx[],
G4double  distance[],
G4int  areacode[] 
)
virtual

Implements G4VTwistSurface.

Definition at line 541 of file G4TwistTubsHypeSide.cc.

545{
546 // Find the approximate distance of a point of a hyperbolic surface.
547 // The distance must be an underestimate.
548 // It will also be nice (although not necessary) that the estimate is
549 // always finite no matter how close the point is.
550 //
551 // We arranged G4Hype::ApproxDistOutside and G4Hype::ApproxDistInside
552 // for this function. See these discriptions.
553
554 const G4double halftol
556
558
559 if (fCurStat.IsDone())
560 {
561 for (G4int i=0; i<fCurStat.GetNXX(); ++i)
562 {
563 gxx[i] = fCurStat.GetXX(i);
564 distance[i] = fCurStat.GetDistance(i);
565 areacode[i] = fCurStat.GetAreacode(i);
566 }
567 return fCurStat.GetNXX();
568 }
569 else // initialize
570 {
571 for (auto i=0; i<2; ++i)
572 {
573 distance[i] = kInfinity;
574 areacode[i] = sOutside;
576 }
577 }
578
579
581 G4ThreeVector xx;
582
583 //
584 // special case!
585 // If p is on surface, return distance = 0 immediatery .
586 //
587 G4ThreeVector lastgxx[2];
588 for (auto i=0; i<2; ++i)
589 {
590 lastgxx[i] = fCurStatWithV.GetXX(i);
591 }
592
593 if ((gp - lastgxx[0]).mag() < halftol || (gp - lastgxx[1]).mag() < halftol)
594 {
595 // last winner, or last poststep point is on the surface.
596 xx = p;
597 gxx[0] = gp;
598 distance[0] = 0;
599
600 G4bool isvalid = true;
601 fCurStat.SetCurrentStatus(0, gxx[0], distance[0], areacode[0],
602 isvalid, 1, kDontValidate, &gp);
603
604 return 1;
605 }
606 //
607 // special case end
608 //
609
610 G4double prho = p.getRho();
611 G4double pz = std::fabs(p.z()); // use symmetry
612 G4double r1 = std::sqrt(fR02 + pz * pz * fTan2Stereo);
613
614 G4ThreeVector pabsz(p.x(), p.y(), pz);
615
616 if (prho > r1 + halftol) // p is outside of Hyperbolic surface
617 {
618 // First point xx1
619 G4double t = r1 / prho;
620 G4ThreeVector xx1(t * pabsz.x(), t * pabsz.y() , pz);
621
622 // Second point xx2
623 G4double z2 = (prho * fTanStereo + pz) / (1 + fTan2Stereo);
624 G4double r2 = std::sqrt(fR02 + z2 * z2 * fTan2Stereo);
625 t = r2 / prho;
626 G4ThreeVector xx2(t * pabsz.x(), t * pabsz.y() , z2);
627
628 G4double len = (xx2 - xx1).mag();
629 if (len < DBL_MIN)
630 {
631 // xx2 = xx1?? I guess we
632 // must have really bracketed the normal
633 distance[0] = (pabsz - xx1).mag();
634 xx = xx1;
635 }
636 else
637 {
638 distance[0] = DistanceToLine(pabsz, xx1, (xx2 - xx1) , xx);
639 }
640
641 }
642 else if (prho < r1 - halftol) // p is inside of Hyperbolic surface.
643 {
644 // First point xx1
645 G4double t;
646 G4ThreeVector xx1;
647 if (prho < DBL_MIN)
648 {
649 xx1.set(r1, 0. , pz);
650 }
651 else
652 {
653 t = r1 / prho;
654 xx1.set(t * pabsz.x(), t * pabsz.y() , pz);
655 }
656
657 // dr, dz is tangential vector of Hyparbolic surface at xx1
658 // dr = r, dz = z*tan2stereo
659 G4double dr = pz * fTan2Stereo;
660 G4double dz = r1;
661 G4double tanbeta = dr / dz;
662 G4double pztanbeta = pz * tanbeta;
663
664 // Second point xx2
665 // xx2 is intersection between x-axis and tangential vector
666 G4double r2 = r1 - pztanbeta;
667 G4ThreeVector xx2;
668 if (prho < DBL_MIN)
669 {
670 xx2.set(r2, 0. , 0.);
671 }
672 else
673 {
674 t = r2 / prho;
675 xx2.set(t * pabsz.x(), t * pabsz.y() , 0.);
676 }
677
678 G4ThreeVector d = xx2 - xx1;
679 distance[0] = DistanceToLine(pabsz, xx1, d, xx);
680
681 }
682 else // p is on Hyperbolic surface.
683 {
684 distance[0] = 0;
685 xx.set(p.x(), p.y(), pz);
686 }
687
688 if (p.z() < 0)
689 {
690 G4ThreeVector tmpxx(xx.x(), xx.y(), -xx.z());
691 xx = tmpxx;
692 }
693
694 gxx[0] = ComputeGlobalPoint(xx);
695 areacode[0] = sInside;
696 G4bool isvalid = true;
697 fCurStat.SetCurrentStatus(0, gxx[0], distance[0], areacode[0],
698 isvalid, 1, kDontValidate, &gp);
699 return 1;
700}
G4double GetRadialTolerance() const
CurrentStatus fCurStat

References G4VTwistSurface::ComputeGlobalPoint(), G4VTwistSurface::ComputeLocalPoint(), DBL_MIN, G4VTwistSurface::DistanceToLine(), G4VTwistSurface::fCurStat, G4VTwistSurface::fCurStatWithV, fR02, fTan2Stereo, fTanStereo, G4VTwistSurface::CurrentStatus::GetAreacode(), G4VTwistSurface::CurrentStatus::GetDistance(), G4GeometryTolerance::GetInstance(), G4VTwistSurface::CurrentStatus::GetNXX(), G4GeometryTolerance::GetRadialTolerance(), CLHEP::Hep3Vector::getRho(), G4VTwistSurface::CurrentStatus::GetXX(), G4VTwistSurface::CurrentStatus::IsDone(), G4VTwistSurface::kDontValidate, kInfinity, G4VTwistSurface::CurrentStatus::ResetfDone(), CLHEP::Hep3Vector::set(), G4VTwistSurface::CurrentStatus::SetCurrentStatus(), G4VTwistSurface::sInside, G4VTwistSurface::sOutside, CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), and CLHEP::Hep3Vector::z().

◆ GetAreaCode()

G4int G4TwistTubsHypeSide::GetAreaCode ( const G4ThreeVector xx,
G4bool  withTol = true 
)
privatevirtual

Implements G4VTwistSurface.

Definition at line 705 of file G4TwistTubsHypeSide.cc.

707{
708 const G4double ctol = 0.5 * kCarTolerance;
709 G4int areacode = sInside;
710
711 if ((fAxis[0] == kPhi && fAxis[1] == kZAxis))
712 {
713 G4int zaxis = 1;
714
715 if (withTol)
716 {
717 G4bool isoutside = false;
718 G4int phiareacode = GetAreaCodeInPhi(xx);
719 G4bool isoutsideinphi = IsOutside(phiareacode);
720
721 // test boundary of phiaxis
722
723 if ((phiareacode & sAxisMin) == sAxisMin)
724 {
725 areacode |= (sAxis0 & (sAxisPhi | sAxisMin)) | sBoundary;
726 if (isoutsideinphi) isoutside = true;
727 }
728 else if ((phiareacode & sAxisMax) == sAxisMax)
729 {
730 areacode |= (sAxis0 & (sAxisPhi | sAxisMax)) | sBoundary;
731 if (isoutsideinphi) isoutside = true;
732 }
733
734 // test boundary of zaxis
735
736 if (xx.z() < fAxisMin[zaxis] + ctol)
737 {
738 areacode |= (sAxis1 & (sAxisZ | sAxisMin));
739 if (areacode & sBoundary) areacode |= sCorner; // xx is on corner.
740 else areacode |= sBoundary;
741
742 if (xx.z() <= fAxisMin[zaxis] - ctol) isoutside = true;
743
744 }
745 else if (xx.z() > fAxisMax[zaxis] - ctol)
746 {
747 areacode |= (sAxis1 & (sAxisZ | sAxisMax));
748 if (areacode & sBoundary) areacode |= sCorner; // xx is on corner.
749 else areacode |= sBoundary;
750
751 if (xx.z() >= fAxisMax[zaxis] + ctol) isoutside = true;
752 }
753
754 // if isoutside = true, clear sInside bit.
755 // if not on boundary, add boundary information.
756
757 if (isoutside)
758 {
759 G4int tmpareacode = areacode & (~sInside);
760 areacode = tmpareacode;
761 }
762 else if ((areacode & sBoundary) != sBoundary)
763 {
764 areacode |= (sAxis0 & sAxisPhi) | (sAxis1 & sAxisZ);
765 }
766
767 return areacode;
768 }
769 else
770 {
771 G4int phiareacode = GetAreaCodeInPhi(xx, false);
772
773 // test boundary of z-axis
774
775 if (xx.z() < fAxisMin[zaxis])
776 {
777 areacode |= (sAxis1 & (sAxisZ | sAxisMin)) | sBoundary;
778
779 }
780 else if (xx.z() > fAxisMax[zaxis])
781 {
782 areacode |= (sAxis1 & (sAxisZ | sAxisMax)) | sBoundary;
783 }
784
785 // boundary of phi-axis
786
787 if (phiareacode == sAxisMin)
788 {
789 areacode |= (sAxis0 & (sAxisPhi | sAxisMin));
790 if (areacode & sBoundary) areacode |= sCorner; // xx is on corner.
791 else areacode |= sBoundary;
792
793 }
794 else if (phiareacode == sAxisMax)
795 {
796 areacode |= (sAxis0 & (sAxisPhi | sAxisMax));
797 if (areacode & sBoundary) areacode |= sCorner; // xx is on corner.
798 else areacode |= sBoundary;
799 }
800
801 // if not on boundary, add boundary information.
802
803 if ((areacode & sBoundary) != sBoundary)
804 {
805 areacode |= (sAxis0 & sAxisPhi) | (sAxis1 & sAxisZ);
806 }
807 return areacode;
808 }
809 }
810 else
811 {
812 std::ostringstream message;
813 message << "Feature NOT implemented !" << G4endl
814 << " fAxis[0] = " << fAxis[0] << G4endl
815 << " fAxis[1] = " << fAxis[1];
816 G4Exception("G4TwistTubsHypeSide::GetAreaCode()",
817 "GeomSolids0001", FatalException, message);
818 }
819 return areacode;
820}
virtual G4int GetAreaCodeInPhi(const G4ThreeVector &xx, G4bool withTol=true)
static const G4int sAxisMax
static const G4int sAxis0
static const G4int sAxisMin
static const G4int sAxis1
static const G4int sBoundary
static const G4int sAxisZ
static const G4int sCorner

References FatalException, G4VTwistSurface::fAxis, G4VTwistSurface::fAxisMax, G4VTwistSurface::fAxisMin, G4endl, G4Exception(), GetAreaCodeInPhi(), G4VTwistSurface::IsOutside(), G4VTwistSurface::kCarTolerance, kPhi, kZAxis, G4VTwistSurface::sAxis0, G4VTwistSurface::sAxis1, G4VTwistSurface::sAxisMax, G4VTwistSurface::sAxisMin, G4VTwistSurface::sAxisPhi, G4VTwistSurface::sAxisZ, G4VTwistSurface::sBoundary, G4VTwistSurface::sCorner, G4VTwistSurface::sInside, and CLHEP::Hep3Vector::z().

Referenced by DistanceToSurface(), and Inside().

◆ GetAreaCodeInPhi()

G4int G4TwistTubsHypeSide::GetAreaCodeInPhi ( const G4ThreeVector xx,
G4bool  withTol = true 
)
privatevirtual

Definition at line 825 of file G4TwistTubsHypeSide.cc.

827{
828
829 G4ThreeVector lowerlimit; // lower phi-boundary limit at z = xx.z()
830 G4ThreeVector upperlimit; // upper phi-boundary limit at z = xx.z()
831 lowerlimit = GetBoundaryAtPZ(sAxis0 & sAxisMin, xx);
832 upperlimit = GetBoundaryAtPZ(sAxis0 & sAxisMax, xx);
833
834 G4int areacode = sInside;
835 G4bool isoutside = false;
836
837 if (withTol)
838 {
839 if (AmIOnLeftSide(xx, lowerlimit) >= 0) // xx is on lowerlimit
840 {
841 areacode |= (sAxisMin | sBoundary);
842 if (AmIOnLeftSide(xx, lowerlimit) > 0) isoutside = true;
843
844 }
845 else if (AmIOnLeftSide(xx, upperlimit) <= 0) // xx is on upperlimit
846 {
847 areacode |= (sAxisMax | sBoundary);
848 if (AmIOnLeftSide(xx, upperlimit) < 0) isoutside = true;
849 }
850
851 // if isoutside = true, clear inside bit.
852
853 if (isoutside)
854 {
855 G4int tmpareacode = areacode & (~sInside);
856 areacode = tmpareacode;
857 }
858 }
859 else
860 {
861 if (AmIOnLeftSide(xx, lowerlimit, false) >= 0)
862 {
863 areacode |= (sAxisMin | sBoundary);
864 }
865 else if (AmIOnLeftSide(xx, upperlimit, false) <= 0)
866 {
867 areacode |= (sAxisMax | sBoundary);
868 }
869 }
870
871 return areacode;
872}
virtual G4int AmIOnLeftSide(const G4ThreeVector &me, const G4ThreeVector &vec, G4bool withTol=true)
virtual G4ThreeVector GetBoundaryAtPZ(G4int areacode, const G4ThreeVector &p) const

References G4VTwistSurface::AmIOnLeftSide(), G4VTwistSurface::GetBoundaryAtPZ(), G4VTwistSurface::sAxis0, G4VTwistSurface::sAxisMax, G4VTwistSurface::sAxisMin, G4VTwistSurface::sBoundary, and G4VTwistSurface::sInside.

Referenced by GetAreaCode().

◆ GetAxisType()

G4int G4VTwistSurface::GetAxisType ( G4int  areacode,
G4int  whichaxis 
) const
inlineinherited

◆ GetBoundaryAtPZ()

G4ThreeVector G4VTwistSurface::GetBoundaryAtPZ ( G4int  areacode,
const G4ThreeVector p 
) const
virtualinherited

Definition at line 698 of file G4VTwistSurface.cc.

700{
701 // areacode must be one of them:
702 // sAxis0 & sAxisMin, sAxis0 & sAxisMax,
703 // sAxis1 & sAxisMin, sAxis1 & sAxisMax.
704
705 if (areacode & sAxis0 && areacode & sAxis1)
706 {
707 std::ostringstream message;
708 message << "Point is in the corner area." << G4endl
709 << " This function returns "
710 << "a direction vector of a boundary line." << G4endl
711 << " areacode = " << areacode;
712 G4Exception("G4VTwistSurface::GetBoundaryAtPZ()", "GeomSolids0003",
713 FatalException, message);
714 }
715
717 G4ThreeVector x0;
718 G4int boundarytype;
719 G4bool found = false;
720
721 for (G4int i=0; i<4; ++i)
722 {
723 if (fBoundaries[i].GetBoundaryParameters(areacode, d, x0,
724 boundarytype))
725 {
726 found = true;
727 continue;
728 }
729 }
730
731 if (!found)
732 {
733 std::ostringstream message;
734 message << "Not registered boundary." << G4endl
735 << " Boundary at areacode " << areacode << G4endl
736 << " is not registered.";
737 G4Exception("G4VTwistSurface::GetBoundaryAtPZ()", "GeomSolids0002",
738 FatalException, message);
739 }
740
741 if (((boundarytype & sAxisPhi) == sAxisPhi) ||
742 ((boundarytype & sAxisRho) == sAxisRho))
743 {
744 std::ostringstream message;
745 message << "Not a z-depended line boundary." << G4endl
746 << " Boundary at areacode " << areacode << G4endl
747 << " is not a z-depended line.";
748 G4Exception("G4VTwistSurface::GetBoundaryAtPZ()", "GeomSolids0002",
749 FatalException, message);
750 }
751 return ((p.z() - x0.z()) / d.z()) * d + x0;
752}
Boundary fBoundaries[4]
static const G4int sAxisRho

References FatalException, G4VTwistSurface::fBoundaries, G4endl, G4Exception(), G4VTwistSurface::GetBoundaryParameters(), G4VTwistSurface::sAxis0, G4VTwistSurface::sAxis1, G4VTwistSurface::sAxisPhi, G4VTwistSurface::sAxisRho, and CLHEP::Hep3Vector::z().

Referenced by G4TwistTubsSide::DistanceToSurface(), GetAreaCodeInPhi(), GetBoundaryMax(), and GetBoundaryMin().

◆ GetBoundaryAxis()

void G4VTwistSurface::GetBoundaryAxis ( G4int  areacode,
EAxis  axis[] 
) const
protectedinherited

Definition at line 783 of file G4VTwistSurface.cc.

784{
785 if ((areacode & sBoundary) != sBoundary) {
786 G4Exception("G4VTwistSurface::GetBoundaryAxis()", "GeomSolids0003",
787 FatalException, "Not located on a boundary!");
788 }
789 for (G4int i=0; i<2; ++i)
790 {
791 G4int whichaxis = 0 ;
792 if (i == 0) {
793 whichaxis = sAxis0;
794 } else if (i == 1) {
795 whichaxis = sAxis1;
796 }
797
798 // extracted axiscode of whichaxis
799 G4int axiscode = whichaxis & sAxisMask & areacode ;
800 if (axiscode) {
801 if (axiscode == (whichaxis & sAxisX)) {
802 axis[i] = kXAxis;
803 } else if (axiscode == (whichaxis & sAxisY)) {
804 axis[i] = kYAxis;
805 } else if (axiscode == (whichaxis & sAxisZ)) {
806 axis[i] = kZAxis;
807 } else if (axiscode == (whichaxis & sAxisRho)) {
808 axis[i] = kRho;
809 } else if (axiscode == (whichaxis & sAxisPhi)) {
810 axis[i] = kPhi;
811 } else {
812 std::ostringstream message;
813 message << "Not supported areacode." << G4endl
814 << " areacode " << areacode;
815 G4Exception("G4VTwistSurface::GetBoundaryAxis()", "GeomSolids0001",
816 FatalException, message);
817 }
818 }
819 }
820}
static const G4int sAxisMask
static const G4int sAxisY
static const G4int sAxisX
@ kYAxis
Definition: geomdefs.hh:56
@ kXAxis
Definition: geomdefs.hh:55
@ kRho
Definition: geomdefs.hh:58

References FatalException, G4endl, G4Exception(), kPhi, kRho, kXAxis, kYAxis, kZAxis, G4VTwistSurface::sAxis0, G4VTwistSurface::sAxis1, G4VTwistSurface::sAxisMask, G4VTwistSurface::sAxisPhi, G4VTwistSurface::sAxisRho, G4VTwistSurface::sAxisX, G4VTwistSurface::sAxisY, G4VTwistSurface::sAxisZ, and G4VTwistSurface::sBoundary.

◆ GetBoundaryLimit()

void G4VTwistSurface::GetBoundaryLimit ( G4int  areacode,
G4double  limit[] 
) const
protectedinherited

Definition at line 825 of file G4VTwistSurface.cc.

826{
827 if (areacode & sCorner) {
828 if (areacode & sC0Min1Min) {
829 limit[0] = fAxisMin[0];
830 limit[1] = fAxisMin[1];
831 } else if (areacode & sC0Max1Min) {
832 limit[0] = fAxisMax[0];
833 limit[1] = fAxisMin[1];
834 } else if (areacode & sC0Max1Max) {
835 limit[0] = fAxisMax[0];
836 limit[1] = fAxisMax[1];
837 } else if (areacode & sC0Min1Max) {
838 limit[0] = fAxisMin[0];
839 limit[1] = fAxisMax[1];
840 }
841 } else if (areacode & sBoundary) {
842 if (areacode & (sAxis0 | sAxisMin)) {
843 limit[0] = fAxisMin[0];
844 } else if (areacode & (sAxis1 | sAxisMin)) {
845 limit[0] = fAxisMin[1];
846 } else if (areacode & (sAxis0 | sAxisMax)) {
847 limit[0] = fAxisMax[0];
848 } else if (areacode & (sAxis1 | sAxisMax)) {
849 limit[0] = fAxisMax[1];
850 }
851 } else {
852 std::ostringstream message;
853 message << "Not located on a boundary!" << G4endl
854 << " areacode " << areacode;
855 G4Exception("G4VTwistSurface::GetBoundaryLimit()", "GeomSolids1002",
856 JustWarning, message);
857 }
858}
@ JustWarning

References G4VTwistSurface::fAxisMax, G4VTwistSurface::fAxisMin, G4endl, G4Exception(), JustWarning, G4VTwistSurface::sAxis0, G4VTwistSurface::sAxis1, G4VTwistSurface::sAxisMax, G4VTwistSurface::sAxisMin, G4VTwistSurface::sBoundary, G4VTwistSurface::sC0Max1Max, G4VTwistSurface::sC0Max1Min, G4VTwistSurface::sC0Min1Max, G4VTwistSurface::sC0Min1Min, and G4VTwistSurface::sCorner.

◆ GetBoundaryMax()

G4double G4TwistTubsHypeSide::GetBoundaryMax ( G4double  phi)
inlinevirtual

Implements G4VTwistSurface.

Definition at line 182 of file G4TwistTubsHypeSide.hh.

183{
184 G4ThreeVector ptmp(0,0,z) ; // temporary point with z Komponent only
185 G4ThreeVector upperlimit; // upper phi-boundary limit at z = ptmp.z()
186 upperlimit = GetBoundaryAtPZ(sAxis0 & sAxisMax, ptmp);
187 return std::atan2( upperlimit.y(), upperlimit.x() ) ;
188}

References G4VTwistSurface::GetBoundaryAtPZ(), G4VTwistSurface::sAxis0, G4VTwistSurface::sAxisMax, CLHEP::Hep3Vector::x(), and CLHEP::Hep3Vector::y().

Referenced by GetFacets().

◆ GetBoundaryMin()

G4double G4TwistTubsHypeSide::GetBoundaryMin ( G4double  phi)
inlinevirtual

Implements G4VTwistSurface.

Definition at line 173 of file G4TwistTubsHypeSide.hh.

174{
175 G4ThreeVector ptmp(0,0,z) ; // temporary point with z Komponent only
176 G4ThreeVector lowerlimit; // lower phi-boundary limit at z = ptmp.z()
177 lowerlimit = GetBoundaryAtPZ(sAxis0 & sAxisMin, ptmp);
178 return std::atan2( lowerlimit.y(), lowerlimit.x() ) ;
179}

References G4VTwistSurface::GetBoundaryAtPZ(), G4VTwistSurface::sAxis0, G4VTwistSurface::sAxisMin, CLHEP::Hep3Vector::x(), and CLHEP::Hep3Vector::y().

Referenced by GetFacets().

◆ GetBoundaryParameters()

void G4VTwistSurface::GetBoundaryParameters ( const G4int areacode,
G4ThreeVector d,
G4ThreeVector x0,
G4int boundarytype 
) const
virtualinherited

Definition at line 668 of file G4VTwistSurface.cc.

672{
673 // areacode must be one of them:
674 // sAxis0 & sAxisMin, sAxis0 & sAxisMax,
675 // sAxis1 & sAxisMin, sAxis1 & sAxisMax.
676
677 for (G4int i=0; i<4; ++i)
678 {
679 if (fBoundaries[i].GetBoundaryParameters(areacode, d, x0,
680 boundarytype))
681 {
682 return;
683 }
684 }
685
686 std::ostringstream message;
687 message << "Not registered boundary." << G4endl
688 << " Boundary at areacode " << std::hex << areacode
689 << std::dec << G4endl
690 << " is not registered.";
691 G4Exception("G4VTwistSurface::GetBoundaryParameters()", "GeomSolids0002",
692 FatalException, message);
693}

References FatalException, G4VTwistSurface::fBoundaries, G4endl, G4Exception(), and G4VTwistSurface::GetBoundaryParameters().

Referenced by G4VTwistSurface::DistanceToBoundary(), G4TwistTubsSide::DistanceToSurface(), G4VTwistSurface::GetBoundaryAtPZ(), G4VTwistSurface::GetBoundaryParameters(), and G4VTwistSurface::IsSameBoundary().

◆ GetCorner()

G4ThreeVector G4VTwistSurface::GetCorner ( G4int  areacode) const
inlineprotectedinherited

◆ GetEdgeVisibility()

G4int G4VTwistSurface::GetEdgeVisibility ( G4int  i,
G4int  j,
G4int  m,
G4int  n,
G4int  number,
G4int  orientation 
)
inherited

Definition at line 1031 of file G4VTwistSurface.cc.

1033{
1034 // clockwise filling -> positive orientation
1035 // counter clockwise filling -> negative orientation
1036
1037 //
1038 // d C c
1039 // +------+
1040 // | |
1041 // | |
1042 // | |
1043 // D | |B
1044 // | |
1045 // | |
1046 // | |
1047 // +------+
1048 // a A b
1049 //
1050 // a = +--+ A = ---+
1051 // b = --++ B = --+-
1052 // c = -++- C = -+--
1053 // d = ++-- D = +---
1054
1055
1056 // check first invisible faces
1057
1058 if ( ( i>0 && i<n-2 ) && ( j>0 && j<k-2 ) )
1059 {
1060 return -1 ; // always invisible, signs: ----
1061 }
1062
1063 // change first the vertex number (depends on the orientation)
1064 // 0,1,2,3 -> 3,2,1,0
1065 if ( orientation < 0 ) { number = ( 3 - number ) ; }
1066
1067 // check true edges
1068 if ( ( j>=1 && j<=k-3 ) )
1069 {
1070 if ( i == 0 ) { // signs (A): ---+
1071 return ( number == 3 ) ? 1 : -1 ;
1072 }
1073
1074 else if ( i == n-2 ) { // signs (C): -+--
1075 return ( number == 1 ) ? 1 : -1 ;
1076 }
1077
1078 else
1079 {
1080 std::ostringstream message;
1081 message << "Not correct face number: " << GetName() << " !";
1082 G4Exception("G4TwistSurface::G4GetEdgeVisibility()",
1083 "GeomSolids0003", FatalException, message);
1084 }
1085 }
1086
1087 if ( ( i>=1 && i<=n-3 ) )
1088 {
1089 if ( j == 0 ) { // signs (D): +---
1090 return ( number == 0 ) ? 1 : -1 ;
1091 }
1092
1093 else if ( j == k-2 ) { // signs (B): --+-
1094 return ( number == 2 ) ? 1 : -1 ;
1095 }
1096
1097 else
1098 {
1099 std::ostringstream message;
1100 message << "Not correct face number: " << GetName() << " !";
1101 G4Exception("G4TwistSurface::G4GetEdgeVisibility()",
1102 "GeomSolids0003", FatalException, message);
1103 }
1104 }
1105
1106 // now the corners
1107 if ( i == 0 && j == 0 ) { // signs (a) : +--+
1108 return ( number == 0 || number == 3 ) ? 1 : -1 ;
1109 }
1110 else if ( i == 0 && j == k-2 ) { // signs (b) : --++
1111 return ( number == 2 || number == 3 ) ? 1 : -1 ;
1112 }
1113 else if ( i == n-2 && j == k-2 ) { // signs (c) : -++-
1114 return ( number == 1 || number == 2 ) ? 1 : -1 ;
1115 }
1116 else if ( i == n-2 && j == 0 ) { // signs (d) : ++--
1117 return ( number == 0 || number == 1 ) ? 1 : -1 ;
1118 }
1119 else
1120 {
1121 std::ostringstream message;
1122 message << "Not correct face number: " << GetName() << " !";
1123 G4Exception("G4TwistSurface::G4GetEdgeVisibility()",
1124 "GeomSolids0003", FatalException, message);
1125 }
1126
1127 std::ostringstream message;
1128 message << "Not correct face number: " << GetName() << " !";
1129 G4Exception("G4TwistSurface::G4GetEdgeVisibility()", "GeomSolids0003",
1130 FatalException, message);
1131
1132 return 0 ;
1133}
virtual G4String GetName() const

References FatalException, G4Exception(), G4VTwistSurface::GetName(), and CLHEP::detail::n.

Referenced by G4TwistBoxSide::GetFacets(), G4TwistTrapAlphaSide::GetFacets(), G4TwistTrapFlatSide::GetFacets(), G4TwistTrapParallelSide::GetFacets(), G4TwistTubsFlatSide::GetFacets(), GetFacets(), and G4TwistTubsSide::GetFacets().

◆ GetFace()

G4int G4VTwistSurface::GetFace ( G4int  i,
G4int  j,
G4int  m,
G4int  n,
G4int  iside 
)
inherited

Definition at line 906 of file G4VTwistSurface.cc.

908{
909 // this is the face mapping function
910 // (i,j) -> face number
911
912 if ( iside == 0 ) {
913 return i * ( k - 1 ) + j ;
914 }
915
916 else if ( iside == 1 ) {
917 return (k-1)*(k-1) + i*(k-1) + j ;
918 }
919
920 else if ( iside == 2 ) {
921 return 2*(k-1)*(k-1) + i*(k-1) + j ;
922 }
923
924 else if ( iside == 3 ) {
925 return 2*(k-1)*(k-1) + (n-1)*(k-1) + i*(k-1) + j ;
926 }
927
928 else if ( iside == 4 ) {
929 return 2*(k-1)*(k-1) + 2*(n-1)*(k-1) + i*(k-1) + j ;
930 }
931
932 else if ( iside == 5 ) {
933 return 2*(k-1)*(k-1) + 3*(n-1)*(k-1) + i*(k-1) + j ;
934 }
935
936 else {
937 std::ostringstream message;
938 message << "Not correct side number: "
939 << GetName() << G4endl
940 << "iside is " << iside << " but should be "
941 << "0,1,2,3,4 or 5" << ".";
942 G4Exception("G4TwistSurface::G4GetFace()", "GeomSolids0002",
943 FatalException, message);
944 }
945
946 return -1 ; // wrong face
947}

References FatalException, G4endl, G4Exception(), G4VTwistSurface::GetName(), and CLHEP::detail::n.

Referenced by G4TwistBoxSide::GetFacets(), G4TwistTrapAlphaSide::GetFacets(), G4TwistTrapFlatSide::GetFacets(), G4TwistTrapParallelSide::GetFacets(), G4TwistTubsFlatSide::GetFacets(), GetFacets(), and G4TwistTubsSide::GetFacets().

◆ GetFacets()

void G4TwistTubsHypeSide::GetFacets ( G4int  m,
G4int  n,
G4double  xyz[][3],
G4int  faces[][4],
G4int  iside 
)
virtual

Implements G4VTwistSurface.

Definition at line 996 of file G4TwistTubsHypeSide.cc.

998{
999 G4double z ; // the two parameters for the surface equation
1000 G4double x,xmin,xmax ;
1001
1002 G4ThreeVector p ; // a point on the surface, given by (z,u)
1003
1004 G4int nnode ;
1005 G4int nface ;
1006
1007 // calculate the (n-1)*(k-1) vertices
1008
1009 for ( G4int i = 0 ; i<n ; ++i )
1010 {
1011 z = fAxisMin[1] + i*(fAxisMax[1]-fAxisMin[1])/(n-1) ;
1012
1013 for ( G4int j = 0 ; j<k ; ++j )
1014 {
1015 nnode = GetNode(i,j,k,n,iside) ;
1016
1017 xmin = GetBoundaryMin(z) ;
1018 xmax = GetBoundaryMax(z) ;
1019
1020 if (fHandedness < 0) // inner hyperbolic surface
1021 {
1022 x = xmin + j*(xmax-xmin)/(k-1) ;
1023 }
1024 else // outer hyperbolic surface
1025 {
1026 x = xmax - j*(xmax-xmin)/(k-1) ;
1027 }
1028
1029 p = SurfacePoint(x,z,true) ; // surface point in global coord.system
1030
1031 xyz[nnode][0] = p.x() ;
1032 xyz[nnode][1] = p.y() ;
1033 xyz[nnode][2] = p.z() ;
1034
1035 if ( i<n-1 && j<k-1 ) // clock wise filling
1036 {
1037 nface = GetFace(i,j,k,n,iside) ;
1038 faces[nface][0] = GetEdgeVisibility(i,j,k,n,0,1)
1039 * ( GetNode(i ,j ,k,n,iside)+1) ;
1040 faces[nface][1] = GetEdgeVisibility(i,j,k,n,1,1)
1041 * ( GetNode(i+1,j ,k,n,iside)+1) ;
1042 faces[nface][2] = GetEdgeVisibility(i,j,k,n,2,1)
1043 * ( GetNode(i+1,j+1,k,n,iside)+1) ;
1044 faces[nface][3] = GetEdgeVisibility(i,j,k,n,3,1)
1045 * ( GetNode(i ,j+1,k,n,iside)+1) ;
1046 }
1047 }
1048 }
1049}
virtual G4double GetBoundaryMin(G4double phi)
virtual G4ThreeVector SurfacePoint(G4double, G4double, G4bool isGlobal=false)
virtual G4double GetBoundaryMax(G4double phi)
G4int GetNode(G4int i, G4int j, G4int m, G4int n, G4int iside)
G4int GetFace(G4int i, G4int j, G4int m, G4int n, G4int iside)
G4int GetEdgeVisibility(G4int i, G4int j, G4int m, G4int n, G4int number, G4int orientation)

References G4VTwistSurface::fAxisMax, G4VTwistSurface::fAxisMin, G4VTwistSurface::fHandedness, GetBoundaryMax(), GetBoundaryMin(), G4VTwistSurface::GetEdgeVisibility(), G4VTwistSurface::GetFace(), G4VTwistSurface::GetNode(), CLHEP::detail::n, SurfacePoint(), CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), and CLHEP::Hep3Vector::z().

◆ GetName()

virtual G4String G4VTwistSurface::GetName ( ) const
inlinevirtualinherited

◆ GetNeighbours() [1/2]

G4VTwistSurface ** G4VTwistSurface::GetNeighbours ( )
inlineprotectedinherited

Definition at line 183 of file G4VTwistSurface.hh.

183{ return fNeighbours; }
G4VTwistSurface * fNeighbours[4]

References G4VTwistSurface::fNeighbours.

Referenced by G4VTwistSurface::DistanceToIn().

◆ GetNeighbours() [2/2]

G4int G4VTwistSurface::GetNeighbours ( G4int  areacode,
G4VTwistSurface surfaces[] 
)
inlineprotectedinherited

◆ GetNode()

G4int G4VTwistSurface::GetNode ( G4int  i,
G4int  j,
G4int  m,
G4int  n,
G4int  iside 
)
inherited

Definition at line 952 of file G4VTwistSurface.cc.

954{
955 // this is the node mapping function
956 // (i,j) -> node number
957 // Depends on the side iside and the used meshing of the surface
958
959 if ( iside == 0 )
960 {
961 // lower endcap is kxk squared.
962 // n = k
963 return i * k + j ;
964 }
965
966 if ( iside == 1 )
967 {
968 // upper endcap is kxk squared. Shift by k*k
969 // n = k
970 return k*k + i*k + j ;
971 }
972
973 else if ( iside == 2 )
974 {
975 // front side.
976 if ( i == 0 ) { return j ; }
977 else if ( i == n-1 ) { return k*k + j ; }
978 else { return 2*k*k + 4*(i-1)*(k-1) + j ; }
979 }
980
981 else if ( iside == 3 )
982 {
983 // right side
984 if ( i == 0 ) { return (j+1)*k - 1 ; }
985 else if ( i == n-1 ) { return k*k + (j+1)*k - 1 ; }
986 else
987 {
988 return 2*k*k + 4*(i-1)*(k-1) + (k-1) + j ;
989 }
990 }
991 else if ( iside == 4 )
992 {
993 // back side
994 if ( i == 0 ) { return k*k - 1 - j ; } // reversed order
995 else if ( i == n-1 ) { return 2*k*k - 1 - j ; } // reversed order
996 else
997 {
998 return 2*k*k + 4*(i-1)*(k-1) + 2*(k-1) + j ; // normal order
999 }
1000 }
1001 else if ( iside == 5 )
1002 {
1003 // left side
1004 if ( i == 0 ) { return k*k - (j+1)*k ; } // reversed order
1005 else if ( i == n-1) { return 2*k*k - (j+1)*k ; } // reverded order
1006 else
1007 {
1008 if ( j == k-1 ) { return 2*k*k + 4*(i-1)*(k-1) ; } // special case
1009 else
1010 {
1011 return 2*k*k + 4*(i-1)*(k-1) + 3*(k-1) + j ; // normal order
1012 }
1013 }
1014 }
1015 else
1016 {
1017 std::ostringstream message;
1018 message << "Not correct side number: "
1019 << GetName() << G4endl
1020 << "iside is " << iside << " but should be "
1021 << "0,1,2,3,4 or 5" << ".";
1022 G4Exception("G4TwistSurface::G4GetNode()", "GeomSolids0002",
1023 FatalException, message);
1024 }
1025 return -1 ; // wrong node
1026}

References FatalException, G4endl, G4Exception(), G4VTwistSurface::GetName(), and CLHEP::detail::n.

Referenced by G4TwistBoxSide::GetFacets(), G4TwistTrapAlphaSide::GetFacets(), G4TwistTrapFlatSide::GetFacets(), G4TwistTrapParallelSide::GetFacets(), G4TwistTubsFlatSide::GetFacets(), GetFacets(), and G4TwistTubsSide::GetFacets().

◆ GetNormal()

G4ThreeVector G4TwistTubsHypeSide::GetNormal ( const G4ThreeVector xx,
G4bool  isGlobal = false 
)
virtual

Implements G4VTwistSurface.

Definition at line 139 of file G4TwistTubsHypeSide.cc.

141{
142 // GetNormal returns a normal vector at a surface (or very close
143 // to surface) point at tmpxx.
144 // If isGlobal=true, it returns the normal in global coordinate.
145
146 G4ThreeVector xx;
147 if (isGlobal)
148 {
149 xx = ComputeLocalPoint(tmpxx);
150 if ((xx - fCurrentNormal.p).mag() < 0.5 * kCarTolerance)
151 {
153 }
154 }
155 else
156 {
157 xx = tmpxx;
158 if (xx == fCurrentNormal.p)
159 {
160 return fCurrentNormal.normal;
161 }
162 }
163
164 fCurrentNormal.p = xx;
165
166 G4ThreeVector normal( xx.x(), xx.y(), -xx.z() * fTan2Stereo);
168 normal = normal.unit();
169
170 if (isGlobal)
171 {
173 }
174 else
175 {
177 }
178 return fCurrentNormal.normal;
179}
G4ThreeVector ComputeGlobalDirection(const G4ThreeVector &lp) const
G4SurfCurNormal fCurrentNormal

References G4VTwistSurface::ComputeGlobalDirection(), G4VTwistSurface::ComputeLocalDirection(), G4VTwistSurface::ComputeLocalPoint(), G4VTwistSurface::fCurrentNormal, G4VTwistSurface::fHandedness, fTan2Stereo, G4VTwistSurface::kCarTolerance, CLHEP::normal(), G4VTwistSurface::G4SurfCurNormal::normal, G4VTwistSurface::G4SurfCurNormal::p, CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), and CLHEP::Hep3Vector::z().

◆ GetRhoAtPZ()

G4double G4TwistTubsHypeSide::GetRhoAtPZ ( const G4ThreeVector p,
G4bool  isglobal = false 
) const
inlinevirtual

Definition at line 149 of file G4TwistTubsHypeSide.hh.

151{
152 // Get Rho at p.z() on Hyperbolic Surface.
153 G4ThreeVector tmpp;
154 if (isglobal) { tmpp = fRot.inverse()*p - fTrans; }
155 else { tmpp = p; }
156
157 return std::sqrt(fR02 + tmpp.z() * tmpp.z() * fTan2Stereo);
158}
HepRotation inverse() const

References fR02, G4VTwistSurface::fRot, fTan2Stereo, G4VTwistSurface::fTrans, CLHEP::HepRotation::inverse(), and CLHEP::Hep3Vector::z().

Referenced by Inside().

◆ GetSurfaceArea()

G4double G4TwistTubsHypeSide::GetSurfaceArea ( )
inlinevirtual

Implements G4VTwistSurface.

Definition at line 191 of file G4TwistTubsHypeSide.hh.

192{
193 // approximation with tube surface
194
195 return ( fAxisMax[1] - fAxisMin[1] ) * fR0 * fDPhi ;
196}

References G4VTwistSurface::fAxisMax, G4VTwistSurface::fAxisMin, fDPhi, and fR0.

◆ Inside()

EInside G4TwistTubsHypeSide::Inside ( const G4ThreeVector gp)
virtual

Definition at line 184 of file G4TwistTubsHypeSide.cc.

185{
186 // Inside returns
187 const G4double halftol
189
190 if (fInside.gp == gp)
191 {
192 return fInside.inside;
193 }
194 fInside.gp = gp;
195
197
198
199 if (p.mag() < DBL_MIN)
200 {
202 return fInside.inside;
203 }
204
205 G4double rhohype = GetRhoAtPZ(p);
206 G4double distanceToOut = fHandedness * (rhohype - p.getRho());
207 // +ve : inside
208
209 if (distanceToOut < -halftol)
210 {
212 }
213 else
214 {
215 G4int areacode = GetAreaCode(p);
216 if (IsOutside(areacode))
217 {
219 }
220 else if (IsBoundary(areacode))
221 {
223 }
224 else if (IsInside(areacode))
225 {
226 if (distanceToOut <= halftol)
227 {
229 }
230 else
231 {
233 }
234 }
235 else
236 {
237 G4cout << "WARNING - G4TwistTubsHypeSide::Inside()" << G4endl
238 << " Invalid option !" << G4endl
239 << " name, areacode, distanceToOut = "
240 << GetName() << ", " << std::hex << areacode
241 << std::dec << ", " << distanceToOut << G4endl;
242 }
243 }
244
245 return fInside.inside;
246}
virtual G4double GetRhoAtPZ(const G4ThreeVector &p, G4bool isglobal=false) const
G4bool IsBoundary(G4int areacode, G4bool testbitmode=false) const
@ kInside
Definition: geomdefs.hh:70
@ kSurface
Definition: geomdefs.hh:69

References G4VTwistSurface::ComputeLocalPoint(), DBL_MIN, G4VTwistSurface::fHandedness, fInside, G4cout, G4endl, GetAreaCode(), G4GeometryTolerance::GetInstance(), G4VTwistSurface::GetName(), G4GeometryTolerance::GetRadialTolerance(), CLHEP::Hep3Vector::getRho(), GetRhoAtPZ(), G4TwistTubsHypeSide::Insidetype::gp, G4TwistTubsHypeSide::Insidetype::inside, G4VTwistSurface::IsBoundary(), G4VTwistSurface::IsInside(), G4VTwistSurface::IsOutside(), kInside, kOutside, kSurface, and CLHEP::Hep3Vector::mag().

◆ IsAxis0()

G4bool G4VTwistSurface::IsAxis0 ( G4int  areacode) const
inlineinherited

◆ IsAxis1()

G4bool G4VTwistSurface::IsAxis1 ( G4int  areacode) const
inlineinherited

◆ IsBoundary()

G4bool G4VTwistSurface::IsBoundary ( G4int  areacode,
G4bool  testbitmode = false 
) const
inlineinherited

◆ IsCorner()

G4bool G4VTwistSurface::IsCorner ( G4int  areacode,
G4bool  testbitmode = false 
) const
inlineinherited

◆ IsInside()

G4bool G4VTwistSurface::IsInside ( G4int  areacode,
G4bool  testbitmode = false 
) const
inlineinherited

◆ IsOutside()

G4bool G4VTwistSurface::IsOutside ( G4int  areacode) const
inlineinherited

◆ IsSameBoundary()

G4bool G4VTwistSurface::IsSameBoundary ( G4VTwistSurface surface1,
G4int  areacode1,
G4VTwistSurface surface2,
G4int  areacode2 
) const
inherited

Definition at line 616 of file G4VTwistSurface.cc.

618{
619 //
620 // IsSameBoundary
621 //
622 // checking tool whether two boundaries on different surfaces are same or not.
623 //
624
625 G4bool testbitmode = true;
626 G4bool iscorner[2] = {IsCorner(areacode1, testbitmode),
627 IsCorner(areacode2, testbitmode)};
628
629 if (iscorner[0] && iscorner[1])
630 {
631 // on corner
632 G4ThreeVector corner1 =
633 surf1->ComputeGlobalPoint(surf1->GetCorner(areacode1));
634 G4ThreeVector corner2 =
635 surf2->ComputeGlobalPoint(surf2->GetCorner(areacode2));
636
637 if ((corner1 - corner2).mag() < kCarTolerance) { return true; }
638 else { return false; }
639 }
640 else if ((IsBoundary(areacode1, testbitmode) && (!iscorner[0])) &&
641 (IsBoundary(areacode2, testbitmode) && (!iscorner[1])))
642 {
643 // on boundary
644 G4ThreeVector d1, d2, ld1, ld2;
645 G4ThreeVector x01, x02, lx01, lx02;
646 G4int type1, type2;
647 surf1->GetBoundaryParameters(areacode1, ld1, lx01, type1);
648 surf2->GetBoundaryParameters(areacode2, ld2, lx02, type2);
649
650 x01 = surf1->ComputeGlobalPoint(lx01);
651 x02 = surf2->ComputeGlobalPoint(lx02);
652 d1 = surf1->ComputeGlobalDirection(ld1);
653 d2 = surf2->ComputeGlobalDirection(ld2);
654
655 if ((x01 - x02).mag() < kCarTolerance &&
656 (d1 - d2).mag() < kCarTolerance) { return true; }
657 else { return false; }
658 }
659 else
660 {
661 return false;
662 }
663}
static const G4double d1
static const G4double d2
G4bool IsCorner(G4int areacode, G4bool testbitmode=false) const

References G4VTwistSurface::ComputeGlobalDirection(), G4VTwistSurface::ComputeGlobalPoint(), d1, d2, G4VTwistSurface::GetBoundaryParameters(), G4VTwistSurface::GetCorner(), G4VTwistSurface::IsBoundary(), G4VTwistSurface::IsCorner(), and G4VTwistSurface::kCarTolerance.

Referenced by G4VTwistSurface::DistanceToIn().

◆ IsValidNorm()

G4bool G4VTwistSurface::IsValidNorm ( ) const
inlineinherited

◆ SetAxis()

void G4VTwistSurface::SetAxis ( G4int  i,
const EAxis  axis 
)
inlineinherited

Definition at line 156 of file G4VTwistSurface.hh.

156{ fAxis[i] = axis; }

References G4VTwistSurface::fAxis.

◆ SetBoundaries()

void G4TwistTubsHypeSide::SetBoundaries ( )
privatevirtual

Implements G4VTwistSurface.

Definition at line 949 of file G4TwistTubsHypeSide.cc.

950{
951 // Set direction-unit vector of phi-boundary-lines in local coodinate.
952 // sAxis0 must be kPhi.
953 // This fanction set lower phi-boundary and upper phi-boundary.
954
955 if (fAxis[0] == kPhi && fAxis[1] == kZAxis)
956 {
957 G4ThreeVector direction;
958 // sAxis0 & sAxisMin
960 direction = direction.unit();
961 SetBoundary(sAxis0 & (sAxisPhi | sAxisMin), direction,
963
964 // sAxis0 & sAxisMax
966 direction = direction.unit();
967 SetBoundary(sAxis0 & (sAxisPhi | sAxisMax), direction,
969
970 // sAxis1 & sAxisMin
972 direction = direction.unit();
973 SetBoundary(sAxis1 & (sAxisZ | sAxisMin), direction,
975
976 // sAxis1 & sAxisMax
978 direction = direction.unit();
979 SetBoundary(sAxis1 & (sAxisZ | sAxisMax), direction,
981 }
982 else
983 {
984 std::ostringstream message;
985 message << "Feature NOT implemented !" << G4endl
986 << " fAxis[0] = " << fAxis[0] << G4endl
987 << " fAxis[1] = " << fAxis[1];
988 G4Exception("G4TwistTubsHypeSide::SetBoundaries()",
989 "GeomSolids0001", FatalException, message);
990 }
991}
Hep3Vector unit() const
virtual void SetBoundary(const G4int &axiscode, const G4ThreeVector &direction, const G4ThreeVector &x0, const G4int &boundarytype)

References FatalException, G4VTwistSurface::fAxis, G4endl, G4Exception(), G4VTwistSurface::GetCorner(), kPhi, kZAxis, G4VTwistSurface::sAxis0, G4VTwistSurface::sAxis1, G4VTwistSurface::sAxisMax, G4VTwistSurface::sAxisMin, G4VTwistSurface::sAxisPhi, G4VTwistSurface::sAxisZ, G4VTwistSurface::sC0Max1Max, G4VTwistSurface::sC0Max1Min, G4VTwistSurface::sC0Min1Max, G4VTwistSurface::sC0Min1Min, G4VTwistSurface::SetBoundary(), and CLHEP::Hep3Vector::unit().

Referenced by G4TwistTubsHypeSide().

◆ SetBoundary()

void G4VTwistSurface::SetBoundary ( const G4int axiscode,
const G4ThreeVector direction,
const G4ThreeVector x0,
const G4int boundarytype 
)
protectedvirtualinherited

Definition at line 863 of file G4VTwistSurface.cc.

867{
868 G4int code = (~sAxisMask) & axiscode;
869 if ((code == (sAxis0 & sAxisMin)) ||
870 (code == (sAxis0 & sAxisMax)) ||
871 (code == (sAxis1 & sAxisMin)) ||
872 (code == (sAxis1 & sAxisMax)))
873 {
874 G4bool done = false;
875 for (auto i=0; i<4; ++i)
876 {
877 if (fBoundaries[i].IsEmpty())
878 {
879 fBoundaries[i].SetFields(axiscode, direction,
880 x0, boundarytype);
881 done = true;
882 break;
883 }
884 }
885
886 if (!done)
887 {
888 G4Exception("G4VTwistSurface::SetBoundary()", "GeomSolids0003",
889 FatalException, "Number of boundary exceeding 4!");
890 }
891 }
892 else
893 {
894 std::ostringstream message;
895 message << "Invalid axis-code." << G4endl
896 << " axiscode = "
897 << std::hex << axiscode << std::dec;
898 G4Exception("G4VTwistSurface::SetBoundary()", "GeomSolids0003",
899 FatalException, message);
900 }
901}
void SetFields(const G4int &areacode, const G4ThreeVector &d, const G4ThreeVector &x0, const G4int &boundarytype)
Definition: inftrees.h:24

References FatalException, G4VTwistSurface::fBoundaries, G4endl, G4Exception(), G4VTwistSurface::sAxis0, G4VTwistSurface::sAxis1, G4VTwistSurface::sAxisMax, G4VTwistSurface::sAxisMin, and G4VTwistSurface::Boundary::SetFields().

Referenced by G4TwistBoxSide::SetBoundaries(), G4TwistTrapAlphaSide::SetBoundaries(), G4TwistTrapFlatSide::SetBoundaries(), G4TwistTrapParallelSide::SetBoundaries(), G4TwistTubsFlatSide::SetBoundaries(), SetBoundaries(), and G4TwistTubsSide::SetBoundaries().

◆ SetCorner()

void G4VTwistSurface::SetCorner ( G4int  areacode,
G4double  x,
G4double  y,
G4double  z 
)
protectedinherited

Definition at line 757 of file G4VTwistSurface.cc.

759{
760 if ((areacode & sCorner) != sCorner)
761 {
762 std::ostringstream message;
763 message << "Area code must represents corner." << G4endl
764 << " areacode " << areacode;
765 G4Exception("G4VTwistSurface::SetCorner()", "GeomSolids0002",
766 FatalException, message);
767 }
768
769 if ((areacode & sC0Min1Min) == sC0Min1Min) {
770 fCorners[0].set(x, y, z);
771 } else if ((areacode & sC0Max1Min) == sC0Max1Min) {
772 fCorners[1].set(x, y, z);
773 } else if ((areacode & sC0Max1Max) == sC0Max1Max) {
774 fCorners[2].set(x, y, z);
775 } else if ((areacode & sC0Min1Max) == sC0Min1Max) {
776 fCorners[3].set(x, y, z);
777 }
778}
G4ThreeVector fCorners[4]

References FatalException, G4VTwistSurface::fCorners, G4endl, G4Exception(), G4VTwistSurface::sC0Max1Max, G4VTwistSurface::sC0Max1Min, G4VTwistSurface::sC0Min1Max, G4VTwistSurface::sC0Min1Min, G4VTwistSurface::sCorner, and CLHEP::Hep3Vector::set().

Referenced by G4TwistBoxSide::SetCorners(), G4TwistTrapAlphaSide::SetCorners(), G4TwistTrapFlatSide::SetCorners(), G4TwistTrapParallelSide::SetCorners(), G4TwistTubsFlatSide::SetCorners(), G4TwistTubsSide::SetCorners(), and SetCorners().

◆ SetCorners() [1/2]

void G4TwistTubsHypeSide::SetCorners ( )
privatevirtual

Implements G4VTwistSurface.

Definition at line 939 of file G4TwistTubsHypeSide.cc.

940{
941 G4Exception("G4TwistTubsHypeSide::SetCorners()",
942 "GeomSolids0001", FatalException,
943 "Method NOT implemented !");
944}

References FatalException, and G4Exception().

Referenced by G4TwistTubsHypeSide().

◆ SetCorners() [2/2]

void G4TwistTubsHypeSide::SetCorners ( G4double  EndInnerRadius[2],
G4double  EndOuterRadius[2],
G4double  DPhi,
G4double  EndPhi[2],
G4double  EndZ[2] 
)
privatevirtual

Definition at line 877 of file G4TwistTubsHypeSide.cc.

882{
883 // Set Corner points in local coodinate.
884
885 if (fAxis[0] == kPhi && fAxis[1] == kZAxis) {
886
887 G4double endRad[2];
888 G4double halfdphi = 0.5*DPhi;
889
890 for (auto i=0; i<2; ++i) // i=0,1 : -ve z, +ve z
891 {
892 endRad[i] = (fHandedness == 1 ? EndOuterRadius[i] : EndInnerRadius[i]);
893 }
894
895 G4int zmin = 0 ; // at -ve z
896 G4int zmax = 1 ; // at +ve z
897
898 G4double x, y, z;
899
900 // corner of Axis0min and Axis1min
901 x = endRad[zmin]*std::cos(endPhi[zmin] - halfdphi);
902 y = endRad[zmin]*std::sin(endPhi[zmin] - halfdphi);
903 z = endZ[zmin];
904 SetCorner(sC0Min1Min, x, y, z);
905
906 // corner of Axis0max and Axis1min
907 x = endRad[zmin]*std::cos(endPhi[zmin] + halfdphi);
908 y = endRad[zmin]*std::sin(endPhi[zmin] + halfdphi);
909 z = endZ[zmin];
910 SetCorner(sC0Max1Min, x, y, z);
911
912 // corner of Axis0max and Axis1max
913 x = endRad[zmax]*std::cos(endPhi[zmax] + halfdphi);
914 y = endRad[zmax]*std::sin(endPhi[zmax] + halfdphi);
915 z = endZ[zmax];
916 SetCorner(sC0Max1Max, x, y, z);
917
918 // corner of Axis0min and Axis1max
919 x = endRad[zmax]*std::cos(endPhi[zmax] - halfdphi);
920 y = endRad[zmax]*std::sin(endPhi[zmax] - halfdphi);
921 z = endZ[zmax];
922 SetCorner(sC0Min1Max, x, y, z);
923
924 }
925 else
926 {
927 std::ostringstream message;
928 message << "Feature NOT implemented !" << G4endl
929 << " fAxis[0] = " << fAxis[0] << G4endl
930 << " fAxis[1] = " << fAxis[1];
931 G4Exception("G4TwistTubsHypeSide::SetCorners()",
932 "GeomSolids0001", FatalException, message);
933 }
934}
void SetCorner(G4int areacode, G4double x, G4double y, G4double z)

References FatalException, G4VTwistSurface::fAxis, G4VTwistSurface::fHandedness, G4endl, G4Exception(), kPhi, kZAxis, G4VTwistSurface::sC0Max1Max, G4VTwistSurface::sC0Max1Min, G4VTwistSurface::sC0Min1Max, G4VTwistSurface::sC0Min1Min, and G4VTwistSurface::SetCorner().

◆ SetNeighbours()

void G4VTwistSurface::SetNeighbours ( G4VTwistSurface ax0min,
G4VTwistSurface ax1min,
G4VTwistSurface ax0max,
G4VTwistSurface ax1max 
)
inlineinherited

◆ SurfacePoint()

G4ThreeVector G4TwistTubsHypeSide::SurfacePoint ( G4double  phi,
G4double  z,
G4bool  isGlobal = false 
)
inlinevirtual

Implements G4VTwistSurface.

Definition at line 161 of file G4TwistTubsHypeSide.hh.

163{
164 G4double rho = std::sqrt(fR02 + z * z * fTan2Stereo) ;
165
166 G4ThreeVector SurfPoint (rho*std::cos(phi), rho*std::sin(phi), z) ;
167
168 if (isGlobal) { return (fRot * SurfPoint + fTrans); }
169 return SurfPoint;
170}

References fR02, G4VTwistSurface::fRot, fTan2Stereo, and G4VTwistSurface::fTrans.

Referenced by GetFacets().

Field Documentation

◆ fAmIOnLeftSide

G4SurfSideQuery G4VTwistSurface::fAmIOnLeftSide
privateinherited

◆ fAxis

EAxis G4VTwistSurface::fAxis[2]
protectedinherited

◆ fAxisMax

G4double G4VTwistSurface::fAxisMax[2]
protectedinherited

◆ fAxisMin

G4double G4VTwistSurface::fAxisMin[2]
protectedinherited

◆ fBoundaries

Boundary G4VTwistSurface::fBoundaries[4]
privateinherited

◆ fCorners

G4ThreeVector G4VTwistSurface::fCorners[4]
privateinherited

◆ fCurrentNormal

G4SurfCurNormal G4VTwistSurface::fCurrentNormal
protectedinherited

◆ fCurStat

CurrentStatus G4VTwistSurface::fCurStat
protectedinherited

◆ fCurStatWithV

CurrentStatus G4VTwistSurface::fCurStatWithV
protectedinherited

◆ fDPhi

G4double G4TwistTubsHypeSide::fDPhi
private

Definition at line 133 of file G4TwistTubsHypeSide.hh.

Referenced by G4TwistTubsHypeSide(), and GetSurfaceArea().

◆ fHandedness

G4int G4VTwistSurface::fHandedness
protectedinherited

◆ fInside

Insidetype G4TwistTubsHypeSide::fInside
private

Definition at line 141 of file G4TwistTubsHypeSide.hh.

Referenced by G4TwistTubsHypeSide(), and Inside().

◆ fIsValidNorm

G4bool G4VTwistSurface::fIsValidNorm
protectedinherited

◆ fKappa

G4double G4TwistTubsHypeSide::fKappa
private

Definition at line 128 of file G4TwistTubsHypeSide.hh.

Referenced by G4TwistTubsHypeSide().

◆ fName

G4String G4VTwistSurface::fName
privateinherited

◆ fNeighbours

G4VTwistSurface* G4VTwistSurface::fNeighbours[4]
privateinherited

◆ fR0

G4double G4TwistTubsHypeSide::fR0
private

Definition at line 131 of file G4TwistTubsHypeSide.hh.

Referenced by DistanceToSurface(), G4TwistTubsHypeSide(), and GetSurfaceArea().

◆ fR02

G4double G4TwistTubsHypeSide::fR02
private

◆ fRot

G4RotationMatrix G4VTwistSurface::fRot
protectedinherited

◆ fTan2Stereo

G4double G4TwistTubsHypeSide::fTan2Stereo
private

◆ fTanStereo

G4double G4TwistTubsHypeSide::fTanStereo
private

Definition at line 129 of file G4TwistTubsHypeSide.hh.

Referenced by DistanceToSurface(), and G4TwistTubsHypeSide().

◆ fTrans

G4ThreeVector G4VTwistSurface::fTrans
protectedinherited

◆ kCarTolerance

G4double G4VTwistSurface::kCarTolerance
protectedinherited

◆ sAreaMask

const G4int G4VTwistSurface::sAreaMask = 0XF0000000
staticinherited

Definition at line 235 of file G4VTwistSurface.hh.

◆ sAxis0

const G4int G4VTwistSurface::sAxis0 = 0x0000FF00
staticinherited

◆ sAxis1

const G4int G4VTwistSurface::sAxis1 = 0x000000FF
staticinherited

◆ sAxisMask

const G4int G4VTwistSurface::sAxisMask = 0x0000FCFC
staticinherited

Definition at line 234 of file G4VTwistSurface.hh.

Referenced by G4VTwistSurface::GetBoundaryAxis().

◆ sAxisMax

const G4int G4VTwistSurface::sAxisMax = 0x00000202
staticinherited

◆ sAxisMin

const G4int G4VTwistSurface::sAxisMin = 0x00000101
staticinherited

◆ sAxisPhi

const G4int G4VTwistSurface::sAxisPhi = 0x00001414
staticinherited

◆ sAxisRho

const G4int G4VTwistSurface::sAxisRho = 0x00001010
staticinherited

◆ sAxisX

const G4int G4VTwistSurface::sAxisX = 0x00000404
staticinherited

◆ sAxisY

const G4int G4VTwistSurface::sAxisY = 0x00000808
staticinherited

◆ sAxisZ

const G4int G4VTwistSurface::sAxisZ = 0x00000C0C
staticinherited

◆ sBoundary

const G4int G4VTwistSurface::sBoundary = 0x20000000
staticinherited

◆ sC0Max1Max

const G4int G4VTwistSurface::sC0Max1Max = 0x40000202
staticinherited

◆ sC0Max1Min

const G4int G4VTwistSurface::sC0Max1Min = 0x40000201
staticinherited

◆ sC0Min1Max

const G4int G4VTwistSurface::sC0Min1Max = 0x40000102
staticinherited

◆ sC0Min1Min

const G4int G4VTwistSurface::sC0Min1Min = 0x40000101
staticinherited

◆ sCorner

const G4int G4VTwistSurface::sCorner = 0x40000000
staticinherited

◆ sInside

const G4int G4VTwistSurface::sInside = 0x10000000
staticinherited

◆ sOutside

const G4int G4VTwistSurface::sOutside = 0x00000000
staticinherited

◆ sSizeMask

const G4int G4VTwistSurface::sSizeMask = 0x00000303
staticinherited

The documentation for this class was generated from the following files: