ジオメトリを作成したい

 1// 1. 形状を定義する
 2G4VSolid *solid = new G4Box(...)  // 四角柱
 3G4VSolid *solid = new G4Tubs(...)  // 円柱
 4
 5// 2. 材料を定義する
 6auto nm = G4NistManager::Instance();
 7auto material = nm->FindOrBuildMaterial("材料名");
 8auto material = nm->FindOrBuildMaterial("G4_AIR");
 9auto material = nm->FindOrBuildMaterial("G4_WATER");
10
11// 3. 測定器(論理ボリューム)を定義する
12G4LogicalVolume *logical = new G4LogicalVolume(...)
13
14// 4. 測定器(物理ボリューム)を配置する
15G4VPhysicalVolume *theDetector = new G4PVPlacement(...)

Geant4空間に配置する構造体をジオメトリと呼びます。 ジオメトリは次の4つのステップで作成できます。

  1. 形状(ソリッド)を作成する(G4VSolid

  2. 素材(マテリアル)を用意する(G4Material

  3. 測定器(論理物体)を組み立てる(G4LogicalVolume

  4. 測定器(物理物体)を配置する(G4VPhysicalVolume

現実世界の実験と同じように、形状と材料を決めて測定装置を作り、実験室に配置するという、とても分かりやすいオブジェクト指向な設計になっています。

形状を作成したい(G4VSolid

1G4Box("name", half_x, half_y, half_z);
2G4Tubs("name", r_min, r_max, half_z, s_phi, d_phi);

直方体(G4Box)や円筒(G4Tubs)など、G4VSolidを継承したクラスを使って、 測定器の形状を定義します。

参考

詳しくは 形状を作成する(G4VSolid) に整理しました。

素材を作成したい(G4Material

1auto nm = G4NistManager::Instance();
2G4Material *pWater = nm->FindOrBuildMaterial("G4_WATER");

測定器に使う素材(G4Material)を定義します。 G4NistManagerを使ってNISTのデータベースに準拠した 元素や物質の情報を簡単に取得できます。

参考

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

測定器を作成したい(G4LogicalVolume

1G4LogicalVolume(
2    G4VSolid *pSolid,
3    G4Material *pMaterial ,
4    const G4String &name,
5    G4FieldManager *pFieldManager=nullptr,
6    G4VSensitiveDetector* pSDetector=nullptr,
7    G4UserLimits* pUserLimits=nullptr,
8    G4bool optimise=true
9);

G4LogicalVolumeで論理ボリュームを作成します。 引数からわかるように、形状(G4VSolid)と素材(G4Material)の設定が必要です。 論理ボリュームは複製して使い回すことができます。

参考

詳しくは 論理ボリュームしたい(G4LogicalVolume) に整理しました。

ヒント

G4LogicalVolumeの引数を確認すると、 磁場などの外場(G4FieldManager)や、 有感検出器(G4VSensitiveDetector)も設定できます。

しかし、最近のユーザーアプリケーションでは、 Constructの中で論理ボリュームを作成したあとに、 ConstructSDandFieldの中で設定を追加することが多いようです。

測定器を配置する(G4PVPlacement

1new G4PVPlacement(
2    nullptr,                  // 回転;なし
3    G4ThreeVector(0, 0, 0),   // 配置;原点に配置
4    logicDetector,            // 論理ボリューム
5    "Detector",               // 物理ボリュームの名前; "Detector"
6    logicWorld,               // 親・論理ボリューム
7    false,                    // 多重配置; しない
8    0,                        // コピー番号
9    false                     // 物理ボリュームの重なり確認; しない

G4PVPlacementで論理ボリューム(G4LogicalVolume)を、 物理ボリューム(G4VPhysicalVolume)として配置します。 配置したボリュームは自動的にG4PhysicalVolumeStoreにも追加されます。

参考

詳しくは 物理ボリュームを配置したい(G4PVPlacement) に整理しました。

1G4PVReplica(...);

繰り返し構造をもつ測定器(や検出器)の場合は G4PVReplicaで効率的に配置できます。

参考

詳しくは 物理ボリュームを複製したい(G4PVReplica) に整理しました

ヒント

G4VPhysicalVolumeは物理ボリュームの抽象基底クラスであり、ユーザーが直接インスタンスを呼び出すことはできません。

ユーザーのアプリケーションでは、 G4PVPlacement(単体配置)、 G4PVReplica(等間隔配置)、 G4PVParameterised(反復配置) といった派生クラスを通じて利用します。

ただし、G4VPhysicalVolume* MyGeometry::Constructのように 関数の戻り値の型として使うことはあります。

リファレンス