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 G4VoxelNavigation 27 // 28 // Class description: 29 // 30 // Utility for navigation in volumes containing only G4PVPlacement 31 // daughter volumes for which voxels have been constructed. 32 33 // History: 34 // - Created: Paul Kent, Aug 96 35 // -------------------------------------------------------------------- 36 #ifndef G4VOXELNAVIGATION_HH 37 #define G4VOXELNAVIGATION_HH 38 39 #include "geomdefs.hh" 40 #include "G4VNavigation.hh" 41 #include "G4NavigationHistory.hh" 42 #include "G4NavigationLogger.hh" 43 #include "G4AffineTransform.hh" 44 #include "G4VPhysicalVolume.hh" 45 #include "G4LogicalVolume.hh" 46 #include "G4VSolid.hh" 47 #include "G4ThreeVector.hh" 48 49 #include "G4BlockingList.hh" 50 51 class G4VoxelSafety; 52 53 // Required for inline implementation 54 // 55 #include "G4AuxiliaryNavServices.hh" 56 57 // Required for voxel handling & voxel stack 58 // 59 #include <vector> 60 #include "G4SmartVoxelProxy.hh" 61 #include "G4SmartVoxelNode.hh" 62 #include "G4SmartVoxelHeader.hh" 63 64 class G4VoxelNavigation : public G4VNavigation 65 { 66 public: // with description 67 68 G4VoxelNavigation(); 69 ~G4VoxelNavigation() override; 70 71 G4SmartVoxelNode* VoxelLocate( G4SmartVoxelHeader* pHead, 72 const G4ThreeVector& localPoint ); 73 74 G4bool LevelLocate( G4NavigationHistory& history, 75 const G4VPhysicalVolume* blockedVol, 76 const G4int blockedNum, 77 const G4ThreeVector& globalPoint, 78 const G4ThreeVector* globalDirection, 79 const G4bool pLocatedOnEdge, 80 G4ThreeVector& localPoint ) override; 81 82 G4double ComputeStep( const G4ThreeVector& globalPoint, 83 const G4ThreeVector& globalDirection, 84 const G4double currentProposedStepLength, 85 G4double& newSafety, 86 G4NavigationHistory& history, 87 G4bool& validExitNormal, 88 G4ThreeVector& exitNormal, 89 G4bool& exiting, 90 G4bool& entering, 91 G4VPhysicalVolume* (*pBlockedPhysical), 92 G4int& blockedReplicaNo ) override; 93 94 G4double ComputeSafety( const G4ThreeVector& globalpoint, 95 const G4NavigationHistory& history, 96 const G4double pMaxLength = DBL_MAX ) override; 97 98 void RelocateWithinVolume( G4VPhysicalVolume* motherPhysical, 99 const G4ThreeVector& localPoint ) override; 100 101 G4int GetVerboseLevel() const override; 102 void SetVerboseLevel(G4int level) override; 103 // Get/Set Verbose(ness) level. 104 // [if level>0 && G4VERBOSE, printout can occur] 105 106 inline void EnableBestSafety( G4bool flag = false ); 107 // Enable best-possible evaluation of isotropic safety 108 109 protected: 110 111 G4double ComputeVoxelSafety( const G4ThreeVector& localPoint ) const; 112 G4bool LocateNextVoxel( const G4ThreeVector& localPoint, 113 const G4ThreeVector& localDirection, 114 const G4double currentStep ); 115 116 G4SmartVoxelNode* VoxelLocateLight( G4SmartVoxelHeader* pHead, 117 const G4ThreeVector& localPoint ) const; 118 119 private: // Logging functions 120 121 void PreComputeStepLog (const G4VPhysicalVolume* motherPhysical, 122 G4double motherSafety, 123 const G4ThreeVector& localPoint); 124 void AlongComputeStepLog(const G4VSolid* sampleSolid, 125 const G4ThreeVector& samplePoint, 126 const G4ThreeVector& sampleDirection, 127 const G4ThreeVector& localDirection, 128 G4double sampleSafety, 129 G4double sampleStep); 130 void PostComputeStepLog (const G4VSolid* motherSolid, 131 const G4ThreeVector& localPoint, 132 const G4ThreeVector& localDirection, 133 G4double motherStep, 134 G4double motherSafety); 135 void ComputeSafetyLog (const G4VSolid* solid, 136 const G4ThreeVector& point, 137 G4double safety, 138 G4bool banner); 139 inline void PrintDaughterLog (const G4VSolid* sampleSolid, 140 const G4ThreeVector& samplePoint, 141 G4double sampleSafety, 142 G4double sampleStep); 143 protected: 144 145 G4BlockingList fBList; 146 // Blocked volumes 147 148 // 149 // BEGIN Voxel Stack information 150 // 151 152 G4int fVoxelDepth = -1; 153 // Note: fVoxelDepth==0+ => fVoxelAxisStack(0+) contains axes of voxel 154 // fVoxelDepth==-1 -> not in voxel 155 156 std::vector<EAxis> fVoxelAxisStack; 157 // Voxel axes 158 159 std::vector<G4int> fVoxelNoSlicesStack; 160 // No slices per voxel at each level 161 162 std::vector<G4double> fVoxelSliceWidthStack; 163 // Width of voxels at each level 164 165 std::vector<G4int> fVoxelNodeNoStack; 166 // Node no point is inside at each level 167 168 std::vector<G4SmartVoxelHeader*> fVoxelHeaderStack; 169 // Voxel headers at each level 170 171 G4SmartVoxelNode* fVoxelNode = nullptr; 172 // Node containing last located point 173 174 // 175 // END Voxel Stack information 176 // 177 178 G4VoxelSafety* fpVoxelSafety = nullptr; 179 // Helper object for Voxel Safety 180 181 G4double fHalfTolerance; 182 // Surface tolerance 183 184 G4bool fBestSafety = false; 185 186 G4NavigationLogger* fLogger; 187 // Verbosity logger 188 }; 189 190 #include "G4VoxelNavigation.icc" 191 192 #endif 193