G4VuserPhysicsList
is one of the mandatory user base
classes described in
Section 2.1.
Within this class all particles and physics processes to be used in
your simulation must be defined. The range cut-off parameter should
also be defined in this class.
The user must create a class derived from
G4VuserPhysicsList
and implement the following pure
virtual methods:
ConstructParticle(); // construction of particles ConstructProcess(); // construct processes and register them to particles SetCuts(); // setting a range cut value for all particles
This section provides some simple examples of the
ConstructParticle()
and SetCuts()
methods.
For information on ConstructProcess()
methods, please see
Section 2.5.
Geant4 provides various types of particles for use in simulations:
ordinary particles, such as electrons, protons, and gammas
resonant particles with very short lifetimes, such as vector mesons and delta baryons
nuclei, such as deuteron, alpha, and heavy ions (including hyper-nuclei)
quarks, di-quarks, and gluon
Each particle is represented by its own class, which is derived
from G4ParticleDefinition
.
(Exception: G4Ions represents all heavy nuclei. Please see
Section 5.3.)
Particles are organized into six major categories:
lepton,
meson,
baryon,
boson,
shortlived and
ion,
each of which is defined in a corresponding sub-directory under
geant4/source/particles
. There is also a corresponding
granular library for each particle category.
G4ParticleDefinition
has properties which characterize
individual particles, such as, name, mass, charge, spin, and so on.
Most of these properties are "read-only" and can not be changed by
users without rebuilding the libraries.
Each particle class type represents an individual particle type, and each class has a single object. This object can be accessed by using the static method of each class. There are some exceptions to this rule; please see Section 5.3 for details.
For example, the class G4Electron
represents the
electron and the member G4Electron::theInstance
points its only object.
The pointer to this object is available
through the static methods
G4Electron::ElectronDefinition()
.
G4Electron::Definition()
.
More than 100 types of particles are provided by default, to be used in various physics processes. In normal applications, users will not need to define their own particles.
Because particles are static objects of individual particle classes, these objects are instantiated when the static method getting the pointer is invoked at the first time Therefore, you must explicitly declare the particle classes required by your program at the initialization step, otherwise no particles will be instantiated.
The G4ParticleTable
class is provided as a dictionary of
particles. Various utility methods are provided, such as:
FindParticle(G4String name); // find the particle by name FindParticle(G4int PDGencoding) // find the particle by PDG encoding .
G4ParticleTable
is defined as a singleton object,
and the static method G4ParticleTable::GetParticleTable()
provides its pointer.
As for heavy ions (including hyper-nuclei), objects are created
dynamically by requests from users and processes.
The G4ParticleTable
class provides
methods to create ions, such as:
G4ParticleDefinition* GetIon( G4int atomicNumber, G4int atomicMass, G4double excitationEnergy);
Particles are registered automatically during construction. The user has no control over particle registration.
ConstructParticle()
is a pure virtual method, in which
the static member functions for all the particles you require should be called.
This ensures that objects of these particles are created.
WARNING: You must define "All PARTICLE TYPES" which are used in your application, except for heavy ions. "All PARTICLE TYPES" means not only primary particles, but also all other particles which may appear as secondaries generated by physics processes you use. Beginning with Geant4 version 8.0, you should keep this rule strictly because all particle definitions are revised to "non-static" objects.
For example, suppose you need a proton and a geantino, which is
a virtual particle used for simulation and which does not interact
with materials. The ConstructParticle()
method is
implemented as below:
Example 2.12. Construct a proton and a geantino.
void ExN01PhysicsList::ConstructParticle() { G4Proton::ProtonDefinition(); G4Geantino::GeantinoDefinition(); }
Due to the large number of pre-defined particles in Geant4, it is cumbersome to list all the particles by this method. If you want all the particles in a Geant4 particle category, there are six utility classes, corresponding to each of the particle categories, which perform this function:
G4BosonConstructor
G4LeptonConstructor
G4MesonConstructor
G4BarionConstructor
G4IonConstructor
G4ShortlivedConstructor
.
An example of this is shown in ExN05PhysicsList
,
listed below.
Example 2.13. Construct all leptons.
void ExN05PhysicsList::ConstructLeptons() { // Construct all leptons G4LeptonConstructor pConstructor; pConstructor.ConstructParticle(); }
To avoid infrared divergence, some electromagnetic processes
require a threshold below which no secondary will be generated.
Because of this requirement, gammas, electrons and positrons
require production thresholds which the user should define. This
threshold should be defined as a distance, or range cut-off, which
is internally converted to an energy for individual materials. The
range threshold should be defined in the initialization phase using
the SetCuts()
method of G4VUserPhysicsList
.
Section 5.5 discusses threshold and tracking
cuts in detail.
Production threshold values should be defined in SetCuts()
which is a pure virtual method of the G4VUserPhysicsList
class. Construction of particles, materials, and processes should
precede the invocation of SetCuts()
. G4RunManager
takes care of this sequence in usual applications.
The idea of a "unique cut value in range" is one of the important features of Geant4 and is used to handle cut values in a coherent manner. For most applications, users need to determine only one cut value in range, and apply this value to gammas, electrons and positrons alike.
In such a case, the SetCutsWithDefault()
method may be
used. It is provided by the G4VuserPhysicsList
base class,
which has a defaultCutValue
member as the default range
cut-off value. SetCutsWithDefault()
uses this value.
It is possible to set different range cut values for gammas, electrons and positrons, and also to set different range cut values for each geometrical region. In such cases however, one must be careful with physics outputs because Geant4 processes (especially energy loss) are designed to conform to the "unique cut value in range" scheme.
Example 2.14. Set cut values by using the default cut value.
void ExN04PhysicsList::SetCuts() { // the G4VUserPhysicsList::SetCutsWithDefault() method sets // the default cut value for all particle types SetCutsWithDefault(); }
The defaultCutValue
is set to 1.0 mm by default. Of
course, you can set the new default cut value in the constructor of
your physics list class as shown below.
Example 2.15. Set the default cut value.
ExN04PhysicsList::ExN04PhysicsList(): G4VUserPhysicsList() { // default cut value (1.0mm) defaultCutValue = 1.0*mm; }
The SetDefaultCutValue()
method in
G4VUserPhysicsList
may also be used, and the "/run/setCut"
command may be used to change the default cut value
interactively.
WARNING: DO NOT change cut values inside the event loop. Cut values may however be changed between runs.
An example implementation of SetCuts()
is shown
below:
Example 2.16.
Example implementation of the SetCuts()
method.
void ExN03PhysicsList::SetCuts() { // set cut values for gamma at first and for e- second and next for e+, // because some processes for e+/e- need cut values for gamma SetCutValue(cutForGamma, "gamma"); SetCutValue(cutForElectron, "e-"); SetCutValue(cutForElectron, "e+"); }
Beginning with Geant4 version 5.1, it is now possible to set production thresholds for each geometrical region. This new functionality is described in Section 5.5.