Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4SmartVoxelHeader Class Reference

G4SmartVoxelHeader represents a set of voxels, created by a single axis of virtual division. It contains the individual voxels, which are potentially further divided along different axes. More...

#include <G4SmartVoxelHeader.hh>

Public Member Functions

 G4SmartVoxelHeader (G4LogicalVolume *pVolume, G4int pSlice=0)
 G4SmartVoxelHeader (G4LogicalVolume *pVolume, const G4VoxelLimits &pLimits, const G4VolumeNosVector *pCandidates, G4int pSlice=0)
 ~G4SmartVoxelHeader ()
G4bool operator== (const G4SmartVoxelHeader &pHead) const
G4int GetMaxEquivalentSliceNo () const
void SetMaxEquivalentSliceNo (G4int pMax)
G4int GetMinEquivalentSliceNo () const
void SetMinEquivalentSliceNo (G4int pMin)
EAxis GetAxis () const
EAxis GetParamAxis () const
G4double GetMaxExtent () const
G4double GetMinExtent () const
std::size_t GetNoSlices () const
G4SmartVoxelProxyGetSlice (std::size_t n) const
G4bool AllSlicesEqual () const

Friends

std::ostream & operator<< (std::ostream &s, const G4SmartVoxelHeader &h)

Detailed Description

G4SmartVoxelHeader represents a set of voxels, created by a single axis of virtual division. It contains the individual voxels, which are potentially further divided along different axes.

Definition at line 80 of file G4SmartVoxelHeader.hh.

Constructor & Destructor Documentation

◆ G4SmartVoxelHeader() [1/2]

G4SmartVoxelHeader::G4SmartVoxelHeader ( G4LogicalVolume * pVolume,
G4int pSlice = 0 )

Constructor for the topmost header, to begin voxel construction at a given logical volume; 'pSlice' is used to set max and min equivalent slice numbers for the header - they apply to the level of the header, not its nodes.

Parameters
[in]pVolumePointer to the logical volume to voxelise.
[in]pSliceMax & min equivalent slice numbers for the header.

Definition at line 59 of file G4SmartVoxelHeader.cc.

61 : fminEquivalent(pSlice),
62 fmaxEquivalent(pSlice),
63 fparamAxis(kUndefined)
64{
65 std::size_t nDaughters = pVolume->GetNoDaughters();
66
67 // Determine whether daughter is replicated
68 //
69 if ((nDaughters!=1) || (!pVolume->GetDaughter(0)->IsReplicated()))
70 {
71 // Daughter not replicated => conventional voxel Build
72 // where each daughters extents are computed
73 //
74 BuildVoxels(pVolume);
75 }
76 else
77 {
78 // Single replicated daughter
79 //
80 BuildReplicaVoxels(pVolume);
81 }
82}
std::size_t GetNoDaughters() const
G4VPhysicalVolume * GetDaughter(const std::size_t i) const
virtual G4bool IsReplicated() const =0
@ kUndefined
Definition geomdefs.hh:61

Referenced by operator<<, operator==(), and ~G4SmartVoxelHeader().

◆ G4SmartVoxelHeader() [2/2]

G4SmartVoxelHeader::G4SmartVoxelHeader ( G4LogicalVolume * pVolume,
const G4VoxelLimits & pLimits,
const G4VolumeNosVector * pCandidates,
G4int pSlice = 0 )

Constructor for building and refine voxels between specified limits, considering only the physical volumes numbered 'pCandidates'; 'pSlice' is used to set max and min equivalent slice numbers for the header; they apply to the level of the header, not its nodes.

Parameters
[in]pVolumePointer to the logical volume to voxelise.
[in]pLimitsRefinement limits for building the voxels.
[in]pCandidatesCandidate volumes to be considered.
[in]pSliceMax & min equivalent slice numbers for the header.

Definition at line 91 of file G4SmartVoxelHeader.cc.

95 : fminEquivalent(pSlice),
96 fmaxEquivalent(pSlice),
97 fparamAxis(kUndefined)
98{
99#ifdef G4GEOMETRY_VOXELDEBUG
100 G4cout << "**** G4SmartVoxelHeader::G4SmartVoxelHeader" << G4endl
101 << " Limits " << pLimits << G4endl
102 << " Candidate #s = " ;
103 for (auto i=0; i<pCandidates->size(); ++i)
104 {
105 G4cout << (*pCandidates)[i] << " ";
106 }
107 G4cout << G4endl;
108#endif
109
110 BuildVoxelsWithinLimits(pVolume,pLimits,pCandidates);
111}
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout

◆ ~G4SmartVoxelHeader()

G4SmartVoxelHeader::~G4SmartVoxelHeader ( )

Destructor. Deletes all referenced nodes [but not the referenced physical volumes].

Definition at line 117 of file G4SmartVoxelHeader.cc.

118{
119 // Manually destroy underlying nodes/headers
120 // Delete collected headers and nodes once only
121 //
122 std::size_t node, proxy, maxNode=fslices.size();
123 G4SmartVoxelProxy* lastProxy = nullptr;
124 G4SmartVoxelNode *dyingNode, *lastNode=nullptr;
125 G4SmartVoxelHeader *dyingHeader, *lastHeader=nullptr;
126
127 for (node=0; node<maxNode; ++node)
128 {
129 if (fslices[node]->IsHeader())
130 {
131 dyingHeader = fslices[node]->GetHeader();
132 if (lastHeader != dyingHeader)
133 {
134 lastHeader = dyingHeader;
135 lastNode = nullptr;
136 delete dyingHeader;
137 }
138 }
139 else
140 {
141 dyingNode = fslices[node]->GetNode();
142 if (dyingNode != lastNode)
143 {
144 lastNode = dyingNode;
145 lastHeader = nullptr;
146 delete dyingNode;
147 }
148 }
149 }
150 // Delete proxies
151 //
152 for (proxy=0; proxy<maxNode; ++proxy)
153 {
154 if (fslices[proxy] != lastProxy)
155 {
156 lastProxy = fslices[proxy];
157 delete lastProxy;
158 }
159 }
160 // Don't need to clear slices
161 // fslices.clear();
162}
G4SmartVoxelHeader(G4LogicalVolume *pVolume, G4int pSlice=0)

Member Function Documentation

◆ AllSlicesEqual()

G4bool G4SmartVoxelHeader::AllSlicesEqual ( ) const

Returns true if all slices are equal (after collection).

Definition at line 1247 of file G4SmartVoxelHeader.cc.

1248{
1249 std::size_t noSlices = fslices.size();
1250 G4SmartVoxelProxy* refProxy;
1251
1252 if (noSlices>1)
1253 {
1254 refProxy=fslices[0];
1255 for (std::size_t i=1; i<noSlices; ++i)
1256 {
1257 if (refProxy!=fslices[i])
1258 {
1259 return false;
1260 }
1261 }
1262 }
1263 return true;
1264}

◆ GetAxis()

EAxis G4SmartVoxelHeader::GetAxis ( ) const

Returns the current division axis.

Referenced by G4VoxelNavigation::LocateNextVoxel(), operator==(), and G4VoxelSafety::SafetyForVoxelHeader().

◆ GetMaxEquivalentSliceNo()

G4int G4SmartVoxelHeader::GetMaxEquivalentSliceNo ( ) const

Access functions for min/max equivalent slices (nodes & headers).

Referenced by G4VoxelSafety::SafetyForVoxelHeader().

◆ GetMaxExtent()

G4double G4SmartVoxelHeader::GetMaxExtent ( ) const

Returns the maximum coordinate limit along the current axis.

Referenced by operator==(), and G4VoxelSafety::SafetyForVoxelHeader().

◆ GetMinEquivalentSliceNo()

G4int G4SmartVoxelHeader::GetMinEquivalentSliceNo ( ) const

◆ GetMinExtent()

G4double G4SmartVoxelHeader::GetMinExtent ( ) const

Returns the minimum coordinate limit along the current axis.

Referenced by G4VoxelNavigation::ComputeVoxelSafety(), G4VoxelNavigation::LocateNextVoxel(), operator==(), and G4VoxelSafety::SafetyForVoxelHeader().

◆ GetNoSlices()

std::size_t G4SmartVoxelHeader::GetNoSlices ( ) const

Returns the number of slices along the current axis.

Referenced by operator==(), and G4VoxelSafety::SafetyForVoxelHeader().

◆ GetParamAxis()

EAxis G4SmartVoxelHeader::GetParamAxis ( ) const

Returns the suggested division axis for parameterised volume.

◆ GetSlice()

G4SmartVoxelProxy * G4SmartVoxelHeader::GetSlice ( std::size_t n) const

Returns the pointer to the proxy for the n-th slice (numbering from 0, no bounds checking is performed).

Referenced by operator==(), and G4VoxelSafety::SafetyForVoxelHeader().

◆ operator==()

G4bool G4SmartVoxelHeader::operator== ( const G4SmartVoxelHeader & pHead) const

Equality operator.

Definition at line 173 of file G4SmartVoxelHeader.cc.

174{
175 if ( (GetAxis() == pHead.GetAxis())
176 && (GetNoSlices() == pHead.GetNoSlices())
177 && (GetMinExtent() == pHead.GetMinExtent())
178 && (GetMaxExtent() == pHead.GetMaxExtent()) )
179 {
180 std::size_t node, maxNode;
181 G4SmartVoxelProxy *leftProxy, *rightProxy;
182 G4SmartVoxelHeader *leftHeader, *rightHeader;
183 G4SmartVoxelNode *leftNode, *rightNode;
184
185 maxNode = GetNoSlices();
186 for (node=0; node<maxNode; ++node)
187 {
188 leftProxy = GetSlice(node);
189 rightProxy = pHead.GetSlice(node);
190 if (leftProxy->IsHeader())
191 {
192 if (rightProxy->IsNode())
193 {
194 return false;
195 }
196 leftHeader = leftProxy->GetHeader();
197 rightHeader = rightProxy->GetHeader();
198 if (!(*leftHeader == *rightHeader))
199 {
200 return false;
201 }
202 }
203 else
204 {
205 if (rightProxy->IsHeader())
206 {
207 return false;
208 }
209 leftNode = leftProxy->GetNode();
210 rightNode = rightProxy->GetNode();
211 if (!(*leftNode == *rightNode))
212 {
213 return false;
214 }
215 }
216 }
217 return true;
218 }
219
220 return false;
221}
std::size_t GetNoSlices() const
G4double GetMaxExtent() const
G4double GetMinExtent() const
G4SmartVoxelProxy * GetSlice(std::size_t n) const
EAxis GetAxis() const
G4bool IsNode() const
G4SmartVoxelNode * GetNode() const
G4SmartVoxelHeader * GetHeader() const
G4bool IsHeader() const

◆ SetMaxEquivalentSliceNo()

void G4SmartVoxelHeader::SetMaxEquivalentSliceNo ( G4int pMax)

◆ SetMinEquivalentSliceNo()

void G4SmartVoxelHeader::SetMinEquivalentSliceNo ( G4int pMin)

◆ operator<<

std::ostream & operator<< ( std::ostream & s,
const G4SmartVoxelHeader & h )
friend

Streaming operator.

Definition at line 1270 of file G4SmartVoxelHeader.cc.

1271{
1272 os << "Axis = " << G4int(h.faxis) << G4endl;
1273 G4SmartVoxelProxy *collectNode=nullptr, *collectHead=nullptr;
1274 std::size_t collectNodeNo = 0;
1275 std::size_t collectHeadNo = 0;
1276 std::size_t i, j;
1277 G4bool haveHeaders = false;
1278
1279 for (i=0; i<h.fslices.size(); ++i)
1280 {
1281 os << "Slice #" << i << " = ";
1282 if (h.fslices[i]->IsNode())
1283 {
1284 if (h.fslices[i]!=collectNode)
1285 {
1286 os << "{";
1287 for (std::size_t k=0; k<h.fslices[i]->GetNode()->GetNoContained(); ++k)
1288 {
1289 os << " " << h.fslices[i]->GetNode()->GetVolume((G4int)k);
1290 }
1291 os << " }" << G4endl;
1292 collectNode = h.fslices[i];
1293 collectNodeNo = i;
1294 }
1295 else
1296 {
1297 os << "As slice #" << collectNodeNo << G4endl;
1298 }
1299 }
1300 else
1301 {
1302 haveHeaders=true;
1303 if (h.fslices[i] != collectHead)
1304 {
1305 os << "Header" << G4endl;
1306 collectHead = h.fslices[i];
1307 collectHeadNo = i;
1308 }
1309 else
1310 {
1311 os << "As slice #" << collectHeadNo << G4endl;
1312 }
1313 }
1314 }
1315
1316 if (haveHeaders)
1317 {
1318 collectHead=nullptr;
1319 for (j=0; j<h.fslices.size(); ++j)
1320 {
1321 if (h.fslices[j]->IsHeader())
1322 {
1323 os << "Header at Slice #" << j << " = ";
1324 if (h.fslices[j] != collectHead)
1325 {
1326 os << G4endl
1327 << (*(h.fslices[j]->GetHeader()));
1328 collectHead = h.fslices[j];
1329 collectHeadNo = j;
1330 }
1331 else
1332 {
1333 os << "As slice #" << collectHeadNo << G4endl;
1334 }
1335 }
1336 }
1337 }
1338 return os;
1339}
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85

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