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>
48#include <G4TransportationManager.hh>
50#include <TGeoMCGeometry.h>
51#include <TGeoManager.h>
52#include <TGeoMedium.h>
53#include <TGeoVolume.h>
55#include <TVirtualMC.h>
56#include <TVirtualMCApplication.h>
60#include <G4SystemOfUnits.hh>
63#include <G3MatTable.hh>
64#include <G3MedTable.hh>
65#include <G3SensVolVector.hh>
66#include <G3VolTable.hh>
68#include <G3toG4BuildTree.hh>
69#include <G3toG4MANY.hh>
73#include <Geant4GM/volumes/Factory.h>
74#include <RootGM/volumes/Factory.h>
110 "TG4GeometryManager:",
"Cannot create two instances of singleton.");
114 G4FieldBuilder::Instance();
161 if (!gGeoManager)
new TGeoManager(
"TGeo",
"Root geometry manager");
173 G4cout <<
"TG4GeometryManager::ConstructG4GeometryViaVMC" << G4endl;
188 G3VolTableEntry* first = G3Vol.GetFirstVTE();
194 G3toG4BuildTree(first, 0);
203 G4VPhysicalVolume* world =
new G4PVPlacement(
204 0, G4ThreeVector(), first->GetName(), first->GetLV(), 0,
false, 1);
214 "Geometry construction via VMC is not supported.");
226 G4cout <<
"TG4GeometryManager::ConstructG4GeometryViaVGM" << G4endl;
231 "Geometry was not defined via Root.");
235 TGeoVolume* topVolume = gGeoManager->GetTopVolume();
237 topVolume = (TGeoVolume*)gGeoManager->GetListOfVolumes()->First();
240 "Root top volume not found.");
242 gGeoManager->SetTopVolume(topVolume);
246 if (!gGeoManager->IsClosed()) gGeoManager->CloseGeometry();
250 G4cout <<
"Converting Root geometry to Geant4 via VGM ... " << G4endl;
253 RootGM::Factory rootFactory;
255 rootFactory.SetIgnore(
true);
256 rootFactory.Import(gGeoManager->GetTopNode());
259 Geant4GM::Factory g4Factory;
261 rootFactory.Export(&g4Factory);
263 G4VPhysicalVolume* g4World = g4Factory.World();
269 "Root geometry conversion is not supported.");
279 G4cout <<
"TG4GeometryManager::ConstructG4Geometry: "
287 G4cout <<
"Running TVirtualMCApplication::ConstructGeometry" << G4endl;
290 TVirtualMCApplication::Instance()->ConstructGeometry();
292 TVirtualMCApplication::Instance()->MisalignGeometry();
299 G4cout <<
"Running TVirtualMCApplication::ConstructGeometry" << G4endl;
301#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 22, 8)
303 TGeoManager::LockDefaultUnits(
false);
304 TGeoManager::SetDefaultUnits(TGeoManager::kRootUnits);
305 TGeoManager::LockDefaultUnits(
true);
309 TVirtualMCApplication::Instance()->ConstructGeometry();
314 if (!gGeoManager->IsClosed()) {
315 TGeoVolume* top = (TGeoVolume*)gGeoManager->GetListOfVolumes()->First();
316 gGeoManager->SetTopVolume(top);
317 gGeoManager->CloseGeometry();
321 TVirtualMCApplication::Instance()->MisalignGeometry();
333 G4cout <<
"G4 Stat: instantiated "
348 G4cout <<
"TG4GeometryManager::FillMediumMapFromG3()" << G4endl;
353 for (G4int i = 0; i < G4int(G3Med.GetSize()); i++) {
354 G3MedTableEntry* mediumEntry = G3Med.GetMTE(i);
355 G4int mediumID = mediumEntry->GetID();
358 G4cout <<
"Getting medium ID=" << mediumID << G4endl;
366 medium = mediumMap->
AddMedium(mediumID,
false);
368 TString message =
"Medium ";
370 message +=
" was not found in medium map. New medium will be created";
374 medium->
SetLimits(mediumEntry->GetLimits());
381 G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance();
382 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
383 G4LogicalVolume* lv = (*lvStore)[i];
386 G4String name = lv->GetName();
388 G4int mediumID = G3Vol.GetVTE(g3Name)->GetNmed();
391 G4cout <<
"Mapping medium Id " << mediumID <<
" to LV " << name << G4endl;
405 "Geometry construction via VMC is not supported.");
416 G4cout <<
"TG4GeometryManager::FillMediumMapFromG4()" << G4endl;
421 const G4MaterialTable* materialTable = G4Material::GetMaterialTable();
422 for (G4int i = 0; i < G4int(materialTable->size()); i++) {
423 G4Material* material = (*materialTable)[i];
426 G4cout <<
"Adding medium name= " << material->GetName()
427 <<
" Id=" << material->GetIndex() << G4endl;
430 medium->
SetName(material->GetName());
435 G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance();
436 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
437 G4LogicalVolume* lv = (*lvStore)[i];
438 G4int mediumID = lv->GetMaterial()->GetIndex();
441 G4cout <<
"Mapping medium Id=" << mediumID <<
" to LV= " << lv->GetName()
454 G4cout <<
"TG4GeometryManager::FillMediumMapFromRoot()" << G4endl;
461 TIter next(gGeoManager->GetListOfMedia());
462 TGeoMedium* geoMedium;
463 while ((geoMedium = (TGeoMedium*)next())) {
464 Int_t mediumId = geoMedium->GetId();
465 G4String mediumName = geoMedium->GetName();
468 Int_t ifield = (Int_t)geoMedium->GetParam(1);
471 Double_t stemax = geoMedium->GetParam(4);
480 limits->SetMaxAllowedStep(stemax * cm);
484 G4cout <<
"Adding medium Id=" << mediumId <<
" name=" << mediumName
485 <<
" limits=" << limits << G4endl;
492 G4String matName = geoMedium->GetMaterial()->GetName();
493 G4Material* material = G4Material::GetMaterial(matName);
496 "Material " + TString(matName) +
" not found.");
502 G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance();
503 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
504 G4LogicalVolume* lv = (*lvStore)[i];
506 TGeoVolume* geoVolume =
nullptr;
511 geoVolume = gGeoManager->GetVolume(volName.data());
521 "Root volume " + TString(lv->GetName()) +
" not found");
525 if (geoVolume && geoVolume->IsAssembly())
continue;
527 if (geoVolume && !geoVolume->GetMedium()) {
529 "Root volume " + TString(lv->GetName()) +
" has not medium defined.");
532 G4int mediumID = geoVolume->GetMedium()->GetId();
535 G4cout <<
"Mapping medium Id=" << mediumID <<
" to LV=" << lv->GetName()
559 G4FieldParameters* fieldParameters, G4LogicalVolume* lv)
567 if (lv !=
nullptr) lvName = lv->GetName();
568 auto fieldParameters = G4FieldBuilder::Instance()->GetFieldParameters(lvName);
570 G4FieldParameters::FieldTypeName(fieldParameters->GetFieldType());
571 G4bool isCachedMagneticField = (fieldParameters->GetConstDistance() > 0.);
573 fieldType =
"Global";
576 fieldType =
"Local (in ";
577 fieldType.append(lv->GetName());
578 fieldType.append(
")");
580 if (isCachedMagneticField) {
581 fieldType.append(
" cached");
584 G4cout << fieldType <<
" field created with stepper ";
585 G4cout << G4FieldParameters::StepperTypeName(
586 fieldParameters->GetStepperType())
592 fgFields =
new std::vector<TG4Field*>();
604 G4cout <<
"TG4GeometryManager::ConstructGlobalField()" << G4endl;
607 if (gMC->GetMagField()) {
608 auto fieldParameters = G4FieldBuilder::Instance()->GetFieldParameters();
609 CreateField(gMC->GetMagField(), fieldParameters,
nullptr);
613 G4cout <<
"Create G4MonopoleFieldSetup" << G4endl;
616 TG4Field* tg4Field = (*fgFields)[0];
621 G4cerr <<
"Wrong field type. Only magnetic field is supported in "
622 "G4MonopoleFieldSetup."
648 G4cout <<
"TG4GeometryManager::ConstructZeroFields()" << G4endl;
650 G4bool forceToAllDaughters =
false;
654 G4FieldManager* dummyFieldManager =
new G4FieldManager();
655 G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance();
656 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
657 G4LogicalVolume* lv = (*lvStore)[i];
658 lv->SetFieldManager(dummyFieldManager, forceToAllDaughters);
663 G4FieldManager* fieldManager = 0;
664 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
666 G4LogicalVolume* lv = (*lvStore)[i];
671 if (!medium)
continue;
676 G4cout <<
"Global field in logical volume: " << lv->GetName() << G4endl;
683 fieldManager =
new G4FieldManager();
685 fieldManager->SetDetectorField(0);
686 fieldManager->CreateChordFinder(0);
688 lv->SetFieldManager(fieldManager, forceToAllDaughters);
691 G4cout <<
"Zero magnetic field set to logical volume: " << lv->GetName()
697 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
698 G4LogicalVolume* lv = (*lvStore)[i];
700 if (lv->GetFieldManager() == dummyFieldManager) {
701 lv->SetFieldManager(0, forceToAllDaughters);
706 delete dummyFieldManager;
718 G4cout <<
"TG4GeometryManager::ConstructLocalFields()" << G4endl;
720 TIter next(gGeoManager->GetListOfVolumes());
721 TGeoVolume* geoVolume;
722 while ((geoVolume = (TGeoVolume*)next())) {
724 if (!geoVolume->GetField())
continue;
727 TVirtualMagField* magField =
728 dynamic_cast<TVirtualMagField*
>(geoVolume->GetField());
730 TString message = geoVolume->GetName();
731 message +=
": uknown field type will be ignored.";
733 "No magnetic field is defined.");
738 G4String volumeName = geoVolume->GetName();
742 if (volumes.empty()) {
743 TString message = geoVolume->GetName();
744 message +=
" volume not found in Geant4 geometry.";
746 "No magnetic field is defined.");
751 auto fieldBuilder = G4FieldBuilder::Instance();
752 std::map<G4String, G4FieldParameters*> parameters;
753 for (
auto lv : volumes) {
754 auto& fieldParameters = parameters[lv->GetName()];
755 if (!fieldParameters) {
756 fieldParameters = fieldBuilder->CreateFieldParameters(lv->GetName());
775 "TG4GeometryManager",
"GetMCGeometry",
"No MC geometry defined.");
798 TVirtualMCApplication::Instance()->ConstructOpGeometry();
813 G4cout <<
"TG4GeometryManager::ConstructSDandField() " << G4endl;
836 auto fieldBuilder = G4FieldBuilder::Instance();
837 fieldBuilder->ConstructFieldSetup();
846 G4cout <<
"TG4GeometryManager::FinishGeometry" << G4endl;
856 G4TransportationManager::GetTransportationManager()
857 ->GetNavigatorForTracking()
861 G4cout <<
"TG4GeometryManager::FinishGeometry done" << G4endl;
866 const G4String& volName)
874 return radiatorDescription;
884 G4cout <<
"TG4GeometryManager::SetUserLimits" << G4endl;
886 G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance();
888 for (G4int i = 0; i < G4int(lvStore->size()); i++) {
889 G4LogicalVolume* lv = (*lvStore)[i];
892 if (!medium)
continue;
900 G4String name = medium->
GetName();
909 tg4Limits =
new TG4Limits(name, cuts, controls);
930 tg4Limits->
Update(controls);
933 lv->SetUserLimits(tg4Limits);
937 G4cout <<
"TG4GeometryManager::SetUserLimits done" << G4endl;
946 G4cout <<
"TG4GeometryManager::SetIsLocalField: " << std::boolalpha
947 << isLocalField << G4endl;
958 G4cout <<
"TG4GeometryManager::SetIsZeroField: " << std::boolalpha
959 << isZeroField << G4endl;
970 G4cout <<
"TG4GeometryManager::SetIsMonopoleField: " << std::boolalpha
971 << isMonopoleField << G4endl;
982 G4cout <<
"TG4GeometryManager::SetIsUserMaxStep: " << std::boolalpha
983 << isUserMaxStep << G4endl;
994 G4cout <<
"TG4GeometryManager::SetIsMaxStepInLowDensityMaterials: "
995 << std::boolalpha << isMaxStep << G4endl;
1022 auto fieldBuilder = G4FieldBuilder::Instance();
1023 fieldBuilder->SetUserEquationOfMotion(equation, volumeName);
1028 G4MagIntegratorStepper* stepper, G4String volumeName)
1030 auto fieldBuilder = G4FieldBuilder::Instance();
1031 fieldBuilder->SetUserStepper(stepper, volumeName);
1040 for (G4int i = 0; i < G4int(
fgFields->size()); ++i) {
1045 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.
void BuildAssemblyLevels()
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