クラスの自作度
Geant4はツールキットとして配布されており、カスタマイズ要素のかたまりです。
はじめての場合、どのファイルを参考にすればよいのか、よく分かりませんでした。
ドキュメントや講習会スライドをいくつか読んでみて、
どいういうときに、どのファイル(のクラスやメソッド)を編集すればよいのかが、
ようやく分かってきたので整理してみました。
また、それぞれのファイルをどれくらいカスタマイズする必要があるかの
【自作度】を★の数で表してみました。
メイン関数【★★・・・】
- 自作度:
★★・・・
1int main(int argc, char** argv)
2{
3 // RunManagerを作成
4 auto *runManager = G4RunManagerFactory::CreateRunManager();
5
6 // 必須ユーザークラスを設定
7 runManager->SetUserInitialization(new DetectorConstruction);
8 runManager->SetUserInitialization(new PhysicsList);
9 runManager->SetUserInitialization(new ActionInitialization);
10
11 // Geant4のカーネルを初期化
12 runManager->Initialize()
13
14 // シミューレーションを開始
15 runManager->BeamOn()
16
17 // あと片付け
18 delete runManager;
19}
メイン関数の必要な要素を抜粋しました。
これに対話モードや、可視化ツールとスコアリングの設定などを追加します。
付属サンプルのメイン関数を使い回せばよいので、自作度は高くありません。
DetectorConstruction(必須クラス)【★★★★★】
- 自作度:
★★★★★
測定器のジオメトリを作成するクラスです。
G4VUserDetectorConstruction
を継承して作成します。
純粋仮想関数であるConstruct
の自作が必要です。
SensitiveDetector
などの設定フックとしてConstructSDandField
が用意されています。
classDiagram
G4VUserDetectorConstruction <|-- DetectorConstruction
class DetectorConstruction{
+DetectorConstruction() = default
+~DetectorConstruction() override = default
+G4VPhysicalVolume* Construct()
+G4VPhysicalVolume* ConstructSDandField()
}
class G4VUserDetectorConstruction{
+G4VUserDetectorConstruction()
+virtual ~G4VUserDetectorConstruction()
+virtual G4VPhysicalVolume* Construct() = 0
+virtual void ConstructSDandField()
}
PhysicsList(必須クラス)【★・・・・】
- 自作度:
★・・・・
物理の相互作用モデルを設定するクラスです。
必須クラスですが、定義済みのモデルを使うことができるので、自作度は高くありません。
基本的な相互作用モデルは、Geant4チームが用意してくれたクラスを利用できます。
さらに、それらを組み合わせて定義されたプリセットもいくつか用意されています。
まずはその中から自分の目的にあったモデルを選べばOKです。
相互作用をモデルをカスタマイズしたい場合は、G4VModularPhysicsList
を継承したクラスを作成します。
基本的な相互作用クラスから、利用したい相互作用を選択し、RegisterPhysics
を使って追加します。
本気で相互作用モデルを実装したい場合は、G4VPhysicsList
を継承したクラスを作成すればよいと思いますが、これはかなり上級者向けだと思います。
classDiagram
G4VUserPhysicsList <|-- G4VModularPhysicsList
G4VModularPhysicsList <|-- FTFP_BERT
G4VModularPhysicsList <|-- QBBC
G4VModularPhysicsList <|-- QGSP_BERT
G4VModularPhysicsList <|-- QGSP_BIC
class G4VUserPhysicsList {
+G4VUserPhysicsList()
+virtual ~G4VUserPhysicList()
+G4VUserPhysicsList(const G4VUserPhysicsList &aPhysicsList)
+void Construct()
+virtual void ConstructParticle() = 0
+virtual void ConstructProcess() = 0
+virtual void SetCuts()
}
class G4VModularPhysicsList {
+G4VModularPhysicsList()
+virtual ~G4VModularPhysicsList
+virtual void ConstructParticle()
+virtual void ConstructProcess()
+void RegisterPhysics(G4VPhysicsConstructor *aPhysics)
+void ReplacePhysics(G4VPhysicsConstructor *aPhysics)
+void RemovePhysics(G4VPhysicsConstructor *aPhysics)
}
ActionInitialization(必須クラス)【★・・・・】
- 自作度:
★・・・・
ユーザーアクションを設定するクラスです。
G4VUserActionInitialization
を継承して作成します。
純粋仮想関数であるBuild
の中で、自分の目的に必要なユーザーアクションを設定します。
必須クラスですが、自作度は低く、使い回しが可能です。
マルチスレッド機能が有効なときは、Build
の内容がWorker
ノードで実行されます。
Master
ノードの設定フックとしてBuildForMaster
が用意されていますが、こちらは基本的にそのままでよいはずです。
注釈
このクラスは、マルチスレッド機能に対応するために用意されたラッパー的なクラスだと思います。
Build
の中のSetUserAction
で設定する各種のユーザーアクションクラスを編集するほうが多いと思います。
1void ActionInitialization::Build()
2{
3 SetUserAction(new RunAction);
4 SetUserAction(new EventAction);
5 SetUserAction(new StackingAction);
6 SetUserAction(new TrackingAction);
7 SetUserAction(new SteppingAction);
8}
classDiagram
G4VUserActionInitialization <|-- ActionInitialization
class ActionInitialization{
+ActionInitialization() = default
+~ActionInitialization() override = default
+void BuidForMaster() const override
+void Build() const override
}
class G4VUserActionInitialization{
+G4VUserActionInitialization()
+virtual ~G4VUserActionInitialization()
+virtual void BuildForMaster() const
+virtual void Build() const = 0
}
PrimaryGeneratorAction(必須クラス)【★★★★・】
- 自作度:
★★★★・
入射粒子の初期条件を設定するクラスです。
G4VUserPrimaryGeneratorAction
を継承して作成します。
純粋仮想関数であるGeneratePrimaries
を自分で実装します。
classDiagram
G4VUserPrimaryGeneratorAction <|-- PrimaryGeneratorAction
class PrimaryGeneratorAction{
+PrimaryGeneratorAction() = default
+~PrimaryGeneratorAction() override = default
+void GeneratePrimaries(G4Event *aEvent)
}
class G4VUserPrimaryGeneratorAction{
+G4VUserPrimaryGeneratorAction()
+virtual ~G4VUserPrimaryGeneratorAction()
+virtual void GeneratePrimaries(G4Event *aEvent)=0
}
SteppingAction【★★★★★】
- 自作度:
★★★★★
ステップごとのユーザーアクションを設定するクラスです。
G4UserSteppingAction
クラスを継承して作成します。
ユーザー設定用のフックとしてUserSteppingAction
が用意されています。
必須クラスではないですが、自分の目的にあった物理量を取得するために、結局作成することになると思います。
classDiagram
G4UserSteppingAction <|-- SteppingAction
class G4UserSteppingAction{
+G4UserSteppingAction()
+virtual ~G4UserSteppingAction()
+virtual void UserSteppingAction(const G4Step *aStep)
}
class SteppingAction{
+SteppingAction() = default
+~SteppingAction() override = default
+void UserSteppingAction(const G4Step *aStep)
}
TrackingAction【★★・・・】
- 自作度:
★★・・・
トラックごとのユーザーアクションを設定するクラスです。
G4UserSteppingAction
クラスを継承して作成します。
ユーザー設定用のフックとしてUserSteppingAction
が用意されています。
classDiagram
G4UserTrackingAction <|-- TrackingAction
class G4UserTrackingAction{
+G4UserTrackingAction()
+virtual ~G4UserTrackingAction()
+virtual void PreUserTrackingAction(const G4Track *aTrack)
+virtual void PostUserTrackingAction(const G4Track *aTrack)
}
class TrackingAction{
+TrackingAction() = default
+~TrackingAction() override = default
+void PreUserTrackingAction(const G4Track *aTrack)
+void PostUserTrackingAction(const G4Track *aTrack)
}
EventAction【★★★★・】
- 自作度:
★★★★・
イベントごとのユーザーアクションを設定するクラスです。
classDiagram
G4UserEventAction <|-- EventAction
class G4UserEventAction{
+G4UserEventAction()
+virtual ~G4UserEventAction()
+virtual void BeginOfEventAction(const G4Event *aEvent)
+virtual void EndOfEventAction(const G4Event *aEvent)
}
class EventAction{
+EventAction() = default
+~EventAction() override = default
+void BeginOfEventAction(const G4Event *aEvent)
+void EndOfEventAction(const G4Event *aEvent)
}
RunAction【★★・・・】
- 自作度:
★★・・・
ランごとのユーザーアクションを設定するクラスです。
classDiagram
G4UserRunAction <|-- RunAction
class G4UserRunAction{
+G4UserRunAction()
+virtual ~G4UserRunAction()
+virtual void BeginOfRunAction(const G4Run *aRun)
+virtual void EndOfRunAction(const G4Run *aRun)
}
class RunAction{
+RunAction() = default
+~RunAction() override = default
+void BeginOfRunAction(const G4Run *aRun)
+void EndOfRunAction(const G4Run *aRun)
}
Geant4のクラス構造
Geant4は大きく分けて8つのクラスカテゴリーで構成されています。
Run and Event
Tracking and Track
Geometry and Magnetic Field
Particle Definition and Matter
Physics
Hits and Digitization
Visualization
Interfaces
アプリケーションを作成したり、変更したりする場合に、
どのカテゴリーのクラスをいじればよいか、あたりをつける目安になると思います。
詳細はClass Categories and Domainsで確認できます。