Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 G4cout << "Checking overlaps in tree of volume " << daughter->GetName()
162 << " (" << daughterLogical->GetSolid()->GetEntityType() << ")"
163 << " is omitted, to avoid duplication" << G4endl;
164 }
165 }
166 }
167}
168
169//
170// TestRecursiveOverlap
171//
173{
174 // If reached requested level of depth (i.e. set to 0), exit.
175 // If not depth specified (i.e. set to -1), visit the whole tree.
176 // If requested initial level of depth is not zero, visit from beginning
177 //
178 if (depth == 0) return;
179 if (depth != -1) depth--;
180 if (slevel != 0) slevel--;
181
182 //
183 // As long as we reached the requested
184 // initial level of depth, test ourselves
185 //
186 if ( slevel==0 )
187 {
188 target->CheckOverlaps(resolution, tolerance, verbosity, maxErr);
189 }
190
191 //
192 // Loop over unique daughters
193 //
194 std::set<const G4LogicalVolume *> tested;
195
196 const G4LogicalVolume *logical = target->GetLogicalVolume();
197 G4int nDaughter = (G4int)logical->GetNoDaughters();
198 for( auto iDaughter=0; iDaughter<nDaughter; ++iDaughter )
199 {
200 G4VPhysicalVolume *daughter = logical->GetDaughter(iDaughter);
201
202 // Tested already?
203 //
204 // const G4LogicalVolume *daughterLogical =
205 // daughter->GetLogicalVolume();
206 // std::pair<std::set<const G4LogicalVolume *>::iterator, G4bool>
207 // there = tested.insert(daughterLogical);
208 // if (!there.second) continue;
209
210 //
211 // Recurse
212 //
213 G4GeomTestVolume vTest( daughter, tolerance, resolution, verbosity );
214 vTest.SetErrorsThreshold(maxErr);
215 vTest.TestRecursiveOverlap( slevel,depth );
216 }
217}
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
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