Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // GEANT4 tag $ Name: $ 27 // 28 // class G4ITSafetyHelper Implementation 29 // 30 // Original author: John Apostolakis, 2006 31 // 32 // ------------------------------------------- 33 34 #include "G4ITSafetyHelper.hh" 35 #include "G4ITPathFinder.hh" 36 #include "G4ITTransportationManager.hh" 37 #include "G4ITNavigator.hh" 38 #include "G4PathFinder.hh" 39 #include "globals.hh" 40 41 G4ITSafetyHelper::G4ITSafetyHelper() 42 { 43 fpPathFinder = nullptr; // Cannot initialis 44 45 // Initialization of the Navigator pointer i 46 // be undertaken by another class calling In 47 // 48 fpMassNavigator = nullptr; 49 fMassNavigatorId = -1; 50 } 51 52 void G4ITSafetyHelper::InitialiseNavigator() 53 { 54 fpPathFinder = G4PathFinder::GetInstance(); 55 56 G4ITTransportationManager* pTransportMgr = 57 G4ITTransportationManager::GetTransporta 58 59 fpMassNavigator = pTransportMgr->GetNavigato 60 61 if(fpMassNavigator == nullptr) abort(); 62 63 // Check 64 // 65 G4VPhysicalVolume* worldPV = fpMassNavigator 66 if (worldPV == nullptr) 67 { 68 G4Exception("G4ITSafetyHelper::InitialiseN 69 "InvalidNavigatorWorld", Fatal 70 "Found that existing tracking 71 } 72 73 // fMassNavigatorId = pTransportMgr->Activat 74 } 75 76 void G4ITSafetyHelper::InitialiseHelper() 77 { 78 NewTrackState(); 79 if (fFirstCall) 80 { 81 InitialiseNavigator(); 82 } 83 fFirstCall = false; 84 } 85 86 G4ITSafetyHelper::~G4ITSafetyHelper() 87 = default; 88 89 G4double G4ITSafetyHelper::CheckNextStep(const 90 const 91 const 92 G4dou 93 { 94 // Distance in the Mass geometry 95 // 96 G4double linstep = fpMassNavigator->CheckNex 97 98 fpTrackState->fLastSafetyPosition = position 99 fpTrackState->fLastSafety = newSafety; 100 101 // TODO: Can replace this with a call to Pat 102 // giving id of Mass Geometry --> thi 103 104 return linstep; 105 } 106 107 G4double G4ITSafetyHelper::ComputeSafety(const 108 G4dou 109 { 110 G4double newSafety; 111 112 // Only recompute (calling Navigator/PathFin 113 // is *not* the safety location and has mov 114 // 115 G4double moveLengthSq = (position - fpTrackS 116 if ((moveLengthSq > 0.0)) 117 { 118 if (!fUseParallelGeometries) 119 { 120 // Safety for mass geometry 121 newSafety = fpMassNavigator->ComputeSafe 122 } 123 else 124 { 125 // Safety for all geometries 126 newSafety = fpPathFinder->ComputeSafety( 127 } 128 129 // We can only store a 'true' safety - one 130 if (newSafety < maxLength) 131 { 132 fpTrackState->fLastSafety = newSafety; 133 fpTrackState->fLastSafetyPosition = posi 134 } 135 } 136 else 137 { 138 // return last value if position is not (s 139 // 140 // G4double moveLength = 0; 141 // if( moveLengthSq > 0.0 ) { moveLength= 142 newSafety = fpTrackState->fLastSafety; // 143 } 144 return newSafety; 145 } 146 147 void G4ITSafetyHelper::ReLocateWithinVolume(co 148 { 149 #ifdef G4VERBOSE 150 if (fVerbose > 0) 151 { 152 // There is an opportunity - and need - to 153 G4ThreeVector moveVec = newPosition - fpTr 154 if (moveVec.mag2() > sqr(fpTrackState->fLa 155 { 156 // A problem exists - we are proposing t 157 G4ExceptionDescription ed; 158 ed << " Safety Sphere: Radius = " << fp 159 ed << " Center = " << fpTrackState->fL 160 ed << " New Location : Move = " << mo 161 ed << " Position = " << newPosition << G 162 G4Exception("G4ITSafetyHelper::ReLocateW 163 JustWarning, 164 "Unsafe Move> Asked to reloc 165 } 166 } 167 #endif 168 169 if (!fUseParallelGeometries) 170 { 171 fpMassNavigator->LocateGlobalPointWithinVo 172 } 173 else 174 { 175 fpPathFinder->ReLocate(newPosition); 176 } 177 } 178 179 void G4ITSafetyHelper::Locate(const G4ThreeVec 180 const G4ThreeVec 181 { 182 if (!fUseParallelGeometries) 183 { 184 fpMassNavigator->LocateGlobalPointAndSetup 185 186 } 187 else 188 { 189 fpPathFinder->Locate(newPosition, newDirec 190 } 191 } 192