クラスの自作度

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つのクラスカテゴリーで構成されています。

  1. Run and Event

  2. Tracking and Track

  3. Geometry and Magnetic Field

  4. Particle Definition and Matter

  5. Physics

  6. Hits and Digitization

  7. Visualization

  8. Interfaces

アプリケーションを作成したり、変更したりする場合に、 どのカテゴリーのクラスをいじればよいか、あたりをつける目安になると思います。

詳細はClass Categories and Domainsで確認できます。