File indexing completed on 2025-01-18 09:16:36
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #include "FAPrimaryGeneratorAction.hh"
0030 #include "G4LogicalVolumeStore.hh"
0031 #include "G4LogicalVolume.hh"
0032 #include "G4Box.hh"
0033 #include "G4RunManager.hh"
0034 #include "G4ParticleGun.hh"
0035 #include "G4ParticleTable.hh"
0036 #include "G4ParticleDefinition.hh"
0037 #include "G4SystemOfUnits.hh"
0038 #include "Randomize.hh"
0039
0040 PrimaryGeneratorAction::PrimaryGeneratorAction()
0041 : G4VUserPrimaryGeneratorAction(), fParticleGun(nullptr), fWorldBox(nullptr)
0042 {
0043 G4int n_particle = 1;
0044 fParticleGun = new G4ParticleGun(n_particle);
0045
0046
0047 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
0048 G4String particleName;
0049 G4ParticleDefinition* particle
0050 = particleTable->FindParticle(particleName="proton");
0051 fParticleGun->SetParticleDefinition(particle);
0052 fParticleGun->SetParticleMomentumDirection(G4ThreeVector(0.,0.,1.));
0053 fParticleGun->SetParticleEnergy(50.*MeV);
0054 }
0055
0056 PrimaryGeneratorAction::~PrimaryGeneratorAction()
0057 {
0058 delete fParticleGun;
0059 }
0060
0061 void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
0062 {
0063 G4double worldSizeXY = 0;
0064 G4double worldSizeZ = 0;
0065
0066 if (!fWorldBox)
0067 {
0068 G4LogicalVolume* worldLV
0069 = G4LogicalVolumeStore::GetInstance()->GetVolume("World");
0070 if ( worldLV ) fWorldBox = dynamic_cast<G4Box*>(worldLV->GetSolid());
0071 }
0072 if ( fWorldBox )
0073 {
0074 worldSizeXY = fWorldBox->GetXHalfLength()*2.;
0075 worldSizeZ = fWorldBox->GetZHalfLength()*2.;
0076 }
0077 else
0078 {
0079 G4ExceptionDescription msg;
0080 msg << "World volume of box shape not found.\n";
0081 msg << "Perhaps you have changed geometry.\n";
0082 msg << "The gun will be place at the center.";
0083 G4Exception("PrimaryGeneratorAction::GeneratePrimaries()",
0084 "MyCode0002",JustWarning,msg);
0085 }
0086
0087
0088 G4double sigma = worldSizeXY/10.0;
0089 G4double x0 = G4RandGauss::shoot(0,sigma);
0090 G4double y0 = G4RandGauss::shoot(0,sigma);
0091 G4double z0 = 0.95 * (-0.5) * worldSizeZ;
0092
0093 fParticleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0));
0094 fParticleGun->GeneratePrimaryVertex(anEvent);
0095 }
0096