電磁カロリメーターしたい

付属サンプル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}