シングルトン・パターン

シングルトン・パターンとは、あるクラスのインスタンスをプログラム全体で1つだけに制限し、どこからでも同じインスタンスにアクセスできるしくみです。 Geant4の主要クラスでは、このシングルトン・パターンが採用されており、 ユーザーはプログラムのどこからでも同じインスタンスにアクセスできます。

G4RunManager

1auto rm = G4RunManager::GetRunManager();

G4RunManagerはGeant4シミュレーション全体を統括する中核的なシングルトンです。 ジオメトリの構築(G4VUserDetectorConstruction)、 物理プロセスの定義(G4VUserPhysicsList)、および ユーザーアクション(G4UserRunActionなど)を登録し、 シミュレーションの初期化、実行、終了までの一連の流れを管理します。

参考

詳しくはRunManagerしたい(G4RunManagerFactory)に整理しました。

G4NistManager

1auto nm = G4NistManager::Instance();

G4NistManagerは、NISTに準拠した元素や物質を簡単に取得・生成できるシングルトンです。 これにより、どこからでも同じ物質データにアクセスできます。

参考

詳しくは マテリアル管理したい(G4NistManager) に整理しました。

G4MaterialTable

1auto table = G4MaterialTable::GetMaterialTable();
2for (auto* material: *table) {
3    G4cout << material->GetName()
4    << " rho= " << material->GetDensity()/(g/cm3)
5    << " g/cm3" << G4endl;
6}

G4MaterialTableは、すべての物質(G4Materialなど)のインスタンスを一覧で保持する静的テーブルです。 このテーブルを使うことで、登録済みのすべての物質に簡単にアクセスできます。

参考

詳しくは 材料を確認したい(G4Material::GetMaterialTable) に整理しました。

G4ParticleTable

1auto pt = G4ParticleTable::GetParticleTable();

G4ParticleTableは、Geant4内の粒子が定義されたテーブルです。 このテーブルから粒子の情報を検索できます。

G4ProcessTable

1auto pt = G4ProcessTable::GetProcessTable();

G4ProcessTableで物理プロセスを一覧できます。

G4SDManager

1auto sm = G4SDManager::GetSDMpointer();

G4SDManagerはGeant4のSensitive Detectorを管理するシングルトンです。 このマネージャーを通じて、Sensitive Detectorの登録や取得、ヒットの管理を行うことができます。

G4UIManager

1auto um = G4UIManager::GetUIpointer();

G4GeometryManager

1auto gm = G4GeometryManager::GetInstance();

G4GeometryManagerはすべてのジオメトリを管理するインスタンスです。

G4PhysicalVolumeStore

1auto pvs = G4PhysicalVolumeStore::GetInstance();

G4PhysicalVolumeStoreはすべての物理ボリュームを管理するインスタンスです。 物理ボリュームを定義すると、自動でこのインスタンスに追加されます。 登録された物理ボリュームを検索できます。

G4LogicalVolumeStore

1auto lvs = G4LogicalVolumeStore::GetInstance();

G4LogicalVolumeStoreはすべての論理ボリュームを管理するインスタンスです。 論理ボリュームを定義すると、自動でこのインスタンスに追加されます。 登録された論理ボリュームを検索できます。

G4SolidStore

1auto ss = G4SolidStore::GetInstance();

G4SolidStoreはすべてのソリッド(形状)を管理するインスタンスです。 ソリッドを定義すると、自動でこのインスタンスに追加されます。 登録されたソリッドを検索できます。


G4ProductionCutsTable

1auto pct = G4ProductionCutsTable::GetProductionCutsTable();

G4ProductionCutsTableはすべての領域(G4Region)に設定されたカット値を統括管理するインスタンスです。 このテーブルには、各粒子をトラッキングする際のエネルギーしきい値などが含まれています。

G4TransportationManager

1auto tm = G4TransportationManager::GetTransportationManager();

G4TransportationManagerはナビゲーションとフィールドの統合管理を行うシングルトンです。 トラッキング時の空間移動処理や電磁場の適用に関係します。

G4LossTableManager

1auto ltm = G4LossTableManager::Instance();

G4LossTableManagerは、電磁過程(とくにエネルギー損失)に関する情報を一括して管理するためのインスタンスです。 G4EmProcessOptions などと連携して使用します。

G4FieldManagerStore

1auto fms = G4FieldManagerStore::GetInstance();

G4FieldManagerStoreは、複数の電磁場管理オブジェクト(G4FieldManager)を保持するストアです。 それぞれの論理ボリュームに設定されたフィールド管理を一元的に扱います。

G4AnalysisManager

1auto am = G4AnalysisManager::Instance();

G4AnalysisManagerは、シミュレーションで得られた結果を管理するインスタンスです。 ROOT、CSV、XMLなど複数の形式に出力できます。

参考

詳しくは 解析マネージャーしたい(G4VAnalysisManager) に整理しました。

SingletonManager

 1// SingletonManager.hh
 2#pragma once
 3
 4#include "G4RunManager.hh"
 5#include "G4NistManager.hh"
 6#include "G4SDManager.hh"
 7#include "G4ParticleTable.hh"
 8#include "G4MaterialTable.hh"
 9#include "G4AnalysisManager.hh"
10
11class SingletonManager {
12public:
13    // RunManager
14    static G4RunManager* RunManager() {
15        return G4RunManager::GetRunManager();
16    }
17
18    // NIST Manager
19    static G4NistManager* NistManager() {
20        return G4NistManager::Instance();
21    }
22
23    // SD Manager
24    static G4SDManager* SDManager() {
25        return G4SDManager::GetSDMpointer();
26    }
27
28    // Particle Table
29    static G4ParticleTable* ParticleTable() {
30        return G4ParticleTable::GetParticleTable();
31    }
32
33    // Material Table
34    static G4MaterialTable* MaterialTable() {
35        return G4MaterialTable::GetMaterialTable();
36    }
37
38    // Analysis Manager
39    static G4AnalysisManager* AnalysisManager() {
40        return G4AnalysisManager::Instance();
41    }
42
43    // ここに必要なシングルトンを追加可能
44};

シングルトンを取得するメソッドは、命名規則が統一されておらずクラスごとに若干違いがあります。 上記のサンプルは、メソッドの違いを気にせず、統一的にアクセスできるようにしました。

 1#include "SingletonManager.hh"
 2
 3void Example() {
 4    auto rm = SingletonManager::RunManager();
 5    auto nm = SingletonManager::NistManager();
 6    auto sm = SingletonManager::SDManager();
 7    auto pt = SingletonManager::ParticleTable();
 8    auto mt = SingletonManager::MaterialTable();
 9    auto am = SingletonManager::AnalysisManager();
10
11    // 例えば NIST から材料を取得
12    G4Material* water = nm->FindOrBuildMaterial("G4_WATER");
13}

SingletonManager.hhを読み込み、必要なシングルトンを生成&取得します。