File indexing completed on 2026-04-08 07:53:13
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 "F01PrimaryGeneratorAction.hh"
0030
0031 #include "F01DetectorConstruction.hh"
0032 #include "F01PrimaryGeneratorMessenger.hh"
0033
0034 #include "G4Event.hh"
0035 #include "G4ParticleDefinition.hh"
0036 #include "G4ParticleGun.hh"
0037 #include "G4ParticleTable.hh"
0038 #include "G4PhysicalConstants.hh"
0039 #include "G4SystemOfUnits.hh"
0040 #include "Randomize.hh"
0041
0042
0043
0044 G4ParticleDefinition* F01PrimaryGeneratorAction::fgPrimaryParticle = nullptr;
0045
0046
0047
0048 F01PrimaryGeneratorAction::F01PrimaryGeneratorAction(F01DetectorConstruction* det) : fDetector(det)
0049 {
0050 G4int n_particle = 1;
0051 fParticleGun = new G4ParticleGun(n_particle);
0052
0053
0054 fGunMessenger = new F01PrimaryGeneratorMessenger(this);
0055
0056
0057
0058 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
0059 G4String particleName;
0060 G4ParticleDefinition* particle = particleTable->FindParticle(particleName = "e-");
0061 fParticleGun->SetParticleDefinition(particle);
0062
0063 fgPrimaryParticle = particle;
0064
0065 fParticleGun->SetParticleMomentumDirection(G4ThreeVector(0., 0., -1.));
0066 fParticleGun->SetParticleEnergy(0.5 * GeV);
0067
0068 fZVertex = fDetector->GetAbsorberZpos() - 0.5 * (fDetector->GetAbsorberThickness());
0069 fParticleGun->SetParticlePosition(G4ThreeVector(fXVertex, fYVertex, fZVertex));
0070 }
0071
0072
0073
0074 F01PrimaryGeneratorAction::~F01PrimaryGeneratorAction()
0075 {
0076 delete fParticleGun;
0077 delete fGunMessenger;
0078 }
0079
0080
0081
0082 void F01PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
0083 {
0084
0085
0086 fgPrimaryParticle = fParticleGun->GetParticleDefinition();
0087
0088 G4double x0, y0, z0;
0089 if (fVertexDefined) {
0090 x0 = fXVertex;
0091 y0 = fYVertex;
0092 z0 = fZVertex;
0093 }
0094 else {
0095 x0 = 0.;
0096 y0 = 0.;
0097 z0 = fDetector->GetAbsorberZpos() - 0.5 * (fDetector->GetAbsorberThickness());
0098 }
0099
0100 G4double r0, phi0;
0101 if (fRndmFlag == "on") {
0102 r0 = (fDetector->GetAbsorberRadius()) * std::sqrt(G4UniformRand());
0103 phi0 = twopi * G4UniformRand();
0104 x0 = r0 * std::cos(phi0);
0105 y0 = r0 * std::sin(phi0);
0106 }
0107
0108 fParticleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0));
0109 fParticleGun->GeneratePrimaryVertex(anEvent);
0110 }
0111
0112
0113
0114 G4String F01PrimaryGeneratorAction::GetPrimaryName()
0115 {
0116 return fgPrimaryParticle->GetParticleName();
0117 }
0118
0119
0120
0121 void F01PrimaryGeneratorAction::SetZVertex(G4double z)
0122 {
0123 fVertexDefined = true;
0124 fZVertex = z;
0125 G4cout << " Z coordinate of the primary vertex = " << fZVertex / mm << " mm." << G4endl;
0126 }
0127
0128
0129
0130 void F01PrimaryGeneratorAction::SetXVertex(G4double x)
0131 {
0132 fVertexDefined = true;
0133 fXVertex = x;
0134 G4cout << " X coordinate of the primary vertex = " << fXVertex / mm << " mm." << G4endl;
0135 }
0136
0137
0138
0139 void F01PrimaryGeneratorAction::SetYVertex(G4double y)
0140 {
0141 fVertexDefined = true;
0142 fYVertex = y;
0143 G4cout << " Y coordinate of the primary vertex = " << fYVertex / mm << " mm." << G4endl;
0144 }
0145
0146