ユーザーアクションしたい(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
を継承したクラスを自作します。
そのメンバーには仮想関数としてBuildForMaster
とBuild
を定義します。
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
の設定は必須です。
その他のアクション設定は任意です。