定义一个类mymath_G4教程1.6用户类

注意:本文所使用的演示文稿归Stanford所有,文中相关内容仅用于学习交流,若有侵权,请联系作者删除!

82b85d2d40d9a9196cf1aab18f717806.png

这部分讲解用户类的内容,此部分内容是Geant4使用的基础,详细说明程序的架构、各部分的依赖关系。请务必认真学习。

3b8a52e6ceb8eb5ad8d12f461236e6fe.png

开始使用Genat4,你必须了解:

  • Geant4是一个软件包,他不是一个直接可以运行的可执行程序,你应该基于这个软件包编译一个可执行程序。如下图,Geant4的软件包下载完,解压之后可以看到,Geant4的源代码目录下是没有一个双击就能直接运行的可执行程序。例如在windows平台上扩展名为.exe .bat  .vbs等,都是可双击直接运行的程序。

    81dcb9ac0b22be89cf4e889e3d26e2f4.png

  • 要生成一个可执行程序,首先需要:

    —定义几何体的设置参数

    • 包括材料、体积;如NaI(材料),2英寸晶体(体积)

—定义需要使用的物理过程

  • 粒子源模型(如各向同性、平行入射)、物理过程/物理模型(如Penelope过程,适用于γ射线与物质相互作用)

  • 产物阈值

—定义怎样开始一个event

  • 初级粒子发生器

— 提取一些对你有用的信息(基于你自己的模拟场景,可以输出一些有用的模拟结果信息,如全能峰探测效率)

你也可以实现如下功能:

—可视化几何体、粒子轨迹、物理数据输出(如在界面上直接显示粒子能量沉积)

—应用(图形)用户界面

—自定义用户界面命令

—等等,C++提供很多接口,可以自己开发,将来可结合云平台,人工智能筛选模型,达到最佳模拟结果等,这些以后都可以开发。

85601ad46aed0f92b4914fc30a4ad541.png

用户类

  • main()

    main() 函数是C++语言的程序入口,但是Geant4 工具包本身不提供main()函数

  • 初始化类

    —使用G4RunManager::SetUserInitialization()来定义。

    —初始化需要引用下列三个类

    • G4VUserDetectorConstruction ,这个类用于初始化探测器构建

    • G4VUserPhysicsList ,这个类用于初始化定义的物理过程

    • G4VUserActionInitialization,这个类用于初始化行为类,就像你是导演,来编写Geant4程序,然后大喊一声:ACTION!程序就开始运行啦。

  • 行为类

    —在用户自己编写的G4VUserActionInitialization实例化(实例化为C++语言的知识。使用类生成对象的过程叫实例化。)

    —在一个event循环内引用

    • G4VUserPrimaryGeneratorAction,这个类用于设置粒子源

    • G4UserRunAction,这个类用于设置run的运行行为

    • G4UserEventAction,这个类用于设置event的运行行为

    • G4UserStackingAction,这个类设置堆栈的运行行为

    • G4UserTrackingAction,这个类用于设置追踪行为

    • G4UserSteppingAction,这个类用于设置step运行行为

      注意:红色的字体的类是强制的,是程序运行必须有的类。

6a33ff5c2808402abfc2f3939fc8ba0e.png

主程序

  • Geant4工具包不提供main()函数。

  • 用户需要自己创建一个main()函数,并在这个函数内做如下操作:

    — 创建G4RunManager类(串行模式模式)或者G4MTRunManager(多线程模式),现在4.10版以后增加了多线程功能,在安装时基本都通过设置DGEANT4_BUILD_MULTITHREADED=ON 打开了多线程。

    — 在RunManager类中设置用户强制初始化类

    • G4VUserDetectorConstruction

    • G4VUserPhysicsList

    • G4VUserActionInitialization

  • 用户在main()函数中也可以定义VisManager(可视化类,用于设置是否可视化及可视化的参数),(图形)用户界面,可选的用户行为类,以及你的持久化管理器(用于在程序运行过程中保存变量的过程,这是计算机相关的知识,喜欢的可以自行详细学习)。

1e04bae1211b8a3ab0794b93563bf20f.png

描述探测器

  • 从G4VUserDetectorConstruction抽象基类声明一个你自己的用户具体类,例如:

    b07e13a8ef0b5ef8583149f688132a02.png

  • 主线程(在串行模式中)调用的虚拟方法Construct()中,做了如下操作:

    —实例化所有的必须材料

    —实例化探测器几何体积

  • 副线程(在串行模式中)调用的虚拟方法ConstructSDandField()中,做了如下操作:

    —实例化灵敏探测器类和场(磁场、电场)类,然后将灵敏探测器对象设置到逻辑体、将场(磁场、电场)对象设置到场管理器中。

5ecfe3e822f142b76e27e086bfdeacdb.png

选择物理过程

  • Geant4不提供任何默认粒子和默认物理过程

    —即便对于粒子输运(特指粒子不发生相互作用的过程),用户也应该明确地定义其过程。

  • 从G4VUserPhysicsList抽象基类派生一个你自己的用户具体类。

    —定义所有必须的粒子

    —定义所有必须的物理过程,然后设置合适的粒子

    —在世界(和每个区域,例如用户自定义的探测器灵敏体积)内设置截断范围。

  • 用户最主要的任务是选择一个“预封装包”的物理过程列表,这个列表包含物理过程与用户应用场景相关的典型模型。

    —如果“预封装包”的物理列表不满足需求,可能有一些物理过程“预封装包”没有提供,用户可以自己添加和替换一些物理过程或模型。

  • 如果你足够勇敢(真的勇士敢于直面自己的惨淡物理过程代码),你可以自己用程序描述物理过程,并在程序中调用。

4c219828cd2d2f18a761e5dca1f8a71c.png

产生初始event

  • 这是唯一需要强制使用的用户行为类

  • 从G4VUserPrimaryGeneratorAction抽象基类派生一个你自己的用户具体类。

  • 将一个G4Event对象传递给一个或者更多个初始产生器具体类对象,这个对象用于产生初始顶点和初始粒子。

  • 在Geant4中还提供了基于G4VPrimaryParticlegenerator基类的几种产生器类。

    —G4ParticleGun,这个类用于设置发射粒子的种类,方向,抽样等

    —G4HEPEvtInterface, G4HepMCInterface

    • HepMC 类或 /hepevt/通用模块的接口。

—G4GeneralParticleSource

  • 定义放射源,这个就是GPS啦,可以方便定义粒子源,如分支比,衰变类型都能直接定义。

95e26de8e25192ba9fe5191ece3fb2ff.png

可选用户行为类

  • 所有的用户行为类、方法都在“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信息

0bc56528ffd703a3bf5218acf2cc48fb.png

可选用户行为类

  • G4UserStackingAction

    —void PrepareNewEvent()

    • 重置优先控制,将优先控制初始化,重置为自定义默认值

  •  G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track*)

    • 当执行一个新的追踪,调用一次这个类

    • 根据优先级控制来对新的追踪分类

      —Urgent(紧急), Waiting(等待), PostponeToNextEvent(延迟到下一事件), Kill(杀死)

  • void NewStage()

    —当Urgent(紧急)的堆栈释放为空时被调用

    —改变分类标准

    —Event过滤(Event取消),指的是不符合分类标准的Event直接被丢弃。

457725e5cf55a88778de76368c310bf2.png

可选用户行为类

  • G4UserTrackingAction

    —void PreUserTrackingAction(const G4Track*)

    • 定义轨迹是否需要存储

    • 定义用户自定义轨迹

—void PostUserTrackingAction(const G4Track*)

  • 删除非必要轨迹

G4UserSteppingAction

— void UserSteppingAction(const G4Step*)

  • 杀死/挂起/延后追踪

  • 描述步长信息(对于没有存储为轨迹(trajectory)的追踪(track))

5469b8f8b8909931e872f356fe180f0b.png

7bb7c09e1d59dcdb46b57027e7580e6a.png

上面两图对比了串行模式与多线程模式,其主要区别在于使用G4MTRunManager类同时生产了许多G4WorkerRunManager类和UserRunAction,这两个类在依次向下运行,在副线程0~N中完成了运行。

950d77a705c7292419d5ae0b78ac6e33.png

实例化用户行为类

  • G4VUserActionInitialization有两个虚拟方法

  • Build()

    —在串行模式和副线程的开始被调用。

    —使用SetUserAction()方法来注册所有用户行为类的指针。

    —在多线程模式下,在此方法下实例化的所有用户行为类对象都是线程局部变量(thread-local为解决多线程程序的并发问题提供了一种新的思路,有兴趣的可以自己深入学习一下)。

    • 在此方法下实例化的所有用户行为都是针对于线程局部变量运行的。

  • BuildForMaster()

    —在多线程模式中,都在主线程的开始被调用。

    —在全局run中,使用SetUserAction()方法来注册所有用户行为类的指针。

d0e33421070ed82c980f2421ac5846b0.png

重点预览

以下内容将在后续相关章节中会进行详细讲解

  • 定义材料和几何

    →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-通用介绍和发展史

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值