Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4GeomTestVolume.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// class G4GeomTestVolume implementation
27//
28// Author: G.Cosmo, CERN
29// --------------------------------------------------------------------
30
31#include <queue>
32#include <set>
33
34#include "G4GeomTestVolume.hh"
36#include "G4VPhysicalVolume.hh"
37#include "G4LogicalVolume.hh"
38#include "G4VSolid.hh"
39
40//
41// Constructor
42//
44 G4double theTolerance,
45 G4int numberOfPoints,
46 G4bool theVerbosity )
47 : target(theTarget), tolerance(theTolerance),
48 resolution(numberOfPoints), verbosity(theVerbosity)
49{;}
50
51//
52// Destructor
53//
55
56//
57// Get error tolerance
58//
60{
61 return tolerance;
62}
63
64//
65// Set error tolerance
66//
68{
69 tolerance = tol;
70}
71
72//
73// Get number of points to check (resolution)
74//
76{
77 return resolution;
78}
79
80//
81// Set number of points to check (resolution)
82//
84{
85 resolution = np;
86}
87
88//
89// Get verbosity
90//
92{
93 return verbosity;
94}
95
96//
97// Set verbosity
98//
100{
101 verbosity = verb;
102}
103
104//
105// Get errors reporting threshold
106//
108{
109 return maxErr;
110}
111
112//
113// Set maximum number of errors to report
114//
116{
117 maxErr = max;
118}
119
120//
121// Test overlap in tree
122//
124{
125 std::queue<G4VPhysicalVolume*> volumes;
126 std::set<G4LogicalVolume*> checked;
127
128 volumes.push(target);
129 while (!volumes.empty())
130 {
131 G4VPhysicalVolume* current = volumes.front();
132 volumes.pop();
133
134 // check overlaps for daughters
135 G4LogicalVolume* logical = current->GetLogicalVolume();
136 std::size_t ndaughters = logical->GetNoDaughters();
137 for (std::size_t i=0; i<ndaughters; ++i)
138 {
139 G4VPhysicalVolume* daughter = logical->GetDaughter(i);
140 daughter->CheckOverlaps(resolution, tolerance, verbosity, maxErr);
141 }
142
143 // append the queue of volumes
144 G4LogicalVolume* previousLogical = nullptr;
145 for (std::size_t i=0; i<ndaughters; ++i)
146 {
147 G4VPhysicalVolume* daughter = logical->GetDaughter(i);
148 G4LogicalVolume* daughterLogical = daughter->GetLogicalVolume();
149 if (daughterLogical->GetNoDaughters() == 0) { continue; }
150 G4bool found = (daughterLogical == previousLogical);
151 if (!found) { found = (checked.find(daughterLogical) != checked.cend()); }
152 if (!found)
153 {
154 checked.emplace(daughterLogical);
155 previousLogical = daughterLogical;
156 volumes.push(daughter);
157 }
158 else
159 {
160 if (verbosity)
161 {
162 G4cout << "Checking overlaps in tree of volume " << daughter->GetName()
163 << " (" << daughterLogical->GetSolid()->GetEntityType() << ")"
164 << " is omitted, to avoid duplication" << G4endl;
165 }
166 }
167 }
168 }
169}
170
171//
172// TestRecursiveOverlap
173//
175{
176 // If reached requested level of depth (i.e. set to 0), exit.
177 // If not depth specified (i.e. set to -1), visit the whole tree.
178 // If requested initial level of depth is not zero, visit from beginning
179 //
180 if (depth == 0) { return; }
181 if (depth != -1) { depth--; }
182 if (slevel != 0) { slevel--; }
183
184 //
185 // As long as we reached the requested
186 // initial level of depth, test ourselves
187 //
188 if ( slevel==0 )
189 {
190 target->CheckOverlaps(resolution, tolerance, verbosity, maxErr);
191 }
192
193 //
194 // Loop over unique daughters
195 //
196 std::set<const G4LogicalVolume *> tested;
197
198 const G4LogicalVolume *logical = target->GetLogicalVolume();
199 auto nDaughter = (G4int)logical->GetNoDaughters();
200 for( auto iDaughter=0; iDaughter<nDaughter; ++iDaughter )
201 {
202 G4VPhysicalVolume *daughter = logical->GetDaughter(iDaughter);
203
204 // Tested already?
205 //
206 // const G4LogicalVolume *daughterLogical =
207 // daughter->GetLogicalVolume();
208 // std::pair<std::set<const G4LogicalVolume *>::iterator, G4bool>
209 // there = tested.insert(daughterLogical);
210 // if (!there.second) continue;
211
212 //
213 // Recurse
214 //
215 G4GeomTestVolume vTest( daughter, tolerance, resolution, verbosity );
216 vTest.SetErrorsThreshold(maxErr);
217 vTest.TestRecursiveOverlap( slevel,depth );
218 }
219}
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
G4bool GetVerbosity() const
void SetTolerance(G4double tolerance)
G4int GetErrorsThreshold() const
void SetVerbosity(G4bool verbosity)
void TestRecursiveOverlap(G4int sLevel=0, G4int depth=-1)
void TestOverlapInTree() const
void SetResolution(G4int points)
G4GeomTestVolume(G4VPhysicalVolume *theTarget, G4double theTolerance=0.0, G4int numberOfPoints=10000, G4bool theVerbosity=true)
G4int GetResolution() const
void SetErrorsThreshold(G4int max)
G4double GetTolerance() const
G4VSolid * GetSolid() const
std::size_t GetNoDaughters() const
G4VPhysicalVolume * GetDaughter(const std::size_t i) const
virtual G4bool CheckOverlaps(G4int res=1000, G4double tol=0., G4bool verbose=true, G4int errMax=1)
G4LogicalVolume * GetLogicalVolume() const
const G4String & GetName() const
virtual G4GeometryType GetEntityType() const =0