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 ) ;
119 std::ostringstream message;
120 message <<
"Not planar surface in untwisted Trapezoid: "
122 <<
"fDy2 is " <<
fDy2 <<
" but should be "
124 G4Exception(
"G4VTwistedFaceted::G4VTwistedFaceted()",
"GeomSolids0002",
139 std::ostringstream message;
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 ) )
182 std::ostringstream message;
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 ) )
1158 const G4int nnodes = 4*(k-1)*(n-2) + 2*k*k ;
1159 const G4int nfaces = 4*(k-1)*(n-1) + 2*(k-1)*(k-1) ;
1163 typedef G4int G4int4[4];
1164 G4double3* xyz =
new G4double3[nnodes];
1165 G4int4* faces =
new G4int4[nfaces] ;
1174 ph->createPolyhedron(nnodes,nfaces,xyz,faces);
LastValue fLastDistanceToOut
ThreeVector shoot(const G4int Ap, const G4int Af)
virtual void ComputeDimensions(G4VPVParameterisation *, const G4int, const G4VPhysicalVolume *)
static constexpr double mm
G4VTwistSurface * fSide90
static const G4double kInfinity
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)
G4VTwistSurface * fUpperEndcap
CLHEP::Hep3Vector G4ThreeVector
LastValueWithDoubleVector fLastDistanceToOutWithV
virtual G4ThreeVector GetNormal(const G4ThreeVector &xx, G4bool isGlobal)=0
std::vector< ExP01TrackerHit * > a
G4bool fRebuildPolyhedron
virtual G4GeometryType GetEntityType() const
G4ThreeVector GetPointOnSurface() const
G4ThreeVector GetPointInSolid(G4double z) const
virtual G4Polyhedron * CreatePolyhedron() const
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
virtual void Extent(G4ThreeVector &pMin, G4ThreeVector &pMax) const
G4VTwistedFaceted & operator=(const G4VTwistedFaceted &rhs)
virtual void AddSolid(const G4Box &)=0
virtual G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
#define G4MUTEX_INITIALIZER
G4bool IsValidNorm() const
G4VTwistSurface * fSide180
LastValue fLastDistanceToIn
virtual G4double DistanceToIn(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
static constexpr double twopi
G4double Xcoef(G4double u, G4double phi, G4double ftg) const
static double normal(HepRandomEngine *eptr)
virtual G4double GetSurfaceArea()=0
G4VTwistSurface * fSide270
G4GLOB_DLL std::ostream G4cout
virtual G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const
void SetNeighbours(G4VTwistSurface *axis0min, G4VTwistSurface *axis1min, G4VTwistSurface *axis0max, G4VTwistSurface *axis1max)
virtual G4double DistanceTo(const G4ThreeVector &gp, G4ThreeVector &gxx)
static constexpr double degree
virtual G4double DistanceToOut(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
virtual G4ThreeVector SurfacePoint(G4double, G4double, G4bool isGlobal=false)=0
static constexpr double cm
virtual ~G4VTwistedFaceted()
G4double GetValueB(G4double phi) const
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimits, const G4Transform3D &pTransform3D, G4double &pMin, G4double &pMax) const
G4VTwistSurface * fLowerEndcap
LastValueWithDoubleVector fLastDistanceToInWithV
virtual G4double GetBoundaryMax(G4double)=0
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
virtual void GetFacets(G4int m, G4int n, G4double xyz[][3], G4int faces[][4], G4int iside)=0
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcnorm=false, G4bool *validnorm=0, G4ThreeVector *n=0) const
virtual G4double GetBoundaryMin(G4double)=0
virtual G4Polyhedron * GetPolyhedron() const
G4VTwistSurface ** surface
virtual G4VisExtent GetExtent() const
virtual EInside Inside(const G4ThreeVector &p) const
virtual void DescribeYourselfTo(G4VGraphicsScene &scene) const
G4VSolid & operator=(const G4VSolid &rhs)
G4int GetNumberOfRotationStepsAtTimeOfCreation() const
static constexpr double pi
static constexpr double deg
virtual std::ostream & StreamInfo(std::ostream &os) const
G4Polyhedron * fpPolyhedron
G4double GetAngularTolerance() const
static G4GeometryTolerance * GetInstance()