722 const G4double dRmax = 50*(fRmax1+fRmax2);
724 G4double tanRMax,secRMax,rMaxAv,rMaxOAv ;
725 G4double tanRMin,secRMin,rMinAv,rMinOAv ;
728 G4double tolORMin,tolORMin2,tolIRMin,tolIRMin2 ;
729 G4double tolORMax2,tolIRMax,tolIRMax2 ;
732 G4double Dist,sd,xi,yi,zi,ri=0.,risec,rhoi2,cosPsi ;
742 tanRMin = (fRmin2 - fRmin1)*0.5/fDz ;
743 secRMin = std::sqrt(1.0 + tanRMin*tanRMin) ;
744 rMinAv = (fRmin1 + fRmin2)*0.5 ;
746 if (rMinAv > halfRadTolerance)
748 rMinOAv = rMinAv - halfRadTolerance ;
754 tanRMax = (fRmax2 - fRmax1)*0.5/fDz ;
755 secRMax = std::sqrt(1.0 + tanRMax*tanRMax) ;
756 rMaxAv = (fRmax1 + fRmax2)*0.5 ;
757 rMaxOAv = rMaxAv + halfRadTolerance ;
761 tolIDz = fDz - halfCarTolerance ;
762 tolODz = fDz + halfCarTolerance ;
764 if (std::fabs(p.
z()) >= tolIDz)
766 if ( p.
z()*v.
z() < 0 )
768 sd = (std::fabs(p.
z()) - fDz)/std::fabs(v.
z()) ;
770 if( sd < 0.0 ) { sd = 0.0; }
772 xi = p.
x() + sd*v.
x() ;
773 yi = p.
y() + sd*v.
y() ;
774 rhoi2 = xi*xi + yi*yi ;
781 tolORMin = fRmin1 - halfRadTolerance*secRMin ;
782 tolIRMin = fRmin1 + halfRadTolerance*secRMin ;
783 tolIRMax = fRmax1 - halfRadTolerance*secRMin ;
784 tolORMax2 = (fRmax1 + halfRadTolerance*secRMax)*
785 (fRmax1 + halfRadTolerance*secRMax) ;
789 tolORMin = fRmin2 - halfRadTolerance*secRMin ;
790 tolIRMin = fRmin2 + halfRadTolerance*secRMin ;
791 tolIRMax = fRmax2 - halfRadTolerance*secRMin ;
792 tolORMax2 = (fRmax2 + halfRadTolerance*secRMax)*
793 (fRmax2 + halfRadTolerance*secRMax) ;
797 tolORMin2 = tolORMin*tolORMin ;
798 tolIRMin2 = tolIRMin*tolIRMin ;
805 if ( tolIRMax > 0 ) { tolIRMax2 = tolIRMax*tolIRMax; }
806 else { tolIRMax2 = 0.0; }
808 if ( (tolIRMin2 <= rhoi2) && (rhoi2 <= tolIRMax2) )
810 if ( !fPhiFullCone && rhoi2 )
814 cosPsi = (xi*cosCPhi + yi*sinCPhi)/std::sqrt(rhoi2) ;
816 if (cosPsi >= cosHDPhiIT) {
return sd; }
849 t1 = 1.0 - v.
z()*v.
z() ;
850 t2 = p.
x()*v.
x() + p.
y()*v.
y() ;
851 t3 = p.
x()*p.
x() + p.
y()*p.
y() ;
852 rin = tanRMin*p.
z() + rMinAv ;
853 rout = tanRMax*p.
z() + rMaxAv ;
858 nt1 = t1 - (tanRMax*v.
z())*(tanRMax*v.
z()) ;
859 nt2 = t2 - tanRMax*v.
z()*rout ;
860 nt3 = t3 - rout*rout ;
862 if (std::fabs(nt1) > kRadTolerance)
867 if ( (nt3 > rout*rout*kRadTolerance*kRadTolerance*secRMax*secRMax)
876 if ((rout < 0) && (nt3 <= 0))
881 if (b>0) { sd = c/(-b-std::sqrt(d)); }
882 else { sd = -b + std::sqrt(d); }
886 if ((b <= 0) && (c >= 0))
888 sd=c/(-b+std::sqrt(d));
894 sd = -b + std::sqrt(d) ;
895 if((sd<0) & (sd>-halfRadTolerance)) sd=0;
907 G4double fTerm = sd-std::fmod(sd,dRmax);
910 zi = p.
z() + sd*v.
z() ;
912 if (std::fabs(zi) <= tolODz)
916 if ( fPhiFullCone ) {
return sd; }
919 xi = p.
x() + sd*v.
x() ;
920 yi = p.
y() + sd*v.
y() ;
921 ri = rMaxAv + zi*tanRMax ;
922 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
924 if ( cosPsi >= cosHDPhiIT ) {
return sd; }
935 if ( ( t3 > (rin + halfRadTolerance*secRMin)*
936 (rin + halfRadTolerance*secRMin) )
937 && (nt2 < 0) && (d >= 0) && (std::fabs(p.
z()) <= tolIDz) )
944 risec = std::sqrt(xi*xi + yi*yi)*secRMax ;
948 cosPsi = (p.
x()*cosCPhi + p.
y()*sinCPhi)/std::sqrt(t3) ;
949 if ( cosPsi >= cosHDPhiIT )
951 if ( Normal.
dot(v) <= 0 ) {
return 0.0; }
956 if ( Normal.
dot(v) <= 0 ) {
return 0.0; }
963 if ( std::fabs(nt2) > kRadTolerance )
967 if ( sd < 0 ) {
return kInfinity; }
970 zi = p.
z() + sd*v.
z() ;
972 if ((std::fabs(zi) <= tolODz) && (nt2 < 0))
976 if ( fPhiFullCone ) {
return sd; }
979 xi = p.
x() + sd*v.
x() ;
980 yi = p.
y() + sd*v.
y() ;
981 ri = rMaxAv + zi*tanRMax ;
982 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
984 if (cosPsi >= cosHDPhiIT) {
return sd; }
1006 nt1 = t1 - (tanRMin*v.
z())*(tanRMin*v.
z()) ;
1007 nt2 = t2 - tanRMin*v.
z()*rin ;
1008 nt3 = t3 - rin*rin ;
1012 if ( nt3 > rin*kRadTolerance*secRMin )
1022 if(b>0){sd = c/( -b-std::sqrt(d));}
1023 else {sd = -b + std::sqrt(d) ;}
1029 G4double fTerm = sd-std::fmod(sd,dRmax);
1032 zi = p.
z() + sd*v.
z() ;
1034 if ( std::fabs(zi) <= tolODz )
1036 if ( !fPhiFullCone )
1038 xi = p.
x() + sd*v.
x() ;
1039 yi = p.
y() + sd*v.
y() ;
1040 ri = rMinAv + zi*tanRMin ;
1041 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
1043 if (cosPsi >= cosHDPhiIT)
1045 if ( sd > halfRadTolerance ) { snxt=sd; }
1050 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1051 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin);
1052 if ( Normal.
dot(v) <= 0 ) { snxt = sd; }
1058 if ( sd > halfRadTolerance ) {
return sd; }
1063 xi = p.
x() + sd*v.
x() ;
1064 yi = p.
y() + sd*v.
y() ;
1065 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1066 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin) ;
1067 if ( Normal.
dot(v) <= 0 ) {
return sd; }
1074 else if ( nt3 < -rin*kRadTolerance*secRMin )
1087 if (b>0) { sd = c/(-b-std::sqrt(d)); }
1088 else { sd = -b + std::sqrt(d); }
1089 zi = p.
z() + sd*v.
z() ;
1090 ri = rMinAv + zi*tanRMin ;
1094 if ( (sd >= 0) && (std::fabs(zi) <= tolODz) )
1098 G4double fTerm = sd-std::fmod(sd,dRmax);
1101 if ( !fPhiFullCone )
1103 xi = p.
x() + sd*v.
x() ;
1104 yi = p.
y() + sd*v.
y() ;
1105 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
1107 if (cosPsi >= cosHDPhiOT)
1109 if ( sd > halfRadTolerance ) { snxt=sd; }
1114 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1115 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin);
1116 if ( Normal.
dot(v) <= 0 ) { snxt = sd; }
1122 if( sd > halfRadTolerance ) {
return sd; }
1127 xi = p.
x() + sd*v.
x() ;
1128 yi = p.
y() + sd*v.
y() ;
1129 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1130 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin) ;
1131 if ( Normal.
dot(v) <= 0 ) {
return sd; }
1138 if (b>0) { sd = -b - std::sqrt(d); }
1139 else { sd = c/(-b+std::sqrt(d)); }
1140 zi = p.
z() + sd*v.
z() ;
1141 ri = rMinAv + zi*tanRMin ;
1143 if ( (sd >= 0) && (ri > 0) && (std::fabs(zi) <= tolODz) )
1147 G4double fTerm = sd-std::fmod(sd,dRmax);
1150 if ( !fPhiFullCone )
1152 xi = p.
x() + sd*v.
x() ;
1153 yi = p.
y() + sd*v.
y() ;
1154 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
1156 if (cosPsi >= cosHDPhiIT)
1158 if ( sd > halfRadTolerance ) { snxt=sd; }
1163 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1164 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin);
1165 if ( Normal.
dot(v) <= 0 ) { snxt = sd; }
1171 if ( sd > halfRadTolerance ) {
return sd; }
1176 xi = p.
x() + sd*v.
x() ;
1177 yi = p.
y() + sd*v.
y() ;
1178 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1179 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin) ;
1180 if ( Normal.
dot(v) <= 0 ) {
return sd; }
1194 if ( std::fabs(p.
z()) <= tolODz )
1200 if ( !fPhiFullCone )
1202 cosPsi = (p.
x()*cosCPhi + p.
y()*sinCPhi)/std::sqrt(t3) ;
1204 if (cosPsi >= cosHDPhiIT) {
return 0.0; }
1206 else {
return 0.0; }
1219 if (b>0) { sd = -b - std::sqrt(d); }
1220 else { sd = c/(-b+std::sqrt(d)); }
1221 zi = p.
z() + sd*v.
z() ;
1222 ri = rMinAv + zi*tanRMin ;
1226 if (b>0) { sd = c/(-b-std::sqrt(d)); }
1227 else { sd = -b + std::sqrt(d); }
1229 zi = p.
z() + sd*v.
z() ;
1231 if ( (sd >= 0) && (std::fabs(zi) <= tolODz) )
1235 G4double fTerm = sd-std::fmod(sd,dRmax);
1238 if ( !fPhiFullCone )
1240 xi = p.
x() + sd*v.
x() ;
1241 yi = p.
y() + sd*v.
y() ;
1242 ri = rMinAv + zi*tanRMin ;
1243 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
1245 if ( cosPsi >= cosHDPhiIT ) { snxt = sd; }
1250 else {
return kInfinity; }
1262 if (b>0) { sd = c/(-b-std::sqrt(d)); }
1263 else { sd = -b + std::sqrt(d) ; }
1264 zi = p.
z() + sd*v.
z() ;
1266 if ( (sd >= 0) && (std::fabs(zi) <= tolODz) )
1270 G4double fTerm = sd-std::fmod(sd,dRmax);
1273 if ( !fPhiFullCone )
1275 xi = p.
x() + sd*v.
x();
1276 yi = p.
y() + sd*v.
y();
1277 ri = rMinAv + zi*tanRMin ;
1278 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri;
1280 if (cosPsi >= cosHDPhiIT) { snxt = sd; }
1299 if ( !fPhiFullCone )
1303 Comp = v.
x()*sinSPhi - v.
y()*cosSPhi ;
1307 Dist = (p.
y()*cosSPhi - p.
x()*sinSPhi) ;
1309 if (Dist < halfCarTolerance)
1315 if ( sd < 0 ) { sd = 0.0; }
1317 zi = p.
z() + sd*v.
z() ;
1319 if ( std::fabs(zi) <= tolODz )
1321 xi = p.
x() + sd*v.
x() ;
1322 yi = p.
y() + sd*v.
y() ;
1323 rhoi2 = xi*xi + yi*yi ;
1324 tolORMin2 = (rMinOAv + zi*tanRMin)*(rMinOAv + zi*tanRMin) ;
1325 tolORMax2 = (rMaxOAv + zi*tanRMax)*(rMaxOAv + zi*tanRMax) ;
1327 if ( (rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2) )
1332 if ((yi*cosCPhi - xi*sinCPhi) <= 0 ) { snxt = sd; }
1341 Comp = -(v.
x()*sinEPhi - v.
y()*cosEPhi) ;
1345 Dist = -(p.
y()*cosEPhi - p.
x()*sinEPhi) ;
1346 if (Dist < halfCarTolerance)
1352 if ( sd < 0 ) { sd = 0.0; }
1354 zi = p.
z() + sd*v.
z() ;
1356 if (std::fabs(zi) <= tolODz)
1358 xi = p.
x() + sd*v.
x() ;
1359 yi = p.
y() + sd*v.
y() ;
1360 rhoi2 = xi*xi + yi*yi ;
1361 tolORMin2 = (rMinOAv + zi*tanRMin)*(rMinOAv + zi*tanRMin) ;
1362 tolORMax2 = (rMaxOAv + zi*tanRMax)*(rMaxOAv + zi*tanRMax) ;
1364 if ( (rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2) )
1369 if ( (yi*cosCPhi - xi*sinCPhi) >= 0.0 ) { snxt = sd; }
1376 if (snxt < halfCarTolerance) { snxt = 0.; }
CLHEP::Hep3Vector G4ThreeVector
double dot(const Hep3Vector &) const
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const