Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 // ------------------------------------------- 28 // 29 // GEANT4 Class header file 30 // 31 // 32 // File name: G4EmCalculator 33 // 34 // Author: Vladimir Ivanchenko 35 // 36 // Creation date: 27.06.2004 37 // 38 // Modifications: 39 // 17.11.2004 Change signature of methods, add 40 // 11.01.2006 Add GetCSDARange (V.Ivanchenko) 41 // 26.01.2006 Rename GetRange -> GetRangeFromR 42 // 22.03.2006 Add ComputeElectronicDEDX and Co 43 // 29.09.2006 Add member loweModel (V.Ivanchen 44 // 15.03.2007 Add ComputeEnergyCutFromRangeCut 45 // 02.02.2018 Add parameter to FindLambdaTable 46 // 47 // Class Description: 48 // 49 // Provide access to dE/dx and cross sections 50 51 // ------------------------------------------- 52 // 53 54 #ifndef G4EmCalculator_h 55 #define G4EmCalculator_h 1 56 57 #include <vector> 58 #include "globals.hh" 59 #include "G4VAtomDeexcitation.hh" 60 61 class G4LossTableManager; 62 class G4NistManager; 63 class G4Material; 64 class G4MaterialCutsCouple; 65 class G4ParticleDefinition; 66 class G4PhysicsTable; 67 class G4VEmModel; 68 class G4VEnergyLossProcess; 69 class G4VEmProcess; 70 class G4VMultipleScattering; 71 class G4VProcess; 72 class G4ionEffectiveCharge; 73 class G4Region; 74 class G4Element; 75 class G4EmCorrections; 76 class G4EmParameters; 77 class G4IonTable; 78 79 class G4EmCalculator 80 { 81 82 public: 83 84 G4EmCalculator(); 85 86 ~G4EmCalculator(); 87 88 //========================================== 89 // Methods to access precalculated dE/dx and 90 // Materials should exist in the list of the 91 //========================================== 92 93 G4double GetDEDX(G4double kinEnergy, const G 94 const G4Material*, 95 const G4Region* r = nullptr 96 inline G4double GetDEDX(G4double kinEnergy, 97 const G4String& mat, 98 const G4String& regname = " 99 100 G4double GetRangeFromRestricteDEDX(G4double 101 const G4ParticleDefinition*, 102 const G4Material*, 103 const G4Region* r = nullptr); 104 inline G4double GetRangeFromRestricteDEDX(G4 105 const G4String& part, 106 const G4String& mat, 107 const G4String& regname = "world 108 109 G4double GetCSDARange(G4double kinEnergy, co 110 const G4Material*, 111 const G4Region* r = nullptr); 112 inline G4double GetCSDARange(G4double kinEne 113 const G4String& mat, 114 const G4String& regname = "world"); 115 116 G4double GetRange(G4double kinEnergy, const 117 const G4Material*, 118 const G4Region* r = nullptr); 119 inline G4double GetRange(G4double kinEnergy, 120 const G4String& mat, 121 const G4String& regname = "world"); 122 123 G4double GetKinEnergy(G4double range, const 124 const G4Material*, 125 const G4Region* r = nullptr); 126 inline G4double GetKinEnergy(G4double range, 127 const G4String& mat, 128 const G4String& regname = "world"); 129 130 G4double GetCrossSectionPerVolume( 131 G4double kinEnergy, const G 132 const G4String& processName 133 const G4Region* r = nullptr); 134 inline G4double GetCrossSectionPerVolume( 135 G4double kinEnergy, const G 136 const G4String& mat, const 137 138 G4double GetShellIonisationCrossSectionPerAt 139 const G4String& part, G4int 140 G4AtomicShellEnumerator shell, 141 G4double kinEnergy); 142 143 G4double GetMeanFreePath(G4double kinEnergy, 144 const G4String& processName, const G 145 const G4Region* r = nullptr); 146 inline G4double GetMeanFreePath(G4double kin 147 const G4String& proc, const G4String 148 const G4String& regname = "world"); 149 150 void PrintDEDXTable(const G4ParticleDefiniti 151 152 void PrintRangeTable(const G4ParticleDefinit 153 154 void PrintInverseRangeTable(const G4Particle 155 156 //========================================== 157 // Methods to calculate dE/dx and cross sect 158 // Existing tables and G4MaterialCutsCouples 159 //========================================== 160 161 G4double ComputeDEDX(G4double kinEnergy, con 162 const G4String& process 163 G4double cut = DBL_MAX); 164 inline G4double ComputeDEDX(G4double kinEner 165 const G4String& proc, 166 const G4String& mat, G4 167 168 G4double ComputeElectronicDEDX(G4double kinE 169 const G4ParticleDefinition*, 170 const G4Material* mat, G4double cut = 171 inline G4double ComputeElectronicDEDX(G4doub 172 const G4String& mat, G4double cut = D 173 174 G4double ComputeDEDXForCutInRange(G4double k 175 const G4ParticleDefinition*, 176 const G4Material* mat, G4double ra 177 inline G4double ComputeDEDXForCutInRange(G4d 178 const G4String& mat, 179 G4double rangecut = DBL_MAX); 180 181 G4double ComputeNuclearDEDX(G4double kinEner 182 const G4Material*); 183 inline G4double ComputeNuclearDEDX(G4double 184 const G4String& mat); 185 186 G4double ComputeTotalDEDX(G4double kinEnergy 187 const G4Material*, G4double cut = DB 188 inline G4double ComputeTotalDEDX(G4double ki 189 const G4String& mat, G4double cut = 190 191 G4double ComputeCrossSectionPerVolume( 192 G4double kinEnergy, con 193 const G4String& process 194 G4double cut = 0.0); 195 inline G4double ComputeCrossSectionPerVolume 196 G4double kinEnergy, con 197 const G4String& proc, 198 const G4String& mat, G4 199 200 G4double ComputeCrossSectionPerAtom( 201 G4double kinEnergy, con 202 const G4String& process 203 G4double cut = 0.0); 204 inline G4double ComputeCrossSectionPerAtom( 205 G4double kinEnergy, con 206 const G4String& process 207 G4double cut = 0.0); 208 209 G4double ComputeCrossSectionPerShell( 210 G4double kinEnergy, con 211 const G4String& process 212 G4double cut = 0.0); 213 inline G4double ComputeCrossSectionPerShell( 214 G4double kinEnergy, con 215 const G4String& process 216 G4int shellIdx, 217 G4double cut = 0.0); 218 219 G4double ComputeGammaAttenuationLength(G4dou 220 const G4Material*); 221 222 G4double ComputeShellIonisationCrossSectionP 223 const G4String& part, G4int 224 G4AtomicShellEnumerator shell, 225 G4double kinEnergy, 226 const G4Material* mat = nul 227 228 G4double ComputeMeanFreePath( 229 G4double kinEnergy, con 230 const G4String& process 231 G4double cut = 0.0); 232 inline G4double ComputeMeanFreePath( 233 G4double kinEnergy, con 234 const G4String& process 235 236 G4double ComputeEnergyCutFromRangeCut( 237 G4double range, const G 238 const G4Material*); 239 inline G4double ComputeEnergyCutFromRangeCut 240 G4double range, const G 241 const G4String&); 242 243 //========================================== 244 // Methods to access particles, materials, r 245 //========================================== 246 247 const G4ParticleDefinition* FindParticle(con 248 249 const G4ParticleDefinition* FindIon(G4int Z, 250 251 const G4Material* FindMaterial(const G4Strin 252 253 const G4Region* FindRegion(const G4String&); 254 255 const G4MaterialCutsCouple* FindCouple(const 256 const G4Region* r = nullptr); 257 258 G4VProcess* FindProcess(const G4ParticleDefi 259 const G4String& processName); 260 261 void SetupMaterial(const G4Material*); 262 263 void SetupMaterial(const G4String&); 264 265 void SetVerbose(G4int val); 266 267 inline void SetApplySmoothing(G4int val); 268 269 // hide copy and assign 270 G4EmCalculator & operator=(const G4EmCalcul 271 G4EmCalculator(const G4EmCalculator&) = del 272 273 private: 274 275 G4bool UpdateParticle(const G4ParticleDefini 276 277 G4bool UpdateCouple(const G4Material*, G4dou 278 279 void FindLambdaTable(const G4ParticleDefinit 280 const G4String& process 281 G4double kinEnergy, G4i 282 283 G4bool FindEmModel(const G4ParticleDefinitio 284 const G4String& processNa 285 G4double kinEnergy) 286 287 G4VEnergyLossProcess* FindEnLossProcess(cons 288 const G4String& processName); 289 290 G4VEmProcess* FindDiscreteProcess(const G4Pa 291 const G4String& processName); 292 293 G4VMultipleScattering* FindMscProcess(const 294 const G4String& processName); 295 296 G4bool ActiveForParticle(const G4ParticleDef 297 G4VProcess* proc); 298 299 void CheckMaterial(G4int Z); 300 301 G4EmParameters* theParameters; 302 G4LossTableManager* manager; 303 G4NistManager* nist; 304 G4IonTable* ionTable; 305 G4EmCorrections* corr; 306 307 // cache 308 const G4MaterialCutsCouple* currentCouple = 309 const G4Material* currentMaterial 310 const G4Material* cutMaterial = n 311 const G4ParticleDefinition* currentParticle 312 const G4ParticleDefinition* lambdaParticle 313 const G4ParticleDefinition* baseParticle = 314 const G4PhysicsTable* currentLambda = 315 316 G4VEmModel* currentModel = 317 G4VEmModel* loweModel = nul 318 G4VEnergyLossProcess* currentProcess 319 G4VProcess* curProcess = nu 320 G4DynamicParticle* dynParticle = n 321 322 const G4ParticleDefinition* theGenericIon; 323 G4ionEffectiveCharge* ionEffCharge; 324 325 G4double currentCut = DB 326 G4double chargeSquare = 327 G4double massRatio = 1.0 328 G4double mass = 0; 329 G4double cutenergy[3]; 330 331 G4int currentCoupleIn 332 G4int nLocalMaterials 333 G4int verbose = 0; 334 335 G4bool isIon = false; 336 G4bool isApplicable = 337 G4bool applySmoothing 338 339 std::vector<const G4Material*> lo 340 std::vector<const G4MaterialCutsCouple*> lo 341 std::vector<G4double> lo 342 343 G4String currentName = " 344 G4String lambdaName = "" 345 G4String currentParticle 346 G4String currentMaterial 347 G4String currentProcessN 348 }; 349 350 //....oooOO0OOooo.......oooOO0OOooo........ooo 351 //....oooOO0OOooo........oooOO0OOooo........oo 352 353 inline 354 G4double G4EmCalculator::GetDEDX(G4double kinE 355 const G4Strin 356 { 357 return GetDEDX(kinEnergy,FindParticle(partic 358 FindMaterial(material),FindRegion(reg)); 359 } 360 361 //....oooOO0OOooo........oooOO0OOooo........oo 362 363 inline 364 G4double G4EmCalculator::GetRangeFromRestricte 365 const G4String& particle, 366 const G4String& material, 367 const G4String& reg) 368 { 369 return GetRangeFromRestricteDEDX(kinEnergy,F 370 FindMaterial(material),FindRegion(r 371 } 372 373 //....oooOO0OOooo........oooOO0OOooo........oo 374 375 inline 376 G4double G4EmCalculator::GetCSDARange(G4double 377 const G4String& particle, 378 const G4String& material, 379 const G4String& reg) 380 { 381 return GetCSDARange(kinEnergy,FindParticle(p 382 FindMaterial(material),FindRegion(reg)); 383 } 384 385 //....oooOO0OOooo........oooOO0OOooo........oo 386 387 inline 388 G4double G4EmCalculator::GetRange(G4double kin 389 const G4String& particle, 390 const G4String& material, 391 const G4String& reg) 392 { 393 return GetRange(kinEnergy,FindParticle(parti 394 FindMaterial(material),FindRegion(reg)); 395 } 396 397 //....oooOO0OOooo........oooOO0OOooo........oo 398 399 inline 400 G4double G4EmCalculator::GetKinEnergy(G4double 401 const G4 402 { 403 return GetKinEnergy(range,FindParticle(parti 404 FindMaterial(material),FindRegion(re 405 } 406 407 //....oooOO0OOooo........oooOO0OOooo........oo 408 409 inline 410 G4double G4EmCalculator::GetCrossSectionPerVol 411 co 412 const G4String& processName, 413 co 414 const G4String& reg) 415 { 416 return GetCrossSectionPerVolume(kinEnergy,Fi 417 FindMaterial 418 } 419 420 //....oooOO0OOooo........oooOO0OOooo........oo 421 422 inline 423 G4double G4EmCalculator::GetMeanFreePath(G4dou 424 const 425 const G4String& processName, 426 const 427 const G4String& reg) 428 { 429 return GetMeanFreePath(kinEnergy,FindParticl 430 FindMaterial(material 431 } 432 433 //....oooOO0OOooo........oooOO0OOooo........oo 434 435 inline G4double 436 G4EmCalculator::ComputeElectronicDEDX(G4double 437 const G4String& mat, G4double cu 438 { 439 return 440 ComputeElectronicDEDX(kinEnergy,FindPartic 441 } 442 443 //....oooOO0OOooo........oooOO0OOooo........oo 444 445 inline G4double 446 G4EmCalculator::ComputeDEDXForCutInRange(G4dou 447 const G4String& part, 448 const G4String& mat, 449 G4double rangecut) 450 { 451 return ComputeDEDXForCutInRange(kinEnergy,Fi 452 FindMaterial(mat), rangecut); 453 } 454 455 //....oooOO0OOooo........oooOO0OOooo........oo 456 457 inline 458 G4double G4EmCalculator::ComputeTotalDEDX(G4do 459 const G4String& part, 460 const G4String& mat, 461 G4double cut) 462 { 463 return ComputeTotalDEDX(kinEnergy,FindPartic 464 } 465 466 //....oooOO0OOooo........oooOO0OOooo........oo 467 468 inline 469 G4double G4EmCalculator::ComputeDEDX(G4double 470 const G4S 471 const G4String& processName, 472 const G4S 473 G4d 474 { 475 return ComputeDEDX(kinEnergy,FindParticle(pa 476 FindMaterial(material),cu 477 } 478 479 //....oooOO0OOooo........oooOO0OOooo........oo 480 481 inline 482 G4double G4EmCalculator::ComputeNuclearDEDX(G4 483 const G4 484 const G4String& material) 485 { 486 return ComputeNuclearDEDX(kinEnergy,FindPart 487 FindMaterial(material)); 488 } 489 490 //....oooOO0OOooo........oooOO0OOooo........oo 491 492 inline 493 G4double G4EmCalculator::ComputeCrossSectionPe 494 495 c 496 const G4String& processName, 497 c 498 499 { 500 return ComputeCrossSectionPerVolume(kinEnerg 501 processName, 502 FindMate 503 } 504 505 //....oooOO0OOooo........oooOO0OOooo........oo 506 507 inline 508 G4double G4EmCalculator::ComputeCrossSectionPe 509 510 511 const G4Element* elm, 512 G4doub 513 { 514 return ComputeCrossSectionPerAtom(kinEnergy, 515 processName, 516 elm->GetZ( 517 } 518 519 //....oooOO0OOooo........oooOO0OOooo........oo 520 521 inline G4double G4EmCalculator::ComputeCrossSe 522 G4double kinEnergy, con 523 const G4String& process 524 G4int shellIdx, G4doubl 525 { 526 return ComputeCrossSectionPerShell(kinEnergy 527 processName, elm->GetZasInt(), 528 shellIdx, cut); 529 } 530 531 //....oooOO0OOooo........oooOO0OOooo........oo 532 533 inline 534 G4double G4EmCalculator::ComputeEnergyCutFromR 535 G4double range, 536 const G4String& particle, 537 const G4String& material) 538 { 539 return ComputeEnergyCutFromRangeCut(range,Fi 540 FindMaterial(material)); 541 } 542 543 //....oooOO0OOooo........oooOO0OOooo........oo 544 545 inline 546 G4double G4EmCalculator::ComputeMeanFreePath(G 547 c 548 c 549 c 550 551 { 552 return ComputeMeanFreePath(kinEnergy,FindPar 553 FindMaterial(mate 554 } 555 556 //....oooOO0OOooo........oooOO0OOooo........oo 557 558 inline void G4EmCalculator::SetApplySmoothing( 559 { 560 applySmoothing = val; 561 } 562 563 //....oooOO0OOooo........oooOO0OOooo........oo 564 565 #endif 566