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 inline methods of G4Tubs 27 // ------------------------------------------- 28 29 inline 30 G4double G4Tubs::GetInnerRadius () const 31 { 32 return fRMin; 33 } 34 35 inline 36 G4double G4Tubs::GetOuterRadius () const 37 { 38 return fRMax; 39 } 40 41 inline 42 G4double G4Tubs::GetZHalfLength () const 43 { 44 return fDz; 45 } 46 47 inline 48 G4double G4Tubs::GetStartPhiAngle () const 49 { 50 return fSPhi; 51 } 52 53 inline 54 G4double G4Tubs::GetDeltaPhiAngle () const 55 { 56 return fDPhi; 57 } 58 59 inline 60 G4double G4Tubs::GetSinStartPhi () const 61 { 62 return sinSPhi; 63 } 64 65 inline 66 G4double G4Tubs::GetCosStartPhi () const 67 { 68 return cosSPhi; 69 } 70 71 inline 72 G4double G4Tubs::GetSinEndPhi () const 73 { 74 return sinEPhi; 75 } 76 77 inline 78 G4double G4Tubs::GetCosEndPhi () const 79 { 80 return cosEPhi; 81 } 82 83 inline 84 void G4Tubs::Initialize() 85 { 86 fCubicVolume = 0.; 87 fSurfaceArea = 0.; 88 fInvRmax= 1.0 / fRMax; 89 fInvRmin= fRMin > 0. ? 1.0 / fRMin : 0.0; 90 fRebuildPolyhedron = true; 91 } 92 93 inline 94 void G4Tubs::InitializeTrigonometry() 95 { 96 G4double hDPhi = 0.5*fDPhi; 97 G4double cPhi = fSPhi + hDPhi; 98 G4double ePhi = fSPhi + fDPhi; 99 100 sinCPhi = std::sin(cPhi); 101 cosCPhi = std::cos(cPhi); 102 cosHDPhi = std::cos(hDPhi); 103 cosHDPhiIT = std::cos(hDPhi - 0.5*kAngTolera 104 cosHDPhiOT = std::cos(hDPhi + 0.5*kAngTolera 105 sinSPhi = std::sin(fSPhi); 106 cosSPhi = std::cos(fSPhi); 107 sinEPhi = std::sin(ePhi); 108 cosEPhi = std::cos(ePhi); 109 } 110 111 inline void G4Tubs::CheckSPhiAngle(G4double sP 112 { 113 // Ensure fSphi in 0-2PI or -2PI-0 range if 114 115 if ( sPhi < 0 ) 116 { 117 fSPhi = CLHEP::twopi - std::fmod(std::fabs 118 } 119 else 120 { 121 fSPhi = std::fmod(sPhi,CLHEP::twopi) ; 122 } 123 if ( fSPhi+fDPhi > CLHEP::twopi ) 124 { 125 fSPhi -= CLHEP::twopi ; 126 } 127 } 128 129 inline void G4Tubs::CheckDPhiAngle(G4double dP 130 { 131 fPhiFullTube = true; 132 if ( dPhi >= CLHEP::twopi-kAngTolerance*0.5 133 { 134 fDPhi=CLHEP::twopi; 135 fSPhi=0; 136 } 137 else 138 { 139 fPhiFullTube = false; 140 if ( dPhi > 0 ) 141 { 142 fDPhi = dPhi; 143 } 144 else 145 { 146 std::ostringstream message; 147 message << "Invalid dphi." << G4endl 148 << "Negative or zero delta-Phi ( 149 << GetName(); 150 G4Exception("G4Tubs::CheckDPhiAngle()", 151 FatalException, message); 152 } 153 } 154 } 155 156 inline void G4Tubs::CheckPhiAngles(G4double sP 157 { 158 CheckDPhiAngle(dPhi); 159 if ( (fDPhi<CLHEP::twopi) && ((sPhi) != 0.0) 160 InitializeTrigonometry(); 161 } 162 163 inline 164 void G4Tubs::SetInnerRadius (G4double newRMin) 165 { 166 if ( newRMin < 0 ) // Check radii 167 { 168 std::ostringstream message; 169 message << "Invalid radii." << G4endl 170 << "Invalid values for radii in so 171 << " newRMin = " << newRMin 172 << ", fRMax = " << fRMax << G4endl 173 << " Negative inner radius! 174 G4Exception("G4Tubs::SetInnerRadius()", "G 175 FatalException, message); 176 } 177 fRMin= newRMin; 178 Initialize(); 179 } 180 181 inline 182 void G4Tubs::SetOuterRadius (G4double newRMax) 183 { 184 if ( newRMax <= 0 ) // Check radii 185 { 186 std::ostringstream message; 187 message << "Invalid radii." << G4endl 188 << "Invalid values for radii in so 189 << " fRMin = " << fRMin 190 << ", newRMax = " << newRMax << G4 191 << " Invalid outer radius!" 192 G4Exception("G4Tubs::SetOuterRadius()", "G 193 FatalException, message); 194 } 195 fRMax= newRMax; 196 Initialize(); 197 } 198 199 inline 200 void G4Tubs::SetZHalfLength (G4double newDz) 201 { 202 if (newDz<=0) // Check z-len 203 { 204 std::ostringstream message; 205 message << "Invalid Z half-length." << G4e 206 << "Negative Z half-length (" << n 207 << GetName(); 208 G4Exception("G4Tubs::SetZHalfLength()", "G 209 FatalException, message); 210 } 211 fDz= newDz; 212 Initialize(); 213 } 214 215 inline 216 void G4Tubs::SetStartPhiAngle (G4double newSPh 217 { 218 // Flag 'compute' can be used to explicitely 219 // trigonometry in case SetDeltaPhiAngle() i 220 221 CheckSPhiAngle(newSPhi); 222 fPhiFullTube = false; 223 if (compute) { InitializeTrigonometry(); } 224 Initialize(); 225 } 226 227 inline 228 void G4Tubs::SetDeltaPhiAngle (G4double newDPh 229 { 230 CheckPhiAngles(fSPhi, newDPhi); 231 Initialize(); 232 } 233 234 inline 235 G4double G4Tubs::GetCubicVolume() 236 { 237 if(fCubicVolume != 0.) {;} 238 else { fCubicVolume = fDPhi*fDz*(fRMax*fRM 239 return fCubicVolume; 240 } 241 242 inline 243 G4double G4Tubs::GetSurfaceArea() 244 { 245 if(fSurfaceArea != 0.) {;} 246 else 247 { 248 fSurfaceArea = fDPhi*(fRMin+fRMax)*(2*fDz+ 249 if (!fPhiFullTube) 250 { 251 fSurfaceArea = fSurfaceArea + 4*fDz*(fRM 252 } 253 } 254 return fSurfaceArea; 255 } 256 257 inline 258 G4double G4Tubs::FastInverseRxy( const G4Three 259 G4doubl 260 G4doubl 261 { 262 G4double rho2 = sqr( pos.x() ) + sqr( pos.y( 263 G4bool onSurface = std::fabs( rho2 * invRad 264 G4double invRho = onSurface ? invRad : 1.0 / 265 return invRho; 266 } 267