2.6.  How to Generate a Primary Event

2.6.1.  Generating Primary Events

G4VuserPrimaryGeneratorAction is one of the mandatory classes available for deriving your own concrete class. In your concrete class, you have to specify how a primary event should be generated. Actual generation of primary particles will be done by concrete classes of G4VPrimaryGenerator, explained in the following sub-section. Your G4VUserPrimaryGeneratorAction concrete class just arranges the way primary particles are generated.

Example 2.17.  An example of a G4VUserPrimaryGeneratorAction concrete class using G4ParticleGun. For the usage of G4ParticleGun refer to the next subsection.

ExG4PrimaryGeneratorAction01.hh
#ifndef ExG4PrimaryGeneratorAction01_h
#define ExG4PrimaryGeneratorAction01_h 1

#include "G4VUserPrimaryGeneratorAction.hh"
#include "G4ThreeVector.hh"
#include "globals.hh"

class G4ParticleGun;
class G4Event;

class ExG4PrimaryGeneratorAction01 : public G4VUserPrimaryGeneratorAction
{
  public:
    ExG4PrimaryGeneratorAction01(
      const G4String& particleName = "geantino",
      G4double energy = 1.*MeV,
      G4ThreeVector position= G4ThreeVector(0,0,0),
      G4ThreeVector momentumDirection = G4ThreeVector(0,0,1));    
    ~ExG4PrimaryGeneratorAction01();

    // methods
    virtual void GeneratePrimaries(G4Event*);

  private:
    // data members
    G4ParticleGun*  fParticleGun; //pointer a to G4 service class
};

#endif
ExG4PrimaryGeneratorAction01.cc
#include "ExG4PrimaryGeneratorAction01.hh"

#include "G4Event.hh"
#include "G4ParticleGun.hh"
#include "G4ParticleTable.hh"
#include "G4ParticleDefinition.hh"

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

ExG4PrimaryGeneratorAction01::ExG4PrimaryGeneratorAction01(      
                                const G4String& particleName, 
                                G4double energy,
                                G4ThreeVector position, 
                                G4ThreeVector momentumDirection)
  : G4VUserPrimaryGeneratorAction(),
    fParticleGun(0)
{
  G4int nofParticles = 1;
  fParticleGun  = new G4ParticleGun(nofParticles);

  // default particle kinematic
  G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
  G4ParticleDefinition* particle
    = particleTable->FindParticle(particleName);
  fParticleGun->SetParticleDefinition(particle);
  fParticleGun->SetParticleEnergy(energy);
  fParticleGun->SetParticlePosition(position);
  fParticleGun->SetParticleMomentumDirection(momentumDirection);
}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

ExG4PrimaryGeneratorAction01::~ExG4PrimaryGeneratorAction01()
{
  delete fParticleGun;
}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

void ExG4PrimaryGeneratorAction01::GeneratePrimaries(G4Event* anEvent)
{
  // this function is called at the begining of event

  fParticleGun->GeneratePrimaryVertex(anEvent);
}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......


2.6.1.1.  Selection of the generator

In the constructor of your G4VUserPrimaryGeneratorAction, you should instantiate the primary generator(s). If necessary, you need to set some initial conditions for the generator(s).

In Example 2.17, G4ParticleGun is constructed to use as the actual primary particle generator. Methods of G4ParticleGun are described in the following section. Please note that the primary generator object(s) you construct in your G4VUserPrimaryGeneratorAction concrete class must be deleted in your destructor.

2.6.1.2.  Generation of an event

G4VUserPrimaryGeneratorAction has a pure virtual method named generatePrimaries(). This method is invoked at the beginning of each event. In this method, you have to invoke the G4VPrimaryGenerator concrete class you instantiated via the generatePrimaryVertex() method.

You can invoke more than one generator and/or invoke one generator more than once. Mixing up several generators can produce a more complicated primary event.

2.6.2.  G4VPrimaryGenerator

Geant4 provides three G4VPrimaryGenerator concrete classes. Among these G4ParticleGun and G4GeneralParticleSource will be discussed here. The third one is G4HEPEvtInterface, which will be discussed in Section 3.6.

2.6.2.1.  G4ParticleGun

G4ParticleGun is a generator provided by Geant4. This class generates primary particle(s) with a given momentum and position. It does not provide any sort of randomizing. The constructor of G4ParticleGun takes an integer which causes the generation of one or more primaries of exactly same kinematics. It is a rather frequent user requirement to generate a primary with randomized energy, momentum, and/or position. Such randomization can be achieved by invoking various set methods provided by G4ParticleGun. The invocation of these methods should be implemented in the generatePrimaries() method of your concrete G4VUserPrimaryGeneratorAction class before invoking generatePrimaryVertex() of G4ParticleGun. Geant4 provides various random number generation methods with various distributions (see Section 3.2).

2.6.2.2.  Public methods of G4ParticleGun

The following methods are provided by G4ParticleGun, and all of them can be invoked from the generatePrimaries() method in your concrete G4VUserPrimaryGeneratorAction class.

  • void SetParticleDefinition(G4ParticleDefinition*)

  • void SetParticleMomentum(G4ParticleMomentum)

  • void SetParticleMomentumDirection(G4ThreeVector)

  • void SetParticleEnergy(G4double)

  • void SetParticleTime(G4double)

  • void SetParticlePosition(G4ThreeVector)

  • void SetParticlePolarization(G4ThreeVector)

  • void SetNumberOfParticles(G4int)

2.6.2.3.  G4GeneralParticleSource

For many applications G4ParticleGun is a suitable particle generator. However if you want to generate primary particles in more sophisticated manner, you can utilize G4GeneralParticleSource - Geant4 General Particle Source module (GPS).

Using this tool, you can control the following characteristics of primary particles:

  • Spectrum: linear, exponential, power-law, Gaussian, blackbody, or piece-wise fits to data.

  • Angular distribution: unidirectional, isotropic, cosine-law, beam or arbitrary (user defined).

  • Spatial sampling: on simple 2D or 3D surfaces such as discs, spheres, and boxes.

  • Multiple sources: multiple independent sources can be used in the same run.

Details of information on the General Source Particle Module can be found in the documents Geant4 General Particle Source.