Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4TransportationManager.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// $Id$
28//
29//
30// G4TransportationManager
31//
32// Created : J.Apostolakis, 1997
33// Reviewed: G.Cosmo, 2006
34// 10.04.07 V.Ivanchenko Use unique G4SafetyHelper
35//
36// --------------------------------------------------------------------
37
39
40#include <algorithm>
41
44#include "G4FieldManager.hh"
45#include "G4LogicalVolume.hh"
46#include "G4PVPlacement.hh"
47
48// Initialise the static instance of the singleton
49//
50G4TransportationManager* G4TransportationManager::fTransportationManager=0;
51
52// ----------------------------------------------------------------------------
53// Constructor
54//
56{
57 if (fTransportationManager)
58 {
59 G4Exception("G4TransportationManager::G4TransportationManager()",
60 "GeomNav0002", FatalException,
61 "Only ONE instance of G4TransportationManager is allowed!");
62 }
63
64 // Create the navigator for tracking and activate it; add to collections
65 //
66 G4Navigator* trackingNavigator = new G4Navigator();
67 trackingNavigator->Activate(true);
68 fNavigators.push_back(trackingNavigator);
69 fActiveNavigators.push_back(trackingNavigator);
70 fWorlds.push_back(trackingNavigator->GetWorldVolume()); // NULL registered
71
72 fGeomMessenger = new G4GeometryMessenger(this);
73 fFieldManager = new G4FieldManager();
74 fPropagatorInField= new G4PropagatorInField(trackingNavigator,fFieldManager);
75 fSafetyHelper = new G4SafetyHelper();
76}
77
78// ----------------------------------------------------------------------------
79// Destructor
80//
82{
83 delete fFieldManager;
84 delete fPropagatorInField;
85 ClearNavigators();
86 delete fGeomMessenger;
87 delete fSafetyHelper;
88}
89
90// ----------------------------------------------------------------------------
91// GetTransportationManager()
92//
93// Retrieve the static instance of the singleton
94//
96{
97 static G4TransportationManager theInstance;
98 if (!fTransportationManager)
99 fTransportationManager = &theInstance;
100
101 return fTransportationManager;
102}
103
104// ----------------------------------------------------------------------------
105// SetFieldManager()
106//
107// Set the associated field manager.
108//
110{
111 fFieldManager = newFieldManager;
112
113 // Message the PropagatorInField,
114 // which also maintains this information (to be reviewed)
115 //
116 if( fPropagatorInField )
117 {
118 fPropagatorInField -> SetDetectorFieldManager( newFieldManager );
119 }
120}
121
122// ----------------------------------------------------------------------------
123// ClearNavigators()
124//
125// Clear collection of navigators and delete allocated objects.
126// Called only by the class destructor.
127//
128void G4TransportationManager::ClearNavigators()
129{
130 std::vector<G4Navigator*>::iterator pNav;
131 for (pNav=fNavigators.begin(); pNav!=fNavigators.end(); pNav++)
132 {
133 delete *pNav;
134 }
135 fNavigators.clear();
136 fActiveNavigators.clear();
137 fWorlds.clear();
138}
139
140// ----------------------------------------------------------------------------
141// GetParallelWorld()
142//
143// Provided the name of a world volume, returns the associated world pointer.
144// If not existing, create (allocate) and register it in the collection.
145//
148{
149 G4VPhysicalVolume* wPV = IsWorldExisting(worldName);
150 if (!wPV)
151 {
153 G4LogicalVolume* wLV = wPV->GetLogicalVolume();
154 wLV = new G4LogicalVolume(wLV->GetSolid(), 0,
155 worldName);
156 wPV = new G4PVPlacement (wPV->GetRotation(),
157 wPV->GetTranslation(),
158 wLV, worldName, 0, false, 0);
159 RegisterWorld(wPV);
160 }
161 return wPV;
162}
163
164// ----------------------------------------------------------------------------
165// GetNavigator()
166//
167// Provided the name of a world volume, returns the associated navigator.
168// If not existing, create it and register it in the collection, throw an
169// exception if the associated parallel world does not exist.
170//
172{
173 // If already existing, return the stored pointer to the navigator
174 //
175 std::vector<G4Navigator*>::iterator pNav;
176 for (pNav=fNavigators.begin(); pNav!=fNavigators.end(); pNav++)
177 {
178 if ((*pNav)->GetWorldVolume()->GetName() == worldName) { return *pNav; }
179 }
180
181 // Check if world of that name already exists,
182 // create a navigator and register it
183 //
184 G4Navigator* aNavigator = 0;
185 G4VPhysicalVolume* aWorld = IsWorldExisting(worldName);
186 if(aWorld)
187 {
188 aNavigator = new G4Navigator();
189 aNavigator->SetWorldVolume(aWorld);
190 fNavigators.push_back(aNavigator);
191 }
192 else
193 {
194 G4String message
195 = "World volume with name -" + worldName
196 + "- does not exist. Create it first by GetParallelWorld() method!";
197 G4Exception("G4TransportationManager::GetNavigator(name)",
198 "GeomNav0002", FatalException, message);
199 }
200
201 return aNavigator;
202}
203
204// ----------------------------------------------------------------------------
205// GetNavigator()
206//
207// Provided a pointer to a world volume, returns the associated navigator.
208// Create it in case not existing and add it to the collection.
209// If world volume not existing, issue an exception.
210//
212{
213 std::vector<G4Navigator*>::iterator pNav;
214 for (pNav=fNavigators.begin(); pNav!=fNavigators.end(); pNav++)
215 {
216 if ((*pNav)->GetWorldVolume() == aWorld) { return *pNav; }
217 }
218 G4Navigator* aNavigator = 0;
219 std::vector<G4VPhysicalVolume*>::iterator pWorld =
220 std::find(fWorlds.begin(), fWorlds.end(), aWorld);
221 if (pWorld != fWorlds.end())
222 {
223 aNavigator = new G4Navigator();
224 aNavigator->SetWorldVolume(aWorld);
225 fNavigators.push_back(aNavigator);
226 }
227 else
228 {
229 G4String message
230 = "World volume with name -" + aWorld->GetName()
231 + "- does not exist. Create it first by GetParallelWorld() method!";
232 G4Exception("G4TransportationManager::GetNavigator(pointer)",
233 "GeomNav0002", FatalException, message);
234 }
235
236 return aNavigator;
237}
238
239// ----------------------------------------------------------------------------
240// DeRegisterNavigator()
241//
242// Provided a pointer to an already allocated navigator object, removes the
243// associated entry in the navigators collection (remove pair) but does not
244// delete the actual pointed object, which is still owned by the caller.
245// The navigator for tracking -cannot- be deregistered.
246//
248{
249 if (aNavigator == fNavigators[0])
250 {
251 G4Exception("G4TransportationManager::DeRegisterNavigator()",
252 "GeomNav0003", FatalException,
253 "The navigator for tracking CANNOT be deregistered!");
254 }
255 std::vector<G4Navigator*>::iterator pNav =
256 std::find(fNavigators.begin(), fNavigators.end(), aNavigator);
257 if (pNav != fNavigators.end())
258 {
259 // Deregister associated world volume
260 //
261 DeRegisterWorld((*pNav)->GetWorldVolume());
262
263 // Deregister the navigator
264 //
265 fNavigators.erase(pNav);
266 }
267 else
268 {
269 G4String message
270 = "Navigator for volume -" + aNavigator->GetWorldVolume()->GetName()
271 + "- not found in memory!";
272 G4Exception("G4TransportationManager::DeRegisterNavigator()",
273 "GeomNav1002", JustWarning, message);
274 }
275}
276
277// ----------------------------------------------------------------------------
278// ActivateNavigator()
279//
280// Provided a pointer to an already allocated navigator object, set to 'true'
281// the associated activation flag for the navigator in the collection.
282// If the provided navigator is not already registered, issue a warning
283// Return the index of the activated navigator. This index should be used for
284// ComputeStep() method of G4PathFinder.
285//
287{
288 std::vector<G4Navigator*>::iterator pNav =
289 std::find(fNavigators.begin(), fNavigators.end(), aNavigator);
290 if (pNav == fNavigators.end())
291 {
292 G4String message
293 = "Navigator for volume -" + aNavigator->GetWorldVolume()->GetName()
294 + "- not found in memory!";
295 G4Exception("G4TransportationManager::ActivateNavigator()",
296 "GeomNav1002", JustWarning, message);
297 return -1;
298 }
299
300 aNavigator->Activate(true);
301 G4int id = 0;
302 std::vector<G4Navigator*>::iterator pActiveNav;
303 for(pActiveNav=fActiveNavigators.begin();
304 pActiveNav!=fActiveNavigators.end(); pActiveNav++)
305 {
306 if (*pActiveNav == aNavigator) { return id; }
307 id++;
308 }
309
310 fActiveNavigators.push_back(aNavigator);
311 return id;
312}
313
314// ----------------------------------------------------------------------------
315// DeActivateNavigator()
316//
317// Provided a pointer to an already allocated navigator object, set to 'false'
318// the associated activation flag in the navigators collection.
319// If the provided navigator is not already registered, issue a warning.
320//
322{
323 std::vector<G4Navigator*>::iterator pNav =
324 std::find(fNavigators.begin(), fNavigators.end(), aNavigator);
325 if (pNav != fNavigators.end())
326 {
327 (*pNav)->Activate(false);
328 }
329 else
330 {
331 G4String message
332 = "Navigator for volume -" + aNavigator->GetWorldVolume()->GetName()
333 + "- not found in memory!";
334 G4Exception("G4TransportationManager::DeActivateNavigator()",
335 "GeomNav1002", JustWarning, message);
336 }
337
338 std::vector<G4Navigator*>::iterator pActiveNav =
339 std::find(fActiveNavigators.begin(), fActiveNavigators.end(), aNavigator);
340 if (pActiveNav != fActiveNavigators.end())
341 {
342 fActiveNavigators.erase(pActiveNav);
343 }
344}
345
346// ----------------------------------------------------------------------------
347// InactivateAll()
348//
349// Inactivate all the navigators except for the tracking one, and clear the
350// store of active navigators.
351//
353{
354 std::vector<G4Navigator*>::iterator pNav;
355 for (pNav=fActiveNavigators.begin(); pNav!=fActiveNavigators.end(); pNav++)
356 {
357 (*pNav)->Activate(false);
358 }
359 fActiveNavigators.clear();
360
361 // Restore status for the navigator for tracking
362 //
363 fNavigators[0]->Activate(true);
364 fActiveNavigators.push_back(fNavigators[0]);
365}
366
367// ----------------------------------------------------------------------------
368// IsWorldExisting()
369//
370// Verify existance or not of an istance of the world volume with
371// same name in the collection. Return the world pointer if existing.
372//
375{
376 std::vector<G4VPhysicalVolume*>::iterator pWorld = fWorlds.begin();
377 if (*pWorld==0) { *pWorld=fNavigators[0]->GetWorldVolume(); }
378
379 for (pWorld=fWorlds.begin(); pWorld!=fWorlds.end(); pWorld++)
380 {
381 if ((*pWorld)->GetName() == name ) { return *pWorld; }
382 }
383 return 0;
384}
385
386// ----------------------------------------------------------------------------
387// RegisterWorld()
388//
389// Provided a pointer to an already allocated world object, check and add the
390// associated entry in the worlds collection. Return 'true' if registration
391// succeeds and the new entry is created.
392//
393G4bool G4TransportationManager::RegisterWorld( G4VPhysicalVolume* aWorld )
394{
395 G4bool done = false;
396
397 std::vector<G4VPhysicalVolume*>::iterator pWorld =
398 std::find(fWorlds.begin(), fWorlds.end(), aWorld);
399 if (pWorld == fWorlds.end())
400 {
401 fWorlds.push_back(aWorld);
402 done = true;
403 }
404 return done;
405}
406
407// ----------------------------------------------------------------------------
408// DeRegisterWorld()
409//
410// Provided a pointer to an already allocated world object, removes the
411// associated entry in the worlds collection but does not delete the actual
412// pointed object, which is still owned by the caller.
413//
414void G4TransportationManager::DeRegisterWorld( G4VPhysicalVolume* aWorld )
415{
416 std::vector<G4VPhysicalVolume*>::iterator pWorld =
417 std::find(fWorlds.begin(), fWorlds.end(), aWorld);
418 if (pWorld != fWorlds.end())
419 {
420 fWorlds.erase(pWorld);
421 }
422 else
423 {
424 G4String message
425 = "World volume -" + aWorld->GetName() + "- not found in memory!";
426 G4Exception("G4TransportationManager::DeRegisterWorld()",
427 "GeomNav1002", JustWarning, message);
428 }
429}
@ JustWarning
@ FatalException
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4VSolid * GetSolid() const
void Activate(G4bool flag)
void SetWorldVolume(G4VPhysicalVolume *pWorld)
G4VPhysicalVolume * GetWorldVolume() const
G4VPhysicalVolume * GetParallelWorld(const G4String &worldName)
static G4TransportationManager * GetTransportationManager()
void SetFieldManager(G4FieldManager *newFieldManager)
G4VPhysicalVolume * IsWorldExisting(const G4String &worldName)
G4Navigator * GetNavigatorForTracking() const
G4int ActivateNavigator(G4Navigator *aNavigator)
void DeActivateNavigator(G4Navigator *aNavigator)
G4Navigator * GetNavigator(const G4String &worldName)
void DeRegisterNavigator(G4Navigator *aNavigator)
const G4RotationMatrix * GetRotation() const
G4LogicalVolume * GetLogicalVolume() const
const G4String & GetName() const
const G4ThreeVector & GetTranslation() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41