1951 G4double pDistS,compS,pDistE,compE,sphi2,vphi;
1953 G4double rho2,rad2,pDotV2d,pDotV3d;
1960 G4double dist2STheta, dist2ETheta, distTheta;
1965 rho2 = p.
x()*p.
x()+p.
y()*p.
y();
1966 rad2 = rho2+p.
z()*p.
z();
1968 pDotV2d = p.
x()*v.
x()+p.
y()*v.
y();
1969 pDotV3d = pDotV2d+p.
z()*v.
z();
1987 if( (rad2 <= Rmax_plus*Rmax_plus) && (rad2 >= Rmin_minus*Rmin_minus) )
2002 d2 = pDotV3d*pDotV3d -
c;
2005 && ((pDotV3d >=0) || (d2 < 0)) )
2017 snxt = -pDotV3d+std::sqrt(d2);
2029 d2 = pDotV3d*pDotV3d -
c;
2036 if(calcNorm) { *validNorm =
false; }
2043 sd = -pDotV3d-std::sqrt(d2);
2088 if ( std::fabs( p.
z() ) <= halfRmaxTolerance )
2097 stheta = -p.
z()/v.
z();
2113 if(std::fabs(distTheta) < halfRmaxTolerance)
2117 if( calcNorm ) { *validNorm =
false; }
2127 rhoSecTheta = std::sqrt(rho2*(1+
tanSTheta2));
2138 stheta = -0.5*dist2STheta/
t2;
2144 if( std::fabs(distTheta) < halfRmaxTolerance )
2153 rhoSecTheta = std::sqrt(rho2*(1+
tanSTheta2));
2165 if( calcNorm ) { *validNorm =
false; }
2181 if ( ((std::fabs(
s) < halfRmaxTolerance) && (t2 < 0.))
2182 || (sd < 0.) || ( (sd > 0.) && (p.
z() + sd*v.
z() > 0.) ) )
2186 if( (sd > halfRmaxTolerance) && (p.
z() + sd*v.
z() <= 0.) )
2196 if ( ( (std::fabs(sd) < halfRmaxTolerance) && (t2 >= 0.) )
2197 || (sd < 0.) || ( (sd > 0.) && (p.
z() + sd*v.
z() < 0.) ) )
2201 if( (sd > halfRmaxTolerance) && (p.
z() + sd*v.
z() >= 0.) )
2217 if ( std::fabs( p.
z() ) <= halfRmaxTolerance )
2247 if(std::fabs(distTheta) < halfRmaxTolerance)
2251 if( calcNorm ) { *validNorm =
false; }
2261 rhoSecTheta = std::sqrt(rho2*(1+
tanETheta2));
2271 sd = -0.5*dist2ETheta/
t2;
2282 if ( std::fabs(distTheta) < halfRmaxTolerance )
2291 rhoSecTheta = std::sqrt(rho2*(1+
tanETheta2));
2301 && (t2 < 0.) && (p.
z() <=0.) )
2303 if( calcNorm ) { *validNorm =
false; }
2310 if ( (d2 <halfRmaxTolerance) && (d2 > -halfRmaxTolerance) )
2322 if( ((std::fabs(sd) < halfRmaxTolerance) && (t2 < 0.))
2327 if( sd > halfRmaxTolerance )
2340 if ( ((std::fabs(sd) < halfRmaxTolerance) && (t2 >= 0.))
2341 || (sd < 0.) || ( (sd > 0.) && (p.
z() + sd*v.
z() > halfRmaxTolerance) ) )
2345 if( (sd > halfRmaxTolerance) && (p.
z() + sd*v.
z() <= halfRmaxTolerance) )
2365 if ( p.
x() || p.
y() )
2378 if ( (pDistS <= 0) && (pDistE <= 0) )
2384 sphi = pDistS/compS ;
2385 xi = p.
x()+sphi*v.
x() ;
2386 yi = p.
y()+sphi*v.
y() ;
2392 vphi = std::atan2(v.
y(),v.
x());
2414 sphi2=pDistE/compE ;
2417 xi = p.
x()+sphi2*v.
x() ;
2418 yi = p.
y()+sphi2*v.
y() ;
2426 vphi = std::atan2(v.
y(),v.
x()) ;
2433 else { sphi = 0.0; }
2436 else if ((yi*
cosCPhi-xi*sinCPhi)>=0)
2451 else if ((pDistS >= 0) && (pDistE >= 0))
2453 if ( pDistS <= pDistE )
2463 if ( (compS < 0) && (compE < 0) ) { sphi = 0; }
2471 if ( (compS >= 0) && (compE >= 0) ) { sphi =
kInfinity; }
2475 else if ( (pDistS > 0) && (pDistE < 0) )
2483 sphi = pDistE/compE ;
2484 xi = p.
x() + sphi*v.
x() ;
2485 yi = p.
y() + sphi*v.
y() ;
2492 vphi = std::atan2(v.
y(),v.
x());
2500 else if ( ( yi*
cosCPhi - xi*sinCPhi ) <= 0 )
2521 sphi = pDistE/compE ;
2522 xi = p.
x() + sphi*v.
x() ;
2523 yi = p.
y() + sphi*v.
y() ;
2530 vphi = std::atan2(v.
y(),v.
x());
2538 else if ( ( yi*
cosCPhi - xi*sinCPhi) <= 0 )
2566 xi=p.
x()+sphi*v.
x();
2567 yi=p.
y()+sphi*v.
y();
2574 vphi = std::atan2(v.
y(),v.
x()) ;
2582 else if ( ( yi*
cosCPhi - xi*sinCPhi ) >= 0 )
2603 sphi = pDistS/compS ;
2604 xi = p.
x()+sphi*v.
x() ;
2605 yi = p.
y()+sphi*v.
y() ;
2612 vphi = std::atan2(v.
y(),v.
x()) ;
2620 else if ( ( yi*
cosCPhi - xi*sinCPhi ) >= 0 )
2647 if ( v.
x() || v.
y() )
2649 vphi = std::atan2(v.
y(),v.
x()) ;
2682 xi=p.
x()+snxt*v.
x();
2683 yi=p.
y()+snxt*v.
y();
2684 zi=p.
z()+snxt*v.
z();
2699 else { *validNorm=
false; }
2708 else { *validNorm=
false; }
2719 xi = p.
x() + snxt*v.
x();
2720 yi = p.
y() + snxt*v.
y();
2724 rhoSecTheta = std::sqrt(rho2*(1+
tanSTheta2));
2734 else { *validNorm=
false; }
2745 xi=p.
x()+snxt*v.
x();
2746 yi=p.
y()+snxt*v.
y();
2750 rhoSecTheta = std::sqrt(rho2*(1+
tanETheta2));
2760 else { *validNorm=
false; }
2766 std::ostringstream message;
2767 G4int oldprc = message.precision(16);
2768 message <<
"Undefined side for valid surface normal to solid." 2770 <<
"Position:" << G4endl << G4endl
2771 <<
"p.x() = " << p.
x()/
mm <<
" mm" << G4endl
2772 <<
"p.y() = " << p.
y()/
mm <<
" mm" << G4endl
2773 <<
"p.z() = " << p.
z()/
mm <<
" mm" << G4endl << G4endl
2774 <<
"Direction:" << G4endl << G4endl
2775 <<
"v.x() = " << v.
x() << G4endl
2776 <<
"v.y() = " << v.
y() << G4endl
2777 <<
"v.z() = " << v.
z() << G4endl << G4endl
2778 <<
"Proposed distance :" << G4endl << G4endl
2779 <<
"snxt = " << snxt/
mm <<
" mm" <<
G4endl;
2780 message.precision(oldprc);
2790 std::ostringstream message;
2791 G4int oldprc = message.precision(16);
2792 message <<
"Logic error: snxt = kInfinity ???" << G4endl
2793 <<
"Position:" << G4endl << G4endl
2794 <<
"p.x() = " << p.
x()/
mm <<
" mm" << G4endl
2795 <<
"p.y() = " << p.
y()/
mm <<
" mm" << G4endl
2796 <<
"p.z() = " << p.
z()/
mm <<
" mm" << G4endl << G4endl
2797 <<
"Rp = "<< std::sqrt( p.
x()*p.
x()+p.
y()*p.
y()+p.
z()*p.
z() )/
mm 2798 <<
" mm" << G4endl << G4endl
2799 <<
"Direction:" << G4endl << G4endl
2800 <<
"v.x() = " << v.
x() << G4endl
2801 <<
"v.y() = " << v.
y() << G4endl
2802 <<
"v.z() = " << v.
z() << G4endl << G4endl
2803 <<
"Proposed distance :" << G4endl << G4endl
2804 <<
"snxt = " << snxt/
mm <<
" mm" <<
G4endl;
2805 message.precision(oldprc);
G4double halfCarTolerance
static const double halfpi
static const G4double kInfinity
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double halfAngTolerance