ホドスコープを作りたい
付属サンプル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
オブジェクトが設定されていました。