Changeset 1315 for trunk/source/processes/electromagnetic/utils/include
- Timestamp:
- Jun 18, 2010, 11:42:07 AM (14 years ago)
- Location:
- trunk/source/processes/electromagnetic/utils/include
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/electromagnetic/utils/include/G4EmCalculator.hh
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4EmCalculator.hh,v 1. 19 2009/11/11 23:59:48vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 3$26 // $Id: G4EmCalculator.hh,v 1.20 2010/04/13 10:58:03 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 28 // 29 29 // … … 249 249 const G4Material* currentMaterial; 250 250 const G4ParticleDefinition* currentParticle; 251 const G4ParticleDefinition* lambdaParticle; 251 252 const G4ParticleDefinition* baseParticle; 252 253 const G4PhysicsTable* currentLambda; … … 260 261 261 262 G4String currentName; 263 G4String lambdaName; 262 264 G4double currentCut; 263 265 G4double chargeSquare; -
trunk/source/processes/electromagnetic/utils/include/G4EmConfigurator.hh
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4EmConfigurator.hh,v 1. 2 2008/11/21 12:30:29vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 3$26 // $Id: G4EmConfigurator.hh,v 1.3 2010/04/12 11:44:40 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 58 58 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 59 59 60 class G4VEnergyLossProcess; 61 class G4VEmProcess; 62 class G4VMultipleScattering; 63 60 64 class G4EmConfigurator 61 65 { 62 66 public: 63 67 64 G4EmConfigurator( );68 G4EmConfigurator(G4int verboseLevel = 1); 65 69 66 70 ~G4EmConfigurator(); 67 71 68 // Add EM model to the list of extra models potentially to be69 // declared for the G4Region and energy interval70 //71 void AddExtraEmModel(const G4String& particleName,72 G4VEmModel*, G4VEmFluctuationModel* fm = 0);73 74 // Declare EM model for particle type and process to75 // be active for the G4Region and energy interval76 // The model should be previously added to the configurator77 // or be "dummy"78 //79 void AddModelForRegion(const G4String& particleName,80 const G4String& processName,81 const G4String& modelName,82 const G4String& regionName = "",83 G4double emin = 0.0,84 G4double emax = DBL_MAX,85 const G4String& flucModelName = "");86 87 72 // Set EM model for particle type and process to 88 73 // be active for the G4Region and energy interval 74 // The model will be added to the list 89 75 // 90 76 void SetExtraEmModel(const G4String& particleName, … … 97 83 98 84 // Add all previously declared models to corresponding processes 85 // Can be called in ConstructPhysics 86 // 99 87 void AddModels(); 88 89 // These methods called by G4LossTableManager 90 // 91 void PrepareModels(const G4ParticleDefinition* aParticle, 92 G4VEnergyLossProcess* p); 93 94 void PrepareModels(const G4ParticleDefinition* aParticle, 95 G4VEmProcess* p); 96 97 void PrepareModels(const G4ParticleDefinition* aParticle, 98 G4VMultipleScattering* p); 99 100 void Clear(); 101 102 inline void SetVerbose(G4int value); 100 103 101 104 private: 102 105 103 void SetModelForRegion(const G4String& particleName, 106 G4Region* FindRegion(const G4String&); 107 108 void SetModelForRegion(G4VEmModel* model, 109 G4VEmFluctuationModel* fm, 110 G4Region* reg, 111 const G4String& particleName, 104 112 const G4String& processName, 105 const G4String& modelName,106 const G4String& regionName,107 const G4String& flucModelName,108 113 G4double emin, 109 114 G4double emax); 115 116 G4bool UpdateModelEnergyRange(G4VEmModel* mod, 117 G4double emin, G4double emax); 110 118 111 119 // hide assignment operator … … 113 121 G4EmConfigurator(const G4EmConfigurator&); 114 122 123 std::vector<G4VEmModel*> models; 124 std::vector<G4VEmFluctuationModel*> flucModels; 115 125 std::vector<G4String> particles; 116 126 std::vector<G4String> processes; 117 std::vector<G4String> models;118 127 std::vector<G4String> regions; 119 std::vector<G4String> flucModels;120 128 std::vector<G4double> lowEnergy; 121 129 std::vector<G4double> highEnergy; 122 130 123 std::vector<G4String> particleList;124 std::vector<G4VEmModel*> modelList;125 std::vector<G4VEmFluctuationModel*> flucModelList;126 127 131 G4int index; 132 G4int verbose; 128 133 }; 129 134 130 135 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 136 137 inline void G4EmConfigurator::SetVerbose(G4int value) 138 { 139 verbose = value; 140 } 131 141 132 142 #endif -
trunk/source/processes/electromagnetic/utils/include/G4EmCorrections.hh
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4EmCorrections.hh,v 1.2 4 2008/09/12 14:44:48vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 3$26 // $Id: G4EmCorrections.hh,v 1.25 2010/06/04 09:28:46 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 56 56 57 57 #include "globals.hh" 58 #include "G4AtomicShells.hh"59 58 #include "G4ionEffectiveCharge.hh" 60 59 #include "G4Material.hh" … … 263 262 G4int nbinCorr; 264 263 265 G4AtomicShells shells;266 264 G4ionEffectiveCharge effCharge; 267 265 … … 356 354 tmax = 2.0*electron_mass_c2*bg2 /(1. + 2.0*gamma*ratio + ratio*ratio); 357 355 charge = p->GetPDGCharge()/eplus; 358 if(charge < 1.5) {q2 = charge*charge;} 359 else { 360 q2 = effCharge.EffectiveChargeSquareRatio(p,mat,kinEnergy); 361 charge = std::sqrt(q2); 362 } 356 //if(charge < 1.5) {q2 = charge*charge;} 357 //else { 358 // q2 = effCharge.EffectiveChargeSquareRatio(p,mat,kinEnergy); 359 // charge = std::sqrt(q2); 360 //} 361 if(charge > 1.5) { charge = effCharge.EffectiveCharge(p,mat,kinEnergy); } 362 q2 = charge*charge; 363 363 } 364 364 if(mat != material) { -
trunk/source/processes/electromagnetic/utils/include/G4LossTableManager.hh
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4LossTableManager.hh,v 1.5 5 2009/10/29 19:25:28vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 3$26 // $Id: G4LossTableManager.hh,v 1.58 2010/04/27 16:59:52 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 28 // 29 29 // … … 61 61 // 12-02-07 Add SetSkin, SetLinearLossLimit (V.Ivanchenko) 62 62 // 18-06-07 Move definition of msc parameters to G4EmProcessOptions (V.Ivanchenko) 63 // 12-04-10 Added PreparePhsyicsTables and BuildPhysicsTables entries (V.Ivanchenko) 63 64 // 64 65 // Class Description: … … 93 94 class G4EmConfigurator; 94 95 class G4LossTableBuilder; 96 class G4Region; 95 97 96 98 class G4LossTableManager … … 103 105 ~G4LossTableManager(); 104 106 107 //------------------------------------------------- 108 // called from destructor 109 //------------------------------------------------- 110 105 111 void Clear(); 106 112 107 // get the DEDX or the range for a given particle/energy/material 113 //------------------------------------------------- 114 // initialisation before a new run 115 //------------------------------------------------- 116 117 void PreparePhysicsTable(const G4ParticleDefinition* aParticle, 118 G4VEnergyLossProcess* p); 119 void PreparePhysicsTable(const G4ParticleDefinition* aParticle, 120 G4VEmProcess* p); 121 void PreparePhysicsTable(const G4ParticleDefinition* aParticle, 122 G4VMultipleScattering* p); 123 void BuildPhysicsTable(const G4ParticleDefinition* aParticle); 124 void BuildPhysicsTable(const G4ParticleDefinition* aParticle, 125 G4VEnergyLossProcess* p); 126 127 //------------------------------------------------- 128 // Run time access to DEDX, range, energy for a given particle, 129 // energy, and G4MaterialCutsCouple 130 //------------------------------------------------- 131 108 132 inline G4double GetDEDX( 109 133 const G4ParticleDefinition *aParticle, … … 141 165 G4double& length); 142 166 143 // to be called only by energy loss processes 167 //------------------------------------------------- 168 // Methods to be called only at initialisation 169 //------------------------------------------------- 170 144 171 void Register(G4VEnergyLossProcess* p); 145 172 … … 162 189 void DeRegister(G4VEmFluctuationModel* p); 163 190 164 void EnergyLossProcessIsInitialised(const G4ParticleDefinition* aParticle,165 G4VEnergyLossProcess* p);166 167 191 void RegisterIon(const G4ParticleDefinition* aParticle, 168 192 G4VEnergyLossProcess* p); … … 171 195 G4VEnergyLossProcess* p); 172 196 173 void BuildPhysicsTable(const G4ParticleDefinition* aParticle,174 G4VEnergyLossProcess* p);175 176 197 void SetLossFluctuations(G4bool val); 177 198 178 void SetSubCutoff(G4bool val );199 void SetSubCutoff(G4bool val, const G4Region* r=0); 179 200 180 201 void SetIntegral(G4bool val); … … 198 219 void SetLambdaBinning(G4int val); 199 220 221 G4int GetNumberOfBinsPerDecade() const; 222 200 223 void SetStepFunction(G4double v1, G4double v2); 201 224 … … 214 237 void SetVerbose(G4int val); 215 238 239 //------------------------------------------------- 240 // Access methods 241 //------------------------------------------------- 242 216 243 G4EnergyLossMessenger* GetMessenger(); 217 244 … … 241 268 242 269 private: 270 271 //------------------------------------------------- 272 // Private methods and members 273 //------------------------------------------------- 243 274 244 275 G4LossTableManager(); … … 251 282 void ParticleHaveNoLoss(const G4ParticleDefinition* aParticle); 252 283 253 void SetParameters(G4VEnergyLossProcess*); 284 void SetParameters(const G4ParticleDefinition* aParticle, 285 G4VEnergyLossProcess*); 254 286 255 287 void CopyDEDXTables(); 256 288 257 private:258 259 289 static G4LossTableManager* theInstance; 260 290 261 291 typedef const G4ParticleDefinition* PD; 292 262 293 std::map<PD,G4VEnergyLossProcess*,std::less<PD> > loss_map; 263 294 … … 279 310 PD currentParticle; 280 311 PD theElectron; 312 PD firstParticle; 281 313 282 314 G4int n_loss; … … 284 316 285 317 G4bool all_tables_are_built; 286 // G4bool first_entry; 318 G4bool startInitialisation; 319 287 320 G4bool lossFluctuationFlag; 288 321 G4bool subCutoffFlag; … … 290 323 G4bool integral; 291 324 G4bool integralActive; 292 G4bool all_tables_are_stored;293 325 G4bool buildCSDARange; 294 326 G4bool minEnergyActive; … … 314 346 G4EmConfigurator* emConfigurator; 315 347 316 const G4ParticleDefinition* firstParticle; 348 G4int nbinsLambda; 349 G4int nbinsPerDecade; 317 350 G4int verbose; 318 351 … … 322 355 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 323 356 357 inline G4VEnergyLossProcess* G4LossTableManager::GetEnergyLossProcess( 358 const G4ParticleDefinition *aParticle) 359 { 360 if(aParticle != currentParticle) { 361 currentParticle = aParticle; 362 std::map<PD,G4VEnergyLossProcess*,std::less<PD> >::const_iterator pos; 363 if ((pos = loss_map.find(aParticle)) != loss_map.end()) { 364 currentLoss = (*pos).second; 365 } else { 366 currentLoss = 0; 367 // ParticleHaveNoLoss(aParticle); 368 } 369 } 370 return currentLoss; 371 } 372 373 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 374 324 375 inline G4double G4LossTableManager::GetDEDX( 325 376 const G4ParticleDefinition *aParticle, … … 327 378 const G4MaterialCutsCouple *couple) 328 379 { 329 if(aParticle != currentParticle) GetEnergyLossProcess(aParticle);380 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); } 330 381 G4double x; 331 if(currentLoss) x = currentLoss->GetDEDX(kineticEnergy, couple);332 else x = G4EnergyLossTables::GetDEDX(333 currentParticle,kineticEnergy,couple,false); 382 if(currentLoss) { x = currentLoss->GetDEDX(kineticEnergy, couple); } 383 else { x = G4EnergyLossTables::GetDEDX(currentParticle, 384 kineticEnergy,couple,false); } 334 385 return x; 335 386 } … … 342 393 const G4MaterialCutsCouple *couple) 343 394 { 344 if(aParticle != currentParticle) GetEnergyLossProcess(aParticle);395 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); } 345 396 G4double x = 0.0; 346 if(currentLoss) x = currentLoss->GetDEDXForSubsec(kineticEnergy, couple);397 if(currentLoss) { x = currentLoss->GetDEDXForSubsec(kineticEnergy, couple); } 347 398 return x; 348 399 } … … 355 406 const G4MaterialCutsCouple *couple) 356 407 { 357 if(aParticle != currentParticle) GetEnergyLossProcess(aParticle);408 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); } 358 409 G4double x = DBL_MAX; 359 if(currentLoss) x = currentLoss->GetCSDARange(kineticEnergy, couple);410 if(currentLoss) { x = currentLoss->GetCSDARange(kineticEnergy, couple); } 360 411 return x; 361 412 } … … 368 419 const G4MaterialCutsCouple *couple) 369 420 { 370 if(aParticle != currentParticle) GetEnergyLossProcess(aParticle);421 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); } 371 422 G4double x; 372 if(currentLoss) x = currentLoss->GetRangeForLoss(kineticEnergy, couple);373 else 374 x = G4EnergyLossTables::GetRange(currentParticle,kineticEnergy,couple,false); 423 if(currentLoss) { x = currentLoss->GetRangeForLoss(kineticEnergy, couple); } 424 else { x = G4EnergyLossTables::GetRange(currentParticle,kineticEnergy, 425 couple,false); } 375 426 return x; 376 427 } … … 383 434 const G4MaterialCutsCouple *couple) 384 435 { 385 if(aParticle != currentParticle) GetEnergyLossProcess(aParticle);436 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); } 386 437 G4double x; 387 if(currentLoss) x = currentLoss->GetRange(kineticEnergy, couple);388 else 389 x = G4EnergyLossTables::GetRange(currentParticle,kineticEnergy,couple,false); 438 if(currentLoss) { x = currentLoss->GetRange(kineticEnergy, couple); } 439 else { x = G4EnergyLossTables::GetRange(currentParticle,kineticEnergy, 440 couple,false); } 390 441 return x; 391 442 } … … 398 449 const G4MaterialCutsCouple *couple) 399 450 { 400 if(aParticle != currentParticle) GetEnergyLossProcess(aParticle);451 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); } 401 452 G4double x; 402 if(currentLoss) x = currentLoss->GetKineticEnergy(range, couple);403 else x = G4EnergyLossTables::GetPreciseEnergyFromRange(404 currentParticle,range,couple,false); 453 if(currentLoss) { x = currentLoss->GetKineticEnergy(range, couple); } 454 else { x = G4EnergyLossTables::GetPreciseEnergyFromRange(currentParticle,range, 455 couple,false); } 405 456 return x; 406 457 } … … 428 479 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 429 480 430 inline G4VEnergyLossProcess* G4LossTableManager::GetEnergyLossProcess(431 const G4ParticleDefinition *aParticle)432 {433 if(aParticle != currentParticle) {434 currentParticle = aParticle;435 std::map<PD,G4VEnergyLossProcess*,std::less<PD> >::const_iterator pos;436 if ((pos = loss_map.find(aParticle)) != loss_map.end()) {437 currentLoss = (*pos).second;438 } else {439 currentLoss = 0;440 // ParticleHaveNoLoss(aParticle);441 }442 }443 return currentLoss;444 }445 446 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......447 448 481 #endif 449 482 -
trunk/source/processes/electromagnetic/utils/include/G4VAtomDeexcitation.hh
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VAtomDeexcitation.hh,v 1. 1 2009/07/09 11:42:52vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 3$26 // $Id: G4VAtomDeexcitation.hh,v 1.3 2010/03/30 09:19:56 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 63 63 virtual ~G4VAtomDeexcitation(); 64 64 65 //initialization 65 //========== initialization ========== 66 66 67 virtual void PreparePhysicsTable(const G4ParticleDefinition&); 67 68 virtual void BuildPhysicsTable(const G4ParticleDefinition&); 68 69 // Get atomic shell by shell index, used by discrete processes70 // (for example, photoelectric), when shell vacancy sampled by the model71 virtual const G4AtomicChell* GetAtomicShell(G4int Z, G4int ShellIndex);72 73 // selection of random shell for ionisation process74 virtual const G4AtomicShell* SelectRandomShell(const G4DynamicParticle*,75 G4int Z);76 77 // generation of deexcitation for given atom and shell vacancy78 virtual void GenerateParticles(std::vector<G4DynamicParticle*>*,79 const G4AtomicChell*, G4int Z);80 81 // access or compute PIXE cross section82 virtual G4double GetPIXECrossSection (const G4ParticleDefinition*,83 G4int Z, G4double kinE);84 85 // calculate PIXE cross section from the models86 virtual G4double CalculatePIXECrossSection(const G4ParticleDefinition*,87 G4int Z, G4double kinE);88 89 // Sampling of PIXE for ionisation processes90 virtual void91 AlongStepDeexcitation(std::vector<G4DynamicParticle*>* secVect,92 const G4DynamicParticle* icidentParticle,93 const G4MaterialCutsCouple*,94 G4double trueStepLenght,95 G4double eLoss);96 97 // Check if deexcitation is active for a given geometry volume98 G4bool CheckActiveRegion(G4int coupleIndex);99 100 // Access flags defined in the CheckActiveVolume method101 inline G4bool IsFluorescenceActive() const;102 inline G4bool IsPIXECrossSectionActive() const;103 69 104 70 // PIXE model name … … 115 81 void SetPIXECrossSectionActiveRegion(const G4String& rname = ""); 116 82 83 //========== Run time methods ========== 84 85 // Check if deexcitation is active for a given geometry volume 86 G4bool CheckFluorescenceActiveRegion(G4int coupleIndex); 87 88 // Check if deexcitation is active for a given geometry volume 89 G4bool CheckPIXEActiveRegion(G4int coupleIndex); 90 91 // Get atomic shell by shell index, used by discrete processes 92 // (for example, photoelectric), when shell vacancy sampled by the model 93 const G4AtomicShell* GetAtomicShell(G4int Z, G4int ShellIndex); 94 95 // selection of random shell for ionisation process 96 virtual const G4AtomicShell* SelectRandomShell(const G4DynamicParticle*, 97 G4int Z); 98 99 // generation of deexcitation for given atom and shell vacancy 100 virtual void GenerateParticles(std::vector<G4DynamicParticle*>*, 101 const G4AtomicShell*, G4int Z) = 0; 102 103 // access or compute PIXE cross section 104 virtual G4double GetPIXECrossSection (const G4ParticleDefinition*, 105 G4int Z, G4double kinE) = 0; 106 107 // calculate PIXE cross section from the models 108 virtual G4double CalculatePIXECrossSection(const G4ParticleDefinition*, 109 G4int Z, G4double kinE) = 0; 110 111 // Sampling of PIXE for ionisation processes 112 virtual void 113 AlongStepDeexcitation(std::vector<G4DynamicParticle*>* secVect, 114 const G4DynamicParticle* icidentParticle, 115 const G4MaterialCutsCouple*, 116 G4double trueStepLenght, 117 G4double eLoss) = 0; 118 119 120 117 121 private: 118 122 … … 122 126 123 127 G4String namePIXE; 124 G4bool isFluoActive;125 G4bool isPIXEActive;126 128 127 129 }; 128 129 inline G4bool IsFluorescenceActive() const130 {131 return isFluoActive;132 }133 134 inline G4bool IsPIXECrossSectionActive() const135 {136 return isPIXEActive;137 }138 130 139 131 inline -
trunk/source/processes/electromagnetic/utils/include/G4VEmModel.hh
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VEmModel.hh,v 1.7 2 2009/09/23 14:42:47vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 3$26 // $Id: G4VEmModel.hh,v 1.75 2010/05/26 10:41:34 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 150 150 151 151 // Compute effective ion charge square 152 virtual G4double ChargeSquareRatio(const G4Track&); 153 154 // Compute effective ion charge square 152 155 virtual G4double GetChargeSquareRatio(const G4ParticleDefinition*, 153 156 const G4Material*, … … 228 231 G4double maxEnergy = DBL_MAX); 229 232 233 // select isotope in order to have precise mass of the nucleus 234 inline G4int SelectIsotopeNumber(const G4Element*); 235 230 236 // atom can be selected effitiantly if element selectors are initialised 231 237 inline const G4Element* SelectRandomAtom(const G4MaterialCutsCouple*, … … 236 242 237 243 // to select atom cross section per volume is recomputed for each element 238 inline const G4Element* SelectRandomAtom(const G4Material*, 239 const G4ParticleDefinition*, 240 G4double kineticEnergy, 241 G4double cutEnergy = 0.0, 242 G4double maxEnergy = DBL_MAX); 243 244 // select isotope in order to have precise mass of the nucleus 245 inline G4int SelectIsotopeNumber(const G4Element*); 244 const G4Element* SelectRandomAtom(const G4Material*, 245 const G4ParticleDefinition*, 246 G4double kineticEnergy, 247 G4double cutEnergy = 0.0, 248 G4double maxEnergy = DBL_MAX); 246 249 247 250 //------------------------------------------------------------------------ … … 291 294 inline void SetCurrentCouple(const G4MaterialCutsCouple*); 292 295 296 inline const G4Element* GetCurrentElement() const; 297 293 298 protected: 294 299 … … 296 301 297 302 inline void SetCurrentElement(const G4Element*); 298 299 inline const G4Element* GetCurrentElement() const;300 303 301 304 private: … … 341 344 }; 342 345 343 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 346 // ======== Run time inline methods ================ 347 348 inline void G4VEmModel::SetCurrentCouple(const G4MaterialCutsCouple* p) 349 { 350 currentCouple = p; 351 } 352 353 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 354 355 inline const G4MaterialCutsCouple* G4VEmModel::CurrentCouple() const 356 { 357 return currentCouple; 358 } 359 360 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 361 362 inline void G4VEmModel::SetCurrentElement(const G4Element* elm) 363 { 364 currentElement = elm; 365 } 366 367 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 368 369 inline const G4Element* G4VEmModel::GetCurrentElement() const 370 { 371 return currentElement; 372 } 373 374 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 375 376 inline 377 G4double G4VEmModel::MaxSecondaryKinEnergy(const G4DynamicParticle* dynPart) 378 { 379 return MaxSecondaryEnergy(dynPart->GetDefinition(), 380 dynPart->GetKineticEnergy()); 381 } 382 344 383 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 345 384 … … 375 414 G4double mfp = DBL_MAX; 376 415 G4double cross = CrossSectionPerVolume(material,p,ekin,emin,emax); 377 if (cross > DBL_MIN) mfp = 1./cross;416 if (cross > DBL_MIN) { mfp = 1./cross; } 378 417 return mfp; 379 418 } … … 415 454 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 416 455 417 inline418 const G4Element* G4VEmModel::SelectRandomAtom(const G4Material* material,419 const G4ParticleDefinition* pd,420 G4double kinEnergy,421 G4double tcut,422 G4double tmax)423 {424 const G4ElementVector* theElementVector = material->GetElementVector();425 G4int n = material->GetNumberOfElements() - 1;426 currentElement = (*theElementVector)[n];427 if (n > 0) {428 G4double x = G4UniformRand()*429 G4VEmModel::CrossSectionPerVolume(material,pd,kinEnergy,tcut,tmax);430 for(G4int i=0; i<n; i++) {431 if (x <= xsec[i]) {432 currentElement = (*theElementVector)[i];433 break;434 }435 }436 }437 return currentElement;438 }439 440 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......441 442 456 inline G4int G4VEmModel::SelectIsotopeNumber(const G4Element* elm) 443 457 { … … 450 464 G4double* ab = elm->GetRelativeAbundanceVector(); 451 465 G4double x = G4UniformRand(); 452 for(; idx<ni; idx++) {466 for(; idx<ni; ++idx) { 453 467 x -= ab[idx]; 454 if (x <= 0.0) break;468 if (x <= 0.0) { break; } 455 469 } 456 if(idx >= ni) idx = ni - 1;470 if(idx >= ni) { idx = ni - 1; } 457 471 } 458 472 N = elm->GetIsotope(idx)->GetN(); … … 461 475 } 462 476 463 // ....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......477 // ======== Get/Set inline methods used at initialisation ================ 464 478 465 479 inline G4VEmFluctuationModel* G4VEmModel::GetModelOfFluctuations() … … 578 592 { 579 593 nuclearStopping = val; 580 }581 582 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......583 584 inline585 G4double G4VEmModel::MaxSecondaryKinEnergy(const G4DynamicParticle* dynPart)586 {587 return MaxSecondaryEnergy(dynPart->GetDefinition(),588 dynPart->GetKineticEnergy());589 594 } 590 595 … … 601 606 G4VEmFluctuationModel* f = 0) 602 607 { 603 if(p && pParticleChange != p) pParticleChange = p;608 if(p && pParticleChange != p) { pParticleChange = p; } 604 609 fluc = f; 605 610 } … … 607 612 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 608 613 609 inline void G4VEmModel::SetCurrentCouple(const G4MaterialCutsCouple* p)610 {611 currentCouple = p;612 }613 614 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......615 616 inline const G4MaterialCutsCouple* G4VEmModel::CurrentCouple() const617 {618 return currentCouple;619 }620 621 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......622 623 inline void G4VEmModel::SetCurrentElement(const G4Element* elm)624 {625 currentElement = elm;626 }627 628 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......629 630 inline const G4Element* G4VEmModel::GetCurrentElement() const631 {632 return currentElement;633 }634 635 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......636 637 614 #endif 638 615 -
trunk/source/processes/electromagnetic/utils/include/G4VEmProcess.hh
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VEmProcess.hh,v 1. 55 2009/09/23 14:42:47vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 3$26 // $Id: G4VEmProcess.hh,v 1.60 2010/04/28 14:43:13 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 56 56 // 27-10-07 Virtual functions moved to source (V.Ivanchenko) 57 57 // 15-07-08 Reorder class members for further multi-thread development (VI) 58 // 17-02-10 Added pointer currentParticle (VI) 58 59 // 59 60 // Class Description: … … 158 159 159 160 // It returns the cross section of the process per atom 160 inlineG4double ComputeCrossSectionPerAtom(G4double kineticEnergy,161 162 163 164 inlineG4double MeanFreePath(const G4Track& track);161 G4double ComputeCrossSectionPerAtom(G4double kineticEnergy, 162 G4double Z, G4double A=0., 163 G4double cut=0.0); 164 165 G4double MeanFreePath(const G4Track& track); 165 166 166 167 // It returns cross section per volume … … 225 226 G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false); 226 227 228 // access atom on which interaction happens 229 const G4Element* GetCurrentElement() const; 230 227 231 inline void SetLambdaFactor(G4double val); 228 232 … … 231 235 232 236 inline void SetApplyCuts(G4bool val); 237 238 inline void SetBuildTableFlag(G4bool val); 233 239 234 240 //------------------------------------------------------------------------ … … 245 251 246 252 inline G4double RecalculateLambda(G4double kinEnergy, 247 const G4MaterialCutsCouple* couple);253 const G4MaterialCutsCouple* couple); 248 254 249 255 inline G4ParticleChangeForGamma* GetParticleChange(); … … 258 264 259 265 inline G4double GetElectronEnergyCut(); 260 261 inline void SetBuildTableFlag(G4bool val);262 266 263 267 inline void SetStartFromNullFlag(G4bool val); … … 340 344 341 345 const G4ParticleDefinition* particle; 346 const G4ParticleDefinition* currentParticle; 342 347 343 348 // cash … … 352 357 }; 353 358 354 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 355 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 356 357 inline G4double G4VEmProcess::ComputeCrossSectionPerAtom( 358 G4double kineticEnergy, G4double Z, G4double A, G4double cut) 359 { 360 SelectModel(kineticEnergy, currentCoupleIndex); 361 G4double x = 0.0; 362 if(currentModel) { 363 x = currentModel->ComputeCrossSectionPerAtom(particle,kineticEnergy, 364 Z,A,cut); 365 } 366 return x; 367 } 368 369 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 370 371 inline G4double G4VEmProcess::MeanFreePath(const G4Track& track) 372 { 373 DefineMaterial(track.GetMaterialCutsCouple()); 374 preStepLambda = GetCurrentLambda(track.GetKineticEnergy()); 375 G4double x = DBL_MAX; 376 if(DBL_MIN < preStepLambda) x = 1.0/preStepLambda; 377 return x; 378 } 379 380 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 381 382 inline G4double G4VEmProcess::GetLambda(G4double& kineticEnergy, 383 const G4MaterialCutsCouple* couple) 384 { 385 DefineMaterial(couple); 386 return GetCurrentLambda(kineticEnergy); 387 } 388 389 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 390 391 inline void G4VEmProcess::SetLambdaBinning(G4int nbins) 392 { 393 nLambdaBins = nbins; 394 } 395 396 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 397 398 inline G4int G4VEmProcess::LambdaBinning() const 399 { 400 return nLambdaBins; 401 } 402 403 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 404 405 inline void G4VEmProcess::SetMinKinEnergy(G4double e) 406 { 407 minKinEnergy = e; 408 } 409 410 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 411 412 inline G4double G4VEmProcess::MinKinEnergy() const 413 { 414 return minKinEnergy; 415 } 416 417 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 418 419 inline void G4VEmProcess::SetMaxKinEnergy(G4double e) 420 { 421 maxKinEnergy = e; 422 } 423 424 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 425 426 inline G4double G4VEmProcess::MaxKinEnergy() const 427 { 428 return maxKinEnergy; 429 } 430 431 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 432 433 inline void G4VEmProcess::SetPolarAngleLimit(G4double val) 434 { 435 if(val < 0.0) polarAngleLimit = 0.0; 436 else if(val > pi) polarAngleLimit = pi; 437 else polarAngleLimit = val; 438 } 439 440 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 441 442 inline G4double G4VEmProcess::PolarAngleLimit() const 443 { 444 return polarAngleLimit; 445 } 446 447 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 448 449 inline const G4PhysicsTable* G4VEmProcess::LambdaTable() const 450 { 451 return theLambdaTable; 452 } 453 454 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 455 456 inline const G4ParticleDefinition* G4VEmProcess::Particle() const 457 { 458 return particle; 459 } 460 461 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 462 463 inline const G4ParticleDefinition* G4VEmProcess::SecondaryParticle() const 464 { 465 return secondaryParticle; 466 } 467 468 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 469 470 inline 471 G4VEmModel* G4VEmProcess::SelectModel(G4double& kinEnergy, size_t index) 472 { 473 currentModel = modelManager->SelectModel(kinEnergy, index); 474 currentModel->SetCurrentCouple(currentCouple); 475 return currentModel; 476 } 477 478 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 479 480 inline 481 G4VEmModel* G4VEmProcess::SelectModelForMaterial(G4double kinEnergy, 482 size_t& idxRegion) const 483 { 484 return modelManager->SelectModel(kinEnergy, idxRegion); 485 } 486 487 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 488 489 inline void G4VEmProcess::SetLambdaFactor(G4double val) 490 { 491 if(val > 0.0 && val <= 1.0) lambdaFactor = val; 492 } 493 494 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 495 496 inline void G4VEmProcess::SetIntegral(G4bool val) 497 { 498 if(particle && particle != theGamma) integral = val; 499 if(integral) buildLambdaTable = true; 500 } 501 502 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 503 504 inline G4bool G4VEmProcess::IsIntegral() const 505 { 506 return integral; 507 } 508 509 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 510 511 inline void G4VEmProcess::SetApplyCuts(G4bool val) 512 { 513 applyCuts = val; 514 } 515 516 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 517 518 inline G4double G4VEmProcess::RecalculateLambda(G4double e, 519 const G4MaterialCutsCouple* couple) 520 { 521 DefineMaterial(couple); 522 return ComputeCurrentLambda(e); 523 } 524 525 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 526 527 inline G4ParticleChangeForGamma* G4VEmProcess::GetParticleChange() 528 { 529 return &fParticleChange; 530 } 531 532 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 533 534 inline void G4VEmProcess::SetParticle(const G4ParticleDefinition* p) 535 { 536 particle = p; 537 } 538 539 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 540 541 inline void G4VEmProcess::SetSecondaryParticle(const G4ParticleDefinition* p) 542 { 543 secondaryParticle = p; 544 } 545 546 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 359 // ======== Run time inline methods ================ 547 360 548 361 inline size_t G4VEmProcess::CurrentMaterialCutsCoupleIndex() const … … 563 376 { 564 377 return (*theCutsElectron)[currentCoupleIndex]; 565 }566 567 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....568 569 inline void G4VEmProcess::SetBuildTableFlag(G4bool val)570 {571 buildLambdaTable = val;572 if(!val) integral = false;573 }574 575 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....576 577 inline void G4VEmProcess::SetStartFromNullFlag(G4bool val)578 {579 startFromNull = val;580 }581 582 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....583 584 inline void G4VEmProcess::InitialiseStep(const G4Track& track)585 {586 preStepKinEnergy = track.GetKineticEnergy();587 DefineMaterial(track.GetMaterialCutsCouple());588 SelectModel(preStepKinEnergy, currentCoupleIndex);589 if (theNumberOfInteractionLengthLeft < 0.0) mfpKinEnergy = DBL_MAX;590 378 } 591 379 … … 600 388 mfpKinEnergy = DBL_MAX; 601 389 } 390 } 391 392 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 393 394 inline 395 G4VEmModel* G4VEmProcess::SelectModel(G4double& kinEnergy, size_t index) 396 { 397 currentModel = modelManager->SelectModel(kinEnergy, index); 398 currentModel->SetCurrentCouple(currentCouple); 399 return currentModel; 400 } 401 402 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 403 404 inline 405 G4VEmModel* G4VEmProcess::SelectModelForMaterial(G4double kinEnergy, 406 size_t& idxRegion) const 407 { 408 return modelManager->SelectModel(kinEnergy, idxRegion); 409 } 410 411 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 412 413 inline void G4VEmProcess::InitialiseStep(const G4Track& track) 414 { 415 currentParticle = track.GetDefinition(); 416 preStepKinEnergy = track.GetKineticEnergy(); 417 DefineMaterial(track.GetMaterialCutsCouple()); 418 SelectModel(preStepKinEnergy, currentCoupleIndex); 419 if (theNumberOfInteractionLengthLeft < 0.0) mfpKinEnergy = DBL_MAX; 420 } 421 422 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 423 424 inline G4double G4VEmProcess::GetLambdaFromTable(G4double e) 425 { 426 return (((*theLambdaTable)[currentCoupleIndex])->Value(e)); 427 } 428 429 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 430 431 inline G4double G4VEmProcess::ComputeCurrentLambda(G4double e) 432 { 433 SelectModel(e, currentCoupleIndex); 434 return currentModel->CrossSectionPerVolume(currentMaterial,currentParticle, 435 e,(*theCuts)[currentCoupleIndex]); 436 } 437 438 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 439 440 inline G4double G4VEmProcess::GetCurrentLambda(G4double e) 441 { 442 G4double x = 0.0; 443 if(theLambdaTable) { x = GetLambdaFromTable(e); } 444 else { x = ComputeCurrentLambda(e); } 445 return x; 446 } 447 448 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 449 450 inline G4double G4VEmProcess::GetLambda(G4double& kineticEnergy, 451 const G4MaterialCutsCouple* couple) 452 { 453 DefineMaterial(couple); 454 return GetCurrentLambda(kineticEnergy); 455 } 456 457 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 458 459 inline G4double G4VEmProcess::RecalculateLambda(G4double e, 460 const G4MaterialCutsCouple* couple) 461 { 462 DefineMaterial(couple); 463 return ComputeCurrentLambda(e); 602 464 } 603 465 … … 625 487 } 626 488 627 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 628 629 inline G4double G4VEmProcess::GetLambdaFromTable(G4double e) 630 { 631 return (((*theLambdaTable)[currentCoupleIndex])->Value(e)); 632 } 633 634 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 635 636 inline G4double G4VEmProcess::GetCurrentLambda(G4double e) 637 { 638 G4double x = 0.0; 639 if(theLambdaTable) { x = GetLambdaFromTable(e); } 640 else { x = ComputeCurrentLambda(e); } 641 return x; 642 } 643 644 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 645 646 inline G4double G4VEmProcess::ComputeCurrentLambda(G4double e) 647 { 648 SelectModel(e, currentCoupleIndex); 649 return currentModel->CrossSectionPerVolume(currentMaterial,particle, 650 e,(*theCuts)[currentCoupleIndex]); 489 // ======== Get/Set inline methods used at initialisation ================ 490 491 inline void G4VEmProcess::SetLambdaBinning(G4int nbins) 492 { 493 nLambdaBins = nbins; 494 } 495 496 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 497 498 inline G4int G4VEmProcess::LambdaBinning() const 499 { 500 return nLambdaBins; 501 } 502 503 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 504 505 inline void G4VEmProcess::SetMinKinEnergy(G4double e) 506 { 507 minKinEnergy = e; 508 } 509 510 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 511 512 inline G4double G4VEmProcess::MinKinEnergy() const 513 { 514 return minKinEnergy; 515 } 516 517 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 518 519 inline void G4VEmProcess::SetMaxKinEnergy(G4double e) 520 { 521 maxKinEnergy = e; 522 } 523 524 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 525 526 inline G4double G4VEmProcess::MaxKinEnergy() const 527 { 528 return maxKinEnergy; 529 } 530 531 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 532 533 inline void G4VEmProcess::SetPolarAngleLimit(G4double val) 534 { 535 if(val < 0.0) polarAngleLimit = 0.0; 536 else if(val > pi) polarAngleLimit = pi; 537 else polarAngleLimit = val; 538 } 539 540 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 541 542 inline G4double G4VEmProcess::PolarAngleLimit() const 543 { 544 return polarAngleLimit; 545 } 546 547 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 548 549 inline const G4PhysicsTable* G4VEmProcess::LambdaTable() const 550 { 551 return theLambdaTable; 552 } 553 554 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 555 556 inline const G4ParticleDefinition* G4VEmProcess::Particle() const 557 { 558 return particle; 559 } 560 561 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 562 563 inline const G4ParticleDefinition* G4VEmProcess::SecondaryParticle() const 564 { 565 return secondaryParticle; 566 } 567 568 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 569 570 inline void G4VEmProcess::SetLambdaFactor(G4double val) 571 { 572 if(val > 0.0 && val <= 1.0) { lambdaFactor = val; } 573 } 574 575 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 576 577 inline void G4VEmProcess::SetIntegral(G4bool val) 578 { 579 if(particle && particle != theGamma) { integral = val; } 580 if(integral) { buildLambdaTable = true; } 581 } 582 583 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 584 585 inline G4bool G4VEmProcess::IsIntegral() const 586 { 587 return integral; 588 } 589 590 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 591 592 inline void G4VEmProcess::SetApplyCuts(G4bool val) 593 { 594 applyCuts = val; 595 } 596 597 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 598 599 inline void G4VEmProcess::SetBuildTableFlag(G4bool val) 600 { 601 buildLambdaTable = val; 602 if(!val) { integral = false; } 603 } 604 605 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 606 607 inline G4ParticleChangeForGamma* G4VEmProcess::GetParticleChange() 608 { 609 return &fParticleChange; 610 } 611 612 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 613 614 inline void G4VEmProcess::SetParticle(const G4ParticleDefinition* p) 615 { 616 particle = p; 617 currentParticle = p; 618 } 619 620 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 621 622 inline void G4VEmProcess::SetSecondaryParticle(const G4ParticleDefinition* p) 623 { 624 secondaryParticle = p; 625 } 626 627 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 628 629 inline void G4VEmProcess::SetStartFromNullFlag(G4bool val) 630 { 631 startFromNull = val; 651 632 } 652 633 -
trunk/source/processes/electromagnetic/utils/include/G4VEnergyLossProcess.hh
r1196 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VEnergyLossProcess.hh,v 1. 89 2009/07/03 14:39:17vnivanch Exp $26 // $Id: G4VEnergyLossProcess.hh,v 1.92 2010/04/28 14:43:13 vnivanch Exp $ 27 27 // GEANT4 tag $Name: 28 28 // … … 196 196 // Sampling of secondaries in vicinity of geometrical boundary 197 197 void SampleSubCutSecondaries(std::vector<G4Track*>&, const G4Step&, 198 G4VEmModel* model, G4int matIdx, 199 G4double& extraEdep); 198 G4VEmModel* model, G4int matIdx); 200 199 201 200 // PostStep sampling of secondaries … … 418 417 // Run time method for simulation of ionisation 419 418 //------------------------------------------------------------------------ 419 420 // access atom on which interaction happens 421 const G4Element* GetCurrentElement() const; 420 422 421 423 // sample range at the end of a step … … 553 555 }; 554 556 555 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 556 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 557 // ======== Run time inline methods ================ 557 558 558 559 inline size_t G4VEnergyLossProcess::CurrentMaterialCutsCoupleIndex() const … … 586 587 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 587 588 588 inline void G4VEnergyLossProcess::SetFluctModel(G4VEmFluctuationModel* p) 589 { 590 fluctModel = p; 591 } 592 593 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 594 595 inline G4VEmFluctuationModel* G4VEnergyLossProcess::FluctModel() 596 { 597 return fluctModel; 598 } 599 600 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 601 602 inline void G4VEnergyLossProcess::SetParticle(const G4ParticleDefinition* p) 603 { 604 particle = p; 605 } 606 607 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 608 609 inline void G4VEnergyLossProcess::SetSecondaryParticle(const G4ParticleDefinition* p) 610 { 611 secondaryParticle = p; 612 } 613 614 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 615 616 inline void G4VEnergyLossProcess::SetBaseParticle(const G4ParticleDefinition* p) 617 { 618 baseParticle = p; 619 } 620 621 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 622 623 inline const G4ParticleDefinition* G4VEnergyLossProcess::Particle() const 624 { 625 return particle; 626 } 627 628 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 629 630 inline const G4ParticleDefinition* G4VEnergyLossProcess::BaseParticle() const 631 { 632 return baseParticle; 633 } 634 635 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 636 637 inline const G4ParticleDefinition* G4VEnergyLossProcess::SecondaryParticle() const 638 { 639 return secondaryParticle; 640 } 641 642 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 643 644 inline void G4VEnergyLossProcess::SetLossFluctuations(G4bool val) 645 { 646 lossFluctuationFlag = val; 647 } 648 649 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 650 651 inline void G4VEnergyLossProcess::SetRandomStep(G4bool val) 652 { 653 rndmStepFlag = val; 654 } 655 656 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 657 658 inline void G4VEnergyLossProcess::SetIntegral(G4bool val) 659 { 660 integral = val; 661 } 662 663 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 664 665 inline G4bool G4VEnergyLossProcess::IsIntegral() const 666 { 667 return integral; 668 } 669 670 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 671 672 inline void G4VEnergyLossProcess::SetIonisation(G4bool val) 673 { 674 isIonisation = val; 675 if(val) aGPILSelection = CandidateForSelection; 676 else aGPILSelection = NotCandidateForSelection; 677 } 678 679 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 680 681 inline G4bool G4VEnergyLossProcess::IsIonisationProcess() const 682 { 683 return isIonisation; 684 } 685 686 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 687 688 inline void G4VEnergyLossProcess::SetLinearLossLimit(G4double val) 689 { 690 linLossLimit = val; 691 } 692 693 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 694 695 inline void G4VEnergyLossProcess::SetMinSubRange(G4double val) 696 { 697 minSubRange = val; 698 } 699 700 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 701 702 inline void G4VEnergyLossProcess::SetLambdaFactor(G4double val) 703 { 704 if(val > 0.0 && val <= 1.0) lambdaFactor = val; 705 } 706 707 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 708 709 void G4VEnergyLossProcess::SetStepFunction(G4double v1, G4double v2) 710 { 711 dRoverRange = v1; 712 finalRange = v2; 713 if (dRoverRange > 0.999) dRoverRange = 1.0; 714 currentCouple = 0; 715 mfpKinEnergy = DBL_MAX; 716 } 717 718 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 719 720 inline void G4VEnergyLossProcess::SetLowestEnergyLimit(G4double val) 721 { 722 lowestKinEnergy = val; 723 } 724 725 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 726 727 inline G4int G4VEnergyLossProcess::NumberOfSubCutoffRegions() const 728 { 729 return nSCoffRegions; 730 } 731 732 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 733 734 inline G4int G4VEnergyLossProcess::NumberOfDERegions() const 735 { 736 return nDERegions; 737 } 738 739 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 740 741 inline void G4VEnergyLossProcess::SetDEDXBinning(G4int nbins) 742 { 743 nBins = nbins; 744 } 745 746 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 747 748 inline void G4VEnergyLossProcess::SetLambdaBinning(G4int nbins) 749 { 750 nBins = nbins; 751 } 752 753 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 754 755 inline void G4VEnergyLossProcess::SetDEDXBinningForCSDARange(G4int nbins) 756 { 757 nBinsCSDA = nbins; 758 } 759 760 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 761 762 inline void G4VEnergyLossProcess::SetMinKinEnergy(G4double e) 763 { 764 minKinEnergy = e; 765 } 766 767 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 768 769 inline G4double G4VEnergyLossProcess::MinKinEnergy() const 770 { 771 return minKinEnergy; 772 } 773 774 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 775 776 inline void G4VEnergyLossProcess::SetMaxKinEnergy(G4double e) 777 { 778 maxKinEnergy = e; 779 if(e < maxKinEnergyCSDA) maxKinEnergyCSDA = e; 780 } 781 782 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 783 784 inline G4double G4VEnergyLossProcess::MaxKinEnergy() const 785 { 786 return maxKinEnergy; 787 } 788 789 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 790 791 inline void G4VEnergyLossProcess::SetMaxKinEnergyForCSDARange(G4double e) 792 { 793 maxKinEnergyCSDA = e; 794 } 795 796 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 797 798 inline G4double G4VEnergyLossProcess::GetDEDX(G4double& kineticEnergy, 799 const G4MaterialCutsCouple* couple) 589 inline void 590 G4VEnergyLossProcess::DefineMaterial(const G4MaterialCutsCouple* couple) 591 { 592 if(couple != currentCouple) { 593 currentCouple = couple; 594 currentMaterial = couple->GetMaterial(); 595 currentMaterialIndex = couple->GetIndex(); 596 mfpKinEnergy = DBL_MAX; 597 } 598 } 599 600 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 601 602 inline void G4VEnergyLossProcess::SetDynamicMassCharge(G4double massratio, 603 G4double charge2ratio) 604 { 605 massRatio = massratio; 606 chargeSqRatio = charge2ratio; 607 reduceFactor = 1.0/(chargeSqRatio*massRatio); 608 } 609 610 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 611 612 inline G4double G4VEnergyLossProcess::GetDEDXForScaledEnergy(G4double e) 613 { 614 G4double x = ((*theDEDXTable)[currentMaterialIndex]->Value(e))*chargeSqRatio; 615 if(e < minKinEnergy) { x *= std::sqrt(e/minKinEnergy); } 616 return x; 617 } 618 619 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 620 621 inline G4double G4VEnergyLossProcess::GetSubDEDXForScaledEnergy(G4double e) 622 { 623 G4double x = ((*theDEDXSubTable)[currentMaterialIndex]->Value(e))*chargeSqRatio; 624 if(e < minKinEnergy) { x *= std::sqrt(e/minKinEnergy); } 625 return x; 626 } 627 628 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 629 630 inline G4double G4VEnergyLossProcess::GetIonisationForScaledEnergy(G4double e) 631 { 632 //G4double x = 0.0; 633 // if(theIonisationTable) { 634 G4double x = ((*theIonisationTable)[currentMaterialIndex]->Value(e))*chargeSqRatio; 635 if(e < minKinEnergy) { x *= std::sqrt(e/minKinEnergy); } 636 //} 637 return x; 638 } 639 640 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 641 642 inline 643 G4double G4VEnergyLossProcess::GetSubIonisationForScaledEnergy(G4double e) 644 { 645 // G4double x = 0.0; 646 //if(theIonisationSubTable) { 647 G4double x = ((*theIonisationSubTable)[currentMaterialIndex]->Value(e))*chargeSqRatio; 648 if(e < minKinEnergy) { x *= std::sqrt(e/minKinEnergy); } 649 //} 650 return x; 651 } 652 653 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 654 655 inline G4double G4VEnergyLossProcess::GetScaledRangeForScaledEnergy(G4double e) 656 { 657 G4double x = ((*theRangeTableForLoss)[currentMaterialIndex])->Value(e); 658 if(e < minKinEnergy) { x *= std::sqrt(e/minKinEnergy); } 659 return x; 660 } 661 662 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 663 664 inline G4double 665 G4VEnergyLossProcess::GetLimitScaledRangeForScaledEnergy(G4double e) 666 { 667 G4double x; 668 669 if (e < maxKinEnergyCSDA) { 670 x = ((*theCSDARangeTable)[currentMaterialIndex])->Value(e); 671 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy); 672 } else { 673 x = theRangeAtMaxEnergy[currentMaterialIndex] + 674 (e - maxKinEnergyCSDA)/theDEDXAtMaxEnergy[currentMaterialIndex]; 675 } 676 return x; 677 } 678 679 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 680 681 inline G4double G4VEnergyLossProcess::ScaledKinEnergyForLoss(G4double r) 682 { 683 G4PhysicsVector* v = (*theInverseRangeTable)[currentMaterialIndex]; 684 G4double rmin = v->Energy(0); 685 G4double e = 0.0; 686 if(r >= rmin) { e = v->Value(r); } 687 else if(r > 0.0) { 688 G4double x = r/rmin; 689 e = minKinEnergy*x*x; 690 } 691 return e; 692 } 693 694 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 695 696 inline G4double G4VEnergyLossProcess::GetLambdaForScaledEnergy(G4double e) 697 { 698 return chargeSqRatio*(((*theLambdaTable)[currentMaterialIndex])->Value(e)); 699 } 700 701 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 702 703 inline G4double 704 G4VEnergyLossProcess::GetDEDX(G4double& kineticEnergy, 705 const G4MaterialCutsCouple* couple) 800 706 { 801 707 DefineMaterial(couple); … … 805 711 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 806 712 807 inline G4double G4VEnergyLossProcess::GetDEDXForSubsec(G4double& kineticEnergy, 808 const G4MaterialCutsCouple* couple) 713 inline G4double 714 G4VEnergyLossProcess::GetDEDXForSubsec(G4double& kineticEnergy, 715 const G4MaterialCutsCouple* couple) 809 716 { 810 717 DefineMaterial(couple); … … 814 721 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 815 722 816 inline G4double G4VEnergyLossProcess::GetRange(G4double& kineticEnergy, 817 const G4MaterialCutsCouple* couple) 723 inline G4double 724 G4VEnergyLossProcess::GetRange(G4double& kineticEnergy, 725 const G4MaterialCutsCouple* couple) 818 726 { 819 727 G4double x = fRange; … … 831 739 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 832 740 833 inline G4double G4VEnergyLossProcess::GetCSDARange( 834 G4double& kineticEnergy, const G4MaterialCutsCouple* couple) 741 inline G4double 742 G4VEnergyLossProcess::GetCSDARange(G4double& kineticEnergy, 743 const G4MaterialCutsCouple* couple) 835 744 { 836 745 DefineMaterial(couple); … … 844 753 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 845 754 846 inline G4double G4VEnergyLossProcess::GetRangeForLoss(847 848 const G4MaterialCutsCouple* couple)755 inline G4double 756 G4VEnergyLossProcess::GetRangeForLoss(G4double& kineticEnergy, 757 const G4MaterialCutsCouple* couple) 849 758 { 850 759 DefineMaterial(couple); … … 859 768 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 860 769 861 inline G4double G4VEnergyLossProcess::GetKineticEnergy(862 863 const G4MaterialCutsCouple* couple)770 inline G4double 771 G4VEnergyLossProcess::GetKineticEnergy(G4double& range, 772 const G4MaterialCutsCouple* couple) 864 773 { 865 774 DefineMaterial(couple); … … 871 780 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 872 781 873 inline G4double G4VEnergyLossProcess::GetLambda(G4double& kineticEnergy, 874 const G4MaterialCutsCouple* couple) 782 inline G4double 783 G4VEnergyLossProcess::GetLambda(G4double& kineticEnergy, 784 const G4MaterialCutsCouple* couple) 875 785 { 876 786 DefineMaterial(couple); 877 787 G4double x = 0.0; 878 if(theLambdaTable) x = GetLambdaForScaledEnergy(kineticEnergy*massRatio);788 if(theLambdaTable) { x = GetLambdaForScaledEnergy(kineticEnergy*massRatio); } 879 789 return x; 880 }881 882 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....883 884 inline G4bool G4VEnergyLossProcess::TablesAreBuilt() const885 {886 return tablesAreBuilt;887 }888 889 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....890 891 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTable() const892 {893 return theDEDXTable;894 }895 896 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....897 898 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTableForSubsec() const899 {900 return theDEDXSubTable;901 }902 903 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....904 905 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXunRestrictedTable() const906 {907 return theDEDXunRestrictedTable;908 }909 910 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....911 912 inline G4PhysicsTable* G4VEnergyLossProcess::IonisationTable() const913 {914 G4PhysicsTable* t = theDEDXTable;915 if(theIonisationTable) t = theIonisationTable;916 return t;917 }918 919 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....920 921 inline G4PhysicsTable* G4VEnergyLossProcess::IonisationTableForSubsec() const922 {923 G4PhysicsTable* t = theDEDXSubTable;924 if(theIonisationSubTable) t = theIonisationSubTable;925 return t;926 }927 928 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....929 930 inline G4PhysicsTable* G4VEnergyLossProcess::CSDARangeTable() const931 {932 return theCSDARangeTable;933 }934 935 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....936 937 inline G4PhysicsTable* G4VEnergyLossProcess::RangeTableForLoss() const938 {939 return theRangeTableForLoss;940 }941 942 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....943 944 inline G4PhysicsTable* G4VEnergyLossProcess::InverseRangeTable() const945 {946 return theInverseRangeTable;947 }948 949 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....950 951 inline G4PhysicsTable* G4VEnergyLossProcess::LambdaTable()952 {953 return theLambdaTable;954 }955 956 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....957 958 inline G4PhysicsTable* G4VEnergyLossProcess::SubLambdaTable()959 {960 return theSubLambdaTable;961 }962 963 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....964 965 inline G4double G4VEnergyLossProcess::SampleRange()966 {967 G4double e = amu_c2*preStepKinEnergy/particle->GetPDGMass();968 G4double s = fRange*std::pow(10.,vstrag->Value(e));969 G4double x = fRange + G4RandGauss::shoot(0.0,s);970 if(x > 0.0) fRange = x;971 return fRange;972 }973 974 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....975 976 inline void G4VEnergyLossProcess::SetDynamicMassCharge(G4double massratio,977 G4double charge2ratio)978 {979 massRatio = massratio;980 chargeSqRatio = charge2ratio;981 reduceFactor = 1.0/(chargeSqRatio*massRatio);982 }983 984 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....985 986 inline void G4VEnergyLossProcess::DefineMaterial(987 const G4MaterialCutsCouple* couple)988 {989 if(couple != currentCouple) {990 currentCouple = couple;991 currentMaterial = couple->GetMaterial();992 currentMaterialIndex = couple->GetIndex();993 mfpKinEnergy = DBL_MAX;994 }995 }996 997 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....998 999 inline G4double G4VEnergyLossProcess::GetDEDXForScaledEnergy(G4double e)1000 {1001 G4double x = ((*theDEDXTable)[currentMaterialIndex]->Value(e))*chargeSqRatio;1002 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy);1003 return x;1004 }1005 1006 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1007 1008 inline G4double G4VEnergyLossProcess::GetSubDEDXForScaledEnergy(G4double e)1009 {1010 G4double x = ((*theDEDXSubTable)[currentMaterialIndex]->Value(e))*chargeSqRatio;1011 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy);1012 return x;1013 }1014 1015 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1016 1017 inline G4double G4VEnergyLossProcess::GetIonisationForScaledEnergy(G4double e)1018 {1019 //G4double x = 0.0;1020 // if(theIonisationTable) {1021 G4double x = ((*theIonisationTable)[currentMaterialIndex]->Value(e))*chargeSqRatio;1022 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy);1023 //}1024 return x;1025 }1026 1027 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1028 1029 inline1030 G4double G4VEnergyLossProcess::GetSubIonisationForScaledEnergy(G4double e)1031 {1032 // G4double x = 0.0;1033 //if(theIonisationSubTable) {1034 G4double x = ((*theIonisationSubTable)[currentMaterialIndex]->Value(e))*chargeSqRatio;1035 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy);1036 //}1037 return x;1038 }1039 1040 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1041 1042 inline G4double G4VEnergyLossProcess::GetScaledRangeForScaledEnergy(G4double e)1043 {1044 G4double x = ((*theRangeTableForLoss)[currentMaterialIndex])->Value(e);1045 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy);1046 return x;1047 }1048 1049 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1050 1051 inline G4double G4VEnergyLossProcess::GetLimitScaledRangeForScaledEnergy(1052 G4double e)1053 {1054 G4double x;1055 1056 if (e < maxKinEnergyCSDA) {1057 x = ((*theCSDARangeTable)[currentMaterialIndex])->Value(e);1058 if(e < minKinEnergy) x *= std::sqrt(e/minKinEnergy);1059 } else {1060 x = theRangeAtMaxEnergy[currentMaterialIndex] +1061 (e - maxKinEnergyCSDA)/theDEDXAtMaxEnergy[currentMaterialIndex];1062 }1063 return x;1064 }1065 1066 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1067 1068 inline G4double G4VEnergyLossProcess::ScaledKinEnergyForLoss(G4double r)1069 {1070 G4PhysicsVector* v = (*theInverseRangeTable)[currentMaterialIndex];1071 G4double rmin = v->Energy(0);1072 G4double e = 0.0;1073 if(r >= rmin) { e = v->Value(r); }1074 else if(r > 0.0) {1075 G4double x = r/rmin;1076 e = minKinEnergy*x*x;1077 }1078 return e;1079 }1080 1081 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....1082 1083 inline G4double G4VEnergyLossProcess::GetLambdaForScaledEnergy(G4double e)1084 {1085 return chargeSqRatio*(((*theLambdaTable)[currentMaterialIndex])->Value(e));1086 790 } 1087 791 … … 1111 815 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1112 816 817 inline G4double G4VEnergyLossProcess::SampleRange() 818 { 819 G4double e = amu_c2*preStepKinEnergy/particle->GetPDGMass(); 820 G4double s = fRange*std::pow(10.,vstrag->Value(e)); 821 G4double x = fRange + G4RandGauss::shoot(0.0,s); 822 if(x > 0.0) { fRange = x; } 823 return fRange; 824 } 825 826 // ======== Get/Set inline methods used at initialisation ================ 827 828 inline void G4VEnergyLossProcess::SetFluctModel(G4VEmFluctuationModel* p) 829 { 830 fluctModel = p; 831 } 832 833 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 834 835 inline G4VEmFluctuationModel* G4VEnergyLossProcess::FluctModel() 836 { 837 return fluctModel; 838 } 839 840 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 841 842 inline void G4VEnergyLossProcess::SetParticle(const G4ParticleDefinition* p) 843 { 844 particle = p; 845 } 846 847 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 848 849 inline void G4VEnergyLossProcess::SetSecondaryParticle(const G4ParticleDefinition* p) 850 { 851 secondaryParticle = p; 852 } 853 854 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 855 856 inline void G4VEnergyLossProcess::SetBaseParticle(const G4ParticleDefinition* p) 857 { 858 baseParticle = p; 859 } 860 861 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 862 863 inline const G4ParticleDefinition* G4VEnergyLossProcess::Particle() const 864 { 865 return particle; 866 } 867 868 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 869 870 inline const G4ParticleDefinition* G4VEnergyLossProcess::BaseParticle() const 871 { 872 return baseParticle; 873 } 874 875 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 876 877 inline const G4ParticleDefinition* G4VEnergyLossProcess::SecondaryParticle() const 878 { 879 return secondaryParticle; 880 } 881 882 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 883 884 inline void G4VEnergyLossProcess::SetLossFluctuations(G4bool val) 885 { 886 lossFluctuationFlag = val; 887 } 888 889 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 890 891 inline void G4VEnergyLossProcess::SetRandomStep(G4bool val) 892 { 893 rndmStepFlag = val; 894 } 895 896 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 897 898 inline void G4VEnergyLossProcess::SetIntegral(G4bool val) 899 { 900 integral = val; 901 } 902 903 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 904 905 inline G4bool G4VEnergyLossProcess::IsIntegral() const 906 { 907 return integral; 908 } 909 910 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 911 912 inline void G4VEnergyLossProcess::SetIonisation(G4bool val) 913 { 914 isIonisation = val; 915 if(val) { aGPILSelection = CandidateForSelection; } 916 else { aGPILSelection = NotCandidateForSelection; } 917 } 918 919 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 920 921 inline G4bool G4VEnergyLossProcess::IsIonisationProcess() const 922 { 923 return isIonisation; 924 } 925 926 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 927 928 inline void G4VEnergyLossProcess::SetLinearLossLimit(G4double val) 929 { 930 linLossLimit = val; 931 } 932 933 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 934 935 inline void G4VEnergyLossProcess::SetMinSubRange(G4double val) 936 { 937 minSubRange = val; 938 } 939 940 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 941 942 inline void G4VEnergyLossProcess::SetLambdaFactor(G4double val) 943 { 944 if(val > 0.0 && val <= 1.0) { lambdaFactor = val; } 945 } 946 947 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 948 949 void G4VEnergyLossProcess::SetStepFunction(G4double v1, G4double v2) 950 { 951 dRoverRange = v1; 952 finalRange = v2; 953 if (dRoverRange > 0.999) { dRoverRange = 1.0; } 954 currentCouple = 0; 955 mfpKinEnergy = DBL_MAX; 956 } 957 958 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 959 960 inline void G4VEnergyLossProcess::SetLowestEnergyLimit(G4double val) 961 { 962 lowestKinEnergy = val; 963 } 964 965 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 966 967 inline G4int G4VEnergyLossProcess::NumberOfSubCutoffRegions() const 968 { 969 return nSCoffRegions; 970 } 971 972 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 973 974 inline G4int G4VEnergyLossProcess::NumberOfDERegions() const 975 { 976 return nDERegions; 977 } 978 979 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 980 981 inline void G4VEnergyLossProcess::SetDEDXBinning(G4int nbins) 982 { 983 nBins = nbins; 984 } 985 986 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 987 988 inline void G4VEnergyLossProcess::SetLambdaBinning(G4int nbins) 989 { 990 nBins = nbins; 991 } 992 993 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 994 995 inline void G4VEnergyLossProcess::SetDEDXBinningForCSDARange(G4int nbins) 996 { 997 nBinsCSDA = nbins; 998 } 999 1000 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1001 1002 inline void G4VEnergyLossProcess::SetMinKinEnergy(G4double e) 1003 { 1004 minKinEnergy = e; 1005 } 1006 1007 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1008 1009 inline G4double G4VEnergyLossProcess::MinKinEnergy() const 1010 { 1011 return minKinEnergy; 1012 } 1013 1014 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1015 1016 inline void G4VEnergyLossProcess::SetMaxKinEnergy(G4double e) 1017 { 1018 maxKinEnergy = e; 1019 if(e < maxKinEnergyCSDA) { maxKinEnergyCSDA = e; } 1020 } 1021 1022 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1023 1024 inline G4double G4VEnergyLossProcess::MaxKinEnergy() const 1025 { 1026 return maxKinEnergy; 1027 } 1028 1029 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1030 1031 inline void G4VEnergyLossProcess::SetMaxKinEnergyForCSDARange(G4double e) 1032 { 1033 maxKinEnergyCSDA = e; 1034 } 1035 1036 1037 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1038 1039 inline G4bool G4VEnergyLossProcess::TablesAreBuilt() const 1040 { 1041 return tablesAreBuilt; 1042 } 1043 1044 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1045 1046 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTable() const 1047 { 1048 return theDEDXTable; 1049 } 1050 1051 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1052 1053 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTableForSubsec() const 1054 { 1055 return theDEDXSubTable; 1056 } 1057 1058 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1059 1060 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXunRestrictedTable() const 1061 { 1062 return theDEDXunRestrictedTable; 1063 } 1064 1065 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1066 1067 inline G4PhysicsTable* G4VEnergyLossProcess::IonisationTable() const 1068 { 1069 G4PhysicsTable* t = theDEDXTable; 1070 if(theIonisationTable) { t = theIonisationTable; } 1071 return t; 1072 } 1073 1074 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1075 1076 inline G4PhysicsTable* G4VEnergyLossProcess::IonisationTableForSubsec() const 1077 { 1078 G4PhysicsTable* t = theDEDXSubTable; 1079 if(theIonisationSubTable) { t = theIonisationSubTable; } 1080 return t; 1081 } 1082 1083 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1084 1085 inline G4PhysicsTable* G4VEnergyLossProcess::CSDARangeTable() const 1086 { 1087 return theCSDARangeTable; 1088 } 1089 1090 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1091 1092 inline G4PhysicsTable* G4VEnergyLossProcess::RangeTableForLoss() const 1093 { 1094 return theRangeTableForLoss; 1095 } 1096 1097 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1098 1099 inline G4PhysicsTable* G4VEnergyLossProcess::InverseRangeTable() const 1100 { 1101 return theInverseRangeTable; 1102 } 1103 1104 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1105 1106 inline G4PhysicsTable* G4VEnergyLossProcess::LambdaTable() 1107 { 1108 return theLambdaTable; 1109 } 1110 1111 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1112 1113 inline G4PhysicsTable* G4VEnergyLossProcess::SubLambdaTable() 1114 { 1115 return theSubLambdaTable; 1116 } 1117 1118 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 1119 1113 1120 #endif -
trunk/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VMultipleScattering.hh,v 1.6 2 2009/10/29 17:56:04vnivanch Exp $27 // GEANT4 tag $Name: geant4-09-0 3$26 // $Id: G4VMultipleScattering.hh,v 1.63 2010/03/10 18:29:51 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 28 // 29 29 // ------------------------------------------------------------------- … … 154 154 // The function overloads the corresponding function of the base 155 155 // class. 156 inlineG4double PostStepGetPhysicalInteractionLength(156 G4double PostStepGetPhysicalInteractionLength( 157 157 const G4Track&, 158 158 G4double previousStepSize, … … 160 160 161 161 // Along step actions 162 inlineG4VParticleChange* AlongStepDoIt(const G4Track&, const G4Step&);162 G4VParticleChange* AlongStepDoIt(const G4Track&, const G4Step&); 163 163 164 164 // Post step actions 165 inlineG4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&);165 G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&); 166 166 167 167 // This method does not used for tracking, it is intended only for tests 168 inlineG4double ContinuousStepLimit(const G4Track& track,169 170 171 168 G4double ContinuousStepLimit(const G4Track& track, 169 G4double previousStepSize, 170 G4double currentMinimalStep, 171 G4double& currentSafety); 172 172 173 173 //------------------------------------------------------------------------ … … 318 318 }; 319 319 320 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 321 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 322 323 inline G4double G4VMultipleScattering::ContinuousStepLimit( 324 const G4Track& track, 325 G4double previousStepSize, 326 G4double currentMinimalStep, 327 G4double& currentSafety) 328 { 329 return GetContinuousStepLimit(track,previousStepSize,currentMinimalStep, 330 currentSafety); 331 } 332 333 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 334 335 inline void G4VMultipleScattering::SetBinning(G4int nbins) 336 { 337 nBins = nbins; 338 } 339 340 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 341 342 inline G4int G4VMultipleScattering::Binning() const 343 { 344 return nBins; 345 } 346 347 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 348 349 inline void G4VMultipleScattering::SetMinKinEnergy(G4double e) 350 { 351 minKinEnergy = e; 352 } 353 354 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 355 356 inline G4double G4VMultipleScattering::MinKinEnergy() const 357 { 358 return minKinEnergy; 359 } 360 361 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 362 363 inline void G4VMultipleScattering::SetMaxKinEnergy(G4double e) 364 { 365 maxKinEnergy = e; 366 } 367 368 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 369 370 inline G4double G4VMultipleScattering::MaxKinEnergy() const 371 { 372 return maxKinEnergy; 373 } 374 375 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 376 377 inline void G4VMultipleScattering::SetBuildLambdaTable(G4bool val) 378 { 379 buildLambdaTable = val; 380 } 381 382 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 383 384 inline G4PhysicsTable* G4VMultipleScattering::LambdaTable() const 385 { 386 return theLambdaTable; 387 } 388 389 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 390 391 inline const G4ParticleDefinition* G4VMultipleScattering::Particle() const 392 { 393 return currentParticle; 394 } 395 396 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 397 398 inline G4VEmModel* G4VMultipleScattering::SelectModel(G4double kinEnergy) 399 { 400 return modelManager->SelectModel(kinEnergy, currentMaterialIndex); 401 } 402 403 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 404 405 inline G4VEmModel* G4VMultipleScattering::SelectModelForMaterial( 406 G4double kinEnergy, size_t& idxRegion) const 407 { 408 return modelManager->SelectModel(kinEnergy, idxRegion); 409 } 410 411 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 412 413 inline G4bool G4VMultipleScattering::LateralDisplasmentFlag() const 414 { 415 return latDisplasment; 416 } 417 418 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 419 420 inline void G4VMultipleScattering::SetLateralDisplasmentFlag(G4bool val) 421 { 422 latDisplasment = val; 423 } 424 425 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 426 427 inline G4double G4VMultipleScattering::Skin() const 428 { 429 return skin; 430 } 431 432 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 433 434 inline void G4VMultipleScattering::SetSkin(G4double val) 435 { 436 if(val < 1.0) skin = 0.0; 437 else skin = val; 438 } 439 440 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 441 442 inline G4double G4VMultipleScattering::RangeFactor() const 443 { 444 return facrange; 445 } 446 447 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 448 449 inline void G4VMultipleScattering::SetRangeFactor(G4double val) 450 { 451 if(val > 0.0) facrange = val; 452 } 453 454 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 455 456 inline G4double G4VMultipleScattering::GeomFactor() const 457 { 458 return facgeom; 459 } 460 461 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 462 463 inline void G4VMultipleScattering::SetGeomFactor(G4double val) 464 { 465 if(val > 0.0) facgeom = val; 466 } 467 468 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 469 470 inline G4double G4VMultipleScattering::PolarAngleLimit() const 471 { 472 return polarAngleLimit; 473 } 474 475 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 476 477 inline void G4VMultipleScattering::SetPolarAngleLimit(G4double val) 478 { 479 if(val < 0.0) polarAngleLimit = 0.0; 480 else if(val > pi) polarAngleLimit = pi; 481 else polarAngleLimit = val; 482 } 483 484 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 485 486 inline G4MscStepLimitType G4VMultipleScattering::StepLimitType() const 487 { 488 return stepLimit; 489 } 490 491 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 492 493 inline void G4VMultipleScattering::SetStepLimitType(G4MscStepLimitType val) 494 { 495 stepLimit = val; 496 if(val == fMinimal) facrange = 0.2; 320 // ======== Run time inline methods ================ 321 322 inline const G4MaterialCutsCouple* 323 G4VMultipleScattering::CurrentMaterialCutsCouple() const 324 { 325 return currentCouple; 326 } 327 328 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 329 330 inline 331 void G4VMultipleScattering::DefineMaterial(const G4MaterialCutsCouple* couple) 332 { 333 if(couple != currentCouple) { 334 currentCouple = couple; 335 currentMaterialIndex = couple->GetIndex(); 336 } 497 337 } 498 338 … … 509 349 x = currentModel->CrossSection(currentCouple,p,e); 510 350 } 511 if(x > DBL_MIN) x = 1./x;512 else x = DBL_MAX;351 if(x > DBL_MIN) { x = 1./x; } 352 else { x = DBL_MAX; } 513 353 return x; 514 354 } … … 516 356 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 517 357 518 inline 519 void G4VMultipleScattering::DefineMaterial(const G4MaterialCutsCouple* couple) 520 { 521 if(couple != currentCouple) { 522 currentCouple = couple; 523 currentMaterialIndex = couple->GetIndex(); 524 } 525 } 526 527 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 528 529 inline const G4MaterialCutsCouple* 530 G4VMultipleScattering::CurrentMaterialCutsCouple() const 531 { 532 return currentCouple; 533 } 534 535 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 536 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 537 538 // Follwoing methods are virtual, they are inlined because they applied at 539 // each simulation step and some compilers may inline these methods 540 541 inline G4double 542 G4VMultipleScattering::PostStepGetPhysicalInteractionLength( 543 const G4Track&, G4double, G4ForceCondition* condition) 544 { 545 *condition = Forced; 546 return DBL_MAX; 547 } 548 549 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 550 551 inline G4VParticleChange* 552 G4VMultipleScattering::AlongStepDoIt(const G4Track& track, const G4Step& step) 553 { 554 if(currentModel->IsActive(track.GetKineticEnergy())) { 555 fParticleChange.ProposeTrueStepLength(currentModel->ComputeTrueStepLength(step.GetStepLength())); 556 } 557 return &fParticleChange; 558 } 559 560 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 561 562 inline G4VParticleChange* 563 G4VMultipleScattering::PostStepDoIt(const G4Track& track, const G4Step& step) 564 { 565 fParticleChange.Initialize(track); 566 if(currentModel->IsActive(track.GetKineticEnergy())) { 567 currentModel->SampleScattering(track.GetDynamicParticle(), 568 step.GetPostStepPoint()->GetSafety()); 569 } 570 return &fParticleChange; 358 inline G4VEmModel* G4VMultipleScattering::SelectModel(G4double kinEnergy) 359 { 360 return modelManager->SelectModel(kinEnergy, currentMaterialIndex); 361 } 362 363 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 364 365 inline G4VEmModel* G4VMultipleScattering::SelectModelForMaterial( 366 G4double kinEnergy, size_t& idxRegion) const 367 { 368 return modelManager->SelectModel(kinEnergy, idxRegion); 369 } 370 371 // ======== Get/Set inline methods used at initialisation ================ 372 373 inline void G4VMultipleScattering::SetBinning(G4int nbins) 374 { 375 nBins = nbins; 376 } 377 378 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 379 380 inline G4int G4VMultipleScattering::Binning() const 381 { 382 return nBins; 383 } 384 385 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 386 387 inline void G4VMultipleScattering::SetMinKinEnergy(G4double e) 388 { 389 minKinEnergy = e; 390 } 391 392 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 393 394 inline G4double G4VMultipleScattering::MinKinEnergy() const 395 { 396 return minKinEnergy; 397 } 398 399 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 400 401 inline void G4VMultipleScattering::SetMaxKinEnergy(G4double e) 402 { 403 maxKinEnergy = e; 404 } 405 406 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 407 408 inline G4double G4VMultipleScattering::MaxKinEnergy() const 409 { 410 return maxKinEnergy; 411 } 412 413 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 414 415 inline void G4VMultipleScattering::SetBuildLambdaTable(G4bool val) 416 { 417 buildLambdaTable = val; 418 } 419 420 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 421 422 inline G4PhysicsTable* G4VMultipleScattering::LambdaTable() const 423 { 424 return theLambdaTable; 425 } 426 427 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 428 429 inline const G4ParticleDefinition* G4VMultipleScattering::Particle() const 430 { 431 return currentParticle; 432 } 433 434 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 435 436 inline G4bool G4VMultipleScattering::LateralDisplasmentFlag() const 437 { 438 return latDisplasment; 439 } 440 441 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 442 443 inline void G4VMultipleScattering::SetLateralDisplasmentFlag(G4bool val) 444 { 445 latDisplasment = val; 446 } 447 448 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 449 450 inline G4double G4VMultipleScattering::Skin() const 451 { 452 return skin; 453 } 454 455 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 456 457 inline void G4VMultipleScattering::SetSkin(G4double val) 458 { 459 if(val < 1.0) { skin = 0.0; } 460 else { skin = val; } 461 } 462 463 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 464 465 inline G4double G4VMultipleScattering::RangeFactor() const 466 { 467 return facrange; 468 } 469 470 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 471 472 inline void G4VMultipleScattering::SetRangeFactor(G4double val) 473 { 474 if(val > 0.0) facrange = val; 475 } 476 477 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 478 479 inline G4double G4VMultipleScattering::GeomFactor() const 480 { 481 return facgeom; 482 } 483 484 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 485 486 inline void G4VMultipleScattering::SetGeomFactor(G4double val) 487 { 488 if(val > 0.0) facgeom = val; 489 } 490 491 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 492 493 inline G4double G4VMultipleScattering::PolarAngleLimit() const 494 { 495 return polarAngleLimit; 496 } 497 498 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 499 500 inline void G4VMultipleScattering::SetPolarAngleLimit(G4double val) 501 { 502 if(val < 0.0) { polarAngleLimit = 0.0; } 503 else if(val > CLHEP::pi) { polarAngleLimit = CLHEP::pi; } 504 else { polarAngleLimit = val; } 505 } 506 507 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 508 509 inline G4MscStepLimitType G4VMultipleScattering::StepLimitType() const 510 { 511 return stepLimit; 512 } 513 514 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 515 516 inline void G4VMultipleScattering::SetStepLimitType(G4MscStepLimitType val) 517 { 518 stepLimit = val; 519 if(val == fMinimal) { facrange = 0.2; } 571 520 } 572 521
Note: See TracChangeset
for help on using the changeset viewer.