ジオメトリ作成の流れ

1G4Material *pMaterial = new G4Material(...)
2G4VSolid *pDetectorSolid = new G4Box(...)
3G4LogicalVolume *pDetectorLogical = new G4LogicalVolume(...)
4G4VPhysicalVolume *pDetectorPhysical = new G4PVPlacement(...)

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

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

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

  3. 測定器を組み立てる(G4LogicalVolume

  4. 測定器を配置する(G4VPhysicalVolume

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

測定装置を作成した段階は「論理ボリューム」と呼びます。 論理ボリュームは複製して使い回すことができます。

論理ボリュームを実験室内の座標に配置すると「物理ボリューム」になります。

素材(マテリアル)の作り方

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

G4Materialを使って素材を作成します。

現実世界と同じように、Geant4の世界でも 物質(G4Material)は元素(G4Element)の組み合わせ、 元素は同位体(G4Isotope)の組み合わせで合成できるようになっています。

標準的な素材の場合、G4NistManagerを使ってNISTのデータベースにある物質や元素を参照して使うのが簡単です。

形状(ソリッド)の作り方

1G4double diameter = 39.3*m;
2G4double height = 41.4*m;
3G4double rmin, rmax, z, sphi, dphi;
4G4Tubs *pTankSolid = G4Tubs("TankSolid", rmin=0., rmax=0.5*diameter, z=0.5*height, sphi=0.*deg, dphi=360.*deg);

G4VSolidを継承したクラスを使って形状を作ります。 箱型(G4Box)、円柱型(G4Tubs)など基本的な立体クラスは用意されています。 これらのクラスから作ったオブジェクトをブーリアン演算して、より複雑な形を作ることもできるようです。

測定装置の作り方

1G4LogicalVolume *pTankLogical = new G4LogicalVolume(
2    pTankSolid,
3    pWater,
4    "Super Kamiokande",
5)

素材(G4Material)と形状(G4VSolid)を指定して、 論理ボリューム(G4LogicalVolumeオブジェクト)を作成します。

測定器の並べ方

 1G4RotationMatrix rotation = G4RotationMatrix();  // no rotation
 2G4ThreeVector direction = G4ThreeVector();       // at (0, 0, 0)
 3G4Transform3D location = G4Ttransform3D(fRotation, fDirection)
 4G4VPhysicalVolume *pTankPhysical = new G4PVPlacement(
 5    location,
 6    pTankLogical,     // この論理ボリューム
 7    "TankPhysical",
 8    pWorldLogical,    // 親となる論理ボリューム
 9    false,      // boolean operation
10    0,          // copy number
11    True,       // check overlaps
12)

G4PVPlacementを使って、測定器を配置します。 測定器の場所は、次に書いたWorldの原点に対して座標を指定します。

実験室の作り方

 1G4NistManager *nm = new G4NistManager::Instance();
 2G4Material *pAir = nm->FindOrBuilldMaterial("G4_AIR");
 3
 4G4double world_x = 50.*m;
 5G4double world_y = 50.*m;
 6G4double world_z = 50.*m;
 7G4Box *pWorldSolid = new G4Box("WorldSolid", 0.5*world_x, 0.5*world_y, 0.5*world_z);
 8G4LogicalVolume *pWorldLogical = new G4LogicalVolume(pWorldSolid, pAir, "Kamioka Mine");
 9
10G4RotationMatrix rotation = G4RotationMatrix();    // no rotation
11G4ThreeVector direction = G4ThreeVector();         // at (0, 0, 0)
12G4Transform3D location = G4Ttransform3D(location, direction)
13G4VPhysicalVolume *pWorldPhysical = new G4PVPlacement(
14    location,
15    pWorldLogical,
16    "WorldPhysical",
17    nullptr,    // mother volume = none
18    false,      // boolean operation = false
19    0,          // copy number
20    True        // check overlaps
21    )

通常Worldと呼ばれる実験室の空間を作成します。 地球上の実験室を想定して空気で満たしておきました。

このボリュームは親ボリュームを持ちません。 すべての測定装置はこの空間の中に収まるように配置する必要があります。