電磁カロリメーターしたい
付属サンプルB5は、電磁カロリメーターが使われています。 このサンプルを参考に、再構築してみます。
注釈
カロリメーターは密度の高い結晶シンチレーターを並べて設置し、通過する粒子が落とすエネルギーをシンチレーション光に変換して、吸収したエネルギーを測定する検出器のひとつです。
CsI結晶を定義する関数
1G4LogicalVolume *DefineCellVolume(const G4String &name)
2{
3 // 材料を準備する
4 G4NistManager *nm = new G4NistManager::Instance();
5 auto material = nm->FindOrBuildMaterial("G4_CESIUM_IODIDE");
6
7 // 結晶を作成する
8 G4double halfX = 7.5 * cm; // 幅: 15cm
9 G4double halfY = 7.5 * cm; // 高: 15cm
10 G4double halfZ = 15.0 * cm; // 長: 30cm
11
12 auto solid = new G4Box(
13 "cellBox",
14 halfX,
15 halfY,
16 halfZ,
17 );
18
19 // 論理物体を作成する
20 auto logical = new G4LogicalVolume(
21 solid,
22 CsI,
23 name,
24 )
25
26 // 結晶を着色する
27 G4VisAttributes color = G4VisAttributes(G4Colour::Yellow());
28 logical->SetVisAttributes(color);
29
30 return logical;
31}
電磁カロリメーターを定義する関数
1G4LogicalVolume *DefineCalorimeterVolume(const G4String &name)
2{
3 // 材料を準備する
4 G4NistManager *nm = new G4NistManager::Instance();
5 auto material = nm->FindOrBuildMaterial("G4_CESIUM_IODIDE");
6
7 // カロリメーターを作成する
8 G4double halfX = 1.5 * m; // 幅: 300cm
9 G4double halfY = 30.0 * cm; // 高: 60cm
10 G4double halfZ = 15.0 * cm; // 長: 30cm
11
12 auto solid = G4Box(
13 "emcBox",
14 halfX,
15 halfY,
16 halfZ
17 );
18
19 auto logical = new G4LogicalVolume(
20 solid,
21 material,
22 name,
23 )
24
25 // カロリメータは着色しない(?)
26 G4VisAttributes invisible(false, G4Colour::Yellow());
27 // メモ:直接初期化
28 // コンストラクタを呼び出してオブジェクトを直接初期化
29 // クラスのコンストラクタが引数を取る場合によく使われる
30
31 logical->SetVisAttributes(invisible);
32
33 return logical;
34}
使い方
1class DetectorConstruction : public G4VUserDetectorConstruction
2{
3 public:
4 G4PhysicalVolume* Construct() override;
5 void ConstructSDandField() override;
6 private:
7 G4LogicalVolume* fCellLogical = nullptr;
8}
まずB5/include/DetectorConstruction.hh
で定義されているメソッドやメンバー変数を確認します。
電磁カロリメータの論理ボリューム(fCellLogical
)はプライベート変数で用意されていました。
Construct
メソッドの中でCSI結晶を用意し、それを複製して電磁カロリメーターを組みたてています。
また、ConstructSDandField
メソッドで有感領域を設定しているようです。
1G4PhysicalVolume* DetectorConstruction::Construct()
2{
3 // 材料を調達
4 ConstructMaterials();
5
6 // CsIカロリメーター
7
8 auto emCalorimeterLogical = new DefineCalorimeterVolume("EMCalorimeterLogical");
9
10 new G4PVPlacement(
11 nullptr,
12 G4ThreeVector(0., 0., 2.*m),
13 emCalorimeterLogical,
14 "EMCalorimeterPhysical",
15 secondArmLogical,
16 false
17 0,
18 checkOverlaps);
19
20 // 電磁カロリメーターのセル
21 fCellLogical = new DefineCellVolume("cellLogical");
22
23 G4VPVParameterisation* cellParam = new CellParameterisation();
24 new G4PVParameterised(
25 "cellPhysical",
26 fCellLogical,
27 emCalorimeterLogical,
28 kXAxis,
29 kNofEmCells,
30 cellParam);
31}