粒子追踪在Geant4中的实现
1.问题描述
在Geant4中可以实现任意粒子的的追踪,如下图绿色的线条为粒子的每一步输运。可以获取粒子每一步的信息,以此实现特制功能,如筛选特定反应产生的伽马、某种反应生成的所有粒子,只发生一种反应的粒子等等,类似特殊需求。因此我们可以通过打印粒子的每一步信息,撰写筛选条件,实现粒子的追踪。

2.解决方案
获取当前track或step的信息,然后根据track或step提供的方法追踪粒子,接下来讲例举常用的几种方法,可以通过提供的几种方式,实现粒子信息的获取,进而根据用户自己的需求,实现具体粒子的追踪。
2.1 获取当前粒子的坐标位置:
点击查看代码
fTrack->GetPosition().x()
fTrack->GetPosition().y()
fTrack->GetPosition().z()
- 打印示例:

2.2 获取当前粒子的动量和能量沉积,其中动量是通过track获取的,而能量沉积是通过step提供的方法获取:
点击查看代码
fTrack->GetKineticEnergy()
fStep->GetTotalEnergyDeposit()
- 打印示例:

2.3 获取TrackLength或StepLength:
点击查看代码
fStep->GetStepLength()
fTrack->GetTrackLength()
- 打印示例:

2.4 获取粒子当前所在的几何体的Volume:
点击查看代码
fTrack->GetVolume()->GetName()
- 打印示例:

2.5 获取当前粒子发生的物理过程反应:
点击查看代码
const G4VProcess* process = fStep->GetPostStepPoint()->GetProcessDefinedStep();
G4String procName = " UserLimit";
if (process) procName = process->GetProcessName();
if (fStepStatus == fWorldBoundary) procName = "OutOfWorld";
- 当粒子输运到了世界,并再下一步输运出世界以后,将无法通过“fStep->GetPostStepPoint()->GetProcessDefinedStep()”方法获取当前过程,所以需要进行判断。打印示例如下,非弹性散射:

2.6 打印当前粒子生成的所有次级粒子:
点击查看代码
const std::vector<const G4Track*>* secondary = fStep->GetSecondaryInCurrentStep();
size_t nbtrk = (*secondary).size();
if (nbtrk) {
for (size_t lp=0; lp<(*secondary).size(); lp++) {do something}
- 用户可根据上述代码,在循环中打印对应次级粒子的信息,如,次级粒子的名字:
(*secondary)[lp]->GetDefinition()->GetParticleName() - 打印示例:

2.7 基于上述需求,用户也可以在Geant4其他例程中参考代码“SteppingVerbose.cc”中的程序,并将该部分添加自己的项目文件中,然后在初始化文件“ActionInitialization.cc”中添加方法,并调用,如下所示:
点击查看代码
G4VSteppingVerbose* ActionInitialization::InitializeSteppingVerbose() const
{
return new SteppingVerbose();
}
- 接着在宏文件(.mac)中,添加打印信息的程度,就可以得到每个粒子的具体的信息,为粒子的追踪奠定基础,值的注意的是当粒子较多时,打印的信息太过详细,会造成输出文件过大,因此,用户可根据需求打印信息的详细程度,数字越高,信息约详细。
/control/verbose 0
/run/verbose 1
/event/verbose 2
/tracking/verbose 2
打印示例:

3.实际应用
根据粒子追踪方法的打印,以一个中子反应过程为例
- 应用一:可以看到当前非弹产生的所有伽马,根据代码可以打印出当前Gamma;

- 应用二:锁定某个Gamma,根据ParentID追踪该Gamma产生的所有次级粒子:

次级粒子,Parent ID = 24,能量为1.502MeV的负电子为例:

本文作者:阿比西尼亚喵
文字编辑:Geant4Cat
本文链接:https://www.cnblogs.com/Geant4/articles/16469205.html
⛔转载请附上Geant4Cat的原文链接,并通过 E-mail 等方式告知,谢谢!否则举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?