ユーザーアクションしたい(G4VUserActionInitialization
)
G4VUserActionInitialization
は、ユーザーアクション(RunAction
、EventAction
など)をまとめて初期化するための抽象基底クラスです。
マルチスレッド環境に対応する枠組みとして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
を継承したクラスを自作します。
このクラスの中で、Build
とBuildForMaster
を定義する必要があります。
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
の設定は、Build
とBuildForMaster
の両方に必要です。
メイン関数(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