Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // >> 26 // >> 27 // $Id: G4Sphere.icc,v 1.8 2008/11/21 09:50:05 gcosmo Exp $ >> 28 // GEANT4 tag $Name: geant4-09-02-patch-01 $ >> 29 // >> 30 // -------------------------------------------------------------------- >> 31 // GEANT 4 inline definitions file >> 32 // >> 33 // G4Sphere.icc >> 34 // 26 // Implementation of inline methods of G4Spher 35 // Implementation of inline methods of G4Sphere 27 // ------------------------------------------- 36 // -------------------------------------------------------------------- 28 37 29 inline 38 inline >> 39 G4double G4Sphere::GetInsideRadius() const >> 40 { >> 41 return fRmin; >> 42 } >> 43 >> 44 inline 30 G4double G4Sphere::GetInnerRadius() const 45 G4double G4Sphere::GetInnerRadius() const 31 { 46 { 32 return fRmin; 47 return fRmin; 33 } 48 } 34 49 35 inline 50 inline 36 G4double G4Sphere::GetOuterRadius() const 51 G4double G4Sphere::GetOuterRadius() const 37 { 52 { 38 return fRmax; 53 return fRmax; 39 } 54 } 40 55 41 inline 56 inline 42 G4double G4Sphere::GetStartPhiAngle() const 57 G4double G4Sphere::GetStartPhiAngle() const 43 { 58 { 44 return fSPhi; 59 return fSPhi; 45 } 60 } 46 61 47 inline 62 inline 48 G4double G4Sphere::GetDeltaPhiAngle() const 63 G4double G4Sphere::GetDeltaPhiAngle() const 49 { 64 { 50 return fDPhi; 65 return fDPhi; 51 } 66 } 52 67 53 inline 68 inline 54 G4double G4Sphere::GetStartThetaAngle() const 69 G4double G4Sphere::GetStartThetaAngle() const 55 { 70 { 56 return fSTheta; 71 return fSTheta; 57 } 72 } 58 73 59 G4double G4Sphere::GetDeltaThetaAngle() const 74 G4double G4Sphere::GetDeltaThetaAngle() const 60 { 75 { 61 return fDTheta; 76 return fDTheta; 62 } 77 } 63 78 64 inline 79 inline 65 G4double G4Sphere::GetSinStartPhi () const << 80 void G4Sphere::SetInsideRadius(G4double newRmin) 66 { 81 { 67 return sinSPhi; << 82 fRmin= newRmin; >> 83 fCubicVolume= 0.; >> 84 fSurfaceArea= 0.; >> 85 fpPolyhedron = 0; 68 } 86 } 69 87 70 inline 88 inline 71 G4double G4Sphere::GetCosStartPhi () const << 89 void G4Sphere::SetInnerRadius(G4double newRmin) 72 { 90 { 73 return cosSPhi; << 91 fRmin= newRmin; >> 92 fCubicVolume= 0.; >> 93 fSurfaceArea= 0.; >> 94 fpPolyhedron = 0; 74 } 95 } 75 96 76 inline 97 inline 77 G4double G4Sphere::GetSinEndPhi () const << 98 void G4Sphere::SetOuterRadius(G4double newRmax) 78 { 99 { 79 return sinEPhi; << 100 fRmax= newRmax; >> 101 fCubicVolume= 0.; >> 102 fSurfaceArea= 0.; >> 103 fpPolyhedron = 0; 80 } 104 } 81 105 82 inline 106 inline 83 G4double G4Sphere::GetCosEndPhi () const << 107 void G4Sphere::SetStartPhiAngle(G4double newSphi) 84 { 108 { 85 return cosEPhi; << 109 fSPhi= newSphi; >> 110 fCubicVolume= 0.; >> 111 fSurfaceArea= 0.; >> 112 fpPolyhedron = 0; 86 } 113 } 87 114 88 inline 115 inline 89 G4double G4Sphere::GetSinStartTheta () const << 116 void G4Sphere::SetDeltaPhiAngle(G4double newDphi) 90 { 117 { 91 return sinSTheta; << 118 fDPhi= newDphi; >> 119 fCubicVolume= 0.; >> 120 fSurfaceArea= 0.; >> 121 fpPolyhedron = 0; 92 } 122 } 93 123 94 inline 124 inline 95 G4double G4Sphere::GetCosStartTheta () const << 125 void G4Sphere::SetStartThetaAngle(G4double newSTheta) 96 { 126 { 97 return cosSTheta; << 127 fSTheta=newSTheta; >> 128 fCubicVolume= 0.; >> 129 fSurfaceArea= 0.; >> 130 fpPolyhedron = 0; 98 } 131 } 99 132 100 inline 133 inline 101 G4double G4Sphere::GetSinEndTheta () const << 134 void G4Sphere::SetDeltaThetaAngle(G4double newDTheta) 102 { 135 { 103 return sinETheta; << 136 fDTheta=newDTheta; >> 137 fCubicVolume= 0.; >> 138 fSurfaceArea= 0.; >> 139 fpPolyhedron = 0; 104 } 140 } 105 141 >> 142 // Old access functions >> 143 106 inline 144 inline 107 G4double G4Sphere::GetCosEndTheta () const << 145 G4double G4Sphere::GetRmin() const 108 { 146 { 109 return cosETheta; << 147 return GetInsideRadius(); 110 } 148 } 111 149 112 inline 150 inline 113 void G4Sphere::Initialize() << 151 G4double G4Sphere::GetRmax() const 114 { 152 { 115 fCubicVolume = 0.; << 153 return GetOuterRadius(); 116 fSurfaceArea = 0.; << 117 fRebuildPolyhedron = true; << 118 } 154 } 119 155 120 inline 156 inline 121 void G4Sphere::InitializePhiTrigonometry() << 157 G4double G4Sphere::GetSPhi() const 122 { 158 { 123 hDPhi = 0.5*fDPhi; // << 159 return GetStartPhiAngle(); 124 cPhi = fSPhi + hDPhi; << 125 ePhi = fSPhi + fDPhi; << 126 << 127 sinCPhi = std::sin(cPhi); << 128 cosCPhi = std::cos(cPhi); << 129 cosHDPhi = std::cos(hDPhi); << 130 cosHDPhiIT = std::cos(hDPhi - 0.5*kAngTolera << 131 cosHDPhiOT = std::cos(hDPhi + 0.5*kAngTolera << 132 sinSPhi = std::sin(fSPhi); << 133 cosSPhi = std::cos(fSPhi); << 134 sinEPhi = std::sin(ePhi); << 135 cosEPhi = std::cos(ePhi); << 136 } 160 } 137 161 138 inline 162 inline 139 void G4Sphere::InitializeThetaTrigonometry() << 163 G4double G4Sphere::GetDPhi() const 140 { 164 { 141 eTheta = fSTheta + fDTheta; << 165 return GetDeltaPhiAngle(); 142 << 143 sinSTheta = std::sin(fSTheta); << 144 cosSTheta = std::cos(fSTheta); << 145 sinETheta = std::sin(eTheta); << 146 cosETheta = std::cos(eTheta); << 147 << 148 tanSTheta = sinSTheta/cosSTheta; << 149 tanSTheta2 = tanSTheta*tanSTheta; << 150 tanETheta = sinETheta/cosETheta; << 151 tanETheta2 = tanETheta*tanETheta; << 152 } 166 } 153 167 154 inline 168 inline 155 void G4Sphere::CheckThetaAngles(G4double sThet << 169 G4double G4Sphere::GetSTheta() const 156 { 170 { 157 if ( (sTheta<0) || (sTheta>CLHEP::pi) ) << 171 return GetStartThetaAngle(); 158 { << 159 std::ostringstream message; << 160 message << "sTheta outside 0-PI range." << << 161 << "Invalid starting Theta angle f << 162 G4Exception("G4Sphere::CheckThetaAngles()" << 163 FatalException, message); << 164 } << 165 else << 166 { << 167 fSTheta=sTheta; << 168 } << 169 if ( dTheta+sTheta >= CLHEP::pi ) << 170 { << 171 fDTheta=CLHEP::pi-sTheta; << 172 } << 173 else if ( dTheta > 0 ) << 174 { << 175 fDTheta=dTheta; << 176 } << 177 else << 178 { << 179 std::ostringstream message; << 180 message << "Invalid dTheta." << G4endl << 181 << "Negative delta-Theta (" << dTh << 182 << GetName(); << 183 G4Exception("G4Sphere::CheckThetaAngles()" << 184 FatalException, message); << 185 } << 186 fFullThetaSphere = fDTheta-fSTheta >= CLHEP: << 187 fFullSphere = fFullPhiSphere && fFullThetaSp << 188 << 189 InitializeThetaTrigonometry(); << 190 } 172 } 191 173 192 inline 174 inline 193 void G4Sphere::CheckSPhiAngle(G4double sPhi) << 175 G4double G4Sphere::GetDTheta() const 194 { 176 { 195 // Ensure fSphi in 0-2PI or -2PI-0 range if << 177 return GetDeltaThetaAngle(); >> 178 } 196 179 197 if ( sPhi < 0 ) << 180 inline 198 { << 181 G4double G4Sphere::GetCubicVolume() 199 fSPhi = CLHEP::twopi - std::fmod(std::fabs << 182 { 200 } << 183 if(fCubicVolume != 0.) {;} 201 else << 184 else fCubicVolume = fDPhi*(std::cos(fSTheta)-std::cos(fSTheta+fDTheta))* 202 { << 185 (fRmax*fRmax*fRmax-fRmin*fRmin*fRmin)/3.; 203 fSPhi = std::fmod(sPhi,CLHEP::twopi) ; << 186 return fCubicVolume; 204 } << 205 if ( fSPhi+fDPhi > CLHEP::twopi ) << 206 { << 207 fSPhi -= CLHEP::twopi ; << 208 } << 209 } 187 } 210 188 >> 189 211 inline 190 inline 212 void G4Sphere::CheckDPhiAngle(G4double dPhi) << 191 G4double G4Sphere::GetSurfaceArea() 213 { 192 { 214 fFullPhiSphere = true; << 193 if(fSurfaceArea != 0.) {;} 215 if ( dPhi >= CLHEP::twopi-kAngTolerance*0.5 << 216 { << 217 fDPhi=CLHEP::twopi; << 218 } << 219 else 194 else 220 { << 195 { 221 fFullPhiSphere = false; << 196 G4double Rsq=fRmax*fRmax; 222 if ( dPhi > 0 ) << 197 G4double rsq=fRmin*fRmin; >> 198 >> 199 fSurfaceArea = fDPhi*(rsq+Rsq)*(std::cos(fSTheta) >> 200 - std::cos(fSTheta+fDTheta)); >> 201 if(fDPhi < twopi) >> 202 { >> 203 fSurfaceArea = fSurfaceArea + fDTheta*(Rsq-rsq); >> 204 } >> 205 if(fSTheta >0) 223 { 206 { 224 fDPhi = dPhi; << 207 G4double acos1=std::acos( std::pow(std::sin(fSTheta),2) >> 208 *std::cos(fDPhi) >> 209 +std::pow(std::cos(fSTheta),2)); >> 210 if(fDPhi>pi) >> 211 { >> 212 fSurfaceArea = fSurfaceArea + 0.5*(Rsq-rsq)*(twopi-acos1); >> 213 } >> 214 else >> 215 { >> 216 fSurfaceArea = fSurfaceArea + 0.5*(Rsq-rsq)*acos1; >> 217 } 225 } 218 } 226 else << 219 if(fDTheta+fSTheta < pi) 227 { 220 { 228 std::ostringstream message; << 221 G4double acos2=std::acos( std::pow(std::sin(fSTheta+fDTheta),2) 229 message << "Invalid dphi." << G4endl << 222 *std::cos(fDPhi) 230 << "Negative delta-Phi (" << dPh << 223 +std::pow(std::cos(fSTheta+fDTheta),2)); 231 << GetName(); << 224 if(fDPhi>pi) 232 G4Exception("G4Sphere::CheckDPhiAngle()" << 225 { 233 FatalException, message); << 226 fSurfaceArea = fSurfaceArea + 0.5*(Rsq-rsq)*(twopi-acos2); >> 227 } >> 228 else >> 229 { >> 230 fSurfaceArea = fSurfaceArea + 0.5*(Rsq-rsq)*acos2; >> 231 } 234 } 232 } 235 } 233 } 236 } << 234 return fSurfaceArea; 237 << 238 inline << 239 void G4Sphere::CheckPhiAngles(G4double sPhi, G << 240 { << 241 CheckDPhiAngle(dPhi); << 242 if (!fFullPhiSphere && (sPhi != 0.0)) { Chec << 243 fFullSphere = fFullPhiSphere && fFullThetaSp << 244 << 245 InitializePhiTrigonometry(); << 246 } << 247 << 248 inline << 249 void G4Sphere::SetInnerRadius(G4double newRmin << 250 { << 251 fRmin= newRmin; << 252 fRminTolerance = (fRmin) != 0.0 ? std::max( << 253 Initialize(); << 254 } << 255 << 256 inline << 257 void G4Sphere::SetOuterRadius(G4double newRmax << 258 { << 259 fRmax= newRmax; << 260 fRmaxTolerance = std::max( kRadTolerance, fE << 261 Initialize(); << 262 } << 263 << 264 inline << 265 void G4Sphere::SetStartPhiAngle(G4double newSP << 266 { << 267 // Flag 'compute' can be used to explicitely << 268 // trigonometry in case SetDeltaPhiAngle() i << 269 << 270 CheckSPhiAngle(newSPhi); << 271 fFullPhiSphere = false; << 272 if (compute) { InitializePhiTrigonometry(); << 273 Initialize(); << 274 } << 275 << 276 inline << 277 void G4Sphere::SetDeltaPhiAngle(G4double newDP << 278 { << 279 CheckPhiAngles(fSPhi, newDPhi); << 280 Initialize(); << 281 } << 282 << 283 inline << 284 void G4Sphere::SetStartThetaAngle(G4double new << 285 { << 286 CheckThetaAngles(newSTheta, fDTheta); << 287 Initialize(); << 288 } << 289 << 290 inline << 291 void G4Sphere::SetDeltaThetaAngle(G4double new << 292 { << 293 CheckThetaAngles(fSTheta, newDTheta); << 294 Initialize(); << 295 } 235 } 296 236