Geant4 PrimaryGeneratorAction 中的粒子源定义琐记

一般定义简单源

整体结构
PrimaryGeneratorAction::PrimaryGeneratorAction()
: G4VUserPrimaryGeneratorAction(),fParticleGun(0)
{
  G4int n_particle = 1;
  fParticleGun  = new G4ParticleGun(n_particle);

  // default particle kinematic
  
  G4ParticleDefinition* particle = G4ParticleTable::GetParticleTable()->FindParticle("proton");//gamma,neutron等
  fParticleGun->SetParticleDefinition(particle);
  fParticleGun->SetParticleMomentumDirection(G4ThreeVector(0.,0.,1));
  fParticleGun->SetParticleEnergy(7.*MeV);
  fParticleGun->SetParticlePosition(G4ThreeVector(0.*cm,0.*cm,-1.*cm));
}

PrimaryGeneratorAction::~PrimaryGeneratorAction()
{
  delete fParticleGun;
}
  • 此部分为PrimaryGenerationAction的构造函数和析构函数
  • PrimaryGeneratorAction::PrimaryGeneratorAction(): G4VUserPrimaryGeneratorAction(),fParticleGun(0) 中需注意fParticleGun(0)部分
  • .hh中声明 G4ParticleGun* GetParticleGun() {return fParticleGun;};G4ParticleGun* fParticleGun;
GeneratePrimaries 函数

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

//更详细的粒子源定义,如果不需要可以不填写

  fParticleGun->GeneratePrimaryVertex(anEvent);
}
  • 此部分需注意在.hh中声明 virtual void GeneratePrimaries(G4Event*);
  • 以下为可以在该函数中添加的源相关描述
粒子类型
// code to get pre-defined particle
G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
G4ParticleDefinition* fGamma = particleTable->FindParticle("gamma"),
	fElec = particleTable->FindParticle("e-"),
	fNeut = particleTable->FindParticle("neutron"),
	fProt = particleTable->FindParticle("proton");

粒子源其他的具体描述

随机数抽样
#include"Randomize.hh"
// THE MOST IMPORTANT ONE
// uniform random number in [0,1]
G4double u = G4UniformRand();

// other distributions
G4double uGauss = G4RandGauss::shoot(mu,sigma);
G4double uExpo = G4RandExponential::shoot(mean);
G4double uFlat = G4RandFlat::shoot(a, b);
  • 符合各种标准分布的随机数抽样描述在Randomize.hh
示例
//圆形面源均匀分布。无分散,即方向沿z方向
  G4double size = 1 * mm;//源半径
  G4double r = size * (G4UniformRand());
  G4double theta = 2.*3.14159265*G4UniformRand();
  G4double x0 = r * cos(theta);
  G4double y0 = r * sin(theta);
  G4double z0 = -10.*mm;
  
  fParticleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0));
//方形面源均匀分布。无分散,即方向沿z方向
  G4double size = 0.01 * mm;//源的边长
  G4double x0 = size * (G4UniformRand()-0.5);//因为size是边长,所以使用抽样函数时-0.5!
  G4double y0 = size * (G4UniformRand()-0.5);
  G4double z0 = -4000.*mm;
  
  fParticleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0));
//定义发散角
  G4ThreeVector pDir(0, 0, 1);//向z正方向,定义一个单位长度的向量
  pDir.setTheta(0.5*degree*G4UniformRand());//球坐标的theta:[0,180],也可以使用rad单位
  pDir.setPhi(360*degree*G4UniformRand());//球坐标的phi:[0,360],也可以使用rad单位
  
  fParticleGun->SetParticleMomentumDirection(pDir);
//各向同性源
G4double cosTheta = 2*G4UniformRand() - 1., 
phi = 2.*3.14159265*G4UniformRand()
G4double sinTheta = std::sqrt(1. - cosTheta*cosTheta)
G4double ux = sinTheta*std::cos(phi),
         uy = sinTheta*std::sin(phi),
         uz = cosTheta;
         
fParticleGun->SetParticleMomentumDirection(G4ThreeVector(ux,uy,uz));
//粒子位置高斯分布
G4double muP = 0.*mm;//中心值
G4double sigmaP = 2.*mm;//标准差
G4double x0 =  G4RandGauss::shoot(muP,sigmaP) ;//高斯抽样
G4double y0 = G4RandGauss::shoot(muP,sigmaP) ;
G4double z0 = -10.*mm;

fParticleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0));
//能量--高斯分布
G4double muE = 7.*MeV;//中心值
G4double sigmaE = 0.01395 *MeV;//标准差
G4double eng = G4RandGauss::shoot(muE,sigmaE);//高斯抽样

fParticleGun->SetParticleEnergy(eng);
  • 6
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
Geant4 ,可以通过实现 G4SteppingVerbose 类来获取二次粒子的信息。这个类是 Geant4 用于输出每一步模拟信息的基类。你可以继承 G4SteppingVerbose 类并覆盖其成员函数,以输出你需要的信息。 以下是一个简单的例子,演示了如何获取二次粒子的信息: ```cpp #include "G4SteppingVerbose.hh" #include "G4Track.hh" class MySteppingVerbose: public G4SteppingVerbose { public: void TrackingStarted() override { G4SteppingVerbose::TrackingStarted(); G4Track* track = fpSteppingManager->GetTrack(); G4cout << "Primary particle: " << track->GetDefinition()->GetParticleName() << G4endl; } void StepInfo() override { G4SteppingVerbose::StepInfo(); const G4Step* step = fpSteppingManager->GetStep(); G4Track* track = fpSteppingManager->GetTrack(); if (track->GetCurrentStepNumber() == 1) { G4cout << "Secondary particle: " << step->GetSecondary()->at(0)->GetDefinition()->GetParticleName() << G4endl; } } }; int main() { // ... MySteppingVerbose* mySteppingVerbose = new MySteppingVerbose(); runManager->SetUserVerbose(mySteppingVerbose); // ... return 0; } ``` 在上面的例子,我们继承了 G4SteppingVerbose 类,并覆盖了其的 TrackingStarted() 和 StepInfo() 函数。TrackingStarted() 函数在开始跟踪一个粒子时调用,我们在这里输出了主粒子的信息。StepInfo() 函数在每一步结束后调用,我们在这里判断当前步骤是否为第一步,如果是,则输出第一个二次粒子的信息。 注意,为了使用自定义的 G4SteppingVerbose 类,我们需要在创建 G4RunManager 对象之后,调用 SetUserVerbose() 函数,将其设置为用户定义的详细模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值