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

G4VUserActionInitializationは、ユーザーアクション(RunActionEventActionなど)をまとめて初期化するための抽象基底クラスです。 マルチスレッド環境に対応する枠組みとしてv9.6で導入されました。

注釈

v9.6以前はSetUserActionをmain関数などで、 個別に直接呼び出して、ユーザーアクションを初期化していました。

親クラス(public G4VUserActionInitialization

1class G4VUserActionInitialization {
2  public:
3    G4VUserActionInitialization() = default;
4    virtual ~G4VUserActionInitialization() = default;
5
6  public:
7    virtual void Build() const = 0;
8    virtual void BuildForMaster() const {};
9};

親クラス(G4VUserActionInitialization)の主要なメンバー関数を抜粋しました。 コンストラクターとデストラクターは、親クラスの設定を引き継げばOKです。 Build()は、ユーザーアクションを設定するための純粋仮想関数で、必ずオーバーライドが必要です。 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

ユーザーアクションの初期化には G4VUserActionInitializationを継承したクラスを自作します。 このクラスの中で、BuildBuildForMasterを定義する必要があります。

ActionInitialization::Build

 1void ActionInitialization::Build() const {
 2    // 入射粒子の設定(必須)
 3    SetUserAction(new PrimaryGeneratorAction{});
 4
 5    // 各アクションの設定(必要に応じて追加)
 6    // ラン処理
 7    SetUserAction(new RunAction{});
 8
 9    // イベント処理
10    SetUserAction(new EventAction{});
11
12    // トラッキング処理
13    SetUserAction(new TrackingAction{});
14
15    // ステップ処理
16    SetUserAction(new SteppingAction{});
17
18    // スタッキング処理
19    SetUserAction(new StackingAction{});
20}

Build() にはワーカースレッド用のユーザーアクションを登録します。 ここでは主に、 入射粒子の設定(PrimaryGeneratorAction)、 ラン処理の設定(RunAction)、 イベント処理の設定(EventAction)などを SetUserAction(...)を使って設定します。

ActionInitialization:BuildForMaster

1void ActionInitialization::BuildForMaster() const {
2    // マスタースレッド用のRunActionを登録
3    SetUserAction(new RunAction{});
4}

BuildForMaster()はマルチスレッド環境のマスタースレッド専用の初期化関数です。 シーケンシャルモードでは呼び出されません。 通常はRunActionのみをここで設定し、ラン単位での集計処理のほか、 ファイル操作などを設定します。

注釈

RunActionの設定は、BuildBuildForMasterの両方に必要です。

メイン関数(main

 1// プロジェクト名.cc(ここではToyMC.cc)
 2
 3// ユーザー定義クラス
 4#include "ActionInitialization.hh"
 5
 6// Geant4のクラス
 7#include "G4RunManagerFactory.hh"
 8
 9int main(int argc, char** argv)
10{
11    auto rm = G4RunManagerFactory::CreateRunManager();
12
13    // ジオメトリの設定(省略)
14    // 物理モデルの設定(省略)
15
16    // ユーザーアクションの設定
17    rm->SetUserInitialization(new ActionInitialization{});
18
19    // 実験開始(省略)
20    rm->Initialize();
21    rm->BeamOn();
22    delete rm;
23    return 0;
24}

メイン関数でユーザーアクションを設定する最小構成です。 SetUserInitializationを使って、ユーザーアクション一式(ActionInitialization)をRunManagerに登録しています。

参考

詳しくは メイン関数したい(main()) に整理しました。

ユーザー定義クラス(ActionInitialization

コピペして利用できるテンプレートを作成しました。

ヘッダーファイル(include/ActionInitialization.hh

 1// include/ActionInitialization.hh
 2
 3#ifndef ACTION_INITIALIZATION_HH
 4#define ACTION_INITIALIZATION_HH 1
 5
 6#include "G4VUserActionInitialization.hh"
 7
 8// クラス名や名前空間は必要に応じて変更してください
 9namespace ToyMC
10{
11
12class ActionInitialization : public G4VUserActionInitialization
13{
14  public:
15    ActionInitialization() = default;
16    ~ActionInitialization() = default;
17
18  public:
19    void BuildForMaster() const override;
20    void Build() const override;
21};
22
23};  // namespace ToyMC
24
25#endif  // ACTION_INITIALIZATION_HH

注釈

デフォルトコンストラクター/デストラクターを使う場合は、省略可能です。 ここではデフォルトであることを忘れないために明示してあります。

ソースファイル(src/ActionInitialization.cc

 1// src/ActionInitialization.cc
 2
 3// ユーザー定義クラス
 4#include "ActionInitialization.hh"
 5#include "PrimaryGeneratorAction.hh"
 6
 7// 必要に応じて追加
 8#include "RunAction.hh"
 9#include "EventAction.hh"
10#include "TrackingAction.hh"
11#include "SteppingAction.hh"
12#include "StackingAction.hh"
13
14namespace ToyMC
15{
16
17//////////////////////////////////////////////////
18void ActionInitialization::BuildForMaster() const {
19    SetUserAction(new RunAction{});
20}
21//////////////////////////////////////////////////
22
23void ActionInitialization::Build() const
24{
25    // 入射粒子の設定(必須)
26    SetUserAction(new PrimaryGeneratorAction{});
27    // 各ユーザーアクションの設定(必要なアクションを追加)
28    SetUserAction(new RunAction{});
29    SetUserAction(new EventAction{});
30    SetUserAction(new TrackingAction{});
31    SetUserAction(new SteppingAction{});
32    SetUserAction(new StackingAction{});
33}
34
35}  // namespace ToyMC