解度main()函数中的大致框架,以此框架为基础,简单分析常见类中的一些常用方法(第一次尝试写博客,主要目的是记录一下自己学习G4的过程,同时,希望给后来学习的同学一点点借鉴,看源代码的前提稍微懂一点点C++,我也是简单学习了一点相关知识)
write by Jack in HuBei 2019.7.25 9:12
//00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000//
G4是一个提供模拟的工具包,因此要自定义建立相关的模拟,就会编写满足不同要求的main()函数。main()函数只能由用户自己提供。以手册中提供的一个最简单的清单为例,来简单讨论一下main()函数的组成:
#include "G4RunManager.hh" //G4内核中唯一的一个运行管理类
#include "G4UImanager.hh" //用户接口管理类
#include "ExN01DetectorConstruction.hh" // 自定义派生构造探测器
#include "ExN01PhysicsList.hh" //物理列表管理
#include "ExN01PrimaryGeneratorAction.hh" //初始粒子产生的方式
int main( )
{
/* main()函数必须做的第一件事就是创建一个G4RunManager类的实例。它是G4内核中唯一的一个运行管理类,必须在main()函数中显示创建,它控制程序流程并在一个run中管理事件循环。当G4RunManager被创建实,其他的管理类同时被创建,他们在G4RunManager 被删除的时候自动删除。运行管理类同时管理初始化进程,包括用户初始化类中的方法。我们必须传递所有必须的消息给运行控制进程,以建立并运行一个模拟过程,这些消息包括:
1 探测器将如何构建 、//.........................................................................................................................//
2 将被模拟的所有粒子和所有物理过程 // 大概意思来讲G4RunManager 就是管理程序是按照什么顺序来执行的,程序中
3 在一个事件中的初级粒子将如何产生 //涉及到的用户自定义的函数和过程及相关的粒子作用的过程都要提前向其声明
4 其他模拟必须的消息 //...........................................................................................................................// */
//构造缺省的run manager
G4RunManager* runManager = new G4RunManager;
//设置必须的初始化类 提前向RunManager 声明,注册上述1,2,3,4 条中的消息
runManager->SetUserInitialization (new ExN01DetectorConstruction); //探测器如何构建
runManager->SetUserInitialization (new ExN01PhysicsList); //构建物理列表及相应的作用过程
//设置必须的用户行为类,常见的用户行为类有5hook
runManager ->SetUserAction(new ExN01PrimaryGeneratorAction);
//初始化G4内核
runManager->Initialize();
// 获取指向 UI manager 的指针并设置 verbosities,主要用于相关信息的打印清单,详细程度
G4UImanager* UI = G4UImanager::GetUIpointer();
UI->ApplyCommand("/run/verbose 1");
UI->ApplyCommand("/event/verbose 1");
UI->ApplyCommand("/tracking/verbose 1");
//启动一个run
int numberOfEvent = 3;
runManager->BeamOn(numberOfEvent);
//任务结束
delete runManager;
return 0;
}
//上面的main() 函数是一个最简单的例子,main()函数通过G4提供的两个类G4RunManager 和G4UImanager,以及另外三个类,ExN01DetectorConstruction , ExN01PhysicsList 和ExN01PrimaryGeneratorAction ,它们是从G4中派生的
下面来解读main()函数中涉及到的一些类:
上面提到过,G4RunManager 是G4中唯一的一个运行管理类,在main()函数中必须显示的创建,用来管理程序的运行。在建立好G4RunManager 实例后,需要向其注册(声明)用户必须自己定义的用户初始化类和用户行为类。有三个类必须由用户自己定义。两个用户初始化类,一个用户行为(action)类。
G4提供抽象基类:
1 G4VUserDetectorConstruction -----描述整个探测器的结构(用户初始化类)
(1)探测器的几何 (2)探测器的材料 (3)探测器敏感区域的定义以及敏感区约的独处方式
2 G4VUserPhysicsList---描述模拟过程中涉及到的粒子以及相应的物理过程,要求用户定义:(用户初始化类)
(1)模拟过程中使用到的粒子 (2)粒子的截断范围 (3) 这些粒子涉及到的物理过程
3 G4VuserPrimaryGeneratorAction ---描述初级事件的初级状态,初级粒子产生的位置以及能量方向信息(用户行为类)
在该类中,用户必须描述初级事件的初始状态。这个类有一个共有的虚方法generatePrimaries(),它将在每个事件的开始时刻被调用。G4不提供任何缺省行为用于产生一个初级事件,也就是说初始粒子的产生必须由用户自己来决定。
4 除了上面描述初级事件的初始状态的行为为必须的行为类外,为了得到模拟过程中所涉及到的数据,G4还为用户提供了5个可选择的用户行为类,用户根据自己模拟的需要,自己选择相应的用户行为来得到目标数据
(1)G4UserRunAction (2) G4UserEventAction (3) G4UserStackingAction
(4) G4UserTrackingAction (5) G4UserSteppingActoion 在这些用户行为类中,有几个虚方法允许用户在模拟程序的各个层次添加其他代码,来获得目标数据。
在上面的main()函数中,还涉及到一个用户结构管理类,G4UImanagerle,G4提供了一大类叫intercoms的类,主要是用于外部接口的类。G4UImanager 是这个大类(类属)的管理类。在上述代码中,各种G4管理类的初始化信息被设置。intercoms 类主要用于用户借口命令。用户接口命令的发送可以在整个程序中进行。
接下来我会逐渐看一看源代码,分享一下常用类中的成员函数,主要就是根据basic 例子来分析!