37#include "TG4RootDetectorConstruction.h"
40#include <G4FieldManager.hh>
41#include <G4FieldBuilder.hh>
42#include <G4FieldParameters.hh>
43#include <G4LogicalVolumeStore.hh>
44#include <G4Material.hh>
46#include <G4PVPlacement.hh>
47#include <G4ReflectionFactory.hh>
49#include <G4TransportationManager.hh>
51#include <TGeoMCGeometry.h>
52#include <TGeoManager.h>
53#include <TGeoMedium.h>
54#include <TGeoVolume.h>
56#include <TVirtualMC.h>
57#include <TVirtualMCApplication.h>
61#include <G4SystemOfUnits.hh>
64#include <G3MatTable.hh>
65#include <G3MedTable.hh>
66#include <G3SensVolVector.hh>
67#include <G3VolTable.hh>
69#include <G3toG4BuildTree.hh>
70#include <G3toG4MANY.hh>
74#include <Geant4GM/volumes/Factory.h>
75#include <RootGM/volumes/Factory.h>
111 "TG4GeometryManager:",
"Cannot create two instances of singleton.");
115 G4FieldBuilder::Instance();
162 if (!gGeoManager)
new TGeoManager(
"TGeo",
"Root geometry manager");
174 G4cout <<
"TG4GeometryManager::ConstructG4GeometryViaVMC" << G4endl;
189 G3VolTableEntry* first = G3Vol.GetFirstVTE();
195 G3toG4BuildTree(first, 0);
204 G4VPhysicalVolume* world =
new G4PVPlacement(
205 0, G4ThreeVector(), first->GetName(), first->GetLV(), 0,
false, 1);
215 "Geometry construction via VMC is not supported.");
227 G4cout <<
"TG4GeometryManager::ConstructG4GeometryViaVGM" << G4endl;
232 "Geometry was not defined via Root.");
236 TGeoVolume* topVolume = gGeoManager->GetTopVolume();
238 topVolume = (TGeoVolume*)gGeoManager->GetListOfVolumes()->First();
241 "Root top volume not found.");
243 gGeoManager->SetTopVolume(topVolume);
247 if (!gGeoManager->IsClosed()) gGeoManager->CloseGeometry();
251 G4cout <<
"Converting Root geometry to Geant4 via VGM ... " << G4endl;
254 RootGM::Factory rootFactory;
256 rootFactory.SetIgnore(
true);
257 rootFactory.Import(gGeoManager->GetTopNode());
260 Geant4GM::Factory g4Factory;
262 rootFactory.Export(&g4Factory);
264 G4VPhysicalVolume* g4World = g4Factory.World();
270 "Root geometry conversion is not supported.");
280 G4cout <<
"TG4GeometryManager::ConstructG4Geometry: "
288 G4cout <<
"Running TVirtualMCApplication::ConstructGeometry" << G4endl;
291 TVirtualMCApplication::Instance()->ConstructGeometry();
293 TVirtualMCApplication::Instance()->MisalignGeometry();
300 G4cout <<
"Running TVirtualMCApplication::ConstructGeometry" << G4endl;
302#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 22, 8)
304 TGeoManager::LockDefaultUnits(
false);
305 TGeoManager::SetDefaultUnits(TGeoManager::kRootUnits);
306 TGeoManager::LockDefaultUnits(
true);
310 TVirtualMCApplication::Instance()->ConstructGeometry();
315 if (!gGeoManager->IsClosed()) {
316 TGeoVolume* top = (TGeoVolume*)gGeoManager->GetListOfVolumes()->First();
317 gGeoManager->SetTopVolume(top);
318 gGeoManager->CloseGeometry();
322 TVirtualMCApplication::Instance()->MisalignGeometry();
334 G4cout <<
"G4 Stat: instantiated "
349 G4cout <<
"TG4GeometryManager::FillMediumMapFromG3()" << G4endl;
354 for (G4int i = 0; i < G4int(G3Med.GetSize()); i++) {
355 G3MedTableEntry* mediumEntry = G3Med.GetMTE(i);
356 G4int mediumID = mediumEntry->GetID();
359 G4cout <<
"Getting medium ID=" << mediumID << G4endl;
367 medium = mediumMap->
AddMedium(mediumID,
false);
369 TString message =
"Medium ";
371 message +=
" was not found in medium map. New medium will be created";
375 medium->
SetLimits(mediumEntry->GetLimits());
382 G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance();
383 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
384 G4LogicalVolume* lv = (*lvStore)[i];
387 G4String name = lv->GetName();
388 G4String g3Name(name);
391 G4String ext = G4ReflectionFactory::Instance()->GetVolumesNameExtension();
392 if (name.find(ext)) g3Name = g3Name.substr(0, g3Name.find(ext));
393 G4int mediumID = G3Vol.GetVTE(g3Name)->GetNmed();
396 G4cout <<
"Mapping medium Id " << mediumID <<
" to LV " << name << G4endl;
410 "Geometry construction via VMC is not supported.");
421 G4cout <<
"TG4GeometryManager::FillMediumMapFromG4()" << G4endl;
426 const G4MaterialTable* materialTable = G4Material::GetMaterialTable();
427 for (G4int i = 0; i < G4int(materialTable->size()); i++) {
428 G4Material* material = (*materialTable)[i];
431 G4cout <<
"Adding medium name= " << material->GetName()
432 <<
" Id=" << material->GetIndex() << G4endl;
435 medium->
SetName(material->GetName());
440 G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance();
441 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
442 G4LogicalVolume* lv = (*lvStore)[i];
443 G4int mediumID = lv->GetMaterial()->GetIndex();
446 G4cout <<
"Mapping medium Id=" << mediumID <<
" to LV= " << lv->GetName()
459 G4cout <<
"TG4GeometryManager::FillMediumMapFromRoot()" << G4endl;
466 TIter next(gGeoManager->GetListOfMedia());
467 TGeoMedium* geoMedium;
468 while ((geoMedium = (TGeoMedium*)next())) {
469 Int_t mediumId = geoMedium->GetId();
470 G4String mediumName = geoMedium->GetName();
473 Int_t ifield = (Int_t)geoMedium->GetParam(1);
476 Double_t stemax = geoMedium->GetParam(4);
485 limits->SetMaxAllowedStep(stemax * cm);
489 G4cout <<
"Adding medium Id=" << mediumId <<
" name=" << mediumName
490 <<
" limits=" << limits << G4endl;
497 G4String matName = geoMedium->GetMaterial()->GetName();
498 G4Material* material = G4Material::GetMaterial(matName);
501 "Material " + TString(matName) +
" not found.");
507 G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance();
508 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
509 G4LogicalVolume* lv = (*lvStore)[i];
511 TGeoVolume* geoVolume =
nullptr;
514 G4String volName = lv->GetName();
518 G4String ext = G4ReflectionFactory::Instance()->GetVolumesNameExtension();
519 if (volName.find(ext)) volName = volName.substr(0, volName.find(ext));
521 geoVolume = gGeoManager->GetVolume(volName.data());
531 "Root volume " + TString(lv->GetName()) +
" not found");
535 if (geoVolume && geoVolume->IsAssembly())
continue;
537 if (geoVolume && !geoVolume->GetMedium()) {
539 "Root volume " + TString(lv->GetName()) +
" has not medium defined.");
542 G4int mediumID = geoVolume->GetMedium()->GetId();
545 G4cout <<
"Mapping medium Id=" << mediumID <<
" to LV=" << lv->GetName()
569 G4FieldParameters* fieldParameters, G4LogicalVolume* lv)
577 if (lv !=
nullptr) lvName = lv->GetName();
578 auto fieldParameters = G4FieldBuilder::Instance()->GetFieldParameters(lvName);
580 G4FieldParameters::FieldTypeName(fieldParameters->GetFieldType());
581 G4bool isCachedMagneticField = (fieldParameters->GetConstDistance() > 0.);
583 fieldType =
"Global";
586 fieldType =
"Local (in ";
587 fieldType.append(lv->GetName());
588 fieldType.append(
")");
590 if (isCachedMagneticField) {
591 fieldType.append(
" cached");
594 G4cout << fieldType <<
" field created with stepper ";
595 G4cout << G4FieldParameters::StepperTypeName(
596 fieldParameters->GetStepperType())
602 fgFields =
new std::vector<TG4Field*>();
614 G4cout <<
"TG4GeometryManager::ConstructGlobalField()" << G4endl;
617 if (gMC->GetMagField()) {
618 auto fieldParameters = G4FieldBuilder::Instance()->GetFieldParameters();
619 CreateField(gMC->GetMagField(), fieldParameters,
nullptr);
623 G4cout <<
"Create G4MonopoleFieldSetup" << G4endl;
626 TG4Field* tg4Field = (*fgFields)[0];
631 G4cerr <<
"Wrong field type. Only magnetic field is supported in "
632 "G4MonopoleFieldSetup."
658 G4cout <<
"TG4GeometryManager::ConstructZeroFields()" << G4endl;
660 G4bool forceToAllDaughters =
false;
664 G4FieldManager* dummyFieldManager =
new G4FieldManager();
665 G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance();
666 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
667 G4LogicalVolume* lv = (*lvStore)[i];
668 lv->SetFieldManager(dummyFieldManager, forceToAllDaughters);
673 G4FieldManager* fieldManager = 0;
674 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
676 G4LogicalVolume* lv = (*lvStore)[i];
681 if (!medium)
continue;
686 G4cout <<
"Global field in logical volume: " << lv->GetName() << G4endl;
693 fieldManager =
new G4FieldManager();
695 fieldManager->SetDetectorField(0);
696 fieldManager->CreateChordFinder(0);
698 lv->SetFieldManager(fieldManager, forceToAllDaughters);
701 G4cout <<
"Zero magnetic field set to logical volume: " << lv->GetName()
707 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
708 G4LogicalVolume* lv = (*lvStore)[i];
710 if (lv->GetFieldManager() == dummyFieldManager) {
711 lv->SetFieldManager(0, forceToAllDaughters);
716 delete dummyFieldManager;
728 G4cout <<
"TG4GeometryManager::ConstructLocalFields()" << G4endl;
730 TIter next(gGeoManager->GetListOfVolumes());
731 TGeoVolume* geoVolume;
732 while ((geoVolume = (TGeoVolume*)next())) {
734 if (!geoVolume->GetField())
continue;
737 TVirtualMagField* magField =
738 dynamic_cast<TVirtualMagField*
>(geoVolume->GetField());
740 TString message = geoVolume->GetName();
741 message +=
": uknown field type will be ignored.";
743 "No magnetic field is defined.");
748 G4String volumeName = geoVolume->GetName();
751 G4LogicalVolume* lv =
754 TString message = geoVolume->GetName();
755 message +=
" volume not found in Geant4 geometry.";
757 "No magnetic field is defined.");
762 auto fieldBuilder = G4FieldBuilder::Instance();
771 auto fieldParameters = fieldBuilder->CreateFieldParameters(volumeName);
790 "TG4GeometryManager",
"GetMCGeometry",
"No MC geometry defined.");
809 TVirtualMCApplication::Instance()->ConstructOpGeometry();
824 G4cout <<
"TG4GeometryManager::ConstructSDandField() " << G4endl;
847 auto fieldBuilder = G4FieldBuilder::Instance();
848 fieldBuilder->ConstructFieldSetup();
857 G4cout <<
"TG4GeometryManager::FinishGeometry" << G4endl;
867 G4TransportationManager::GetTransportationManager()
868 ->GetNavigatorForTracking()
872 G4cout <<
"TG4GeometryManager::FinishGeometry done" << G4endl;
877 const G4String& volName)
885 return radiatorDescription;
895 G4cout <<
"TG4GeometryManager::SetUserLimits" << G4endl;
897 G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance();
899 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
900 G4LogicalVolume* lv = (*lvStore)[i];
903 if (!medium)
continue;
911 G4String name = medium->
GetName();
920 tg4Limits =
new TG4Limits(name, cuts, controls);
941 tg4Limits->
Update(controls);
944 lv->SetUserLimits(tg4Limits);
948 G4cout <<
"TG4GeometryManager::SetUserLimits done" << G4endl;
957 G4cout <<
"TG4GeometryManager::SetIsLocalField: " << std::boolalpha
958 << isLocalField << G4endl;
969 G4cout <<
"TG4GeometryManager::SetIsZeroField: " << std::boolalpha
970 << isZeroField << G4endl;
981 G4cout <<
"TG4GeometryManager::SetIsMonopoleField: " << std::boolalpha
982 << isMonopoleField << G4endl;
993 G4cout <<
"TG4GeometryManager::SetIsUserMaxStep: " << std::boolalpha
994 << isUserMaxStep << G4endl;
1005 G4cout <<
"TG4GeometryManager::SetIsMaxStepInLowDensityMaterials: "
1006 << std::boolalpha << isMaxStep << G4endl;
1033 auto fieldBuilder = G4FieldBuilder::Instance();
1034 fieldBuilder->SetUserEquationOfMotion(equation, volumeName);
1039 G4MagIntegratorStepper* stepper, G4String volumeName)
1041 auto fieldBuilder = G4FieldBuilder::Instance();
1042 fieldBuilder->SetUserStepper(stepper, volumeName);
1051 for (G4int i = 0; i < G4int(
fgFields->size()); ++i) {
1056 mgfield->PrintStatistics();
Definition of the G4MonopoleFieldSetup class.
Definition of the TG4BiasingManager class.
Definition of the TG4Field class.
Definition of the TG4G3ControlVector class.
Definition of the TG4G3CutVector class.
Definition of the TG4G3Units class.
Definition of the TG4GeometryManager class.
Definition of the TG4GeometryServices class.
Definition of the TG4Globals class and basic container types.
Definition of the TG4Limits class.
Definition of the TG4MCGeometry class.
Definition of the TG4MagneticField class.
Definition of the TG4MediumMap class.
Definition of the TG4Medium class.
Definition of the TG4ModelConfigurationManager class.
Definition of the TG4OpGeometryManager class.
Definition of the TG4RadiatorDescription class.
Definition of the TG4SDManager class.
Definition of the TG4StateManager class.
Definition of the TG4VUserPostDetConstruction class.
Definition of the TG4VUserRegionConstruction class.
static G4MonopoleFieldSetup * GetMonopoleFieldSetup()
void SetMagneticField(G4MagneticField *magneticField)
The class for constructing magnetic, electromagnetic and gravity fields which strength is defined via...
G4Field * GetG4Field() const
Vector of control process values with convenient set/get methods.
Vector of kinetic energy cut values with convenient set/get methods.
The manager class for building Geant4 geometry depending on a selected user input.
G4bool fIsZeroField
option to activate propagating 'ifield = 0' defined in tracking media
static const G4double fgDefaultMaxStep
default max allowed step in materials with density < fLimitDensity
static TG4GeometryManager * fgInstance
this instance
G4bool fIsLocalField
option to activate getting local magnetic fields from Root geometry
void CreateField(TVirtualMagField *magField, G4FieldParameters *fieldParameters, G4LogicalVolume *lv)
void ConstructG4Geometry()
TG4BiasingManager * fBiasingManager
Biasing manager.
TG4ModelConfigurationManager * fFastModelsManager
Fast simulation models manager.
TVirtualMCGeometry * GetMCGeometry() const
void FillMediumMapFromG4()
void ConstructZeroFields()
void ConstructSDandField()
static G4ThreadLocal std::vector< TG4Field * > * fgFields
Fields.
void SetIsLocalField(G4bool isLocalField)
void SetIsMaxStepInLowDensityMaterials(G4bool isMaxStep)
void ConstructLocalFields()
TG4DetConstructionMessenger fMessenger
messenger
void ConstructG4GeometryViaVMC()
TG4GeometryManager(const TString &userGeometry)
void ConstructGlobalField()
void SetUserEquationOfMotion(G4EquationOfMotion *equation, G4String volumeName="")
void SetUserPostDetConstruction(TG4VUserPostDetConstruction *userPostDetConstruction)
TG4GeometryServices * fGeometryServices
geometry services
G4bool fIsUserMaxStep
option to activate max step defined in tracking media
void SetIsZeroField(G4bool isZeroField)
void PrintFieldStatistics() const
G4double fLimitDensity
material density limit for setting max allowed step
void FillMediumMapFromG3()
G4bool fIsMonopoleField
option to activate monopole field setup
TG4OpGeometryManager * fOpManager
optical geometry manager
G4bool fIsMaxStepInLowDensityMaterials
option to activate max step defined in low density materials
TG4VUserRegionConstruction * fUserRegionConstruction
User region construction.
TG4RadiatorDescription * CreateRadiator(const G4String &volName)
TG4ModelConfigurationManager * fEmModelsManager
EM models manager.
void SetUserRegionConstruction(TG4VUserRegionConstruction *userRegionConstruction)
std::vector< TG4RadiatorDescription * > fRadiators
Radiators.
void FillMediumMapFromRoot()
TG4RootDetectorConstruction * fRootDetectorConstruction
Root detector construction.
static const G4double fgDefaultLimitDensity
default material density limit for setting max allowed step
void SetIsUserMaxStep(G4bool isUserMaxStep)
virtual ~TG4GeometryManager()
void SetUserLimits(const TG4G3CutVector &cuts, const TG4G3ControlVector &controls) const
TG4VUserPostDetConstruction * fUserPostDetConstruction
User post detector construction.
void ConstructG4GeometryViaVGM()
void SetIsMonopoleField(G4bool isMonopoleField)
G4String fUserGeometry
User geometry input.
void SetUserStepper(G4MagIntegratorStepper *stepper, G4String volumeName="")
G4double fMaxStepInLowDensityMaterials
max allowed step in materials with density < fLimitDensity
TVirtualMCGeometry * fMCGeometry
VirtualMC geometry.
Services for accessing to Geant4 geometry.
G4LogicalVolume * FindLogicalVolume(const G4String &name, G4bool silent=false) const
static TG4GeometryServices * Instance()
TG4MediumMap * GetMediumMap() const
static void Warning(const TString &className, const TString &methodName, const TString &text)
static void Exception(const TString &className, const TString &methodName, const TString &text)
Extended G4UserLimits class.
G4bool Update(const TG4G3ControlVector &controls)
void SetDefaultMaxAllowedStep()
void SetName(const G4String &name)
Geant4 implementation of the TVirtualMCGeometry interface.
The magnetic field defined via TVirtualMagField.
The map of media to logical volumes.
void MapMedium(G4LogicalVolume *lv, G4int mediumID)
TG4Medium * AddMedium(G4int mediumID, G4bool warn=true)
TG4Medium * GetMedium(G4int mediumID, G4bool warn=true) const
Helper class to keep medium data.
G4UserLimits * GetLimits() const
void SetLimits(G4UserLimits *limits)
void SetIfield(G4int ifield)
void SetMaterial(G4Material *material)
void SetName(const G4String &name)
The model configuration vector with suitable setters and a messenger.
Geant4 implementation of the TVirtualMC interface methods for definition of material properties for o...
The radiator description.
static TG4SDManager * Instance()
void SetNewState(TG4ApplicationState state)
static TG4StateManager * Instance()
The abstract base class for user defined class to customize geometry.
The abstract base class for user defined regions.
virtual G4int VerboseLevel() const
TG4Verbose(const G4String &cmdName)
@ kMisalignGeometry
in MisalignGeometry
@ kConstructGeometry
in ConstructGeometry
@ kNotInApplication
not in VMC application
@ kConstructOpGeometry
in ConstructOpGeometry