Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4SmartVoxelHeader.hh
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// class G4SmartVoxelHeader
30//
31// Class description:
32//
33// Represents a set of voxels, created by a single axis of virtual division.
34// Contains the individual voxels, which are potentially further divided
35// along different axes.
36//
37// Member data:
38//
39// EAxis faxis
40// - The (cartesian) slicing/division axis
41// G4double fmaxExtent
42// G4double fminExtent
43// - Minimum and maximum coordiantes along the axis
44// std::vector<G4SmartVoxelProxy*> fslices
45// - The slices along the axis
46//
47// G4int fminEquivalent
48// G4int fmaxEquivalent
49// - Minimum and maximum equivalent slice nos.
50// [Applies to the level of the header, not its nodes]
51
52// History:
53// 18.04.01 G.Cosmo Migrated to STL vector
54// 13.07.95 P.Kent Initial version
55// --------------------------------------------------------------------
56#ifndef G4SMARTVOXELHEADER_HH
57#define G4SMARTVOXELHEADER_HH
58
59#include "G4Types.hh"
60#include "geomdefs.hh"
61
62#include "G4SmartVoxelProxy.hh"
63#include "G4SmartVoxelNode.hh"
64
65#include <vector>
66
67// Forward declarations
68class G4LogicalVolume;
69class G4VoxelLimits;
71
72// Typedefs
73typedef std::vector<G4SmartVoxelProxy*> G4ProxyVector;
74typedef std::vector<G4SmartVoxelNode*> G4NodeVector;
75typedef std::vector<G4int> G4VolumeNosVector;
76typedef std::vector<G4double> G4VolumeExtentVector;
77
79{
80 public: // with description
81
82 G4SmartVoxelHeader(G4LogicalVolume* pVolume, G4int pSlice=0);
83 // Constructor for topmost header, to begin voxel construction at a
84 // given logical volume. pSlice is used to set max and min equivalent
85 // slice nos for the header - they apply to the level of the header,
86 // not its nodes.
87
89 // Delete all referenced nodes [but *not* referenced physical volumes].
90
95 // Access functions for min/max equivalent slices (nodes & headers).
96
97 EAxis GetAxis() const;
98 // Return the current division axis.
100 // Return suggested division axis for parameterised volume.
101
103 // Return the maximum coordinate limit along the current axis.
105 // Return the minimum coordinate limit along the current axis.
106
108 // Return the no of slices along the current axis.
109
111 // Return ptr to the proxy for the nth slice (numbering from 0,
112 // no bounds checking performed).
113
114 G4bool AllSlicesEqual() const;
115 // True if all slices equal (after collection).
116
117 public: // without description
118
119 G4bool operator == (const G4SmartVoxelHeader& pHead) const;
120
121 friend std::ostream&
122 operator << (std::ostream&s, const G4SmartVoxelHeader& h);
123
124 protected:
125
127 const G4VoxelLimits& pLimits,
128 const G4VolumeNosVector* pCandidates,
129 G4int pSlice=0);
130 // Build and refine voxels between specified limits, considering only
131 // the physical volumes numbered `pCandidates'. pSlice is used to set max
132 // and min equivalent slice nos for the header - they apply to the level
133 // of the header, not its nodes.
134
135 // `Worker' / operation functions:
136
137 void BuildVoxels(G4LogicalVolume* pVolume);
138 // Build and refine voxels for daughters of specified volume which
139 // DOES NOT contain a REPLICATED daughter.
140
141 void BuildReplicaVoxels(G4LogicalVolume* pVolume);
142 // Build voxels for specified volume containing a single
143 // replicated volume.
144
145 void BuildConsumedNodes(G4int nReplicas);
146 // Construct nodes in simple consuming case.
147
149 G4VoxelLimits pLimits,
150 const G4VolumeNosVector* pCandidates);
151 // Build and refine voxels between specified limits, considering only
152 // the physical volumes `pCandidates'. Main entry point for "construction".
153 // Hardwired to stop at third level of refinement, using the xyz cartesian
154 // axes in any order.
155
157 // Calculate and Store the minimum and maximum equivalent neighbour
158 // values for all slices.
159
161 // Collect common nodes, deleting all but one to save memory,
162 // and adjusting stored slice ptrs appropriately.
163
165 // Collect common headers, deleting all but one to save memory,
166 // and adjusting stored slice ptrs appropriately.
167
168
170 G4VoxelLimits pLimits,
171 const G4VolumeNosVector* pCandidates,
172 EAxis pAxis);
173 // Build the nodes corresponding to the specified axis, within
174 // the specified limits, considering the daughters numbered pCandidates
175 // of the logical volume.
176
178 // Calculate a "quality value" for the specified vector of voxels
179 // The value returned should be >0 and such that the smaller the
180 // number the higher the quality of the slice.
181 // pSlice must consist of smartvoxelnodeproxies only.
182
183 void RefineNodes(G4LogicalVolume* pVolume,G4VoxelLimits pLimits);
184 // Examined each contained node, refine (create a replacement additional
185 // dimension of voxels) when there is more than one voxel in the slice.
186
189 // Min and max equivalent slice nos for previous level.
190
192 // Axis for slices.
193
196 // Max and min coordinate along faxis.
197
199 // Slices along axis.
200};
201
202#include "G4SmartVoxelHeader.icc"
203
204#endif
std::vector< G4SmartVoxelNode * > G4NodeVector
std::vector< G4int > G4VolumeNosVector
std::vector< G4SmartVoxelProxy * > G4ProxyVector
std::vector< G4double > G4VolumeExtentVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4ProxyVector * BuildNodes(G4LogicalVolume *pVolume, G4VoxelLimits pLimits, const G4VolumeNosVector *pCandidates, EAxis pAxis)
G4int GetMaxEquivalentSliceNo() const
friend std::ostream & operator<<(std::ostream &s, const G4SmartVoxelHeader &h)
G4double GetMaxExtent() const
void SetMinEquivalentSliceNo(G4int pMin)
G4double GetMinExtent() const
void BuildVoxelsWithinLimits(G4LogicalVolume *pVolume, G4VoxelLimits pLimits, const G4VolumeNosVector *pCandidates)
G4double CalculateQuality(G4ProxyVector *pSlice)
EAxis GetAxis() const
void BuildReplicaVoxels(G4LogicalVolume *pVolume)
G4bool operator==(const G4SmartVoxelHeader &pHead) const
G4SmartVoxelProxy * GetSlice(G4int n) const
void BuildConsumedNodes(G4int nReplicas)
EAxis GetParamAxis() const
G4int GetNoSlices() const
G4bool AllSlicesEqual() const
void BuildVoxels(G4LogicalVolume *pVolume)
G4int GetMinEquivalentSliceNo() const
void SetMaxEquivalentSliceNo(G4int pMax)
void RefineNodes(G4LogicalVolume *pVolume, G4VoxelLimits pLimits)
EAxis
Definition: geomdefs.hh:54