Geant4 Cross Reference |
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" 35 #include "G4PhysicalConstants.hh" 36 #include "G4VPhysicalVolume.hh" 37 #include "G4LogicalVolume.hh" 38 #include "G4VSolid.hh" 39 40 // 41 // Constructor 42 // 43 G4GeomTestVolume::G4GeomTestVolume( G4VPhysicalVolume *theTarget, 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 // 54 G4GeomTestVolume::~G4GeomTestVolume() {;} 55 56 // 57 // Get error tolerance 58 // 59 G4double G4GeomTestVolume::GetTolerance() const 60 { 61 return tolerance; 62 } 63 64 // 65 // Set error tolerance 66 // 67 void G4GeomTestVolume::SetTolerance(G4double tol) 68 { 69 tolerance = tol; 70 } 71 72 // 73 // Get number of points to check (resolution) 74 // 75 G4int G4GeomTestVolume::GetResolution() const 76 { 77 return resolution; 78 } 79 80 // 81 // Set number of points to check (resolution) 82 // 83 void G4GeomTestVolume::SetResolution(G4int np) 84 { 85 resolution = np; 86 } 87 88 // 89 // Get verbosity 90 // 91 G4bool G4GeomTestVolume::GetVerbosity() const 92 { 93 return verbosity; 94 } 95 96 // 97 // Set verbosity 98 // 99 void G4GeomTestVolume::SetVerbosity(G4bool verb) 100 { 101 verbosity = verb; 102 } 103 104 // 105 // Get errors reporting threshold 106 // 107 G4int G4GeomTestVolume::GetErrorsThreshold() const 108 { 109 return maxErr; 110 } 111 112 // 113 // Set maximum number of errors to report 114 // 115 void G4GeomTestVolume::SetErrorsThreshold(G4int max) 116 { 117 maxErr = max; 118 } 119 120 // 121 // Test overlap in tree 122 // 123 void G4GeomTestVolume::TestOverlapInTree() const 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 // 174 void G4GeomTestVolume::TestRecursiveOverlap( G4int slevel, G4int depth ) 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 } 220