79 fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0),
80 fFormerTwisted(0), fInnerHype(0), fOuterHype(0),
81 fCubicVolume(0.), fSurfaceArea(0.),
82 fRebuildPolyhedron(false), fpPolyhedron(0)
86 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
90 G4double sinhalftwist = std::sin(0.5 * twistedangle);
92 G4double endinnerradX = endinnerrad * sinhalftwist;
93 G4double innerrad = std::sqrt( endinnerrad * endinnerrad
94 - endinnerradX * endinnerradX );
96 G4double endouterradX = endouterrad * sinhalftwist;
97 G4double outerrad = std::sqrt( endouterrad * endouterrad
98 - endouterradX * endouterradX );
101 SetFields(twistedangle, innerrad, outerrad, -halfzlen, halfzlen);
113 fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0),
114 fFormerTwisted(0), fInnerHype(0), fOuterHype(0),
115 fCubicVolume(0.), fSurfaceArea(0.),
116 fRebuildPolyhedron(false), fpPolyhedron(0)
121 std::ostringstream message;
122 message <<
"Invalid number of segments." <<
G4endl
123 <<
" nseg = " << nseg;
124 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
129 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
133 G4double sinhalftwist = std::sin(0.5 * twistedangle);
135 G4double endinnerradX = endinnerrad * sinhalftwist;
136 G4double innerrad = std::sqrt( endinnerrad * endinnerrad
137 - endinnerradX * endinnerradX );
139 G4double endouterradX = endouterrad * sinhalftwist;
140 G4double outerrad = std::sqrt( endouterrad * endouterrad
141 - endouterradX * endouterradX );
144 fDPhi = totphi / nseg;
145 SetFields(twistedangle, innerrad, outerrad, -halfzlen, halfzlen);
157 fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0),
158 fFormerTwisted(0), fInnerHype(0), fOuterHype(0),
159 fCubicVolume(0.), fSurfaceArea(0.),
160 fRebuildPolyhedron(false), fpPolyhedron(0)
164 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
168 SetFields(twistedangle, innerrad, outerrad, negativeEndz, positiveEndz);
181 fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0),
182 fFormerTwisted(0), fInnerHype(0), fOuterHype(0),
183 fCubicVolume(0.), fSurfaceArea(0.),
184 fRebuildPolyhedron(false), fpPolyhedron(0)
188 std::ostringstream message;
189 message <<
"Invalid number of segments." <<
G4endl
190 <<
" nseg = " << nseg;
191 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
196 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
200 fDPhi = totphi / nseg;
201 SetFields(twistedangle, innerrad, outerrad, negativeEndz, positiveEndz);
209 :
G4VSolid(a), fPhiTwist(0.), fInnerRadius(0.), fOuterRadius(0.), fDPhi(0.),
210 fZHalfLength(0.), fInnerStereo(0.), fOuterStereo(0.), fTanInnerStereo(0.),
211 fTanOuterStereo(0.), fKappa(0.), fInnerRadius2(0.), fOuterRadius2(0.),
212 fTanInnerStereo2(0.), fTanOuterStereo2(0.), fLowerEndcap(0), fUpperEndcap(0),
213 fLatterTwisted(0), fFormerTwisted(0), fInnerHype(0), fOuterHype(0),
214 fCubicVolume(0.), fSurfaceArea(0.),
215 fRebuildPolyhedron(false), fpPolyhedron(0)
237 :
G4VSolid(rhs), fPhiTwist(rhs.fPhiTwist),
238 fInnerRadius(rhs.fInnerRadius), fOuterRadius(rhs.fOuterRadius),
239 fDPhi(rhs.fDPhi), fZHalfLength(rhs.fZHalfLength),
240 fInnerStereo(rhs.fInnerStereo), fOuterStereo(rhs.fOuterStereo),
241 fTanInnerStereo(rhs.fTanInnerStereo), fTanOuterStereo(rhs.fTanOuterStereo),
242 fKappa(rhs.fKappa), fInnerRadius2(rhs.fInnerRadius2),
243 fOuterRadius2(rhs.fOuterRadius2), fTanInnerStereo2(rhs.fTanInnerStereo2),
244 fTanOuterStereo2(rhs.fTanOuterStereo2),
245 fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0), fFormerTwisted(0),
246 fInnerHype(0), fOuterHype(0),
247 fCubicVolume(rhs.fCubicVolume), fSurfaceArea(rhs.fSurfaceArea),
248 fRebuildPolyhedron(false), fpPolyhedron(0),
249 fLastInside(rhs.fLastInside), fLastNormal(rhs.fLastNormal),
250 fLastDistanceToIn(rhs.fLastDistanceToIn),
251 fLastDistanceToOut(rhs.fLastDistanceToOut),
252 fLastDistanceToInWithV(rhs.fLastDistanceToInWithV),
253 fLastDistanceToOutWithV(rhs.fLastDistanceToOutWithV)
255 for (
size_t i=0; i<2; ++i)
274 if (
this == &rhs) {
return *
this; }
299 for (
size_t i=0; i<2; ++i)
324 "G4TwistedTubs does not support Parameterisation.");
335 pMin.set(-maxEndOuterRad,-maxEndOuterRad,-
fZHalfLength);
336 pMax.set( maxEndOuterRad, maxEndOuterRad,
fZHalfLength);
340 if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
342 std::ostringstream message;
343 message <<
"Bad bounding box (min >= max) for solid: "
345 <<
"\npMin = " << pMin
346 <<
"\npMax = " << pMax;
395 tmpp->set(p.x(), p.y(), p.z());
400 G4double distanceToOut = p.getRho() - innerhyperho;
402 if ((outerhypearea ==
kOutside) || (distanceToOut < -halftol))
412 if (distanceToOut <= halftol)
447 tmpp->set(p.x(), p.y(), p.z());
466 if (tmpdistance < distance)
468 distance = tmpdistance;
474 tmpsurface[0] = surfaces[besti];
475 *tmpnormal = tmpsurface[0]->
GetNormal(bestxx,
true);
509 tmpp->set(p.x(), p.y(), p.z());
510 tmpv->set(v.x(), v.y(), v.z());
560 if (tmpdistance < distance)
562 distance = tmpdistance;
594 tmpp->set(p.x(), p.y(), p.z());
632 if (tmpdistance < distance)
634 distance = tmpdistance;
643 G4Exception(
"G4TwistedTubs::DistanceToIn(p)",
"GeomSolids0003",
682 tmpp->set(p.x(), p.y(), p.z());
683 tmpv->set(v.x(), v.y(), v.z());
708 *norm = (blockedsurface->
GetNormal(p,
true));
740 if (tmpdistance < distance)
742 distance = tmpdistance;
752 *norm = (surfaces[besti]->
GetNormal(p,
true));
786 tmpp->set(p.x(), p.y(), p.z());
825 if (tmpdistance < distance)
827 distance = tmpdistance;
837 G4Exception(
"G4TwistedTubs::DistanceToOut(p)",
"GeomSolids0003",
853 G4int oldprc = os.precision(16);
854 os <<
"-----------------------------------------------------------\n"
855 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n"
856 <<
" ===================================================\n"
857 <<
" Solid type: G4TwistedTubs\n"
859 <<
" -ve end Z : " <<
fEndZ[0]/
mm <<
" mm \n"
860 <<
" +ve end Z : " <<
fEndZ[1]/
mm <<
" mm \n"
870 <<
" phi-width of a piece : " <<
fDPhi/
degree <<
" degrees \n"
871 <<
"-----------------------------------------------------------\n";
872 os.precision(oldprc);
895 return G4VisExtent( -maxEndOuterRad, maxEndOuterRad,
896 -maxEndOuterRad, maxEndOuterRad,
909 G4int(G4Polyhedron::GetNumberOfRotationSteps() * dA /
twopi) + 2;
913 const G4int nnodes = 4*(k-1)*(n-2) + 2*k*k ;
914 const G4int nfaces = 4*(k-1)*(n-1) + 2*(k-1)*(k-1) ;
918 typedef G4int G4int4[4];
919 G4double3* xyz =
new G4double3[nnodes];
920 G4int4* faces =
new G4int4[nfaces] ;
928 ph->createPolyhedron(nnodes,nfaces,xyz,faces);
974 rotHalfDPhi.rotateZ(0.5*
fDPhi);
1083 else if ( (chose >= a1) && (chose < a1 + a2 ) )
1093 else if ( (chose >= a1 + a2 ) && (chose < a1 + a2 + a3 ) )
1103 else if ( (chose >= a1 + a2 + a3 ) && (chose < a1 + a2 + a3 + a4 ) )
1112 else if( (chose >= a1 + a2 + a3 + a4 )&&(chose < a1 + a2 + a3 + a4 + a5 ) )
ThreeVector shoot(const G4int Ap, const G4int Af)
static constexpr double mm
G4double GetEndInnerRadius() const
static const G4double kInfinity
CLHEP::Hep3Vector G4ThreeVector
G4ThreeVector GetPointOnSurface() const
CLHEP::HepRotation G4RotationMatrix
virtual G4ThreeVector GetNormal(const G4ThreeVector &xx, G4bool isGlobal)=0
std::vector< ExP01TrackerHit * > a
std::ostream & StreamInfo(std::ostream &os) const
G4Polyhedron * CreatePolyhedron() const
G4VTwistSurface * fFormerTwisted
G4double fEndOuterRadius[2]
LastValueWithDoubleVector fLastDistanceToInWithV
LastValue fLastDistanceToIn
EInside Inside(const G4ThreeVector &p) const
virtual void AddSolid(const G4Box &)=0
void ComputeDimensions(G4VPVParameterisation *, const G4int, const G4VPhysicalVolume *)
G4double fEndInnerRadius[2]
#define G4MUTEX_INITIALIZER
G4bool IsValidNorm() const
G4GeometryType GetEntityType() const
G4VTwistSurface * fUpperEndcap
virtual G4double DistanceToIn(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
static constexpr double twopi
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const
G4double GetEndOuterRadius() const
G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
static double normal(HepRandomEngine *eptr)
G4VTwistSurface * fOuterHype
virtual G4double GetSurfaceArea()=0
void SetNeighbours(G4VTwistSurface *axis0min, G4VTwistSurface *axis1min, G4VTwistSurface *axis0max, G4VTwistSurface *axis1max)
virtual G4double DistanceTo(const G4ThreeVector &gp, G4ThreeVector &gxx)
void DescribeYourselfTo(G4VGraphicsScene &scene) const
static constexpr double degree
virtual G4double DistanceToOut(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
virtual G4ThreeVector SurfacePoint(G4double, G4double, G4bool isGlobal=false)=0
G4double GetRadialTolerance() const
G4VTwistSurface ** surface
void SetFields(G4double phitwist, G4double innerrad, G4double outerrad, G4double negativeEndz, G4double positiveEndz)
G4bool fRebuildPolyhedron
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimits, const G4Transform3D &pTransform3D, G4double &pMin, G4double &pMax) const
LastValueWithDoubleVector fLastDistanceToOutWithV
G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcnorm=G4bool(false), G4bool *validnorm=0, G4ThreeVector *n=0) const
void Extent(G4ThreeVector &pMin, G4ThreeVector &pMax) const
virtual G4double GetBoundaryMax(G4double)=0
G4double GetSurfaceArea()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
LastValue fLastDistanceToOut
virtual void GetFacets(G4int m, G4int n, G4double xyz[][3], G4int faces[][4], G4int iside)=0
virtual G4double GetBoundaryMin(G4double)=0
G4VTwistSurface * fLatterTwisted
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4VTwistSurface * fInnerHype
G4double fTanInnerStereo2
G4Polyhedron * fpPolyhedron
G4TwistedTubs(const G4String &pname, G4double twistedangle, G4double endinnerrad, G4double endouterrad, G4double halfzlen, G4double dphi)
G4VSolid & operator=(const G4VSolid &rhs)
G4int GetNumberOfRotationStepsAtTimeOfCreation() const
G4double fTanOuterStereo2
G4double GetCubicVolume()
G4VTwistSurface * fLowerEndcap
G4VisExtent GetExtent() const
virtual G4double GetSurfaceArea()
static G4GeometryTolerance * GetInstance()
G4Polyhedron * GetPolyhedron() const
G4TwistedTubs & operator=(const G4TwistedTubs &rhs)