Import Geant4 11.0.0 source tree

This commit is contained in:
Gabriele Cosmo
2021-12-10 14:46:44 +01:00
committed by Ben Morgan
parent 6399a014b6
commit 80e2389dd8
3932 changed files with 202519 additions and 246221 deletions
@@ -13,6 +13,14 @@ introduced in the code and keeptrack of all tags.
* Reverse chronological order (last date on top), please *
----------------------------------------------------------
06-October-2020 Vladimir Ivanchenko (phys-ctor-decay-V10-07-03)
- G4RadioactiveDecayPhysics - Use SetAuger(..) method instead of
the obsolete SetAugerCascade(..)
25-August-2021 Dennis Wright (part of physics-lists-V10-07-02)
- G4RadioactiveDecayPhysics.cc: replace G4RadioactiveDecayBase with G4RadioactiveDecay
see top level History file
16-April-2021 Ben Morgan (phys-ctor-decay-V10-07-01)
- Migrate build to modular CMake API
@@ -1,14 +0,0 @@
-------------------------------------------------------------------
G4DecayPhysics
--------------
G4RadioactiveDecayPhysics
-------------------------
G4SpinDecayPhysics
------------------
G4UnknownDecayPhysics
---------------------
@@ -28,7 +28,7 @@
#include "G4RadioactiveDecayPhysics.hh"
#include "G4RadioactiveDecayBase.hh"
#include "G4RadioactiveDecay.hh"
#include "G4GenericIon.hh"
#include "globals.hh"
#include "G4PhysicsListHelper.hh"
@@ -80,7 +80,7 @@ void G4RadioactiveDecayPhysics::ConstructProcess()
{
// EM physics extra configuration
// this physics constructor should be defined after EM constructor
G4EmParameters::Instance()->SetAugerCascade(true);
G4EmParameters::Instance()->SetAuger(true);
G4EmParameters::Instance()->SetDeexcitationIgnoreCut(true);
G4LossTableManager* man = G4LossTableManager::Instance();
@@ -94,7 +94,7 @@ void G4RadioactiveDecayPhysics::ConstructProcess()
}
G4PhysicsListHelper::GetPhysicsListHelper()->
RegisterProcess(new G4RadioactiveDecayBase(), G4GenericIon::GenericIon());
RegisterProcess(new G4RadioactiveDecay(), G4GenericIon::GenericIon());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -13,6 +13,40 @@ introduced in the code and keeptrack of all tags.
* Reverse chronological order (last date on top), please *
----------------------------------------------------------
12 November 2021, V.Ivanchenko (phys-ctor-em-V10-07-23)
- G4EmStandardPhysicsWVI - making this experimantal configuration
compatible for CPU performance with Opt3 (it was similar to SS)
10 November 2021, V.Ivanchenko (phys-ctor-em-V10-07-22)
- G4EmStandardPhysicsWVI - use similar options as in Opt3, for ions
use G4LinhardSorensenIonModel
- G4EmModelActivator - updated according to the current Opt3 and Opt4
configurations
29 October 2021, M. Novak (phys-ctor-em-V10-07-21)
- G4GammaGeneralProcess - make some methods/fields visible for
derived classes
25 October 2021, V.Ivanchenko (phys-ctor-em-V10-07-20)
- G4EmBuilder - complete addition of hyper-nuclei EM physics
- in all DNA Physics List use SetAuger() instead of SetAugerCascade()
22 October 2021, V.Ivanchenko (phys-ctor-em-V10-07-19)
- G4EmBuilder - added hyper-nuclei EM physics
12 October 2021, V.Ivanchenko (phys-ctor-em-V10-07-18)
- G4EmBuilder - removed obsolete header
27 September 2021, V.Ivanchenko (phys-ctor-em-V10-07-17)
- G4EmBuilder - use more optimal order of instantiation of processes,
should not affect any result but useful for debugging
30 August 2021, D.Sawkey (phys-ctor-em-V10-07-16)
- G4OpticalPhysics - apply clang-format style guidelines
11 July 2021, V.Ivanchenko (phys-ctor-em-V10-07-15)
- G4GammaGeneralProcess - use base material approach
14 June 2021, V.Ivanchenko (phys-ctor-em-V10-07-14)
- G4EmLivermorePhysics, G4EmPenelopePhysics_option1,
G4EmStandardPhysics_option3, G4EmStandardPhysics_option4,
@@ -31,15 +65,15 @@ introduced in the code and keeptrack of all tags.
- G4EmDNAPhysics - updated configuration of standard physics for
gamma and positrons according to Opt3; updated particle list by
addition of G4Alpha; simplified ConstructProcess() method using
G4PhysicsListHelper
G4PhysicsListHelper
22 May 2021, V.Ivanchenko (phys-ctor-em-V10-07-11)
- Updated all standard Physics Lists: removed local member "verbose"
and use uniform approach for verbosity via G4EmParameters;
instantiate NIEL process only if parameter MaxNIELEnergy is above
zero; include gamma linear polarization model to Opt0, Opt3, Opt4,
SS, and Livermore physics constructors if the parameter
EnablePolarisation="true"; G4EmLivermorePolarizedPhysics fully
SS, and Livermore physics constructors if the parameter
EnablePolarisation="true"; G4EmLivermorePolarizedPhysics fully
inherit from G4EmLivermorePhysics
24 April 2021, V.Ivanchenko (phys-ctor-em-V10-07-10)
@@ -1,91 +0,0 @@
-------------------------------------------------------------------
G4EmDNAChemistry
----------------
G4EmDNAPhysics
--------------
G4EmDNAPhysicsActivator
-----------------------
G4EmDNAPhysics_option1
----------------------
G4EmDNAPhysics_option2
----------------------
G4EmDNAPhysics_option3
----------------------
G4EmDNAPhysics_option4
----------------------
G4EmDNAPhysics_option5
----------------------
G4EmDNAPhysics_option7
----------------------
G4EmLEPTSPhysics
----------------
G4EmLivermorePhysics
--------------------
see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml
G4EmLivermorePolarizedPhysics
-----------------------------
see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml
G4EmLowEPPhysics
----------------
G4EmModelActivator
------------------
G4EmPenelopePhysics
-------------------
see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml
G4EmStandardPhysics
-------------------
see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml
G4EmStandardPhysicsGS
---------------------
see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml
G4EmStandardPhysicsSS
---------------------
see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml
G4EmStandardPhysicsWVI
----------------------
see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml
G4EmStandardPhysics_option1
---------------------------
see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml
G4EmStandardPhysics_option2
---------------------------
see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml
G4EmStandardPhysics_option3
---------------------------
see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml
G4EmStandardPhysics_option4
---------------------------
see https://geant4.web.cern.ch/geant4/collaboration/working_groups/electromagnetic/physlist.shtml
G4OpticalPhysics
----------------
G4OpticalPhysicsMessenger
-------------------------
G4OpticalProcessIndex
---------------------
@@ -65,7 +65,7 @@ class G4GammaGeneralProcess : public G4VEmProcess
{
public:
explicit G4GammaGeneralProcess();
explicit G4GammaGeneralProcess(const G4String& pname="GammaGeneralProc");
~G4GammaGeneralProcess() override;
@@ -93,7 +93,7 @@ public:
// Called before tracking of each new G4Track
void StartTracking(G4Track*) override;
// implementation of virtual method, specific for G4GammaGeneralProcess
G4double PostStepGetPhysicalInteractionLength(
const G4Track& track,
@@ -102,7 +102,7 @@ public:
// implementation of virtual method, specific for G4GammaGeneralProcess
G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&) override;
// Store PhysicsTable in a file.
// Return false in case of failure at I/O
G4bool StorePhysicsTable(const G4ParticleDefinition*,
@@ -148,12 +148,12 @@ protected:
void SelectHadProcess(const G4Track&, const G4Step&, G4HadronicProcess*);
private:
// It returns the cross section per volume for energy/ material
G4double TotalCrossSectionPerVolume();
G4bool RetrieveTable(G4VEmProcess*, const G4String& directory,
private:
G4bool RetrieveTable(G4VEmProcess*, const G4String& directory,
G4bool ascii);
protected:
@@ -161,6 +161,10 @@ protected:
G4HadronicProcess* theGammaNuclear = nullptr;
G4VProcess* selectedProc = nullptr;
G4double preStepLogE = 1.0;
G4double factor = 1.0;
private:
static G4EmDataHandler* theHandler;
static const size_t nTables = 15;
@@ -177,8 +181,6 @@ private:
G4double minEEEnergy;
G4double minMMEnergy;
G4double peLambda = 0.0;
G4double preStepLogE = 1.0;
G4double factor = 1.0;
size_t nLowE = 40;
size_t nHighE = 50;
@@ -187,7 +189,7 @@ private:
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double
G4GammaGeneralProcess::ComputeGeneralLambda(size_t idxe, size_t idxt)
{
@@ -206,7 +208,7 @@ inline G4double G4GammaGeneralProcess::GetProbability(size_t idxt)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void
inline void
G4GammaGeneralProcess::SelectedProcess(const G4Step& step, G4VProcess* ptr)
{
selectedProc = ptr;
@@ -49,27 +49,23 @@
class G4OpticalPhysics : public G4VPhysicsConstructor
{
public:
public:
G4OpticalPhysics(G4int verbose = 0, const G4String& name = "Optical");
~G4OpticalPhysics() override;
void PrintStatistics() const;
G4OpticalPhysics(G4int verbose = 0, const G4String& name = "Optical");
~G4OpticalPhysics() override;
void PrintStatistics() const;
G4OpticalPhysics(const G4OpticalPhysics& right) = delete;
G4OpticalPhysics& operator=(const G4OpticalPhysics& right) = delete;
G4OpticalPhysics(const G4OpticalPhysics& right) = delete;
G4OpticalPhysics& operator=(const G4OpticalPhysics& right) = delete;
protected:
// construct particle and physics
void ConstructParticle() override;
void ConstructProcess() override;
private:
void PrintWarning(G4ExceptionDescription&) const;
protected:
// construct particle and physics
void ConstructParticle() override;
void ConstructProcess() override;
private:
void PrintWarning(G4ExceptionDescription&) const;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif // G4OpticalPhysics_h
#endif // G4OpticalPhysics_h
@@ -54,7 +54,6 @@
#include "G4hIonisation.hh"
#include "G4ionIonisation.hh"
#include "G4alphaIonisation.hh"
#include "G4NuclearStopping.hh"
#include "G4MuMultipleScattering.hh"
@@ -117,14 +116,14 @@ void G4EmBuilder::ConstructIonEmPhysics(G4hMultipleScattering* hmsc,
ph->RegisterProcess(hmsc, part);
ph->RegisterProcess(new G4hIonisation(), part);
part = G4He3::He3();
part = G4Alpha::Alpha();
ph->RegisterProcess(new G4hMultipleScattering(), part);
ph->RegisterProcess(new G4ionIonisation(), part);
if( nucStopping != nullptr ) {
ph->RegisterProcess(nucStopping, part);
}
part = G4Alpha::Alpha();
part = G4He3::He3();
ph->RegisterProcess(new G4hMultipleScattering(), part);
ph->RegisterProcess(new G4ionIonisation(), part);
if( nucStopping != nullptr ) {
@@ -144,11 +143,11 @@ void G4EmBuilder::ConstructIonEmPhysicsSS()
ph->RegisterProcess(new G4hIonisation(), part);
ph->RegisterProcess(new G4CoulombScattering(), part);
part = G4He3::He3();
part = G4Alpha::Alpha();
ph->RegisterProcess(new G4ionIonisation(), part);
ph->RegisterProcess(new G4CoulombScattering(), part);
part = G4Alpha::Alpha();
part = G4He3::He3();
ph->RegisterProcess(new G4ionIonisation(), part);
ph->RegisterProcess(new G4CoulombScattering(), part);
}
@@ -160,15 +159,16 @@ void G4EmBuilder::ConstructLightHadrons(G4ParticleDefinition* part1,
{
G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
G4hBremsstrahlung* brem = ( isHEP ) ? new G4hBremsstrahlung() : nullptr;
G4hPairProduction* pair = ( isHEP ) ? new G4hPairProduction() : nullptr;
G4hMultipleScattering* msc = new G4hMultipleScattering();
if(isWVI) { msc->SetEmModel(new G4WentzelVIModel()); }
G4CoulombScattering* ss = ( isWVI ) ? new G4CoulombScattering() : nullptr;
ph->RegisterProcess(msc, part1);
ph->RegisterProcess(new G4hIonisation(), part1);
G4hBremsstrahlung* brem = ( isHEP ) ? new G4hBremsstrahlung() : nullptr;
G4hPairProduction* pair = ( isHEP ) ? new G4hPairProduction() : nullptr;
if( isHEP ) {
ph->RegisterProcess(brem, part1);
ph->RegisterProcess(pair, part1);
@@ -197,10 +197,11 @@ void G4EmBuilder::ConstructLightHadronsSS(G4ParticleDefinition* part1,
{
G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
ph->RegisterProcess(new G4hIonisation(), part1);
G4hBremsstrahlung* brem = ( isHEP ) ? new G4hBremsstrahlung() : nullptr;
G4hPairProduction* pair = ( isHEP ) ? new G4hPairProduction() : nullptr;
ph->RegisterProcess(new G4hIonisation(), part1);
if( isHEP ) {
ph->RegisterProcess(brem, part1);
ph->RegisterProcess(pair, part1);
@@ -224,10 +225,6 @@ void G4EmBuilder::ConstructCharged(G4hMultipleScattering* hmsc,
G4HadronicParameters* hpar = G4HadronicParameters::Instance();
G4bool isHEP = ( param->MaxKinEnergy() > hpar->EnergyThresholdForHeavyHadrons() );
// muon bremsstrahlung and pair production
G4MuBremsstrahlung* mub = ( isHEP ) ? new G4MuBremsstrahlung() : nullptr;
G4MuPairProduction* mup = ( isHEP ) ? new G4MuPairProduction() : nullptr;
// muon multiple and single scattering
G4MuMultipleScattering* mumsc = new G4MuMultipleScattering();
if(isWVI) { mumsc->SetEmModel(new G4WentzelVIModel()); }
@@ -238,6 +235,11 @@ void G4EmBuilder::ConstructCharged(G4hMultipleScattering* hmsc,
G4ParticleDefinition* part = G4MuonPlus::MuonPlus();
ph->RegisterProcess(mumsc, part);
ph->RegisterProcess(new G4MuIonisation(), part);
// muon bremsstrahlung and pair production
G4MuBremsstrahlung* mub = ( isHEP ) ? new G4MuBremsstrahlung() : nullptr;
G4MuPairProduction* mup = ( isHEP ) ? new G4MuPairProduction() : nullptr;
if( isHEP ) {
ph->RegisterProcess(mub, part);
ph->RegisterProcess(mup, part);
@@ -276,6 +278,10 @@ void G4EmBuilder::ConstructCharged(G4hMultipleScattering* hmsc,
if( hpar->EnableBCParticles() ) {
ConstructBasicEmPhysics(hmsc, G4HadParticles::GetBCChargedHadrons());
}
// light hyper-nuclei
if( hpar->EnableHyperNuclei() ) {
ConstructBasicEmPhysics(hmsc, G4HadParticles::GetChargedHyperNuclei());
}
}
}
@@ -286,10 +292,6 @@ void G4EmBuilder::ConstructChargedSS(G4hMultipleScattering* hmsc)
G4HadronicParameters* hpar = G4HadronicParameters::Instance();
G4bool isHEP = ( param->MaxKinEnergy() > hpar->EnergyThresholdForHeavyHadrons() );
// muon bremsstrahlung and pair production
G4MuBremsstrahlung* mub = ( isHEP ) ? new G4MuBremsstrahlung() : nullptr;
G4MuPairProduction* mup = ( isHEP ) ? new G4MuPairProduction() : nullptr;
// muon multiple and single scattering
G4CoulombScattering* muss = new G4CoulombScattering();
@@ -297,6 +299,11 @@ void G4EmBuilder::ConstructChargedSS(G4hMultipleScattering* hmsc)
// mu+-
G4ParticleDefinition* part = G4MuonPlus::MuonPlus();
ph->RegisterProcess(new G4MuIonisation(), part);
// muon bremsstrahlung and pair production
G4MuBremsstrahlung* mub = ( isHEP ) ? new G4MuBremsstrahlung() : nullptr;
G4MuPairProduction* mup = ( isHEP ) ? new G4MuPairProduction() : nullptr;
if( isHEP ) {
ph->RegisterProcess(mub, part);
ph->RegisterProcess(mup, part);
@@ -330,6 +337,10 @@ void G4EmBuilder::ConstructChargedSS(G4hMultipleScattering* hmsc)
if( hpar->EnableBCParticles() ) {
ConstructBasicEmPhysics(hmsc, G4HadParticles::GetBCChargedHadrons());
}
// light hyper-nuclei
if( hpar->EnableHyperNuclei() ) {
ConstructBasicEmPhysics(hmsc, G4HadParticles::GetChargedHyperNuclei());
}
}
}
@@ -93,7 +93,6 @@ G4EmDNAPhysics_option1::G4EmDNAPhysics_option1(G4int ver, const G4String&)
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
param->ActivateDNA();
@@ -94,7 +94,6 @@ G4EmDNAPhysics_option2::G4EmDNAPhysics_option2(G4int ver, const G4String&)
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
param->ActivateDNA();
@@ -92,7 +92,6 @@ G4EmDNAPhysics_option3::G4EmDNAPhysics_option3(G4int ver, const G4String&)
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
param->ActivateDNA();
@@ -98,7 +98,6 @@ G4EmDNAPhysics_option4::G4EmDNAPhysics_option4(G4int ver, const G4String&)
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
param->ActivateDNA();
@@ -98,7 +98,6 @@ G4EmDNAPhysics_option5::G4EmDNAPhysics_option5(G4int ver, const G4String&) :
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
param->ActivateDNA();
@@ -110,7 +110,6 @@ G4EmDNAPhysics_option6::G4EmDNAPhysics_option6(G4int ver, const G4String&)
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
param->ActivateDNA();
@@ -98,7 +98,6 @@ G4EmDNAPhysics_option7::G4EmDNAPhysics_option7(G4int ver, const G4String&) :
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
param->ActivateDNA();
@@ -94,7 +94,6 @@ G4EmDNAPhysics_option8::G4EmDNAPhysics_option8(G4int ver, const G4String&)
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
param->ActivateDNA();
@@ -90,7 +90,6 @@ G4EmDNAPhysics_stationary_option2::G4EmDNAPhysics_stationary_option2(G4int ver)
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
param->ActivateDNA();
@@ -101,17 +100,8 @@ G4EmDNAPhysics_stationary_option2::G4EmDNAPhysics_stationary_option2(G4int ver)
G4EmDNAPhysics_stationary_option2::G4EmDNAPhysics_stationary_option2(G4int ver,
const G4String&)
: G4VPhysicsConstructor("G4EmDNAPhysics_stationary_option2"), verbose(ver)
{
G4EmParameters* param = G4EmParameters::Instance();
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
SetPhysicsType(bElectromagnetic);
}
: G4EmDNAPhysics_stationary_option2(ver)
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -92,7 +92,6 @@ G4EmDNAPhysics_stationary_option4::G4EmDNAPhysics_stationary_option4(G4int ver)
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
param->ActivateDNA();
@@ -103,17 +102,8 @@ G4EmDNAPhysics_stationary_option4::G4EmDNAPhysics_stationary_option4(G4int ver)
G4EmDNAPhysics_stationary_option4::G4EmDNAPhysics_stationary_option4(G4int ver,
const G4String&)
: G4VPhysicsConstructor("G4EmDNAPhysics_stationary_option4"), verbose(ver)
{
G4EmParameters* param = G4EmParameters::Instance();
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
SetPhysicsType(bElectromagnetic);
}
: G4EmDNAPhysics_stationary_option4(ver)
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -93,7 +93,6 @@ G4EmDNAPhysics_stationary_option6::G4EmDNAPhysics_stationary_option6(G4int ver)
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
param->ActivateDNA();
@@ -104,17 +103,8 @@ G4EmDNAPhysics_stationary_option6::G4EmDNAPhysics_stationary_option6(G4int ver)
G4EmDNAPhysics_stationary_option6::G4EmDNAPhysics_stationary_option6(G4int ver,
const G4String&)
: G4VPhysicsConstructor("G4EmDNAPhysics_stationary_option6"), verbose(ver)
{
G4EmParameters* param = G4EmParameters::Instance();
param->SetDefaults();
param->SetFluo(true);
param->SetAuger(true);
param->SetAugerCascade(true);
param->SetDeexcitationIgnoreCut(true);
SetPhysicsType(bElectromagnetic);
}
: G4EmDNAPhysics_stationary_option6(ver)
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -96,6 +96,7 @@
#include "G4UrbanMscModel.hh"
#include "G4GoudsmitSaundersonMscModel.hh"
#include "G4LowEPComptonModel.hh"
#include "G4BetheHeitler5DModel.hh"
#include "G4LivermorePhotoElectricModel.hh"
#include "G4LivermoreComptonModel.hh"
@@ -250,12 +251,17 @@ void G4EmModelActivator::ActivateEmOptions()
FindOrAddProcess(phot, "Rayl");
mod = new G4LivermoreRayleighModel();
em_config->SetExtraEmModel("gamma", "Rayl", mod, reg);
FindOrAddProcess(phot, "phot");
mod = new G4LivermorePhotoElectricModel();
FindOrAddProcess(phot, "compt");
mod = new G4KleinNishinaModel();
em_config->SetExtraEmModel("gamma", "compt", mod, reg);
mod = new G4LowEPComptonModel();
mod->SetHighEnergyLimit(20*MeV);
em_config->SetExtraEmModel("gamma", "compt", mod, reg);
FindOrAddProcess(phot, "conv");
mod = new G4BetheHeitler5DModel();
em_config->SetExtraEmModel("gamma", "conv", mod, reg);
} else if("G4EmStandardGS" == typesPhys[i]) {
G4GoudsmitSaundersonMscModel* msc = new G4GoudsmitSaundersonMscModel();
@@ -31,11 +31,7 @@
// Author: V.Ivanchenko 09.11.2005
//
// Modified:
// 05.12.2005 V.Ivanchenko add controlled verbosity
// 13.11.2006 V.Ivanchenko use G4hMultipleScattering
// 23.11.2006 V.Ivanchenko remove mscStepLimit option and improve cout
// 13.02.2007 V.Ivanchenko use G4hMultipleScattering for muons
// 13.02.2007 V.Ivanchenko set skin=0.0
//
// 21.04.2008 V.Ivanchenko add long-lived D and B mesons
//
//----------------------------------------------------------------------------
@@ -60,7 +56,9 @@
#include "G4CoulombScattering.hh"
#include "G4WentzelVIModel.hh"
#include "G4WentzelVIRelModel.hh"
#include "G4UrbanMscModel.hh"
#include "G4hCoulombScatteringModel.hh"
#include "G4eCoulombScatteringModel.hh"
#include "G4eIonisation.hh"
#include "G4eBremsstrahlung.hh"
@@ -69,9 +67,11 @@
#include "G4hIonisation.hh"
#include "G4ionIonisation.hh"
#include "G4BetheHeitler5DModel.hh"
#include "G4AtimaEnergyLossModel.hh"
#include "G4AtimaFluctuations.hh"
#include "G4IonParametrisedLossModel.hh"
#include "G4LindhardSorensenIonModel.hh"
#include "G4BraggIonModel.hh"
#include "G4NuclearStopping.hh"
#include "G4eplusTo2GammaOKVIModel.hh"
@@ -99,7 +99,7 @@ G4EmStandardPhysicsWVI::G4EmStandardPhysicsWVI(G4int ver)
param->SetDefaults();
param->SetVerbose(ver);
param->SetMinEnergy(10*CLHEP::eV);
param->SetLowestElectronEnergy(10*CLHEP::eV);
param->SetLowestElectronEnergy(100*CLHEP::eV);
param->SetNumberOfBinsPerDecade(20);
param->ActivateAngularGeneratorForIonisation(true);
param->SetStepFunction(0.2, 100*CLHEP::um);
@@ -108,8 +108,10 @@ G4EmStandardPhysicsWVI::G4EmStandardPhysicsWVI(G4int ver)
param->SetStepFunctionIons(0.1, 1*CLHEP::um);
param->SetUseMottCorrection(true);
param->SetMuHadLateralDisplacement(true);
param->SetUseICRU90Data(true);
param->SetMscThetaLimit(0.15);
param->SetFluo(true);
param->SetMaxNIELEnergy(1*CLHEP::MeV);
SetPhysicsType(bElectromagnetic);
}
@@ -135,10 +137,21 @@ void G4EmStandardPhysicsWVI::ConstructProcess()
}
G4EmBuilder::PrepareEMPhysics();
G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
G4EmParameters* param = G4EmParameters::Instance();
// common processes
G4hMultipleScattering* hmsc = new G4hMultipleScattering("ionmsc");
G4NuclearStopping* pnuc(nullptr);
// nuclear stopping is enabled if th eenergy limit above zero
G4double nielEnergyLimit = param->MaxNIELEnergy();
G4NuclearStopping* pnuc = nullptr;
if(nielEnergyLimit > 0.0) {
pnuc = new G4NuclearStopping();
pnuc->SetMaxKinEnergy(nielEnergyLimit);
}
// high energy limit for e+- scattering models
G4double highEnergyLimit = 1*CLHEP::MeV;
// Add gamma EM processes
G4ParticleDefinition* particle = G4Gamma::Gamma();
@@ -149,17 +162,33 @@ void G4EmStandardPhysicsWVI::ConstructProcess()
G4ComptonScattering* cs = new G4ComptonScattering;
cs->SetEmModel(new G4KleinNishinaModel());
G4GammaConversion* gc = new G4GammaConversion();
if(param->EnablePolarisation()) {
gc->SetEmModel(new G4BetheHeitler5DModel());
}
ph->RegisterProcess(pee, particle);
ph->RegisterProcess(cs, particle);
ph->RegisterProcess(new G4GammaConversion(), particle);
ph->RegisterProcess(gc, particle);
ph->RegisterProcess(new G4RayleighScattering(), particle);
// e-
particle = G4Electron::Electron();
G4eMultipleScattering* msc = new G4eMultipleScattering;
msc->SetEmModel(new G4WentzelVIModel());
G4UrbanMscModel* msc1 = new G4UrbanMscModel();
G4WentzelVIModel* msc2 = new G4WentzelVIModel();
msc1->SetHighEnergyLimit(highEnergyLimit);
msc2->SetLowEnergyLimit(highEnergyLimit);
msc->SetEmModel(msc1);
msc->SetEmModel(msc2);
G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel();
G4CoulombScattering* ss = new G4CoulombScattering();
ss->SetEmModel(ssm);
ss->SetMinKinEnergy(highEnergyLimit);
ssm->SetLowEnergyLimit(highEnergyLimit);
ssm->SetActivationLowEnergyLimit(highEnergyLimit);
ph->RegisterProcess(msc, particle);
ph->RegisterProcess(new G4eIonisation(), particle);
@@ -170,8 +199,19 @@ void G4EmStandardPhysicsWVI::ConstructProcess()
particle = G4Positron::Positron();
msc = new G4eMultipleScattering;
msc->SetEmModel(new G4WentzelVIModel());
msc1 = new G4UrbanMscModel();
msc2 = new G4WentzelVIModel();
msc1->SetHighEnergyLimit(highEnergyLimit);
msc2->SetLowEnergyLimit(highEnergyLimit);
msc->SetEmModel(msc1);
msc->SetEmModel(msc2);
ssm = new G4eCoulombScatteringModel();
ss = new G4CoulombScattering();
ss->SetEmModel(ssm);
ss->SetMinKinEnergy(highEnergyLimit);
ssm->SetLowEnergyLimit(highEnergyLimit);
ssm->SetActivationLowEnergyLimit(highEnergyLimit);
G4eplusAnnihilation* ann = new G4eplusAnnihilation();
ann->SetEmModel(new G4eplusTo2GammaOKVIModel());
@@ -185,11 +225,10 @@ void G4EmStandardPhysicsWVI::ConstructProcess()
// generic ion
particle = G4GenericIon::GenericIon();
G4ionIonisation* ionIoni = new G4ionIonisation();
ionIoni->SetEmModel(new G4BraggIonModel(),0);
ionIoni->SetEmModel(new G4AtimaEnergyLossModel(),1);
ionIoni->SetFluctModel(new G4AtimaFluctuations());
ionIoni->SetEmModel(new G4LindhardSorensenIonModel());
ph->RegisterProcess(hmsc, particle);
ph->RegisterProcess(ionIoni, particle);
if(nullptr != pnuc) { ph->RegisterProcess(pnuc, particle); }
// muons, hadrons, ions
G4EmBuilder::ConstructCharged(hmsc, pnuc);
@@ -76,15 +76,15 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4EmDataHandler* G4GammaGeneralProcess::theHandler = nullptr;
G4bool G4GammaGeneralProcess::theT[nTables] =
G4bool G4GammaGeneralProcess::theT[nTables] =
{true,false,true,true,true,false,true,true,true,
true,true,true,true,true,true};
G4String G4GammaGeneralProcess::nameT[nTables] =
G4String G4GammaGeneralProcess::nameT[nTables] =
{"0","1","2","3","4","5","6","7","8",
"9","10","11","12","13","14"};
G4GammaGeneralProcess::G4GammaGeneralProcess():
G4VEmProcess("GammaGeneralProc", fElectromagnetic),
G4GammaGeneralProcess::G4GammaGeneralProcess(const G4String& pname):
G4VEmProcess(pname, fElectromagnetic),
minPEEnergy(150*CLHEP::keV),
minEEEnergy(2*CLHEP::electron_mass_c2),
minMMEnergy(100*CLHEP::MeV)
@@ -148,11 +148,14 @@ void G4GammaGeneralProcess::PreparePhysicsTable(const G4ParticleDefinition& part
G4EmParameters* param = G4EmParameters::Instance();
G4LossTableManager* man = G4LossTableManager::Instance();
isTheMaster = man->IsMaster();
isTheMaster = man->IsMaster();
if(isTheMaster) { SetVerboseLevel(param->Verbose()); }
else { SetVerboseLevel(param->WorkerVerbose()); }
G4LossTableBuilder* bld = man->GetTableBuilder();
baseMat = bld->GetBaseMaterialFlag();
if(1 < verboseLevel) {
G4cout << "G4GammaGeneralProcess::PreparePhysicsTable() for "
<< GetProcessName()
@@ -165,8 +168,8 @@ void G4GammaGeneralProcess::PreparePhysicsTable(const G4ParticleDefinition& part
theConversionEE == nullptr) {
G4ExceptionDescription ed;
ed << "### G4GeneralGammaProcess is initialized incorrectly"
<< "\n Photoelectric: " << thePhotoElectric
<< "\n Compton: " << theCompton
<< "\n Photoelectric: " << thePhotoElectric
<< "\n Compton: " << theCompton
<< "\n Conversion: " << theConversionEE;
G4Exception("G4GeneralGammaProcess","em0004",
FatalException, ed,"");
@@ -186,15 +189,15 @@ void G4GammaGeneralProcess::PreparePhysicsTable(const G4ParticleDefinition& part
void G4GammaGeneralProcess::InitialiseProcess(const G4ParticleDefinition*)
{
if(isTheMaster) {
if(isTheMaster) {
G4EmParameters* param = G4EmParameters::Instance();
G4LossTableManager* man = G4LossTableManager::Instance();
// tables are created and its size is defined only once
if(nullptr == theHandler) {
theHandler = new G4EmDataHandler(nTables);
if(theRayleigh) { theT[1] = true; }
if(nullptr == theHandler) {
theHandler = new G4EmDataHandler(nTables);
if(theRayleigh) { theT[1] = true; }
theHandler->SetMasterProcess(thePhotoElectric);
theHandler->SetMasterProcess(theCompton);
@@ -202,7 +205,7 @@ void G4GammaGeneralProcess::InitialiseProcess(const G4ParticleDefinition*)
theHandler->SetMasterProcess(theRayleigh);
}
auto bld = man->GetTableBuilder();
const G4ProductionCutsTable* theCoupleTable=
G4ProductionCutsTable::GetProductionCutsTable();
size_t numOfCouples = theCoupleTable->GetTableSize();
@@ -219,22 +222,22 @@ void G4GammaGeneralProcess::InitialiseProcess(const G4ParticleDefinition*)
G4PhysicsLogVector cVector(minEEEnergy,minMMEnergy,nHighE,splineFlag);
G4PhysicsLogVector dVector(minMMEnergy,maxe,nbin2,splineFlag);
for(size_t i=0; i<nTables; ++i) {
for(size_t i=0; i<nTables; ++i) {
if(!theT[i]) { continue; }
//G4cout << "## PreparePhysTable " << i << "." << G4endl;
G4PhysicsTable* table = theHandler->MakeTable(i);
G4PhysicsTable* table = theHandler->MakeTable(i);
//G4cout << " make table " << table << G4endl;
for(size_t j=0; j<numOfCouples; ++j) {
vec = (*table)[j];
if (bld->GetFlag(j) && nullptr == vec) {
//G4cout <<" i= "<<i<<" j= "<< j <<" make new vector"<< G4endl;
if(i<=1) {
if(i<=1) {
vec = new G4PhysicsVector(aVector);
} else if(i<=5) {
vec = new G4PhysicsVector(bVector);
} else if(i<=9) {
vec = new G4PhysicsVector(cVector);
} else {
} else {
vec = new G4PhysicsVector(dVector);
}
G4PhysicsTableHelper::SetPhysicsVector(table, j, vec);
@@ -254,26 +257,27 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part)
<< " and particle " << part.GetParticleName()
<< G4endl;
}
if(!isTheMaster) {
thePhotoElectric->SetEmMasterProcess(theHandler->GetMasterProcess(0));
if(!isTheMaster) {
thePhotoElectric->SetEmMasterProcess(theHandler->GetMasterProcess(0));
baseMat = theHandler->GetMasterProcess(0)->UseBaseMaterial();
}
thePhotoElectric->BuildPhysicsTable(part);
thePhotoElectric->BuildPhysicsTable(part);
if(!isTheMaster) {
theCompton->SetEmMasterProcess(theHandler->GetMasterProcess(1));
if(!isTheMaster) {
theCompton->SetEmMasterProcess(theHandler->GetMasterProcess(1));
}
theCompton->BuildPhysicsTable(part);
if(!isTheMaster) {
theConversionEE->SetEmMasterProcess(theHandler->GetMasterProcess(2));
theCompton->BuildPhysicsTable(part);
if(!isTheMaster) {
theConversionEE->SetEmMasterProcess(theHandler->GetMasterProcess(2));
}
theConversionEE->BuildPhysicsTable(part);
if(theRayleigh != nullptr) {
if(!isTheMaster) {
theRayleigh->SetEmMasterProcess(theHandler->GetMasterProcess(3));
theConversionEE->BuildPhysicsTable(part);
if(theRayleigh != nullptr) {
if(!isTheMaster) {
theRayleigh->SetEmMasterProcess(theHandler->GetMasterProcess(3));
}
theRayleigh->BuildPhysicsTable(part);
theRayleigh->BuildPhysicsTable(part);
}
if(theGammaNuclear != nullptr) { theGammaNuclear->BuildPhysicsTable(part); }
if(theConversionMM != nullptr) { theConversionMM->BuildPhysicsTable(part); }
@@ -286,9 +290,9 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part)
G4LossTableBuilder* bld = G4LossTableManager::Instance()->GetTableBuilder();
const std::vector<G4PhysicsTable*>& tables = theHandler->GetTables();
G4CrossSectionDataStore* gn = (nullptr != theGammaNuclear)
G4CrossSectionDataStore* gn = (nullptr != theGammaNuclear)
? theGammaNuclear->GetCrossSectionDataStore() : nullptr;
G4DynamicParticle* dynParticle =
G4DynamicParticle* dynParticle =
new G4DynamicParticle(G4Gamma::Gamma(),G4ThreeVector(1,0,0),1.0);
G4double sigComp(0.), sigPE(0.), sigConv(0.), sigR(0.),
@@ -298,53 +302,53 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part)
if (bld->GetFlag(i)) {
G4int idx = (*theDensityIdx)[i];
const G4MaterialCutsCouple* couple =
G4int idx = (!baseMat) ? i : DensityIndex(i);
const G4MaterialCutsCouple* couple =
theCoupleTable->GetMaterialCutsCouple(i);
const G4Material* material = couple->GetMaterial();
// energy interval 0
size_t nn = (*(tables[0]))[idx]->GetVectorLength();
if(1 < verboseLevel) {
G4cout << "======= Zone 0 ======= N= " << nn
<< " for " << material->GetName() << G4endl;
if(1 < verboseLevel) {
G4cout << "======= Zone 0 ======= N= " << nn
<< " for " << material->GetName() << G4endl;
}
for(size_t j=0; j<nn; ++j) {
G4double e = (*(tables[0]))[idx]->Energy(j);
G4double loge = G4Log(e);
sigComp = theCompton->GetLambda(e, couple, loge);
sigR = (nullptr != theRayleigh) ?
sigR = (nullptr != theRayleigh) ?
theRayleigh->GetLambda(e, couple, loge) : 0.0;
G4double sum = sigComp + sigR;
if(1 < verboseLevel) {
G4cout << j << ". E= " << e << " xs= " << sum
<< " compt= " << sigComp << " Rayl= " << sigR << G4endl;
G4cout << j << ". E= " << e << " xs= " << sum
<< " compt= " << sigComp << " Rayl= " << sigR << G4endl;
}
(*(tables[0]))[idx]->PutValue(j, sum);
if(theT[1]) {
val = sigR/sum;
(*(tables[1]))[idx]->PutValue(j, val);
}
}
}
// energy interval 1
nn = (*(tables[2]))[idx]->GetVectorLength();
if(1 < verboseLevel) {
G4cout << "======= Zone 1 ======= N= " << nn << G4endl;
G4cout << "======= Zone 1 ======= N= " << nn << G4endl;
}
for(size_t j=0; j<nn; ++j) {
G4double e = (*(tables[2]))[idx]->Energy(j);
G4double loge = G4Log(e);
sigComp = theCompton->GetLambda(e, couple, loge);
sigR = (nullptr != theRayleigh) ?
sigR = (nullptr != theRayleigh) ?
theRayleigh->GetLambda(e, couple, loge) : 0.0;
sigPE = thePhotoElectric->GetLambda(e, couple, loge);
G4double sum = sigComp + sigR + sigPE;
if(1 < verboseLevel) {
G4cout << j << ". E= " << e << " xs= " << sum
<< " compt= " << sigComp << " conv= " << sigConv
G4cout << j << ". E= " << e << " xs= " << sum
<< " compt= " << sigComp << " conv= " << sigConv
<< " PE= " << sigPE << " Rayl= " << sigR
<< " GN= " << sigN << G4endl;
<< " GN= " << sigN << G4endl;
}
(*(tables[2]))[idx]->PutValue(j, sum);
@@ -358,7 +362,7 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part)
// energy interval 2
nn = (*(tables[6]))[idx]->GetVectorLength();
if(1 < verboseLevel) {
G4cout << "======= Zone 2 ======= N= " << nn << G4endl;
G4cout << "======= Zone 2 ======= N= " << nn << G4endl;
}
for(size_t j=0; j<nn; ++j) {
G4double e = (*(tables[6]))[idx]->Energy(j);
@@ -373,11 +377,11 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part)
}
G4double sum = sigComp + sigConv + sigPE + sigN;
if(1 < verboseLevel) {
G4cout << j << ". E= " << e << " xs= " << sum
<< " compt= " << sigComp << " conv= " << sigConv
G4cout << j << ". E= " << e << " xs= " << sum
<< " compt= " << sigComp << " conv= " << sigConv
<< " PE= " << sigPE
<< " GN= " << sigN << G4endl;
}
}
(*(tables[6]))[idx]->PutValue(j, sum);
val = sigConv/sum;
@@ -387,14 +391,14 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part)
(*(tables[8]))[idx]->PutValue(j, val);
val = (sigN > 0.0) ? (sigConv + sigComp + sigPE)/sum : 1.0;
(*(tables[9]))[idx]->PutValue(j, val);
(*(tables[9]))[idx]->PutValue(j, val);
}
// energy interval 3
nn = (*(tables[10]))[idx]->GetVectorLength();
if(1 < verboseLevel) {
G4cout << "======= Zone 3 ======= N= " << nn
<< " for " << material->GetName() << G4endl;
G4cout << "======= Zone 3 ======= N= " << nn
<< " for " << material->GetName() << G4endl;
}
for(size_t j=0; j<nn; ++j) {
G4double e = (*(tables[10]))[idx]->Energy(j);
@@ -414,11 +418,11 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part)
}
G4double sum = sigComp + sigConv + sigPE + sigN + sigM;
if(1 < verboseLevel) {
G4cout << j << ". E= " << e << " xs= " << sum
<< " compt= " << sigComp << " conv= " << sigConv
G4cout << j << ". E= " << e << " xs= " << sum
<< " compt= " << sigComp << " conv= " << sigConv
<< " PE= " << sigPE
<< " GN= " << sigN << G4endl;
}
}
(*(tables[10]))[idx]->PutValue(j, sum);
val = (sigComp + sigPE + sigN + sigM)/sum;
@@ -429,14 +433,14 @@ void G4GammaGeneralProcess::BuildPhysicsTable(const G4ParticleDefinition& part)
val = (sigN + sigM)/sum;
(*(tables[13]))[idx]->PutValue(j, val);
val = sigN/sum;
(*(tables[14]))[idx]->PutValue(j, val);
}
for(size_t k=0; k<nTables; ++k) {
if(splineFlag) {
(*(tables[k]))[idx]->FillSecondDerivatives();
}
if(splineFlag) {
(*(tables[k]))[idx]->FillSecondDerivatives();
}
}
}
}
@@ -475,10 +479,13 @@ G4double G4GammaGeneralProcess::PostStepGetPhysicalInteractionLength(
G4bool recompute = false;
if(couple != currentCouple) {
currentCouple = couple;
currentCoupleIndex = couple->GetIndex();
basedCoupleIndex = (*theDensityIdx)[currentCoupleIndex];
factor = (*theDensityFactor)[currentCoupleIndex];
basedCoupleIndex = currentCoupleIndex = couple->GetIndex();
currentMaterial = couple->GetMaterial();
factor = 1.0;
if(baseMat) {
basedCoupleIndex = DensityIndex(currentCoupleIndex);
factor = DensityFactor(currentCoupleIndex);
}
recompute = true;
}
if(energy != preStepKinEnergy) {
@@ -490,26 +497,26 @@ G4double G4GammaGeneralProcess::PostStepGetPhysicalInteractionLength(
preStepLambda = TotalCrossSectionPerVolume();
// zero cross section
if(preStepLambda <= 0.0) {
if(preStepLambda <= 0.0) {
theNumberOfInteractionLengthLeft = -1.0;
currentInteractionLength = DBL_MAX;
}
}
// non-zero cross section
if(preStepLambda > 0.0) {
if(preStepLambda > 0.0) {
if (theNumberOfInteractionLengthLeft < 0.0) {
// beggining of tracking (or just after DoIt of this process)
theNumberOfInteractionLengthLeft = -G4Log( G4UniformRand() );
theInitialNumberOfInteractionLength = theNumberOfInteractionLengthLeft;
theInitialNumberOfInteractionLength = theNumberOfInteractionLengthLeft;
} else if(currentInteractionLength < DBL_MAX) {
theNumberOfInteractionLengthLeft -=
theNumberOfInteractionLengthLeft -=
previousStepSize/currentInteractionLength;
theNumberOfInteractionLengthLeft =
theNumberOfInteractionLengthLeft =
std::max(theNumberOfInteractionLengthLeft, 0.0);
}
@@ -518,8 +525,8 @@ G4double G4GammaGeneralProcess::PostStepGetPhysicalInteractionLength(
x = theNumberOfInteractionLengthLeft * currentInteractionLength;
}
/*
G4cout << "PostStepGetPhysicalInteractionLength: e= " << energy
<< " idxe= " << idxEnergy << " xs= " << preStepLambda
G4cout << "PostStepGetPhysicalInteractionLength: e= " << energy
<< " idxe= " << idxEnergy << " xs= " << preStepLambda
<< " x= " << x << G4endl;
*/
return x;
@@ -531,18 +538,18 @@ G4double G4GammaGeneralProcess::TotalCrossSectionPerVolume()
{
G4double cross = 0.0;
/*
G4cout << "#Total: " << preStepKinEnergy << " " << minPEEnergy << " "
G4cout << "#Total: " << preStepKinEnergy << " " << minPEEnergy << " "
<< minEEEnergy << " " << minMMEnergy<< G4endl;
G4cout << " idxE= " << idxEnergy
G4cout << " idxE= " << idxEnergy
<< " idxC= " << currentCoupleIndex << G4endl;
*/
if(preStepKinEnergy < minPEEnergy) {
cross = ComputeGeneralLambda(0, 0);
//G4cout << "XS1: " << cross << G4endl;
peLambda = thePhotoElectric->GetLambda(preStepKinEnergy, currentCouple, preStepLogE);
cross += peLambda;
cross += peLambda;
//G4cout << "XS2: " << cross << G4endl;
} else if(preStepKinEnergy < minEEEnergy) {
cross = ComputeGeneralLambda(1, 2);
//G4cout << "XS3: " << cross << G4endl;
@@ -555,9 +562,9 @@ G4double G4GammaGeneralProcess::TotalCrossSectionPerVolume()
cross = ComputeGeneralLambda(3, 10);
//G4cout << "XS5: " << cross << G4endl;
}
/*
G4cout << "xs= " << cross << " idxE= " << idxEnergy
<< " idxC= " << currentCoupleIndex
/*
G4cout << "xs= " << cross << " idxE= " << idxEnergy
<< " idxC= " << currentCoupleIndex
<< " E= " << energy << G4endl;
*/
return cross;
@@ -573,13 +580,13 @@ G4VParticleChange* G4GammaGeneralProcess::PostStepDoIt(const G4Track& track,
selectedProc = nullptr;
G4double q = G4UniformRand();
/*
G4cout << "PostStep: preStepLambda= " << preStepLambda
<< " PE= " << peLambda << " q= " << q << " idxE= " << idxEnergy
G4cout << "PostStep: preStepLambda= " << preStepLambda
<< " PE= " << peLambda << " q= " << q << " idxE= " << idxEnergy
<< G4endl;
*/
switch (idxEnergy) {
case 0:
if(preStepLambda*q <= peLambda) {
if(preStepLambda*q <= peLambda) {
SelectEmProcess(step, thePhotoElectric);
} else {
if(theT[1] && preStepLambda*q < preStepLambda*GetProbability(1) + peLambda) {
@@ -600,7 +607,7 @@ G4VParticleChange* G4GammaGeneralProcess::PostStepDoIt(const G4Track& track,
}
break;
case 2:
case 2:
if(q <= GetProbability(7)) {
SelectEmProcess(step, theConversionEE);
} else if(q <= GetProbability(8)) {
@@ -612,7 +619,7 @@ G4VParticleChange* G4GammaGeneralProcess::PostStepDoIt(const G4Track& track,
}
break;
case 3:
case 3:
if(q + GetProbability(11) <= 1.0) {
SelectEmProcess(step, theConversionEE);
} else if(q + GetProbability(12) <= 1.0) {
@@ -627,8 +634,8 @@ G4VParticleChange* G4GammaGeneralProcess::PostStepDoIt(const G4Track& track,
break;
}
// sample secondaries
if(selectedProc != nullptr) {
return selectedProc->PostStepDoIt(track, step);
if(selectedProc != nullptr) {
return selectedProc->PostStepDoIt(track, step);
}
// no interaction - exception case
fParticleChange.InitializeForPostStep(track);
@@ -653,7 +660,7 @@ G4bool G4GammaGeneralProcess::StorePhysicsTable(const G4ParticleDefinition* part
{
G4bool yes = true;
if(!isTheMaster) { return yes; }
if(!thePhotoElectric->StorePhysicsTable(part, directory, ascii))
if(!thePhotoElectric->StorePhysicsTable(part, directory, ascii))
{ yes = false; }
if(!theCompton->StorePhysicsTable(part, directory, ascii))
{ yes = false; }
@@ -665,7 +672,7 @@ G4bool G4GammaGeneralProcess::StorePhysicsTable(const G4ParticleDefinition* part
for(size_t i=0; i<nTables; ++i) {
if(theT[i]) {
G4String nam = (0==i || 2==i || 6==i || 10==i)
G4String nam = (0==i || 2==i || 6==i || 10==i)
? "LambdaGeneral" + nameT[i] : "ProbGeneral" + nameT[i];
G4String fnam = GetPhysicsTableFileName(part,directory,nam,ascii);
if(!theHandler->StorePhysicsTable(i, part, fnam, ascii)) { yes = false; }
@@ -676,7 +683,7 @@ G4bool G4GammaGeneralProcess::StorePhysicsTable(const G4ParticleDefinition* part
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
G4bool
G4bool
G4GammaGeneralProcess::RetrievePhysicsTable(const G4ParticleDefinition* part,
const G4String& directory,
G4bool ascii)
@@ -687,7 +694,7 @@ G4GammaGeneralProcess::RetrievePhysicsTable(const G4ParticleDefinition* part,
<< GetProcessName() << G4endl;
}
G4bool yes = true;
if(!thePhotoElectric->RetrievePhysicsTable(part, directory, ascii))
if(!thePhotoElectric->RetrievePhysicsTable(part, directory, ascii))
{ yes = false; }
if(!theCompton->RetrievePhysicsTable(part, directory, ascii))
{ yes = false; }
@@ -699,10 +706,10 @@ G4GammaGeneralProcess::RetrievePhysicsTable(const G4ParticleDefinition* part,
for(size_t i=0; i<nTables; ++i) {
if(theT[i]) {
G4String nam = (0==i || 2==i || 6==i || 10==i)
G4String nam = (0==i || 2==i || 6==i || 10==i)
? "LambdaGeneral" + nameT[i] : "ProbGeneral" + nameT[i];
G4String fnam = GetPhysicsTableFileName(part,directory,nam,ascii);
if(!theHandler->RetrievePhysicsTable(i, part, fnam, ascii, splineFlag))
if(!theHandler->RetrievePhysicsTable(i, part, fnam, ascii, splineFlag))
{ yes = false; }
}
}
@@ -726,7 +733,7 @@ G4double G4GammaGeneralProcess::GetMeanFreePath(const G4Track& track,
void G4GammaGeneralProcess::ProcessDescription(std::ostream& out) const
{
thePhotoElectric->ProcessDescription(out);
theCompton->ProcessDescription(out);
theCompton->ProcessDescription(out);
theConversionEE->ProcessDescription(out);
if(theRayleigh) { theRayleigh->ProcessDescription(out); }
if(theGammaNuclear) { theGammaNuclear->ProcessDescription(out); }
@@ -737,7 +744,7 @@ void G4GammaGeneralProcess::ProcessDescription(std::ostream& out) const
const G4String& G4GammaGeneralProcess::GetSubProcessName() const
{
return (selectedProc) ? selectedProc->GetProcessName()
return (selectedProc) ? selectedProc->GetProcessName()
: G4VProcess::GetProcessName();
}
@@ -745,8 +752,8 @@ const G4String& G4GammaGeneralProcess::GetSubProcessName() const
G4int G4GammaGeneralProcess::GetSubProcessSubType() const
{
return (selectedProc) ? selectedProc->GetProcessSubType()
: fGammaGeneralProcess;
return (selectedProc) ? selectedProc->GetProcessSubType()
: fGammaGeneralProcess;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
@@ -37,22 +37,20 @@
//
#include "G4OpticalPhysics.hh"
#include "G4OpticalParameters.hh"
#include "G4Cerenkov.hh"
#include "G4EmSaturation.hh"
#include "G4LossTableManager.hh"
#include "G4OpAbsorption.hh"
#include "G4OpBoundaryProcess.hh"
#include "G4OpRayleigh.hh"
#include "G4OpMieHG.hh"
#include "G4OpBoundaryProcess.hh"
#include "G4OpticalParameters.hh"
#include "G4OpWLS.hh"
#include "G4OpWLS2.hh"
#include "G4Scintillation.hh"
#include "G4Cerenkov.hh"
#include "G4LossTableManager.hh"
#include "G4EmSaturation.hh"
#include "G4ParticleDefinition.hh"
#include "G4ProcessManager.hh"
#include "G4Scintillation.hh"
// factory
#include "G4PhysicsConstructorFactory.hh"
@@ -67,8 +65,7 @@ G4OpticalPhysics::G4OpticalPhysics(G4int verbose, const G4String& name)
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4OpticalPhysics::~G4OpticalPhysics()
{}
G4OpticalPhysics::~G4OpticalPhysics() {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4OpticalPhysics::PrintStatistics() const
@@ -85,79 +82,93 @@ void G4OpticalPhysics::ConstructParticle()
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4OpticalPhysics::ConstructProcess()
{
if(verboseLevel>0)
G4cout <<"G4OpticalPhysics:: Add Optical Physics Processes"<< G4endl;
if(verboseLevel > 0)
G4cout << "G4OpticalPhysics:: Add Optical Physics Processes" << G4endl;
auto params = G4OpticalParameters::Instance();
// Add Optical Processes
G4ProcessManager* pManager = G4OpticalPhoton::OpticalPhoton()->GetProcessManager();
if (!pManager) {
G4ExceptionDescription ed;
ed << "Optical Photon without a Process Manager";
G4Exception("G4OpticalPhysics::ConstructProcess()","",
FatalException,ed);
return;
G4ProcessManager* pManager =
G4OpticalPhoton::OpticalPhoton()->GetProcessManager();
if(!pManager)
{
G4ExceptionDescription ed;
ed << "Optical Photon without a Process Manager";
G4Exception("G4OpticalPhysics::ConstructProcess()", "", FatalException, ed);
return;
}
G4OpAbsorption* absorption = new G4OpAbsorption();
if (params->GetProcessActivation("OpAbsorption")) pManager->AddDiscreteProcess(absorption);
G4OpAbsorption* absorption = new G4OpAbsorption();
if(params->GetProcessActivation("OpAbsorption"))
pManager->AddDiscreteProcess(absorption);
G4OpRayleigh* rayleigh = new G4OpRayleigh();
if (params->GetProcessActivation("OpRayleigh")) pManager->AddDiscreteProcess(rayleigh);
if(params->GetProcessActivation("OpRayleigh"))
pManager->AddDiscreteProcess(rayleigh);
G4OpMieHG* mie = new G4OpMieHG();
if (params->GetProcessActivation("OpMieHG")) pManager->AddDiscreteProcess(mie);
if(params->GetProcessActivation("OpMieHG"))
pManager->AddDiscreteProcess(mie);
G4OpBoundaryProcess* boundary = new G4OpBoundaryProcess();
if (params->GetProcessActivation("OpBoundary")) pManager->AddDiscreteProcess(boundary);
if(params->GetProcessActivation("OpBoundary"))
pManager->AddDiscreteProcess(boundary);
G4OpWLS* wls = new G4OpWLS();
if (params->GetProcessActivation("OpWLS")) pManager->AddDiscreteProcess(wls);
if(params->GetProcessActivation("OpWLS"))
pManager->AddDiscreteProcess(wls);
G4OpWLS2* wls2 = new G4OpWLS2();
if (params->GetProcessActivation("OpWLS2")) pManager->AddDiscreteProcess(wls2);
if(params->GetProcessActivation("OpWLS2"))
pManager->AddDiscreteProcess(wls2);
G4Scintillation* scint = new G4Scintillation();
G4Scintillation* scint = new G4Scintillation();
G4EmSaturation* emSaturation = G4LossTableManager::Instance()->EmSaturation();
scint->AddSaturation(emSaturation);
G4Cerenkov* cerenkov = new G4Cerenkov();
auto myParticleIterator=GetParticleIterator();
auto myParticleIterator = GetParticleIterator();
myParticleIterator->reset();
while( (*myParticleIterator)() ){
while((*myParticleIterator)())
{
G4ParticleDefinition* particle = myParticleIterator->value();
G4String particleName = particle->GetParticleName();
G4String particleName = particle->GetParticleName();
pManager = particle->GetProcessManager();
if (!pManager) {
G4ExceptionDescription ed;
ed << "Particle " << particleName << "without a Process Manager";
G4Exception("G4OpticalPhysics::ConstructProcess()","",
FatalException, ed);
return; // else coverity complains for pManager use below
if(!pManager)
{
G4ExceptionDescription ed;
ed << "Particle " << particleName << "without a Process Manager";
G4Exception("G4OpticalPhysics::ConstructProcess()", "", FatalException,
ed);
return; // else coverity complains for pManager use below
}
if (cerenkov->IsApplicable(*particle) && params->GetProcessActivation("Cerenkov")) {
pManager->AddProcess(cerenkov);
pManager->SetProcessOrdering(cerenkov,idxPostStep);
if(cerenkov->IsApplicable(*particle) &&
params->GetProcessActivation("Cerenkov"))
{
pManager->AddProcess(cerenkov);
pManager->SetProcessOrdering(cerenkov, idxPostStep);
}
if (scint->IsApplicable(*particle) && params->GetProcessActivation("Scintillation")) {
pManager->AddProcess(scint);
pManager->SetProcessOrderingToLast(scint,idxAtRest);
pManager->SetProcessOrderingToLast(scint,idxPostStep);
if(scint->IsApplicable(*particle) &&
params->GetProcessActivation("Scintillation"))
{
pManager->AddProcess(scint);
pManager->SetProcessOrderingToLast(scint, idxAtRest);
pManager->SetProcessOrderingToLast(scint, idxPostStep);
}
if (boundary->IsApplicable(*particle) && params->GetProcessActivation("OpBoundary")) {
pManager->SetProcessOrderingToLast(boundary,idxPostStep);
if(boundary->IsApplicable(*particle) &&
params->GetProcessActivation("OpBoundary"))
{
pManager->SetProcessOrderingToLast(boundary, idxPostStep);
}
}
if (verboseLevel > 1) PrintStatistics();
if (verboseLevel > 0)
if(verboseLevel > 1)
PrintStatistics();
if(verboseLevel > 0)
G4cout << "### " << namePhysics << " physics constructed." << G4endl;
}
@@ -1,9 +0,0 @@
-------------------------------------------------------------------
G4PhysicsConstructorFactory
---------------------------
G4PhysicsConstructorRegistry
----------------------------
@@ -13,6 +13,22 @@ introduced in the code and keeptrack of all tags.
* Reverse chronological order (last date on top), please *
----------------------------------------------------------
10 November 2021 Vladimir Ivanchenko (phys-ctor-glnuclear-V10-07-06)
- G4EmExtraPhysics - added an option for positron annihilation to tau pair
20 August 2021 Vladimir Ivanchenko (phys-ctor-glnuclear-V10-07-05)
- G4EmExtraPhysics - enable synkrotron radiation only for really stable
particles
16 August 2021 Jonas Hahnfeld (phys-ctor-glnuclear-V10-07-04)
- G4EmExtraPhysics - fix typo to register positron-nuclear process,
register model for e-/e+-nuclear in case of general processes,
avoid registering synchroton radiation twice for e-/e+
13 August 2021 Vladimir Ivanchenko (phys-ctor-glnuclear-V10-07-03)
- G4EmExtraPhysics - enable updated G4GammaNuclearXS by default
for more detailed tests
16 April 2021 Ben Morgan (phys-ctor-glnuclear-V10-07-02)
- Migrate build to modular CMake API
@@ -1,48 +0,0 @@
-------------------------------------------------------------------
G4BertiniElectroNuclearBuilder
------------------------------
It includes gamma-nuclear, electron-nuclear and positron-nuclear
processes.
For gamma-nuclear, it uses Bertini (BERT) model for gamma below 6 GeV,
and Quark-Gluon-String (QGS) model above 3 GeV.
For electron-nuclear and positron-nuclear, it uses the equivalent photon
approximation in which the incoming lepton generates a virtual photon,
and then the virtual photon is converted to a real photon. This real
photon is handled by BERT if its energy is below 10 GeV; if it is above
10 GeV, then the real photon is transformed into a (on-shell) pi0 and
then handled by Fritiof (FTF) string model.
G4EmExtraPhysics
----------------
It uses G4BertiniElectroNuclearBuilder for gamma-nuclear, electron-nuclear
and positron-nuclear.
Moreover, it includes muon-nuclear process (for mu- and mu+), and
synchrotron process (either for electron & positron, or for all
charged particles).
The muon-nuclear process is treated similarly as for electrons and
positrons (i.e. the equivalent photon approximation in which the incoming
lepton generates a virtual photon, and then the virtual photon is converted
to a real photon, which is handled by BERT below 10 GeV or by FTF as a pi0
above 10 GeV).
By default, gamma-nuclear, electron-nuclear, positron-nuclear, and
muon-nuclear are switched on, whereas synchrotron process is switched off
for all particles. It is however possible, at run time via macro commands,
to change this default (see G4EmMessenger below).
G4EmMessenger
-------------
Used by G4EmExtraPhysics to be able to switch on/off:
- synchrotron radiation for electron and positron
(note: electron and positron together, not individually)
- synchrotron radiation for all charged particles
(note: all charged particles together, not individually)
- gamma-nuclear, electron-nuclear and positron-nuclear
(note: all these three particles together, not individually)
- muon-nuclear
(note: mu- and mu+ together, not individually)
at run time, via macro commands.
@@ -61,6 +61,12 @@
#include "G4AntiNeutrinoTau.hh"
#include "G4NeutrinoTau.hh"
#include "G4Proton.hh"
#include "G4AntiProton.hh"
#include "G4PionPlus.hh"
#include "G4PionMinus.hh"
#include "G4GenericIon.hh"
#include "G4SynchrotronRadiation.hh"
#include "G4MuonNuclearProcess.hh"
#include "G4MuonVDNuclearModel.hh"
@@ -113,6 +119,7 @@
#include "G4HadronicParameters.hh"
#include "G4PhysicsListHelper.hh"
#include "G4BuilderType.hh"
#include "G4CrossSectionDataSetRegistry.hh"
// factory
#include "G4PhysicsConstructorFactory.hh"
@@ -134,7 +141,7 @@ G4EmExtraPhysics::G4EmExtraPhysics(G4int ver):
phadActivated (false),
fNuActivated (false),
fNuETotXscActivated (false),
fUseGammaNuclearXS(false),
fUseGammaNuclearXS(true),
gmumuFactor (1.0),
pmumuFactor (1.0),
phadFactor (1.0),
@@ -314,8 +321,8 @@ void G4EmExtraPhysics::ConstructProcess()
G4GammaConversionToMuons* theGammaToMuMu = new G4GammaConversionToMuons();
theGammaToMuMu->SetCrossSecFactor(gmumuFactor);
G4GammaGeneralProcess* sp =
(G4GammaGeneralProcess*)emManager->GetGammaGeneralProcess();
if(sp) {
static_cast<G4GammaGeneralProcess*>(emManager->GetGammaGeneralProcess());
if(nullptr != sp) {
sp->AddMMProcess(theGammaToMuMu);
} else {
ph->RegisterProcess(theGammaToMuMu, gamma);
@@ -325,6 +332,9 @@ void G4EmExtraPhysics::ConstructProcess()
G4AnnihiToMuPair* thePosiToMuMu = new G4AnnihiToMuPair();
thePosiToMuMu->SetCrossSecFactor(pmumuFactor);
ph->RegisterProcess(thePosiToMuMu, positron);
G4AnnihiToMuPair* thePosiToTauTau = new G4AnnihiToMuPair("AnnihiToTauPair");
thePosiToTauTau->SetCrossSecFactor(pmumuFactor);
ph->RegisterProcess(thePosiToTauTau, positron);
}
if(phadActivated) {
G4eeToHadrons* thePosiToHadrons = new G4eeToHadrons();
@@ -336,20 +346,14 @@ void G4EmExtraPhysics::ConstructProcess()
ph->RegisterProcess( theSynchRad, electron);
ph->RegisterProcess( theSynchRad, positron);
if(synActivatedForAll) {
auto myParticleIterator=GetParticleIterator();
myParticleIterator->reset();
G4ParticleDefinition* particle = nullptr;
ph->RegisterProcess( theSynchRad, muonplus);
ph->RegisterProcess( theSynchRad, muonminus);
while( (*myParticleIterator)() ) {
particle = myParticleIterator->value();
if( particle->GetPDGStable() && particle->GetPDGCharge() != 0.0) {
if(verbose > 1) {
G4cout << "### G4SynchrotronRadiation for "
<< particle->GetParticleName() << G4endl;
}
ph->RegisterProcess( theSynchRad, particle);
}
}
ph->RegisterProcess( theSynchRad, G4Proton::Proton());
ph->RegisterProcess( theSynchRad, G4AntiProton::AntiProton());
ph->RegisterProcess( theSynchRad, G4PionPlus::PionPlus());
ph->RegisterProcess( theSynchRad, G4PionMinus::PionMinus());
ph->RegisterProcess( theSynchRad, G4GenericIon::GenericIon());
}
}
if( fNuActivated )
@@ -444,11 +448,17 @@ void G4EmExtraPhysics::ConstructGammaElectroNuclear()
G4LossTableManager* emManager = G4LossTableManager::Instance();
G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
G4HadronInelasticProcess* gnuc = new G4HadronInelasticProcess( "photonNuclear", G4Gamma::Definition() );
gnuc->AddDataSet( new G4PhotoNuclearCrossSection );
G4HadronInelasticProcess* gnuc = new G4HadronInelasticProcess( "photonNuclear", G4Gamma::Gamma() );
auto xsreg = G4CrossSectionDataSetRegistry::Instance();
G4VCrossSectionDataSet* xs = nullptr;
if(fUseGammaNuclearXS) {
gnuc->AddDataSet(new G4GammaNuclearXS());
xs = xsreg->GetCrossSectionDataSet("GammaNuclearXS");
if(nullptr == xs) xs = new G4GammaNuclearXS();
} else {
xs = xsreg->GetCrossSectionDataSet("PhotoNuclearXS");
if(nullptr == xs) xs = new G4PhotoNuclearCrossSection();
}
gnuc->AddDataSet(xs);
G4QGSModel< G4GammaParticipants >* theStringModel =
new G4QGSModel< G4GammaParticipants >;
@@ -495,12 +505,14 @@ void G4EmExtraPhysics::ConstructGammaElectroNuclear()
G4PositronNuclearProcess* pnuc = new G4PositronNuclearProcess;
G4ElectroVDNuclearModel* eModel = new G4ElectroVDNuclearModel;
enuc->RegisterMe(eModel);
pnuc->RegisterMe(eModel);
G4GammaGeneralProcess* eproc =
(G4GammaGeneralProcess*)emManager->GetElectronGeneralProcess();
if(eproc != nullptr) {
eproc->AddHadProcess(enuc);
} else {
enuc->RegisterMe(eModel);
ph->RegisterProcess(enuc, G4Electron::Electron());
}
@@ -509,8 +521,7 @@ void G4EmExtraPhysics::ConstructGammaElectroNuclear()
if(pproc != nullptr) {
pproc->AddHadProcess(pnuc);
} else {
pnuc->RegisterMe(eModel);
ph->RegisterProcess(enuc, G4Positron::Positron());
ph->RegisterProcess(pnuc, G4Positron::Positron());
}
}
}
@@ -1,104 +0,0 @@
-------------------------------------------------------------------
G4HadronElasticPhysics
----------------------
Hadron nuclear elastic process for all hadrons:
- proton
- cross section: Barashenkov-Glauber-Gribov
- final-state: Chips
- neutron:
- cross section: G4NeutronElasticXS
- final-state: Chips
- charged pions:
- cross section: Barashenkov-Glauber-Gribov
- final-state: Starkov's model (G4ElasticHadrNucleusHE) for all energies
- kaons, hyperons, anti-hyperons, charm and bottom hadrons
- cross section: Glauber-Gribov
- final-state: Gheisha
- deuteron, triton, He3, alpha
- cross section: Glauber-Gribov
- final-state: Gheisha
- anti_proton, anti_neutron, anti_deuteron, anti_triton, anti_He3,
anti_alpha
- cross-section: Galoyan-Uzhinsky-Glauber-Gribov
- final-state: Galoyan-Uzhinsky model above 100 MeV/nucleon,
Gheisha below.
G4HadronElasticPhysicsHP
------------------------
As G4HadronElasticPhysics, with the only difference that for neutrons
below 20 MeV, NeutronHP elastic is used (for both cross section and
final-state model).
G4HadronElasticPhysicsLEND
--------------------------
As G4HadronElasticPhysics, with the only difference that for neutrons
below 20 MeV, LEND elastic is used (for both cross section and
final-state model).
G4HadronElasticPhysicsXS
------------------------
Now exactly as G4HadronElasticPhysics.
G4HadronHElasticPhysics
-----------------------
- proton
- cross section: Barashenkov-Glauber-Gribov
- final-state: Diffuse model, except for Hydrogen where Chips is used,
above 10 MeV, and Gheisha below
- neutron:
- cross section: G4NeutronElasticXS
- final-state: Diffuse model, except for Hydrogen where Chips is used,
above 10 MeV, and Gheisha below
- charged pions:
- cross section: Barashenkov-Glauber-Gribov
- final-state: Diffuse model, except for Hydrogen where Chips is used,
above 10 MeV, and Gheisha below
- kaons, hyperons, anti-hyperons, charm and bottom hadrons
- cross section: Glauber-Gribov
- final-state: Gheisha
- deuteron, triton, He3, alpha
- cross section: Glauber-Gribov
- final-state: Gheisha
- anti_proton, anti_neutron
- cross section: Galoyan-Uzhinsky-Glauber-Gribov
- final-state: Galoyan-Uzhinsky model above 100 MeV/nucleon,
Chips below.
- anti_deuteron, anti_triton, anti_He3, anti_alpha
- cross-section: Galoyan-Uzhinsky-Glauber-Gribov
- final-state: Galoyan-Uzhinsky model above 100 MeV/nucleon,
Gheisha below.
G4IonElasticPhysics
-------------------
As G4HadronElasticPhysics, with the addition of elastic process for
generic ion:
- cross section: Glauber-Gribov
- final-state: Diffuse model
G4HadronDElasticPhysics
-----------------------
Hadron nuclear elastic process for all hadrons:
- proton and charged pions:
- cross section: Barashenkov-Glauber-Gribov
- final-state: Diffuse model where applicable, else Gheisha
- neutron:
- cross section: G4NeutronElasticXS
- final-state: Diffuse model where applicable, else Gheisha
- kaons, hyperons, anti-hyperons, charm and bottom hadrons,
deuteron, triton, He3, alpha
- cross section: Glauber-Gribov
- final-state: Gheisha
- anti_proton, anti_neutron, anti_deuteron, anti_triton, anti_He3,
anti_alpha
- cross-section: Galoyan-Uzhinsky-Glauber-Gribov
- final-state: Galoyan-Uzhinsky model above 100 MeV/nucleon,
Gheisha below.
G4ChargeExchangePhysics
-----------------------
Hadron nuclear coherent charge exchange, used in this constructor
only for nucleons and charged pions.
@@ -1,282 +0,0 @@
-------------------------------------------------------------------
G4HadronInelasticQBBC
---------------------
Hadron nuclear inelastic processes for all hadrons:
- proton inelastic:
- cross section: G4ParticleInelasticXS
- final-state: Fritiof coupled with Precompound/de-excitation (FTFP) above 3 GeV;
Bertini (BERT) between 1 and 6 GeV;
Binary coupled with Precompound/de-excitation (BIC) below 1.5 GeV
- neutron inelastic:
- cross section: G4NeutronInelasticXS
- final-state: FTFP > 3 GeV; 1 GeV < BERT < 6 GeV; BIC < 1.5 GeV
neutron capture:
- cross section: G4NeutronCaptureXS
- final-state: G4NeutronRadCapture
- charged pions inelastic:
- cross section: Barashenkov-Glauber-Gribov
- final-state: FTFP > 3 GeV; 1 GeV < BERT < 12 GeV; BIC < 1.5 GeV
- kaons inelastic:
- cross section: Glauber-Gribov
- final-state: FTFP > 3 GeV; BERT < 6 GeV
- hyperons inelastic:
- cross section: Glauber-Gribov
- final-state: FTFP > 3 GeV; BERT < 6 GeV
- anti_proton, anti_neutron, anti_deuteron, anti_triton, anti_He3, anti_alpha inelastic:
- cross-section: Galoyan-Uzhinsky-Glauber-Gribov
- final-state: FTFP for all energies
- anti_hyperons inelastic:
- cross section: Glauber-Gribov
- final-state: FTFP for all energies
- charm and bottom hadrons inelastic:
- cross section: Glauber-Gribov
- final-state: FTFP for all energies
G4HadronPhysicsFTFP_BERT
------------------------
Hadron nuclear inelastic processes for all hadrons:
- proton inelastic:
- cross section: Barashenkov-Glauber-Gribov (G4BGGNucleonInelasticXS)
- final-state: FTFP > 3 GeV; BERT < 6 GeV
- neutron inelastic:
- cross section: G4NeutronInelasticXS
- final-state: FTFP > 3 GeV; BERT < 6 GeV
neutron capture:
- cross section: G4NeutronCaptureXS
- final-state: G4NeutronRadCapture
- charged pions inelastic:
- cross section: Barashenkov-Glauber-Gribov
- final-state: FTFP > 3 GeV; BERT < 6 GeV
- kaons inelastic:
- cross section: Glauber-Gribov
- final-state: FTFP > 3 GeV; BERT < 6 GeV
- hyperons inelastic:
- cross section: Glauber-Gribov
- final-state: FTFP > 3 GeV; BERT < 6 GeV
- anti_proton, anti_neutron, anti_deuteron, anti_triton, anti_He3, anti_alpha inelastic:
- cross-section: Galoyan-Uzhinsky-Glauber-Gribov
- final-state: FTFP for all energies
- anti_hyperons inelastic:
- cross section: Glauber-Gribov
- final-state: FTFP for all energies
- charm and bottom hadrons inelastic:
- cross section: Glauber-Gribov
- final-state: FTFP for all energies
G4HadronPhysicsFTFP_BERT_ATL
----------------------------
Similar to G4HadronPhysicsFTFP_BERT, with the difference that for proton,
neutron, pions and kaons, the FTFP is used above 9 GeV and BERT below 12 GeV
(i.e. transition between these two models is in the interval [9, 12] GeV
for the most frequent hadrons).
G4HadronPhysicsFTFP_BERT_HP
--------------------------
Similar to G4HadronPhysicsFTFP_BERT, but with a different treatment of
low-energy neutrons:
- neutron inelastic: use NeutronHP (for both cross section and final state)
below 20 MeV; above G4NeutronCaptureXS cross section;
final-state: BERT between 19.9 MeV and 6 GeV,
FTFP above 3 GeV.
- neutron capture: use NeutronHP (for both cross section and final state)
below 20 MeV; above G4NeutronCaptureXS cross section
and G4NeutronRadCapture final-state.
- neutron fission: use NeutronHP (for both cross section and final state)
below 20 MeV; above Gheisha (cross section and final state).
Moreover, RadioactiveDecay is activated (as in all the physics lists that use HP).
G4HadronPhysicsFTFP_BERT_TRV
----------------------------
The same as G4HadronPhysicsFTFP_BERT.
G4HadronPhysicsFTF_BIC
----------------------
Similar to G4HadronPhysicsFTFP_BERT, with the following differences:
- For proton and neutron, BIC is used (instead of BERT) below 6 GeV
- For pions, BIC is used below 1.5 GeV, whereas BERT is used in the
interval 1 GeV < BERT < 6 GeV
- FTF is coupled with BIC (instead of directly to Precompound/de-excitation).
G4HadronPhysicsQGS_BIC
----------------------
Similar to G4HadronPhysicsFTP_BIC, except that QGSP is used above 12 GeV
and FTFP below 25 GeV.
G4HadronPhysicsFTFQGSP_BERT
---------------------------
Similar to G4HadronPhysicsFTFP_BERT, but with QGS fragmentation of strings
(instead of the Lund string fragmentation).
G4HadronPhysicsINCLXX
---------------------
Similar to QGSP_BERT except for:
- proton inelastic:
- cross section: Barashenkov-Glauber-Gribov (G4BGGNucleonInelasticXS)
- final-state: QGSP > 15 GeV; 1 MeV < INCLXX < 20 GeV; Preco < 2 MeV
- neutron inelastic:
- cross section: G4NeutronInelasticXS
- final-state: QGSP > 15 GeV; 1 MeV < INCLXX < 20 GeV; Preco < 2 MeV
- charged pions inelastic:
- cross section: Barashenkov-Glauber-Gribov
- final-state: QGSP > 15 GeV; 1 MeV < INCLXX < 20 GeV; Preco < 2 MeV
- kaons inelastic:
- cross section: Glauber-Gribov
- final-state: QGSP > 14 GeV; BERT < 15 GeV
Note: it is possible to specify in the constructor the use of FTFP
instead of QGSP;
moreover, NeutronHP can also be activated in the constructor,
in which case inelastic, capture and fission below 20 MeV are
taken from NeutronHP (both cross section and final-state).
G4HadronPhysicsNuBeam
---------------------
Similar to FTFP_BERT, except for the final-state models of proton:
- proton : QGSP with Lund string fragmentation > 100 GeV;
3 GeV < FTFP < 101 GeV; BERT < 6 GeV
G4HadronPhysicsQGSP_BERT
------------------------
Hadron nuclear inelastic processes for all hadrons:
- proton inelastic:
- cross section: Barashenkov-Glauber-Gribov (G4BGGNucleonInelasticXS)
- final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV
- neutron inelastic:
- cross section: G4NeutronInelasticXS
- final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV
neutron capture:
- cross section: G4NeutronCaptureXS
- final-state: G4NeutronRadCapture
- charged pions inelastic:
- cross section: Barashenkov-Glauber-Gribov
- final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV
- kaons inelastic:
- cross section: Glauber-Gribov
- final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV
- hyperons inelastic:
- cross section: Glauber-Gribov
- final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV
- anti_proton and anti_neutron inelastic:
- cross-section: Galoyan-Uzhinsky-Glauber-Gribov
- final-state: QGSP > 12 GeV; FTFP < 25 GeV
- anti_deuteron, anti_triton, anti_He3, and anti_alpha inelastic:
- cross-section: Galoyan-Uzhinsky-Glauber-Gribov
- final-state: FTFP for all energies
- anti_hyperons inelastic:
- cross section: Glauber-Gribov
- final-state: QGSP > 12 GeV; FTFP < 25 GeV
- charm and bottom hadrons inelastic:
- cross section: Glauber-Gribov
- final-state: QGSP > 12 GeV; FTFP < 25 GeV
G4HadronPhysicsQGSP_FTFP_BERT
-----------------------------
Currently it is the same as QGSP_BERT (this was not the case before G4 10.6).
It might be removed in future versions of Geant4.
G4HadronPhysicsQGSP_BERT_HP
---------------------------
Similar to G4HadronPhysicsQGSP_BERT, but with a different treatment of
low-energy neutrons:
- neutron inelastic: use NeutronHP (for both cross section and final state)
below 20 MeV; above G4NeutronCaptureXS cross section;
final-state: BERT between 19.9 MeV and 6 GeV,
FTFP between 3 and 25 GeV, QGSP above 12 GeV.
- neutron capture: use NeutronHP (for both cross section and final state)
below 20 MeV; above G4NeutronCaptureXS cross section
and G4NeutronRadCapture final-state.
- neutron fission: use NeutronHP (for both cross section and final state)
below 20 MeV; above Gheisha (cross section and final state).
Moreover, RadioactiveDecay is activated (as in all the physics lists that use HP).
G4HadronPhysicsQGSP_BIC
-----------------------
Hadron nuclear inelastic processes for all hadrons:
- proton inelastic:
- cross section: Barashenkov-Glauber-Gribov (G4BGGNucleonInelasticXS)
- final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BIC < 6 GeV
- neutron inelastic:
- cross section: G4NeutronInelasticXS
- final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BIC < 6 GeV
neutron capture:
- cross section: G4NeutronCaptureXS
- final-state: G4NeutronRadCapture
- charged pions inelastic:
- cross section: Barashenkov-Glauber-Gribov
- final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV
- kaons inelastic:
- cross section: Glauber-Gribov
- final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV
- hyperons inelastic:
- cross section: Glauber-Gribov
- final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; BERT < 6 GeV
- anti_proton and anti_neutron inelastic:
- cross-section: Galoyan-Uzhinsky-Glauber-Gribov
- final-state: QGSP > 12 GeV; FTFP < 25 GeV
- anti_deuteron, anti_triton, anti_He3, and anti_alpha inelastic:
- cross-section: Galoyan-Uzhinsky-Glauber-Gribov
- final-state: FTFP for all energies
- anti_hyperons inelastic:
- cross section: Glauber-Gribov
- final-state: QGSP > 12 GeV; FTFP < 25 GeV
G4HadronPhysicsQGSP_BIC_HP
--------------------------
Similar to G4HadronPhysicsQGSP_BIC, but with a different treatment of
low-energy neutrons:
- neutron inelastic: use NeutronHP (for both cross section and final state)
below 20 MeV; above G4NeutronCaptureXS cross section;
final-state: BIC between 19.9 MeV and 6 GeV,
FTFP between 3 and 25 GeV, QGSP above 12 GeV.
- neutron capture: use NeutronHP (for both cross section and final state)
below 20 MeV; above G4NeutronCaptureXS cross section
and G4NeutronRadCapture final-state.
- neutron fission: use NeutronHP (for both cross section and final state)
below 20 MeV; above Gheisha (cross section and final state).
Moreover, RadioactiveDecay is activated (as in all the physics lists that use HP).
G4HadronPhysicsQGSP_BIC_AllHP
-----------------------------
Similar to G4HadronPhysicsQGSP_BIC_HP, but with a different treatment of
low-energy protons:
ParticleHP is used (for both cross section and final state) below 200 MeV;
above it: Barashenkov-Glauber-Gribov inelastic cross section;
final-state: QGSP > 12 GeV; 3 GeV < FTFP < 25 GeV; 190 MeV < BIC < 6 GeV.
G4HadronPhysicsShielding
------------------------
Similar to G4HadronPhysicsFTFP_BERT_HP except for using
JENDLHEInelasticCrossSection for the neutron inelastic cross section
above 20 MeV.
Note: the variant "M" of the Shielding physics list has a transition region
between FTFP and BERT for pions between 9.5 and 9.9 GeV
(instead of 3-6 GeV).
G4HadronPhysicsShieldingLEND
----------------------------
Similar to G4HadronPhysicsShielding, except that LEND is used for neutrons
below 20 MeV instead of NeutronHP.
G4VHadronPhysics
----------------
Utility class which provides useful methods.
@@ -1,44 +0,0 @@
-------------------------------------------------------------------
G4IonBinaryCascadePhysics
-------------------------
Inelastic ion-ion processes (for deuteron, triton, He3, alpha and
generic ion projectiles), with Glauber-Gribov cross section and
Binary Light Ion (BIC, with Precompound/de-excitation) and Fritiof (FTF)
string model (with Precompound/de-excitation) for the final state.
BIC is used for projectiles of kinetic energies below 6 GeV/nucleon, and
FTF above 3 GeV/nucleon.
G4IonINCLXXPhysics
------------------
Inelastic ion-ion processes (for deuteron, triton, He3, alpha and
generic ion projectiles), with Glauber-Gribov cross section and
INCLXX and FTFP for the final state. INCLXX is used below 3 GeV/nucleon,
and FTF above 2.9 GeV/nucleon.
G4IonPhysics
------------
Currently equivalent to G4IonBinaryCascadePhysics.
G4IonPhysicsXS
--------------
As G4IonPhysics, except that for deuteron, triton, He3 and alpha
the corresponding G4ParticleInelasticXS cross section is used
(instead of G4ComponentGGNuclNuclXsc).
G4IonPhysicsPHP
---------------
Similar to G4IonBinaryCascadePhysics, except that ParticleHP (for both
cross sections and final states) is used below 200 MeV/n for deuteron,
triton, He3 and alpha (and BIC used above 190 MeV/n for these light ions).
G4IonQMDPhysic
--------------
Inelastic ion-ion processes (for deuteron, triton, He3, alpha and
generic ion projectiles), with Glauber-Gribov cross section and
BIC, QMD and FTFP for the final state. These three final-state models
are used in the following intervals of projectile kinetic energy:
- BIC below 110 MeV/nucleon;
- QMD between 100 and 6'000 MeV/nucleon;
- FTF above 5990 MeV/nucleon.
@@ -1,72 +0,0 @@
contructors/limiters
--------------------
This directory contains "technical" constructors in the sense they do not
add processes with physics content but add processes or modify physics lists to
allow for step limitation in parallel geometries, biasing, etc.
G4FastSimulationPhysics:
------------------------
Constructor that modifies a given physics list to allow for fast simulation.
One, or several, G4FastSimulationManagerProcess objects are added to the
process manager of particles for which a fast simulation is requested.
The fast simulation may be associated to regions in the mass geometry, in
what case a call like fastSimPhys->ActivateFastSimulation("e-") must be
done to allow for fast simulation of electrons.
Parallel geometries can be used also in what case the geometry is specified
by its name like fastSimPhys->ActivateFastSimulation("e-","parallelGeom") to
allow for fast simulation of electrons, with fast simulation models attached
to regions in "parallelGeom".
G4GenericBiasingPhysics:
------------------------
Constructor that modifies a given physics list to allow for generic biasing.
It provides three type of functionnalities:
- wrap physics processes with G4BiasingProcessInterface processes to
make the generic biasing to control them (allowing change of
interaction law, change of final state generation).
- add G4BiasingProcessInterface processes, but without wrapping a
physics process, in what case these processes will be used for
"non-physics based biasing" : ie, spliting and killing
- add G4ParallelGeometriesLimiterProcess process (at most one per
process manager) that provides step limitation on the parallel
geometries used in generic biasing. A process can handle several
parallel geometries associated to one particle type.
Various methods are provided to activate these functionnalities per
particle, set of particles, to activate physics-based only or
non-physics-based only or both functionnalities, and to activate the
parallel geometry functionnality.
This is documented in include/G4GenericBiasingPhysics.hh .
G4ImportanceBiasing:
-------------------
G4MaxTimeCuts:
--------------
G4MinEkineCuts:
---------------
G4NeutronTrackingCut:
---------------------
G4ParallelWorldPhysics:
-----------------------
G4SpecialCuts:
--------------
G4StepLimiterPhysics:
---------------------
G4WeightWindowBiasing:
----------------------
@@ -1,19 +0,0 @@
-------------------------------------------------------------------
G4StoppingPhysics
-----------------
It uses Bertini/Precompound (i.e. Bertini followed by the official
Precompound/deexcitation of Geant4, not the internal one of Bertini)
for nuclear capture of: pi-, K-, Sigma-, Xi- and Omega-.
It uses Fritiof/Precompound model for nuclear capture of: anti_proton,
anti_neutron, anti_Lambda, anti_Sigma0, anti_Sigma+, anti_Xi0,
anti_deuteron, anti_triton, anti_He3, and anti_alpha.
For mu-, Bertini model is used for nuclear capture, together with
default element selector, EM cascade sampling and bound decay sampling.
G4StoppingPhysicsFritiofWithBinaryCascade
-----------------------------------------
The same as G4StoppingPhysics, except that for anti-proton and anti-neutron
annihilation at rest it uses Fritiof coupled with Binary Cascade.