Geant4 基础知识
G4模拟粒子过程:
建立一次模拟,在 G4 中称为一次 Run;Run 建立后,需要对几何结构、物理过
程进行初始化;初始化完成后就开始模拟过程了,首先发射一个粒子。在 G4 中,
发射一个(或一系列)粒子到所有次级粒子死亡的过程成为一次 Event。而每次
发射的初始粒子则有粒子发射器进行控制。而在每一个 event 过程中,粒子与材
料反应后会可能生成多个次级粒子,每个粒子都会有一条径 迹,称之为 track;
而每一个粒子(初始的或次级的)的径迹又是由很多步组成的,称之为 step。
G4模拟的基本算法:
A Run Start -> 初始化物理模型/几何模型-> An Event Start -> 调用粒子发
射器发射粒子
-> A Track Start
-> A Step Start
-> A Step End
-> Next Step Start
-> ……
-> All Step End
-> A Track End
-> Next Track Start
-> ……
-> All Track End
-> An Event End -> Next Event Start
-> ……
-> All Event End(All Primaries Shot) -> A Run End -> Next Run Start
-> ……
1) main()中应该包括的内容
Geant4是一个探测器模拟工具, 但它对于某个特定的模拟程序没有固定的
main()函数, 用户在建立模拟程序的过程中需要提供自己的 main()函数. 一个
最基本的 main()函数需要包括以下几个方面:
G4RunManager(模拟整个过程)
G4VUserDetectorConstruction(定义探测器材料, 几何形状, 灵敏区和读
出方案)
G4VUserPhysicsList(定义粒子种类和物理过程, 还有截断参数)
G4VUserPrimaryGeneratorAction(定义了源粒子的种类, 能量, 出射方向
等)
一个最简单的 main()函数如下:
#include "G4RunManager.hh"
#include "G4UImanager.hh"
#include "ExN01DetectorConstruction.hh"
#include "ExN01PhysicsList.hh"
#include "ExN01PrimaryGeneratorAction.hh"
int main()
{
// Construct the default run manager
G4RunManager* runManager = new G4RunManager;
// set mandatory initialization classes
runManager->SetUserInitialization(new ExN01DetectorConstruction);
runManager->SetUserInitialization(new ExN01PhysicsList);
// set mandatory user action class
runManager->SetUserAction(new ExN01PrimaryGeneratorAction);
// Initialize G4 kernel
runManager->Initialize();
// get the pointer to the UI manager and set verbosities
G4UImanager* UI = G4UImanager::GetUIpointer();
UI->ApplyCommand("/run/verbose 1");
UI->ApplyCommand("/event/verbose 1");
UI->ApplyCommand("/tracking/verbose 1");
// start a run
int numberOfEvent = 3;
runManager->BeamOn(numberOfEvent);
// job termination
delete runManager;
return 0;
}
main()首先生成一个 G4RunManager 类,这个类是在主程序中用以初始化模拟信
息,用来连接子程序,连接方式是通过 Set 函数来完成。 例如:
BDetectorConstruction* detector = new BDetectorConstruction;
runManager->SetUserInitialization(detector);
先构造一个探测器几何,再用 SET 函数初始化。
用 new 申请的空间,在程序完成后需要释放空间,否则出错。注意:GEANT4中,
在 runManager 上面说明的其他类会自动释放。所以不需要一一释放。
其 他 类 按 照 重 要 性 分 为 强 制 类 和 可 选 类 。 其 中 几 何 结 构 类
( DetectorConstruction )、 物 理 设 定 类 ( PhysicsList )、 源 描 述 类
(PrimaryGenerator)都 属于强制类,缺少任一个程序都无法运行。而事件处
理 类 ( EventAction )、 步 数 据 处 理 类 ( SteppingAction )、 径 迹 处 理 类
(TrackingAction)、运行处理类(RunAction)都属于可选类,用户可以通过设
定这些类来获取感兴趣的数据,可以按照自己的需要添 加。
包含强制类之后程序就可以运行了,但只能检验几何结构的完备性,所以为了获
得数据必须设定可选类。
1. Geant4的类结构
Geant4程序代码是根据这个类结构建立起来的, 类结构如下图所示. 下面
就是 Geant4中每个类的简单说明.
1) Run 和 Event
这些类与模拟事件相关, 产生次级粒子, 为粒子径迹模拟器提供粒子.
2) Tracking 和 Track
根据粒子在探测器材料中的物理过程模拟粒子运行的轨迹, 给出粒子特定
时间段在空间的位置, 或者粒子空间时间的分布.
3) Geometry, Magnetic Field 和 CAD-Interface
这三个类就是用来描述探测器几何结构和探测器中电磁场的分布. 为了使
探测器几何结构可以在 CAD 系统中进行修改, Geant4的几何体模型完全与 ISO
STEP 标准一致. 将来 Geant4中几何结构的设计将从程序设计中独立出来. 面向
对象设计的方法可以让用户在不影响程序其他部分的同时改变几何参数和场.
4) Particle Definition 和 Matter
这两个类用于定义粒子和探测器材料.
5) Physics
它提供了粒子与探测器材料相互作用时所发生物理过程的模型, 允许用户
为每次反应或每个反应道添加物理模型. 用户根据粒子的种类, 探测器材料和
能量范围选择不同的物理模型. Geant4有电磁物理过程和强子物理过程模型,
同时也提供了散射截面数据库.
6) Hits 和 Digitization
这个两个类用于对用户定义的灵敏区内的响应进行采样和分析.
7) Visualization
它显示了探测器几何形状, 粒子轨迹和碰撞过程. 由于采用了面向对象设
计技术来设计可视化部分, 这允许用户独立开发可视化工具, 如: OpenGL 和
OpenInventor(为 X11和 Windows 设计), DAWN, Postscript(via DAWN)和 VRML.
8) Interfaces
支持可视化用户界面以及和外加程序的交流(OODBMS, reconstruction 等).
①User Verbose output class,定义了一个 verbosity 变量;
②Run manager,定义了一个运行管理器 runManager;
③User
ExN02DetectorConstruction 和 ExN02PhysicsList;
Initialization
classes
(mandatory) , 设 置 两 个 强 制 类
④User Action classes,设置用户干涉类 ExN02PrimaryGeneratorAction、
ExN02RunAction、 ExN02EventAction 和 ExN02SteppingAction;
⑤Initialize G4 kernel,“runManager->Initialize()”,初始化 GEANT4 内
核。构造探测器,生成物理过程,计算截面以及其他;
⑥Get the pointer to the User Interface manager,获取 UI 管理器的指针;
⑦batch mode,定义了批处理模式;
⑧interactive mode : define visualization and UI terminal; 定义了交互
模式的可视化和 UI 终端;
2.构建模型:
在 Geant4 中首先要建立一个最大的盒子,称为 World Volume,然后往这个大盒
子里面放各种各样的小盒子(部件),然后每个小盒子 (部件) 里面还可以放
更小的盒子 (零件) , 放入的小盒子将自动代替大盒子原有部分。
在 Geant4中,将大盒子称为 Mother Volume (母体),小盒子称为 Daughter
Volume (子体)。除了 World Volume 之外,每个 Volume(体)都必须且只能有
一个母体,但可以没有子体,也可以有多个子体。Geant4 的这种盒子模型的要
求是:“不交不超”。
Geant4 中每个这样的盒子的安放又分为两步。第一步是构建盒子,称为 Logical
Volume(逻辑体);第二步是将盒子摆放到正确位置,变为 Physical Volume(物
理体)。
构 建盒子又分为两步,第一步是确定盒子形状,第二步是确定盒子的材料等属
性。 形状在 Geant4 中被称为 Solid。在 Geant4 中提供了多种固有的形状,
如球形、长方体、锥体等,可以在$G4INSTALL/source/geometry/solids 里面查
找。 用户也可以通过 G4VSolid 类构建自己的形状,参见:
$G4INSTALL/source/geometry/management/include /G4VSolid.hh。
此外,对于一些复杂的形状,用户也可以利用基本形状通过交并补等布尔运算方
式完成,布尔运算的方式请参考$G4INSTALL/source/geometry/solids/Boolean。
确定了盒子形状后,就是设置盒子的材料、磁场等属性。这些属性的设置通过
G4LogicalVolume 类来完成,设置方法如下:
G4LogicalVolume(G4VSolid* pSolid, //形状
G4Material* pMaterial, //材料
const G4String& name, //逻辑体名字
G4FieldManager* pFieldMgr=0, //场管理
G4VSensitiveDetector* pSDetector=0, //是否 SD 探测器
G4UserLimits* pULimits=0, //用户限制
G4bool optimise=true); //是否优化
盒子造完了就该摆放盒子了。摆放盒子也有两种方法,一种是直接构建物理体,
另一种是指定摆放方法。
直接构建物理体是通过 G4VPhysicalVolume 类,其定义方法如下:
G4VPhysicalVolume(G4RotationMatrix *pRot, //旋转方式
const G4ThreeVector &tlate, //摆放坐标
const G4String &pName, //物理体名字
G4LogicalVolume *pLogical, //对应的逻辑体
G4VPhysicalVolume *pMother); //母体
如果 pMother=0就表明这个体是一个 World Volume,World Volume 必须且只能
有一个。
在实际应用中,我们通常采用指定摆放方法的方式来完成物理体的构建。
指 定 摆 放 方 法 是 通 过 G4PVPlacement 类 完 成 。 G4PVPlacement 类 是
G4VPhysicalVolume 的派生类,该类提供了多种方法描述 Logical Volume 的摆
放方法。具体可以参考:
$G4INSTALL/source /geometry/volumes/include /G4PVPlacement.hh。
用这种方法可以建立具有相同 Logical Volume 的物理体,同时给可以给每个物
理体分配一个编号,以便区分具有相同 Logical Volume 的物理体。这些编号在
UserSteppingAction 等类中处理数据时有时会非常有用处。
需要注意的是,在 Geant4中摆放坐标都是指的相对坐标,是子体中心相对母体
中心的坐标。而 World Volume 建立后就等于建立了几何模型的绝对坐标系。
3. 定义材料
1) 基本概念
自然界中, 材料(化合物, 混合物)一般是由元素组成, 而元素由同位素组
成. Geant4中有三个类用来定义探测器材料的.
类 G4Element 描述了原子属性:原子量, 原子核中质子数, 原子质量, 壳层
能量, 还有每个原子的散射截面等.
类 G4Material 描述了材料的宏观属性:密度, 状态, 温度, 压强, 还有辐
射长度, 平均自由程, dE/dx 等.
2) 定义单质材料
如下例, 给出材料名称, 密度, 摩尔质量和原子量, 定义了液态氩.
/////////////////////////////////////////////////////////////////////
///////////////