#include "PrimaryGeneratorAction.hh" #include "G4Box.hh" #include "G4LogicalVolume.hh" #include "G4LogicalVolumeStore.hh" #include "G4ParticleDefinition.hh" #include "G4ParticleGun.hh" #include "G4ParticleTable.hh" #include "G4RunManager.hh" #include "G4SystemOfUnits.hh" #include "Randomize.hh" namespace B1 { PrimaryGeneratorAction::PrimaryGeneratorAction() { // 初始化粒子枪,每个 event 有 n_particle 个粒子 G4int n_particle = 1; fParticleGun = new G4ParticleGun(n_particle); // default particle kinematic // 粒子列表的查找器 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); // 设置为 6 MeV 沿 z 轴正方向的 gamma 源 G4ParticleDefinition* particle = particleTable->FindParticle("gamma"); fParticleGun->SetParticleDefinition(particle); fParticleGun->SetParticleMomentumDirection(G4ThreeVector(0., 0., 1.)); fParticleGun->SetParticleEnergy(6. * MeV); } PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; } // 每次 event 调用一次 this function is called at the begining of ecah event // 可以设置粒子能谱分布、角度分布、源的位置分布 void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { G4double envSizeXY = 0; G4double envSizeZ = 0; // 避免引入 DetectorConstruction 类 // 从 G4LogicalVolumeStore 获取 Envelope volume if (!fEnvelopeBox) { G4LogicalVolume* envLV = G4LogicalVolumeStore::GetInstance()->GetVolume("Envelope"); if (envLV) fEnvelopeBox = dynamic_cast(envLV->GetSolid()); } // 获取几何参数 if (fEnvelopeBox) { envSizeXY = fEnvelopeBox->GetXHalfLength() * 2.; envSizeZ = fEnvelopeBox->GetZHalfLength() * 2.; } else { G4ExceptionDescription msg; msg << "Envelope volume of box shape not found.\n"; msg << "Perhaps you have changed geometry.\n"; msg << "The gun will be place at the center."; G4Exception("PrimaryGeneratorAction::GeneratePrimaries()", "MyCode0002", JustWarning, msg); } // 几何参数用于调整源的空间分布 G4double size = 0.8; G4double x0 = size * envSizeXY * (G4UniformRand() - 0.5); G4double y0 = size * envSizeXY * (G4UniformRand() - 0.5); G4double z0 = -0.5 * envSizeZ; fParticleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0)); // 设置此次发射的位置 fParticleGun->GeneratePrimaryVertex(anEvent); // 发射粒子 } } // namespace B1