Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // Implementation of G4EnclosingCylinder, a ut 27 // for a quick check of geometry. 28 // 29 // Author: David C. Williams (davidw@scipp.ucs 30 // ------------------------------------------- 31 32 #include "G4EnclosingCylinder.hh" 33 #include "G4PhysicalConstants.hh" 34 #include "G4ReduciblePolygon.hh" 35 #include "G4GeometryTolerance.hh" 36 37 // Constructor 38 // 39 G4EnclosingCylinder::G4EnclosingCylinder( cons 40 41 42 43 : startPhi(theStartPhi), totalPhi(theTotalPh 44 concave(theTotalPhi > pi) 45 { 46 // 47 // Obtain largest r and smallest and largest 48 // 49 radius = rz->Amax(); 50 zHi = rz->Bmax(); 51 zLo = rz->Bmin(); 52 53 G4double kCarTolerance = G4GeometryTolerance 54 ->GetSurfaceToleran 55 // 56 // Save phi info 57 // 58 phiIsOpen = thePhiIsOpen; 59 if ( phiIsOpen ) 60 { 61 rx1 = std::cos(startPhi); 62 ry1 = std::sin(startPhi); 63 dx1 = +ry1*10*kCarTolerance; 64 dy1 = -rx1*10*kCarTolerance; 65 66 rx2 = std::cos(startPhi+totalPhi); 67 ry2 = std::sin(startPhi+totalPhi); 68 dx2 = -ry2*10*kCarTolerance; 69 dy2 = +rx2*10*kCarTolerance; 70 } 71 72 // 73 // Add safety 74 // 75 radius += 10*kCarTolerance; 76 zLo -= 10*kCarTolerance; 77 zHi += 10*kCarTolerance; 78 } 79 80 // Fake default constructor - sets only member 81 // for usage restri 82 // 83 G4EnclosingCylinder::G4EnclosingCylinder( __vo 84 : radius(0.), zLo(0.), zHi(0.), phiIsOpen(fals 85 concave(false) 86 { 87 } 88 89 // Outside 90 // 91 // Decide very rapidly if the point is outside 92 // 93 // If one is not certain, return false 94 // 95 G4bool G4EnclosingCylinder::MustBeOutside( con 96 { 97 if (p.perp() > radius) return true; 98 if (p.z() < zLo) return true; 99 if (p.z() > zHi) return true; 100 101 if (phiIsOpen) 102 { 103 if (concave) 104 { 105 if ( ((p.x()-dx1)*ry1 - (p.y()-dy1)*rx1) 106 if ( ((p.x()-dx2)*ry2 - (p.y()-dy2)*rx2) 107 } 108 else 109 { 110 if ( ((p.x()-dx1)*ry1 - (p.y()-dy1)*rx1) 111 if ( ((p.x()-dx2)*ry2 - (p.y()-dy2)*rx2) 112 } 113 } 114 115 return false; 116 } 117 118 // Misses 119 // 120 // Decide very rapidly if the trajectory is go 121 // 122 // If one is not sure, return false 123 // 124 G4bool G4EnclosingCylinder::ShouldMiss( const 125 const 126 { 127 if (!MustBeOutside(p)) return false; 128 129 G4double cross = p.x()*v.y() - p.y()*v.x(); 130 if (cross > radius) return true; 131 132 if (p.perp() > radius) 133 { 134 G4double dot = p.x()*v.x() + p.y()*v.y(); 135 if (dot > 0) return true; 136 } 137 138 return false; 139 } 140