84 :
G4VSolid(pname), fRebuildPolyhedron(false), fpPolyhedron(0),
85 fLowerEndcap(0), fUpperEndcap(0), fSide0(0),
86 fSide90(0), fSide180(0), fSide270(0),
109 fDx = ( fDxUp > fDxDown ? fDxUp : fDxDown ) ;
120 message <<
"Not planar surface in untwisted Trapezoid: "
122 <<
"fDy2 is " <<
fDy2 <<
" but should be "
124 G4Exception(
"G4VTwistedFaceted::G4VTwistedFaceted()",
"GeomSolids0002",
140 message <<
"Not planar surface in untwisted Trapezoid: "
142 <<
"One endcap is rectangular, the other is a trapezoid." <<
G4endl
143 <<
"For planarity reasons they have to be rectangles or trapezoids "
145 G4Exception(
"G4VTwistedFaceted::G4VTwistedFaceted()",
"GeomSolids0002",
176 && ( std::fabs(
fPhiTwist) > 2*kAngTolerance )
179 && ( fTheta < pi/2 && fTheta >= 0 ) )
183 message <<
"Invalid dimensions. Too small, or twist angle too big: "
204 :
G4VSolid(a), fRebuildPolyhedron(false), fpPolyhedron(0),
205 fTheta(0.), fPhi(0.), fDy1(0.),
206 fDx1(0.), fDx2(0.), fDy2(0.), fDx3(0.), fDx4(0.),
207 fDz(0.), fDx(0.), fDy(0.), fAlph(0.),
208 fTAlph(0.), fdeltaX(0.), fdeltaY(0.), fPhiTwist(0.),
209 fLowerEndcap(0), fUpperEndcap(0), fSide0(0), fSide90(0), fSide180(0),
210 fSide270(0), fCubicVolume(0.), fSurfaceArea(0.)
235 :
G4VSolid(rhs), fRebuildPolyhedron(false), fpPolyhedron(0),
236 fTheta(rhs.fTheta), fPhi(rhs.fPhi),
237 fDy1(rhs.fDy1), fDx1(rhs.fDx1), fDx2(rhs.fDx2), fDy2(rhs.fDy2),
238 fDx3(rhs.fDx3), fDx4(rhs.fDx4), fDz(rhs.fDz), fDx(rhs.fDx), fDy(rhs.fDy),
239 fAlph(rhs.fAlph), fTAlph(rhs.fTAlph), fdeltaX(rhs.fdeltaX),
240 fdeltaY(rhs.fdeltaY), fPhiTwist(rhs.fPhiTwist), fLowerEndcap(0),
241 fUpperEndcap(0), fSide0(0), fSide90(0), fSide180(0), fSide270(0),
242 fCubicVolume(rhs.fCubicVolume), fSurfaceArea(rhs.fSurfaceArea),
243 fLastInside(rhs.fLastInside), fLastNormal(rhs.fLastNormal),
244 fLastDistanceToIn(rhs.fLastDistanceToIn),
245 fLastDistanceToOut(rhs.fLastDistanceToOut),
246 fLastDistanceToInWithV(rhs.fLastDistanceToInWithV),
247 fLastDistanceToOutWithV(rhs.fLastDistanceToOutWithV)
260 if (
this == &rhs) {
return *
this; }
296 G4Exception(
"G4VTwistedFaceted::ComputeDimensions()",
298 "G4VTwistedFaceted does not support Parameterisation.");
309 pMin.
set(-maxRad,-maxRad,-
fDz);
310 pMax.
set( maxRad, maxRad,
fDz);
348 tmpp->
set(p.
x(), p.
y(), p.
z());
361 G4double posx = px * cphi - py * sphi ;
362 G4double posy = px * sphi + py * cphi ;
453 tmpp->
set(p.
x(), p.
y(), p.
z());
473 if (tmpdistance < distance)
475 distance = tmpdistance;
481 tmpsurface[0] = surfaces[besti];
482 *tmpnormal = tmpsurface[0]->
GetNormal(bestxx,
true);
517 tmpp->
set(p.
x(), p.
y(), p.
z());
518 tmpv->
set(v.
x(), v.
y(), v.
z());
563 for (i=0; i < 6 ; i++)
570 G4cout <<
"Solid DistanceToIn : distance = " << tmpdistance <<
G4endl ;
573 if (tmpdistance < distance)
575 distance = tmpdistance;
614 tmpp->
set(p.
x(), p.
y(), p.
z());
658 if (tmpdistance < distance)
660 distance = tmpdistance;
670 G4Exception(
"G4VTwistedFaceted::DistanceToIn(p)",
"GeomSolids0003",
711 tmpp->
set(p.
x(), p.
y(), p.
z());
712 tmpv->
set(v.
x(), v.
y(), v.
z());
735 *norm = (blockedsurface->
GetNormal(p,
true));
763 for (i=0; i< 6 ; i++) {
765 if (tmpdistance < distance)
767 distance = tmpdistance;
777 *norm = (surfaces[besti]->
GetNormal(p,
true));
812 tmpp->
set(p.
x(), p.
y(), p.
z());
834 G4cout.precision(oldprc) ;
835 G4Exception(
"G4VTwistedFaceted::DistanceToOut(p)",
"GeomSolids1002",
870 if (tmpdistance < distance)
872 distance = tmpdistance;
884 G4Exception(
"G4VTwistedFaceted::DistanceToOut(p)",
"GeomSolids0003",
902 G4int oldprc = os.precision(16);
903 os <<
"-----------------------------------------------------------\n"
904 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n"
905 <<
" ===================================================\n"
906 <<
" Solid type: G4VTwistedFaceted\n"
912 <<
" Half length along y (lower endcap) = " <<
fDy1/
cm <<
" cm"
914 <<
" Half length along x (lower endcap, bottom) = " <<
fDx1/
cm <<
" cm"
916 <<
" Half length along x (lower endcap, top) = " <<
fDx2/
cm <<
" cm"
918 <<
" Half length along y (upper endcap) = " <<
fDy2/
cm <<
" cm"
920 <<
" Half length along x (upper endcap, bottom) = " <<
fDx3/
cm <<
" cm"
922 <<
" Half length along x (upper endcap, top) = " <<
fDx4/
cm <<
" cm"
924 <<
"-----------------------------------------------------------\n";
925 os.precision(oldprc);
1007 return G4String(
"G4VTwistedFaceted");
1042 if ( z ==
fDz ) z -= 0.1*
fDz ;
1043 if ( z == -
fDz ) z += 0.1*
fDz ;
1094 else if( (chose >= a1) && (chose < a1 + a2 ) )
1105 else if( (chose >= a1 + a2 ) && (chose < a1 + a2 + a3 ) )
1115 else if( (chose >= a1 + a2 + a3 ) && (chose < a1 + a2 + a3 + a4 ) )
1125 else if( (chose >= a1 + a2 + a3 + a4 ) && (chose < a1 + a2 + a3 + a4 + a5 ) )
1159 const G4int nnodes = 4*(k-1)*(n-2) + 2*k*k ;
1160 const G4int nfaces = 4*(k-1)*(n-1) + 2*(k-1)*(k-1) ;
1164 typedef G4int G4int4[4];
1165 G4double3* xyz =
new G4double3[nnodes];
1166 G4int4* faces =
new G4int4[nfaces] ;
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimits, const G4Transform3D &pTransform3D, G4double &pMin, G4double &pMax) const
void set(double x, double y, double z)
G4int createPolyhedron(G4int Nnodes, G4int Nfaces, const G4double xyz[][3], const G4int faces[][4])
virtual G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
CLHEP::Hep3Vector G4ThreeVector
std::vector< ExP01TrackerHit * > a
virtual G4VisExtent GetExtent() const
virtual void AddSolid(const G4Box &)=0
static const G4double kInfinity
G4ThreeVector GetPointInSolid(G4double z) const
G4double Xcoef(G4double u, G4double phi, G4double ftg) const
G4VTwistSurface * fUpperEndcap
static constexpr double mm
G4VTwistSurface ** surface
virtual G4Polyhedron * CreatePolyhedron() const
void message(RunManager *runmanager)
virtual G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const
G4Polyhedron * fpPolyhedron
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
G4VTwistSurface * fLowerEndcap
G4double GetAngularTolerance() const
static double normal(HepRandomEngine *eptr)
G4VTwistSurface * fSide180
LastValue fLastDistanceToIn
G4bool IsValidNorm() const
LastValue fLastDistanceToOut
virtual G4double GetSurfaceArea()=0
G4VTwistSurface * fSide270
virtual G4ThreeVector GetNormal(const G4ThreeVector &xx, G4bool isGlobal)=0
G4double GetValueB(G4double phi) const
G4VTwistSurface * fSide90
virtual ~G4VTwistedFaceted()
G4VTwistedFaceted & operator=(const G4VTwistedFaceted &rhs)
G4ThreeVector GetPointOnSurface() const
virtual G4GeometryType GetEntityType() const
G4VSolid & operator=(const G4VSolid &rhs)
LastValueWithDoubleVector fLastDistanceToInWithV
#define G4MUTEX_INITIALIZER
virtual void DescribeYourselfTo(G4VGraphicsScene &scene) const
virtual G4double DistanceTo(const G4ThreeVector &gp, G4ThreeVector &gxx)
static constexpr double deg
static constexpr double twopi
virtual G4double DistanceToIn(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
virtual std::ostream & StreamInfo(std::ostream &os) const
virtual G4double GetBoundaryMax(G4double)=0
virtual G4double GetBoundaryMin(G4double)=0
ThreeVector shoot(const G4int Ap, const G4int Af)
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcnorm=false, G4bool *validnorm=0, G4ThreeVector *n=0) const
static G4int GetNumberOfRotationSteps()
virtual void BoundingLimits(G4ThreeVector &pMin, G4ThreeVector &pMax) const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
void SetNeighbours(G4VTwistSurface *axis0min, G4VTwistSurface *axis1min, G4VTwistSurface *axis0max, G4VTwistSurface *axis1max)
G4int GetNumberOfRotationStepsAtTimeOfCreation() const
virtual void ComputeDimensions(G4VPVParameterisation *, const G4int, const G4VPhysicalVolume *)
static constexpr double degree
LastValueWithDoubleVector fLastDistanceToOutWithV
static constexpr double cm
G4GLOB_DLL std::ostream G4cout
virtual G4Polyhedron * GetPolyhedron() const
virtual EInside Inside(const G4ThreeVector &p) const
virtual G4ThreeVector SurfacePoint(G4double, G4double, G4bool isGlobal=false)=0
static G4GeometryTolerance * GetInstance()
static constexpr double pi
G4VTwistedFaceted(const G4String &pname, G4double PhiTwist, G4double pDz, G4double pTheta, G4double pPhi, G4double pDy1, G4double pDx1, G4double pDx2, G4double pDy2, G4double pDx3, G4double pDx4, G4double pAlph)
virtual G4double DistanceToOut(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
G4bool fRebuildPolyhedron
virtual void GetFacets(G4int m, G4int n, G4double xyz[][3], G4int faces[][4], G4int iside)=0