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