Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/management/src/G4RegionStore.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /geometry/management/src/G4RegionStore.cc (Version 11.3.0) and /geometry/management/src/G4RegionStore.cc (Version 4.0.p1)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 // G4RegionStore implementation                   
 27 //                                                
 28 // 18.09.02, G.Cosmo - Initial version            
 29 // -------------------------------------------    
 30                                                   
 31 #include "G4Region.hh"                            
 32 #include "G4RegionStore.hh"                       
 33 #include "G4GeometryManager.hh"                   
 34 #include "G4VPhysicalVolume.hh"                   
 35 #include "G4PhysicalVolumeStore.hh"               
 36                                                   
 37 #include "G4ios.hh"                               
 38 #include "G4AutoLock.hh"                          
 39                                                   
 40 namespace                                         
 41 {                                                 
 42   G4Mutex mapMutex = G4MUTEX_INITIALIZER;         
 43 }                                                 
 44                                                   
 45 // *******************************************    
 46 // Static class variables                         
 47 // *******************************************    
 48 //                                                
 49 G4RegionStore* G4RegionStore::fgInstance = nul    
 50 G4ThreadLocal G4VStoreNotifier* G4RegionStore:    
 51 G4ThreadLocal G4bool G4RegionStore::locked = f    
 52                                                   
 53 // *******************************************    
 54 // Protected constructor: Construct underlying    
 55 // initial size of 20 entries                     
 56 // *******************************************    
 57 //                                                
 58 G4RegionStore::G4RegionStore()                    
 59                                                   
 60 {                                                 
 61   reserve(20);                                    
 62 }                                                 
 63                                                   
 64 // *******************************************    
 65 // Destructor                                     
 66 // *******************************************    
 67 //                                                
 68 G4RegionStore::~G4RegionStore()                   
 69 {                                                 
 70   Clean();  // Delete all regions in the store    
 71   G4Region::Clean();  // Delete allocated sub-    
 72 }                                                 
 73                                                   
 74 // *******************************************    
 75 // Delete all regions from the store except fo    
 76 // *******************************************    
 77 //                                                
 78 void G4RegionStore::Clean()                       
 79 {                                                 
 80   // Do nothing if geometry is closed             
 81   //                                              
 82   if (G4GeometryManager::GetInstance()->IsGeom    
 83   {                                               
 84     G4cout << "WARNING - Attempt to delete the    
 85            << " while geometry closed !" << G4    
 86     return;                                       
 87   }                                               
 88                                                   
 89   // Locks store for deletion of regions. De-r    
 90   // performed at this stage. G4Regions will n    
 91   //                                              
 92   locked = true;                                  
 93                                                   
 94   G4RegionStore* store = GetInstance();           
 95                                                   
 96   for(auto pos=store->cbegin(); pos!=store->ce    
 97   {                                               
 98     if (fgNotifier != nullptr) { fgNotifier->N    
 99     delete *pos;                                  
100   }                                               
101                                                   
102   store->bmap.clear(); store->mvalid = false;     
103   locked = false;                                 
104   store->clear();                                 
105 }                                                 
106                                                   
107 // *******************************************    
108 // Associate user notifier to the store           
109 // *******************************************    
110 //                                                
111 void G4RegionStore::SetNotifier(G4VStoreNotifi    
112 {                                                 
113   GetInstance();                                  
114   fgNotifier = pNotifier;                         
115 }                                                 
116                                                   
117 // *******************************************    
118 // Bring contents of internal map up to date a    
119 // *******************************************    
120 //                                                
121 void G4RegionStore::UpdateMap()                   
122 {                                                 
123   G4AutoLock l(&mapMutex);  // to avoid thread    
124   if (mvalid) return;                             
125   bmap.clear();                                   
126   for(auto pos=GetInstance()->cbegin(); pos!=G    
127   {                                               
128     const G4String& reg_name = (*pos)->GetName    
129     auto it = bmap.find(reg_name);                
130     if (it != bmap.cend())                        
131     {                                             
132       it->second.push_back(*pos);                 
133     }                                             
134     else                                          
135     {                                             
136       std::vector<G4Region*> reg_vec { *pos };    
137       bmap.insert(std::make_pair(reg_name, reg    
138     }                                             
139   }                                               
140   mvalid = true;                                  
141   l.unlock();                                     
142 }                                                 
143                                                   
144 // *******************************************    
145 // Add Region to container                        
146 // *******************************************    
147 //                                                
148 void G4RegionStore::Register(G4Region* pRegion    
149 {                                                 
150   G4RegionStore* store = GetInstance();           
151   store->push_back(pRegion);                      
152   const G4String& reg_name = pRegion->GetName(    
153   auto it = store->bmap.find(reg_name);           
154   if (it != store->bmap.cend())                   
155   {                                               
156     it->second.push_back(pRegion);                
157   }                                               
158   else                                            
159   {                                               
160     std::vector<G4Region*> reg_vec { pRegion }    
161     store->bmap.insert(std::make_pair(reg_name    
162   }                                               
163   if (fgNotifier != nullptr) { fgNotifier->Not    
164   store->mvalid = true;                           
165 }                                                 
166                                                   
167 // *******************************************    
168 // Remove Region from container                   
169 // *******************************************    
170 //                                                
171 void G4RegionStore::DeRegister(G4Region* pRegi    
172 {                                                 
173   G4RegionStore* store = GetInstance();           
174   if (!locked)    // Do not de-register if loc    
175   {                                               
176     if (fgNotifier != nullptr)  { fgNotifier->    
177     for (auto i=store->cbegin(); i!=store->cen    
178     {                                             
179       if (**i==*pRegion)                          
180       {                                           
181         store->erase(i);                          
182         break;                                    
183       }                                           
184     }                                             
185     const G4String& reg_name = pRegion->GetNam    
186     auto it = store->bmap.find(reg_name);         
187     if (it != store->bmap.cend())                 
188     {                                             
189       if (it->second.size() > 1)                  
190       {                                           
191         for (auto i=it->second.cbegin(); i!=it    
192         {                                         
193           if (**i==*pRegion)                      
194           {                                       
195             it->second.erase(i);                  
196             break;                                
197           }                                       
198         }                                         
199       }                                           
200       else                                        
201       {                                           
202         store->bmap.erase(it);                    
203       }                                           
204     }                                             
205   }                                               
206 }                                                 
207                                                   
208 // *******************************************    
209 // Return ptr to Store, setting if necessary      
210 // *******************************************    
211 //                                                
212 G4RegionStore* G4RegionStore::GetInstance()       
213 {                                                 
214   static G4RegionStore worldStore;                
215   if (fgInstance == nullptr)                      
216   {                                               
217     fgInstance = &worldStore;                     
218   }                                               
219   return fgInstance;                              
220 }                                                 
221                                                   
222 // *******************************************    
223 // Loops through all regions to verify if a re    
224 // It returns TRUE if just one region is modif    
225 // *******************************************    
226 //                                                
227 G4bool G4RegionStore::IsModified() const          
228 {                                                 
229   for (auto i=GetInstance()->cbegin(); i!=GetI    
230   {                                               
231     if ((*i)->IsModified()) { return true; }      
232   }                                               
233   return false;                                   
234 }                                                 
235                                                   
236 // *******************************************    
237 // Loops through all regions to reset flag for    
238 // Used by the run manager to notify that the     
239 // *******************************************    
240 //                                                
241 void G4RegionStore::ResetRegionModified()         
242 {                                                 
243   for (auto i=GetInstance()->cbegin(); i!=GetI    
244   {                                               
245     (*i)->RegionModified(false);                  
246   }                                               
247 }                                                 
248                                                   
249 // *******************************************    
250 // Forces recomputation of material lists in a    
251 // *******************************************    
252 //                                                
253 void G4RegionStore::UpdateMaterialList(G4VPhys    
254 {                                                 
255   for (auto i=GetInstance()->cbegin(); i!=GetI    
256   {                                               
257     if((*i)->IsInMassGeometry() || (*i)->IsInP    
258                                 || (currentWor    
259     { (*i)->UpdateMaterialList(); }               
260   }                                               
261 }                                                 
262                                                   
263 // *******************************************    
264 // Returns a region through its name specifica    
265 // *******************************************    
266 //                                                
267 G4Region* G4RegionStore::GetRegion(const G4Str    
268 {                                                 
269   G4RegionStore* store = GetInstance();           
270   if (!store->mvalid)  { store->UpdateMap(); }    
271   auto pos = store->bmap.find(name);              
272   if(pos != store->bmap.cend())                   
273   {                                               
274     if ((verbose) && (pos->second.size()>1))      
275     {                                             
276       std::ostringstream message;                 
277       message << "There exists more than ONE r    
278               << name << "!" << G4endl            
279               << "Returning the first found.";    
280       G4Exception("G4RegionStore::GetSolid()",    
281                   "GeomMgt1001", JustWarning,     
282     }                                             
283     return pos->second[0];                        
284   }                                               
285   if (verbose)                                    
286   {                                               
287     std::ostringstream message;                   
288     message << "Region NOT found in store !" <    
289             << "        Region " << name << "     
290             << "        Returning NULL pointer    
291     G4Exception("G4RegionStore::GetRegion()",     
292                 "GeomMgt1001", JustWarning, me    
293   }                                               
294   return nullptr;                                 
295 }                                                 
296                                                   
297 // *******************************************    
298 // Returns a region through its name specifica    
299 // If it does not exist it will allocate a new    
300 // name, delegating the ownership to the calle    
301 // *******************************************    
302 //                                                
303 G4Region* G4RegionStore::FindOrCreateRegion(co    
304 {                                                 
305   G4Region* target = GetRegion(name,false);       
306   if (target == nullptr)                          
307   {                                               
308     target = new G4Region(name);                  
309   }                                               
310   return target;                                  
311 }                                                 
312                                                   
313 // *******************************************    
314 // Set a world physical volume pointer to a re    
315 // Scan over all world volumes.                   
316 // *******************************************    
317 //                                                
318 void G4RegionStore::SetWorldVolume()              
319 {                                                 
320   // Reset all pointers first                     
321   //                                              
322   for (auto i=GetInstance()->cbegin(); i!=GetI    
323   { (*i)->SetWorld(nullptr); }                    
324                                                   
325   // Find world volumes                           
326   //                                              
327   G4PhysicalVolumeStore* fPhysicalVolumeStore     
328     = G4PhysicalVolumeStore::GetInstance();       
329   std::size_t nPhys = fPhysicalVolumeStore->si    
330   for(std::size_t iPhys=0; iPhys<nPhys; ++iPhy    
331   {                                               
332     G4VPhysicalVolume* fPhys = (*fPhysicalVolu    
333     if(fPhys->GetMotherLogical() != nullptr) {    
334                                                   
335     // Now 'fPhys' is a world volume, set it t    
336     //                                            
337     for (auto i=GetInstance()->cbegin(); i!=Ge    
338     { (*i)->SetWorld(fPhys); }                    
339   }                                               
340 }                                                 
341                                                   
342