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 // $Id: G4VMscModel.hh,v 1.9 2009/04/07 18:39:47 vnivanch Exp $ >> 27 // GEANT4 tag $Name: geant4-09-03-patch-02 $ >> 28 // 26 // ------------------------------------------- 29 // ------------------------------------------------------------------- 27 // 30 // 28 // GEANT4 Class header file 31 // GEANT4 Class header file 29 // 32 // 30 // 33 // 31 // File name: G4VMscModel 34 // File name: G4VMscModel 32 // 35 // 33 // Author: Vladimir Ivanchenko 36 // Author: Vladimir Ivanchenko 34 // 37 // 35 // Creation date: 07.03.2008 38 // Creation date: 07.03.2008 36 // 39 // 37 // Modifications: 40 // Modifications: 38 // 07.04.2009 V.Ivanchenko moved msc methods f 41 // 07.04.2009 V.Ivanchenko moved msc methods from G4VEmModel to G4VMscModel 39 // 26.03.2012 V.Ivanchenko added transport x-s << 40 // 42 // 41 // Class Description: 43 // Class Description: 42 // 44 // 43 // General interface to msc models 45 // General interface to msc models 44 46 45 // ------------------------------------------- 47 // ------------------------------------------------------------------- 46 // 48 // >> 49 47 #ifndef G4VMscModel_h 50 #ifndef G4VMscModel_h 48 #define G4VMscModel_h 1 51 #define G4VMscModel_h 1 49 52 50 #include <CLHEP/Units/SystemOfUnits.h> << 51 << 52 #include "G4VEmModel.hh" 53 #include "G4VEmModel.hh" 53 #include "G4MscStepLimitType.hh" 54 #include "G4MscStepLimitType.hh" 54 #include "globals.hh" 55 #include "globals.hh" 55 #include "G4ThreeVector.hh" 56 #include "G4ThreeVector.hh" 56 #include "G4Track.hh" 57 #include "G4Track.hh" 57 #include "G4SafetyHelper.hh" 58 #include "G4SafetyHelper.hh" 58 #include "G4PhysicsTable.hh" << 59 #include "G4ThreeVector.hh" << 60 #include <vector> << 61 59 62 class G4ParticleChangeForMSC; 60 class G4ParticleChangeForMSC; 63 class G4ParticleDefinition; << 64 class G4VEnergyLossProcess; << 65 61 66 class G4VMscModel : public G4VEmModel 62 class G4VMscModel : public G4VEmModel 67 { 63 { 68 64 69 public: 65 public: 70 66 71 explicit G4VMscModel(const G4String& nam); << 67 G4VMscModel(const G4String& nam); 72 << 73 ~G4VMscModel() override; << 74 68 75 virtual G4double ComputeTruePathLengthLimit( << 69 virtual ~G4VMscModel(); 76 G4double& stepLimit) = 0; << 77 70 78 virtual G4double ComputeGeomPathLength(G4dou << 71 virtual G4double ComputeTruePathLengthLimit(const G4Track& track, >> 72 G4PhysicsTable* theLambdaTable, >> 73 G4double currentMinimalStep); 79 74 80 virtual G4double ComputeTrueStepLength(G4dou << 75 virtual G4double ComputeGeomPathLength(G4double truePathLength); 81 76 82 virtual G4ThreeVector& SampleScattering(cons << 77 virtual G4double ComputeTrueStepLength(G4double geomPathLength); 83 G4double safety) = 0; << 84 78 85 void InitialiseParameters(const G4ParticleDe << 79 virtual void SampleScattering(const G4DynamicParticle*, >> 80 G4double safety); 86 81 87 void DumpParameters(std::ostream& out) const << 82 // empty 88 << 83 virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*, 89 // empty method << 84 const G4MaterialCutsCouple*, 90 void SampleSecondaries(std::vector<G4Dynamic << 85 const G4DynamicParticle*, 91 const G4MaterialCutsCouple*, << 86 G4double tmin, 92 const G4DynamicParticle*, << 87 G4double tmax); 93 G4double tmin, G4double tmax) override; << 94 88 95 //========================================== 89 //================================================================ 96 // Set parameters of multiple scattering mo 90 // Set parameters of multiple scattering models 97 //========================================== 91 //================================================================ 98 92 99 inline void SetStepLimitType(G4MscStepLimitT 93 inline void SetStepLimitType(G4MscStepLimitType); 100 94 101 inline void SetLateralDisplasmentFlag(G4bool 95 inline void SetLateralDisplasmentFlag(G4bool val); 102 96 103 inline void SetRangeFactor(G4double); 97 inline void SetRangeFactor(G4double); 104 98 105 inline void SetGeomFactor(G4double); 99 inline void SetGeomFactor(G4double); 106 100 107 inline void SetSkin(G4double); 101 inline void SetSkin(G4double); 108 102 109 inline void SetLambdaLimit(G4double); << 110 << 111 inline void SetSafetyFactor(G4double); << 112 << 113 inline void SetSampleZ(G4bool); 103 inline void SetSampleZ(G4bool); 114 104 115 //========================================== << 116 // Get/Set access to Physics Tables << 117 //========================================== << 118 << 119 inline G4VEnergyLossProcess* GetIonisation() << 120 << 121 inline void SetIonisation(G4VEnergyLossProce << 122 const G4ParticleDefinition* part); << 123 << 124 //========================================== << 125 // Run time methods << 126 //========================================== << 127 << 128 protected: 105 protected: 129 106 130 // initialisation of the ParticleChange for 107 // initialisation of the ParticleChange for the model 131 // initialisation of interface with geometry << 108 G4ParticleChangeForMSC* GetParticleChangeForMSC(); 132 G4ParticleChangeForMSC* << 133 GetParticleChangeForMSC(const G4ParticleDefi << 134 109 135 // convert true length to geometry length << 110 // initialisation of interface with geometry 136 inline G4double ConvertTrueToGeom(G4double& << 111 void InitialiseSafetyHelper(); 137 112 138 // should be set before initialisation << 113 // shift point of the track PostStep 139 inline void SetUseSplineForMSC(G4bool val); << 114 void ComputeDisplacement(G4ParticleChangeForMSC*, 140 << 115 const G4ThreeVector& displDir, 141 public: << 116 G4double displacement, >> 117 G4double postsafety); 142 118 143 // compute safety 119 // compute safety 144 inline G4double ComputeSafety(const G4ThreeV << 120 inline G4double ComputeSafety(const G4ThreeVector& position, G4double limit); 145 G4double limit= DBL_MAX); << 146 121 147 // compute linear distance to a geometry bou 122 // compute linear distance to a geometry boundary 148 inline G4double ComputeGeomLimit(const G4Tra << 123 inline G4double ComputeGeomLimit(const G4Track& position, G4double& presafety, 149 G4double limit); 124 G4double limit); 150 125 151 G4double GetDEDX(const G4ParticleDefinition* << 126 private: 152 G4double kineticEner << 153 const G4MaterialCuts << 154 << 155 G4double GetDEDX(const G4ParticleDefinition* << 156 G4double kineticEner << 157 const G4MaterialCuts << 158 G4double logKineticE << 159 << 160 G4double GetRange(const G4ParticleDefinition << 161 G4double kineticEne << 162 const G4MaterialCut << 163 << 164 G4double GetRange(const G4ParticleDefinition << 165 G4double kineticEne << 166 const G4MaterialCut << 167 G4double logKinetic << 168 << 169 G4double GetEnergy(const G4ParticleDefinitio << 170 G4double range, << 171 const G4MaterialCutsCouple* couple); << 172 << 173 // G4MaterialCutsCouple should be defined be << 174 inline << 175 G4double GetTransportMeanFreePath(const G4Pa << 176 G4double k << 177 << 178 inline << 179 G4double GetTransportMeanFreePath(const G4Pa << 180 G4double k << 181 G4double l << 182 127 183 // hide assignment operator 128 // hide assignment operator 184 G4VMscModel & operator=(const G4VMscModel & << 129 G4VMscModel & operator=(const G4VMscModel &right); 185 G4VMscModel(const G4VMscModel&) = delete; << 130 G4VMscModel(const G4VMscModel&); 186 << 187 private: << 188 131 189 G4SafetyHelper* safetyHelper = nullptr; << 132 G4SafetyHelper* safetyHelper; 190 G4VEnergyLossProcess* ionisation = nullptr; << 191 const G4ParticleDefinition* currentPart = nu << 192 << 193 G4double dedx = 0.0; << 194 G4double localtkin = 0.0; << 195 G4double localrange = DBL_MAX; << 196 133 197 protected: 134 protected: 198 135 199 G4double facrange = 0.04; << 136 G4double facrange; 200 G4double facgeom = 2.5; << 137 G4double facgeom; 201 G4double facsafety = 0.6; << 138 G4double facsafety; 202 G4double skin = 1.0; << 139 G4double skin; 203 G4double dtrl = 0.05; << 140 G4double dtrl; 204 G4double lambdalimit; 141 G4double lambdalimit; 205 G4double geomMin; << 142 G4double geommax; 206 G4double geomMax; << 207 143 208 G4ThreeVector fDisplacement; << 209 G4MscStepLimitType steppingAlgorithm; 144 G4MscStepLimitType steppingAlgorithm; 210 145 211 G4bool samplez = false; << 146 G4bool samplez; 212 G4bool latDisplasment = true; << 147 G4bool latDisplasment; 213 148 214 private: << 215 << 216 G4bool useSpline = true; << 217 }; 149 }; 218 150 219 //....oooOO0OOooo........oooOO0OOooo........oo 151 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 220 //....oooOO0OOooo........oooOO0OOooo........oo 152 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 221 153 222 inline void G4VMscModel::SetLateralDisplasment 154 inline void G4VMscModel::SetLateralDisplasmentFlag(G4bool val) 223 { 155 { 224 if(!IsLocked()) { latDisplasment = val; } << 156 latDisplasment = val; 225 } 157 } 226 158 227 //....oooOO0OOooo........oooOO0OOooo........oo 159 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 228 160 229 inline void G4VMscModel::SetSkin(G4double val) 161 inline void G4VMscModel::SetSkin(G4double val) 230 { 162 { 231 if(!IsLocked()) { skin = val; } << 163 skin = val; 232 } 164 } 233 165 234 //....oooOO0OOooo........oooOO0OOooo........oo 166 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 235 167 236 inline void G4VMscModel::SetRangeFactor(G4doub 168 inline void G4VMscModel::SetRangeFactor(G4double val) 237 { 169 { 238 if(!IsLocked()) { facrange = val; } << 170 facrange = val; 239 } 171 } 240 172 241 //....oooOO0OOooo........oooOO0OOooo........oo 173 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 242 174 243 inline void G4VMscModel::SetGeomFactor(G4doubl 175 inline void G4VMscModel::SetGeomFactor(G4double val) 244 { 176 { 245 if(!IsLocked()) { facgeom = val; } << 177 facgeom = val; 246 } << 247 << 248 //....oooOO0OOooo........oooOO0OOooo........oo << 249 << 250 inline void G4VMscModel::SetLambdaLimit(G4doub << 251 { << 252 if(!IsLocked()) { lambdalimit = val; } << 253 } << 254 << 255 //....oooOO0OOooo........oooOO0OOooo........oo << 256 << 257 inline void G4VMscModel::SetSafetyFactor(G4dou << 258 { << 259 if(!IsLocked()) { facsafety = val; } << 260 } 178 } 261 179 262 //....oooOO0OOooo........oooOO0OOooo........oo 180 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 263 181 264 inline void G4VMscModel::SetStepLimitType(G4Ms 182 inline void G4VMscModel::SetStepLimitType(G4MscStepLimitType val) 265 { 183 { 266 if(!IsLocked()) { steppingAlgorithm = val; } << 184 steppingAlgorithm = val; 267 } 185 } 268 186 269 //....oooOO0OOooo........oooOO0OOooo........oo 187 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 270 188 271 inline void G4VMscModel::SetSampleZ(G4bool val 189 inline void G4VMscModel::SetSampleZ(G4bool val) 272 { 190 { 273 if(!IsLocked()) { samplez = val; } << 191 samplez = val; 274 } 192 } 275 193 276 //....oooOO0OOooo........oooOO0OOooo........oo 194 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 277 195 278 inline G4double G4VMscModel::ComputeSafety(con 196 inline G4double G4VMscModel::ComputeSafety(const G4ThreeVector& position, 279 G4double limit) << 197 G4double) 280 { 198 { 281 return safetyHelper->ComputeSafety(position << 199 return safetyHelper->ComputeSafety(position); 282 } << 283 << 284 //....oooOO0OOooo........oooOO0OOooo........oo << 285 << 286 inline G4double G4VMscModel::ConvertTrueToGeom << 287 G4double& glength) << 288 { << 289 glength = ComputeGeomPathLength(tlength); << 290 // should return true length << 291 return tlength; << 292 } 200 } 293 201 294 //....oooOO0OOooo........oooOO0OOooo........oo 202 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 295 203 296 inline G4double G4VMscModel::ComputeGeomLimit( 204 inline G4double G4VMscModel::ComputeGeomLimit(const G4Track& track, 297 G4double& presafety, 205 G4double& presafety, 298 G4double limit) 206 G4double limit) 299 { 207 { 300 return safetyHelper->CheckNextStep( << 208 G4double res = geommax; >> 209 if(track.GetVolume() != safetyHelper->GetWorldVolume()) { >> 210 res = safetyHelper->CheckNextStep( 301 track.GetStep()->GetPreStepPoint()-> 211 track.GetStep()->GetPreStepPoint()->GetPosition(), 302 track.GetMomentumDirection(), 212 track.GetMomentumDirection(), 303 limit, presafety); 213 limit, presafety); 304 } << 305 << 306 //....oooOO0OOooo........oooOO0OOooo........oo << 307 << 308 inline G4VEnergyLossProcess* G4VMscModel::GetI << 309 { << 310 return ionisation; << 311 } << 312 << 313 //....oooOO0OOooo........oooOO0OOooo........oo << 314 << 315 inline void G4VMscModel::SetIonisation(G4VEner << 316 const G4ParticleDefinition* par << 317 { << 318 ionisation = p; << 319 currentPart = part; << 320 } << 321 << 322 //....oooOO0OOooo........oooOO0OOooo........oo << 323 << 324 inline G4double << 325 G4VMscModel::GetTransportMeanFreePath(const G4 << 326 G4double << 327 { << 328 G4double x; << 329 if (nullptr != xSectionTable) { << 330 x = pFactor*(*xSectionTable)[basedCoupleIn << 331 } else { << 332 x = pFactor*CrossSectionPerVolume(pBaseMat << 333 } << 334 return (x > 0.0) ? 1.0/x : DBL_MAX; << 335 } << 336 << 337 //....oooOO0OOooo........oooOO0OOooo........oo << 338 << 339 inline G4double << 340 G4VMscModel::GetTransportMeanFreePath(const G4 << 341 G4double << 342 { << 343 G4double x; << 344 if (nullptr != xSectionTable) { << 345 x = pFactor*(*xSectionTable)[basedCoupleIn << 346 } else { << 347 x = pFactor*CrossSectionPerVolume(pBaseMat << 348 } 214 } 349 return (x > 0.0) ? 1.0/x : DBL_MAX; << 215 return res; 350 } << 351 << 352 //....oooOO0OOooo........oooOO0OOooo........oo << 353 << 354 inline void G4VMscModel::SetUseSplineForMSC(G4 << 355 { << 356 useSpline = val; << 357 } 216 } 358 217 359 //....oooOO0OOooo........oooOO0OOooo........oo 218 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 360 219 361 #endif 220 #endif >> 221 362 222