45G4TransportationManager::fTransportationManager =
nullptr;
51G4Navigator* G4TransportationManager::fFirstTrackingNavigator=
nullptr;
56G4TransportationManager::G4TransportationManager()
58 if (fTransportationManager !=
nullptr)
60 G4Exception(
"G4TransportationManager::G4TransportationManager()",
62 "Only ONE instance of G4TransportationManager is allowed!");
67 G4Navigator* trackingNavigator=
nullptr;
68 if( (fFirstTrackingNavigator !=
nullptr) && (fFirstTrackingNavigator->GetExternalNavigation() !=
nullptr) )
70 trackingNavigator = fFirstTrackingNavigator->
Clone();
74 trackingNavigator =
new G4Navigator();
75 if( fFirstTrackingNavigator ==
nullptr )
77 fFirstTrackingNavigator = trackingNavigator;
81 fNavigators.push_back(trackingNavigator);
82 fActiveNavigators.push_back(trackingNavigator);
85 fGeomMessenger =
new G4GeometryMessenger(
this);
86 fFieldManager =
new G4FieldManager();
87 fPropagatorInField=
new G4PropagatorInField(trackingNavigator,fFieldManager);
88 fSafetyHelper =
new G4SafetyHelper();
99 delete fPropagatorInField;
100 delete fGeomMessenger;
102 fTransportationManager =
nullptr;
112 if (fTransportationManager ==
nullptr)
114 fTransportationManager =
new G4TransportationManager;
116 return fTransportationManager;
126 return fTransportationManager;
136 fFieldManager = newFieldManager;
142 if( fPropagatorInField !=
nullptr )
144 fPropagatorInField -> SetDetectorFieldManager( newFieldManager );
156 fNavigators[0] = newNavigator;
157 fActiveNavigators[0] = newNavigator;
158 fPropagatorInField->SetNavigatorForPropagating(newNavigator);
167void G4TransportationManager::ClearNavigators()
169 for (
const auto & fNavigator : fNavigators)
174 fActiveNavigators.clear();
196 wLV, worldName,
nullptr,
false, 0);
213 for (
const auto & fNavigator : fNavigators)
215 if (fNavigator->GetWorldVolume()->GetName() == worldName)
226 if(aWorld !=
nullptr)
230 fNavigators.push_back(aNavigator);
235 =
"World volume with name -" + worldName
236 +
"- does not exist. Create it first by GetParallelWorld() method!";
237 G4Exception(
"G4TransportationManager::GetNavigator(name)",
253 for (
const auto & fNavigator : fNavigators)
255 if (fNavigator->GetWorldVolume() == aWorld) {
return fNavigator; }
258 auto pWorld = std::find(fWorlds.cbegin(), fWorlds.cend(), aWorld);
259 if (pWorld != fWorlds.cend())
263 fNavigators.push_back(aNavigator);
268 =
"World volume with name -" + aWorld->
GetName()
269 +
"- does not exist. Create it first by GetParallelWorld() method!";
270 G4Exception(
"G4TransportationManager::GetNavigator(pointer)",
287 if (aNavigator == fNavigators[0])
289 G4Exception(
"G4TransportationManager::DeRegisterNavigator()",
291 "The navigator for tracking CANNOT be deregistered!");
293 auto pNav = std::find(fNavigators.cbegin(), fNavigators.cend(), aNavigator);
294 if (pNav != fNavigators.cend())
298 DeRegisterWorld((*pNav)->GetWorldVolume());
302 fNavigators.erase(pNav);
308 +
"- not found in memory!";
309 G4Exception(
"G4TransportationManager::DeRegisterNavigator()",
325 auto pNav = std::find(fNavigators.cbegin(), fNavigators.cend(), aNavigator);
326 if (pNav == fNavigators.cend())
330 +
"- not found in memory!";
331 G4Exception(
"G4TransportationManager::ActivateNavigator()",
338 for(
const auto & fActiveNavigator : fActiveNavigators)
340 if (fActiveNavigator == aNavigator) {
return id; }
344 fActiveNavigators.push_back(aNavigator);
357 auto pNav = std::find(fNavigators.cbegin(), fNavigators.cend(), aNavigator);
358 if (pNav != fNavigators.cend())
360 (*pNav)->Activate(
false);
366 +
"- not found in memory!";
367 G4Exception(
"G4TransportationManager::DeActivateNavigator()",
371 auto pActiveNav = std::find(fActiveNavigators.cbegin(),
372 fActiveNavigators.cend(), aNavigator);
373 if (pActiveNav != fActiveNavigators.cend())
375 fActiveNavigators.erase(pActiveNav);
387 for (
const auto & fActiveNavigator : fActiveNavigators)
389 fActiveNavigator->Activate(
false);
391 fActiveNavigators.clear();
395 fNavigators[0]->Activate(
true);
396 fActiveNavigators.push_back(fNavigators[0]);
408 auto pWorld = fWorlds.begin();
409 if ( *pWorld==
nullptr ) { *pWorld=fNavigators[0]->GetWorldVolume(); }
411 for (
const auto & fWorld : fWorlds)
413 if (fWorld->GetName() == name ) {
return fWorld; }
429 auto pWorld = std::find(fWorlds.cbegin(), fWorlds.cend(), aWorld);
430 if (pWorld == fWorlds.cend())
432 fWorlds.push_back(aWorld);
447 auto pWorld = std::find(fWorlds.cbegin(), fWorlds.cend(), aWorld);
448 if (pWorld != fWorlds.cend())
450 fWorlds.erase(pWorld);
455 =
"World volume -" + aWorld->
GetName() +
"- not found in memory!";
456 G4Exception(
"G4TransportationManager::DeRegisterWorld()",
471 auto pNav = fNavigators.cbegin();
473 for (pNav=fNavigators.cbegin(); pNav!=fNavigators.cend(); ++pNav)
475 if (*pNav != trackingNavigator) {
delete *pNav; }
478 fActiveNavigators.clear();
481 fNavigators.push_back(trackingNavigator);
482 fActiveNavigators.push_back(trackingNavigator);
483 fWorlds.push_back(
nullptr);
493 return fFirstTrackingNavigator;
503 fFirstTrackingNavigator= nav;
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4FieldManager is a manager (store) for a pointer to the Field subclass that describes the field of a...
static void SetGlobalFieldManager(G4FieldManager *fieldManager)
G4LogicalVolume represents a leaf node or unpositioned subtree in the geometry hierarchy....
G4VSolid * GetSolid() const
G4Navigator is a class for use by the tracking management, able to obtain/calculate dynamic tracking ...
void Activate(G4bool flag)
G4Navigator * Clone() const
void SetWorldVolume(G4VPhysicalVolume *pWorld)
G4VPhysicalVolume * GetWorldVolume() const
G4PVPlacement represents a single volume positioned within and relative to a mother volume.
G4TransportationManager is a singleton class which stores the navigator used by the transportation pr...
G4bool RegisterWorld(G4VPhysicalVolume *aWorld)
G4VPhysicalVolume * GetParallelWorld(const G4String &worldName)
static G4TransportationManager * GetTransportationManager()
void SetFieldManager(G4FieldManager *newFieldManager)
static G4TransportationManager * GetInstanceIfExist()
static void SetFirstTrackingNavigator(G4Navigator *nav)
G4VPhysicalVolume * IsWorldExisting(const G4String &worldName)
G4Navigator * GetNavigatorForTracking() const
~G4TransportationManager()
G4int ActivateNavigator(G4Navigator *aNavigator)
void DeActivateNavigator(G4Navigator *aNavigator)
G4Navigator * GetNavigator(const G4String &worldName)
void ClearParallelWorlds()
void DeRegisterNavigator(G4Navigator *aNavigator)
void SetNavigatorForTracking(G4Navigator *newNavigator)
static G4Navigator * GetFirstTrackingNavigator()
G4VPhysicalVolume is an abstract base class for the representation of a positioned volume....
const G4RotationMatrix * GetRotation() const
const G4ThreeVector GetTranslation() const
G4LogicalVolume * GetLogicalVolume() const
const G4String & GetName() const