这部分讲解用户类的内容,此部分内容是Geant4使用的基础,详细说明程序的架构、各部分的依赖关系。请务必认真学习。
开始使用Genat4,你必须了解:
Geant4是一个软件包,他不是一个直接可以运行的可执行程序,你应该基于这个软件包编译一个可执行程序。如下图,Geant4的软件包下载完,解压之后可以看到,Geant4的源代码目录下是没有一个双击就能直接运行的可执行程序。例如在windows平台上扩展名为.exe .bat .vbs等,都是可双击直接运行的程序。
要生成一个可执行程序,首先需要:
—定义几何体的设置参数
包括材料、体积;如NaI(材料),2英寸晶体(体积)
—定义需要使用的物理过程
粒子源模型(如各向同性、平行入射)、物理过程/物理模型(如Penelope过程,适用于γ射线与物质相互作用)
产物阈值
—定义怎样开始一个event
初级粒子发生器
— 提取一些对你有用的信息(基于你自己的模拟场景,可以输出一些有用的模拟结果信息,如全能峰探测效率)
你也可以实现如下功能:
—可视化几何体、粒子轨迹、物理数据输出(如在界面上直接显示粒子能量沉积)
—应用(图形)用户界面
—自定义用户界面命令
—等等,C++提供很多接口,可以自己开发,将来可结合云平台,人工智能筛选模型,达到最佳模拟结果等,这些以后都可以开发。
用户类
main()
main() 函数是C++语言的程序入口,但是Geant4 工具包本身不提供main()函数
初始化类
—使用G4RunManager::SetUserInitialization()来定义。
—初始化需要引用下列三个类
G4VUserDetectorConstruction ,这个类用于初始化探测器构建
G4VUserPhysicsList ,这个类用于初始化定义的物理过程
G4VUserActionInitialization,这个类用于初始化行为类,就像你是导演,来编写Geant4程序,然后大喊一声:ACTION!程序就开始运行啦。
行为类
—在用户自己编写的G4VUserActionInitialization实例化(实例化为C++语言的知识。使用类生成对象的过程叫实例化。)
—在一个event循环内引用
G4VUserPrimaryGeneratorAction,这个类用于设置粒子源
G4UserRunAction,这个类用于设置run的运行行为
G4UserEventAction,这个类用于设置event的运行行为
G4UserStackingAction,这个类设置堆栈的运行行为
G4UserTrackingAction,这个类用于设置追踪行为
G4UserSteppingAction,这个类用于设置step运行行为
注意:红色的字体的类是强制的,是程序运行必须有的类。
主程序
Geant4工具包不提供main()函数。
用户需要自己创建一个main()函数,并在这个函数内做如下操作:
— 创建G4RunManager类(串行模式模式)或者G4MTRunManager(多线程模式),现在4.10版以后增加了多线程功能,在安装时基本都通过设置DGEANT4_BUILD_MULTITHREADED=ON 打开了多线程。
— 在RunManager类中设置用户强制初始化类
G4VUserDetectorConstruction
G4VUserPhysicsList
G4VUserActionInitialization
用户在main()函数中也可以定义VisManager(可视化类,用于设置是否可视化及可视化的参数),(图形)用户界面,可选的用户行为类,以及你的持久化管理器(用于在程序运行过程中保存变量的过程,这是计算机相关的知识,喜欢的可以自行详细学习)。
描述探测器
从G4VUserDetectorConstruction抽象基类声明一个你自己的用户具体类,例如:
主线程(在串行模式中)调用的虚拟方法Construct()中,做了如下操作:
—实例化所有的必须材料
—实例化探测器几何体积
副线程(在串行模式中)调用的虚拟方法ConstructSDandField()中,做了如下操作:
—实例化灵敏探测器类和场(磁场、电场)类,然后将灵敏探测器对象设置到逻辑体、将场(磁场、电场)对象设置到场管理器中。
选择物理过程
Geant4不提供任何默认粒子和默认物理过程
—即便对于粒子输运(特指粒子不发生相互作用的过程),用户也应该明确地定义其过程。
从G4VUserPhysicsList抽象基类派生一个你自己的用户具体类。
—定义所有必须的粒子
—定义所有必须的物理过程,然后设置合适的粒子
—在世界(和每个区域,例如用户自定义的探测器灵敏体积)内设置截断范围。
用户最主要的任务是选择一个“预封装包”的物理过程列表,这个列表包含物理过程与用户应用场景相关的典型模型。
—如果“预封装包”的物理列表不满足需求,可能有一些物理过程“预封装包”没有提供,用户可以自己添加和替换一些物理过程或模型。
如果你足够勇敢(真的勇士敢于直面自己的惨淡物理过程代码),你可以自己用程序描述物理过程,并在程序中调用。
产生初始event
这是唯一需要强制使用的用户行为类
从G4VUserPrimaryGeneratorAction抽象基类派生一个你自己的用户具体类。
将一个G4Event对象传递给一个或者更多个初始产生器具体类对象,这个对象用于产生初始顶点和初始粒子。
在Geant4中还提供了基于G4VPrimaryParticlegenerator基类的几种产生器类。
—G4ParticleGun,这个类用于设置发射粒子的种类,方向,抽样等
—G4HEPEvtInterface, G4HepMCInterface
HepMC 类或 /hepevt/通用模块的接口。
—G4GeneralParticleSource
定义放射源,这个就是GPS啦,可以方便定义粒子源,如分支比,衰变类型都能直接定义。
可选用户行为类
所有的用户行为类、方法都在“Beam On”中被调用,这些类必须在用户的main()函数中构建,同时在RunManager中设置。
G4UserRunAction
—G4Run* GenerateRun()
实例化用户自定义行为对象
—void BeginOfRunAction(const G4Run*)
可以定义柱状图或元组等,用于数据存储与分析
—void EndOfRunAction(const G4Run*)
分析run
存储柱状图等
G4UserEventAction
—void BeginOfEventAction(const G4Event*)
Event选择,选择感兴趣的event信息
— void EndOfEventAction(const G4Event*)
输出Event信息
可选用户行为类
G4UserStackingAction
—void PrepareNewEvent()
重置优先控制,将优先控制初始化,重置为自定义默认值
G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track*)
当执行一个新的追踪,调用一次这个类
根据优先级控制来对新的追踪分类
—Urgent(紧急), Waiting(等待), PostponeToNextEvent(延迟到下一事件), Kill(杀死)
void NewStage()
—当Urgent(紧急)的堆栈释放为空时被调用
—改变分类标准
—Event过滤(Event取消),指的是不符合分类标准的Event直接被丢弃。
可选用户行为类
G4UserTrackingAction
—void PreUserTrackingAction(const G4Track*)
定义轨迹是否需要存储
定义用户自定义轨迹
—void PostUserTrackingAction(const G4Track*)
删除非必要轨迹
G4UserSteppingAction
— void UserSteppingAction(const G4Step*)
杀死/挂起/延后追踪
描述步长信息(对于没有存储为轨迹(trajectory)的追踪(track))
上面两图对比了串行模式与多线程模式,其主要区别在于使用G4MTRunManager类同时生产了许多G4WorkerRunManager类和UserRunAction,这两个类在依次向下运行,在副线程0~N中完成了运行。
实例化用户行为类
G4VUserActionInitialization有两个虚拟方法
Build()
—在串行模式和副线程的开始被调用。
—使用SetUserAction()方法来注册所有用户行为类的指针。
—在多线程模式下,在此方法下实例化的所有用户行为类对象都是线程局部变量(thread-local为解决多线程程序的并发问题提供了一种新的思路,有兴趣的可以自己深入学习一下)。
在此方法下实例化的所有用户行为都是针对于线程局部变量运行的。
BuildForMaster()
—在多线程模式中,都在主线程的开始被调用。
—在全局run中,使用SetUserAction()方法来注册所有用户行为类的指针。
重点预览
以下内容将在后续相关章节中会进行详细讲解
定义材料和几何
→G4VUserDetectorConstruction
材料与几何章节
选择合适的粒子和物理过程,定义产物阈值
→G4VUserPhysicsList
物理过程章节
实例化用户行为类
→G4VUserActionInitialization
例子讲解章节
定义一种粒子产生的方法
→G4VUserPrimaryGeneratorAction
初级粒子章节
定义如何从Geant4中获取有用信息
→G4VUserDetectorConstruction, G4UserEventAction, G4Run, G4UserRunAction
→4SensitiveDetector, G4VHit, G4VHitsCollection
统计章节
如果您感觉本文能得到一定启发,请记得点击右下角“在看”哦。如果本文真的解决了您的问题,请自愿简单打赏哦。如果您对本文有想法或灵感或者建议,或者您有问题需要解决,可以留言到公众号或者文章下面的留言哦。笔者会根据问题的情况来以文章的方式或者简单口头回复哦。
推荐阅读G4教程0.0 课程目录及课件分享
G4教程1.5-基本概念和内核结构
G4教程1.4-用户许可解读
G4教程1.3-用户应用程序的亮点
G4教程1.2-Geant4近期研发进展
G4教程1.1-通用介绍和发展史