Import Geant4 11.3.0 source tree

This commit is contained in:
Gabriele Cosmo
2024-12-06 11:11:40 +01:00
parent e58e650b32
commit 32390e802b
1984 changed files with 98713 additions and 83996 deletions
+1 -9
View File
@@ -15,15 +15,7 @@ It must **not** be used as a substitute for writing good git commit messages!
## 2021-12-10 Ben Morgan (phys-ctor-V11-00-00)
- Change to new Markdown History format
---
# History entries prior to 11.0
15-01-2013, Gunter Folger
-------- Please tag at subdirectory level----------------
15-01-2013, Gunter Folger (phys-ctor-V09-06-00)
## 2013-01-15 Gunter Folger (phys-ctor-V09-06-00)
- Collect constructors subdirectories tags, and CMakeLists.txt & GNUmakefile
to allow testing to check out a complete set. Without this tag, CMakeLists.txt
will not be checked out, as constructors directory is not part of any tag yet.
@@ -4,6 +4,12 @@ See `CONTRIBUTING.rst` for details of **required** info/format for each entry,
which **must** added in reverse chronological order (newest at the top). It must **not**
be used as a substitute for writing good git commit messages!
## 2024-08-01 Alberto Ribon (phys-ctor-decay-V11-02-00)
- G4UnknownDecayPhysics : extended to G4ChargedUnknownParticle.
( This is part of ATLAS and LHCb request to assign automatically
ionisation and multiple scattering processes to charged primary particles
with valid PDG code but not known to Geant4. )
## 2023-11-07 Alberto Ribon (phys-ctor-decay-V11-01-01)
- G4RadioactiveDecayPhysics : replaced G4RadioactiveDecay with
G4Radioactivation to be able to run in biasing mode (not only in
@@ -37,6 +37,7 @@
#include "G4ProcessManager.hh"
#include "G4UnknownParticle.hh"
#include "G4ChargedUnknownParticle.hh"
#include "G4UnknownDecay.hh"
// factory
@@ -61,6 +62,7 @@ G4UnknownDecayPhysics::~G4UnknownDecayPhysics()
void G4UnknownDecayPhysics::ConstructParticle()
{
G4UnknownParticle::UnknownParticleDefinition();
G4ChargedUnknownParticle::ChargedUnknownParticleDefinition();
}
void G4UnknownDecayPhysics::ConstructProcess()
@@ -6,6 +6,36 @@ It must **not** be used as a substitute for writing good git commit messages!
-------------------------------------------------------------------------------
## 2024-10-18 Vladimir Ivanchenko (phys-ctor-em-V11-02-12)
- G4EmStandardPhysics_option3 - return back positron annihilation lost in
previous MR.
## 2024-10-17 Vladimir Ivanchenko (phys-ctor-em-V11-02-11)
- G4EmStandardPhysics_option3, G4EmStandardPhysics_option4, G4EmLivermorePhysics,
G4EmStandardPhysics, G4EmStandardPhysicsWVI - added a possibility to
enable/disable 3 gamma annihilation on fly, take into account rename of the
model G4eplusTo2GammaOKVIModel -> G4eplusTo2or3GammaModel. By default it is
enabled in G4EmStandardPhysics_option4 only. This option is not added to
the G4EmPenelopePhysics class, because it has the original Penelope model
for annihilation.
## 2024-10-02 Hoang Tran (phys-ctor-em-V11-02-10)
- Modified the molecule names of OH, HO2, O in MoleculeDefinition.
Each molecule configuration has a molecule definition.
## 2024-09-10 Alberto Ribon (phys-ctor-em-V11-02-09)
- G4ChargedUnknownPhysics : replaced G4hIonisation and G4hMultipleScattering
(which use G4ParticleDefinition) with the corresponding new classes
G4DynamicParticleIonisation and G4DynamicParticleMSC (which use only
G4DynamicParticle), respectively.
## 2024-08-01 Alberto Ribon (phys-ctor-em-V11-02-08)
- Created new constructor G4ChargedUnknownPhysics, to be used on top on any
reference physics list, to assign ionisation and multiple scattering
(as well as transportation) processes to charged primary particles with
valid PDG code but not known to Geant4.
( This was requested by ATLAS and LHCb. )
## 2024-05-23 Hoang Tran (phys-ctor-em-V11-02-07)
- Use EmParameters to control chemistry models in G4EmDNAChemistry_option3.
@@ -0,0 +1,66 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// --------------------------------------------------------------------------
//
// GEANT4 header file
//
// File name: G4ChargedUnknownPhysics.hh
//
// Author: A.Ribon
//
// Creation date: August 2024
//
// Description: This physics list constructor class is similar to
// G4UnknownDecayPhysics (which assigns the decay process
// (and transportation as well) to unknown particles),
// for charged unknown particles: it assigns the two EM
// processes of ionisation and multiple scattering
// (and transportation as well).
//
// Modifications:
//
// --------------------------------------------------------------------------
//
#ifndef G4ChargedUnknownPhysics_h
#define G4ChargedUnknownPhysics_h 1
#include "globals.hh"
#include "G4VPhysicsConstructor.hh"
class G4ChargedUnknownPhysics : public G4VPhysicsConstructor {
public:
G4ChargedUnknownPhysics( G4int ver = 1 );
G4ChargedUnknownPhysics( const G4String& name, G4int ver = 1 );
~G4ChargedUnknownPhysics() = default;
void ConstructParticle() override;
void ConstructProcess() override;
private:
G4int verbose;
};
#endif
@@ -3,6 +3,7 @@
# Define the Geant4 Module.
geant4_add_module(G4phys_ctor_em
PUBLIC_HEADERS
G4ChargedUnknownPhysics.hh
G4EmBuilder.hh
G4EmDNABuilder.hh
G4EmDNAChemistry.hh
@@ -42,6 +43,7 @@ geant4_add_module(G4phys_ctor_em
G4ChemDissociationChannels.hh
G4ChemDissociationChannels_option1.hh
SOURCES
G4ChargedUnknownPhysics.cc
G4EmBuilder.cc
G4EmDNABuilder.cc
G4EmDNAChemistry.cc
@@ -0,0 +1,84 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// --------------------------------------------------------------------------
//
// GEANT4 source file
//
// File name: G4ChargedUnknownPhysics.cc
//
// Author: A.Ribon
//
// Creation date: August 2024
//
// Description: This physics list constructor class is similar to
// G4UnknownDecayPhysics (which assigns the decay process
// (and transportation as well) to unknown particles),
// for charged unknown particles: it assigns the two EM
// processes of ionisation and multiple scattering
// (and transportation as well).
//
// Modifications:
//
// --------------------------------------------------------------------------
//
#include "G4ChargedUnknownPhysics.hh"
#include "G4ChargedUnknownParticle.hh"
#include "G4UnknownParticle.hh"
#include "G4ProcessManager.hh"
#include "G4DynamicParticleMSC.hh"
#include "G4DynamicParticleIonisation.hh"
// factory
#include "G4PhysicsConstructorFactory.hh"
//
G4_DECLARE_PHYSCONSTR_FACTORY( G4ChargedUnknownPhysics );
G4ChargedUnknownPhysics::G4ChargedUnknownPhysics( G4int ver )
: G4VPhysicsConstructor( "ChargedUnknownPhysics" ), verbose( ver ) {}
G4ChargedUnknownPhysics::G4ChargedUnknownPhysics( const G4String& name, G4int ver )
: G4VPhysicsConstructor( name ), verbose( ver ) {}
void G4ChargedUnknownPhysics::ConstructParticle() {
// Although this class deals only with 'chargedunknown' particles,
// it is more consistent to define also 'unknown' particles.
G4ChargedUnknownParticle::ChargedUnknownParticleDefinition();
G4UnknownParticle::UnknownParticleDefinition();
}
void G4ChargedUnknownPhysics::ConstructProcess() {
G4ProcessManager* pmanager = G4ChargedUnknownParticle::Definition()->GetProcessManager();
pmanager->AddProcess( new G4DynamicParticleMSC, -1, 1, -1 );
pmanager->AddProcess( new G4DynamicParticleIonisation, -1, 2, 2 );
if ( verbose > 1 ) {
G4cout << "### Added ionization and multiple scattering for chargedunknown" << G4endl;
}
}
@@ -55,17 +55,23 @@ void G4ChemDissociationChannels::ConstructMolecule()
G4Electron_aq::Definition();
G4H2O2::Definition();
G4H2::Definition();
auto G4OHm = new G4MoleculeDefinition("OH",/*mass*/ 17.00734 * g / Avogadro * c_squared,
2.8e-9 * (m * m / s), -1,
5, 0.958 * angstrom, // radius
2 // number of atoms
);
auto molTable = G4MoleculeTable::Instance();
molTable->CreateConfiguration("H3Op", G4H3O::Definition());
G4MolecularConfiguration* OHm =
molTable->CreateConfiguration("OHm", // just a tag to store and retrieve
// from G4MoleculeTable
G4OH::Definition(),
G4OHm,
-1, // charge
5.0e-9 * (m2 / s));
OHm->SetMass(17.0079 * g / Avogadro * c_squared);
molTable->CreateConfiguration("OH", G4OH::Definition());
molTable->CreateConfiguration("°OH", G4OH::Definition());
molTable->CreateConfiguration("e_aq", G4Electron_aq::Definition());
molTable->CreateConfiguration("H", G4Hydrogen::Definition());
molTable->CreateConfiguration("H2", G4H2::Definition());
@@ -79,7 +85,7 @@ void G4ChemDissociationChannels::ConstructDissociationChannels()
//-----------------------------------
// Get the molecular configuration
auto molTable = G4MoleculeTable::Instance();
G4MolecularConfiguration* OH = molTable->GetConfiguration("OH");
G4MolecularConfiguration* OH = molTable->GetConfiguration("°OH");
G4MolecularConfiguration* OHm = molTable->GetConfiguration("OHm");
G4MolecularConfiguration* e_aq = molTable->GetConfiguration("e_aq");
G4MolecularConfiguration* H2 = molTable->GetConfiguration("H2");
@@ -72,6 +72,18 @@ void G4ChemDissociationChannels_option1::ConstructMolecule()
G4Oxygen::Definition();
G4O3::Definition();
auto G4OHm = new G4MoleculeDefinition("OH",/*mass*/ 17.00734 * g / Avogadro * c_squared,
2.8e-9 * (m * m / s), -1,
5, 0.958 * angstrom, // radius
2 // number of atoms
);
auto G4HO2m = new G4MoleculeDefinition("HO_2", 33.0034 * g / Avogadro * c_squared,
2.3e-9 * (m * m / s), -1, 0,
2.1 * angstrom, 3);
auto G4Om = new G4MoleculeDefinition("O", 15.99773 * g / Avogadro * c_squared,
2.0e-9 * (m * m / s), 0, 0,
2.0 * angstrom, 1);
//____________________________________________________________________________
auto molTable = G4MoleculeTable::Instance();
molTable->CreateConfiguration("H3Op", G4H3O::Definition());
@@ -79,14 +91,14 @@ void G4ChemDissociationChannels_option1::ConstructMolecule()
* (m2 / s));
molTable->GetConfiguration("H3Op")->SetVanDerVaalsRadius(0.25 * nm);
molTable->CreateConfiguration("OH", G4OH::Definition());
molTable->GetConfiguration("OH")->SetDiffusionCoefficient(2.2e-9 * (m2 / s));
molTable->GetConfiguration("OH")->SetVanDerVaalsRadius(0.22 * nm);
molTable->CreateConfiguration("°OH", G4OH::Definition());
molTable->GetConfiguration("°OH")->SetDiffusionCoefficient(2.2e-9 * (m2 / s));
molTable->GetConfiguration("°OH")->SetVanDerVaalsRadius(0.22 * nm);
G4MolecularConfiguration* OHm =
molTable->CreateConfiguration("OHm", // just a tag to store and retrieve
// from G4MoleculeTable
G4OH::Definition(),
G4OHm,
-1, // charge
5.3e-9 * (m2 / s));
OHm->SetMass(17.0079 * g / Avogadro * c_squared);
@@ -108,13 +120,13 @@ void G4ChemDissociationChannels_option1::ConstructMolecule()
// molecules extension (RITRACKS)
molTable->CreateConfiguration("HO2", G4HO2::Definition());
molTable->GetConfiguration("HO2")->SetVanDerVaalsRadius(0.21 * nm);
molTable->CreateConfiguration("HO2°", G4HO2::Definition());
molTable->GetConfiguration("HO2°")->SetVanDerVaalsRadius(0.21 * nm);
G4MolecularConfiguration* HO2m =
molTable->CreateConfiguration("HO2m", // just a tag to store and retrieve
// from G4MoleculeTable
G4HO2::Definition(),
G4HO2m,
-1, // charge
1.4e-9 * (m2 / s));
HO2m->SetMass(33.00396 * g / Avogadro * c_squared);
@@ -126,7 +138,7 @@ void G4ChemDissociationChannels_option1::ConstructMolecule()
G4MolecularConfiguration* Om =
molTable->CreateConfiguration("Om", // just a tag to store and retrieve from
// G4MoleculeTable
G4Oxygen::Definition(),
G4Om,
-1, // charge
2.0e-9 * (m2 / s));
Om->SetMass(15.99829 * g / Avogadro * c_squared);
@@ -170,7 +182,7 @@ void G4ChemDissociationChannels_option1::ConstructMolecule()
molTable->CreateConfiguration("OHm(B)", // just a tag to store and retrieve
// from G4MoleculeTable
G4OH::Definition(),
G4OHm,
-1, // charge
0 * (m2 / s));
@@ -184,7 +196,7 @@ void G4ChemDissociationChannels_option1::ConstructDissociationChannels()
//-----------------------------------
// Get the molecular configuration
auto molTable = G4MoleculeTable::Instance();
G4MolecularConfiguration* OH = molTable->GetConfiguration("OH");
G4MolecularConfiguration* OH = molTable->GetConfiguration("°OH");
G4MolecularConfiguration* OHm = molTable->GetConfiguration("OHm");
G4MolecularConfiguration* e_aq = molTable->GetConfiguration("e_aq");
G4MolecularConfiguration* H2 = molTable->GetConfiguration("H2");
@@ -97,7 +97,7 @@ void G4EmDNAChemistry::ConstructReactionTable(G4DNAMolecularReactionTable*
//-----------------------------------
//Get the molecular configuration
G4MolecularConfiguration* OH =
G4MoleculeTable::Instance()->GetConfiguration("OH");
G4MoleculeTable::Instance()->GetConfiguration("°OH");
G4MolecularConfiguration* OHm =
G4MoleculeTable::Instance()->GetConfiguration("OHm");
G4MolecularConfiguration* e_aq =
@@ -80,7 +80,7 @@ void G4EmDNAChemistry_option1::ConstructMolecule()
9.46e-9 * (m2/s));
G4MoleculeTable::Instance()->GetConfiguration("OHm")->SetDiffusionCoefficient(
5.3e-9 * (m2 / s));
G4MoleculeTable::Instance()->GetConfiguration("OH")->SetDiffusionCoefficient(
G4MoleculeTable::Instance()->GetConfiguration("°OH")->SetDiffusionCoefficient(
2.2e-9 * (m2/s));
G4MoleculeTable::Instance()->GetConfiguration("H2")->SetDiffusionCoefficient(
4.8e-9 * (m2/s));
@@ -103,7 +103,7 @@ void G4EmDNAChemistry_option1::ConstructReactionTable(G4DNAMolecularReactionTabl
//-----------------------------------
//Get the molecular configuration
G4MolecularConfiguration* OH =
G4MoleculeTable::Instance()->GetConfiguration("OH");
G4MoleculeTable::Instance()->GetConfiguration("°OH");
G4MolecularConfiguration* OHm =
G4MoleculeTable::Instance()->GetConfiguration("OHm");
G4MolecularConfiguration* e_aq =
@@ -141,7 +141,7 @@ void G4EmDNAChemistry_option2::ConstructReactionTable(
//-----------------------------------
//Get the molecular configuration
G4MolecularConfiguration* OH =
G4MoleculeTable::Instance()->GetConfiguration("OH");
G4MoleculeTable::Instance()->GetConfiguration("°OH");
G4MolecularConfiguration* OHm =
G4MoleculeTable::Instance()->GetConfiguration("OHm");
G4MolecularConfiguration* e_aq =
@@ -100,7 +100,7 @@ void G4EmDNAChemistry_option3::ConstructReactionTable(G4DNAMolecularReactionTabl
//-----------------------------------
//Get the molecular configuration
G4MolecularConfiguration* OH =
G4MoleculeTable::Instance()->GetConfiguration("OH");
G4MoleculeTable::Instance()->GetConfiguration("°OH");
G4MolecularConfiguration* OHm =
G4MoleculeTable::Instance()->GetConfiguration("OHm");
G4MolecularConfiguration* e_aq =
@@ -114,7 +114,7 @@ void G4EmDNAChemistry_option3::ConstructReactionTable(G4DNAMolecularReactionTabl
G4MolecularConfiguration* H2O2 =
G4MoleculeTable::Instance()->GetConfiguration("H2O2");
G4MolecularConfiguration* HO2 =
G4MoleculeTable::Instance()->GetConfiguration("HO2");
G4MoleculeTable::Instance()->GetConfiguration("HO2°");
G4MolecularConfiguration* HO2m =
G4MoleculeTable::Instance()->GetConfiguration("HO2m");
G4MolecularConfiguration* O =
@@ -64,6 +64,7 @@
// e+
#include "G4eplusAnnihilation.hh"
#include "G4eplusTo2or3GammaModel.hh"
// hadrons
#include "G4hMultipleScattering.hh"
@@ -138,8 +139,7 @@ G4EmLivermorePhysics::G4EmLivermorePhysics(G4int ver, const G4String& pname)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4EmLivermorePhysics::~G4EmLivermorePhysics()
{}
G4EmLivermorePhysics::~G4EmLivermorePhysics() = default;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -290,11 +290,17 @@ void G4EmLivermorePhysics::ConstructProcess()
brem->SetEmModel(br2);
br1->SetHighEnergyLimit(GeV);
// annihilation
auto anni = new G4eplusAnnihilation();
if (param->Use3GammaAnnihilationOnFly()) {
anni->SetEmModel(new G4eplusTo2or3GammaModel());
}
// register processes
ph->RegisterProcess(eioni, particle);
ph->RegisterProcess(brem, particle);
ph->RegisterProcess(ee, particle);
ph->RegisterProcess(new G4eplusAnnihilation(), particle);
ph->RegisterProcess(anni, particle);
ph->RegisterProcess(ss, particle);
// generic ion
@@ -131,8 +131,7 @@ G4EmPenelopePhysics::G4EmPenelopePhysics(G4int ver, const G4String&)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4EmPenelopePhysics::~G4EmPenelopePhysics()
{}
G4EmPenelopePhysics::~G4EmPenelopePhysics() = default;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -271,10 +270,10 @@ void G4EmPenelopePhysics::ConstructProcess()
theBremPenelope = new G4PenelopeBremsstrahlungModel();
theBremPenelope->SetHighEnergyLimit(PenelopeHighEnergyLimit);
brem->SetEmModel(theBremPenelope);
//Annihilation
G4eplusAnnihilation* anni = new G4eplusAnnihilation();
G4PenelopeAnnihilationModel* theAnnPenelope = new G4PenelopeAnnihilationModel();
auto anni = new G4eplusAnnihilation();
auto theAnnPenelope = new G4PenelopeAnnihilationModel();
theAnnPenelope->SetHighEnergyLimit(PenelopeHighEnergyLimit);
anni->AddEmModel(0, theAnnPenelope);
@@ -50,6 +50,7 @@
#include "G4LivermorePhotoElectricModel.hh"
#include "G4LivermorePolarizedRayleighModel.hh"
#include "G4PhotoElectricAngularGeneratorPolarized.hh"
#include "G4eplusTo2or3GammaModel.hh"
#include "G4hMultipleScattering.hh"
#include "G4CoulombScattering.hh"
@@ -96,8 +97,7 @@ G4EmStandardPhysics::G4EmStandardPhysics(G4int ver, const G4String&)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4EmStandardPhysics::~G4EmStandardPhysics()
{}
G4EmStandardPhysics::~G4EmStandardPhysics() = default;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -209,9 +209,15 @@ void G4EmStandardPhysics::ConstructProcess()
ssm->SetLowEnergyLimit(highEnergyLimit);
ssm->SetActivationLowEnergyLimit(highEnergyLimit);
// annihilation
auto anni = new G4eplusAnnihilation();
if (param->Use3GammaAnnihilationOnFly()) {
anni->SetEmModel(new G4eplusTo2or3GammaModel());
}
ph->RegisterProcess(new G4eIonisation(), particle);
ph->RegisterProcess(new G4eBremsstrahlung(), particle);
ph->RegisterProcess(new G4eplusAnnihilation(), particle);
ph->RegisterProcess(anni, particle);
ph->RegisterProcess(ss, particle);
// generic ion
@@ -75,7 +75,7 @@
#include "G4BraggIonModel.hh"
#include "G4IonFluctuations.hh"
#include "G4NuclearStopping.hh"
#include "G4eplusTo2GammaOKVIModel.hh"
#include "G4eplusTo2or3GammaModel.hh"
#include "G4Gamma.hh"
#include "G4Electron.hh"
@@ -214,7 +214,7 @@ void G4EmStandardPhysicsWVI::ConstructProcess()
ssm->SetActivationLowEnergyLimit(highEnergyLimit);
G4eplusAnnihilation* ann = new G4eplusAnnihilation();
ann->SetEmModel(new G4eplusTo2GammaOKVIModel());
ann->SetEmModel(new G4eplusTo2or3GammaModel());
ph->RegisterProcess(msc, particle);
ph->RegisterProcess(new G4eIonisation(), particle);
@@ -55,6 +55,7 @@
#include "G4LivermorePolarizedRayleighModel.hh"
#include "G4PhotoElectricAngularGeneratorPolarized.hh"
#include "G4BetheHeitler5DModel.hh"
#include "G4eplusTo2or3GammaModel.hh"
#include "G4eMultipleScattering.hh"
#include "G4hMultipleScattering.hh"
@@ -128,8 +129,7 @@ G4EmStandardPhysics_option3::G4EmStandardPhysics_option3(G4int ver,
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4EmStandardPhysics_option3::~G4EmStandardPhysics_option3()
{}
G4EmStandardPhysics_option3::~G4EmStandardPhysics_option3() = default;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -242,8 +242,14 @@ void G4EmStandardPhysics_option3::ConstructProcess()
ph->RegisterProcess(eIoni, particle);
ph->RegisterProcess(brem, particle);
// annihilation
auto anni = new G4eplusAnnihilation();
if (param->Use3GammaAnnihilationOnFly()) {
anni->SetEmModel(new G4eplusTo2or3GammaModel());
}
ph->RegisterProcess(ee, particle);
ph->RegisterProcess(new G4eplusAnnihilation(), particle);
ph->RegisterProcess(anni, particle);
// generic ion
particle = G4GenericIon::GenericIon();
@@ -86,7 +86,7 @@
#include "G4IonParametrisedLossModel.hh"
#include "G4LindhardSorensenIonModel.hh"
#include "G4NuclearStopping.hh"
#include "G4eplusTo2GammaOKVIModel.hh"
#include "G4eplusTo2or3GammaModel.hh"
#include "G4Gamma.hh"
#include "G4Electron.hh"
@@ -129,6 +129,7 @@ G4EmStandardPhysics_option4::G4EmStandardPhysics_option4(G4int ver,
param->SetMuHadLateralDisplacement(true);
param->SetFluo(true);
param->SetUseICRU90Data(true);
param->Set3GammaAnnihilationOnFly(true);
param->SetFluctuationType(fUrbanFluctuation);
param->SetMaxNIELEnergy(1*CLHEP::MeV);
param->SetPositronAtRestModelType(fAllisonPositronium);
@@ -137,8 +138,7 @@ G4EmStandardPhysics_option4::G4EmStandardPhysics_option4(G4int ver,
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4EmStandardPhysics_option4::~G4EmStandardPhysics_option4()
{}
G4EmStandardPhysics_option4::~G4EmStandardPhysics_option4() = default;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -304,7 +304,9 @@ void G4EmStandardPhysics_option4::ConstructProcess()
// annihilation
auto anni = new G4eplusAnnihilation();
anni->SetEmModel(new G4eplusTo2GammaOKVIModel());
if (param->Use3GammaAnnihilationOnFly()) {
anni->SetEmModel(new G4eplusTo2or3GammaModel());
}
// register processes
ph->RegisterProcess(eioni, particle);
@@ -6,6 +6,10 @@ It must **not** be used as a substitute for writing good git commit messages!
-------------------------------------------------------------------------------
## 2024-11-04 Vladimir Ivantchenko (phys-ctor-fact-V11-02-01)
- G4PhysicsConstructorRegistry - removed memory leak at exit by using of
G4ThreadLocalSingleton pattern
## 2024-05-15 Gabriele Cosmo (phys-ctor-fact-V11-02-00)
- Minor code cleanup in G4PhysicsConstructorRegistry source.
@@ -48,13 +48,16 @@
#include <vector>
#include <map>
#include "globals.hh"
#include "G4ThreadLocalSingleton.hh"
class G4VPhysicsConstructor;
class G4VBasePhysConstrFactory;
class G4PhysicsConstructorRegistry
{
friend class G4ThreadLocalSingleton<G4PhysicsConstructorRegistry>;
public:
static G4PhysicsConstructorRegistry* Instance();
@@ -87,9 +90,9 @@ private:
static G4ThreadLocal G4PhysicsConstructorRegistry* theInstance;
std::vector <G4VPhysicsConstructor*> physConstr;
std::vector<G4VPhysicsConstructor*> physConstr;
std::map <G4String, G4VBasePhysConstrFactory*> factories;
std::map<G4String, G4VBasePhysConstrFactory*> factories;
};
@@ -47,7 +47,10 @@ G4ThreadLocal G4PhysicsConstructorRegistry* G4PhysicsConstructorRegistry::theIns
G4PhysicsConstructorRegistry* G4PhysicsConstructorRegistry::Instance()
{
if(nullptr == theInstance) theInstance = new G4PhysicsConstructorRegistry;
if (nullptr == theInstance) {
static G4ThreadLocalSingleton<G4PhysicsConstructorRegistry> inst;
theInstance = inst.Instance();
}
return theInstance;
}
@@ -61,41 +64,25 @@ G4PhysicsConstructorRegistry::~G4PhysicsConstructorRegistry()
void G4PhysicsConstructorRegistry::Clean()
{
std::size_t n = physConstr.size();
if(n > 0) {
for (std::size_t i=0; i<n; ++i) {
if(physConstr[i]) {
G4VPhysicsConstructor* p = physConstr[i];
physConstr[i] = nullptr;
delete p;
}
}
physConstr.clear();
}
for (auto const & ptr : physConstr) { delete ptr; }
physConstr.clear();
}
void G4PhysicsConstructorRegistry::Register(G4VPhysicsConstructor* p)
{
if(nullptr == p) return;
std::size_t n = physConstr.size();
if(n > 0) {
for (std::size_t i=0; i<n; ++i) {
if(physConstr[i] == p) { return; }
}
}
if (nullptr == p) { return; }
for (auto const & ptr : physConstr) { if (p == ptr) { return; } }
physConstr.push_back(p);
}
void G4PhysicsConstructorRegistry::DeRegister(G4VPhysicsConstructor* p)
{
if (nullptr == p) return;
if (nullptr == p || physConstr.empty()) { return; }
std::size_t n = physConstr.size();
if ( n > 0 ) {
for (std::size_t i=0; i<n; ++i) {
if ( physConstr[i] == p ) {
physConstr[i] = nullptr;
return;
}
for (std::size_t i=0; i<n; ++i) {
if ( physConstr[i] == p ) {
physConstr[i] = nullptr;
return;
}
}
}
@@ -6,6 +6,12 @@ It must **not** be used as a substitute for writing good git commit messages!
-------------------------------------------------------------------------------
## 2024-10-28 Alexei Sytov (phys-ctor-glnuclear-V11-02-01)
- Added new physics G4CoherentPairProductionPhysics related to the process
G4CoherentPairProduction of coherent pair production by
high energy gamma in an oriented crystal.
- source.cmake updated correspondingly
## 2024-02-13 Vladimir Ivanchenko (phys-ctor-glnuclear-V11-02-00)
- G4NeutrinoPhysics - fixed neutrino physics instantiation (problem #2594)
@@ -46,3 +46,38 @@
(note: mu- and mu+ together, not individually)
at run time, via macro commands.
G4CoherentPairProductionPhysics
-------------
Used by G4CoherentPairProduction process (in parameterisations/channeling/)
of coherent pair production by high energy gamma in an oriented crystal.
- IMPORTANT: with default parameters (incoherent scattering switched off)
can work in parallel with a standard physics list.
- It is possible to activate incoherent scattering using
ActivateIncoherentScattering() function.
IMPORTANT: requires switching off gamma conversion in
the physics list to not simulate it twice
- IMPORTANT: the geometry and material crystal data are contained in
G4ChannelingFastSimCrystalData which is automatically copied from
G4ChannelingFastSimModel into G4CoherentPairProduction using also
the default G4ChannelingFastSimModel and G4Region names ("ChannelingModel"
and "Crystal", respectively), which can be changed using
SetNameChannelingModel and SetNameG4Region, respectively,
being G4CoherentPairProductionPhysics set functions.
- IMPORTANT: G4ChannelingFastSimModel and its G4Region are required
for G4ChannelingFastSimCrystalData. If not found, an exception will
be generated.
- The intrinsic parameters of G4CoherentPairProduction can be changed
using G4CoherentPairProductionPhysics set functions:
- cuts of the model:
- SetLowEnergyLimit(G4double energy); default is 1 GeV
- SetHighAngleLimit(G4double angle); default is 50 mrad
- SetPPKineticEnergyCut(G4double kineticEnergyCut); default is 1 MeV
- internal parameters of the model (!!! it is strongly UNRECOMMENDED to decrease them):
- SetSamplingPairsNumber(G4int nPairs);
//default is 150 (amount of sampling pairs for Baier-Katkov algorithm)
- SetChargeParticleAngleFactor(G4double chargeParticleAngleFactor);
//default is 4 (angular distribution parameter = 4/gamma)
- void SetNTrajectorySteps(G4int nTrajectorySteps);
//default is 250 (amount of trajectory steps for tracking of
//sampling pair in Baier-Katkov algorithm).
@@ -0,0 +1,107 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// Author: Alexei Sytov
#ifndef G4CoherentPairProductionPhysics_h
#define G4CoherentPairProductionPhysics_h 1
#include "G4VPhysicsConstructor.hh"
#include "G4CoherentPairProduction.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4CoherentPairProductionPhysics : public G4VPhysicsConstructor
{
public:
G4CoherentPairProductionPhysics(const G4String& name =
"Coherent Pair Production Physics");
~G4CoherentPairProductionPhysics() = default;
void ConstructParticle() override;
void ConstructProcess() override;
///activate incoherent scattering
///(standard gamma conversion should be switched off in physics list)
void ActivateIncoherentScattering(){fIncoherentScattering = true;}
///set functions
///set name of G4ChannelingFastSimModel from which an auto input should be performed
void SetNameChannelingModel(const G4String& nameChannelingModel)
{fNameChannelingModel=nameChannelingModel;}
///set name of G4Region to where the G4ChannelingFastSimModel is active
void SetNameG4Region(const G4String& nameG4Region)
{fNameRegion=nameG4Region;}
void SetLowEnergyLimit(G4double energy){fLowEnergyLimit=energy;}
void SetHighAngleLimit(G4double angle) {fHighAngleLimit=angle;}
void SetPPKineticEnergyCut(G4double kineticEnergyCut) {fPPKineticEnergyCut=kineticEnergyCut;}
/// set the number of pairs in sampling of Baier-Katkov Integral
/// (MC integration by e+- energy and angles <=> e+- momentum)
void SetSamplingPairsNumber(G4int nPairs){fNMCPairs = nPairs;}
/// set the number of particle angles 1/gamma in pair production
/// defining the width of the angular distribution of pair sampling
/// in the Baier-Katkov Integral
void SetChargeParticleAngleFactor(G4double chargeParticleAngleFactor)
{fChargeParticleAngleFactor = chargeParticleAngleFactor;}
/// set number of trajectory steps of a single particle (e- or e+)
void SetNTrajectorySteps(G4int nTrajectorySteps)
{fNTrajectorySteps = nTrajectorySteps;}
private:
///flag of simulation of incoherent scattering
G4bool fIncoherentScattering = false;
///name of G4ChannelingFastSimModel from which an auto input should be performed
G4String fNameChannelingModel = "ChannelingModel";
///name of G4Region to where the G4ChannelingFastSimModel is active
G4String fNameRegion = "Crystal";
G4double fLowEnergyLimit = 1*CLHEP::GeV;
G4double fHighAngleLimit = 50*CLHEP::mrad;
///minimal kinetic energy of a charged particle produced
G4double fPPKineticEnergyCut = 1*CLHEP::MeV;
///Monte Carlo statistics of e+- pair sampling in Baier-Katkov for 1 photon
G4int fNMCPairs = 150;
G4double fChargeParticleAngleFactor = 4; // number of particle angles 1/gamma:
// more fChargeParticleAngleFactor => higher paramParticleAngle
///number of trajectory steps of a single particle (e- or e+)
G4int fNTrajectorySteps=250;
};
#endif
@@ -4,6 +4,7 @@
geant4_add_module(G4phys_ctor_glnuclear
PUBLIC_HEADERS
G4BertiniElectroNuclearBuilder.hh
G4CoherentPairProductionPhysics.hh
G4EmExtraPhysics.hh
G4EmMessenger.hh
G4LENDBertiniGammaElectroNuclearBuilder.hh
@@ -11,6 +12,7 @@ geant4_add_module(G4phys_ctor_glnuclear
G4NeutrinoPhysicsMessenger.hh
SOURCES
G4BertiniElectroNuclearBuilder.cc
G4CoherentPairProductionPhysics.cc
G4EmExtraPhysics.cc
G4EmMessenger.cc
G4LENDBertiniGammaElectroNuclearBuilder.cc
@@ -24,6 +26,7 @@ geant4_module_link_libraries(G4phys_ctor_glnuclear
G4hadronic_proc
G4intercoms
G4run
G4channeling
PRIVATE
G4baryons
G4bosons
@@ -49,4 +52,6 @@ geant4_module_link_libraries(G4phys_ctor_glnuclear
G4phys_ctor_em
G4phys_ctor_factory
G4procman
G4parameterisation
G4geometrymng
G4xrays)
@@ -0,0 +1,112 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// Author: Alexei Sytov
#include "G4CoherentPairProductionPhysics.hh"
#include "G4Gamma.hh"
#include "G4ProcessManager.hh"
#include "G4CoherentPairProduction.hh"
#include "G4ChannelingFastSimModel.hh"
#include "G4RegionStore.hh"
#include "G4FastSimulationManager.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4CoherentPairProductionPhysics::G4CoherentPairProductionPhysics(const G4String& name):
G4VPhysicsConstructor(name)
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4CoherentPairProductionPhysics::ConstructParticle()
{
G4Gamma::GammaDefinition(); // Define the gamma particle
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void G4CoherentPairProductionPhysics::ConstructProcess()
{
//create the gamma process
G4CoherentPairProduction* gammaProcess = new G4CoherentPairProduction();
if(verboseLevel > 0) {
G4cout << "G4CoherentPairProductionPhysics::ConstructProcess" << G4endl;
}
G4RegionStore* regionStore = G4RegionStore::GetInstance();
G4Region* RegionCh = regionStore->GetRegion(fNameRegion);
//if the region is not found
if(RegionCh==0)
{
G4Exception("GetRegion",// Origin of the exception
"001", // Unique error code
FatalException, // Terminate the program
"Region is not found! The program will terminate.");
}
else
{
//get channeling model
G4bool someflag=false;
G4ChannelingFastSimModel* Channeling =
static_cast<G4ChannelingFastSimModel*>
(RegionCh->GetFastSimulationManager()->
GetFastSimulationModel(fNameChannelingModel,0,someflag));
//if channeling model is not found
if(Channeling==0)
{
G4Exception("GetFastSimulationModel",// Origin of the exception
"001", // Unique error code
FatalException, // Terminate the program
"Input channeling model is not found! The program will terminate."
);
}
else
{
gammaProcess->Input(Channeling->GetCrystalData());
}
}
//set functions
if(fIncoherentScattering){gammaProcess->ActivateIncoherentScattering();}
gammaProcess->SetLowEnergyLimit(fLowEnergyLimit);
gammaProcess->SetHighAngleLimit(fHighAngleLimit);
gammaProcess->SetPPKineticEnergyCut(fPPKineticEnergyCut);
gammaProcess->SetSamplingPairsNumber(fNMCPairs);
gammaProcess->SetChargeParticleAngleFactor(fChargeParticleAngleFactor);
gammaProcess->SetNTrajectorySteps(fNTrajectorySteps);
//set the name of G4Region in which the model is applicable
gammaProcess->SetG4RegionName(fNameRegion);
//get process manager for gamma
G4ProcessManager* pManager = G4Gamma::Gamma()->GetProcessManager();
//register the G4CoherentPairProduction process
pManager->AddDiscreteProcess(gammaProcess);
}
@@ -6,6 +6,9 @@ It must **not** be used as a substitute for writing good git commit messages!
-------------------------------------------------------------------------------
## 2024-07-03 Robert Hatcher (phys-ctor-helastic-V11-02-00)
- Add self registration of G4ThermalNeutrons with the constructor factory
## 2023-10-31 Vladimir Ivanchenko (phys-ctor-helastic-V11-01-06)
- G4ChargeExchangePhysics, G4ChargeExchangeMessenger - added UI commands
@@ -49,6 +49,9 @@
#include "G4PhysListUtil.hh"
#include "G4SystemOfUnits.hh"
#include "G4PhysicsConstructorFactory.hh"
G4_DECLARE_PHYSCONSTR_FACTORY(G4ThermalNeutrons);
G4ThermalNeutrons::G4ThermalNeutrons(G4int ver) :
G4VHadronPhysics("ThermalNeutrons", ver) {
// because it is an addition, the type of this constructor is 0
@@ -4,6 +4,14 @@ See `CONTRIBUTING.rst` for details of **required** info/format for each entry,
which **must** added in reverse chronological order (newest at the top). It must **not**
be used as a substitute for writing good git commit messages!
## 2024-11-08 Alberto Ribon (phys-ctor-hinelastic-V11-02-02)
- README : updated information for the coming release 11.3.
## 2024-10-22 Alberto Ribon (phys-ctor-hinelastic-V11-02-01)
- Introduced new class G4URRNeutrons to enable the special treatment of the
Unresolved Resonance Region (URR) via Particle Tables (PT) for low-energy
neutrons. It can be used on top of any _HP or _HPT physics list.
## 2024-06-06 Vladimir Ivanchenko (phys-ctor-hinelastic-V11-02-00)
- G4HadrocPhysicsQGSP_BERT_HP - used alternative NUDEX model of gamma de-excitation
@@ -211,17 +211,25 @@ G4HadronPhysicsQGSP_FTFP_BERT
---------------------------
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,
- neutron inelastic: for cross section, use G4NeutronHPInelasticXS
below 20 MeV, and G4NeutronInelasticXS above;
for final-state model, use G4NeutronHPInelasticVI
below 20 MeV, 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).
- neutron capture: use G4NeutronHPCaptureXS cross section and
G4NeutronRadCaptureHP final-state model
(Note: if NuDEX is enabled (by default it is not),
then G4NuDEXNeutronCaptureModel final-state
model is used instead of G4NeutronRadCaptureHP).
- neutron fission: use G4NeutronHPFissionXS cross section and
G4NeutronFissionVI final-state model.
Moreover, RadioactiveDecay is activated (as in all the physics lists that use HP)
Important warning: since G4 11.2, this constructor is different than all
other HP-based constructors for the treatment of neutrons
below 20 MeV : new "experimental" cross sections and
final-state models - which are different from the HP ones -
are utilised for testing, and therefore we recommend to
not using them for physics studies.
G4HadronPhysicsQGSP_BIC
-----------------------
@@ -300,3 +308,17 @@ G4HadronPhysicsQGSP_FTFP_BERT
----------------
Utility class which provides useful methods.
G4URRNeutrons
-------------
Physics list constructor that can be applied on top of any _HP or _HPT based
physics list, to enable the special Unresolved Resonance Region (URR) treatment
of low-energy neutrons based on Particle Table (PT).
Notes:
- If this constructor is applied on top of a non-HP based physics list,
then nothing changes and a warning is printed out.
- If this constructor is applied on top of a HP-based physics list,
and the thermal scattering is applied after G4URRNeutrons, then
there will be a problem of full overlappings between models.
Therefore, if you need thermal scattering, activate it (e.g. by
using a HPT-based physics list) before applying G4URRNeutrons.
@@ -0,0 +1,62 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
//
//---------------------------------------------------------------------------
//
// ClassName: G4URRNeutrons
//
// Author: Alberto Ribon - October 2024
//
// Description: Physics list constructor that can be applied on top of any
// _HP or _HPT based physics list.
// This class enables the special Unresolved Resonance Region
// (URR) treatment of low-energy neutrons based on Particle
// Table (PT).
// If this constructor is applied on top of a non-HP based
// physics list, then nothing is done (i.e. the physics list
// remains as it was originally, and a warning is printed out).
//
// Modified:
//
//----------------------------------------------------------------------------
//
// Addition of neutron thermal scattering on top of any PhysicsList
#ifndef G4URRNeutrons_h
#define G4URRNeutrons_h
#include "G4VHadronPhysics.hh"
#include "globals.hh"
class G4URRNeutrons : public G4VHadronPhysics {
public:
explicit G4URRNeutrons( G4int ver = 1 );
virtual ~G4URRNeutrons();
void ConstructProcess() override;
};
#endif
@@ -7,43 +7,45 @@ geant4_add_module(G4phys_ctor_hinelastic
G4HadronInelasticQBBC_ABLA.hh
G4HadronPhysicsFTF_BIC.hh
G4HadronPhysicsFTFP_BERT.hh
G4HadronPhysicsFTFP_BERT_ATL.hh
G4HadronPhysicsFTFP_BERT_HP.hh
G4HadronPhysicsFTFP_BERT_TRV.hh
G4HadronPhysicsFTFP_BERT_ATL.hh
G4HadronPhysicsFTFQGSP_BERT.hh
G4HadronPhysicsINCLXX.hh
G4HadronPhysicsNuBeam.hh
G4HadronPhysicsQGS_BIC.hh
G4HadronPhysicsQGSP_BERT.hh
G4HadronPhysicsQGSP_BERT_HP.hh
G4HadronPhysicsQGSP_BIC.hh
G4HadronPhysicsQGSP_BIC_AllHP.hh
G4HadronPhysicsQGSP_BIC_HP.hh
G4HadronPhysicsQGSP_FTFP_BERT.hh
G4HadronPhysicsINCLXX.hh
G4HadronPhysicsShielding.hh
G4HadronPhysicsShieldingLEND.hh
G4URRNeutrons.hh
G4VHadronPhysics.hh
G4HadronPhysicsQGSP_BIC_AllHP.hh
SOURCES
G4HadronInelasticQBBC.cc
G4HadronInelasticQBBC_ABLA.cc
G4HadronPhysicsFTF_BIC.cc
G4HadronPhysicsFTFP_BERT.cc
G4HadronPhysicsFTFP_BERT_ATL.cc
G4HadronPhysicsFTFP_BERT_HP.cc
G4HadronPhysicsFTFP_BERT_TRV.cc
G4HadronPhysicsFTFP_BERT_ATL.cc
G4HadronPhysicsFTFQGSP_BERT.cc
G4HadronPhysicsINCLXX.cc
G4HadronPhysicsNuBeam.cc
G4HadronPhysicsQGS_BIC.cc
G4HadronPhysicsQGSP_BERT.cc
G4HadronPhysicsQGSP_BERT_HP.cc
G4HadronPhysicsQGSP_BIC.cc
G4HadronPhysicsQGSP_BIC_AllHP.cc
G4HadronPhysicsQGSP_BIC_HP.cc
G4HadronPhysicsQGSP_FTFP_BERT.cc
G4HadronPhysicsINCLXX.cc
G4HadronPhysicsShielding.cc
G4HadronPhysicsShieldingLEND.cc
G4VHadronPhysics.cc
G4HadronPhysicsQGSP_BIC_AllHP.cc)
G4URRNeutrons.cc
G4VHadronPhysics.cc)
geant4_module_link_libraries(G4phys_ctor_hinelastic
PUBLIC
@@ -0,0 +1,222 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
//
//---------------------------------------------------------------------------
//
// ClassName: G4URRNeutrons
//
// Author: Alberto Ribon - October 2024
//
// Description: Physics list constructor that can be applied on top of any
// _HP or _HPT based physics list.
// This class enables the special Unresolved Resonance Region
// (URR) treatment of low-energy neutrons based on Particle
// Table (PT).
// If this constructor is applied on top of a non-HP based
// physics list, then nothing is done (i.e. the physics list
// remains as it was originally, and a warning is printed out).
//
// Modified:
//
//----------------------------------------------------------------------------
//
#include "G4URRNeutrons.hh"
#include "G4ParticleDefinition.hh"
#include "G4ProcessManager.hh"
#include "G4HadronicProcess.hh"
#include "G4HadronicParameters.hh"
#include "G4ParticleHPElasticDataPT.hh"
#include "G4ParticleHPElasticURR.hh"
#include "G4ParticleHPCaptureDataPT.hh"
#include "G4ParticleHPCaptureURR.hh"
#include "G4ParticleHPFissionURR.hh"
#include "G4ParticleHPFissionDataPT.hh"
#include "G4ParticleHPInelasticDataPT.hh"
#include "G4ParticleHPInelasticURR.hh"
#include "G4BuilderType.hh"
#include "G4PhysListUtil.hh"
#include "G4SystemOfUnits.hh"
#include "G4PhysicsConstructorFactory.hh"
G4_DECLARE_PHYSCONSTR_FACTORY( G4URRNeutrons );
G4URRNeutrons::G4URRNeutrons( G4int ver ) : G4VHadronPhysics( "URRNeutrons", ver ) {}
G4URRNeutrons::~G4URRNeutrons() {}
void G4URRNeutrons::ConstructProcess() {
// Find elastic, capture, fission and inelastic processes of neutron
// (from the physics list on which this constructor is applied on top);
// then look at their hadronic final-state models in order to disable those that
// would otherwise fully overlap with the URR hadronic final-state models.
// Note that for disabling a hadronic model - not being defined the "DeRegister"
// method - it is enough to set to 0.0 the max energy of the model.
if ( G4HadronicParameters::Instance()->GetVerboseLevel() > 1 ) {
G4cout << "### " << GetPhysicsName() << " Construct Processes " << G4endl;
}
G4Neutron* part = G4Neutron::Neutron();
// Elastic (including, eventually, thermal scattering)
G4HadronicProcess* elasticProcess = G4PhysListUtil::FindElasticProcess( part );
if ( elasticProcess == nullptr ) {
G4cout << "### " << GetPhysicsName() << " WARNING: Fail to add URR neutron elastic treatment: "
<< "NOT found elastic process => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
G4int niElastic = static_cast< G4int >( (elasticProcess->GetHadronicInteractionList()).size() );
if ( niElastic < 1 ) {
G4cout << "### " << GetPhysicsName() << " WARNING: Fail to add URR neutron elastic treatment: "
<< "NOT found any elastic model => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
G4int indexHPelastic = -1;
G4int indexHPthermalScattering = -1;
for ( G4int index = 0; index < niElastic; ++index ) {
if ( (elasticProcess->GetHadronicInteractionList())[index]->GetModelName() == "NeutronHPElastic" ) {
indexHPelastic = index;
} else if ( (elasticProcess->GetHadronicInteractionList())[index]->GetModelName() == "NeutronHPThermalScattering" ) {
indexHPthermalScattering = index;
}
}
if ( indexHPelastic >= 0 ) {
(elasticProcess->GetHadronicInteractionList())[indexHPelastic]->SetMaxEnergy( 0.0 ); // Disabled
G4cout << G4endl << " G4URRNeutrons::ConstructProcess() : found NeutronHPElastic => Disabled !" << G4endl;
} else {
G4cout << "### " << GetPhysicsName()
<< " WARNING: NOT found NeutronHPElastic => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
G4bool isThermalScatteringOn = false;
if ( indexHPthermalScattering > 0 ) isThermalScatteringOn = true;
elasticProcess->AddDataSet( new G4ParticleHPElasticDataPT );
elasticProcess->RegisterMe( new G4ParticleHPElasticURR( isThermalScatteringOn ) );
// Capture
G4HadronicProcess* captureProcess = G4PhysListUtil::FindCaptureProcess( part );
if ( captureProcess == nullptr ) {
G4cout << "### " << GetPhysicsName() << " WARNING: Fail to add URR neutron capture treatment: "
<< "NOT found capture process => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
G4int niCapture = static_cast< G4int >( (captureProcess->GetHadronicInteractionList()).size() );
if ( niCapture < 1 ) {
G4cout << "### " << GetPhysicsName() << " WARNING: Fail to add URR neutron capture treatment: "
<< "NOT found any capture model => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
G4int indexHPcapture = -1;
for ( G4int index = 0; index < niCapture; ++index ) {
// For QGSP_BERT_HP, since G4 11.2, the neutron capture model is called either "nRadCaptureHP"
// or "nuDEX_neutronCapture" (the latter when NuDEX is used).
G4String nameNeutronCaptureModel = (captureProcess->GetHadronicInteractionList())[index]->GetModelName();
if ( nameNeutronCaptureModel == "NeutronHPCapture" ||
nameNeutronCaptureModel == "nRadCaptureHP" ||
nameNeutronCaptureModel == "nuDEX_neutronCapture" ) {
indexHPcapture = index;
}
}
if ( indexHPcapture >= 0 ) {
(captureProcess->GetHadronicInteractionList())[indexHPcapture]->SetMaxEnergy( 0.0 ); // Disabled
G4cout << G4endl << " G4URRNeutrons::ConstructProcess() : found "
<< (captureProcess->GetHadronicInteractionList())[indexHPcapture]->GetModelName()
<< " => Disabled !" << G4endl;
} else {
G4cout << "### " << GetPhysicsName()
<< " WARNING: NOT found any expected neutron capture model => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
captureProcess->AddDataSet( new G4ParticleHPCaptureDataPT );
captureProcess->RegisterMe( new G4ParticleHPCaptureURR );
// Fission
G4HadronicProcess* fissionProcess = G4PhysListUtil::FindFissionProcess( part );
if ( fissionProcess == nullptr ) {
G4cout << "### " << GetPhysicsName() << " WARNING: Fail to add URR neutron fission treatment: "
<< "NOT found fission process => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
G4int niFission = static_cast< G4int >( (fissionProcess->GetHadronicInteractionList()).size() );
if ( niFission < 1 ) {
G4cout << "### " << GetPhysicsName() << " WARNING: Fail to add URR neutron fission treatment: "
<< "NOT found any fission model => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
G4int indexHPfission = -1;
for ( G4int index = 0; index < niFission; ++index ) {
// For QGSP_BERT_HP, since G4 11.2, the neutron fission model is called "nFissionVI"
G4String nameNeutronFissionModel = (fissionProcess->GetHadronicInteractionList())[index]->GetModelName();
if ( nameNeutronFissionModel == "NeutronHPFission" || nameNeutronFissionModel == "nFissionVI" ) {
indexHPfission = index;
}
}
if ( indexHPfission >= 0 ) {
(fissionProcess->GetHadronicInteractionList())[indexHPfission]->SetMaxEnergy( 0.0 ); // Disabled
G4cout << G4endl << " G4URRNeutrons::ConstructProcess() : found "
<< (fissionProcess->GetHadronicInteractionList())[indexHPfission]->GetModelName() // Disabled
<< " => Disabled !" << G4endl;
} else {
G4cout << "### " << GetPhysicsName()
<< " WARNING: NOT found any expected neutron fission model => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
fissionProcess->RegisterMe( new G4ParticleHPFissionURR );
fissionProcess->AddDataSet( new G4ParticleHPFissionDataPT );
// Inelastic
G4HadronicProcess* inelasticProcess = G4PhysListUtil::FindInelasticProcess( part );
if ( inelasticProcess == nullptr ) {
G4cout << "### " << GetPhysicsName() << " WARNING: Fail to add URR neutron inelastic treatment: "
<< "NOT found inelastic process => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
G4int niInelastic = static_cast< G4int >( (inelasticProcess->GetHadronicInteractionList()).size() );
if ( niInelastic < 1 ) {
G4cout << "### " << GetPhysicsName() << " WARNING: Fail to add URR neutron inelastic treatment: "
<< "NOT found any inelastic model => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
G4int indexHPinelastic = -1;
for ( G4int index = 0; index < niInelastic; ++index ) {
if ( (inelasticProcess->GetHadronicInteractionList())[index]->GetModelName() == "NeutronHPInelastic" ) {
indexHPinelastic = index;
}
}
if ( indexHPinelastic >= 0 ) {
(inelasticProcess->GetHadronicInteractionList())[indexHPinelastic]->SetMaxEnergy( 0.0 ); // Disabled
G4cout << G4endl << " G4URRNeutrons::ConstructProcess() : found NeutronHPInelastic => Disabled !" << G4endl;
} else {
G4cout << "### " << GetPhysicsName()
<< " WARNING: NOT found NeutronHPInelastic => G4URRNeutrons returns without doing anything !" << G4endl;
return;
}
inelasticProcess->AddDataSet( new G4ParticleHPInelasticDataPT );
inelasticProcess->RegisterMe( new G4ParticleHPInelasticURR );
}
@@ -4,8 +4,11 @@ See `CONTRIBUTING.rst` for details of **required** info/format for each entry,
which **must** added in reverse chronological order (newest at the top). It must **not**
be used as a substitute for writing good git commit messages!
## 2023-11-09 Yoshihide Sato (phys-ctor-ions-V11-11-01)
- Add a physics constructor, G4LightIonQMDPhsysics for light ion qmd.
## 2024-11-08 Alberto Ribon (phys-ctor-ions-V11-02-00)
- G4LightIonQMDPhysics, README : updated information, no changes to the code.
## 2023-11-09 Yoshihide Sato (phys-ctor-ions-V11-01-00)
- Add a physics constructor, G4LightIonQMDPhysics for light ion QMD.
## 2021-12-10 Ben Morgan (phys-ctor-ions-V11-00-00)
- Change to new Markdown History format
+13 -2
View File
@@ -33,8 +33,8 @@
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
--------------
G4IonQMDPhysics
---------------
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
@@ -42,3 +42,14 @@
- BIC below 110 MeV/nucleon;
- QMD between 100 and 6'000 MeV/nucleon;
- FTF above 5990 MeV/nucleon.
G4IonLightIonQMDPhysics
-----------------------
A variant of G4IonQMDPhysics, in which G4LightIonQMDReaction is used
in the interval [30 MeV, 510 MeV].
These four final-state models are used in the following intervals of
projectile kinetic energy:
- BIC below 40 MeV/nucleon;
- LightIonQMD between 30 and 510 MeV/nucleon;
- QMD between 500 and 6'000 MeV/nucleon;
- FTF above 5990 MeV/nucleon.
@@ -26,10 +26,15 @@
//
//---------------------------------------------------------------------------
//
// ClassName: G4IonBinaryCascadeBuilder
// Created from G4IonBinaryCascadePhysics
// ClassName: G4LightIonQMDPhysics
//
// Author: Yoshihide Sato - November 2023
//
// Author: G.Folger
// Description: Variant of G4IonQMDPhysics in which G4LightIonQMDReaction
// is used in the interval [30 MeV, 510 MeV]/nucleon
// (G4BinaryLightIonReaction is used below 40 MeV/nucleon,
// and G4QMDReaction is used in the interval
// [500 MeV, 6 GeV]/nucleon).
//
// Modified:
//
@@ -26,10 +26,15 @@
//
//---------------------------------------------------------------------------
//
// ClassName: G4LightIonQMDPhysics
// Created from G4IonBinaryCascadePhysics
// ClassName: G4LightIonQMDPhysics
//
// Author: Yoshihide Sato - November 2023
//
// Author: G.Folger
// Description: Variant of G4IonQMDPhysics in which G4LightIonQMDReaction
// is used in the interval [30 MeV, 510 MeV]/nucleon
// (G4BinaryLightIonReaction is used below 40 MeV/nucleon,
// and G4QMDReaction is used in the interval
// [500 MeV, 6 GeV]/nucleon).
//
// Modified:
//
@@ -6,6 +6,11 @@ It must **not** be used as a substitute for writing good git commit messages!
-------------------------------------------------------------------------------
## 2024-07-18 Gabriele Cosmo (phys-ctor-limiters-V11-02-00)
- Fixed reported Coverity defect in G4FastSimulationPhysics, to use
'const G4String&' for avoiding implicit copies; in G4GenericBiasingPhysics
to use std::move().
## 2023-08-29 Ben Morgan (phys-ctor-limiters-V11-01-00)
- Fix Coverity unreachable code warning
@@ -96,7 +96,7 @@ void G4FastSimulationPhysics::ConstructProcess()
if ( itr != fParticlesUnderFastSimulation.end() )
{
std::size_t ipos = itr - fParticlesUnderFastSimulation.begin();
G4String geometry = fGeometries[ipos];
const G4String& geometry = fGeometries[ipos];
if ( geometry == "" ) G4FastSimulationHelper::ActivateFastSimulation(pmanager);
else G4FastSimulationHelper::ActivateFastSimulation(pmanager, geometry);
}
@@ -76,8 +76,7 @@ G4GenericBiasingPhysics::~G4GenericBiasingPhysics()
void G4GenericBiasingPhysics::PhysicsBias(const G4String& particleName)
{
fBiasedParticles.push_back(particleName);
std::vector< G4String > dummy;
fBiasedProcesses.push_back(dummy);
fBiasedProcesses.emplace_back();
fBiasAllProcesses.push_back(true);
}