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: G4VEmModel 31 // File name: G4VEmModel 32 // 32 // 33 // Author: Vladimir Ivanchenko 33 // Author: Vladimir Ivanchenko 34 // 34 // 35 // Creation date: 03.01.2002 35 // Creation date: 03.01.2002 36 // 36 // 37 // Modifications: 37 // Modifications: 38 // 38 // 39 // 23-12-02 V.Ivanchenko change interface befo 39 // 23-12-02 V.Ivanchenko change interface before move to cut per region 40 // 24-01-03 Cut per region (V.Ivanchenko) 40 // 24-01-03 Cut per region (V.Ivanchenko) 41 // 13-02-03 Add name (V.Ivanchenko) 41 // 13-02-03 Add name (V.Ivanchenko) 42 // 25-02-03 Add sample theta and displacement 42 // 25-02-03 Add sample theta and displacement (V.Ivanchenko) 43 // 23-07-03 Replace G4Material by G4MaterialCu 43 // 23-07-03 Replace G4Material by G4MaterialCutCouple in dE/dx and CrossSection 44 // calculation (V.Ivanchenko) 44 // calculation (V.Ivanchenko) 45 // 01-03-04 L.Urban signature changed in Sampl 45 // 01-03-04 L.Urban signature changed in SampleCosineTheta 46 // 23-04-04 L.urban signature of SampleCosineT 46 // 23-04-04 L.urban signature of SampleCosineTheta changed back 47 // 17-11-04 Add method CrossSectionPerAtom (V. 47 // 17-11-04 Add method CrossSectionPerAtom (V.Ivanchenko) 48 // 14-03-05 Reduce number of pure virtual meth 48 // 14-03-05 Reduce number of pure virtual methods and make inline part 49 // separate (V.Ivanchenko) 49 // separate (V.Ivanchenko) 50 // 24-03-05 Remove IsInCharge and add G4VParti 50 // 24-03-05 Remove IsInCharge and add G4VParticleChange in the constructor (VI) 51 // 08-04-05 Major optimisation of internal int 51 // 08-04-05 Major optimisation of internal interfaces (V.Ivantchenko) 52 // 15-04-05 optimize internal interface for ms 52 // 15-04-05 optimize internal interface for msc (V.Ivanchenko) 53 // 08-05-05 A -> N (V.Ivanchenko) 53 // 08-05-05 A -> N (V.Ivanchenko) 54 // 25-07-05 Move constructor and destructor to 54 // 25-07-05 Move constructor and destructor to the body (V.Ivanchenko) 55 // 02-02-06 ComputeCrossSectionPerAtom: defaul 55 // 02-02-06 ComputeCrossSectionPerAtom: default value A=0. (mma) 56 // 06-02-06 add method ComputeMeanFreePath() ( 56 // 06-02-06 add method ComputeMeanFreePath() (mma) 57 // 07-03-06 Optimize msc methods (V.Ivanchenko 57 // 07-03-06 Optimize msc methods (V.Ivanchenko) 58 // 29-06-06 Add member currentElement and Get/ 58 // 29-06-06 Add member currentElement and Get/Set methods (V.Ivanchenko) 59 // 29-10-07 Added SampleScattering (V.Ivanchen 59 // 29-10-07 Added SampleScattering (V.Ivanchenko) 60 // 15-07-08 Reorder class members and improve 60 // 15-07-08 Reorder class members and improve comments (VI) 61 // 21-07-08 Added vector of G4ElementSelector 61 // 21-07-08 Added vector of G4ElementSelector and methods to use it (VI) 62 // 12-09-08 Added methods GetParticleCharge, G 62 // 12-09-08 Added methods GetParticleCharge, GetChargeSquareRatio, 63 // CorrectionsAlongStep, ActivateNucl 63 // CorrectionsAlongStep, ActivateNuclearStopping (VI) 64 // 16-02-09 Moved implementations of virtual m 64 // 16-02-09 Moved implementations of virtual methods to source (VI) 65 // 07-04-09 Moved msc methods from G4VEmModel 65 // 07-04-09 Moved msc methods from G4VEmModel to G4VMscModel (VI) 66 // 13-10-10 Added G4VEmAngularDistribution (VI 66 // 13-10-10 Added G4VEmAngularDistribution (VI) 67 // 67 // 68 // Class Description: 68 // Class Description: 69 // 69 // 70 // Abstract interface to energy loss models 70 // Abstract interface to energy loss models 71 71 72 // ------------------------------------------- 72 // ------------------------------------------------------------------- 73 // 73 // 74 74 75 #ifndef G4VEmModel_h 75 #ifndef G4VEmModel_h 76 #define G4VEmModel_h 1 76 #define G4VEmModel_h 1 77 77 78 #include "globals.hh" 78 #include "globals.hh" 79 #include "G4DynamicParticle.hh" 79 #include "G4DynamicParticle.hh" 80 #include "G4ParticleDefinition.hh" 80 #include "G4ParticleDefinition.hh" 81 #include "G4MaterialCutsCouple.hh" 81 #include "G4MaterialCutsCouple.hh" 82 #include "G4Material.hh" 82 #include "G4Material.hh" 83 #include "G4Element.hh" 83 #include "G4Element.hh" 84 #include "G4ElementVector.hh" 84 #include "G4ElementVector.hh" 85 #include "G4Isotope.hh" 85 #include "G4Isotope.hh" 86 #include "G4DataVector.hh" 86 #include "G4DataVector.hh" 87 #include "G4VEmFluctuationModel.hh" 87 #include "G4VEmFluctuationModel.hh" 88 #include "G4VEmAngularDistribution.hh" 88 #include "G4VEmAngularDistribution.hh" 89 #include "G4EmElementSelector.hh" 89 #include "G4EmElementSelector.hh" 90 #include <CLHEP/Random/RandomEngine.h> 90 #include <CLHEP/Random/RandomEngine.h> 91 #include <vector> 91 #include <vector> 92 92 93 class G4ElementData; 93 class G4ElementData; 94 class G4PhysicsTable; 94 class G4PhysicsTable; 95 class G4Region; 95 class G4Region; 96 class G4VParticleChange; 96 class G4VParticleChange; 97 class G4ParticleChangeForLoss; 97 class G4ParticleChangeForLoss; 98 class G4ParticleChangeForGamma; 98 class G4ParticleChangeForGamma; 99 class G4Track; 99 class G4Track; 100 class G4LossTableManager; 100 class G4LossTableManager; 101 101 102 class G4VEmModel 102 class G4VEmModel 103 { 103 { 104 104 105 public: 105 public: 106 106 107 explicit G4VEmModel(const G4String& nam); 107 explicit G4VEmModel(const G4String& nam); 108 108 109 virtual ~G4VEmModel(); 109 virtual ~G4VEmModel(); 110 110 111 //------------------------------------------ 111 //------------------------------------------------------------------------ 112 // Virtual methods to be implemented for any 112 // Virtual methods to be implemented for any concrete model 113 //------------------------------------------ 113 //------------------------------------------------------------------------ 114 114 115 virtual void Initialise(const G4ParticleDefi 115 virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&) = 0; 116 116 117 virtual void SampleSecondaries(std::vector<G 117 virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*, 118 const G4Mater 118 const G4MaterialCutsCouple*, 119 const G4Dynam 119 const G4DynamicParticle*, 120 G4double tmin 120 G4double tmin = 0.0, 121 G4double tmax 121 G4double tmax = DBL_MAX) = 0; 122 122 123 //------------------------------------------ 123 //------------------------------------------------------------------------ 124 // Methods for initialisation of MT; may be 124 // Methods for initialisation of MT; may be overwritten if needed 125 //------------------------------------------ 125 //------------------------------------------------------------------------ 126 126 127 // initialisation in local thread 127 // initialisation in local thread 128 virtual void InitialiseLocal(const G4Particl 128 virtual void InitialiseLocal(const G4ParticleDefinition*, 129 G4VEmModel* mas 129 G4VEmModel* masterModel); 130 130 131 // initialisation of a new material at run t 131 // initialisation of a new material at run time 132 virtual void InitialiseForMaterial(const G4P 132 virtual void InitialiseForMaterial(const G4ParticleDefinition*, 133 const G4M 133 const G4Material*); 134 134 135 // initialisation of a new element at run ti 135 // initialisation of a new element at run time 136 virtual void InitialiseForElement(const G4Pa 136 virtual void InitialiseForElement(const G4ParticleDefinition*, 137 G4int Z); 137 G4int Z); 138 138 139 //------------------------------------------ 139 //------------------------------------------------------------------------ 140 // Methods with standard implementation; may 140 // Methods with standard implementation; may be overwritten if needed 141 //------------------------------------------ 141 //------------------------------------------------------------------------ 142 142 143 // main method to compute dEdx 143 // main method to compute dEdx 144 virtual G4double ComputeDEDXPerVolume(const 144 virtual G4double ComputeDEDXPerVolume(const G4Material*, 145 const 145 const G4ParticleDefinition*, 146 G4doub 146 G4double kineticEnergy, 147 G4doub 147 G4double cutEnergy = DBL_MAX); 148 148 149 // main method to compute cross section per 149 // main method to compute cross section per Volume 150 virtual G4double CrossSectionPerVolume(const 150 virtual G4double CrossSectionPerVolume(const G4Material*, 151 const 151 const G4ParticleDefinition*, 152 G4dou 152 G4double kineticEnergy, 153 G4dou 153 G4double cutEnergy = 0.0, 154 G4dou 154 G4double maxEnergy = DBL_MAX); 155 155 156 // method to get partial cross section 156 // method to get partial cross section 157 virtual G4double GetPartialCrossSection(cons 157 virtual G4double GetPartialCrossSection(const G4Material*, 158 G4in 158 G4int level, 159 cons 159 const G4ParticleDefinition*, 160 G4do 160 G4double kineticEnergy); 161 161 162 // main method to compute cross section per 162 // main method to compute cross section per atom 163 virtual G4double ComputeCrossSectionPerAtom( 163 virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*, 164 164 G4double kinEnergy, 165 165 G4double Z, 166 166 G4double A = 0., /* amu */ 167 167 G4double cutEnergy = 0.0, 168 168 G4double maxEnergy = DBL_MAX); 169 169 170 // main method to compute cross section per 170 // main method to compute cross section per atomic shell 171 virtual G4double ComputeCrossSectionPerShell 171 virtual G4double ComputeCrossSectionPerShell(const G4ParticleDefinition*, 172 172 G4int Z, G4int shellIdx, 173 173 G4double kinEnergy, 174 174 G4double cutEnergy = 0.0, 175 175 G4double maxEnergy = DBL_MAX); 176 176 177 // Compute effective ion charge square 177 // Compute effective ion charge square 178 virtual G4double ChargeSquareRatio(const G4T 178 virtual G4double ChargeSquareRatio(const G4Track&); 179 179 180 // Compute effective ion charge square 180 // Compute effective ion charge square 181 virtual G4double GetChargeSquareRatio(const 181 virtual G4double GetChargeSquareRatio(const G4ParticleDefinition*, 182 const 182 const G4Material*, 183 G4doub 183 G4double kineticEnergy); 184 184 185 // Compute ion charge 185 // Compute ion charge 186 virtual G4double GetParticleCharge(const G4P 186 virtual G4double GetParticleCharge(const G4ParticleDefinition*, 187 const G4M 187 const G4Material*, 188 G4double 188 G4double kineticEnergy); 189 189 190 // Initialisation for a new track 190 // Initialisation for a new track 191 virtual void StartTracking(G4Track*); 191 virtual void StartTracking(G4Track*); 192 192 193 // add correction to energy loss and compute 193 // add correction to energy loss and compute non-ionizing energy loss 194 virtual void CorrectionsAlongStep(const G4Ma 194 virtual void CorrectionsAlongStep(const G4MaterialCutsCouple*, 195 const G4Dy 195 const G4DynamicParticle*, 196 const G4do 196 const G4double& length, 197 G4double& 197 G4double& eloss); 198 198 199 // value which may be tabulated (by default 199 // value which may be tabulated (by default cross section) 200 virtual G4double Value(const G4MaterialCutsC 200 virtual G4double Value(const G4MaterialCutsCouple*, 201 const G4ParticleDefin 201 const G4ParticleDefinition*, 202 G4double kineticEnerg 202 G4double kineticEnergy); 203 203 204 // threshold for zero value 204 // threshold for zero value 205 virtual G4double MinPrimaryEnergy(const G4Ma 205 virtual G4double MinPrimaryEnergy(const G4Material*, 206 const G4Pa 206 const G4ParticleDefinition*, 207 G4double c 207 G4double cut = 0.0); 208 208 209 // model can define low-energy limit for the 209 // model can define low-energy limit for the cut 210 virtual G4double MinEnergyCut(const G4Partic 210 virtual G4double MinEnergyCut(const G4ParticleDefinition*, 211 const G4Materi 211 const G4MaterialCutsCouple*); 212 212 213 // initialisation at run time for a given ma 213 // initialisation at run time for a given material 214 virtual void SetupForMaterial(const G4Partic 214 virtual void SetupForMaterial(const G4ParticleDefinition*, 215 const G4Materi 215 const G4Material*, 216 G4double kinet 216 G4double kineticEnergy); 217 217 218 // add a region for the model 218 // add a region for the model 219 virtual void DefineForRegion(const G4Region* 219 virtual void DefineForRegion(const G4Region*); 220 220 221 // fill number of different type of secondar 221 // fill number of different type of secondaries after SampleSecondaries(...) 222 virtual void FillNumberOfSecondaries(G4int& 222 virtual void FillNumberOfSecondaries(G4int& numberOfTriplets, 223 G4int& 223 G4int& numberOfRecoil); 224 224 225 // for automatic documentation 225 // for automatic documentation 226 virtual void ModelDescription(std::ostream& 226 virtual void ModelDescription(std::ostream& outFile) const; 227 227 228 protected: 228 protected: 229 229 230 // initialisation of the ParticleChange for 230 // initialisation of the ParticleChange for the model 231 G4ParticleChangeForLoss* GetParticleChangeFo 231 G4ParticleChangeForLoss* GetParticleChangeForLoss(); 232 232 233 // initialisation of the ParticleChange for 233 // initialisation of the ParticleChange for the model 234 G4ParticleChangeForGamma* GetParticleChangeF 234 G4ParticleChangeForGamma* GetParticleChangeForGamma(); 235 235 236 // kinematically allowed max kinetic energy 236 // kinematically allowed max kinetic energy of a secondary 237 virtual G4double MaxSecondaryEnergy(const G4 237 virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*, 238 G4double 238 G4double kineticEnergy); 239 239 240 public: 240 public: 241 241 242 //------------------------------------------ 242 //------------------------------------------------------------------------ 243 // Generic methods common to all models 243 // Generic methods common to all models 244 //------------------------------------------ 244 //------------------------------------------------------------------------ 245 245 246 // should be called at initialisation to bui 246 // should be called at initialisation to build element selectors 247 void InitialiseElementSelectors(const G4Part 247 void InitialiseElementSelectors(const G4ParticleDefinition*, 248 const G4Data 248 const G4DataVector&); 249 249 250 // should be called at initialisation to acc 250 // should be called at initialisation to access element selectors 251 inline std::vector<G4EmElementSelector*>* Ge 251 inline std::vector<G4EmElementSelector*>* GetElementSelectors(); 252 252 253 // should be called at initialisation to set 253 // should be called at initialisation to set element selectors 254 inline void SetElementSelectors(std::vector< 254 inline void SetElementSelectors(std::vector<G4EmElementSelector*>*); 255 255 256 // dEdx per unit length, base material appro 256 // dEdx per unit length, base material approach may be used 257 inline G4double ComputeDEDX( const G4Materia 257 inline G4double ComputeDEDX( const G4MaterialCutsCouple*, 258 const G4Particl 258 const G4ParticleDefinition*, 259 G4double kineti 259 G4double kineticEnergy, 260 G4double cutEne 260 G4double cutEnergy = DBL_MAX); 261 261 262 // cross section per volume, base material a 262 // cross section per volume, base material approach may be used 263 inline G4double CrossSection(const G4Materia 263 inline G4double CrossSection(const G4MaterialCutsCouple*, 264 const G4Particl 264 const G4ParticleDefinition*, 265 G4double kineti 265 G4double kineticEnergy, 266 G4double cutEne 266 G4double cutEnergy = 0.0, 267 G4double maxEne 267 G4double maxEnergy = DBL_MAX); 268 268 269 // compute mean free path via cross section 269 // compute mean free path via cross section per volume 270 inline G4double ComputeMeanFreePath(const G4 270 inline G4double ComputeMeanFreePath(const G4ParticleDefinition*, 271 G4double 271 G4double kineticEnergy, 272 const G4 272 const G4Material*, 273 G4double 273 G4double cutEnergy = 0.0, 274 G4double 274 G4double maxEnergy = DBL_MAX); 275 275 276 // generic cross section per element 276 // generic cross section per element 277 inline G4double ComputeCrossSectionPerAtom(c 277 inline G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*, 278 c 278 const G4Element*, 279 G 279 G4double kinEnergy, 280 G 280 G4double cutEnergy = 0.0, 281 G 281 G4double maxEnergy = DBL_MAX); 282 282 283 // atom can be selected effitiantly if eleme 283 // atom can be selected effitiantly if element selectors are initialised 284 inline const G4Element* SelectRandomAtom(con 284 inline const G4Element* SelectRandomAtom(const G4MaterialCutsCouple*, 285 con 285 const G4ParticleDefinition*, 286 G4d 286 G4double kineticEnergy, 287 G4d 287 G4double cutEnergy = 0.0, 288 G4d 288 G4double maxEnergy = DBL_MAX); 289 // same as SelectRandomAtom above but more e 289 // same as SelectRandomAtom above but more efficient since log-ekin is known 290 inline const G4Element* SelectTargetAtom(con 290 inline const G4Element* SelectTargetAtom(const G4MaterialCutsCouple*, 291 con 291 const G4ParticleDefinition*, 292 G4d 292 G4double kineticEnergy, 293 G4d 293 G4double logKineticEnergy, 294 G4d 294 G4double cutEnergy = 0.0, 295 G4d 295 G4double maxEnergy = DBL_MAX); 296 296 >> 297 297 // to select atom cross section per volume i 298 // to select atom cross section per volume is recomputed for each element 298 const G4Element* SelectRandomAtom(const G4Ma 299 const G4Element* SelectRandomAtom(const G4Material*, 299 const G4Pa 300 const G4ParticleDefinition*, 300 G4double k 301 G4double kineticEnergy, 301 G4double c 302 G4double cutEnergy = 0.0, 302 G4double m 303 G4double maxEnergy = DBL_MAX); 303 304 304 // to select atom if cross section is propor 305 // to select atom if cross section is proportional number of electrons 305 const G4Element* GetCurrentElement(const G4M << 306 G4int SelectRandomAtomNumber(const G4Material*); 306 G4int SelectRandomAtomNumber(const G4Materia << 307 307 308 // select isotope in order to have precise m 308 // select isotope in order to have precise mass of the nucleus 309 const G4Isotope* GetCurrentIsotope(const G4E << 309 G4int SelectIsotopeNumber(const G4Element*); 310 G4int SelectIsotopeNumber(const G4Element*) << 311 310 312 //------------------------------------------ 311 //------------------------------------------------------------------------ 313 // Get/Set methods 312 // Get/Set methods 314 //------------------------------------------ 313 //------------------------------------------------------------------------ 315 314 316 void SetParticleChange(G4VParticleChange*, G 315 void SetParticleChange(G4VParticleChange*, G4VEmFluctuationModel* f=nullptr); 317 316 318 void SetCrossSectionTable(G4PhysicsTable*, G 317 void SetCrossSectionTable(G4PhysicsTable*, G4bool isLocal); 319 318 320 inline G4ElementData* GetElementData(); 319 inline G4ElementData* GetElementData(); 321 320 322 inline G4PhysicsTable* GetCrossSectionTable( 321 inline G4PhysicsTable* GetCrossSectionTable(); 323 322 324 inline G4VEmFluctuationModel* GetModelOfFluc 323 inline G4VEmFluctuationModel* GetModelOfFluctuations(); 325 324 326 inline G4VEmAngularDistribution* GetAngularD 325 inline G4VEmAngularDistribution* GetAngularDistribution(); 327 326 328 inline G4VEmModel* GetTripletModel(); 327 inline G4VEmModel* GetTripletModel(); 329 328 330 inline void SetTripletModel(G4VEmModel*); 329 inline void SetTripletModel(G4VEmModel*); 331 330 332 inline void SetAngularDistribution(G4VEmAngu 331 inline void SetAngularDistribution(G4VEmAngularDistribution*); 333 332 334 inline G4double HighEnergyLimit() const; 333 inline G4double HighEnergyLimit() const; 335 334 336 inline G4double LowEnergyLimit() const; 335 inline G4double LowEnergyLimit() const; 337 336 338 inline G4double HighEnergyActivationLimit() 337 inline G4double HighEnergyActivationLimit() const; 339 338 340 inline G4double LowEnergyActivationLimit() c 339 inline G4double LowEnergyActivationLimit() const; 341 340 342 inline G4double PolarAngleLimit() const; 341 inline G4double PolarAngleLimit() const; 343 342 344 inline G4double SecondaryThreshold() const; 343 inline G4double SecondaryThreshold() const; 345 344 >> 345 inline G4bool LPMFlag() const; >> 346 346 inline G4bool DeexcitationFlag() const; 347 inline G4bool DeexcitationFlag() const; 347 348 348 inline G4bool ForceBuildTableFlag() const; 349 inline G4bool ForceBuildTableFlag() const; 349 350 350 inline G4bool UseAngularGeneratorFlag() cons 351 inline G4bool UseAngularGeneratorFlag() const; 351 352 352 inline void SetAngularGeneratorFlag(G4bool); 353 inline void SetAngularGeneratorFlag(G4bool); 353 354 354 inline void SetHighEnergyLimit(G4double); 355 inline void SetHighEnergyLimit(G4double); 355 356 356 inline void SetLowEnergyLimit(G4double); 357 inline void SetLowEnergyLimit(G4double); 357 358 358 inline void SetActivationHighEnergyLimit(G4d 359 inline void SetActivationHighEnergyLimit(G4double); 359 360 360 inline void SetActivationLowEnergyLimit(G4do 361 inline void SetActivationLowEnergyLimit(G4double); 361 362 362 inline G4bool IsActive(G4double kinEnergy) c 363 inline G4bool IsActive(G4double kinEnergy) const; 363 364 364 inline void SetPolarAngleLimit(G4double); 365 inline void SetPolarAngleLimit(G4double); 365 366 366 inline void SetSecondaryThreshold(G4double); 367 inline void SetSecondaryThreshold(G4double); 367 368 >> 369 inline void SetLPMFlag(G4bool val); >> 370 368 inline void SetDeexcitationFlag(G4bool val); 371 inline void SetDeexcitationFlag(G4bool val); 369 372 370 inline void SetForceBuildTable(G4bool val); 373 inline void SetForceBuildTable(G4bool val); 371 374 372 inline void SetFluctuationFlag(G4bool val); 375 inline void SetFluctuationFlag(G4bool val); 373 376 >> 377 inline void SetMasterThread(G4bool val); >> 378 374 inline G4bool IsMaster() const; 379 inline G4bool IsMaster() const; 375 380 376 inline void SetUseBaseMaterials(G4bool val); 381 inline void SetUseBaseMaterials(G4bool val); 377 382 378 inline G4bool UseBaseMaterials() const; 383 inline G4bool UseBaseMaterials() const; 379 384 380 inline G4double MaxSecondaryKinEnergy(const 385 inline G4double MaxSecondaryKinEnergy(const G4DynamicParticle* dynParticle); 381 386 382 inline const G4String& GetName() const; 387 inline const G4String& GetName() const; 383 388 384 inline void SetCurrentCouple(const G4Materia 389 inline void SetCurrentCouple(const G4MaterialCutsCouple*); 385 390 386 inline G4bool IsLocked() const; << 391 inline const G4Element* GetCurrentElement() const; 387 392 388 inline void SetLocked(G4bool); << 393 inline const G4Isotope* GetCurrentIsotope() const; 389 394 390 // obsolete methods << 395 inline G4bool IsLocked() const; 391 [[deprecated("Use G4EmParameters::Instance() << 392 void SetLPMFlag(G4bool); << 393 396 394 void SetMasterThread(G4bool); << 397 inline void SetLocked(G4bool); 395 398 396 // hide assignment operator 399 // hide assignment operator 397 G4VEmModel & operator=(const G4VEmModel &ri 400 G4VEmModel & operator=(const G4VEmModel &right) = delete; 398 G4VEmModel(const G4VEmModel&) = delete; 401 G4VEmModel(const G4VEmModel&) = delete; 399 402 400 protected: 403 protected: 401 404 402 inline const G4MaterialCutsCouple* CurrentCo 405 inline const G4MaterialCutsCouple* CurrentCouple() const; 403 406 404 inline void SetCurrentElement(const G4Elemen 407 inline void SetCurrentElement(const G4Element*); 405 408 406 private: 409 private: 407 410 408 // ======== Parameters of the class fixed at 411 // ======== Parameters of the class fixed at construction ========= 409 412 410 G4VEmFluctuationModel* flucModel = null 413 G4VEmFluctuationModel* flucModel = nullptr; 411 G4VEmAngularDistribution* anglModel = null 414 G4VEmAngularDistribution* anglModel = nullptr; 412 G4VEmModel* fTripletModel = 415 G4VEmModel* fTripletModel = nullptr; 413 const G4MaterialCutsCouple* fCurrentCouple = 416 const G4MaterialCutsCouple* fCurrentCouple = nullptr; 414 const G4Element* fCurrentElement 417 const G4Element* fCurrentElement = nullptr; >> 418 const G4Isotope* fCurrentIsotope = nullptr; 415 std::vector<G4EmElementSelector*>* elmSelect 419 std::vector<G4EmElementSelector*>* elmSelectors = nullptr; 416 G4LossTableManager* fEmManager; 420 G4LossTableManager* fEmManager; 417 421 418 protected: 422 protected: 419 423 420 G4ElementData* fElementData = 424 G4ElementData* fElementData = nullptr; 421 G4VParticleChange* pParticleChange 425 G4VParticleChange* pParticleChange = nullptr; 422 G4PhysicsTable* xSectionTable = 426 G4PhysicsTable* xSectionTable = nullptr; 423 const G4Material* pBaseMaterial = 427 const G4Material* pBaseMaterial = nullptr; 424 const std::vector<G4double>* theDensityFacto 428 const std::vector<G4double>* theDensityFactor = nullptr; 425 const std::vector<G4int>* theDensityIdx = 429 const std::vector<G4int>* theDensityIdx = nullptr; 426 430 427 G4double inveplus; 431 G4double inveplus; 428 G4double pFactor = 1.0; 432 G4double pFactor = 1.0; 429 433 430 private: 434 private: 431 435 432 G4double lowLimit; 436 G4double lowLimit; 433 G4double highLimit; 437 G4double highLimit; 434 G4double eMinActive = 0.0; 438 G4double eMinActive = 0.0; 435 G4double eMaxActive = DBL_MAX; 439 G4double eMaxActive = DBL_MAX; 436 G4double secondaryThreshold = DBL_MAX; 440 G4double secondaryThreshold = DBL_MAX; 437 G4double polarAngleLimit; 441 G4double polarAngleLimit; 438 442 439 G4int nSelectors = 0; 443 G4int nSelectors = 0; 440 G4int nsec = 5; 444 G4int nsec = 5; 441 445 442 protected: 446 protected: 443 447 444 std::size_t currentCoupleIndex = 0; << 448 size_t currentCoupleIndex = 0; 445 std::size_t basedCoupleIndex = 0; << 449 size_t basedCoupleIndex = 0; 446 G4bool lossFlucFlag = true; 450 G4bool lossFlucFlag = true; 447 451 448 private: 452 private: 449 453 >> 454 G4bool theLPMflag = false; 450 G4bool flagDeexcitation = false; 455 G4bool flagDeexcitation = false; 451 G4bool flagForceBuildTable = false; 456 G4bool flagForceBuildTable = false; 452 G4bool isMaster = true; 457 G4bool isMaster = true; 453 458 454 G4bool localTable = true; 459 G4bool localTable = true; 455 G4bool localElmSelectors = true; 460 G4bool localElmSelectors = true; 456 G4bool useAngularGenerator = false; 461 G4bool useAngularGenerator = false; 457 G4bool useBaseMaterials = false; 462 G4bool useBaseMaterials = false; 458 G4bool isLocked = false; 463 G4bool isLocked = false; 459 464 460 const G4String name; 465 const G4String name; 461 std::vector<G4double> xsec; 466 std::vector<G4double> xsec; 462 467 463 }; 468 }; 464 469 465 // ======== Run time inline methods ========== 470 // ======== Run time inline methods ================ 466 471 467 inline void G4VEmModel::SetCurrentCouple(const 472 inline void G4VEmModel::SetCurrentCouple(const G4MaterialCutsCouple* ptr) 468 { 473 { 469 if(fCurrentCouple != ptr) { 474 if(fCurrentCouple != ptr) { 470 fCurrentCouple = ptr; 475 fCurrentCouple = ptr; 471 basedCoupleIndex = currentCoupleIndex = pt 476 basedCoupleIndex = currentCoupleIndex = ptr->GetIndex(); 472 pBaseMaterial = ptr->GetMaterial(); 477 pBaseMaterial = ptr->GetMaterial(); 473 pFactor = 1.0; 478 pFactor = 1.0; 474 if(useBaseMaterials) { 479 if(useBaseMaterials) { 475 basedCoupleIndex = (*theDensityIdx)[curr 480 basedCoupleIndex = (*theDensityIdx)[currentCoupleIndex]; 476 if(nullptr != pBaseMaterial->GetBaseMate 481 if(nullptr != pBaseMaterial->GetBaseMaterial()) 477 pBaseMaterial = pBaseMaterial->GetBaseMateri 482 pBaseMaterial = pBaseMaterial->GetBaseMaterial(); 478 pFactor = (*theDensityFactor)[currentCou 483 pFactor = (*theDensityFactor)[currentCoupleIndex]; 479 } 484 } 480 } 485 } 481 } 486 } 482 487 483 //....oooOO0OOooo........oooOO0OOooo........oo 488 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 484 489 485 inline const G4MaterialCutsCouple* G4VEmModel: 490 inline const G4MaterialCutsCouple* G4VEmModel::CurrentCouple() const 486 { 491 { 487 return fCurrentCouple; 492 return fCurrentCouple; 488 } 493 } 489 494 490 //....oooOO0OOooo........oooOO0OOooo........oo 495 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 491 496 492 inline void G4VEmModel::SetCurrentElement(cons 497 inline void G4VEmModel::SetCurrentElement(const G4Element* elm) 493 { 498 { 494 fCurrentElement = elm; 499 fCurrentElement = elm; >> 500 fCurrentIsotope = nullptr; >> 501 } >> 502 >> 503 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 504 >> 505 inline const G4Element* G4VEmModel::GetCurrentElement() const >> 506 { >> 507 return fCurrentElement; >> 508 } >> 509 >> 510 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 511 >> 512 inline const G4Isotope* G4VEmModel::GetCurrentIsotope() const >> 513 { >> 514 return fCurrentIsotope; 495 } 515 } 496 516 497 //....oooOO0OOooo........oooOO0OOooo........oo 517 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 498 518 499 inline 519 inline 500 G4double G4VEmModel::MaxSecondaryKinEnergy(con 520 G4double G4VEmModel::MaxSecondaryKinEnergy(const G4DynamicParticle* dynPart) 501 { 521 { 502 return MaxSecondaryEnergy(dynPart->GetPartic 522 return MaxSecondaryEnergy(dynPart->GetParticleDefinition(), 503 dynPart->GetKineti 523 dynPart->GetKineticEnergy()); 504 } 524 } 505 525 506 //....oooOO0OOooo........oooOO0OOooo........oo 526 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 507 527 508 inline G4double G4VEmModel::ComputeDEDX(const 528 inline G4double G4VEmModel::ComputeDEDX(const G4MaterialCutsCouple* couple, 509 const 529 const G4ParticleDefinition* part, 510 G4doub 530 G4double kinEnergy, 511 G4doub 531 G4double cutEnergy) 512 { 532 { 513 SetCurrentCouple(couple); 533 SetCurrentCouple(couple); 514 return pFactor*ComputeDEDXPerVolume(pBaseMat 534 return pFactor*ComputeDEDXPerVolume(pBaseMaterial,part,kinEnergy,cutEnergy); 515 } 535 } 516 536 517 //....oooOO0OOooo........oooOO0OOooo........oo 537 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 518 538 519 inline G4double G4VEmModel::CrossSection(const 539 inline G4double G4VEmModel::CrossSection(const G4MaterialCutsCouple* couple, 520 const 540 const G4ParticleDefinition* part, 521 G4dou 541 G4double kinEnergy, 522 G4dou 542 G4double cutEnergy, 523 G4dou 543 G4double maxEnergy) 524 { 544 { 525 SetCurrentCouple(couple); 545 SetCurrentCouple(couple); 526 return pFactor*CrossSectionPerVolume(pBaseMa 546 return pFactor*CrossSectionPerVolume(pBaseMaterial,part,kinEnergy, 527 cutEner 547 cutEnergy,maxEnergy); 528 } 548 } 529 549 530 //....oooOO0OOooo........oooOO0OOooo........oo 550 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 531 551 532 inline 552 inline 533 G4double G4VEmModel::ComputeMeanFreePath(const 553 G4double G4VEmModel::ComputeMeanFreePath(const G4ParticleDefinition* part, 534 G4dou 554 G4double ekin, 535 const 555 const G4Material* material, 536 G4dou 556 G4double emin, 537 G4dou 557 G4double emax) 538 { 558 { 539 G4double cross = CrossSectionPerVolume(mater 559 G4double cross = CrossSectionPerVolume(material,part,ekin,emin,emax); 540 return (cross > 0.0) ? 1./cross : DBL_MAX; 560 return (cross > 0.0) ? 1./cross : DBL_MAX; 541 } 561 } 542 562 543 //....oooOO0OOooo........oooOO0OOooo........oo 563 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 544 564 545 inline G4double 565 inline G4double 546 G4VEmModel::ComputeCrossSectionPerAtom(const G 566 G4VEmModel::ComputeCrossSectionPerAtom(const G4ParticleDefinition* part, 547 const G 567 const G4Element* elm, 548 G4doubl 568 G4double kinEnergy, 549 G4doubl 569 G4double cutEnergy, 550 G4doubl 570 G4double maxEnergy) 551 { 571 { 552 fCurrentElement = elm; << 572 SetCurrentElement(elm); 553 return ComputeCrossSectionPerAtom(part,kinEn 573 return ComputeCrossSectionPerAtom(part,kinEnergy,elm->GetZ(),elm->GetN(), 554 cutEnergy, 574 cutEnergy,maxEnergy); 555 } 575 } 556 576 557 //....oooOO0OOooo........oooOO0OOooo........oo 577 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 558 578 559 inline const G4Element* 579 inline const G4Element* 560 G4VEmModel::SelectRandomAtom(const G4MaterialC 580 G4VEmModel::SelectRandomAtom(const G4MaterialCutsCouple* couple, 561 const G4ParticleD 581 const G4ParticleDefinition* part, 562 G4double kinEnerg 582 G4double kinEnergy, 563 G4double cutEnerg 583 G4double cutEnergy, 564 G4double maxEnerg 584 G4double maxEnergy) 565 { 585 { 566 SetCurrentCouple(couple); 586 SetCurrentCouple(couple); 567 fCurrentElement = (nSelectors > 0) ? 587 fCurrentElement = (nSelectors > 0) ? 568 ((*elmSelectors)[couple->GetIndex()])->Sel 588 ((*elmSelectors)[couple->GetIndex()])->SelectRandomAtom(kinEnergy) : 569 SelectRandomAtom(pBaseMaterial,part,kinEne 589 SelectRandomAtom(pBaseMaterial,part,kinEnergy,cutEnergy,maxEnergy); >> 590 fCurrentIsotope = nullptr; 570 return fCurrentElement; 591 return fCurrentElement; 571 } 592 } 572 593 573 //....oooOO0OOooo........oooOO0OOooo........oo 594 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 574 595 575 inline const G4Element* 596 inline const G4Element* 576 G4VEmModel::SelectTargetAtom(const G4MaterialC 597 G4VEmModel::SelectTargetAtom(const G4MaterialCutsCouple* couple, 577 const G4ParticleD 598 const G4ParticleDefinition* part, 578 G4double kinEnerg 599 G4double kinEnergy, 579 G4double logKinE, 600 G4double logKinE, 580 G4double cutEnerg 601 G4double cutEnergy, 581 G4double maxEnerg 602 G4double maxEnergy) 582 { 603 { 583 SetCurrentCouple(couple); 604 SetCurrentCouple(couple); 584 fCurrentElement = (nSelectors > 0) 605 fCurrentElement = (nSelectors > 0) 585 ? ((*elmSelectors)[couple->GetIndex()])->Se 606 ? ((*elmSelectors)[couple->GetIndex()])->SelectRandomAtom(kinEnergy,logKinE) 586 : SelectRandomAtom(pBaseMaterial,part,kinEn 607 : SelectRandomAtom(pBaseMaterial,part,kinEnergy,cutEnergy,maxEnergy); >> 608 fCurrentIsotope = nullptr; 587 return fCurrentElement; 609 return fCurrentElement; 588 } 610 } 589 611 590 // ======== Get/Set inline methods used at ini 612 // ======== Get/Set inline methods used at initialisation ================ 591 613 592 inline G4VEmFluctuationModel* G4VEmModel::GetM 614 inline G4VEmFluctuationModel* G4VEmModel::GetModelOfFluctuations() 593 { 615 { 594 return flucModel; 616 return flucModel; 595 } 617 } 596 618 597 //....oooOO0OOooo........oooOO0OOooo........oo 619 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 598 620 599 inline G4VEmAngularDistribution* G4VEmModel::G 621 inline G4VEmAngularDistribution* G4VEmModel::GetAngularDistribution() 600 { 622 { 601 return anglModel; 623 return anglModel; 602 } 624 } 603 625 604 //....oooOO0OOooo........oooOO0OOooo........oo 626 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 605 627 606 inline void G4VEmModel::SetAngularDistribution 628 inline void G4VEmModel::SetAngularDistribution(G4VEmAngularDistribution* p) 607 { 629 { 608 if(p != anglModel) { 630 if(p != anglModel) { 609 delete anglModel; 631 delete anglModel; 610 anglModel = p; 632 anglModel = p; 611 } 633 } 612 } 634 } 613 635 614 //....oooOO0OOooo........oooOO0OOooo........oo 636 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 615 637 616 inline G4VEmModel* G4VEmModel::GetTripletModel 638 inline G4VEmModel* G4VEmModel::GetTripletModel() 617 { 639 { 618 return fTripletModel; 640 return fTripletModel; 619 } 641 } 620 642 621 //....oooOO0OOooo........oooOO0OOooo........oo 643 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 622 644 623 inline void G4VEmModel::SetTripletModel(G4VEmM 645 inline void G4VEmModel::SetTripletModel(G4VEmModel* p) 624 { 646 { 625 if(p != fTripletModel) { 647 if(p != fTripletModel) { 626 delete fTripletModel; 648 delete fTripletModel; 627 fTripletModel = p; 649 fTripletModel = p; 628 } 650 } 629 } 651 } 630 652 631 //....oooOO0OOooo........oooOO0OOooo........oo 653 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 632 654 633 inline G4double G4VEmModel::HighEnergyLimit() 655 inline G4double G4VEmModel::HighEnergyLimit() const 634 { 656 { 635 return highLimit; 657 return highLimit; 636 } 658 } 637 659 638 //....oooOO0OOooo........oooOO0OOooo........oo 660 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 639 661 640 inline G4double G4VEmModel::LowEnergyLimit() c 662 inline G4double G4VEmModel::LowEnergyLimit() const 641 { 663 { 642 return lowLimit; 664 return lowLimit; 643 } 665 } 644 666 645 //....oooOO0OOooo........oooOO0OOooo........oo 667 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 646 668 647 inline G4double G4VEmModel::HighEnergyActivati 669 inline G4double G4VEmModel::HighEnergyActivationLimit() const 648 { 670 { 649 return eMaxActive; 671 return eMaxActive; 650 } 672 } 651 673 652 //....oooOO0OOooo........oooOO0OOooo........oo 674 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 653 675 654 inline G4double G4VEmModel::LowEnergyActivatio 676 inline G4double G4VEmModel::LowEnergyActivationLimit() const 655 { 677 { 656 return eMinActive; 678 return eMinActive; 657 } 679 } 658 680 659 //....oooOO0OOooo........oooOO0OOooo........oo 681 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 660 682 661 inline G4double G4VEmModel::PolarAngleLimit() 683 inline G4double G4VEmModel::PolarAngleLimit() const 662 { 684 { 663 return polarAngleLimit; 685 return polarAngleLimit; 664 } 686 } 665 687 666 //....oooOO0OOooo........oooOO0OOooo........oo 688 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 667 689 668 inline G4double G4VEmModel::SecondaryThreshold 690 inline G4double G4VEmModel::SecondaryThreshold() const 669 { 691 { 670 return secondaryThreshold; 692 return secondaryThreshold; 671 } 693 } 672 694 673 //....oooOO0OOooo........oooOO0OOooo........oo 695 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 674 696 >> 697 inline G4bool G4VEmModel::LPMFlag() const >> 698 { >> 699 return theLPMflag; >> 700 } >> 701 >> 702 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 703 675 inline G4bool G4VEmModel::DeexcitationFlag() c 704 inline G4bool G4VEmModel::DeexcitationFlag() const 676 { 705 { 677 return flagDeexcitation; 706 return flagDeexcitation; 678 } 707 } 679 708 680 //....oooOO0OOooo........oooOO0OOooo........oo 709 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 681 710 682 inline G4bool G4VEmModel::ForceBuildTableFlag( 711 inline G4bool G4VEmModel::ForceBuildTableFlag() const 683 { 712 { 684 return flagForceBuildTable; 713 return flagForceBuildTable; 685 } 714 } 686 715 687 //....oooOO0OOooo........oooOO0OOooo........oo 716 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 688 717 689 inline G4bool G4VEmModel::UseAngularGeneratorF 718 inline G4bool G4VEmModel::UseAngularGeneratorFlag() const 690 { 719 { 691 return useAngularGenerator; 720 return useAngularGenerator; 692 } 721 } 693 722 694 //....oooOO0OOooo........oooOO0OOooo........oo 723 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 695 724 696 inline void G4VEmModel::SetAngularGeneratorFla 725 inline void G4VEmModel::SetAngularGeneratorFlag(G4bool val) 697 { 726 { 698 useAngularGenerator = val; 727 useAngularGenerator = val; 699 } 728 } 700 729 701 //....oooOO0OOooo........oooOO0OOooo........oo 730 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 702 731 703 inline void G4VEmModel::SetFluctuationFlag(G4b 732 inline void G4VEmModel::SetFluctuationFlag(G4bool val) 704 { 733 { 705 lossFlucFlag = val; 734 lossFlucFlag = val; 706 } 735 } 707 736 708 //....oooOO0OOooo........oooOO0OOooo........oo 737 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 709 738 >> 739 inline void G4VEmModel::SetMasterThread(G4bool val) >> 740 { >> 741 isMaster = val; >> 742 } >> 743 >> 744 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 745 710 inline G4bool G4VEmModel::IsMaster() const 746 inline G4bool G4VEmModel::IsMaster() const 711 { 747 { 712 return isMaster; 748 return isMaster; 713 } 749 } 714 750 715 //....oooOO0OOooo........oooOO0OOooo........oo 751 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 716 752 717 inline void G4VEmModel::SetUseBaseMaterials(G4 753 inline void G4VEmModel::SetUseBaseMaterials(G4bool val) 718 { 754 { 719 useBaseMaterials = val; 755 useBaseMaterials = val; 720 } 756 } 721 757 722 //....oooOO0OOooo........oooOO0OOooo........oo 758 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 723 759 724 inline G4bool G4VEmModel::UseBaseMaterials() c 760 inline G4bool G4VEmModel::UseBaseMaterials() const 725 { 761 { 726 return useBaseMaterials; 762 return useBaseMaterials; 727 } 763 } 728 764 729 //....oooOO0OOooo........oooOO0OOooo........oo 765 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 730 766 731 inline void G4VEmModel::SetHighEnergyLimit(G4d 767 inline void G4VEmModel::SetHighEnergyLimit(G4double val) 732 { 768 { 733 highLimit = val; 769 highLimit = val; 734 } 770 } 735 771 736 //....oooOO0OOooo........oooOO0OOooo........oo 772 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 737 773 738 inline void G4VEmModel::SetLowEnergyLimit(G4do 774 inline void G4VEmModel::SetLowEnergyLimit(G4double val) 739 { 775 { 740 lowLimit = val; 776 lowLimit = val; 741 } 777 } 742 778 743 //....oooOO0OOooo........oooOO0OOooo........oo 779 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 744 780 745 inline void G4VEmModel::SetActivationHighEnerg 781 inline void G4VEmModel::SetActivationHighEnergyLimit(G4double val) 746 { 782 { 747 eMaxActive = val; 783 eMaxActive = val; 748 } 784 } 749 785 750 //....oooOO0OOooo........oooOO0OOooo........oo 786 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 751 787 752 inline void G4VEmModel::SetActivationLowEnergy 788 inline void G4VEmModel::SetActivationLowEnergyLimit(G4double val) 753 { 789 { 754 eMinActive = val; 790 eMinActive = val; 755 } 791 } 756 792 757 //....oooOO0OOooo........oooOO0OOooo........oo 793 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 758 794 759 inline G4bool G4VEmModel::IsActive(G4double ki 795 inline G4bool G4VEmModel::IsActive(G4double kinEnergy) const 760 { 796 { 761 return (kinEnergy >= eMinActive && kinEnergy 797 return (kinEnergy >= eMinActive && kinEnergy <= eMaxActive); 762 } 798 } 763 799 764 //....oooOO0OOooo........oooOO0OOooo........oo 800 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 765 801 766 inline void G4VEmModel::SetPolarAngleLimit(G4d 802 inline void G4VEmModel::SetPolarAngleLimit(G4double val) 767 { 803 { 768 if(!isLocked) { polarAngleLimit = val; } 804 if(!isLocked) { polarAngleLimit = val; } 769 } 805 } 770 806 771 //....oooOO0OOooo........oooOO0OOooo........oo 807 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 772 808 773 inline void G4VEmModel::SetSecondaryThreshold( 809 inline void G4VEmModel::SetSecondaryThreshold(G4double val) 774 { 810 { 775 secondaryThreshold = val; 811 secondaryThreshold = val; >> 812 } >> 813 >> 814 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 815 >> 816 inline void G4VEmModel::SetLPMFlag(G4bool val) >> 817 { >> 818 theLPMflag = val; 776 } 819 } 777 820 778 //....oooOO0OOooo........oooOO0OOooo........oo 821 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 779 822 780 inline void G4VEmModel::SetDeexcitationFlag(G4 823 inline void G4VEmModel::SetDeexcitationFlag(G4bool val) 781 { 824 { 782 flagDeexcitation = val; 825 flagDeexcitation = val; 783 } 826 } 784 827 785 //....oooOO0OOooo........oooOO0OOooo........oo 828 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 786 829 787 inline void G4VEmModel::SetForceBuildTable(G4b 830 inline void G4VEmModel::SetForceBuildTable(G4bool val) 788 { 831 { 789 flagForceBuildTable = val; 832 flagForceBuildTable = val; 790 } 833 } 791 834 792 //....oooOO0OOooo........oooOO0OOooo........oo 835 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 793 836 794 inline const G4String& G4VEmModel::GetName() c 837 inline const G4String& G4VEmModel::GetName() const 795 { 838 { 796 return name; 839 return name; 797 } 840 } 798 841 799 //....oooOO0OOooo........oooOO0OOooo........oo 842 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 800 843 801 inline std::vector<G4EmElementSelector*>* G4VE 844 inline std::vector<G4EmElementSelector*>* G4VEmModel::GetElementSelectors() 802 { 845 { 803 return elmSelectors; 846 return elmSelectors; 804 } 847 } 805 848 806 //....oooOO0OOooo........oooOO0OOooo........oo 849 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 807 850 808 inline void 851 inline void 809 G4VEmModel::SetElementSelectors(std::vector<G4 852 G4VEmModel::SetElementSelectors(std::vector<G4EmElementSelector*>* p) 810 { 853 { 811 if(p != elmSelectors) { 854 if(p != elmSelectors) { 812 elmSelectors = p; 855 elmSelectors = p; 813 nSelectors = (nullptr != elmSelectors) ? G 856 nSelectors = (nullptr != elmSelectors) ? G4int(elmSelectors->size()) : 0; 814 localElmSelectors = false; 857 localElmSelectors = false; 815 } 858 } 816 } 859 } 817 860 818 //....oooOO0OOooo........oooOO0OOooo........oo 861 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 819 862 820 inline G4ElementData* G4VEmModel::GetElementDa 863 inline G4ElementData* G4VEmModel::GetElementData() 821 { 864 { 822 return fElementData; 865 return fElementData; 823 } 866 } 824 867 825 //....oooOO0OOooo........oooOO0OOooo........oo 868 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 826 869 827 inline G4PhysicsTable* G4VEmModel::GetCrossSec 870 inline G4PhysicsTable* G4VEmModel::GetCrossSectionTable() 828 { 871 { 829 return xSectionTable; 872 return xSectionTable; 830 } 873 } 831 874 832 //....oooOO0OOooo........oooOO0OOooo........oo 875 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 833 876 834 inline G4bool G4VEmModel::IsLocked() const 877 inline G4bool G4VEmModel::IsLocked() const 835 { 878 { 836 return isLocked; 879 return isLocked; 837 } 880 } 838 881 839 //....oooOO0OOooo........oooOO0OOooo........oo 882 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 840 883 841 inline void G4VEmModel::SetLocked(G4bool val) 884 inline void G4VEmModel::SetLocked(G4bool val) 842 { 885 { 843 isLocked = val; 886 isLocked = val; 844 } 887 } 845 888 846 //....oooOO0OOooo........oooOO0OOooo........oo 889 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 847 890 848 #endif 891 #endif 849 892