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.");
 
  352   G4double rFudge = 1.0/std::cos(0.5*sigPhi);
 
  353   G4double fudgeEndOuterRad = rFudge * maxEndOuterRad;
 
  401   if ( phimax > 
pi/2)  { phimax = 
pi-phimax; }
 
  417        G4ThreeVector(fudgeEndOuterRad*cosPhi, fudgeEndOuterRad*sinPhi, 
 
  420        G4ThreeVector(fudgeEndOuterRad*cosPhi, fudgeEndOuterRad*sinPhi, 
 
  425           G4ThreeVector(fudgeEndOuterRad*cosPhi, fudgeEndOuterRad*sinPhi, 0));
 
  468   cosPhi = std::cos(phimax);
 
  469   sinPhi = std::sin(phimax);
 
  474        G4ThreeVector(fudgeEndOuterRad*cosPhi, fudgeEndOuterRad*sinPhi,
 
  477        G4ThreeVector(fudgeEndOuterRad*cosPhi, fudgeEndOuterRad*sinPhi,
 
  563         phiPoly.
SetNormal( (v1-v0).cross(w0-v0).unit() );
 
  591       tmpp->set(p.x(), p.y(), p.z());
 
  596    G4double distanceToOut = p.getRho() - innerhyperho; 
 
  598    if ((outerhypearea == 
kOutside) || (distanceToOut < -halftol))
 
  608       if (distanceToOut <= halftol)
 
  643    tmpp->set(p.x(), p.y(), p.z());
 
  662       if (tmpdistance < distance)
 
  664          distance = tmpdistance;
 
  670    tmpsurface[0] = surfaces[besti];
 
  671    *tmpnormal = tmpsurface[0]->
GetNormal(bestxx, 
true);
 
  705       tmpp->set(p.x(), p.y(), p.z());
 
  706       tmpv->set(v.x(), v.y(), v.z());
 
  756       if (tmpdistance < distance)
 
  758          distance = tmpdistance;
 
  790       tmpp->set(p.x(), p.y(), p.z());
 
  828             if (tmpdistance < distance)
 
  830                distance = tmpdistance;
 
  839          G4Exception(
"G4TwistedTubs::DistanceToIn(p)", 
"GeomSolids0003",
 
  878       tmpp->set(p.x(), p.y(), p.z());
 
  879       tmpv->set(v.x(), v.y(), v.z());
 
  904            *norm = (blockedsurface->
GetNormal(p, 
true));
 
  936       if (tmpdistance < distance)
 
  938          distance = tmpdistance;
 
  948          *norm = (surfaces[besti]->
GetNormal(p, 
true));
 
  982       tmpp->set(p.x(), p.y(), p.z());
 
 1018          for (i=0; i< 6; i++)
 
 1021             if (tmpdistance < distance)
 
 1023                distance = tmpdistance;
 
 1027          *tmpdist = distance;
 
 1033          G4Exception(
"G4TwistedTubs::DistanceToOut(p)", 
"GeomSolids0003",
 
 1049   G4int oldprc = os.precision(16);
 
 1050   os << 
"-----------------------------------------------------------\n" 
 1051      << 
"    *** Dump for solid - " << 
GetName() << 
" ***\n" 
 1052      << 
"    ===================================================\n" 
 1053      << 
" Solid type: G4TwistedTubs\n" 
 1054      << 
" Parameters: \n" 
 1055      << 
"    -ve end Z              : " << 
fEndZ[0]/
mm << 
" mm \n" 
 1056      << 
"    +ve end Z              : " << 
fEndZ[1]/
mm << 
" mm \n" 
 1066      << 
"    phi-width of a piece   : " << 
fDPhi/
degree << 
" degrees \n" 
 1067      << 
"-----------------------------------------------------------\n";
 
 1068   os.precision(oldprc);
 
 1090   return G4VisExtent( -maxEndOuterRad, maxEndOuterRad, 
 
 1091                       -maxEndOuterRad, maxEndOuterRad, 
 
 1104     G4int(G4Polyhedron::GetNumberOfRotationSteps() * dA / twopi) + 2;
 
 1106     G4int(G4Polyhedron::GetNumberOfRotationSteps() * 
fPhiTwist / twopi) + 2;
 
 1108   const G4int nnodes = 4*(k-1)*(n-2) + 2*k*k ;
 
 1109   const G4int nfaces = 4*(k-1)*(n-1) + 2*(k-1)*(k-1) ;
 
 1113   typedef G4int G4int4[4];
 
 1114   G4double3* xyz = 
new G4double3[nnodes];  
 
 1115   G4int4*  faces = 
new G4int4[nfaces] ;    
 
 1123   ph->createPolyhedron(nnodes,nfaces,xyz,faces);
 
 1169    rotHalfDPhi.rotateZ(0.5*
fDPhi);
 
 1278   else if ( (chose >= a1) && (chose < a1 + a2 ) )
 
 1288   else if ( (chose >= a1 + a2 ) && (chose < a1 + a2 + a3 ) ) 
 
 1298   else if ( (chose >= a1 + a2 + a3  ) && (chose < a1 + a2 + a3 + a4  ) )
 
 1307   else if( (chose >= a1 + a2 + a3 + a4  )&&(chose < a1 + a2 + a3 + a4 + a5 ) )
 
ThreeVector shoot(const G4int Ap, const G4int Af)
 
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
 
static void AddPolyToExtent(const G4ThreeVector &v0, const G4ThreeVector &v1, const G4ThreeVector &w1, const G4ThreeVector &w0, const G4VoxelLimits &voxellimit, const EAxis axis, G4SolidExtentList &extentlist)
 
std::ostream & StreamInfo(std::ostream &os) const 
 
G4bool GetExtent(G4double &min, G4double &max) const 
 
G4Polyhedron * CreatePolyhedron() const 
 
G4VTwistSurface * fFormerTwisted
 
void SetNormal(const G4ThreeVector &newNormal)
 
G4double fEndOuterRadius[2]
 
LastValueWithDoubleVector fLastDistanceToInWithV
 
virtual G4bool PartialClip(const G4VoxelLimits &voxelLimit, const EAxis IgnoreMe)
 
virtual void AddVertexInOrder(const G4ThreeVector vertex)
 
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)
 
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 
 
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
 
void AddSurface(const G4ClippablePolygon &surface)
 
LastValueWithDoubleVector fLastDistanceToOutWithV
 
G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcnorm=G4bool(false), G4bool *validnorm=0, G4ThreeVector *n=0) 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
 
T min(const T t1, const T t2)
brief Return the smallest of the two arguments 
 
static const double degree
 
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 
 
G4bool CalculateExtent(const EAxis paxis, const G4VoxelLimits &pvoxellimit, const G4AffineTransform &ptransform, G4double &pmin, G4double &pmax) const 
 
G4TwistedTubs & operator=(const G4TwistedTubs &rhs)