Geant4 Isotope Production Models
--------------------------------
As of January 2012, the use of the isotope production models had been
largely superseded, as most inelastic models automatically place the
residual nucleus on the final state stack where it is readily available
to users. Exceptions are the Low Energy Parameterized (LEP) models
which do not create residual nuclei. As a result, the isotope
production models are now used only in conjunction with the LEP models,
and the infrastructure for isotope production has been moved from the
process level (G4HadronicProcess) to the model level
(G4InelasticInteraction).
Physics List
------------
As before, isotope production can be invoked from the physics list, but
with some changes. To enable isotope production, your physics list must
have the following lines:
for neutrons:
if (particleName == "neutron") {
G4NeutronInelasticProcess* theInelasticProcess =
new G4NeutronInelasticProcess();
G4LENeutronInelastic* theLEInelasticModel = new G4LENeutronInelastic;
// Turn on isotope production
theLEInelasticModel->TurnOnIsotopeProduction();
G4NeutronIsotopeProduction* aProductionModel =
new G4NeutronIsotopeProduction();
// Assign a specific model to handle production
theLEInelasticModel->RegisterIsotopeProductionModel(aProductionModel);
theInelasticProcess->RegisterMe(theLEInelasticModel);
pmanager->AddDiscreteProcess(theInelasticProcess);
}
The line
theLEInelasticModel->TurnOnIsotopeProduction();
activates for the neutron inelastic model the generic isotope production
based on the incident particle, target nucleus and produced secondaries.
It is valid for all incident energies, but does not take into account the
detailed production cross sections found, for example, in G4NDL.
If you have an improved model, for example G4NeutronIsotopeProduction,
it can be added in the subsequent lines:
G4NeutronIsotopeProduction* aProductionModel =
new G4NeutronIsotopeProduction();
theLEInelasticModel->RegisterIsotopeProductionModel(aProductionModel);
Within its energy range of validity, this model will now override the
generic model. Outside that range, the generic model again takes over.
The G4NeutronIsotopeProduction model depends on the G4NDL database so you
must set the environment variable G4NEUTRONHPDATA to point to it.
A similar procedure must be followed for each low energy parameterized
model you wish to enable for isotope production, for example
G4LENeutronInelastic
G4LEProtonInelastic
G4LEPionPlusInelastic
...
...
Currently Geant4 provides only one detailed isotope production model that
applies to incident neutrons, as well as a prototype for protons. Others
must be developed by users.
Stepping Action
---------------
The user's SteppingAction must also be modified to include the headers
#include "G4IsoParticleChange.hh"
#include "G4InelasticInteraction.hh"
and to add some output lines to
void MySteppingAction::UserSteppingAction(const G4Step* theStep).
An example would be:
G4String procName =
theStep->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName();
if (procName == "NeutronInelastic" || procName == "ProtonInelastic") {
// Look only when neutron or proton initiated the isotope production
G4IsoParticleChange* isotopeProdInfo =
G4InelasticInteraction::GetIsotopeProductionInfo();
if (isotopeProdInfo) {
// Be sure that an isotope was created
G4cout << " Production model: " << isotopeProdInfo->GetProducer() << G4endl;
G4cout << " target nucleus (A,Z) : "
<< isotopeProdInfo-> GetMotherNucleus().GetA_asInt() << " , "
<< isotopeProdInfo-> GetMotherNucleus().GetZ_asInt() << G4endl;
G4cout << " produced isotope: " << isotopeProdInfo-> GetIsotope() << G4endl;
G4cout << " production time: " << isotopeProdInfo->GetProductionTime() << G4endl;
G4cout << " parent particle: " << isotopeProdInfo->GetParentParticle()->GetParticleName()
}
}