Geant4不完全学习指南2(根据exampleB1.cc 简单分析G4RunManager源代码)

根据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 中几个常用的方法,后续会接着更新遇到的方法。

 

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值