ホドスコープを作りたい

付属サンプルB5でホドスコープを使っています。 ホドスコープは短冊状のシンチレーターを並べて設置することで、粒子が通過した場所をわかるようにした飛跡検出器のひとつです。

どのように作成しているのか、ソースコードを分解して整理してみます。

1// B5/include/DetectorConstruction.hh
2class DetectorConstruction : public G4VUserDetectorConstruction
3{
4    public:
5        G4PhysicalVolume* Construct() override;
6        void ConstructSDandField() override;
7    private:
8        G4LogicalVolume *fHodoscopeLogical = nullptr;
9}

まずB5/include/DetectorConstruction.hhで定義されているメソッドやメンバー変数を確認します。

ホドスコープの論理ボリューム(fHodoscopeLogical)はプライベート変数で用意されていました。 Constructメソッドの中でホドスコープを組み立て、 ConstructSDandFieldメソッドで有感領域を設定しているようです。

 1// B5/src/DetectorConstruction.cc
 2
 3G4PhysicalVolume* DetectorConstruction::Construct() {
 4
 5    // 材料を調達
 6    ConstructMaterials();  // 材料を一括調達する自作メソッド
 7    auto scintillator = G4Material::GetMaterial("G4_PLASTIC_SC_VINYLTOLUENE");
 8
 9    // 棒状の物体を作成
10    auto hodoscopeSolid = new G4Box(
11        "hodoscopeBox",
12        5.*cm,
13        20.*cm,
14        0.5*.cm
15        );
16
17    // シンチレーターにする
18    fHodoscopeLogical = new G4LogicalVolume(
19        hodoscopeSolid,
20        scintillator,
21        "hodoscopeLogical"
22        );
23
24    // シンチレーターを並べる
25    for (auto i=0; i < kNofHodoscopes; i++) {
26        G4double x1 = (i - kNofHodoscopes/2) * 10. * cm;
27        new G4PVPlacement(
28            nullptr,
29            G4ThreeVector(x1, 0., -1.5*m),
30            fHodoscopeLogical,
31            "hodoscopePhysical",
32            firstArmLogical,    // mother volume
33            false,
34            i,    // Copy No.
35            checkOverlaps
36        );
37    }
38
39    // 可視化オプション
40    G4VisAttributes red(G4Colour::Red());
41    fHodoscopeLogical->SetVisAttributes(red);
42}

Constructメソッドの中で、ホドスコープに関する部分を抜き出してみました。 ホドスコープに使うシンチレーターは、大きさが10 cm x 40 cm x 1の直方体で作ってありました。 また、赤色で表示されるように可視化属性(G4VisAttributes)が設定してあります。

このシンチレーターをkNofHodoscopes個を並べて(G4VUserPlacement)、ホドスコープを組み立てています。

1// B5/include/Constants.hh
2
3constexpr G4int kNofHodoscopes = 15;

シンチレーターの数はB5/include/Constants.hhで15本に設定されています。

 1#include "HodoscopeSD.hh"
 2#include "G4SDManager.hh"
 3
 4void DetectorConstruction::ConstructSDandField()
 5{
 6    auto sdManager = G4SDManager::GetSDMpointer();
 7    G4String SDname;
 8
 9    auto hodoscope = new HodoscopeSD(SDname="/hodoscope");
10    sdManager->AddNewDetector(hodoscope);
11    fHodoscopeLogical->SetSensitiveDetector(hodoscope);
12}

ホドスコープを通過した粒子を検出できるように、有感領域を設定する必要があります。 シンチレーターの論理ボリューム(fHodoscopeLogical)に対して、HodoscopeSDオブジェクトが設定されていました。