35                  double pRmin, 
double pRmax,
 
   36                  double pSPhi, 
double pDPhi,
 
   37                  double pSTheta, 
double pDTheta)
 
   38   : 
VUSolid(pName), fCubicVolume(0.),
 
   39     fSurfaceArea(0.),fEpsilon(2.e-11),
 
   40     fFullPhiSphere(true), fFullThetaSphere(true)
 
   47   if ((pRmin >= pRmax) || (pRmax < 1.1 * 
kRadTolerance) || (pRmin < 0))
 
   49     std::ostringstream message;
 
   50     message << 
"Invalid radii for Solid: " << 
GetName() << std::endl
 
   51             << 
"                                pRmin = " << pRmin << 
", pRmax = " << pRmax;
 
   79   : 
VUSolid(rhs), fCubicVolume(0.),fSurfaceArea(0.),
 
   80     fRminTolerance(rhs.fRminTolerance),
 
   81     kTolerance(rhs.kTolerance), kAngTolerance(rhs.kAngTolerance),
 
   82     kRadTolerance(rhs.kRadTolerance), fEpsilon(rhs.fEpsilon),
 
   83     fRmin(rhs.fRmin), fRmax(rhs.fRmax), fSPhi(rhs.fSPhi), fDPhi(rhs.fDPhi),
 
   84     fSTheta(rhs.fSTheta), fDTheta(rhs.fDTheta),
 
   85     sinCPhi(rhs.sinCPhi), cosCPhi(rhs.cosCPhi),
 
   86     cosHDPhiOT(rhs.cosHDPhiOT), cosHDPhiIT(rhs.cosHDPhiIT),
 
   87     sinSPhi(rhs.sinSPhi), cosSPhi(rhs.cosSPhi),
 
   88     sinEPhi(rhs.sinEPhi), cosEPhi(rhs.cosEPhi),
 
   89     hDPhi(rhs.hDPhi), cPhi(rhs.cPhi), ePhi(rhs.ePhi),
 
   90     sinSTheta(rhs.sinSTheta), cosSTheta(rhs.cosSTheta),
 
   91     sinETheta(rhs.sinETheta), cosETheta(rhs.cosETheta),
 
   92     tanSTheta(rhs.tanSTheta), tanSTheta2(rhs.tanSTheta2),
 
   93     tanETheta(rhs.tanETheta), tanETheta2(rhs.tanETheta2), eTheta(rhs.eTheta),
 
   94     fFullPhiSphere(rhs.fFullPhiSphere), fFullThetaSphere(rhs.fFullThetaSphere),
 
   95     fFullSphere(rhs.fFullSphere)
 
  114   VUSolid::operator=(rhs);
 
  166   double rho, rho2, rad2, tolRMin, tolRMax;
 
  170   const double halfTolerance = 
kTolerance * 0.5;
 
  172   const double rMaxMinus = 
fRmax - halfTolerance;
 
  173   const double rMinPlus = (
fRmin > 0) ? 
fRmin + halfRminTolerance : 0;
 
  175   rho2 = p.
x * p.
x + p.
y * p.
y;
 
  176   rad2 = rho2 + p.
z * p.
z;
 
  183   if ((rad2 <= rMaxMinus * rMaxMinus) && (rad2 >= rMinPlus * rMinPlus))
 
  189     tolRMax = 
fRmax + halfTolerance;                  
 
  191     if ((rad2 <= tolRMax * tolRMax) && (rad2 >= tolRMin * tolRMin))
 
  205     pPhi = std::atan2(p.
y, p.
x);
 
  207     if (pPhi < 
fSPhi - halfAngTolerance)
 
  211     else if (pPhi > 
ePhi + halfAngTolerance)
 
  216     if ((pPhi < 
fSPhi - halfAngTolerance)
 
  217         || (pPhi > 
ePhi + halfAngTolerance))
 
  224       if ((pPhi < 
fSPhi + halfAngTolerance)
 
  225           || (pPhi > 
ePhi - halfAngTolerance))
 
  236     rho   = std::sqrt(rho2);
 
  237     pTheta = std::atan2(rho, p.
z);
 
  241       if ((pTheta < 
fSTheta + halfAngTolerance)
 
  242           || (pTheta > 
eTheta - halfAngTolerance))
 
  244         if ((pTheta >= 
fSTheta - halfAngTolerance)
 
  245             && (pTheta <= 
eTheta + halfAngTolerance))
 
  257       if ((pTheta < 
fSTheta - halfAngTolerance)
 
  258           || (pTheta > 
eTheta + halfAngTolerance))
 
  276   double rho, rho2, radius, pTheta, pPhi = 0.;
 
  280   UVector3 nR, nPs, nPe, nTs, nTe, nZ(0., 0., 1.);
 
  286   rho2 = p.
x * p.
x + p.
y * p.
y;
 
  287   radius = std::sqrt(rho2 + p.
z * p.
z);
 
  288   rho = std::sqrt(rho2);
 
  290   double    distRMax = std::fabs(radius - 
fRmax);
 
  291   if (
fRmin)  distRMin = std::fabs(radius - 
fRmin);
 
  295     pPhi = std::atan2(p.
y, p.
x);
 
  297     if (pPhi < 
fSPhi - halfAngTolerance)
 
  301     else if (pPhi > 
ePhi + halfAngTolerance)
 
  310       distSPhi = std::fabs(pPhi - 
fSPhi);
 
  311       distEPhi = std::fabs(pPhi - 
ePhi);
 
  325       pTheta     = std::atan2(rho, p.
z);
 
  326       distSTheta = std::fabs(pTheta - 
fSTheta);
 
  327       distETheta = std::fabs(pTheta - 
eTheta);
 
  353     nR = 
UVector3(p.
x / radius, p.
y / radius, p.
z / radius);
 
  356   if (distRMax <= halfCarTolerance)
 
  361   if (
fRmin && (distRMin <= halfCarTolerance))
 
  368     if (distSPhi <= halfAngTolerance)
 
  373     if (distEPhi <= halfAngTolerance)
 
  381     if ((distSTheta <= halfAngTolerance) && (
fSTheta > 0.))
 
  414                       Warning, 1, 
"Point p is not on surface !?");
 
  418   else if (noSurfaces == 1)
 
  424     norm = sumnorm.
Unit();
 
  427   return (noSurfaces > 0);
 
  440   double rho, rho2, radius, pPhi, pTheta;
 
  441   double distRMin, distRMax, distSPhi, distEPhi,
 
  442          distSTheta, distETheta, distMin;
 
  444   rho2 = p.
x * p.
x + p.
y * p.
y;
 
  445   radius = std::sqrt(rho2 + p.
z * p.
z);
 
  446   rho = std::sqrt(rho2);
 
  452   distRMax = std::fabs(radius - 
fRmax);
 
  455     distRMin = std::fabs(radius - 
fRmin);
 
  457     if (distRMin < distRMax)
 
  478   pPhi = std::atan2(p.
y, p.
x);
 
  492       distSPhi = std::fabs(pPhi - 
fSPhi) * rho;
 
  495     distEPhi = std::fabs(pPhi - 
fSPhi - 
fDPhi) * rho;
 
  499     if (distSPhi < distEPhi)
 
  501       if (distSPhi < distMin)
 
  509       if (distEPhi < distMin)
 
  523     pTheta = std::atan2(rho, p.
z);
 
  524     distSTheta = std::fabs(pTheta - 
fSTheta) * radius;
 
  529     if (distSTheta < distETheta)
 
  531       if (distSTheta < distMin)
 
  533         distMin = distSTheta;
 
  539       if (distETheta < distMin)
 
  541         distMin = distETheta;
 
  550       norm = 
UVector3(-p.
x / radius, -p.
y / radius, -p.
z / radius);
 
  553       norm = 
UVector3(p.
x / radius, p.
y / radius, p.
z / radius);
 
  575                         "Undefined side for valid surface normal to solid.");
 
  614   double rho2, rad2, pDotV2d, pDotV3d, pTheta;
 
  615   double tolSTheta = 0., tolETheta = 0.;
 
  616   const double dRmax = 100.*
fRmax;
 
  620   const double halfTolerance = 
kTolerance * 0.5;
 
  622   const double tolORMin2 = (
fRmin > halfRminTolerance)
 
  623                            ? (
fRmin - halfRminTolerance) * (
fRmin - halfRminTolerance) : 0;
 
  624   const double tolIRMin2 =
 
  625     (
fRmin + halfRminTolerance) * (
fRmin + halfRminTolerance);
 
  626   const double tolORMax2 =
 
  627     (
fRmax + halfTolerance) * (
fRmax + halfTolerance);
 
  628   const double tolIRMax2 =
 
  629     (
fRmax - halfTolerance) * (
fRmax - halfTolerance);
 
  633   double xi, yi, zi, rhoi, rhoi2, radi2, iTheta;
 
  645   double dist2STheta, dist2ETheta;
 
  650   rho2 = p.
x * p.
x + p.
y * p.
y;
 
  651   rad2 = rho2 + p.
z * p.
z;
 
  652   pTheta = std::atan2(std::sqrt(rho2), p.
z);
 
  654   pDotV2d = p.
x * v.
x + p.
y * v.
y;
 
  655   pDotV3d = pDotV2d + p.
z * v.
z;
 
  661     tolSTheta = 
fSTheta - halfAngTolerance;
 
  662     tolETheta = 
eTheta + halfAngTolerance;
 
  686     d2 = pDotV3d * pDotV3d - c;
 
  690       sd = -pDotV3d - std::sqrt(d2);
 
  697           double fTerm = sd - std::fmod(sd, dRmax);
 
  702         rhoi = std::sqrt(xi * xi + yi * yi);
 
  717               iTheta = std::atan2(rhoi, zi);
 
  718               if ((iTheta >= tolSTheta) && (iTheta <= tolETheta))
 
  738             iTheta = std::atan2(rhoi, zi);
 
  739             if ((iTheta >= tolSTheta) && (iTheta <= tolETheta))
 
  761     d2 = pDotV3d * pDotV3d - c;
 
  763     if ((rad2 > tolIRMax2)
 
  764         && ((d2 >= 
kTolerance * fRmax) && (pDotV3d < 0)))
 
  817     d2 = pDotV3d * pDotV3d - c;
 
  822     if ((c > -halfRminTolerance) && (rad2 < tolIRMin2)
 
  869         sd = -pDotV3d + std::sqrt(d2);
 
  870         if (sd >= halfRminTolerance)  
 
  874           rhoi = std::sqrt(xi * xi + yi * yi);
 
  889                 iTheta = std::atan2(rhoi, zi);
 
  890                 if ((iTheta >= tolSTheta) && (iTheta <= tolETheta))
 
  910               iTheta = std::atan2(rhoi, zi);
 
  911               if ((iTheta >= tolSTheta) && (iTheta <= tolETheta))
 
  946       if (Dist < halfCarTolerance)
 
  957             rhoi2 = xi * xi + yi * yi ;
 
  958             radi2 = rhoi2 + zi * zi ;
 
  969           if ((radi2 <= tolORMax2)
 
  970               && (radi2 >= tolORMin2)
 
  979               iTheta = std::atan2(std::sqrt(rhoi2), zi);
 
  980               if ((iTheta >= tolSTheta) && (iTheta <= tolETheta))
 
  985                 if ((yi * 
cosCPhi - xi * sinCPhi) <= 0)
 
 1008       if (Dist < halfCarTolerance)
 
 1016             xi    = p.
x + sd * v.
x;
 
 1017             yi    = p.
y + sd * v.
y;
 
 1018             zi    = p.
z + sd * v.
z;
 
 1019             rhoi2 = xi * xi + yi * yi ;
 
 1020             radi2 = rhoi2 + zi * zi ;
 
 1031           if ((radi2 <= tolORMax2)
 
 1032               && (radi2 >= tolORMin2)
 
 1041               iTheta = std::atan2(std::sqrt(rhoi2), zi);
 
 1042               if ((iTheta >= tolSTheta) && (iTheta <= tolETheta))
 
 1047                 if ((yi * 
cosCPhi - xi * sinCPhi) >= 0)
 
 1103     if (pTheta < tolSTheta)
 
 1113         c = dist2STheta / t1;
 
 1120           zi = p.
z + sd * v.
z;
 
 1126           if ((sd >= 0) && (sd < snxt))
 
 1128             xi    = p.
x + sd * v.
x;
 
 1129             yi    = p.
y + sd * v.
y;
 
 1130             zi    = p.
z + sd * v.
z;
 
 1131             rhoi2 = xi * xi + yi * yi;
 
 1132             radi2 = rhoi2 + zi * zi;
 
 1133             if ((radi2 <= tolORMax2)
 
 1134                 && (radi2 >= tolORMin2)
 
 1164           c = dist2ETheta / t1;
 
 1172             if ((sd >= 0) && (sd < snxt))
 
 1174               xi    = p.
x + sd * v.
x;
 
 1175               yi    = p.
y + sd * v.
y;
 
 1176               zi    = p.
z + sd * v.
z;
 
 1177               rhoi2 = xi * xi + yi * yi;
 
 1178               radi2 = rhoi2 + zi * zi;
 
 1180               if ((radi2 <= tolORMax2)
 
 1181                   && (radi2 >= tolORMin2)
 
 1202     else if (pTheta > tolETheta)
 
 1213         c = dist2ETheta / t1;
 
 1220           zi = p.
z + sd * v.
z;
 
 1226           if ((sd >= 0) && (sd < snxt))
 
 1228             xi    = p.
x + sd * v.
x;
 
 1229             yi    = p.
y + sd * v.
y;
 
 1230             zi    = p.
z + sd * v.
z;
 
 1231             rhoi2 = xi * xi + yi * yi;
 
 1232             radi2 = rhoi2 + zi * zi;
 
 1234             if ((radi2 <= tolORMax2)
 
 1235                 && (radi2 >= tolORMin2)
 
 1265           c = dist2STheta / t1;
 
 1273             if ((sd >= 0) && (sd < snxt))
 
 1275               xi    = p.
x + sd * v.
x;
 
 1276               yi    = p.
y + sd * v.
y;
 
 1277               zi    = p.
z + sd * v.
z;
 
 1278               rhoi2 = xi * xi + yi * yi;
 
 1279               radi2 = rhoi2 + zi * zi;
 
 1281               if ((radi2 <= tolORMax2)
 
 1282                   && (radi2 >= tolORMin2)
 
 1304              && (
fSTheta > halfAngTolerance))
 
 1312           || (t2 < 0  && tolIRMin2 < rad2 && rad2 < tolIRMax2 && fSTheta > 
UUtils::kPi / 2)
 
 1335         c = dist2STheta / t1;
 
 1345             xi    = p.
x + sd * v.
x;
 
 1346             yi    = p.
y + sd * v.
y;
 
 1347             zi    = p.
z + sd * v.
z;
 
 1348             rhoi2 = xi * xi + yi * yi;
 
 1349             radi2 = rhoi2 + zi * zi;
 
 1351             if ((radi2 <= tolORMax2)
 
 1352                 && (radi2 >= tolORMin2)
 
 1382            && (tolIRMin2 < rad2) && (rad2 < tolIRMax2))
 
 1384               && (tolIRMin2 < rad2) && (rad2 < tolIRMax2))
 
 1386               && (tolIRMin2 < rad2) && (rad2 < tolIRMax2)))
 
 1408         c = dist2ETheta / t1;
 
 1416           if ((sd >= halfCarTolerance)
 
 1419             xi    = p.
x + sd * v.
x;
 
 1420             yi    = p.
y + sd * v.
y;
 
 1421             zi    = p.
z + sd * v.
z;
 
 1422             rhoi2 = xi * xi + yi * yi;
 
 1423             radi2 = rhoi2 + zi * zi;
 
 1425             if ((radi2 <= tolORMax2)
 
 1426                 && (radi2 >= tolORMin2)
 
 1456         c = dist2STheta / t1;
 
 1464           if ((sd >= 0) && (sd < snxt))
 
 1466             xi    = p.
x + sd * v.
x;
 
 1467             yi    = p.
y + sd * v.
y;
 
 1468             zi    = p.
z + sd * v.
z;
 
 1469             rhoi2 = xi * xi + yi * yi;
 
 1470             radi2 = rhoi2 + zi * zi;
 
 1472             if ((radi2 <= tolORMax2)
 
 1473                 && (radi2 >= tolORMin2)
 
 1497         c = dist2ETheta / t1;
 
 1505           if ((sd >= 0) && (sd < snxt))
 
 1507             xi    = p.
x + sd * v.
x;
 
 1508             yi    = p.
y + sd * v.
y;
 
 1509             zi    = p.
z + sd * v.
z;
 
 1510             rhoi2 = xi * xi + yi * yi;
 
 1511             radi2 = rhoi2 + zi * zi;
 
 1513             if ((radi2 <= tolORMax2)
 
 1514                 && (radi2 >= tolORMin2)
 
 1548   double safe = 0.0, safeRMin, safeRMax, safePhi, safeTheta;
 
 1549   double rho2, rds, rho;
 
 1551   double pTheta, dTheta1, dTheta2;
 
 1552   rho2 = p.
x * p.
x + p.
y * p.
y;
 
 1553   rds = std::sqrt(rho2 + p.
z * p.
z);
 
 1554   rho = std::sqrt(rho2);
 
 1561     safeRMin = 
fRmin - rds;
 
 1562     safeRMax = rds - 
fRmax;
 
 1563     if (safeRMin > safeRMax)
 
 1585     if (cosPsi < std::cos(
hDPhi))
 
 1608     pTheta = std::acos(p.
z / rds);
 
 1614     dTheta2 = pTheta - 
eTheta;
 
 1615     if (dTheta1 > dTheta2)
 
 1619         safeTheta = rds * std::sin(dTheta1);
 
 1620         if (safe <= safeTheta)
 
 1630         safeTheta = rds * std::sin(dTheta2);
 
 1631         if (safe <= safeTheta)
 
 1659   const double halfTolerance = 
kTolerance * 0.5;
 
 1661   const double rMaxPlus = 
fRmax + halfTolerance;
 
 1662   const double Rmin_minus = (
fRmin) ? 
fRmin - halfRminTolerance : 0;
 
 1668   double pDistS, compS, pDistE, compE, sphi2, vphi;
 
 1670   double rho2, rad2, pDotV2d, pDotV3d;
 
 1677   double dist2STheta, dist2ETheta, distTheta;
 
 1682   rho2 = p.
x * p.
x + p.
y * p.
y;
 
 1683   rad2 = rho2 + p.
z * p.
z;
 
 1685   pDotV2d = p.
x * v.
x + p.
y * v.
y;
 
 1686   pDotV3d = pDotV2d + p.
z * v.
z;
 
 1704   if ((rad2 <= rMaxPlus * rMaxPlus) && (rad2 >= Rmin_minus * Rmin_minus))
 
 1719       d2 = pDotV3d * pDotV3d - c;
 
 1722           && ((pDotV3d >= 0) || (d2 < 0)))    
 
 1726         n        = 
UVector3(p.
x / fRmax, p.
y / fRmax, p.
z / fRmax);
 
 1731         snxt = -pDotV3d + std::sqrt(d2);  
 
 1743       d2 = pDotV3d * pDotV3d - c;
 
 1757             sd = -pDotV3d - std::sqrt(d2);
 
 1802           if (std::fabs(p.
z) <= halfTolerance)
 
 1808           stheta    = -p.
z / v.
z;
 
 1818         distTheta = std::sqrt(rho2) - p.
z * 
tanSTheta;
 
 1820         if (std::fabs(t1) < halfAngTolerance) 
 
 1825             if (std::fabs(distTheta) < halfTolerance) 
 
 1837                   rhoSecTheta = std::sqrt(rho2 * (1 + 
tanSTheta2));
 
 1847             stheta    = -0.5 * dist2STheta / t2;
 
 1853           if (std::fabs(distTheta) < halfTolerance)
 
 1860                 rhoSecTheta = std::sqrt(rho2 * (1 + 
tanSTheta2));
 
 1879           c = dist2STheta / t1;
 
 1890               if (((std::fabs(sd) < halfTolerance) && (t2 < 0.))
 
 1891                   || (sd < 0.) || ((sd > 0.) && (p.
z + sd * v.
z > 0.)))
 
 1895               if ((sd > halfTolerance) && (p.
z + sd * v.
z <= 0.))
 
 1905               if (((std::fabs(sd) < halfTolerance) && (t2 >= 0.))
 
 1906                   || (sd < 0.) || ((sd > 0.) && (p.
z + sd * v.
z < 0.)))
 
 1910               if ((sd > halfTolerance) && (p.
z + sd * v.
z >= 0.))
 
 1926           if (std::fabs(p.
z) <= halfTolerance)
 
 1947         distTheta = std::sqrt(rho2) - p.
z * 
tanETheta;
 
 1949         if (std::fabs(t1) < halfAngTolerance) 
 
 1954             if (std::fabs(distTheta) < halfTolerance) 
 
 1966                   rhoSecTheta = std::sqrt(rho2 * (1 + 
tanETheta2));
 
 1978             sd = -0.5 * dist2ETheta / t2;
 
 1989           if (std::fabs(distTheta) < halfTolerance)
 
 1996                 rhoSecTheta = std::sqrt(rho2 * (1 + 
tanETheta2));
 
 2005                      && (t2 < 0.) && (p.
z <= 0.)) 
 
 2012           c = dist2ETheta / t1;
 
 2023               if (((std::fabs(sd) < halfTolerance) && (t2 < 0.))
 
 2028               if (sd > halfTolerance)
 
 2041               if (((std::fabs(sd) < halfTolerance) && (t2 >= 0.))
 
 2042                   || (sd < 0.) || ((sd > 0.) && (p.
z + sd * v.
z > 0.)))
 
 2046               if ((sd > halfTolerance) && (p.
z + sd * v.
z <= 0.))
 
 2079       if ((pDistS <= 0) && (pDistE <= 0))
 
 2085           sphi = pDistS / compS;
 
 2086           xi   = p.
x + sphi * v.
x;
 
 2087           yi   = p.
y + sphi * v.
y;
 
 2093             vphi = std::atan2(v.
y, v.
x);
 
 2095             if (((
fSPhi - halfAngTolerance) <= vphi)
 
 2096                 && ((
ePhi + halfAngTolerance) >= vphi))
 
 2108             if (pDistS > -halfCarTolerance)
 
 2121           sphi2 = pDistE / compE;
 
 2124             xi = p.
x + sphi2 * v.
x;
 
 2125             yi = p.
y + sphi2 * v.
y;
 
 2133               vphi = std::atan2(v.
y, v.
x);
 
 2135               if (!((
fSPhi - halfAngTolerance <= vphi)
 
 2136                     && (
fSPhi + 
fDPhi + halfAngTolerance >= vphi)))
 
 2139                 if (pDistE <= -halfCarTolerance)
 
 2152               if (pDistE <= -halfCarTolerance)
 
 2164       else if ((pDistS >= 0) && (pDistE >= 0)) 
 
 2166         if (pDistS <= pDistE)
 
 2176           if ((compS < 0) && (compE < 0))
 
 2190           if ((compS >= 0) && (compE >= 0))
 
 2200       else if ((pDistS > 0) && (pDistE < 0))
 
 2208             sphi = pDistE / compE;
 
 2209             xi   = p.
x + sphi * v.
x;
 
 2210             yi   = p.
y + sphi * v.
y;
 
 2217               vphi = std::atan2(v.
y, v.
x);
 
 2219               if (((
fSPhi - halfAngTolerance) <= vphi)
 
 2220                   && ((
ePhi + halfAngTolerance) >= vphi))
 
 2232               if (pDistE > -halfCarTolerance)
 
 2249               sphi = pDistE / compE;
 
 2250               xi   = p.
x + sphi * v.
x;
 
 2251               yi   = p.
y + sphi * v.
y;
 
 2258                 vphi = std::atan2(v.
y, v.
x);
 
 2260                 if (((
fSPhi - halfAngTolerance) <= vphi)
 
 2261                     && ((
ePhi + halfAngTolerance) >= vphi))
 
 2293             sphi = pDistS / compS;
 
 2294             xi = p.
x + sphi * v.
x;
 
 2295             yi = p.
y + sphi * v.
y;
 
 2302               vphi = std::atan2(v.
y, v.
x);
 
 2304               if (((
fSPhi - halfAngTolerance) <= vphi)
 
 2305                   && ((
ePhi + halfAngTolerance) >= vphi))
 
 2317               if (pDistS > -halfCarTolerance)
 
 2334               sphi = pDistS / compS;
 
 2335               xi   = p.
x + sphi * v.
x;
 
 2336               yi   = p.
y + sphi * v.
y;
 
 2343                 vphi = std::atan2(v.
y, v.
x);
 
 2345                 if (((
fSPhi - halfAngTolerance) <= vphi)
 
 2346                     && ((
ePhi + halfAngTolerance) >= vphi))
 
 2380         vphi = std::atan2(v.
y, v.
x);
 
 2381         if ((
fSPhi - halfAngTolerance < vphi) && (vphi < 
ePhi + halfAngTolerance))
 
 2411       xi = p.
x + snxt * v.
x;
 
 2412       yi = p.
y + snxt * v.
y;
 
 2413       zi = p.
z + snxt * v.
z;
 
 2454         xi = p.
x + snxt * v.
x;
 
 2455         yi = p.
y + snxt * v.
y;
 
 2456         rho2 = xi * xi + yi * yi;
 
 2459           rhoSecTheta = std::sqrt(rho2 * (1 + 
tanSTheta2));
 
 2460           n = 
UVector3(xi / rhoSecTheta, yi / rhoSecTheta,
 
 2483         xi = p.
x + snxt * v.
x;
 
 2484         yi = p.
y + snxt * v.
y;
 
 2485         rho2 = xi * xi + yi * yi;
 
 2488           rhoSecTheta = std::sqrt(rho2 * (1 + 
tanETheta2));
 
 2489           n = 
UVector3(xi / rhoSecTheta, yi / rhoSecTheta,
 
 2507       std::ostringstream message;
 
 2508       int oldprc = message.precision(16);
 
 2509       message << 
"Undefined side for valid surface normal to solid." 
 2511               << 
"Position:"  << std::endl << std::endl
 
 2512               << 
"p.x = "  << p.
x << 
" mm" << std::endl
 
 2513               << 
"p.y = "  << p.
y << 
" mm" << std::endl
 
 2514               << 
"p.z = "  << p.
z << 
" mm" << std::endl << std::endl
 
 2515               << 
"Direction:" << std::endl << std::endl
 
 2516               << 
"v.x = "  << v.
x << std::endl
 
 2517               << 
"v.y = "  << v.
y << std::endl
 
 2518               << 
"v.z = "  << v.
z << std::endl << std::endl
 
 2519               << 
"Proposed distance :" << std::endl << std::endl
 
 2520               << 
"snxt = "    << snxt << 
" mm" << std::endl;
 
 2521       message.precision(oldprc);
 
 2523                         "GeomSolids1002", 
Warning, 1, message.str().c_str());
 
 2530     std::ostringstream message;
 
 2531     int oldprc = message.precision(16);
 
 2532     message << 
"Logic error: snxt = UUtils::Infinity()  ???" << std::endl
 
 2533             << 
"Position:"  << std::endl << std::endl
 
 2534             << 
"p.x = "  << p.
x << 
" mm" << std::endl
 
 2535             << 
"p.y = "  << p.
y << 
" mm" << std::endl
 
 2536             << 
"p.z = "  << p.
z << 
" mm" << std::endl << std::endl
 
 2537             << 
"Rp = " << std::sqrt(p.
x * p.
x + p.
y * p.
y + p.
z * p.
z)
 
 2538             << 
" mm" << std::endl << std::endl
 
 2539             << 
"Direction:" << std::endl << std::endl
 
 2540             << 
"v.x = "  << v.
x << std::endl
 
 2541             << 
"v.y = "  << v.
y << std::endl
 
 2542             << 
"v.z = "  << v.
z << std::endl << std::endl
 
 2543             << 
"Proposed distance :" << std::endl << std::endl
 
 2544             << 
"snxt = "    << snxt << 
" mm" << std::endl;
 
 2545     message.precision(oldprc);
 
 2547                       "GeomSolids1002", 
Warning, 1, message.str().c_str());
 
 2559   double safe = 0.0, safeRMin, safeRMax, safePhi, safeTheta;
 
 2560   double rho2, rds, rho;
 
 2561   double pTheta, dTheta1, dTheta2;
 
 2562   rho2 = p.
x * p.
x + p.
y * p.
y;
 
 2563   rds = std::sqrt(rho2 + p.
z * p.
z);
 
 2564   rho = std::sqrt(rho2);
 
 2569     int old_prc = cout.precision(16);
 
 2572     cout << 
"Position:"  << std::endl << std::endl;
 
 2573     cout << 
"p.x = "  << p.
x << 
" mm" << std::endl;
 
 2574     cout << 
"p.y = "  << p.
y << 
" mm" << std::endl;
 
 2575     cout << 
"p.z = "  << p.
z << 
" mm" << std::endl << std::endl;
 
 2576     cout.precision(old_prc);
 
 2578                       "GeomSolids1002", 
Warning, 1, 
"Point p is outside !?");
 
 2587     safeRMin = rds - 
fRmin;
 
 2588     safeRMax = 
fRmax - rds;
 
 2589     if (safeRMin < safeRMax)
 
 2627     pTheta = std::acos(p.
z / rds);
 
 2633     dTheta2 = 
eTheta - pTheta;
 
 2634     if (dTheta1 < dTheta2)
 
 2636       safeTheta = rds * std::sin(dTheta1);
 
 2640       safeTheta = rds * std::sin(dTheta2);
 
 2642     if (safe > safeTheta)
 
 2798   return std::string(
"Sphere");
 
 2816   int oldprc = os.precision(16);
 
 2817   os << 
"-----------------------------------------------------------\n" 
 2818      << 
"               *** Dump for solid - " << 
GetName() << 
" ***\n" 
 2819      << 
"               ===================================================\n" 
 2820      << 
" Solid type: USphere\n" 
 2821      << 
" Parameters: \n" 
 2822      << 
"               inner radius: " << 
fRmin << 
" mm \n" 
 2823      << 
"               outer radius: " << 
fRmax << 
" mm \n" 
 2824      << 
"               starting phi of segment : " << 
fSPhi / (
UUtils::kPi / 180.0) << 
" degrees \n" 
 2825      << 
"               delta phi of segment             : " << 
fDPhi / (
UUtils::kPi / 180.0) << 
" degrees \n" 
 2826      << 
"               starting theta of segment: " << 
fSTheta / (
UUtils::kPi / 180.0) << 
" degrees \n" 
 2828      << 
"-----------------------------------------------------------\n";
 
 2829   os.precision(oldprc);
 
 2840   double zRand, aOne, aTwo, aThr, aFou, aFiv, chose, phi, sinphi, cosphi;
 
 2841   double height1, height2, slant1, slant2, costheta, sintheta, rRand;
 
 2856   cosphi = std::cos(phi);
 
 2857   sinphi = std::sin(phi);
 
 2883   if ((chose >= 0.) && (chose < aOne))
 
 2886                     fRmax * sintheta * sinphi, 
fRmax * costheta);
 
 2888   else if ((chose >= aOne) && (chose < aOne + aTwo))
 
 2891                     fRmin * sintheta * sinphi, 
fRmin * costheta);
 
 2893   else if ((chose >= aOne + aTwo) && (chose < aOne + aTwo + aThr))
 
 2903       return UVector3(rRand * cosphi, rRand * sinphi, 0.);
 
 2906   else if ((chose >= aOne + aTwo + aThr) && (chose < aOne + aTwo + aThr + aFou))
 
 2916       return UVector3(rRand * cosphi, rRand * sinphi, 0.);
 
 2919   else if ((chose >= aOne + aTwo + aThr + aFou) && (chose < aOne + aTwo + aThr + aFou + aFiv))
 
 2922                     rRand * sintheta * 
sinSPhi, rRand * costheta);
 
 2927                     rRand * sintheta * 
sinEPhi, rRand * costheta);
 
 2953       double acos1 = std::acos(std::pow(
sinSTheta, 2) * std::cos(
fDPhi)
 
 2966       double acos2 = std::acos(std::pow(
sinETheta, 2) * std::cos(
fDPhi)
 
static double frTolerance
 
double GetInnerRadius() const 
 
const std::string & GetName() const 
 
VUSolid::EnumInside Inside(const UVector3 &p) const 
 
void Extent(UVector3 &aMin, UVector3 &aMax) const 
 
double DistanceToOut(const UVector3 &p, const UVector3 &v, UVector3 &n, bool &validNorm, double aPstep=UUtils::kInfinity) const 
 
UVector3 ApproxSurfaceNormal(const UVector3 &p) const 
 
void CheckThetaAngles(double sTheta, double dTheta)
 
double GetDeltaThetaAngle() const 
 
USphere & operator=(const USphere &rhs)
 
double GetOuterRadius() const 
 
double DistanceToIn(const UVector3 &p, const UVector3 &v, double aPstep=UUtils::kInfinity) const 
 
static double Tolerance()
 
UVector3 GetPointOnSurface() const 
 
double SafetyFromOutside(const UVector3 &p, bool aAccurate=false) const 
 
UGeometryType GetEntityType() const 
 
static double faTolerance
 
double GetRadiusInRing(double rmin, double rmax)
 
USphere(const std::string &pName, double pRmin, double pRmax, double pSPhi, double pDPhi, double pSTheta, double pDTheta)
 
void Set(double xx, double yy, double zz)
 
void GetParametersList(int, double *) const 
 
T max(const T t1, const T t2)
brief Return the largest of the two arguments 
 
double GetStartThetaAngle() const 
 
std::ostream & StreamInfo(std::ostream &os) const 
 
std::string UGeometryType
 
void CheckPhiAngles(double sPhi, double dPhi)
 
bool Normal(const UVector3 &p, UVector3 &n) const 
 
double GetStartPhiAngle() const 
 
void Exception(const char *originOfException, const char *exceptionCode, ExceptionSeverity severity, int level, const char *description)
 
double Random(double min=0.0, double max=1.0)
 
double GetDeltaPhiAngle() const 
 
double SafetyFromInside(const UVector3 &p, bool aAccurate=false) const