15#include "TG4GeometryManager.h"
17#include <G4UIcommandTree.hh>
18#include <G4UImanager.hh>
19#include <TGeoManager.h>
20#include <TVirtualMC.h>
21#include <fairlogger/Logger.h>
24#include <unordered_set>
32const TGeoVolume* findZeroFieldVolume(
const TGeoVolume* vol, std::unordered_set<const TGeoVolume*>& visited)
34 if (!visited.insert(vol).second) {
37 auto med = vol->GetMedium();
38 if (med && !vol->IsAssembly() && med->GetParam(1) == 0) {
41 for (
int i = 0;
i < vol->GetNdaughters(); ++
i) {
42 if (
auto nf = findZeroFieldVolume(vol->GetNode(
i)->GetVolume(), visited)) {
55 auto tree = G4UImanager::GetUIpointer()->GetTree()->FindCommandTree(
"/mcMagField/");
56 auto field = TVirtualMC::GetMC()->GetMagField();
57 if (!
tree || !field) {
61 for (
int i = 1;
i <=
tree->GetTreeEntry(); ++
i) {
62 std::string
path =
tree->GetTree(
i)->GetPathName();
64 auto vol = gGeoManager->GetVolume(
name.c_str());
66 LOG(warn) <<
"local field: no volume " <<
name <<
"; its field parameters are unused";
70 std::unordered_set<const TGeoVolume*> visited;
71 if (
auto nf = findZeroFieldVolume(vol, visited)) {
72 LOG(warn) <<
"local field: volume " <<
name <<
" contains the zero-field volume " << nf->GetName() <<
"; skipped";
76 LOG(info) <<
"local field: volume " <<
name <<
" uses the parameters in /mcMagField/" <<
name <<
"/";
80 TG4GeometryManager::Instance()->SetIsLocalField(
true);
82 LOG(warn) <<
"local field: Geant4 VMC builds local fields only with TGeo navigation; the global field applies everywhere";
static const G4Params & Instance()
void Construct() override
GLuint const GLchar * name
GLsizei const GLchar *const * path
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))