14#include "TG4GeometryManager.h"
15#include "TG4ModelConfigurationManager.h"
17#include <TGeoManager.h>
18#include <TGeoMedium.h>
20#include <TGeoVolume.h>
22#include <fairlogger/Logger.h>
29void collect(TGeoVolume* volume, std::set<std::string>& media, std::set<TGeoVolume*>& seen)
31 if (volume ==
nullptr || !seen.insert(volume).second) {
34 if (
const TGeoMedium* medium = volume->GetMedium()) {
35 media.insert(medium->GetName());
37 TObjArray*
nodes = volume->GetNodes();
38 if (
nodes ==
nullptr) {
41 for (
int i = 0;
i <
nodes->GetEntriesFast(); ++
i) {
42 auto*
node =
static_cast<TGeoNode*
>(
nodes->UncheckedAt(
i));
43 if (
node !=
nullptr) {
44 collect(
node->GetVolume(), media, seen);
53 std::set<std::string> media;
54 std::set<TGeoVolume*> seen;
55 collect(volume, media, seen);
62 if (gGeoManager ==
nullptr) {
63 LOG(error) <<
"fast simulation: no TGeo geometry when resolving '" << volumeName <<
"'";
66 auto* volume = gGeoManager->GetVolume(volumeName.c_str());
67 if (volume ==
nullptr) {
68 LOG(error) <<
"fast simulation: no volume named '" << volumeName <<
"' in the geometry";
76 : mModels(
std::move(models))
87 auto* manager = TG4GeometryManager::Instance()->GetFastModelsManager();
89 for (
const auto& model : mModels) {
90 std::string regions = model.regions;
91 if (regions.empty()) {
93 for (
const auto& medium : media) {
98 if (medium.find(
' ') != std::string::npos) {
99 LOG(warn) <<
"fast simulation: medium '" << medium <<
"' contains a space and cannot "
100 <<
"be selected; it is skipped";
103 regions += (regions.empty() ?
"" :
" ") + medium;
105 LOG(info) <<
"fast simulation: model " << model.model <<
" covers " << media.size()
106 <<
" media found under '" << model.envelope <<
"'";
108 if (regions.empty()) {
109 LOG(error) <<
"fast simulation: model " << model.model <<
" ended up with no regions";
112 LOG(
debug) <<
"fast simulation: regions for " << model.model <<
": " << regions;
113 manager->SetModelRegions(model.model, regions);
std::unique_ptr< expressions::Node > node
FastSimRegionConstruction(std::vector< ModelRegions > models)
void Construct() override
std::set< std::string > mediaInSubtree(TGeoVolume *volume)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"