作者: 丁雪峰 武汉大学 xfding@whu.edu.cn
如果有意见或者建议,欢迎评论或者发邮箱!
修改历史:
2013年1月4日 v0.1
最简单的探测器,几何粒子+无相互作用。
2013年1月9日 v0.1.2
添加了与Makefile相关的易错提示
2013年9月20日 v0.1.3
去掉无关紧要的部分。
0 分节剧情
在这篇日志里,我会介绍一个可以执行的geant4程序的基本构成,让你对用来模拟探测器的geant4程序有一个整体的认识。如果你想知道如何安装geant4工具包,以及最简单的使用方法,请参考其它文章。事实上,最简单的方法,是请一位专业的师兄帮你安装配置好,你只要会用就行了。
1 简介
什么是GEANT4?
GEANT4是一个工具包,它是由C++编写而成的类库。你通过include相应的头文件,并在编译时链接相应的库文件使用GEANT4.
我们用GEANT4做什么?
GEANT4一般用来给出探测器的性能。
探测器的性能包括(能量、位置、时间)分辨率、探测效率、排斥比等。
对于分辨率,探测器测量得到的值一般是以真实值为中心的高斯分布[1-1]。高斯分布的σ除以真实值就是探测器对这个量的分辨率。
对于探测效率和排斥比,举个例子,我想知道今天有多少尾号为2的车经过二桥。假设有100量这样的车通过了,探测器指看到了其中的97辆,那么探测效率就是97%。有10000辆尾号不是2的车经过了二桥,但是探测器把其中的1辆误当成尾号为2的了(这样最后探测器会告诉我有98辆这样的车),排斥比就是1/10000。
[1-1] 假设真实值的分布是δ函数。
什么是事例?
事例(Event),就是一件事情,一个故事。探测器记录探测结果时以事例为单位打包。
我们要探测的粒子的诞生标志着故事的开始。而这个粒子(以及所有由它衰变产生的次级粒子都)被吸收、停止、跑出我们关心的空间区域、被探测器探测到标志着故事的结束。
事例的开始是随意的,你可以从一个故事的中间开始记录这个故事。故事的结束也很随意——你可以说,我记不住那么多,就到这吧。
2 如何使用GEANT4做一个最简单的模拟?
在开始之前,我需要你记住三句话:
GEANT4需要用户告诉它三件事
1) 探测器的几何是怎样的,即探测器各个部分的形状、材料、材料性质、相对位置是怎样的?
2) 每个事例的初级顶点是怎样的,即事例开始时有多少个粒子、每个粒子的种类、动量、能量是怎样的?
3) 每种粒子会发生什么物理过程,这些物理过程发生后会发生什么事情?
GEANT4提供了三个抽象类:G4VUserDetectorConstruction、G4VUserPrimaryGeneratorAction、G4VUserPhysicsList。你需要继承它们并分别实现它们的纯虚函数,即Construct、GeneratePrimaries、ConstructParticle、 ConstructProcess、SetCuts。
如何开始模拟?
你需要在main函数分别中new我上面提到的三个抽象类的子类,通过new G4RunManager拿到runManager的指针,并通过SetUserInitializaion和SetUserAction方法来把你的类告诉runManager,最后让runManager执行initialize(),并且执行beamOn(需要模拟的event的个数)。
如何定义探测器几何?
首先,我们需要定义材料、材料的性质(包括密度、对不同波长的gamma的吸收能力等)。
然后,需要定义探测器中所有组成部分的几何形状。注意几何形状没有相对位置的概念。
接下来,需要定义探测器中所有组成部分的材料。
接下来,需要定义探测器中所有组成部分的相对位置。
如何定义事例初级顶点?
最简单的情况,可以利用G4ParticleGun这个类。
首先,new一个particleGun。
然后,通过一系列set方法执行你要shoot的粒子的种类、能量、动量,以及初始位置。
最后,通过generatePrimaryEvent(G4Event* event)产生一个event,并把它传给自己的形参。
如何定义每种粒子会发生什么物理过程,这些物理过程发生后会发生什么事情?
首先,在ConstructParticle中把所有可能出现的粒子定义好
然后,在ConstructProcess中把所有定义过的粒子可能发生的物理过程定义好
最后,在SetCuts中为没种物理过程设置截断值。一般用默认值就可以,不需要更多的代码。