実験室を作りたい(World
)
1#ifndef DetectorConstruction_h
2#define DetectorConstruction_h 1
3
4#include "G4VPhysicalVolume.hh"
5
6class DetectorConstruction : public G4VUserDetectorConstruction
7{
8 public:
9 G4VPhysicalVolume* Construct() override;
10}
11
12#endif DetectorConstruction_h
1#include "DetectorConstruction.hh"
2
3#include "G4Box.hh"
4#include "G4LogicalVolume.hh"
5#include "G4VPhysicalVolume.hh"
6#include "G4NistManager.hh"
7
8G4VPhysicalVolume* DetectorConstruction::Construct()
9{
10 // 実験室の大きさ
11 G4Double world_x = 50.*m;
12 G4Double world_y = 50.*m;
13 G4Double world_z = 50.*m;
14
15 // 実験室の形を決める
16 G4double width, length, height;
17 G4Box *pWorldSolid = new G4Box(
18 "WorldSolid",
19 width=0.5*world_x,
20 length=0.5*world_y,
21 height=0.5*world_z)
22
23 // 実験室の素材を決める
24 G4NistManager *nm = new G4NistManager::Instance();
25 G4Material *pAir = nm->FindOrBuildMaterial("G4_AIR");
26 G4LogicalVolume *pWorldLogical = new G4LogicalVolume(
27 pWorldSolid, // G4VSolid : この論理ボリュームの形状
28 pAir, // G4Material : この論理ボリュームの素材
29 "WorldLogical" // G4String : この論理ボリュームの名前
30 )
31
32 // 実験室の置き場所を決める
33 G4RotationMatrix rotation = G4RotationMatrix(); // 回転 : なし
34 G4ThreeVector direction = G4ThreeVector(0., 0., 0.); // 方向 : (0, 0, 0)
35 G4Transform3D location = G4Transform3D(rotation, direction) // 座標
36
37 G4VPhysicalVolume *pWorldPhysical = new G4PVPlacement(
38 location, // G4Transform3D : 論理ボリュームを配置する座標
39 pWorldLogical, // G4LogicalVolume : 配置する論理ボリューム
40 "WorldPhysical", // G4String : この物理ボリュームの名前
41 0, // G4LogicalVolume: 親ボリュームはなし
42 false, // G4bool pMany(廃止)
43 0, // G4int pCopyNo : コピー番号
44 true // G4bool check overlaps
45 )
46
47 return pWorldPhysical;
48}
測定器シミュレーションを実行する実験室(通称:World)を作成しました。 実験室は50m立方の箱型としました。 どうしてこの大きさにしたかというと、この中にスーパーカミオカンデを配置してみたいからです。
まず、実験室の形を決めます。
箱型の実験室なのでG4Box
を使いました。
G4Box
のサイズに関係する引数はすべて半分の長さで指定することになっているので0.5倍してあります。
次に実験室の材質を決めます。 地球にある実験室なので空気で満たしました。
最後に、置き場所を決めます。 これで、最上位の親ボリュームである実験室の完成です。 あとは、測定装置をこの中に納まるように並べるだけです。
注釈
Geant4では生成された粒子が「実験室の外側に飛び出す」か「運動量がゼロになる」まで、素粒子反応が繰り返されます。なので、ある程度の外枠を定義しておかないと、必要のない計算にまで時間をかけてしまうことになります。
見えなくする
1pWorldLogical->SetVisAttributes(G4VisAttributes::GetInvisible());