Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4RegionStore.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// G4RegionStore
30//
31// Implementation for singleton container
32//
33// History:
34// 18.09.02 G.Cosmo Initial version
35// --------------------------------------------------------------------
36
37#include "G4Region.hh"
38#include "G4RegionStore.hh"
39#include "G4GeometryManager.hh"
40#include "G4VPhysicalVolume.hh"
42
43#include "G4ios.hh"
44
45// ***************************************************************************
46// Static class variables
47// ***************************************************************************
48//
49G4RegionStore* G4RegionStore::fgInstance = 0;
50G4VStoreNotifier* G4RegionStore::fgNotifier = 0;
51G4bool G4RegionStore::locked = false;
52
53// ***************************************************************************
54// Protected constructor: Construct underlying container with
55// initial size of 20 entries
56// ***************************************************************************
57//
59 : std::vector<G4Region*>()
60{
61 reserve(20);
62}
63
64// ***************************************************************************
65// Destructor
66// ***************************************************************************
67//
69{
70 Clean();
71}
72
73// ***************************************************************************
74// Delete all regions from the store except for the world region
75// ***************************************************************************
76//
78{
79 // Do nothing if geometry is closed
80 //
81 if (G4GeometryManager::GetInstance()->IsGeometryClosed())
82 {
83 G4cout << "WARNING - Attempt to delete the region store"
84 << " while geometry closed !" << G4endl;
85 return;
86 }
87
88 // Locks store for deletion of regions. De-registration will be
89 // performed at this stage. G4Regions will not de-register themselves.
90 //
91 locked = true;
92
93 size_t i=0;
94 G4RegionStore* store = GetInstance();
95
96#ifdef G4GEOMETRY_VOXELDEBUG
97 G4cout << "Deleting Regions ... ";
98#endif
99
100 for(iterator pos=store->begin(); pos!=store->end(); ++pos)
101 {
102 if (fgNotifier) { fgNotifier->NotifyDeRegistration(); }
103 if (*pos) { delete *pos; }
104 i++;
105 }
106
107#ifdef G4GEOMETRY_VOXELDEBUG
108 if (store->size() < i-1)
109 { G4cout << "No regions deleted. Already deleted by user ?" << G4endl; }
110 else
111 { G4cout << i-1 << " regions deleted !" << G4endl; }
112#endif
113
114 locked = false;
115 store->clear();
116}
117
118// ***************************************************************************
119// Associate user notifier to the store
120// ***************************************************************************
121//
123{
124 GetInstance();
125 fgNotifier = pNotifier;
126}
127
128// ***************************************************************************
129// Add Region to container
130// ***************************************************************************
131//
133{
134 GetInstance()->push_back(pRegion);
135 if (fgNotifier) { fgNotifier->NotifyRegistration(); }
136}
137
138// ***************************************************************************
139// Remove Region from container
140// ***************************************************************************
141//
143{
144 if (!locked) // Do not de-register if locked !
145 {
146 if (fgNotifier) { fgNotifier->NotifyDeRegistration(); }
147 for (iterator i=GetInstance()->begin(); i!=GetInstance()->end(); i++)
148 {
149 if (**i==*pRegion)
150 {
151 GetInstance()->erase(i);
152 break;
153 }
154 }
155 }
156}
157
158// ***************************************************************************
159// Return ptr to Store, setting if necessary
160// ***************************************************************************
161//
163{
164 static G4RegionStore worldStore;
165 if (!fgInstance)
166 {
167 fgInstance = &worldStore;
168 }
169 return fgInstance;
170}
171
172// ***************************************************************************
173// Loops through all regions to verify if a region has been modified.
174// It returns TRUE if just one region is modified.
175// ***************************************************************************
176//
178{
179 for (iterator i=GetInstance()->begin(); i!=GetInstance()->end(); i++)
180 {
181 if ((*i)->IsModified()) { return true; }
182 }
183 return false;
184}
185
186// ***************************************************************************
187// Loops through all regions to reset flag for modification to FALSE.
188// Used by the run manager to notify that the physics table has been updated.
189// ***************************************************************************
190//
192{
193 for (iterator i=GetInstance()->begin(); i!=GetInstance()->end(); i++)
194 {
195 (*i)->RegionModified(false);
196 }
197}
198
199// ***************************************************************************
200// Forces recomputation of material lists in all regions in the store.
201// ***************************************************************************
202//
204{
205 for (iterator i=GetInstance()->begin(); i!=GetInstance()->end(); i++)
206 {
207 if((*i)->IsInMassGeometry() || (*i)->IsInParallelGeometry() || currentWorld)
208 { (*i)->UpdateMaterialList(); }
209 }
210}
211
212// ***************************************************************************
213// Returns a region through its name specification.
214// ***************************************************************************
215//
217{
218 for (iterator i=GetInstance()->begin(); i!=GetInstance()->end(); i++)
219 {
220 if ((*i)->GetName() == name) { return *i; }
221 }
222 if (verbose)
223 {
224 std::ostringstream message;
225 message << "Region NOT found in store !" << G4endl
226 << " Region " << name << " NOT found in store !" << G4endl
227 << " Returning NULL pointer.";
228 G4Exception("G4RegionStore::GetRegion()",
229 "GeomMgt1001", JustWarning, message);
230 }
231 return 0;
232}
233
234// ***************************************************************************
235// Returns a region through its name specification, if it exists.
236// If it does not exist it will allocate a new region with the given
237// name, delegating the ownership to the caller client.
238// ***************************************************************************
239//
241{
242 G4Region* target = GetRegion(name,false);
243 if (!target)
244 {
245 target = new G4Region(name);
246 }
247 return target;
248}
249
250// **************************************************************************
251// Set a world physical volume pointer to a region that belongs to it.
252// Scan over all world volumes.
253// **************************************************************************
254//
256{
257 // Reset all pointers first
258 //
259 for (iterator i=GetInstance()->begin(); i!=GetInstance()->end(); i++)
260 { (*i)->SetWorld(0); }
261
262 // Find world volumes
263 //
264 G4PhysicalVolumeStore* fPhysicalVolumeStore
266 size_t nPhys = fPhysicalVolumeStore->size();
267 for(size_t iPhys=0; iPhys<nPhys; iPhys++)
268 {
269 G4VPhysicalVolume* fPhys = (*fPhysicalVolumeStore)[iPhys];
270 if(fPhys->GetMotherLogical()) { continue; } // not a world volume
271
272 // Now 'fPhys' is a world volume, set it to regions that belong to it.
273 //
274 for (iterator i=GetInstance()->begin(); i!=GetInstance()->end(); i++)
275 { (*i)->SetWorld(fPhys); }
276 }
277}
278
@ JustWarning
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
static G4GeometryManager * GetInstance()
static G4PhysicalVolumeStore * GetInstance()
static G4RegionStore * GetInstance()
static void SetNotifier(G4VStoreNotifier *pNotifier)
virtual ~G4RegionStore()
void UpdateMaterialList(G4VPhysicalVolume *currentWorld=0)
static void Clean()
G4Region * GetRegion(const G4String &name, G4bool verbose=true) const
G4Region * FindOrCreateRegion(const G4String &name)
void ResetRegionModified()
static void Register(G4Region *pSolid)
G4bool IsModified() const
void SetWorldVolume()
static void DeRegister(G4Region *pSolid)
virtual void NotifyRegistration()=0
virtual void NotifyDeRegistration()=0
G4LogicalVolume * GetMotherLogical() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41