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 // GEANT4 Class header file 29 // 30 // 31 // File name: G4VEmProcess 32 // 33 // Author: Vladimir Ivanchenko 34 // 35 // Creation date: 01.10.2003 36 // 37 // Modifications: Vladimir Ivanchenko 38 // 39 // Class Description: 40 // 41 // It is the base class - EM discrete and rest 42 43 // ------------------------------------------- 44 // 45 46 #ifndef G4VEmProcess_h 47 #define G4VEmProcess_h 1 48 49 #include <CLHEP/Units/SystemOfUnits.h> 50 51 #include "G4VDiscreteProcess.hh" 52 #include "globals.hh" 53 #include "G4Material.hh" 54 #include "G4MaterialCutsCouple.hh" 55 #include "G4Track.hh" 56 #include "G4UnitsTable.hh" 57 #include "G4ParticleDefinition.hh" 58 #include "G4ParticleChangeForGamma.hh" 59 #include "G4EmParameters.hh" 60 #include "G4EmDataHandler.hh" 61 #include "G4EmTableType.hh" 62 #include "G4EmModelManager.hh" 63 #include "G4EmSecondaryParticleType.hh" 64 65 class G4Step; 66 class G4VEmModel; 67 class G4DataVector; 68 class G4VParticleChange; 69 class G4PhysicsTable; 70 class G4PhysicsVector; 71 class G4EmBiasingManager; 72 class G4LossTableManager; 73 74 //....oooOO0OOooo........oooOO0OOooo........oo 75 76 class G4VEmProcess : public G4VDiscreteProcess 77 { 78 public: 79 80 G4VEmProcess(const G4String& name, G4Process 81 82 ~G4VEmProcess() override; 83 84 //------------------------------------------ 85 // Virtual methods to be implemented in conc 86 //------------------------------------------ 87 88 void ProcessDescription(std::ostream& outFil 89 90 protected: 91 92 virtual void StreamProcessInfo(std::ostream& 93 94 virtual void InitialiseProcess(const G4Parti 95 96 //------------------------------------------ 97 // Implementation of virtual methods common 98 //------------------------------------------ 99 100 public: 101 102 // Initialise for build of tables 103 void PreparePhysicsTable(const G4ParticleDef 104 105 // Build physics table during initialisation 106 void BuildPhysicsTable(const G4ParticleDefin 107 108 // Called before tracking of each new G4Trac 109 void StartTracking(G4Track*) override; 110 111 // implementation of virtual method, specifi 112 G4double PostStepGetPhysicalInteractionLengt 113 const G4Track& tr 114 G4double previo 115 G4ForceCondition* 116 117 // implementation of virtual method, specifi 118 G4VParticleChange* PostStepDoIt(const G4Trac 119 120 // Store PhysicsTable in a file. 121 // Return false in case of failure at I/O 122 G4bool StorePhysicsTable(const G4ParticleDef 123 const G4String& dir 124 G4bool ascii = fals 125 126 // Retrieve Physics from a file. 127 // (return true if the Physics Table can be 128 // (return false if the process has no funct 129 // File name should is constructed as proces 130 // should be placed under the directory spec 131 G4bool RetrievePhysicsTable(const G4Particle 132 const G4String& 133 G4bool ascii) ov 134 135 // allowing check process name 136 virtual G4VEmProcess* GetEmProcess(const G4S 137 138 //------------------------------------------ 139 // Specific methods for Discrete EM post ste 140 //------------------------------------------ 141 142 // The main method to access cross section p 143 inline G4double GetLambda(G4double kinEnergy 144 const G4MaterialCu 145 G4double logKinEne 146 147 // It returns the cross section per volume f 148 G4double GetCrossSection(const G4double kinE 149 const G4MaterialCut 150 151 // It returns the cross section of the proce 152 G4double ComputeCrossSectionPerAtom(G4double 153 G4double 154 G4double 155 156 inline G4double MeanFreePath(const G4Track& 157 158 //------------------------------------------ 159 // Specific methods to build and access Phys 160 //------------------------------------------ 161 162 // Binning for lambda table 163 void SetLambdaBinning(G4int nbins); 164 165 // Min kinetic energy for tables 166 void SetMinKinEnergy(G4double e); 167 168 // Min kinetic energy for high energy table 169 void SetMinKinEnergyPrim(G4double e); 170 171 // Max kinetic energy for tables 172 void SetMaxKinEnergy(G4double e); 173 174 // Cross section table pointers 175 inline G4PhysicsTable* LambdaTable() const; 176 inline G4PhysicsTable* LambdaTablePrim() con 177 inline void SetLambdaTable(G4PhysicsTable*); 178 inline void SetLambdaTablePrim(G4PhysicsTabl 179 180 // Integral method type and peak positions 181 inline std::vector<G4double>* EnergyOfCrossS 182 inline void SetEnergyOfCrossSectionMax(std:: 183 inline G4CrossSectionType CrossSectionType() 184 inline void SetCrossSectionType(G4CrossSecti 185 186 //------------------------------------------ 187 // Define and access particle type 188 //------------------------------------------ 189 190 inline const G4ParticleDefinition* Particle( 191 inline const G4ParticleDefinition* Secondary 192 193 protected: 194 195 //------------------------------------------ 196 // Specific methods to set, access, modify m 197 //------------------------------------------ 198 199 // Select model in run time 200 inline G4VEmModel* SelectModel(G4double kinE 201 202 public: 203 204 // Select model by energy and couple index 205 inline G4VEmModel* SelectModelForMaterial(G4 206 st 207 208 // Add model for region, smaller value of or 209 // model will be selected for a given energy 210 void AddEmModel(G4int, G4VEmModel*, const G4 211 212 // Assign a model to a process local list, t 213 // the derived process should execute AddEmM 214 void SetEmModel(G4VEmModel*, G4int index = 0 215 216 inline G4int NumberOfModels() const; 217 218 // return a model from the local list 219 inline G4VEmModel* EmModel(std::size_t index 220 221 // Access to active model 222 inline const G4VEmModel* GetCurrentModel() c 223 224 // Access to models 225 inline G4VEmModel* GetModelByIndex(G4int idx 226 227 // Access to the current G4Element 228 const G4Element* GetCurrentElement() const; 229 230 // Biasing parameters 231 void SetCrossSectionBiasingFactor(G4double f 232 inline G4double CrossSectionBiasingFactor() 233 234 // Activate forced interaction 235 void ActivateForcedInteraction(G4double leng 236 const G4Strin 237 G4bool flag = 238 239 void ActivateSecondaryBiasing(const G4String 240 G4double energ 241 242 inline void SetEmMasterProcess(const G4VEmPr 243 244 inline void SetBuildTableFlag(G4bool val); 245 246 inline void CurrentSetup(const G4MaterialCut 247 248 inline G4bool UseBaseMaterial() const; 249 250 void BuildLambdaTable(); 251 252 void StreamInfo(std::ostream& outFile, const 253 G4bool rst=false) const; 254 255 // hide copy constructor and assignment oper 256 G4VEmProcess(G4VEmProcess &) = delete; 257 G4VEmProcess & operator=(const G4VEmProcess 258 259 //------------------------------------------ 260 // Other generic methods 261 //------------------------------------------ 262 263 protected: 264 265 G4double GetMeanFreePath(const G4Track& trac 266 G4double previousSt 267 G4ForceCondition* c 268 269 G4PhysicsVector* LambdaPhysicsVector(const G 270 271 inline void DefineMaterial(const G4MaterialC 272 273 inline G4int LambdaBinning() const; 274 275 inline G4double MinKinEnergy() const; 276 277 inline G4double MaxKinEnergy() const; 278 279 // Single scattering parameters 280 inline G4double PolarAngleLimit() const; 281 282 inline G4ParticleChangeForGamma* GetParticle 283 284 inline void SetParticle(const G4ParticleDefi 285 286 inline void SetSecondaryParticle(const G4Par 287 288 inline std::size_t CurrentMaterialCutsCouple 289 290 inline const G4MaterialCutsCouple* MaterialC 291 292 inline G4bool ApplyCuts() const; 293 294 inline G4double GetGammaEnergyCut(); 295 296 inline G4double GetElectronEnergyCut(); 297 298 inline void SetStartFromNullFlag(G4bool val) 299 300 inline void SetSplineFlag(G4bool val); 301 302 const G4Element* GetTargetElement() const; 303 304 const G4Isotope* GetTargetIsotope() const; 305 306 // these two methods assume that vectors are 307 // and idx is within vector length 308 inline G4int DensityIndex(G4int idx) const; 309 inline G4double DensityFactor(G4int idx) con 310 311 private: 312 313 void PrintWarning(G4String tit, G4double val 314 315 void ComputeIntegralLambda(G4double kinEnerg 316 317 inline G4double LogEkin(const G4Track&); 318 319 inline G4double GetLambdaFromTable(G4double 320 321 inline G4double GetLambdaFromTable(G4double 322 323 inline G4double GetLambdaFromTablePrim(G4dou 324 325 inline G4double GetLambdaFromTablePrim(G4dou 326 327 inline G4double GetCurrentLambda(G4double ki 328 329 inline G4double GetCurrentLambda(G4double ki 330 331 inline G4double ComputeCurrentLambda(G4doubl 332 333 // ======== pointers ========= 334 335 G4EmModelManager* modelManager = 336 const G4ParticleDefinition* particle = null 337 const G4ParticleDefinition* currentParticle 338 const G4ParticleDefinition* theGamma = null 339 const G4ParticleDefinition* theElectron = n 340 const G4ParticleDefinition* thePositron = n 341 const G4ParticleDefinition* secondaryPartic 342 const G4VEmProcess* masterProc = nu 343 G4EmDataHandler* theData = nullp 344 G4VEmModel* currentModel = 345 G4LossTableManager* lManager = null 346 G4EmParameters* theParameters = 347 const G4Material* baseMaterial = 348 349 // ======== tables and vectors ======== 350 G4PhysicsTable* theLambdaTable 351 G4PhysicsTable* theLambdaTableP 352 353 const std::vector<G4double>* theCuts = nullp 354 const std::vector<G4double>* theCutsGamma = 355 const std::vector<G4double>* theCutsElectron 356 const std::vector<G4double>* theCutsPositron 357 358 protected: 359 360 // ======== pointers ========= 361 362 const G4MaterialCutsCouple* currentCouple = 363 const G4Material* currentMaterial 364 G4EmBiasingManager* biasManager = n 365 std::vector<G4double>* theEnergyOfCros 366 367 private: 368 369 const std::vector<G4double>* theDensityFacto 370 const std::vector<G4int>* theDensityIdx = nu 371 372 // ======== parameters ========= 373 G4double minKinEnergy; 374 G4double maxKinEnergy; 375 G4double minKinEnergyPrim = DBL_MAX; 376 G4double lambdaFactor = 0.8; 377 G4double invLambdaFactor; 378 G4double biasFactor = 1.0; 379 G4double massRatio = 1.0; 380 G4double fFactor = 1.0; 381 G4double fLambda = 0.0; 382 G4double fLambdaEnergy = 0.0; 383 384 protected: 385 386 G4double mfpKinEnergy = DBL_MAX; 387 G4double preStepKinEnergy = 0.0; 388 G4double preStepLambda = 0.0; 389 390 private: 391 392 G4CrossSectionType fXSType = fEmNoIntegral; 393 394 G4int numberOfModels = 0; 395 G4int nLambdaBins = 84; 396 397 protected: 398 399 G4int mainSecondaries = 1; 400 G4int secID = _EM; 401 G4int fluoID = _Fluorescence; 402 G4int augerID = _AugerElectron; 403 G4int biasID = _EM; 404 G4int tripletID = _TripletElectron; 405 std::size_t currentCoupleIndex = 0; 406 std::size_t basedCoupleIndex = 0; 407 std::size_t coupleIdxLambda = 0; 408 std::size_t idxLambda = 0; 409 410 G4bool isTheMaster = false; 411 G4bool baseMat = false; 412 413 private: 414 415 G4bool buildLambdaTable = true; 416 G4bool applyCuts = false; 417 G4bool startFromNull = false; 418 G4bool splineFlag = true; 419 G4bool actMinKinEnergy = false; 420 G4bool actMaxKinEnergy = false; 421 G4bool actBinning = false; 422 G4bool isIon = false; 423 G4bool biasFlag = false; 424 G4bool weightFlag = false; 425 426 protected: 427 428 // ======== particle change ========= 429 std::vector<G4DynamicParticle*> secParticles 430 G4ParticleChangeForGamma fParticleChange; 431 432 private: 433 434 // ======== local vectors ========= 435 std::vector<G4VEmModel*> emModels; 436 437 }; 438 439 // ======== Run time inline methods ========== 440 441 //....oooOO0OOooo........oooOO0OOooo........oo 442 443 inline std::size_t G4VEmProcess::CurrentMateri 444 { 445 return currentCoupleIndex; 446 } 447 448 //....oooOO0OOooo........oooOO0OOooo........oo 449 450 inline const G4MaterialCutsCouple* G4VEmProces 451 { 452 return currentCouple; 453 } 454 455 //....oooOO0OOooo........oooOO0OOooo........oo 456 457 inline G4double G4VEmProcess::GetGammaEnergyCu 458 { 459 return (*theCutsGamma)[currentCoupleIndex]; 460 } 461 462 //....oooOO0OOooo........oooOO0OOooo........oo 463 464 inline G4double G4VEmProcess::GetElectronEnerg 465 { 466 return (*theCutsElectron)[currentCoupleIndex 467 } 468 469 //....oooOO0OOooo........oooOO0OOooo........oo 470 471 inline void G4VEmProcess::DefineMaterial(const 472 { 473 if (couple != currentCouple) { 474 currentCouple = couple; 475 baseMaterial = currentMaterial = couple->G 476 basedCoupleIndex = currentCoupleIndex = co 477 fFactor = biasFactor; 478 mfpKinEnergy = DBL_MAX; 479 if (baseMat) { 480 basedCoupleIndex = (*theDensityIdx)[curr 481 if (nullptr != currentMaterial->GetBaseM 482 baseMaterial = currentMaterial->GetBas 483 fFactor *= (*theDensityFactor)[currentCo 484 } 485 } 486 } 487 488 //....oooOO0OOooo........oooOO0OOooo........oo 489 490 inline 491 G4VEmModel* G4VEmProcess::SelectModel(G4double 492 { 493 if(1 < numberOfModels) { 494 currentModel = modelManager->SelectModel(k 495 } 496 currentModel->SetCurrentCouple(currentCouple 497 return currentModel; 498 } 499 500 //....oooOO0OOooo........oooOO0OOooo........oo 501 502 inline 503 G4VEmModel* G4VEmProcess::SelectModelForMateri 504 505 { 506 return modelManager->SelectModel(kinEnergy, 507 } 508 509 //....oooOO0OOooo........oooOO0OOooo........oo 510 511 inline G4double G4VEmProcess::GetLambdaFromTab 512 { 513 return ((*theLambdaTable)[basedCoupleIndex]) 514 } 515 516 //....oooOO0OOooo........oooOO0OOooo........oo 517 518 inline G4double G4VEmProcess::LogEkin(const G4 519 { 520 return track.GetDynamicParticle()->GetLogKin 521 } 522 523 //....oooOO0OOooo........oooOO0OOooo........oo 524 525 inline G4double G4VEmProcess::GetLambdaFromTab 526 { 527 return ((*theLambdaTable)[basedCoupleIndex]) 528 } 529 530 //....oooOO0OOooo........oooOO0OOooo........oo 531 532 inline G4double G4VEmProcess::GetLambdaFromTab 533 { 534 return ((*theLambdaTablePrim)[basedCoupleInd 535 } 536 537 //....oooOO0OOooo........oooOO0OOooo........oo 538 539 inline G4double G4VEmProcess::GetLambdaFromTab 540 { 541 return ((*theLambdaTablePrim)[basedCoupleInd 542 } 543 544 //....oooOO0OOooo........oooOO0OOooo........oo 545 546 inline G4double G4VEmProcess::ComputeCurrentLa 547 { 548 return currentModel->CrossSectionPerVolume(b 549 } 550 551 //....oooOO0OOooo........oooOO0OOooo........oo 552 553 inline G4double G4VEmProcess::GetCurrentLambda 554 { 555 if(currentCoupleIndex != coupleIdxLambda || 556 coupleIdxLambda = currentCoupleIndex; 557 fLambdaEnergy = e; 558 if(e >= minKinEnergyPrim) { fLambda = GetL 559 else if(nullptr != theLambdaTable) { fLamb 560 else { fLambda = ComputeCurrentLambda(e); 561 fLambda *= fFactor; 562 } 563 return fLambda; 564 } 565 566 //....oooOO0OOooo........oooOO0OOooo........oo 567 568 inline G4double G4VEmProcess::GetCurrentLambda 569 { 570 if(currentCoupleIndex != coupleIdxLambda || 571 coupleIdxLambda = currentCoupleIndex; 572 fLambdaEnergy = e; 573 if(e >= minKinEnergyPrim) { fLambda = GetL 574 else if(nullptr != theLambdaTable) { fLamb 575 else { fLambda = ComputeCurrentLambda(e); 576 fLambda *= fFactor; 577 } 578 return fLambda; 579 } 580 581 //....oooOO0OOooo........oooOO0OOooo........oo 582 583 inline void 584 G4VEmProcess::CurrentSetup(const G4MaterialCut 585 { 586 DefineMaterial(couple); 587 SelectModel(energy*massRatio, currentCoupleI 588 } 589 590 //....oooOO0OOooo........oooOO0OOooo........oo 591 592 inline G4double 593 G4VEmProcess::GetLambda(G4double kinEnergy, co 594 G4double logKinEnergy) 595 { 596 CurrentSetup(couple, kinEnergy); 597 return GetCurrentLambda(kinEnergy, logKinEne 598 } 599 600 //....oooOO0OOooo........oooOO0OOooo........oo 601 602 G4double G4VEmProcess::MeanFreePath(const G4Tr 603 { 604 const G4double kinEnergy = track.GetKineticE 605 CurrentSetup(track.GetMaterialCutsCouple(), 606 const G4double xs = GetCurrentLambda(kinEner 607 track.GetDynamicP 608 return (0.0 < xs) ? 1.0/xs : DBL_MAX; 609 } 610 611 // ======== Get/Set inline methods used at ini 612 613 inline G4bool G4VEmProcess::ApplyCuts() const 614 { 615 return applyCuts; 616 } 617 618 //....oooOO0OOooo........oooOO0OOooo........oo 619 620 inline G4int G4VEmProcess::LambdaBinning() con 621 { 622 return nLambdaBins; 623 } 624 625 //....oooOO0OOooo........oooOO0OOooo........oo 626 627 inline G4double G4VEmProcess::MinKinEnergy() c 628 { 629 return minKinEnergy; 630 } 631 632 //....oooOO0OOooo........oooOO0OOooo........oo 633 634 inline G4double G4VEmProcess::MaxKinEnergy() c 635 { 636 return maxKinEnergy; 637 } 638 639 //....oooOO0OOooo........oooOO0OOooo........oo 640 641 inline G4double G4VEmProcess::CrossSectionBias 642 { 643 return biasFactor; 644 } 645 646 //....oooOO0OOooo........oooOO0OOooo........oo 647 648 inline G4PhysicsTable* G4VEmProcess::LambdaTab 649 { 650 return theLambdaTable; 651 } 652 653 //....oooOO0OOooo........oooOO0OOooo........oo 654 655 inline G4PhysicsTable* G4VEmProcess::LambdaTab 656 { 657 return theLambdaTablePrim; 658 } 659 660 //....oooOO0OOooo........oooOO0OOooo........oo 661 662 inline void G4VEmProcess::SetLambdaTable(G4Phy 663 { 664 theLambdaTable = ptr; 665 } 666 667 //....oooOO0OOooo........oooOO0OOooo........oo 668 669 inline void G4VEmProcess::SetLambdaTablePrim(G 670 { 671 theLambdaTablePrim = ptr; 672 } 673 674 //....oooOO0OOooo........oooOO0OOooo........oo 675 676 inline std::vector<G4double>* G4VEmProcess::En 677 { 678 return theEnergyOfCrossSectionMax; 679 } 680 681 //....oooOO0OOooo........oooOO0OOooo........oo 682 683 inline void 684 G4VEmProcess::SetEnergyOfCrossSectionMax(std:: 685 { 686 theEnergyOfCrossSectionMax = ptr; 687 } 688 689 //....oooOO0OOooo........oooOO0OOooo........oo 690 691 inline const G4ParticleDefinition* G4VEmProces 692 { 693 return particle; 694 } 695 696 //....oooOO0OOooo........oooOO0OOooo........oo 697 698 inline const G4ParticleDefinition* G4VEmProces 699 { 700 return secondaryParticle; 701 } 702 703 //....oooOO0OOooo........oooOO0OOooo........oo 704 705 inline void G4VEmProcess::SetCrossSectionType( 706 { 707 fXSType = val; 708 } 709 710 //....oooOO0OOooo........oooOO0OOooo........oo 711 712 inline G4CrossSectionType G4VEmProcess::CrossS 713 { 714 return fXSType; 715 } 716 717 //....oooOO0OOooo........oooOO0OOooo........oo 718 719 inline void G4VEmProcess::SetBuildTableFlag(G4 720 { 721 buildLambdaTable = val; 722 } 723 724 //....oooOO0OOooo........oooOO0OOooo........oo 725 726 inline G4ParticleChangeForGamma* G4VEmProcess: 727 { 728 return &fParticleChange; 729 } 730 731 //....oooOO0OOooo........oooOO0OOooo........oo 732 733 inline void G4VEmProcess::SetParticle(const G4 734 { 735 particle = p; 736 currentParticle = p; 737 } 738 739 //....oooOO0OOooo........oooOO0OOooo........oo 740 741 inline void G4VEmProcess::SetSecondaryParticle 742 { 743 secondaryParticle = p; 744 } 745 746 //....oooOO0OOooo........oooOO0OOooo........oo 747 748 inline void G4VEmProcess::SetStartFromNullFlag 749 { 750 startFromNull = val; 751 } 752 753 //....oooOO0OOooo........oooOO0OOooo........oo 754 755 inline void G4VEmProcess::SetSplineFlag(G4bool 756 { 757 splineFlag = val; 758 } 759 760 //....oooOO0OOooo........oooOO0OOooo........oo 761 762 inline G4int G4VEmProcess::DensityIndex(G4int 763 { 764 return (*theDensityIdx)[idx]; 765 } 766 767 //....oooOO0OOooo........oooOO0OOooo........oo 768 769 inline G4double G4VEmProcess::DensityFactor(G4 770 { 771 return (*theDensityFactor)[idx]; 772 } 773 774 //....oooOO0OOooo........oooOO0OOooo........oo 775 776 inline G4bool G4VEmProcess::UseBaseMaterial() 777 { 778 return baseMat; 779 } 780 781 //....oooOO0OOooo........oooOO0OOooo........oo 782 783 inline const G4VEmModel* G4VEmProcess::GetCurr 784 { 785 return currentModel; 786 } 787 788 //....oooOO0OOooo........oooOO0OOooo........oo 789 790 inline void G4VEmProcess::SetEmMasterProcess(c 791 { 792 masterProc = ptr; 793 } 794 795 //....oooOO0OOooo........oooOO0OOooo........oo 796 797 inline G4int G4VEmProcess::NumberOfModels() co 798 { 799 return numberOfModels; 800 } 801 802 //....oooOO0OOooo........oooOO0OOooo........oo 803 804 inline G4VEmModel* G4VEmProcess::EmModel(std:: 805 { 806 return (index < emModels.size()) ? emModels[ 807 } 808 809 //....oooOO0OOooo........oooOO0OOooo........oo 810 811 inline G4VEmModel* G4VEmProcess::GetModelByInd 812 { 813 return modelManager->GetModel(idx, ver); 814 } 815 816 //....oooOO0OOooo........oooOO0OOooo........oo 817 818 #endif 819