どこからでも論理ボリュームしたい(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を経由したほうが、はるかに簡単だと思います。

リファレンス