Geant4是由欧洲核子研究组织基于C++面向对象技术开发的蒙特卡罗应用软件包,用于模拟粒子在物质中输运的物理过程。由于具有良好的通用性和扩展能力,Geant4在涉及微观粒子与物质相互作用的诸多领域获得了广泛应用。
Geant4的基本概念
HEP中的模拟是“虚拟现实”。仿真既可用于在研发阶段帮助设计探测器,又可用于物理研究中了解探测器的响应。为了创建这样的虚拟现实,我们需要对粒子间的相互作用,几何形状和材料进行建模,以便将基本粒子传播到检测器中。我们还需要描述检测器生成原始数据的灵敏度。
Geant4是面向对象的工具包,它提供了在高能物理和其他领域进行仿真所需的功能。面向对象的好处有:
- 易于开发和维护
- 很好的模块化
- 协作者方便阅读和理解
讲述Geant4概念之前,先来看一个示例(B1):
int main(int argc,char** argv) //程序开始
{
// Detect interactive mode (if no arguments) and define UI session
// 如果执行文件后面没有脚本文件,则开启可视化界面
G4UIExecutive* ui = 0;
if ( argc == 1 ) {
ui = new G4UIExecutive(argc, argv);
}
// Optionally: choose a different Random engine...
// G4Random::setTheEngine(new CLHEP::MTwistEngine);
// Construct the default run manager
// 产生一个运行管理对象runManager,采用默认类型
auto* runManager =
G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default);
// Set mandatory initialization classes
//
// Detector construction
// 用定义的运行管理对象
runManager->SetUserInitialization(new B1DetectorConstruction());
// Physics list
// 创建物理过程对象physicsList
G4VModularPhysicsList* physicsList = new QBBC;
physicsList->SetVerboseLevel(1); // 设置物理过程的详细级别为1级
runManager->SetUserInitialization(physicsList); // 初始化运行管理对象runManager的物理过程
// User action initialization
runManager->SetUserInitialization(new B1ActionInitialization()); // 初始化B1示例中行为类
// Initialize visualization
// 初始化可视化管理对象visManager
G4VisManager* visManager = new G4VisExecutive;
// G4VisExecutive can take a verbosity argument - see /vis/verbose guidance.
// G4VisManager* visManager = new G4VisExecutive("Quiet");
visManager->Initialize(); // 初始化可视化管理对象
// Get the pointer to the User Interface manager
G4UImanager* UImanager = G4UImanager::GetUIpointer(); // 获取指向可视化界面管理器的指针
// Process macro or start UI session
// 如果运行程序时输入了运行脚本文件,则运行为批处理模式;否则,则运行可视化界面
if ( ! ui ) {
// batch mode
G4String command = "/control/execute "; // 用户界面命令
G4String fileName = argv[1]; // 记录脚本文件名称
UImanager->ApplyCommand(command+fileName); //执行用户界面命令
}
else {
// interactive mode
UImanager->ApplyCommand("/control/execute init_vis.mac");
ui->SessionStart(); // 开始可视化界面
delete ui; // 释放执行对象ui内存
}
// Job termination
// Free the store: user actions, physics_list and detector_description are
// owned and deleted by the run manager, so they should not be deleted
// in the main() program !
delete visManager; // 释放可视化管理器内存
delete runManager; // 释放运行管理对象内存
}
从B1示例的主函数中我们可以看到,Geant4的运行是依靠Run
、Event
、Track
、Step
这几个部分组成的:
具体的运行过程为:
下面开始逐个介绍其每部分的作用以及含义:
Run
和现实中我们做实验一样,run
表示在实验中发射一束粒子。当运行一个run
后,以下信息在这个run
结束前不能更改:
- 几何体结构
- 定义的物理过程
某种意义上讲,一个run
是一系列相同情况下event
的集合。
Event
在开始运行之前,一个event
包含了某种被定义的粒子,每个粒子被存入stack
中,当粒子发射完,stack
为空时,该event
结束。G4Event
类表示一个event
。 在结束时有以下能够收集以下信息:
- 主要顶点和粒子列表
- 轨迹信息(可选)
- 探测器敏感区域中轨道物理交互信息
- 探测器输出信息(例如ADC / TDC计数,触发信号)(可选)
Track
Track
是存放每个粒子的信息,Step
是Track
的小段信息,但是Track
不是Step
的集合。Track
在以下情况被析构(Delete):
- 粒子离开
World
- 粒子物理消失(例如衰变)
- 粒子的动能降至
0
并且不会发生其他的物理过程 - 用户自定义
Track
在以下三个类中产生:
-
G4Track
– 位置、 粒子信息、径迹长度、 粒子飞行时间
– 它的ID以及母ID - G4DynamicParticle
– 动能、能量、时间、极化
– 固定衰减通道 - G4ParticleDefinition
– 由相同类型的所有G4DynamicParticle共享
– 质量、寿命、电荷、其他物理量
– 衰减表
Step
Step
具有两个点(Begin of step point,End of step point),还有粒子的“增量”信息(Step
的能量损失,Step
所花费的飞行时间等)。
每个点都知道粒子信息,如果步骤受体积边界限制,则端点物理上位于边界上,并且逻辑上属于下一个体积。
Trajectory
Trajectory
是Track
历史的记录。 它将轨道完成的所有步骤的一些信息存储为G4TrajectoryPoint类的对象。
由于内存消耗的角度来看,建议不要存储Trajectory
中产生的次级粒子的轨迹。
用户可以从G4VTrajectory
和G4VTrajectoryPoint
基类创建自己的轨迹类,以存储对模拟有用的任何其他信息。
Geant4运行的基本流程
如何开始Geant4
初始化
- 定义物质和几何体结构
- 定义粒子、物理过程以及加载需要的反应截面表
运行
-
导入几何体结构
-
循环
Event
– 若多于一个run
,则配置不同几何体
用户需要定义的类
- 初始化类
– 在初始化中调用
G4VUserDetectorConstruction
G4VUserPhysicsList - 行为类
– 在Event
循环中调用的类
G4VUserPrimaryGeneratorAction
G4UserRunAction
G4UserEventAction
G4UserStackingAction
G4UserTrackingAction
G4UserSteppingAction
几个简单的输入输出流(G4cout,G4cerr,G4endl)
G4cout
,G4cerr
,G4endl
在G4ios.hh
中定义,这些对象封装了机器/操作系统/编译器依赖。就像普通的std :: cout
,std :: cerr
,std :: endl
一样使用它们。一些GUI使用这些ostream对象来保留自己的缓冲日志文件。不推荐使用std :: cin
。 某些GUI无法正确处理std :: cin
,使用用户定义的UI命令获取输入。
强制用户定义类
设置环境变量
这些操作在安装Geant4时理应设置好!
[ming@localhost geant4make]$ $G4SYSTEM
bash: Linux-g++: command not found...
[ming@localhost Desktop]$ cd $G4INSTALL
[ming@localhost geant4make]$ pwd
/usr/local/share/Geant4-10.7.1/geant4make
[ming@localhost geant4make]$ cd $G4WORKDIR
bash: cd: /home/ming/geant4_workdir: No such file or directory
[ming@localhost geant4make]$ cd $CLHEP_BASE_DIR
[ming@localhost local]$ pwd
/usr/local
[ming@localhost ~]$ cd $G4LEVELGAMMADATA
[ming@localhost PhotonEvaporation5.7]$ pwd
/usr/local/share/Geant4-10.7.1/data/PhotonEvaporation5.7
还有一些其他变量,例如GUI
、VIS
、ROOT
等!
主程序
Geant4不提供main()
,需要用户自己编写。
主程序中,必须包含以下几个部分:
-
G4RunManager
运行管理类,在程序的开头,一般创建一个单线程的运行管理类对象或者多线程运行管理类; - 将强制类设置到设置到运行管理对象中:
– G4VUserDetectorConstruction
– G4VUserPhysicsList
– G4VUserPrimaryGeneratorAction
用户可以定义VisManager
、UI session
以及其他行为类放到主程序中。
可视化
在主程序中,根据计算机环境,构造Geant4提供的G4UIsession
具体类,并调用其sessionStart()
方法来进行可视化,Geant4提供以下几种可视化的方式:
-
G4UIterminal
——C-shell字符终端 - G4GAG——基于Tcl / Tk或Java PVM的GUI
- G4Wo——Opacs
- G4UIBatch——宏文件的批处理文件(常用)
根据您的计算机环境从G4VVisManager
派生用户自己的具体类。Geant4提供图形驱动程序的接口:
- DAWN
- WIRED
- RayTracer
- OPACS
- OpenGL
- OpenInventor
- VRML
定义Detector
从G4VUserDetectorConstruction
抽象基类派生用户自己的具体类。
用户要在虚函数Construct()
中定义以下内容:
- 构建所有几何体需要的材料
- 构建所有detector几何体体积
- 构建探测器灵敏区
可以选择定义探测器元素的可视化属性。
选择物理过程
Geant4没有任何默认的粒子或过程,即使对于粒子传输,也必须明确定义它。
从G4VUserPhysicsList
抽象基类派生用户自己的具体类:
- 定义所有必要的粒子
- 定义所有必要的过程并将其分配给适当的粒子
- 定义截止范围
Geant4提供了许多实用程序类/函数。
产生初级粒子
从G4VUserPrimaryGeneratorAction
抽象基类派生用户的具体类,将G4Event
对象传递给一个或多个主要生成器具体类对象,这些对象生成主要顶点和主要粒子,Geant4提供了三个粒子生成器:
- G4ParticleGun
- G4HEPEvtInterface
– 通过ascii文件连接到/hepevt/common
- HepMC的接口。
用户可选类
必须在用户的main()
中构造所有用户行为类,这些类的方法在Beam On
期间被调用,并且必须将其设置为RunManager
。
G4UserRunAction
- BeginOfRunAction(const G4Run*)
– 定义直方图 - EndOfRunAction(const G4Run*)
– 收集直方图
G4UserEventAction
- BeginOfEventAction(const G4Event*)
–Event
选择
– 定义直方图 - EndOfEventAction(const G4Event*)
– 分析Event
G4UserStackingAction
- PrepareNewEvent()
- ClassifyNewTrack(const G4Track*)
- NewStage()
G4UserTrackingAction
- PreUserTrackingAction(const G4Track*)
– 确定轨迹是否存储
– 创建用户定义的轨迹 - PostUserTrackingAction(const G4Track*)
G4UserSteppingAction
- UserSteppingAction(const G4Step*)
– kill/暂停/推迟Track
– 绘制步骤(对于不由轨迹存储的轨迹)
参考资料:
GettingStarted
B1