ユーザーアクションしたい(G4VUserActionInitialization

親クラス

1G4VUserActionInitialization() = default;
2virtual ~G4VUserActionInitialization() = default;
3virtual void Build() const = 0;
4virtual void BuildForMaster() const {};

親クラスのメンバー関数を抜粋しました。 コンストラクターとデストラクターは、この設定を引き継げばよさそうです。 Build()は、ユーザーアクションを設定するための関数です。 純粋仮想関数になっているため、自作クラスでoverrideが必要です。 BuildForMaster()は、マルチスレッド環境で実行する場合に、 RunActionの設定が必要です。

注釈

ソースコードに以下のようにコメントされていました。

1// Virtual method to be implemented by the user to instantiate user
2// run action class object to be used by G4MTRunManager. This method
3// is not invoked in the sequential mode. The user should not use
4// this method to instantiate user action classes except for user
5// run action.
6virtual void BuildForMaster() const {}

BuildForMaster()の中ではRunActionクラス以外は使ってはいけないようです。

ActionInitializationクラス

 1// include/ActionInitialization.hh
 2
 3#ifndef ActionInitialization_h
 4#define ActionInitialization_h 1
 5
 6#include "G4VUserActionInitialization.hh"
 7
 8namespace ToyMC
 9{
10
11class ActionInitialization : public G4VUserActionInitialization
12{
13  public:
14    ActionInitialization() = default;
15    ~ActionInitialization() = default;
16
17  public:
18    void BuildForMaster() const override;
19    void Build() const override;
20};
21
22};  // namespace ToyMC
23
24#endif

ユーザーアクションはG4VUserActionInitializationを継承したクラスを自作します。 そのメンバーには仮想関数としてBuildForMasterBuildを定義します。

BuildForMasterはマルチスレッドモードのマスタースレッド用のユーザーアクションです。 とくに追加設定は必要はありません。

Buildはワーカースレッド用のユーザーアクションです。 こちらはカスタマイズ設定が必要です。

メイン関数

 1// プロジェクト名.cc
 2#include "G4RunManagerFactory.hh"
 3
 4#include "ActionInitialization.hh"  // <-- 自作クラス
 5
 6int main()
 7{
 8    auto rm = G4RunManagerFactory::CreateRunManager();
 9
10    auto actions = new ActionInitialization{};
11    rm->SetUserInitialization(actions);
12}

メイン関数で、ActionInitializationのインスタンスを作成し、 SetUserInitializationを使ってRunManagerに登録します。

ソースファイル

 1// src/ActionInitialization.cc
 2#include "ActionInitialization.hh"   // <-- G4VUserActionInitializationを継承した自作クラス
 3
 4#include "PrimaryGeneratorAction.hh"  // <-- G4VUserPrimaryGeneratorActionを継承した自作クラス
 5#include "EventAction.hh"             // <-- G4UserEventActionを継承した自作クラス
 6#include "TrackingAction.hh"          // <-- G4UserTrackingActionを継承した自作クラス
 7#include "SteppingAction.hh"          // <-- G4UserSteppingActionを継承した自作クラス
 8
 9namespace プロジェクト名
10{
11
12ActionInitialization::ActionInitialization() {;}
13ActionInitialization::~ActionInitialization() {;}
14
15////////////////////////////////////////////////////////////////////////////////
16void ActionInitialization::BuildForMaster() const {;}
17
18////////////////////////////////////////////////////////////////////////////////
19void ActionInitialization::Build() const
20{
21    // 必須の設定
22    SetUserAction(new PrimaryGeneratorAction);
23    // 任意の設定
24    SetUserAction(new RunAction);
25    SetUserAction(new EventAction);
26    SetUserAction(new TrackingAction);
27    SetUserAction(new SteppingAction);
28    SetUserAction(new StackingAction);
29}
30
31}

ユーザーアクションはBuildメソッドに追加すればよいです。 それぞれ自作クラスで定義してSetUserActionを使って渡します。

PrimaryGeneratorActionの設定は必須です。 その他のアクション設定は任意です。