17 #include "Geant4GM/volumes/Factory.h"
18 #include "RootGM/volumes/Factory.h"
19 #include "TGeoManager.h"
32 const std::string routineName(
"GGSSaveTGeoAction::BeginOfRunAction");
37 G4Threading::G4GetThreadId() <= 0) {
39 if (!_outFile || (_outFile && _outFile->IsZombie())) {
40 GGSCOUT(ERROR) <<
"Cannot open ROOT file " << _outBase <<
"for run" << run->GetRunID() <<
GGSENDL;
41 throw std::runtime_error(
"");
47 G4Mutex mutexForSaveTGeo = G4MUTEX_INITIALIZER;
50 const std::string routineName(
"GGSSaveTGeoAction::EndOfRunAction");
53 G4Threading::G4GetThreadId() <= 0) {
56 G4AutoLock lock(mutexForSaveTGeo);
60 GGSCOUT(ERROR) <<
"Can't get the geometry. Exit." <<
GGSENDL;
61 throw std::runtime_error(
"Invalid geometry");
66 auto g4Factory = std::make_unique<Geant4GM::Factory>();
67 if (GGSSmartLog::verboseLevel >= GGSSmartLog::DEBUG)
68 g4Factory->SetDebug(1);
69 g4Factory->Import(physVolume);
72 auto rtFactory = std::make_unique<RootGM::Factory>();
73 if (GGSSmartLog::verboseLevel >= GGSSmartLog::DEBUG)
74 rtFactory->SetDebug(1);
75 g4Factory->Export(rtFactory.get());
76 gGeoManager->CloseGeometry();
78 _outFile->WriteObject(gGeoManager,
"GGSGeometry");
Abstract class needed to load GGS geometry.
TFile * GetFileForThisRun(const std::filesystem::path &baseName, const G4Run *run)
Opens a file for a given run and returns a pointer to it.
static GGSGeoPluginManager & GetInstance()
Get the singleton instance.
void EndOfRunAction(const G4Run *run)
Actions executed at end of run.
void CloseFileForThisRun(const std::filesystem::path &baseName, const G4Run *run)
Closes the ROOT output file.
static GGSRootFileService & GetInstance()
Get reference to GGSRootFileService unique instance.
Mother class for user actions in GGS.
GGSSaveTGeoAction()
Constructor.
GGSVGeometryConstruction * GetGeoConstruction()
Returns the geometry construction object.
#define RegisterUA(uaClassName)
Macro for registration of user actions classes.
void BeginOfRunAction(const G4Run *run)
Actions executed at beginning of run.
virtual G4VPhysicalVolume * GetVolume()=0
Get the detector VPhysicalVolume - virtual method.