シミュレーションの流れ

Geant4にはシミュレーション進行を担当する4種類のManagerクラスがあります。 それぞれが隣り合ったManagerクラスに処理をお願いしたり、結果を受けたりする体制が組まれています。

  1. G4RunManager: G4Runを管理するクラス。 G4EventManagerにイベント処理ををお願いする。

  2. G4EventManager: G4Eventを管理するクラス。 G4TrackingManagerにトラッキング処理をお願いする。 イベント処理が終了したらG4RunManagerに報告する。

  3. G4TrackingManager: G4Trackを管理するクラス。 G4SteppingManagerにステッピング処理をお願いする。 トッラッキング処理が終了したらG4EventManagerに報告する。

  4. G4SteppingManager: G4Stepを管理するクラス。 ステッピング処理を実行する。 ステッピング処理が終了したらG4TrackingManagerに報告する。

この中で、ユーザーが直接指示するのはG4RunManagerだけでOKです。

メイン関数のフローチャート

main()関数でG4RunManagerがどのように処理を進めるかを、 フローチャートに整理しました。

main
|-- RunManager
|    |-- Geometry::Geometry()
|    |-- Physics::Physics()
|    \-- ActionInitialization::ActionInitialization()
|        \-- ActionInitialization::Build()
|            |-- PrimaryGenerator::PrimaryGenerator()
|            |-- RunAction::RunAction()
|            |-- EventAction::EventAction()
|            |-- TrackingAction::TrackingAction()
|            \-- SteppingAction::SteppingAction()
|
|   // RunManagerを初期化
|   // 1. 測定器の設定
|   // 2. 有感検検出器の設定
|   // 3. ジオメトリのロック
|-- RunManager::Initialize()
|    |-- Geometry::Construct()
|    |   \-- Geometry::SetupVolumes()
|    \-- Geometry::ConstructSDandField()
|        |-- Sensor::Sensor{}
|        |-- SDManager::GetSDMpointer()
|        \-- Geometry::SetSensitiveDetector()
|
|   // ビームを入射
|   // 1. ラン開始時のアクションを処理
|   // 2. 入射粒子を設定
|   // 3. イベント開始時のアクションを処理
|   // 4. トラッキング開始前のアクションを処理
|   // 5. 有感検出器にヒットがあったときの処理
|   // 6. ステッピング中の処理
|   // 7. トラッキング終了後のアクションを処理
|   // 8. イベント終了時のアクションを処理
|   // 9. ラン終了時のアクションを処理
|-- RunManager::BeamOn()
|    |-- RunAction::BeginOfRunAction()
|    |-- PrimaryGenerator::GeneratePrimaries()
|    |   |-- ParticleGun{}
|    |   |    |-- SetParticleDefinition()
|    |   |    |-- SetParticleMomentumDirection()
|    |   |    |-- SetParticleEnergy()
|    |   |    \-- SetParticlePosition()
|    |   \-- GeneratePrimaryVertex()
|    |-- EventAction::BeginOfEventAction()
|    |-- TrackingAction::PreUserTrackingAction()
|    |
|    |   // ステップが有感検出器にある場合
|    |   // 1. ProcessHitsの処理
|    |   // 2. UserSteppingActionの処理
|    |-- SensorHit::ProcessHits()
|    |   \-- SensorHit{}
|    |-- SteppingAction::UserSteppingAction()
|    |-- SensorHit::ProcessHits()
|    |   \-- SensorHit{}
|    |-- SteppingAction::UserSteppingAction()
|    |
|    |   // ステップが有感検出器にない場合
|    |   // 1. UserSteppingActionの処理
|    |-- SteppingAction::UserSteppingAction()
|    |-- SteppingAction::UserSteppingAction()
|    |-- TrackingAction::PostUserTrackingAction()
|    |
|    |-- // 複数のトラックがある場合
|    |-- //   PreUserTrackingAction
|    |-- //   PreSteppingAction or ProcessHits
|    |-- //   PostUserTrackingAction
|    |-- // 上記の処理を繰り返す
|    |
|    |-- EventAction::EndOfEventAction()
|    \-- RunAction::EndOfRunAction()
|
|-- delete RunManager
|    |-- Geometry::~Geometry()
|    |-- ActionInitialization::~ActionInitialization()
|    |-- PrimaryGenerator::~PrimaryGenerator()
|    |-- SteppingAction::~SteppingAction()
|    |-- TrackingAction::~TrackingAction()
|    |-- EventAction::~EventAction()
|    \-- RunAction::~RunAction()
|
exit

必須クラスの他に、各種ユーザーアクションや有感検出器を設定し、 それらがどのタイミングで処理されるのかを確認しました。 それぞれのタイミングを把握することで、Geant4の理解度が格段にあがり、 どのファイルに実装すればよいかも目星がつくようになりました。

ヒント

このフローチャートは、Geant4をはじめるときに一番欲しかった情報かもしれないです。

ランの管理者(G4RunManager

イベントの管理者(G4EventManager

トラックの管理者(G4TrackingManager

トラッキングの進行管理を担当します。 トラッキング(G4Tracking)は飛跡の基本単位です。 飛跡には始点と終点があり、その間の移動の様子(G4Track)を管理してくれます。

また、イベントによっては途中で二次粒子(や、さらにその二次粒子)が発生することもあります。 トラッキング処理の順番を整理してくれる担当者(G4StackingManager)と協力して、 1イベントの中で発生したすべての粒子の飛跡情報を測定してくれます。

ステップの管理者(G4SteppingManager

G4SteppingManagerは、シミュレーションの中で粒子が進む最小距離であるステップ(G4Step)の進行管理を担当します。 ステップは、移動前、移動中、移動後の3つの状態で管理されます。

測定の基本はステップ(G4Step

1// G4Step *aStep は事前に定義済み
2G4double energy_deposit = aStep->GetTotalEnergyDeposit();

測定の基本単位はステップ(G4Step)です。 G4StepG4StepPointの リファレンスを確認し、できること(得られる物理量など)を把握しておくと、 自分のアプリケーション作成に役立つはずです。

リファレンス