Changeset 921 for trunk/source/geometry/solids/CSG/src/G4Cons.cc
- Timestamp:
- Feb 16, 2009, 10:14:30 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/geometry/solids/CSG/src/G4Cons.cc
r850 r921 25 25 // 26 26 // 27 // $Id: G4Cons.cc,v 1. 56 2008/02/20 08:56:16gcosmo Exp $28 // GEANT4 tag $Name: HEAD$27 // $Id: G4Cons.cc,v 1.60 2008/11/06 15:26:53 gcosmo Exp $ 28 // GEANT4 tag $Name: geant4-09-02-cand-01 $ 29 29 // 30 30 // … … 87 87 88 88 if ( pDz > 0 ) 89 fDz = pDz ; 89 { 90 fDz = pDz; 91 } 90 92 else 91 93 { … … 99 101 // Check radii 100 102 101 if ( pRmin1 < pRmax1 && pRmin2 < pRmax2 && pRmin1 >= 0 && pRmin2 >= 0)103 if ( (pRmin1<pRmax1) && (pRmin2<pRmax2) && (pRmin1>=0) && (pRmin2>=0) ) 102 104 { 103 105 … … 106 108 fRmin2 = pRmin2 ; 107 109 fRmax2 = pRmax2 ; 108 if( (pRmin1 == 0.0 && pRmin2 > 0.0) ) fRmin1 = 1e3*kRadTolerance ;109 if( (pRmin2 == 0.0 && pRmin1 > 0.0) ) fRmin2 = 1e3*kRadTolerance ;110 if( (pRmin1 == 0.0) && (pRmin2 > 0.0) ) { fRmin1 = 1e3*kRadTolerance ; } 111 if( (pRmin2 == 0.0) && (pRmin1 > 0.0) ) { fRmin2 = 1e3*kRadTolerance ; } 110 112 } 111 113 else … … 119 121 } 120 122 121 // Check angles 122 123 if ( pDPhi >= twopi ) 123 fPhiFullCone = true; 124 if ( pDPhi >= twopi-kAngTolerance*0.5 ) // Check angles 124 125 { 125 126 fDPhi=twopi; … … 128 129 else 129 130 { 130 if ( pDPhi > 0 ) fDPhi = pDPhi ; 131 fPhiFullCone = false; 132 if ( pDPhi > 0 ) 133 { 134 fDPhi = pDPhi; 135 } 131 136 else 132 137 { … … 135 140 << pDPhi << G4endl; 136 141 G4Exception("G4Cons::G4Cons()", "InvalidSetup", 137 FatalException, "Invalid pDPhi.") ; 138 } 139 140 // Ensure pSPhi in 0-2PI or -2PI-0 range if shape crosses 0 141 142 if ( pSPhi < 0 ) fSPhi = twopi - std::fmod(std::fabs(pSPhi),twopi) ; 143 else fSPhi = std::fmod(pSPhi,twopi) ; 144 145 if (fSPhi + fDPhi > twopi) fSPhi -= twopi ; 146 } 142 FatalException, "Invalid dphi."); 143 } 144 145 // Ensure fSphi in 0-2PI or -2PI-0 range if shape crosses 0 146 147 if ( pSPhi < 0 ) 148 { 149 fSPhi = twopi - std::fmod(std::fabs(pSPhi),twopi); 150 } 151 else 152 { 153 fSPhi = std::fmod(pSPhi,twopi) ; 154 } 155 if ( fSPhi+fDPhi > twopi ) 156 { 157 fSPhi -= twopi ; 158 } 159 } 160 InitializeTrigonometry(); 147 161 } 148 162 … … 173 187 G4double r2, rl, rh, pPhi, tolRMin, tolRMax; // rh2, rl2 ; 174 188 EInside in; 175 176 if (std::fabs(p.z()) > fDz + kCarTolerance*0.5 ) return in = kOutside; 177 else if(std::fabs(p.z()) >= fDz - kCarTolerance*0.5 ) in = kSurface; 178 else in = kInside; 189 static const G4double halfCarTolerance=kCarTolerance*0.5; 190 static const G4double halfRadTolerance=kRadTolerance*0.5; 191 static const G4double halfAngTolerance=kAngTolerance*0.5; 192 193 if (std::fabs(p.z()) > fDz + halfCarTolerance ) { return in = kOutside; } 194 else if(std::fabs(p.z()) >= fDz - halfCarTolerance ) { in = kSurface; } 195 else { in = kInside; } 179 196 180 197 r2 = p.x()*p.x() + p.y()*p.y() ; … … 184 201 // rh2 = rh*rh; 185 202 186 tolRMin = rl - kRadTolerance*0.5;187 if ( tolRMin < 0 ) tolRMin = 0 ;188 tolRMax = rh + kRadTolerance*0.5;189 190 if ( r2 < tolRMin*tolRMin || r2 > tolRMax*tolRMax ) return in = kOutside;191 192 if (rl) tolRMin = rl + kRadTolerance*0.5 ;193 else tolRMin = 0.0 ;194 tolRMax = rh - kRadTolerance*0.5;203 tolRMin = rl - halfRadTolerance; 204 if ( tolRMin < 0 ) { tolRMin = 0; } 205 tolRMax = rh + halfRadTolerance; 206 207 if ( (r2<tolRMin*tolRMin) || (r2>tolRMax*tolRMax) ) { return in = kOutside; } 208 209 if (rl) { tolRMin = rl + halfRadTolerance; } 210 else { tolRMin = 0.0; } 211 tolRMax = rh - halfRadTolerance; 195 212 196 213 if (in == kInside) // else it's kSurface already 197 214 { 198 if (r2 < tolRMin*tolRMin || r2 >= tolRMax*tolRMax) in = kSurface; 199 // if (r2 <= tolRMin*tolRMin || r2-rh2 >= -rh*kRadTolerance) in = kSurface; 200 } 201 if ( ( fDPhi < twopi - kAngTolerance ) && 202 ( (p.x() != 0.0 ) || (p.y() != 0.0) ) ) 215 if ( (r2 < tolRMin*tolRMin) || (r2 >= tolRMax*tolRMax) ) { in = kSurface; } 216 } 217 if ( !fPhiFullCone && ((p.x() != 0.0) || (p.y() != 0.0)) ) 203 218 { 204 219 pPhi = std::atan2(p.y(),p.x()) ; 205 220 206 if ( pPhi < fSPhi - kAngTolerance*0.5 ) pPhi += twopi ;207 else if ( pPhi > fSPhi + fDPhi + kAngTolerance*0.5 ) pPhi -= twopi;221 if ( pPhi < fSPhi - halfAngTolerance ) { pPhi += twopi; } 222 else if ( pPhi > fSPhi + fDPhi + halfAngTolerance ) { pPhi -= twopi; } 208 223 209 if ( (pPhi < fSPhi - kAngTolerance*0.5) ||210 (pPhi > fSPhi + fDPhi + kAngTolerance*0.5) ) return in = kOutside;224 if ( (pPhi < fSPhi - halfAngTolerance) || 225 (pPhi > fSPhi + fDPhi + halfAngTolerance) ) { return in = kOutside; } 211 226 212 227 else if (in == kInside) // else it's kSurface anyway already 213 228 { 214 if ( (pPhi < fSPhi + kAngTolerance*0.5) ||215 (pPhi > fSPhi + fDPhi - kAngTolerance*0.5) ) in = kSurface ;216 } 217 } 218 else if ( fDPhi < twopi - kAngTolerance ) in = kSurface ;229 if ( (pPhi < fSPhi + halfAngTolerance) || 230 (pPhi > fSPhi + fDPhi - halfAngTolerance) ) { in = kSurface; } 231 } 232 } 233 else if ( !fPhiFullCone ) { in = kSurface; } 219 234 220 235 return in ; … … 244 259 G4double& pMax ) const 245 260 { 246 if ( !pTransform.IsRotated() && 247 fDPhi == twopi && fRmin1 == 0 && fRmin2 == 0)261 if ( !pTransform.IsRotated() && (fDPhi == twopi) 262 && (fRmin1 == 0) && (fRmin2 == 0) ) 248 263 { 249 264 // Special case handling for unrotated solid cones … … 265 280 if (pVoxelLimit.IsZLimited()) 266 281 { 267 if( zMin > pVoxelLimit.GetMaxZExtent() + kCarTolerance||268 zMax < pVoxelLimit.GetMinZExtent() - kCarTolerance)282 if( (zMin > pVoxelLimit.GetMaxZExtent() + kCarTolerance) || 283 (zMax < pVoxelLimit.GetMinZExtent() - kCarTolerance) ) 269 284 { 270 285 return false ; … … 290 305 if (pVoxelLimit.IsXLimited()) 291 306 { 292 if ( xMin > pVoxelLimit.GetMaxXExtent() + kCarTolerance||293 xMax < pVoxelLimit.GetMinXExtent() - kCarTolerance)307 if ( (xMin > pVoxelLimit.GetMaxXExtent() + kCarTolerance) || 308 (xMax < pVoxelLimit.GetMinXExtent() - kCarTolerance) ) 294 309 { 295 310 return false ; … … 315 330 if (pVoxelLimit.IsYLimited()) 316 331 { 317 if ( yMin > pVoxelLimit.GetMaxYExtent() + kCarTolerance||318 yMax < pVoxelLimit.GetMinYExtent() - kCarTolerance)332 if ( (yMin > pVoxelLimit.GetMaxYExtent() + kCarTolerance) || 333 (yMax < pVoxelLimit.GetMinYExtent() - kCarTolerance) ) 319 334 { 320 335 return false ; … … 338 353 yoff2 = yMax - yoffset ; 339 354 340 if ( yoff1 >= 0 && yoff2 >= 0) // Y limits cross max/min x => no change341 { 355 if ((yoff1 >= 0) && (yoff2 >= 0)) // Y limits cross max/min x 356 { // => no change 342 357 pMin = xMin ; 343 358 pMax = xMax ; … … 362 377 xoff2 = xMax - xoffset ; 363 378 364 if ( xoff1 >= 0 && xoff2 >= 0 ) // X limits cross max/min y => no change365 { 379 if ((xoff1 >= 0) && (xoff2 >= 0) ) // X limits cross max/min y 380 { // => no change 366 381 pMin = yMin ; 367 382 pMax = yMax ; … … 409 424 for ( i = 0 ; i < noEntries ; i += 4 ) 410 425 { 411 ClipCrossSection(vertices, i,pVoxelLimit,pAxis,pMin,pMax) ;426 ClipCrossSection(vertices, i, pVoxelLimit, pAxis, pMin, pMax) ; 412 427 } 413 428 for ( i = 0 ; i < noBetweenSections4 ; i += 4 ) 414 429 { 415 ClipBetweenSections(vertices, i,pVoxelLimit,pAxis,pMin,pMax) ;430 ClipBetweenSections(vertices, i, pVoxelLimit, pAxis, pMin, pMax) ; 416 431 } 417 if ( pMin != kInfinity || pMax != -kInfinity)432 if ( (pMin != kInfinity) || (pMax != -kInfinity) ) 418 433 { 419 434 existsAfterClip = true ; … … 462 477 G4double tanRMin, secRMin, pRMin, widRMin; 463 478 G4double tanRMax, secRMax, pRMax, widRMax; 464 G4double delta = 0.5*kCarTolerance, dAngle = 0.5*kAngTolerance; 479 480 static const G4double delta = 0.5*kCarTolerance; 481 static const G4double dAngle = 0.5*kAngTolerance; 465 482 466 G4ThreeVector norm, sumnorm(0.,0.,0.), nZ = G4ThreeVector(0.,0.,1. 0);483 G4ThreeVector norm, sumnorm(0.,0.,0.), nZ = G4ThreeVector(0.,0.,1.); 467 484 G4ThreeVector nR, nr(0.,0.,0.), nPs, nPe; 468 485 … … 482 499 distRMax = std::fabs(pRMax - widRMax)/secRMax; 483 500 484 if ( fDPhi < twopi) // && rho )// Protected against (0,0,z)501 if (!fPhiFullCone) // Protected against (0,0,z) 485 502 { 486 503 if ( rho ) … … 488 505 pPhi = std::atan2(p.y(),p.x()); 489 506 490 if (pPhi < fSPhi-delta) pPhi += twopi;491 else if (pPhi > fSPhi+fDPhi+delta) pPhi -= twopi;507 if (pPhi < fSPhi-delta) { pPhi += twopi; } 508 else if (pPhi > fSPhi+fDPhi+delta) { pPhi -= twopi; } 492 509 493 510 distSPhi = std::fabs( pPhi - fSPhi ); 494 distEPhi = std::fabs( pPhi - fSPhi - fDPhi);511 distEPhi = std::fabs( pPhi - fSPhi - fDPhi ); 495 512 } 496 513 else if( !(fRmin1) || !(fRmin2) ) … … 499 516 distEPhi = 0.; 500 517 } 501 nPs = G4ThreeVector(std::sin(fSPhi), -std::cos(fSPhi),0);502 nPe = G4ThreeVector(-std::sin(fSPhi+fDPhi), std::cos(fSPhi+fDPhi),0);518 nPs = G4ThreeVector(std::sin(fSPhi), -std::cos(fSPhi), 0); 519 nPe = G4ThreeVector(-std::sin(fSPhi+fDPhi), std::cos(fSPhi+fDPhi), 0); 503 520 } 504 521 if ( rho > delta ) 505 522 { 506 nR = G4ThreeVector(p.x()/rho/secRMax,p.y()/rho/secRMax,-tanRMax/secRMax); 507 if (fRmin1 || fRmin2) nr = G4ThreeVector(-p.x()/rho/secRMin,-p.y()/rho/secRMin,tanRMin/secRMin); 523 nR = G4ThreeVector(p.x()/rho/secRMax, p.y()/rho/secRMax, -tanRMax/secRMax); 524 if (fRmin1 || fRmin2) 525 { 526 nr = G4ThreeVector(-p.x()/rho/secRMin,-p.y()/rho/secRMin,tanRMin/secRMin); 527 } 508 528 } 509 529 … … 513 533 sumnorm += nR; 514 534 } 515 if( (fRmin1 || fRmin2) && distRMin <= delta)535 if( (fRmin1 || fRmin2) && (distRMin <= delta) ) 516 536 { 517 537 noSurfaces ++; 518 538 sumnorm += nr; 519 539 } 520 if( fDPhi < twopi)540 if( !fPhiFullCone ) 521 541 { 522 542 if (distSPhi <= dAngle) … … 534 554 { 535 555 noSurfaces ++; 536 if ( p.z() >= 0.) sumnorm += nZ;537 else sumnorm -= nZ;556 if ( p.z() >= 0.) { sumnorm += nZ; } 557 else { sumnorm -= nZ; } 538 558 } 539 559 if ( noSurfaces == 0 ) … … 545 565 norm = ApproxSurfaceNormal(p); 546 566 } 547 else if ( noSurfaces == 1 ) norm = sumnorm; 548 else norm = sumnorm.unit(); 567 else if ( noSurfaces == 1 ) { norm = sumnorm; } 568 else { norm = sumnorm.unit(); } 569 549 570 return norm ; 550 571 } 551 572 552 //////////////////////////////////////////////////////////////////////////// //////573 //////////////////////////////////////////////////////////////////////////// 553 574 // 554 575 // Algorithm for SurfaceNormal() following the original specification … … 605 626 } 606 627 } 607 if ( fDPhi < twopi&& rho ) // Protected against (0,0,z)628 if ( !fPhiFullCone && rho ) // Protected against (0,0,z) 608 629 { 609 630 phi = std::atan2(p.y(),p.x()) ; 610 631 611 if (phi < 0) phi += twopi ;612 613 if (fSPhi < 0) distSPhi = std::fabs(phi - (fSPhi + twopi))*rho ;614 else distSPhi = std::fabs(phi - fSPhi)*rho ;632 if (phi < 0) { phi += twopi; } 633 634 if (fSPhi < 0) { distSPhi = std::fabs(phi - (fSPhi + twopi))*rho; } 635 else { distSPhi = std::fabs(phi - fSPhi)*rho; } 615 636 616 637 distEPhi = std::fabs(phi - fSPhi - fDPhi)*rho ; … … 620 641 if (distSPhi < distEPhi) 621 642 { 622 if (distSPhi < distMin) side = kNSPhi ;643 if (distSPhi < distMin) { side = kNSPhi; } 623 644 } 624 645 else 625 646 { 626 if (distEPhi < distMin) side = kNEPhi ;647 if (distEPhi < distMin) { side = kNEPhi; } 627 648 } 628 649 } … … 631 652 case kNRMin: // Inner radius 632 653 rho *= secRMin ; 633 norm = G4ThreeVector(-p.x()/rho, -p.y()/rho,tanRMin/secRMin) ;654 norm = G4ThreeVector(-p.x()/rho, -p.y()/rho, tanRMin/secRMin) ; 634 655 break ; 635 656 case kNRMax: // Outer radius 636 657 rho *= secRMax ; 637 norm = G4ThreeVector(p.x()/rho, p.y()/rho,-tanRMax/secRMax) ;658 norm = G4ThreeVector(p.x()/rho, p.y()/rho, -tanRMax/secRMax) ; 638 659 break ; 639 660 case kNZ: // +/- dz 640 if (p.z() > 0) norm = G4ThreeVector(0,0,1) ;641 else norm = G4ThreeVector(0,0,-1) ;661 if (p.z() > 0) { norm = G4ThreeVector(0,0,1); } 662 else { norm = G4ThreeVector(0,0,-1); } 642 663 break ; 643 664 case kNSPhi: 644 norm = G4ThreeVector(std::sin(fSPhi), -std::cos(fSPhi),0) ;665 norm = G4ThreeVector(std::sin(fSPhi), -std::cos(fSPhi), 0) ; 645 666 break ; 646 667 case kNEPhi: 647 norm=G4ThreeVector(-std::sin(fSPhi+fDPhi), std::cos(fSPhi+fDPhi),0) ;668 norm=G4ThreeVector(-std::sin(fSPhi+fDPhi), std::cos(fSPhi+fDPhi), 0) ; 648 669 break ; 649 670 default: … … 677 698 // 678 699 // NOTE: 679 // - Precalculations for phi trigonometry are Done `just in time'680 700 // - `if valid' implies tolerant checking of intersection points 681 701 // - z, phi intersection from Tubs … … 686 706 G4double snxt = kInfinity ; // snxt = default return value 687 707 688 G4bool seg ; // true if segmented in phi 689 G4double hDPhi,hDPhiOT,hDPhiIT,cosHDPhiOT=0.,cosHDPhiIT=0. ; 690 // half dphi + outer tolerance 691 G4double cPhi,sinCPhi=0.,cosCPhi=0. ; // central phi 708 static const G4double halfCarTolerance=kCarTolerance*0.5; 709 static const G4double halfRadTolerance=kRadTolerance*0.5; 692 710 693 711 G4double tanRMax,secRMax,rMaxAv,rMaxOAv ; // Data for cones … … 704 722 G4double nt1,nt2,nt3 ; 705 723 G4double Comp ; 706 G4double cosSPhi,sinSPhi ; // Trig for phi start intersect707 G4double ePhi,cosEPhi,sinEPhi ; // for phi end intersect708 709 //710 // Set phi divided flag and precalcs711 //712 if (fDPhi < twopi)713 {714 seg = true ;715 hDPhi = 0.5*fDPhi ; // half delta phi716 cPhi = fSPhi + hDPhi ; ;717 hDPhiOT = hDPhi + 0.5*kAngTolerance ; // outers tol' half delta phi718 hDPhiIT = hDPhi - 0.5*kAngTolerance ;719 sinCPhi = std::sin(cPhi) ;720 cosCPhi = std::cos(cPhi) ;721 cosHDPhiOT = std::cos(hDPhiOT) ;722 cosHDPhiIT = std::cos(hDPhiIT) ;723 }724 else seg = false ;725 724 726 725 // Cone Precalcs … … 730 729 rMinAv = (fRmin1 + fRmin2)*0.5 ; 731 730 732 if (rMinAv > kRadTolerance*0.5)733 { 734 rMinOAv = rMinAv - kRadTolerance*0.5;735 rMinIAv = rMinAv + kRadTolerance*0.5;731 if (rMinAv > halfRadTolerance) 732 { 733 rMinOAv = rMinAv - halfRadTolerance ; 734 rMinIAv = rMinAv + halfRadTolerance ; 736 735 } 737 736 else … … 743 742 secRMax = std::sqrt(1.0 + tanRMax*tanRMax) ; 744 743 rMaxAv = (fRmax1 + fRmax2)*0.5 ; 745 rMaxOAv = rMaxAv + kRadTolerance*0.5;744 rMaxOAv = rMaxAv + halfRadTolerance ; 746 745 747 746 // Intersection with z-surfaces 748 747 749 tolIDz = fDz - kCarTolerance*0.5;750 tolODz = fDz + kCarTolerance*0.5;748 tolIDz = fDz - halfCarTolerance ; 749 tolODz = fDz + halfCarTolerance ; 751 750 752 751 if (std::fabs(p.z()) >= tolIDz) … … 756 755 s = (std::fabs(p.z()) - fDz)/std::fabs(v.z()) ; // Z intersect distance 757 756 758 if( s < 0.0 ) s = 0.0 ;// negative dist -> zero757 if( s < 0.0 ) { s = 0.0; } // negative dist -> zero 759 758 760 759 xi = p.x() + s*v.x() ; // Intersection coords 761 760 yi = p.y() + s*v.y() ; 762 rhoi2 = xi*xi + yi*yi 761 rhoi2 = xi*xi + yi*yi ; 763 762 764 763 // Check validity of intersection … … 767 766 if (v.z() > 0) 768 767 { 769 tolORMin = fRmin1 - 0.5*kRadTolerance*secRMin ;770 tolIRMin = fRmin1 + 0.5*kRadTolerance*secRMin ;771 tolIRMax = fRmax1 - 0.5*kRadTolerance*secRMin ;772 tolORMax2 = (fRmax1 + 0.5*kRadTolerance*secRMax)*773 (fRmax1 + 0.5*kRadTolerance*secRMax) ;768 tolORMin = fRmin1 - halfRadTolerance*secRMin ; 769 tolIRMin = fRmin1 + halfRadTolerance*secRMin ; 770 tolIRMax = fRmax1 - halfRadTolerance*secRMin ; 771 tolORMax2 = (fRmax1 + halfRadTolerance*secRMax)* 772 (fRmax1 + halfRadTolerance*secRMax) ; 774 773 } 775 774 else 776 775 { 777 tolORMin = fRmin2 - 0.5*kRadTolerance*secRMin ;778 tolIRMin = fRmin2 + 0.5*kRadTolerance*secRMin ;779 tolIRMax = fRmax2 - 0.5*kRadTolerance*secRMin ;780 tolORMax2 = (fRmax2 + 0.5*kRadTolerance*secRMax)*781 (fRmax2 + 0.5*kRadTolerance*secRMax) ;776 tolORMin = fRmin2 - halfRadTolerance*secRMin ; 777 tolIRMin = fRmin2 + halfRadTolerance*secRMin ; 778 tolIRMax = fRmax2 - halfRadTolerance*secRMin ; 779 tolORMax2 = (fRmax2 + halfRadTolerance*secRMax)* 780 (fRmax2 + halfRadTolerance*secRMax) ; 782 781 } 783 782 if ( tolORMin > 0 ) … … 791 790 tolIRMin2 = 0.0 ; 792 791 } 793 if ( tolIRMax > 0 ) tolIRMax2 = tolIRMax*tolIRMax ;794 else tolIRMax2 = 0.0 ;792 if ( tolIRMax > 0 ) { tolIRMax2 = tolIRMax*tolIRMax; } 793 else { tolIRMax2 = 0.0; } 795 794 796 if (tolIRMin2 <= rhoi2 && rhoi2 <= tolIRMax2) 797 { 798 if ( seg && rhoi2 ) 799 { 800 // Psi = angle made with central (average) phi of shape 801 802 cosPsi = (xi*cosCPhi + yi*sinCPhi)/std::sqrt(rhoi2) ; 803 804 if (cosPsi >= cosHDPhiIT) return s ; 805 } 806 else return s ; 807 } 808 /* 809 else if (tolORMin2 <= rhoi2 && rhoi2 <= tolORMax2) 810 { 811 if ( seg && rhoi2 ) 812 { 813 // Psi = angle made with central (average) phi of shape 814 815 cosPsi = (xi*cosCPhi + yi*sinCPhi)/std::sqrt(rhoi2) ; 816 817 if (cosPsi >= cosHDPhiIT) return s ; 818 } 819 else return s ; 820 } 821 */ 795 if ( (tolIRMin2 <= rhoi2) && (rhoi2 <= tolIRMax2) ) 796 { 797 if ( !fPhiFullCone && rhoi2 ) 798 { 799 // Psi = angle made with central (average) phi of shape 800 801 cosPsi = (xi*cosCPhi + yi*sinCPhi)/std::sqrt(rhoi2) ; 802 803 if (cosPsi >= cosHDPhiIT) { return s; } 804 } 805 else 806 { 807 return s; 808 } 809 } 822 810 } 823 811 else // On/outside extent, and heading away -> cannot intersect … … 861 849 if (std::fabs(nt1) > kRadTolerance) // Equation quadratic => 2 roots 862 850 { 863 b = nt2/nt1;864 c = nt3/nt1;865 d = b*b-c;866 if ( nt3 > rout*kRadTolerance*secRMax || rout < 0)851 b = nt2/nt1; 852 c = nt3/nt1; 853 d = b*b-c ; 854 if ( (nt3 > rout*kRadTolerance*secRMax) || (rout < 0) ) 867 855 { 868 856 // If outside real cone (should be rho-rout>kRadTolerance*0.5 869 857 // NOT rho^2 etc) saves a std::sqrt() at expense of accuracy 870 858 871 872 859 if (d >= 0) 873 860 { 874 861 875 if ( rout < 0 && nt3 <= 0)862 if ((rout < 0) && (nt3 <= 0)) 876 863 { 877 864 // Inside `shadow cone' with -ve radius … … 882 869 else 883 870 { 884 if ( b <= 0 && c >= 0) // both >=0, try smaller root871 if ((b <= 0) && (c >= 0)) // both >=0, try smaller root 885 872 { 886 873 s = -b - std::sqrt(d) ; … … 906 893 // Z ok. Check phi intersection if reqd 907 894 908 if ( ! seg ) return s ;895 if ( fPhiFullCone ) { return s; } 909 896 else 910 897 { … … 914 901 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ; 915 902 916 if ( cosPsi >= cosHDPhiIT ) return s ;903 if ( cosPsi >= cosHDPhiIT ) { return s; } 917 904 } 918 905 } … … 925 912 // check not inside, and heading through G4Cons (-> 0 to in) 926 913 927 if ( t3 > (rin + kRadTolerance*0.5*secRMin)* 928 (rin + kRadTolerance*0.5*secRMin) && 929 nt2 < 0 && 930 d >= 0 && 931 // nt2 < -kCarTolerance*secRMax/2/fDz && 932 // t2 < std::sqrt(t3)*v.z()*tanRMax && 933 // d > kCarTolerance*secRMax*(rout-b*tanRMax*v.z())/nt1 && 934 std::fabs(p.z()) <= tolIDz ) 914 if ( ( t3 > (rin + halfRadTolerance*secRMin)* 915 (rin + halfRadTolerance*secRMin) ) 916 && (nt2 < 0) && (d >= 0) && (std::fabs(p.z()) <= tolIDz) ) 935 917 { 936 918 // Inside cones, delta r -ve, inside z extent 937 919 938 if ( seg)920 if ( !fPhiFullCone ) 939 921 { 940 922 cosPsi = (p.x()*cosCPhi + p.y()*sinCPhi)/std::sqrt(t3) ; 941 923 942 if (cosPsi >= cosHDPhiIT) return 0.0 ;943 } 944 else return 0.0 ;924 if (cosPsi >= cosHDPhiIT) { return 0.0; } 925 } 926 else { return 0.0; } 945 927 } 946 928 } … … 952 934 s = -0.5*nt3/nt2 ; 953 935 954 if ( s < 0 ) return kInfinity ;// travel away936 if ( s < 0 ) { return kInfinity; } // travel away 955 937 else // s >= 0, If 'forwards'. Check z intersection 956 938 { 957 939 zi = p.z() + s*v.z() ; 958 940 959 if ( std::fabs(zi) <= tolODz && nt2 < 0)941 if ((std::fabs(zi) <= tolODz) && (nt2 < 0)) 960 942 { 961 943 // Z ok. Check phi intersection if reqd 962 944 963 if ( ! seg ) return s ;945 if ( fPhiFullCone ) { return s; } 964 946 else 965 947 { … … 969 951 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ; 970 952 971 if (cosPsi >= cosHDPhiIT) return s ;953 if (cosPsi >= cosHDPhiIT) { return s; } 972 954 } 973 955 } … … 1015 997 if ( std::fabs(zi) <= tolODz ) 1016 998 { 1017 if ( seg)999 if ( !fPhiFullCone ) 1018 1000 { 1019 1001 xi = p.x() + s*v.x() ; … … 1022 1004 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ; 1023 1005 1024 if (cosPsi >= cosHDPhiIT) snxt = s ;1006 if (cosPsi >= cosHDPhiIT) { snxt = s; } 1025 1007 } 1026 else return s ;1008 else { return s; } 1027 1009 } 1028 1010 } … … 1046 1028 ri = rMinAv + zi*tanRMin ; 1047 1029 1048 if ( ri > =0 )1030 if ( ri > 0 ) 1049 1031 { 1050 if ( s >= 0 && std::fabs(zi) <= tolODz) // s > 01032 if ( (s >= 0) && (std::fabs(zi) <= tolODz) ) // s > 0 1051 1033 { 1052 if ( seg)1034 if ( !fPhiFullCone ) 1053 1035 { 1054 1036 xi = p.x() + s*v.x() ; … … 1056 1038 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ; 1057 1039 1058 if (cosPsi >= cosHDPhiOT) snxt = s ;1040 if (cosPsi >= cosHDPhiOT) { snxt = s; } 1059 1041 } 1060 else return s ;1042 else { return s; } 1061 1043 } 1062 1044 } … … 1067 1049 ri = rMinAv + zi*tanRMin ; 1068 1050 1069 if ( s >= 0 && ri >= 0 && std::fabs(zi) <= tolODz) // s>01051 if ( (s >= 0) && (ri > 0) && (std::fabs(zi) <= tolODz) ) // s>0 1070 1052 { 1071 if ( seg)1053 if ( !fPhiFullCone ) 1072 1054 { 1073 1055 xi = p.x() + s*v.x() ; … … 1075 1057 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ; 1076 1058 1077 if (cosPsi >= cosHDPhiIT) snxt = s ;1059 if (cosPsi >= cosHDPhiIT) { snxt = s; } 1078 1060 } 1079 else return s ;1061 else { return s; } 1080 1062 } 1081 1063 } … … 1095 1077 // Inside inner real cone, heading outwards, inside z range 1096 1078 1097 if ( seg)1079 if ( !fPhiFullCone ) 1098 1080 { 1099 1081 cosPsi = (p.x()*cosCPhi + p.y()*sinCPhi)/std::sqrt(t3) ; 1100 1082 1101 if (cosPsi >= cosHDPhiIT) return 0.0 ;1083 if (cosPsi >= cosHDPhiIT) { return 0.0; } 1102 1084 } 1103 else return 0.0 ;1085 else { return 0.0; } 1104 1086 } 1105 1087 else … … 1123 1105 zi = p.z() + s*v.z() ; 1124 1106 1125 if ( s >= 0 && std::fabs(zi) <= tolODz) // s>01107 if ( (s >= 0) && (std::fabs(zi) <= tolODz) ) // s>0 1126 1108 { 1127 if ( seg)1109 if ( !fPhiFullCone ) 1128 1110 { 1129 1111 xi = p.x() + s*v.x() ; … … 1132 1114 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ; 1133 1115 1134 if ( cosPsi >= cosHDPhiIT ) snxt = s ;1116 if ( cosPsi >= cosHDPhiIT ) { snxt = s; } 1135 1117 } 1136 else return s ;1118 else { return s; } 1137 1119 } 1138 1120 } 1139 else return kInfinity ;1121 else { return kInfinity; } 1140 1122 } 1141 1123 } … … 1152 1134 zi = p.z() + s*v.z() ; 1153 1135 1154 if ( s >= 0 && std::fabs(zi) <= tolODz) // s>01136 if ( (s >= 0) && (std::fabs(zi) <= tolODz) ) // s>0 1155 1137 { 1156 if ( seg)1138 if ( !fPhiFullCone ) 1157 1139 { 1158 1140 xi = p.x() + s*v.x(); … … 1161 1143 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri; 1162 1144 1163 if (cosPsi >= cosHDPhiIT) snxt = s ;1145 if (cosPsi >= cosHDPhiIT) { snxt = s; } 1164 1146 } 1165 else return s ;1147 else { return s; } 1166 1148 } 1167 1149 } … … 1180 1162 // -> Should use some form of loop Construct 1181 1163 1182 if ( seg ) 1183 { 1184 // First phi surface (`S'tarting phi) 1185 1186 sinSPhi = std::sin(fSPhi) ; 1187 cosSPhi = std::cos(fSPhi) ; 1164 if ( !fPhiFullCone ) 1165 { 1166 // First phi surface (starting phi) 1167 1188 1168 Comp = v.x()*sinSPhi - v.y()*cosSPhi ; 1189 1169 … … 1192 1172 Dist = (p.y()*cosSPhi - p.x()*sinSPhi) ; 1193 1173 1194 if (Dist < kCarTolerance*0.5)1174 if (Dist < halfCarTolerance) 1195 1175 { 1196 1176 s = Dist/Comp ; … … 1198 1178 if ( s < snxt ) 1199 1179 { 1200 if ( s < 0 ) s = 0.0 ;1180 if ( s < 0 ) { s = 0.0; } 1201 1181 1202 1182 zi = p.z() + s*v.z() ; … … 1210 1190 tolORMax2 = (rMaxOAv + zi*tanRMax)*(rMaxOAv + zi*tanRMax) ; 1211 1191 1212 if ( rhoi2 >= tolORMin2 && rhoi2 <= tolORMax2)1192 if ( (rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2) ) 1213 1193 { 1214 1194 // z and r intersections good - check intersecting with 1215 1195 // correct half-plane 1216 1196 1217 if ((yi*cosCPhi - xi*sinCPhi) <= 0 ) snxt = s ;1218 } 1197 if ((yi*cosCPhi - xi*sinCPhi) <= 0 ) { snxt = s; } 1198 } 1219 1199 } 1220 1200 } 1221 1201 } 1222 } 1223 // Second phi surface (`E'nding phi) 1224 1225 ePhi = fSPhi + fDPhi ; 1226 sinEPhi = std::sin(ePhi) ; 1227 cosEPhi = std::cos(ePhi) ; 1202 } 1203 1204 // Second phi surface (Ending phi) 1205 1228 1206 Comp = -(v.x()*sinEPhi - v.y()*cosEPhi) ; 1229 1207 … … 1231 1209 { 1232 1210 Dist = -(p.y()*cosEPhi - p.x()*sinEPhi) ; 1233 if (Dist < kCarTolerance*0.5)1211 if (Dist < halfCarTolerance) 1234 1212 { 1235 1213 s = Dist/Comp ; … … 1237 1215 if ( s < snxt ) 1238 1216 { 1239 if ( s < 0 ) s = 0.0 ;1217 if ( s < 0 ) { s = 0.0; } 1240 1218 1241 1219 zi = p.z() + s*v.z() ; … … 1249 1227 tolORMax2 = (rMaxOAv + zi*tanRMax)*(rMaxOAv + zi*tanRMax) ; 1250 1228 1251 if ( rhoi2 >= tolORMin2 && rhoi2 <= tolORMax2)1229 if ( (rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2) ) 1252 1230 { 1253 1231 // z and r intersections good - check intersecting with 1254 1232 // correct half-plane 1255 1233 1256 if ( (yi*cosCPhi - xi*sinCPhi) >= 0.0 ) snxt = s ;1257 } 1234 if ( (yi*cosCPhi - xi*sinCPhi) >= 0.0 ) { snxt = s; } 1235 } 1258 1236 } 1259 1237 } … … 1261 1239 } 1262 1240 } 1263 if (snxt < kCarTolerance*0.5) snxt = 0.; 1264 1265 #ifdef consdebug 1266 G4cout.precision(24); 1267 G4cout<<"G4Cons::DistanceToIn(p,v) "<<G4endl; 1268 G4cout<<"position = "<<p<<G4endl; 1269 G4cout<<"direction = "<<v<<G4endl; 1270 G4cout<<"distance = "<<snxt<<G4endl; 1271 #endif 1241 if (snxt < halfCarTolerance) { snxt = 0.; } 1272 1242 1273 1243 return snxt ; … … 1283 1253 G4double G4Cons::DistanceToIn(const G4ThreeVector& p) const 1284 1254 { 1285 G4double safe=0.0, rho, safeR1, safeR2, safeZ ;1255 G4double safe=0.0, rho, safeR1, safeR2, safeZ, safePhi, cosPsi ; 1286 1256 G4double tanRMin, secRMin, pRMin ; 1287 1257 G4double tanRMax, secRMax, pRMax ; 1288 G4double phiC, cosPhiC, sinPhiC, safePhi, ePhi ;1289 G4double cosPsi ;1290 1258 1291 1259 rho = std::sqrt(p.x()*p.x() + p.y()*p.y()) ; … … 1304 1272 safeR2 = (rho - pRMax)/secRMax ; 1305 1273 1306 if ( safeR1 > safeR2) safe = safeR1 ;1307 else safe = safeR2 ;1274 if ( safeR1 > safeR2) { safe = safeR1; } 1275 else { safe = safeR2; } 1308 1276 } 1309 1277 else … … 1314 1282 safe = (rho - pRMax)/secRMax ; 1315 1283 } 1316 if ( safeZ > safe ) safe = safeZ ; 1317 1318 if ( fDPhi < twopi && rho ) 1319 { 1320 phiC = fSPhi + fDPhi*0.5 ; 1321 cosPhiC = std::cos(phiC) ; 1322 sinPhiC = std::sin(phiC) ; 1323 1284 if ( safeZ > safe ) { safe = safeZ; } 1285 1286 if ( !fPhiFullCone && rho ) 1287 { 1324 1288 // Psi=angle from central phi to point 1325 1289 1326 cosPsi = (p.x()*cos PhiC + p.y()*sinPhiC)/rho ;1290 cosPsi = (p.x()*cosCPhi + p.y()*sinCPhi)/rho ; 1327 1291 1328 1292 if ( cosPsi < std::cos(fDPhi*0.5) ) // Point lies outside phi range 1329 1293 { 1330 if ( (p.y()*cos PhiC - p.x()*sinPhiC) <= 0.0 )1331 { 1332 safePhi = std::fabs(p.x()*std::sin(fSPhi) - p.y()*std::cos(fSPhi));1294 if ( (p.y()*cosCPhi - p.x()*sinCPhi) <= 0.0 ) 1295 { 1296 safePhi = std::fabs(p.x()*std::sin(fSPhi)-p.y()*std::cos(fSPhi)); 1333 1297 } 1334 1298 else 1335 1299 { 1336 ePhi = fSPhi + fDPhi ; 1337 safePhi = std::fabs(p.x()*std::sin(ePhi) - p.y()*std::cos(ePhi)) ; 1338 } 1339 if ( safePhi > safe ) safe = safePhi ; 1340 } 1341 } 1342 if ( safe < 0.0 ) safe = 0.0 ; 1300 safePhi = std::fabs(p.x()*sinEPhi-p.y()*cosEPhi); 1301 } 1302 if ( safePhi > safe ) { safe = safePhi; } 1303 } 1304 } 1305 if ( safe < 0.0 ) { safe = 0.0; } 1343 1306 1344 1307 return safe ; … … 1347 1310 /////////////////////////////////////////////////////////////// 1348 1311 // 1349 // Calculate distance to surface of shape from `inside', allowing for tolerance1312 // Calculate distance to surface of shape from 'inside', allowing for tolerance 1350 1313 // - Only Calc rmax intersection if no valid rmin intersection 1351 1314 1352 1315 G4double G4Cons::DistanceToOut( const G4ThreeVector& p, 1353 const G4ThreeVector& v,1354 const G4bool calcNorm,1355 G4bool *validNorm,1356 G4ThreeVector *n) const1316 const G4ThreeVector& v, 1317 const G4bool calcNorm, 1318 G4bool *validNorm, 1319 G4ThreeVector *n) const 1357 1320 { 1358 1321 ESide side = kNull, sider = kNull, sidephi = kNull; 1359 1322 1323 static const G4double halfCarTolerance=kCarTolerance*0.5; 1324 static const G4double halfRadTolerance=kRadTolerance*0.5; 1325 static const G4double halfAngTolerance=kAngTolerance*0.5; 1326 1360 1327 G4double snxt,sr,sphi,pdist ; 1361 1328 … … 1373 1340 // Vars for phi intersection: 1374 1341 1375 G4double sinSPhi, cosSPhi, ePhi, sinEPhi, cosEPhi ;1376 G4double cPhi, sinCPhi, cosCPhi ;1377 1342 G4double pDistS, compS, pDistE, compE, sphi2, xi, yi, risec, vphi ; 1378 1343 G4double zi, ri, deltaRoi2 ; … … 1384 1349 pdist = fDz - p.z() ; 1385 1350 1386 if (pdist > kCarTolerance*0.5)1351 if (pdist > halfCarTolerance) 1387 1352 { 1388 1353 snxt = pdist/v.z() ; … … 1396 1361 *validNorm = true ; 1397 1362 } 1398 return snxt = 0.0;1363 return snxt = 0.0; 1399 1364 } 1400 1365 } … … 1403 1368 pdist = fDz + p.z() ; 1404 1369 1405 if ( pdist > kCarTolerance*0.5)1370 if ( pdist > halfCarTolerance) 1406 1371 { 1407 1372 snxt = -pdist/v.z() ; … … 1465 1430 - fRmax1*(fRmax1 + kRadTolerance*secRMax); 1466 1431 } 1467 else deltaRoi2 = 1.0 ; 1468 1469 if ( nt1 && deltaRoi2 > 0.0 ) 1432 else 1433 { 1434 deltaRoi2 = 1.0; 1435 } 1436 1437 if ( nt1 && (deltaRoi2 > 0.0) ) 1470 1438 { 1471 1439 // Equation quadratic => 2 roots : second root must be leaving … … 1478 1446 { 1479 1447 // Check if on outer cone & heading outwards 1480 // NOTE: Should use rho-rout>-kRad tolerance*0.51448 // NOTE: Should use rho-rout>-kRadTolerance*0.5 1481 1449 1482 if (nt3 > - kRadTolerance*0.5&& nt2 >= 0 )1450 if (nt3 > -halfRadTolerance && nt2 >= 0 ) 1483 1451 { 1484 1452 if (calcNorm) … … 1486 1454 risec = std::sqrt(t3)*secRMax ; 1487 1455 *validNorm = true ; 1488 *n = G4ThreeVector(p.x()/risec,p.y()/risec,-tanRMax/secRMax) 1456 *n = G4ThreeVector(p.x()/risec,p.y()/risec,-tanRMax/secRMax); 1489 1457 } 1490 1458 return snxt=0 ; … … 1497 1465 ri = tanRMax*zi + rMaxAv ; 1498 1466 1499 if ( (ri >= 0) && (-kRadTolerance*0.5 <= sr) && 1500 ( sr <= kRadTolerance*0.5) ) 1467 if ((ri >= 0) && (-halfRadTolerance <= sr) && (sr <= halfRadTolerance)) 1501 1468 { 1502 1469 // An intersection within the tolerance … … 1506 1473 sidetol = kRMax ; 1507 1474 } 1508 if ( (ri < 0) || (sr < kRadTolerance*0.5) )1475 if ( (ri < 0) || (sr < halfRadTolerance) ) 1509 1476 { 1510 1477 // Safety: if both roots -ve ensure that sr cannot `win' … … 1515 1482 ri = tanRMax*zi + rMaxAv ; 1516 1483 1517 if (ri >= 0 && sr2 > kRadTolerance*0.5) sr = sr2 ; 1484 if ((ri >= 0) && (sr2 > halfRadTolerance)) 1485 { 1486 sr = sr2; 1487 } 1518 1488 else 1519 1489 { 1520 1490 sr = kInfinity ; 1521 1491 1522 if( (-kRadTolerance*0.5 <= sr2) 1523 && ( sr2 <= kRadTolerance*0.5) ) 1492 if( (-halfRadTolerance <= sr2) && ( sr2 <= halfRadTolerance) ) 1524 1493 { 1525 1494 // An intersection within the tolerance. … … 1540 1509 if ( calcNorm ) 1541 1510 { 1542 risec = std::sqrt(t3)*secRMax 1543 *validNorm = true 1544 *n = G4ThreeVector(p.x()/risec,p.y()/risec,-tanRMax/secRMax) 1511 risec = std::sqrt(t3)*secRMax; 1512 *validNorm = true; 1513 *n = G4ThreeVector(p.x()/risec,p.y()/risec,-tanRMax/secRMax); 1545 1514 } 1546 1515 return snxt = 0.0 ; 1547 1516 } 1548 1517 } 1549 else if ( nt2 && deltaRoi2 > 0.0)1518 else if ( nt2 && (deltaRoi2 > 0.0) ) 1550 1519 { 1551 1520 // Linear case (only one intersection) => point outside outer cone … … 1553 1522 if ( calcNorm ) 1554 1523 { 1555 risec = std::sqrt(t3)*secRMax 1556 *validNorm = true 1557 *n = G4ThreeVector(p.x()/risec,p.y()/risec,-tanRMax/secRMax) 1524 risec = std::sqrt(t3)*secRMax; 1525 *validNorm = true; 1526 *n = G4ThreeVector(p.x()/risec,p.y()/risec,-tanRMax/secRMax); 1558 1527 } 1559 1528 return snxt = 0.0 ; … … 1569 1538 // Check possible intersection within tolerance 1570 1539 1571 if ( slentol <= kCarTolerance*0.5)1540 if ( slentol <= halfCarTolerance ) 1572 1541 { 1573 1542 // An intersection within the tolerance was found. … … 1580 1549 // Calculate a normal vector, as below 1581 1550 1582 xi = p.x() + slentol*v.x() 1583 yi = p.y() + slentol*v.y() 1584 risec = std::sqrt(xi*xi + yi*yi)*secRMax 1585 G4ThreeVector Normal = G4ThreeVector(xi/risec,yi/risec,-tanRMax/secRMax) 1551 xi = p.x() + slentol*v.x(); 1552 yi = p.y() + slentol*v.y(); 1553 risec = std::sqrt(xi*xi + yi*yi)*secRMax; 1554 G4ThreeVector Normal = G4ThreeVector(xi/risec,yi/risec,-tanRMax/secRMax); 1586 1555 1587 1556 if ( Normal.dot(v) > 0 ) // We will leave the Cone immediatelly … … 1595 1564 } 1596 1565 else // On the surface, but not heading out so we ignore this intersection 1597 { // (as it is within tolerance).1566 { // (as it is within tolerance). 1598 1567 slentol = kInfinity ; 1599 1568 } … … 1621 1590 d = b*b - c ; 1622 1591 1623 if ( d >= 0.0 )1592 if ( d >= 0.0 ) 1624 1593 { 1625 1594 // NOTE: should be rho-rin<kRadTolerance*0.5, … … 1630 1599 if ( nt2 < 0.0 ) 1631 1600 { 1632 if (calcNorm) *validNorm = false ;1633 return snxt = 0.0 1601 if (calcNorm) { *validNorm = false; } 1602 return snxt = 0.0; 1634 1603 } 1635 1604 } … … 1640 1609 ri = tanRMin*zi + rMinAv ; 1641 1610 1642 if( (ri >= 0.0) && (-kRadTolerance*0.5 <= sr2) && 1643 ( sr2 <= kRadTolerance*0.5) ) 1611 if( (ri>=0.0)&&(-halfRadTolerance<=sr2)&&(sr2<=halfRadTolerance) ) 1644 1612 { 1645 1613 // An intersection within the tolerance … … 1649 1617 sidetol = kRMax ; 1650 1618 } 1651 if( (ri<0) || (sr2 < kRadTolerance*0.5) )1619 if( (ri<0) || (sr2 < halfRadTolerance) ) 1652 1620 { 1653 1621 sr3 = -b + std::sqrt(d) ; … … 1656 1624 // distancetoout 1657 1625 1658 if ( sr3 > kCarTolerance*0.5)1626 if ( sr3 > halfRadTolerance ) 1659 1627 { 1660 1628 if( sr3 < sr ) … … 1670 1638 } 1671 1639 } 1672 else if ( sr3 > - kCarTolerance*0.5)1640 else if ( sr3 > -halfRadTolerance ) 1673 1641 { 1674 1642 // Intersection in tolerance. Store to check if it's good … … 1678 1646 } 1679 1647 } 1680 else if ( sr2 < sr && sr2 > kCarTolerance*0.5)1648 else if ( (sr2 < sr) && (sr2 > halfCarTolerance) ) 1681 1649 { 1682 1650 sr = sr2 ; 1683 1651 sider = kRMin ; 1684 1652 } 1685 else if (sr2 > - kCarTolerance*0.5)1653 else if (sr2 > -halfCarTolerance) 1686 1654 { 1687 1655 // Intersection in tolerance. Store to check if it's good … … 1690 1658 sidetol = kRMin ; 1691 1659 } 1692 if( slentol <= kCarTolerance*0.5)1660 if( slentol <= halfCarTolerance ) 1693 1661 { 1694 1662 // An intersection within the tolerance was found. … … 1706 1674 if( Normal.dot(v) > 0 ) 1707 1675 { 1708 // We will leave the Cone immediatelly 1676 // We will leave the cone immediately 1677 1709 1678 if( calcNorm ) 1710 1679 { … … 1731 1700 // Phi Intersection 1732 1701 1733 if ( fDPhi < twopi ) 1734 { 1735 sinSPhi = std::sin(fSPhi) ; 1736 cosSPhi = std::cos(fSPhi) ; 1737 ePhi = fSPhi + fDPhi ; 1738 sinEPhi = std::sin(ePhi) ; 1739 cosEPhi = std::cos(ePhi) ; 1740 cPhi = fSPhi + fDPhi*0.5 ; 1741 sinCPhi = std::sin(cPhi) ; 1742 cosCPhi = std::cos(cPhi) ; 1702 if ( !fPhiFullCone ) 1703 { 1743 1704 // add angle calculation with correction 1744 // of the difference in domain of atan2 and Sphi 1745 vphi = std::atan2(v.y(),v.x()) ; 1746 1747 if ( vphi < fSPhi - kAngTolerance*0.5 ) vphi += twopi ; 1748 else if ( vphi > fSPhi + fDPhi + kAngTolerance*0.5 ) vphi -= twopi; 1705 // of the difference in domain of atan2 and Sphi 1706 1707 vphi = std::atan2(v.y(),v.x()) ; 1708 1709 if ( vphi < fSPhi - halfAngTolerance ) { vphi += twopi; } 1710 else if ( vphi > fSPhi + fDPhi + halfAngTolerance ) { vphi -= twopi; } 1711 1749 1712 if ( p.x() || p.y() ) // Check if on z axis (rho not needed later) 1750 1713 { … … 1761 1724 sidephi = kNull ; 1762 1725 1763 if( ( (fDPhi <= pi) && ( (pDistS <= 0.5*kCarTolerance) 1764 && (pDistE <= 0.5*kCarTolerance) ) ) 1765 || ( (fDPhi > pi) && !((pDistS > 0.5*kCarTolerance) 1766 && (pDistE > 0.5*kCarTolerance) ) ) ) 1767 { 1768 // Inside both phi *full* planes 1769 if ( compS < 0 ) 1726 if( ( (fDPhi <= pi) && ( (pDistS <= halfCarTolerance) 1727 && (pDistE <= halfCarTolerance) ) ) 1728 || ( (fDPhi > pi) && !((pDistS > halfCarTolerance) 1729 && (pDistE > halfCarTolerance) ) ) ) 1730 { 1731 // Inside both phi *full* planes 1732 if ( compS < 0 ) 1733 { 1734 sphi = pDistS/compS ; 1735 if (sphi >= -halfCarTolerance) 1770 1736 { 1771 sphi = pDistS/compS ; 1772 if (sphi >= -0.5*kCarTolerance) 1737 xi = p.x() + sphi*v.x() ; 1738 yi = p.y() + sphi*v.y() ; 1739 1740 // Check intersecting with correct half-plane 1741 // (if not -> no intersect) 1742 // 1743 if ( (std::abs(xi)<=kCarTolerance) 1744 && (std::abs(yi)<=kCarTolerance) ) 1773 1745 { 1774 xi = p.x() + sphi*v.x() ; 1775 yi = p.y() + sphi*v.y() ; 1776 1777 // Check intersecting with correct half-plane 1778 // (if not -> no intersect) 1779 // 1780 if((std::abs(xi)<=kCarTolerance)&&(std::abs(yi)<=kCarTolerance)){ 1781 sidephi= kSPhi; 1782 if(((fSPhi-0.5*kAngTolerance)<=vphi)&&((ePhi+0.5*kAngTolerance)>=vphi)) 1783 { sphi = kInfinity; } 1784 1746 sidephi= kSPhi; 1747 if ( ( fSPhi-halfAngTolerance <= vphi ) 1748 && ( fSPhi+fDPhi+halfAngTolerance >=vphi ) ) 1749 { 1750 sphi = kInfinity; 1785 1751 } 1786 else 1787 if ((yi*cosCPhi-xi*sinCPhi)>=0) 1788 { 1789 sphi = kInfinity ; 1790 } 1791 else 1792 { 1793 sidephi = kSPhi ; 1794 if ( pDistS > -kCarTolerance*0.5 ) 1795 { 1796 sphi = 0.0 ; // Leave by sphi immediately 1797 } 1798 } 1752 } 1753 else 1754 if ( (yi*cosCPhi-xi*sinCPhi)>=0 ) 1755 { 1756 sphi = kInfinity ; 1799 1757 } 1800 1758 else 1801 1759 { 1802 sphi = kInfinity ; 1803 } 1760 sidephi = kSPhi ; 1761 if ( pDistS > -halfCarTolerance ) 1762 { 1763 sphi = 0.0 ; // Leave by sphi immediately 1764 } 1765 } 1804 1766 } 1805 1767 else … … 1807 1769 sphi = kInfinity ; 1808 1770 } 1809 1810 if ( compE < 0 ) 1771 } 1772 else 1773 { 1774 sphi = kInfinity ; 1775 } 1776 1777 if ( compE < 0 ) 1778 { 1779 sphi2 = pDistE/compE ; 1780 1781 // Only check further if < starting phi intersection 1782 // 1783 if ( (sphi2 > -halfCarTolerance) && (sphi2 < sphi) ) 1811 1784 { 1812 sphi2 = pDistE/compE ; 1813 1814 // Only check further if < starting phi intersection 1815 // 1816 if ( (sphi2 > -0.5*kCarTolerance) && (sphi2 < sphi) ) 1785 xi = p.x() + sphi2*v.x() ; 1786 yi = p.y() + sphi2*v.y() ; 1787 1788 // Check intersecting with correct half-plane 1789 1790 if ( (std::abs(xi)<=kCarTolerance) 1791 && (std::abs(yi)<=kCarTolerance) ) 1817 1792 { 1818 xi = p.x() + sphi2*v.x() ; 1819 yi = p.y() + sphi2*v.y() ; 1820 1821 // Check intersecting with correct half-plane 1822 if((std::abs(xi)<=kCarTolerance)&&(std::abs(yi)<=kCarTolerance)){ 1823 // Leaving via ending phi 1824 if(!(((fSPhi-0.5*kAngTolerance)<=vphi)&&((ePhi+0.5*kAngTolerance)>=vphi))){ 1825 sidephi = kEPhi ; 1826 if ( pDistE <= -kCarTolerance*0.5 ) sphi = sphi2 ; 1827 else sphi = 0.0 ; 1828 } 1829 } 1830 else // Check intersecting with correct half-plane 1831 if ( (yi*cosCPhi-xi*sinCPhi) >= 0) 1793 // Leaving via ending phi 1794 1795 if(!( (fSPhi-halfAngTolerance <= vphi) 1796 && (fSPhi+fDPhi+halfAngTolerance >= vphi) ) ) 1832 1797 { 1833 // Leaving via ending phi1834 1835 1798 sidephi = kEPhi ; 1836 if ( pDistE <= - kCarTolerance*0.5 ) sphi = sphi2 ;1837 else sphi = 0.0 ;1799 if ( pDistE <= -halfCarTolerance ) { sphi = sphi2; } 1800 else { sphi = 0.0; } 1838 1801 } 1839 1802 } 1803 else // Check intersecting with correct half-plane 1804 if ( yi*cosCPhi-xi*sinCPhi >= 0 ) 1805 { 1806 // Leaving via ending phi 1807 1808 sidephi = kEPhi ; 1809 if ( pDistE <= -halfCarTolerance ) { sphi = sphi2; } 1810 else { sphi = 0.0; } 1811 } 1840 1812 } 1841 1813 } 1842 else 1843 { 1844 sphi = kInfinity ; 1845 } 1846 1847 1814 } 1815 else 1816 { 1817 sphi = kInfinity ; 1818 } 1848 1819 } 1849 1820 else … … 1852 1823 // within phi of shape, Step limited by rmax, else Step =0 1853 1824 1854 // vphi = std::atan2(v.y(),v.x()) ; 1855 1856 // if ( fSPhi < vphi && vphi < fSPhi + fDPhi ) sphi = kInfinity ; 1857 1858 if ( ((fSPhi-0.5*kAngTolerance) <= vphi) && (vphi <=( fSPhi + fDPhi)+0.5*kAngTolerance) ) 1859 { 1860 sphi = kInfinity ; 1861 } 1825 if ( (fSPhi-halfAngTolerance <= vphi) 1826 && (vphi <= fSPhi+fDPhi+halfAngTolerance) ) 1827 { 1828 sphi = kInfinity ; 1829 } 1862 1830 else 1863 1831 { … … 1868 1836 if ( sphi < snxt ) // Order intersecttions 1869 1837 { 1870 1871 1838 snxt=sphi ; 1839 side=sidephi ; 1872 1840 } 1873 1841 } … … 1880 1848 { 1881 1849 switch(side) 1882 { 1883 case kRMax: 1884 // Note: returned vector not normalised 1885 // (divide by frmax for unit vector) 1850 { // Note: returned vector not normalised 1851 case kRMax: // (divide by frmax for unit vector) 1886 1852 xi = p.x() + snxt*v.x() ; 1887 1853 yi = p.y() + snxt*v.y() ; … … 1891 1857 break ; 1892 1858 case kRMin: 1893 *validNorm =false ; // Rmin is inconvex1859 *validNorm = false ; // Rmin is inconvex 1894 1860 break ; 1895 1861 case kSPhi: 1896 1862 if ( fDPhi <= pi ) 1897 1863 { 1898 *n = G4ThreeVector(s td::sin(fSPhi),-std::cos(fSPhi),0);1864 *n = G4ThreeVector(sinSPhi, -cosSPhi, 0); 1899 1865 *validNorm = true ; 1900 1866 } 1901 else *validNorm = false ; 1867 else 1868 { 1869 *validNorm = false ; 1870 } 1902 1871 break ; 1903 1872 case kEPhi: 1904 1873 if ( fDPhi <= pi ) 1905 1874 { 1906 *n = G4ThreeVector(-std::sin(fSPhi+fDPhi),std::cos(fSPhi+fDPhi),0);1875 *n = G4ThreeVector(-sinEPhi, cosEPhi, 0); 1907 1876 *validNorm = true ; 1908 1877 } 1909 else *validNorm = false ; 1878 else 1879 { 1880 *validNorm = false ; 1881 } 1910 1882 break ; 1911 1883 case kPZ: … … 1925 1897 G4cout << "p.y() = " << p.y()/mm << " mm" << G4endl ; 1926 1898 G4cout << "p.z() = " << p.z()/mm << " mm" << G4endl << G4endl ; 1927 G4cout << "pho at z = " << std::sqrt( p.x()*p.x()+p.y()*p.y() )/mm << " mm"1928 << G4endl << G4endl ;1899 G4cout << "pho at z = " << std::sqrt( p.x()*p.x()+p.y()*p.y() )/mm 1900 << " mm" << G4endl << G4endl ; 1929 1901 if( p.x() != 0. || p.x() != 0.) 1930 1902 { 1931 G4cout << "point phi = " << std::atan2(p.y(),p.x())/degree << " degree"1932 << G4endl << G4endl ;1903 G4cout << "point phi = " << std::atan2(p.y(),p.x())/degree 1904 << " degree" << G4endl << G4endl ; 1933 1905 } 1934 1906 G4cout << "Direction:" << G4endl << G4endl ; … … 1943 1915 } 1944 1916 } 1945 if (snxt < kCarTolerance*0.5) snxt = 0.; 1946 #ifdef consdebug 1947 G4cout.precision(24); 1948 G4cout<<"G4Cons::DistanceToOut(p,v,...) "<<G4endl; 1949 G4cout<<"position = "<<p<<G4endl; 1950 G4cout<<"direction = "<<v<<G4endl; 1951 G4cout<<"distance = "<<snxt<<G4endl; 1952 #endif 1917 if (snxt < halfCarTolerance) { snxt = 0.; } 1918 1953 1919 return snxt ; 1954 1920 } … … 1960 1926 G4double G4Cons::DistanceToOut(const G4ThreeVector& p) const 1961 1927 { 1962 G4double safe=0.0,rho,safeR1,safeR2,safeZ ; 1963 G4double tanRMin,secRMin,pRMin ; 1964 G4double tanRMax,secRMax,pRMax ; 1965 G4double safePhi,phiC,cosPhiC,sinPhiC,ePhi ; 1928 G4double safe=0.0, rho, safeR1, safeR2, safeZ, safePhi; 1929 G4double tanRMin, secRMin, pRMin; 1930 G4double tanRMax, secRMax, pRMax; 1966 1931 1967 1932 #ifdef G4CSGDEBUG … … 1975 1940 G4cout << "p.y() = " << p.y()/mm << " mm" << G4endl ; 1976 1941 G4cout << "p.z() = " << p.z()/mm << " mm" << G4endl << G4endl ; 1977 G4cout << "pho at z = " << std::sqrt( p.x()*p.x()+p.y()*p.y() )/mm << " mm"1978 << G4endl << G4endl ;1979 if( p.x() != 0. || p.x() != 0.)1980 { 1981 G4cout << "point phi = " << std::atan2(p.y(),p.x())/degree << " degree"1982 << G4endl << G4endl ;1983 } 1984 G4Exception("G4Cons::DistanceToOut(p)", "Notification", JustWarning,1985 "Point p is outside !?" );1942 G4cout << "pho at z = " << std::sqrt( p.x()*p.x()+p.y()*p.y() )/mm 1943 << " mm" << G4endl << G4endl ; 1944 if( (p.x() != 0.) || (p.x() != 0.) ) 1945 { 1946 G4cout << "point phi = " << std::atan2(p.y(),p.x())/degree 1947 << " degree" << G4endl << G4endl ; 1948 } 1949 G4Exception("G4Cons::DistanceToOut(p)", "Notification", 1950 JustWarning, "Point p is outside !?" ); 1986 1951 } 1987 1952 #endif … … 1997 1962 safeR1 = (rho - pRMin)/secRMin ; 1998 1963 } 1999 else safeR1 = kInfinity ; 1964 else 1965 { 1966 safeR1 = kInfinity ; 1967 } 2000 1968 2001 1969 tanRMax = (fRmax2 - fRmax1)*0.5/fDz ; … … 2004 1972 safeR2 = (pRMax - rho)/secRMax ; 2005 1973 2006 if (safeR1 < safeR2) safe = safeR1 ;2007 else safe = safeR2 ;2008 if (safeZ < safe) safe = safeZ ;1974 if (safeR1 < safeR2) { safe = safeR1; } 1975 else { safe = safeR2; } 1976 if (safeZ < safe) { safe = safeZ ; } 2009 1977 2010 1978 // Check if phi divided, Calc distances closest phi plane 2011 1979 2012 if ( fDPhi < twopi)1980 if (!fPhiFullCone) 2013 1981 { 2014 1982 // Above/below central phi of G4Cons? 2015 1983 2016 phiC = fSPhi + fDPhi*0.5 ; 2017 cosPhiC = std::cos(phiC) ; 2018 sinPhiC = std::sin(phiC) ; 2019 2020 if ( (p.y()*cosPhiC - p.x()*sinPhiC) <= 0 ) 2021 { 2022 safePhi = -(p.x()*std::sin(fSPhi) - p.y()*std::cos(fSPhi)) ; 1984 if ( (p.y()*cosCPhi - p.x()*sinCPhi) <= 0 ) 1985 { 1986 safePhi = -(p.x()*sinSPhi - p.y()*cosSPhi) ; 2023 1987 } 2024 1988 else 2025 1989 { 2026 ePhi = fSPhi + fDPhi;2027 safePhi = (p.x()*std::sin(ePhi) - p.y()*std::cos(ePhi)) ;2028 }2029 if (safePhi < safe) safe = safePhi ;2030 }2031 if ( safe < 0 ) safe = 0 ; 2032 return safe ; 1990 safePhi = (p.x()*sinEPhi - p.y()*cosEPhi) ; 1991 } 1992 if (safePhi < safe) { safe = safePhi; } 1993 } 1994 if ( safe < 0 ) { safe = 0; } 1995 1996 return safe ; 2033 1997 } 2034 1998 … … 2068 2032 meshAngle = fDPhi/(noCrossSections - 1) ; 2069 2033 2070 // G4double RMax = (fRmax2 >= fRmax1) ? fRmax2 : fRmax1 ;2071 2072 2034 meshRMax1 = fRmax1/std::cos(meshAngle*0.5) ; 2073 2035 meshRMax2 = fRmax2/std::cos(meshAngle*0.5) ; … … 2076 2038 // on the x axis. Will give better extent calculations when not rotated. 2077 2039 2078 if ( fDPhi == twopi && fSPhi == 0.0)2040 if ( fPhiFullCone && (fSPhi == 0.0) ) 2079 2041 { 2080 2042 sAngle = -meshAngle*0.5 ; … … 2102 2064 rMaxY2 = meshRMax2*sinCrossAngle ; 2103 2065 2104 // G4double RMin = (fRmin2 <= fRmin1) ? fRmin2 : fRmin1 ;2105 2106 2066 rMinX1 = fRmin1*cosCrossAngle ; 2107 2067 rMinY1 = fRmin1*sinCrossAngle ; … … 2127 2087 "Error in allocation of vertices. Out of memory !"); 2128 2088 } 2089 2129 2090 return vertices ; 2130 2091 } … … 2192 2153 rRand2 = RandFlat::shoot(fRmin2,fRmax2); 2193 2154 2194 if (fSPhi == 0. && fDPhi == twopi){ Afive = 0.; }2155 if ( (fSPhi == 0.) && fPhiFullCone ) { Afive = 0.; } 2195 2156 chose = RandFlat::shoot(0.,Aone+Atwo+Athree+Afour+2.*Afive); 2196 2157 … … 2225 2186 else if( (chose >= Aone + Atwo) && (chose < Aone + Atwo + Athree) ) 2226 2187 { 2227 return G4ThreeVector (rRand1*cosu, rRand1*sinu,-1*fDz);2188 return G4ThreeVector (rRand1*cosu, rRand1*sinu, -1*fDz); 2228 2189 } 2229 2190 else if( (chose >= Aone + Atwo + Athree)
Note: See TracChangeset
for help on using the changeset viewer.