File indexing completed on 2025-10-20 08:06:40
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 #include "PrimaryGeneratorAction.hh"
0027
0028 #include "ChemistryWorld.hh"
0029 #include "DetectorConstruction.hh"
0030
0031 #include "G4Electron.hh"
0032 #include "G4Event.hh"
0033 #include "G4ParticleDefinition.hh"
0034 #include "G4ParticleGun.hh"
0035 #include "G4ParticleTable.hh"
0036 #include "G4SystemOfUnits.hh"
0037 #include "G4RunManager.hh"
0038
0039
0040
0041 PrimaryGeneratorAction::PrimaryGeneratorAction()
0042 : G4VUserPrimaryGeneratorAction()
0043 {
0044 fpMessenger = std::make_unique<PrimaryGeneratorMessenger>(this);
0045 fParticleGun = std::make_unique<G4SingleParticleSource>();
0046 G4ParticleDefinition* particle = G4Electron::Definition();
0047 fParticleGun->SetParticleDefinition(particle);
0048 fParticleGun->SetNumberOfParticles(1000000);
0049
0050 auto pPosDist = fParticleGun->GetPosDist();
0051 pPosDist->SetPosDisType("Plane");
0052 pPosDist->SetPosDisShape("Square");
0053 const auto* fpDetector = dynamic_cast<const DetectorConstruction*>(
0054 G4RunManager::GetRunManager()->GetUserDetectorConstruction());
0055 auto faceSiez = fpDetector->GetChemistryWorld()->GetChemistryBoundary()->halfSideLengthInY();
0056 pPosDist->SetCentreCoords(G4ThreeVector(0, 0, -faceSiez));
0057 pPosDist->SetHalfX(faceSiez);
0058 pPosDist->SetHalfY(faceSiez);
0059
0060 auto pAngleDist = fParticleGun->GetAngDist();
0061 pAngleDist->SetParticleMomentumDirection(G4ThreeVector(0., 0., 1.));
0062
0063 auto pEnergyDis = fParticleGun->GetEneDist();
0064 pEnergyDis->SetMonoEnergy(0.9999 * MeV);
0065 }
0066
0067
0068
0069 void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
0070 {
0071 G4ParticleDefinition* particle = fParticleGun->GetParticleDefinition();
0072 auto NumberOfParticlesToBeGenerated = fParticleGun->GetNumberOfParticles();
0073 auto pPosDist = fParticleGun->GetPosDist();
0074 auto pAngleDist = fParticleGun->GetAngDist();
0075 auto pEnDist = fParticleGun->GetEneDist();
0076 auto rnd = fParticleGun->GetBiasRndm();
0077 auto charge = particle->GetPDGCharge();
0078
0079 for (G4int i = 0; i < NumberOfParticlesToBeGenerated; i++) {
0080 auto angle = pAngleDist->GenerateOne();
0081 auto energy = pEnDist->GenerateOne(particle);
0082 auto pos = pPosDist->GenerateOne();
0083 auto mass = particle->GetPDGMass();
0084 auto p = new G4PrimaryParticle(particle);
0085 auto vertex = new G4PrimaryVertex(pos, 0);
0086 p->SetKineticEnergy(energy);
0087 p->SetMass(mass);
0088 p->SetMomentumDirection(angle);
0089 p->SetCharge(charge);
0090 p->SetPolarization(0., 0., 0.);
0091
0092 G4double weight = pEnDist->GetWeight() * rnd->GetBiasWeight();
0093 p->SetWeight(weight);
0094 vertex->SetPrimary(p);
0095 anEvent->AddPrimaryVertex(vertex);
0096 }
0097 }
0098
0099