どこからでも論理ボリュームしたい(G4LogicalVolumeStore
)
1auto lvs = G4LogicalVolumeStore::GetInstance();
2G4LogicalVolume *lv = lvs->GetVolume("ボリューム名");
G4LogicalVolumeStore
はシングルトンになっていて、GetInstance
でどこからでもアクセスできます。
ジオメトリで作成されたすべての論理ボリュームの情報を持っており、GetVolume
でボリューム名を指定して取得できます。
注釈
内部変数に
std::map<G4String, std::vector<G4LogicalVolume*>>
を持っているため、
ボリューム名を指定する必要があります。
ワールドの大きさを取得したい
1G4LogicalVolume *world = G4LogicalVolumeStore::GetInstance()->GetVolume("World");
2
3G4double solid_x{0.};
4G4double solid_y{0.};
5G4double solid_z{0.};
6
7if (world) {
8 // GetSolidで得られたオブジェクトをG4Boxにdynamic_castする
9 // dynamic_castに失敗するとnullptrになる
10 G4Box *box = dynamic_cast<G4Box*>(world->GetSolid())
11 if (box) {
12 solid_x = box->GetXHalfLength() * 2 / mm;
13 solid_y = box->GetYHalfLength() * 2 / mm;
14 solid_z = box->GetZHalfLength() * 2 / mm;
15 } else {
16 // dynamic_castできなかった場合
17 G4err << "World volume of box not found." << G4endl;
18 }
19} else {
20 // World が見つからなかった場合
21 G4err << "world with the specified name not found." << G4endl;
22}
上のサンプルは、examples/B2/B2a/src/PrimaryGeneratorAction.cc
を参考にしました。
ここでは、ワールドの大きさを基準にして、
入射粒子の座標を設定するために使っていました。
PrimaryGeneratorAction
クラスなど他のクラスからはジオメトリのクラスへの直接アクセスは基本的にできません。
そのような場合でも、G4LogicalVolumeStore
のインスタンス(=シングルトン)を経由して、論理ボリュームやソリッドにアクセスできます。
注釈
ジオメトリのクラスに、サイズを取得するためのpublicなゲッターを追加すれば、アクセスできます。
しかし、G4LogicalVolumeStore
を経由したほうが、はるかに簡単だと思います。