Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Static Public Member Functions
G4Region Class Reference

#include <G4Region.hh>

Public Member Functions

 G4Region (const G4String &name)
 
virtual ~G4Region ()
 
G4bool operator== (const G4Region &rg) const
 
void AddRootLogicalVolume (G4LogicalVolume *lv)
 
void RemoveRootLogicalVolume (G4LogicalVolume *lv, G4bool scan=true)
 
void SetName (const G4String &name)
 
const G4StringGetName () const
 
void RegionModified (G4bool flag)
 
G4bool IsModified () const
 
void SetProductionCuts (G4ProductionCuts *cut)
 
G4ProductionCutsGetProductionCuts () const
 
std::vector< G4LogicalVolume * >
::iterator 
GetRootLogicalVolumeIterator ()
 
std::vector< G4Material * >
::const_iterator 
GetMaterialIterator () const
 
size_t GetNumberOfMaterials () const
 
size_t GetNumberOfRootVolumes () const
 
void UpdateMaterialList ()
 
void ClearMaterialList ()
 
void ScanVolumeTree (G4LogicalVolume *lv, G4bool region)
 
void SetUserInformation (G4VUserRegionInformation *ui)
 
G4VUserRegionInformationGetUserInformation () const
 
void SetUserLimits (G4UserLimits *ul)
 
G4UserLimitsGetUserLimits () const
 
void ClearMap ()
 
void RegisterMaterialCouplePair (G4Material *mat, G4MaterialCutsCouple *couple)
 
G4MaterialCutsCoupleFindCouple (G4Material *mat)
 
void SetFastSimulationManager (G4FastSimulationManager *fsm)
 
G4FastSimulationManagerGetFastSimulationManager () const
 
void ClearFastSimulationManager ()
 
void SetFieldManager (G4FieldManager *fm)
 
G4FieldManagerGetFieldManager () const
 
G4VPhysicalVolumeGetWorldPhysical () const
 
void SetWorld (G4VPhysicalVolume *wp)
 
G4bool BelongsTo (G4VPhysicalVolume *thePhys) const
 
G4RegionGetParentRegion (G4bool &unique) const
 
void SetRegionalSteppingAction (G4UserSteppingAction *rusa)
 
G4UserSteppingActionGetRegionalSteppingAction () const
 
 G4Region (__void__ &)
 
G4int GetInstanceID () const
 
void UsedInMassGeometry (G4bool val=true)
 
void UsedInParallelGeometry (G4bool val=true)
 
G4bool IsInMassGeometry () const
 
G4bool IsInParallelGeometry () const
 

Static Public Member Functions

static const G4RegionManagerGetSubInstanceManager ()
 

Detailed Description

Definition at line 105 of file G4Region.hh.

Constructor & Destructor Documentation

G4Region::G4Region ( const G4String name)

Definition at line 68 of file G4Region.cc.

References G4GeomSplitter< T >::CreateSubInstance(), G4endl, G4Exception(), G4MT_fsmanager, G4MT_rsaction, G4RegionStore::GetInstance(), G4RegionStore::GetRegion(), JustWarning, and G4RegionStore::Register().

69  : fName(pName), fRegionMod(true), fCut(0), fUserInfo(0), fUserLimits(0),
70  fFieldManager(0), fWorldPhys(0),
71  fInMassGeometry(false), fInParallelGeometry(false)
72 {
73 
74  instanceID = subInstanceManager.CreateSubInstance();
75  G4MT_fsmanager = 0;
76  G4MT_rsaction = 0;
77 
79  if (rStore->GetRegion(pName,false))
80  {
81  std::ostringstream message;
82  message << "The region has NOT been registered !" << G4endl
83  << " Region " << pName << " already existing in store !"
84  << G4endl;
85  G4Exception("G4Region::G4Region()", "GeomMgt1001",
86  JustWarning, message);
87  }
88  else
89  {
90  rStore->Register(this);
91  }
92 }
G4Region * GetRegion(const G4String &name, G4bool verbose=true) const
G4int CreateSubInstance()
#define G4MT_rsaction
Definition: G4Region.hh:103
static G4RegionStore * GetInstance()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
static void Register(G4Region *pSolid)
#define G4endl
Definition: G4ios.hh:61
#define G4MT_fsmanager
Definition: G4Region.hh:102
G4Region::~G4Region ( )
virtual

Definition at line 118 of file G4Region.cc.

References G4RegionStore::DeRegister(), and G4RegionStore::GetInstance().

119 {
121  if(fUserInfo) delete fUserInfo;
122 }
static void DeRegister(G4Region *pSolid)
static G4RegionStore * GetInstance()
G4Region::G4Region ( __void__ &  )

Definition at line 99 of file G4Region.cc.

References G4GeomSplitter< T >::CreateSubInstance(), G4MT_fsmanager, G4MT_rsaction, G4RegionStore::GetInstance(), and G4RegionStore::Register().

100  : fName(""), fRegionMod(true), fCut(0), fUserInfo(0), fUserLimits(0),
101  fFieldManager(0), fWorldPhys(0),
102  fInMassGeometry(false), fInParallelGeometry(false)
103 {
104  instanceID = subInstanceManager.CreateSubInstance();
105  G4MT_fsmanager = 0;
106  G4MT_rsaction = 0;
107 
108  // Register to store
109  //
111 }
G4int CreateSubInstance()
#define G4MT_rsaction
Definition: G4Region.hh:103
static G4RegionStore * GetInstance()
static void Register(G4Region *pSolid)
#define G4MT_fsmanager
Definition: G4Region.hh:102

Member Function Documentation

void G4Region::AddRootLogicalVolume ( G4LogicalVolume lv)

Definition at line 254 of file G4Region.cc.

References ScanVolumeTree(), and G4LogicalVolume::SetRegionRootFlag().

Referenced by ExTGRCRegionCutsMgr::BuildRegions(), G4RunManagerKernel::CheckRegions(), Par01DetectorConstruction::Construct(), RE01DetectorConstruction::Construct(), ExGflashDetectorConstruction::Construct(), exrdmDetectorConstruction::Construct(), CML2Ph_FullWater::Construct(), CML2Ph_BoxInBox::Construct(), G4RunManagerKernel::DefineWorldVolume(), and export_G4Region().

255 {
256  // Check the logical volume is not already in the list
257  //
258  G4RootLVList::iterator pos;
259  pos = std::find(fRootVolumes.begin(),fRootVolumes.end(),lv);
260  if (pos == fRootVolumes.end())
261  {
262  // Insert the root volume in the list and set it as root region
263  //
264  fRootVolumes.push_back(lv);
265  lv->SetRegionRootFlag(true);
266  }
267 
268  // Scan recursively the tree of daugther volumes and set regions
269  //
270  ScanVolumeTree(lv, true);
271 
272  // Set region as modified
273  //
274  fRegionMod = true;
275 }
void SetRegionRootFlag(G4bool rreg)
void ScanVolumeTree(G4LogicalVolume *lv, G4bool region)
Definition: G4Region.cc:133
G4bool G4Region::BelongsTo ( G4VPhysicalVolume thePhys) const

Definition at line 362 of file G4Region.cc.

References G4LogicalVolume::GetDaughter(), G4VPhysicalVolume::GetLogicalVolume(), G4LogicalVolume::GetNoDaughters(), and G4LogicalVolume::GetRegion().

Referenced by G4RunManagerKernel::CheckRegions(), export_G4Region(), and SetWorld().

363 {
364  G4LogicalVolume* currLog = thePhys->GetLogicalVolume();
365  if (currLog->GetRegion()==this) {return true;}
366 
367  G4int nDaughters = currLog->GetNoDaughters();
368  while (nDaughters--)
369  {
370  if (BelongsTo(currLog->GetDaughter(nDaughters))) {return true;}
371  }
372 
373  return false;
374 }
G4VPhysicalVolume * GetDaughter(const G4int i) const
G4Region * GetRegion() const
int G4int
Definition: G4Types.hh:78
G4int GetNoDaughters() const
G4bool BelongsTo(G4VPhysicalVolume *thePhys) const
Definition: G4Region.cc:362
G4LogicalVolume * GetLogicalVolume() const
void G4Region::ClearFastSimulationManager ( )

Definition at line 382 of file G4Region.cc.

References G4endl, G4Exception(), G4MT_fsmanager, GetFastSimulationManager(), GetParentRegion(), and JustWarning.

Referenced by export_G4Region(), and G4FastSimulationManager::~G4FastSimulationManager().

383 {
384  G4bool isUnique;
385  G4Region* parent = GetParentRegion(isUnique);
386  if(parent)
387  {
388  if (isUnique)
389  {
391  }
392  else
393  {
394  std::ostringstream message;
395  message << "Region <" << fName << "> belongs to more than"
396  << " one parent region !" << G4endl
397  << "A region cannot belong to more than one direct parent region,"
398  << G4endl
399  << "to have fast-simulation assigned.";
400  G4Exception("G4Region::ClearFastSimulationManager()",
401  "GeomMgt1002", JustWarning, message);
402  G4MT_fsmanager = 0;
403  }
404  }
405  else
406  {
407  G4MT_fsmanager = 0;
408  }
409 }
bool G4bool
Definition: G4Types.hh:79
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
G4Region * GetParentRegion(G4bool &unique) const
Definition: G4Region.cc:417
G4FastSimulationManager * GetFastSimulationManager() const
#define G4endl
Definition: G4ios.hh:61
#define G4MT_fsmanager
Definition: G4Region.hh:102
void G4Region::ClearMap ( )
inline

Referenced by export_G4Region().

void G4Region::ClearMaterialList ( )

Definition at line 313 of file G4Region.cc.

Referenced by export_G4Region(), and UpdateMaterialList().

314 {
315  fMaterials.clear();
316 }
G4MaterialCutsCouple* G4Region::FindCouple ( G4Material mat)
inline
G4FastSimulationManager* G4Region::GetFastSimulationManager ( ) const
inline
G4FieldManager* G4Region::GetFieldManager ( ) const
inline
G4int G4Region::GetInstanceID ( ) const
inline
std::vector<G4Material*>::const_iterator G4Region::GetMaterialIterator ( ) const
inline
const G4String& G4Region::GetName ( ) const
inline
size_t G4Region::GetNumberOfMaterials ( ) const
inline
size_t G4Region::GetNumberOfRootVolumes ( ) const
inline
G4Region * G4Region::GetParentRegion ( G4bool unique) const

Definition at line 417 of file G4Region.cc.

References G4LogicalVolumeStore::GetInstance().

Referenced by ClearFastSimulationManager(), and export_G4Region().

418 {
419  G4Region* parent = 0; unique = true;
421  G4LogicalVolumeStore::iterator lvItr;
422 
423  // Loop over all logical volumes in the store
424  //
425  for(lvItr=lvStore->begin(); lvItr!=lvStore->end(); lvItr++)
426  {
427  G4int nD = (*lvItr)->GetNoDaughters();
428  G4Region* aR = (*lvItr)->GetRegion();
429 
430  // Loop over all daughters of each logical volume
431  //
432  for(G4int iD=0; iD<nD; iD++)
433  {
434  if((*lvItr)->GetDaughter(iD)->GetLogicalVolume()->GetRegion()==this)
435  {
436  if(parent)
437  {
438  if(parent!=aR) { unique = false; }
439  }
440  else // Cache LV parent region which includes a daughter volume
441  // with the same associated region as the current one
442  {
443  parent = aR;
444  }
445  }
446  }
447  }
448  return parent;
449 }
int G4int
Definition: G4Types.hh:78
static G4LogicalVolumeStore * GetInstance()
G4ProductionCuts* G4Region::GetProductionCuts ( ) const
inline
G4UserSteppingAction* G4Region::GetRegionalSteppingAction ( ) const
inline
std::vector<G4LogicalVolume*>::iterator G4Region::GetRootLogicalVolumeIterator ( )
inline
const G4RegionManager & G4Region::GetSubInstanceManager ( )
static

Definition at line 58 of file G4Region.cc.

Referenced by G4GeometryWorkspace::G4GeometryWorkspace().

59 {
60  return subInstanceManager;
61 }
G4VUserRegionInformation* G4Region::GetUserInformation ( ) const
inline
G4UserLimits* G4Region::GetUserLimits ( ) const
inline
G4VPhysicalVolume* G4Region::GetWorldPhysical ( ) const
inline
G4bool G4Region::IsInMassGeometry ( ) const
inline
G4bool G4Region::IsInParallelGeometry ( ) const
inline
G4bool G4Region::IsModified ( ) const
inline

Referenced by export_G4Region().

G4bool G4Region::operator== ( const G4Region rg) const
inline
void G4Region::RegionModified ( G4bool  flag)
inline

Referenced by export_G4Region().

void G4Region::RegisterMaterialCouplePair ( G4Material mat,
G4MaterialCutsCouple couple 
)
inline

Referenced by export_G4Region().

void G4Region::RemoveRootLogicalVolume ( G4LogicalVolume lv,
G4bool  scan = true 
)

Definition at line 283 of file G4Region.cc.

References G4LogicalVolume::SetRegionRootFlag(), and UpdateMaterialList().

Referenced by export_G4Region(), G4RunManagerKernel::SetupDefaultRegion(), XrayFluoDetectorConstruction::UpdateGeometry(), and G4LogicalVolume::~G4LogicalVolume().

284 {
285  // Find and remove logical volume from the list
286  //
287  G4RootLVList::iterator pos;
288  pos = std::find(fRootVolumes.begin(),fRootVolumes.end(),lv);
289  if (pos != fRootVolumes.end())
290  {
291  if (fRootVolumes.size() != 1) // Avoid resetting flag for world since
292  { // volume may be already deleted !
293  lv->SetRegionRootFlag(false);
294  }
295  fRootVolumes.erase(pos);
296  }
297 
298  if (scan) // Update the materials list
299  {
301  }
302 
303  // Set region as modified
304  //
305  fRegionMod = true;
306 }
void SetRegionRootFlag(G4bool rreg)
void UpdateMaterialList()
Definition: G4Region.cc:324
void G4Region::ScanVolumeTree ( G4LogicalVolume lv,
G4bool  region 
)

Definition at line 133 of file G4Region.cc.

References G4VPVParameterisation::ComputeMaterial(), FatalException, G4endl, G4Exception(), G4Material::GetBaseMaterial(), G4LogicalVolume::GetDaughter(), G4VPhysicalVolume::GetLogicalVolume(), G4VVolumeMaterialScanner::GetMaterial(), G4LogicalVolume::GetMaterial(), G4VPVParameterisation::GetMaterialScanner(), G4VPhysicalVolume::GetMultiplicity(), G4VPhysicalVolume::GetName(), G4LogicalVolume::GetName(), G4LogicalVolume::GetNoDaughters(), G4VVolumeMaterialScanner::GetNumberOfMaterials(), G4VPhysicalVolume::GetParameterisation(), G4VPhysicalVolume::IsParameterised(), G4LogicalVolume::IsRootRegion(), and G4LogicalVolume::SetRegion().

Referenced by AddRootLogicalVolume(), export_G4Region(), and UpdateMaterialList().

134 {
135  // If logical volume is going to become a region, add
136  // its material to the list if not already present
137  //
138  G4Region* currentRegion = 0;
139  size_t noDaughters = lv->GetNoDaughters();
140  G4Material* volMat = lv->GetMaterial();
141  if(!volMat && fInMassGeometry)
142  {
143  std::ostringstream message;
144  message << "Logical volume <" << lv->GetName() << ">" << G4endl
145  << "does not have a valid material pointer." << G4endl
146  << "A logical volume belonging to the (tracking) world volume "
147  << "must have a valid material.";
148  G4Exception("G4Region::ScanVolumeTree()", "GeomMgt0002",
149  FatalException, message, "Check your geometry construction.");
150  }
151  if (region)
152  {
153  currentRegion = this;
154  if (volMat)
155  {
156  AddMaterial(volMat);
157  G4Material* baseMat = const_cast<G4Material*>(volMat->GetBaseMaterial());
158  if (baseMat) { AddMaterial(baseMat); }
159  }
160  }
161 
162  // Set the LV region to be either the current region or NULL,
163  // according to the boolean selector
164  //
165  lv->SetRegion(currentRegion);
166 
167  // Stop recursion here if no further daughters are involved
168  //
169  if(noDaughters==0) return;
170 
171  G4VPhysicalVolume* daughterPVol = lv->GetDaughter(0);
172  if (daughterPVol->IsParameterised())
173  {
174  // Adopt special treatment in case of parameterised volumes,
175  // where parameterisation involves a new material scan
176  //
177  G4VPVParameterisation* pParam = daughterPVol->GetParameterisation();
178 
179  if (pParam->GetMaterialScanner())
180  {
181  size_t matNo = pParam->GetMaterialScanner()->GetNumberOfMaterials();
182  for (register size_t mat=0; mat<matNo; mat++)
183  {
184  volMat = pParam->GetMaterialScanner()->GetMaterial(mat);
185  if(!volMat && fInMassGeometry)
186  {
187  std::ostringstream message;
188  message << "The parameterisation for the physical volume <"
189  << daughterPVol->GetName() << ">" << G4endl
190  << "does not return a valid material pointer." << G4endl
191  << "A volume belonging to the (tracking) world volume must "
192  << "have a valid material.";
193  G4Exception("G4Region::ScanVolumeTree()", "GeomMgt0002",
194  FatalException, message, "Check your parameterisation.");
195  }
196  if (volMat)
197  {
198  AddMaterial(volMat);
199  G4Material* baseMat = const_cast<G4Material*>(volMat->GetBaseMaterial());
200  if (baseMat) { AddMaterial(baseMat); }
201  }
202  }
203  }
204  else
205  {
206  size_t repNo = daughterPVol->GetMultiplicity();
207  for (register size_t rep=0; rep<repNo; rep++)
208  {
209  volMat = pParam->ComputeMaterial(rep, daughterPVol);
210  if(!volMat && fInMassGeometry)
211  {
212  std::ostringstream message;
213  message << "The parameterisation for the physical volume <"
214  << daughterPVol->GetName() << ">" << G4endl
215  << "does not return a valid material pointer." << G4endl
216  << "A volume belonging to the (tracking) world volume must "
217  << "have a valid material.";
218  G4Exception("G4Region::ScanVolumeTree()", "GeomMgt0002",
219  FatalException, message, "Check your parameterisation.");
220  }
221  if(volMat)
222  {
223  AddMaterial(volMat);
224  G4Material* baseMat = const_cast<G4Material*>(volMat->GetBaseMaterial());
225  if (baseMat) { AddMaterial(baseMat); }
226  }
227  }
228  }
229  G4LogicalVolume* daughterLVol = daughterPVol->GetLogicalVolume();
230  ScanVolumeTree(daughterLVol, region);
231  }
232  else
233  {
234  for (register size_t i=0; i<noDaughters; i++)
235  {
236  G4LogicalVolume* daughterLVol = lv->GetDaughter(i)->GetLogicalVolume();
237  if (!daughterLVol->IsRootRegion())
238  {
239  // Set daughter's LV to be a region and store materials in
240  // the materials list, if the LV is not already a root region
241  //
242  ScanVolumeTree(daughterLVol, region);
243  }
244  }
245  }
246 }
virtual G4VVolumeMaterialScanner * GetMaterialScanner()
virtual G4Material * ComputeMaterial(const G4int repNo, G4VPhysicalVolume *currentVol, const G4VTouchable *parentTouch=0)
G4String GetName() const
G4Material * GetMaterial() const
G4VPhysicalVolume * GetDaughter(const G4int i) const
virtual G4int GetNumberOfMaterials() const =0
void SetRegion(G4Region *reg)
virtual G4Material * GetMaterial(G4int idx) const =0
void ScanVolumeTree(G4LogicalVolume *lv, G4bool region)
Definition: G4Region.cc:133
const G4String & GetName() const
G4bool IsRootRegion() const
virtual G4VPVParameterisation * GetParameterisation() const =0
G4int GetNoDaughters() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
virtual G4bool IsParameterised() const =0
G4LogicalVolume * GetLogicalVolume() const
const G4Material * GetBaseMaterial() const
Definition: G4Material.hh:231
virtual G4int GetMultiplicity() const
#define G4endl
Definition: G4ios.hh:61
void G4Region::SetFastSimulationManager ( G4FastSimulationManager fsm)
inline
void G4Region::SetFieldManager ( G4FieldManager fm)
inline
void G4Region::SetName ( const G4String name)
inline

Referenced by export_G4Region().

void G4Region::SetProductionCuts ( G4ProductionCuts cut)
inline
void G4Region::SetRegionalSteppingAction ( G4UserSteppingAction rusa)
inline
void G4Region::SetUserInformation ( G4VUserRegionInformation ui)
inline
void G4Region::SetUserLimits ( G4UserLimits ul)
inline

Referenced by export_G4Region().

void G4Region::SetWorld ( G4VPhysicalVolume wp)

Definition at line 346 of file G4Region.cc.

References BelongsTo(), and G4InuclParticleNames::wp.

Referenced by G4RunManagerKernel::CheckRegions(), and export_G4Region().

347 {
348  if(!wp)
349  { fWorldPhys = 0; }
350  else
351  { if(BelongsTo(wp)) fWorldPhys = wp; }
352 
353  return;
354 }
G4bool BelongsTo(G4VPhysicalVolume *thePhys) const
Definition: G4Region.cc:362
void G4Region::UpdateMaterialList ( )

Definition at line 324 of file G4Region.cc.

References ClearMaterialList(), and ScanVolumeTree().

Referenced by export_G4Region(), and RemoveRootLogicalVolume().

325 {
326  // Reset the materials list
327  //
329 
330  // Loop over the root logical volumes and rebuild the list
331  // of materials from scratch
332  //
333  G4RootLVList::iterator pLV;
334  for (pLV=fRootVolumes.begin(); pLV!=fRootVolumes.end(); pLV++)
335  {
336  ScanVolumeTree(*pLV, true);
337  }
338 }
void ScanVolumeTree(G4LogicalVolume *lv, G4bool region)
Definition: G4Region.cc:133
void ClearMaterialList()
Definition: G4Region.cc:313
void G4Region::UsedInMassGeometry ( G4bool  val = true)
inline
void G4Region::UsedInParallelGeometry ( G4bool  val = true)
inline

The documentation for this class was generated from the following files: