根据exampleB1 程序,简单分析其中涉及的一些头文件以及其中用到的一些成员函数,不完全归纳其中的一些应用方法。
一 G4RunManager 类
它是一个用于G4内核运行的一个管理类,单线程处理模式(或者顺序处理模式)(sequential mode)时,用户必须自己派生出三个必须的类:
// G4VUserDetectorConstruction - Detector Geometry, Materials
// G4VUserPhysicsList - Particle types and Processes
// G4VUserPrimaryGeneratorAction - Event Generator selection
并且向RunManager 注册,除了上面强制必须定义的类外,还有一些可以根据用户自身要求选择的一些行为类,主要是从一下五个类中派生:
// G4UserRunAction - Actions for each Run
// G4UserEventAction - Actions for each Event
// G4UserStackingAction - Tracks Stacking selection
// G4UserTrackingAction - Actions for each Track
// G4UserSteppingAction - Actions for each Step
G4VUserActionInitialization
用户也可以用G4VUserActionInitialization类来实例化上述6个行为(action)类(1个强制性类+6个可选择的用户行为类),其中有一个用户行为类并不常用,在此处就不介绍()
多线程(multi-threaded mode)处理模式时,用户必须从以下两个抽象基类中派生出自己的类,并且向RunManager 注册
// G4VUserDetectorConstruction - Detector Geometry, Materials
// G4VUserPhysicsList - Particle types and Processes
另外,用户还可以选择制定以下内容:
// G4UserWorkerInitialization - Defining thread-local actions
// G4UserRunAction - Actions for entire Run
在多线程模式中,必须得实例化 G4VUserActionInitialization类,此外,用户还通过以下5个用户行为类自定义一些程序的功能
// G4VUserPrimaryGeneratorAction - Event Generator selection
// G4UserRunAction - Actions for each tread-local Run
// G4UserEventAction - Actions for each Event
// G4UserStackingAction - Tracks Stacking selection
// G4UserTrackingAction - Actions for each Track
// G4UserSteppingAction - Actions for each Step
G4RunManager 是G4中唯一一个运行管理类,在单线程模式中,必须在main()函数中显示创建。在多线程模式中,G4MTRunManager 必须在main()函数中显示创建。(注意, G4WorkerRunManager 是为individual thread(单个线程)设计的,在程序中会自顶实例化,不需要用户来实例或者删除它)
此外,G4RunManager 也可以也可以由用户自己定制运行控制程序,通过派生来实现,最好建议派生时采用保护派生。G4RunManager 或者其派生类必须是一个静态对象,即使有两个不同的进程,用户也不能同时设定多个runmanager 对象
上面内容简单的归纳翻译与G4RunManager.hh源代码,大家如果感兴趣,可以去参考一下源码,对上面的理解有区别的地方可以讨论一下,下面我将抽取一下常用的函数简单归纳讨论一下:
1 static G4RunManager* GetRunManager();
该静态方法将会返回一个G4RunManager 或者其派生类的一个静态指针,注意,在多线程构建的情况下,这将返回每个线程的单例(静态成员函数是属于一个类属的,可以通过类名或者对象名来调用该方法)
2 virtual void BeamOn(G4int n_event,const char* macroFile=0,G4int n_select=-1);
这是一个虚函数,这个函数开始一个事件的循环(在交互模式中,有命令 run/BeamOn 100),一般也只用到第一个参数来确定事件的个数,后面两个参数都含有默认参数,可以不用管。在后面的学习中,我们会知道G4是一个状态机,在启动G4之前如果“n_select”大于零,则在第一个“n_select”事件结束时执行宏文件,系统会检测G4的状态,这个方法必须在Idle 状态被调用,在事件循环期间,状态将更改为GeomClosed,当循环结束或终止时,状态将返回到Idle。第二个参数表示,如果给定一个表示宏文件名称的字符串“宏文件”,则将执行该宏文件。第三个参数表示,如果“n_select”大于零,则在第一个“n_select”事件结束时执行宏文件
3 virtual void Initialize();
这是一个虚函数,顺便提一下,当从该类派生时,派生中的该函数仍然是虚函数。这个虚方法将会调用一个事件循环中所有的必要的初始化进程,这个方法在G4的PreInit 或者Idle 状态时必须被调用,在初始化过程中将状态更改为Init,然后更改为Idle。这个方法会调用两个受保护的方法,InitializeGeometry() 和 InitializePhysics().在一些事件循环中,用户可以再次调用这个方法,这时就要求在用户改变几何,物理过程或者截断值,如果用户再更改这些值后忘记再次调用这个函数,G4RunManager 将会调用BeamOn() 函数来再次调用这个方法。(注意,这个特性并不适用与第一次初始化)
4 virtual void DefineWorldVolume(G4VPhysicalVolume * worldVol, G4bool topologyIsChanged=true);
在两次run之间几何形状的设计改变时,必须调用这个方法,“topologyIsChanged”标志将指定几何拓扑是否与前一次运行中使用的原始拓扑不同;如果没有,则必须将其设置为false,以便保留原始的优化和导航历史。在初始化时也调用此方法。
5 virtual void InitializeGeometry();
virtual void InitializePhysics();
这两个虚方法会被Initialize()方法调用,在前面也提到过。用户的具体G4VUserDetectorConstruction类将从InitializeGeometry()访问,G4VUserPhysicsList类将从InitializePhysics()访问。
6 用户行为类和初始化类的注册方式,括号里面都是对象指针,可以用对象指针来调用方法来注册,在exampleB1.cc 中,采用的方法是 runManager->SetUserInitialization(new B1ActionInitialization());用 new +函数() 返回一个对象指针来注册相应的过程。
virtual void SetUserInitialization(G4VUserDetectorConstruction* userInit);
virtual void SetUserInitialization(G4VUserPhysicsList* userInit);
virtual void SetUserInitialization(G4VUserActionInitialization* userInit);
virtual void SetUserInitialization(G4UserWorkerInitialization* userInit);
virtual void SetUserInitialization(G4UserWorkerThreadInitialization* userInit);
virtual void SetUserAction(G4UserRunAction* userAction);
virtual void SetUserAction(G4VUserPrimaryGeneratorAction* userAction);
virtual void SetUserAction(G4UserEventAction* userAction);
virtual void SetUserAction(G4UserStackingAction* userAction);
virtual void SetUserAction(G4UserTrackingAction* userAction);
virtual void SetUserAction(G4UserSteppingAction* userAction);
上述的几个Set 方法还和多线程的设置有关,由于目前并没有涉及到这一方面的内容,就留到后续来补充。
上面总结了G4RunManager.hh 中几个常用的方法,后续会接着更新遇到的方法。