Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // >> 26 // >> 27 // $Id: G4VIntersectionLocator.hh,v 1.6 2009-11-30 11:39:15 japost Exp $ >> 28 // GEANT4 tag $Name: geant4-09-04-patch-02 $ >> 29 // >> 30 // 26 // Class G4VIntersectionLocator 31 // Class G4VIntersectionLocator 27 // 32 // 28 // class description: 33 // class description: 29 // << 34 // 30 // Base class for the calculation of the inter 35 // Base class for the calculation of the intersection point with a boundary 31 // when PropagationInField is used. 36 // when PropagationInField is used. 32 // Gives possibility to choose the method of i 37 // Gives possibility to choose the method of intersection; concrete locators 33 // implemented are: G4SimpleLocator, G4MultiLe 38 // implemented are: G4SimpleLocator, G4MultiLevelLocator, G4BrentLocator. 34 // 39 // 35 // Key Method: EstimateIntersectionPoint() 40 // Key Method: EstimateIntersectionPoint() 36 41 >> 42 // History: >> 43 // ------- 37 // 27.10.08 - John Apostolakis, Tatiana Nikiti 44 // 27.10.08 - John Apostolakis, Tatiana Nikitina: Design and implementation 38 // ------------------------------------------- 45 // --------------------------------------------------------------------------- >> 46 39 #ifndef G4VINTERSECTIONLOCATOR_HH 47 #ifndef G4VINTERSECTIONLOCATOR_HH 40 #define G4VINTERSECTIONLOCATOR_HH 48 #define G4VINTERSECTIONLOCATOR_HH 41 49 42 #include "G4Types.hh" 50 #include "G4Types.hh" 43 #include "G4ThreeVector.hh" 51 #include "G4ThreeVector.hh" 44 #include "G4FieldTrack.hh" 52 #include "G4FieldTrack.hh" 45 53 46 #include "G4Navigator.hh" 54 #include "G4Navigator.hh" 47 #include "G4ChordFinder.hh" 55 #include "G4ChordFinder.hh" 48 56 49 class G4VIntersectionLocator 57 class G4VIntersectionLocator 50 { 58 { 51 public: // with description 59 public: // with description 52 60 53 G4VIntersectionLocator(G4Navigator *theNa 61 G4VIntersectionLocator(G4Navigator *theNavigator); 54 // Constructor 62 // Constructor 55 virtual ~G4VIntersectionLocator(); 63 virtual ~G4VIntersectionLocator(); 56 // Default destructor 64 // Default destructor 57 65 58 virtual G4bool EstimateIntersectionPoint( 66 virtual G4bool EstimateIntersectionPoint( 59 const G4FieldTrack& curveStartP << 67 const G4FieldTrack& curveStartPointTangent, // A 60 const G4FieldTrack& curveEndPoi << 68 const G4FieldTrack& curveEndPointTangent, // B 61 const G4ThreeVector& trialPoint, << 69 const G4ThreeVector& trialPoint, // E 62 G4FieldTrack& intersectPo << 70 G4FieldTrack& intersectPointTangent, // Output 63 G4bool& recalculate << 71 G4bool& recalculatedEndPoint, // Out 64 G4double& fPreviousSa << 72 G4double& fPreviousSafety, // In/Out 65 G4ThreeVector& fPreviousSf << 73 G4ThreeVector& fPreviousSftOrigin) = 0; // In/Out 66 // If such an intersection exists, this 74 // If such an intersection exists, this function calculates the 67 // intersection point of the true path 75 // intersection point of the true path of the particle with the surface 68 // of the current volume (or of one of 76 // of the current volume (or of one of its daughters). 69 // Should use lateral displacement as m 77 // Should use lateral displacement as measure of convergence 70 // NOTE: changes the safety! 78 // NOTE: changes the safety! 71 79 72 void printStatus( const G4FieldTrack& sta 80 void printStatus( const G4FieldTrack& startFT, 73 const G4FieldTrack& cur 81 const G4FieldTrack& currentFT, 74 G4double req 82 G4double requestStep, 75 G4double saf 83 G4double safety, 76 G4int ste << 84 G4int step); 77 // Print Method, useful mostly for debu 85 // Print Method, useful mostly for debugging 78 86 79 inline G4bool IntersectChord( const G4Thr << 87 inline G4bool IntersectChord( G4ThreeVector StartPointA, 80 const G4Thr << 88 G4ThreeVector EndPointB, 81 G4double& << 89 G4double &NewSafety, 82 G4double& << 90 G4double &fPreviousSafety, // In/Out 83 G4ThreeVect << 91 G4ThreeVector &fPreviousSftOrigin, // In/Out 84 G4double& << 92 G4double &LinearStepLength, 85 G4ThreeVect << 93 G4ThreeVector &IntersectionPoint); 86 G4bool* << 87 // Intersect the chord from StartPointA 94 // Intersect the chord from StartPointA to EndPointB and return 88 // whether an intersection occurred. NO 95 // whether an intersection occurred. NOTE: changes the Safety! 89 96 90 inline void SetEpsilonStepFor( G4double E << 97 inline void SetEpsilonStepFor( G4double EpsilonStep ); 91 inline void SetDeltaIntersectionFor( G4do << 98 inline void SetDeltaIntersectionFor( G4double deltaIntersection ); 92 inline void SetNavigatorFor( G4Navigator* << 99 inline void SetNavigatorFor( G4Navigator *fNavigator ); 93 inline void SetChordFinderFor(G4ChordFind << 100 inline void SetChordFinderFor(G4ChordFinder *fCFinder ); 94 // These parameters must be set at each 101 // These parameters must be set at each step, in case they were changed >> 102 95 // Note: This simple approach ensures t 103 // Note: This simple approach ensures that all scenarios are considered. 96 // Future refinement may identify << 104 // [ Future refinement may identify which are invariant during a 97 // track, run or event << 105 // track, run or event ] 98 106 99 inline void SetVerboseFor(G4int fVerbose << 107 inline void SetVerboseFor(G4int fVerbose); 100 inline G4int GetVerboseFor(); << 108 inline G4int GetVerboseFor(); 101 // Controling verbosity enables checkin 109 // Controling verbosity enables checking of the locating of intersections 102 110 103 public: // without description 111 public: // without description 104 << 105 // Additional inline Set/Get methods for p 112 // Additional inline Set/Get methods for parameters, dependent objects 106 113 107 inline G4double GetDeltaIntersection 114 inline G4double GetDeltaIntersectionFor(); 108 inline G4double GetEpsilonStepFor(); 115 inline G4double GetEpsilonStepFor(); 109 inline G4Navigator* GetNavigatorFor(); 116 inline G4Navigator* GetNavigatorFor(); 110 inline G4ChordFinder* GetChordFinderFor(); 117 inline G4ChordFinder* GetChordFinderFor(); 111 118 112 inline void SetSafetyParametersFor(G4bool << 119 inline void SetSafetyParametersFor(G4bool UseSafety ); 113 120 114 inline void AddAdjustementOfFoundIntersect << 121 inline void AddAdjustementOfFoundIntersection(G4bool UseCorrection); 115 inline G4bool GetAdjustementOfFoundInterse 122 inline G4bool GetAdjustementOfFoundIntersection(); 116 // Methods to be made Obsolete - replace 123 // Methods to be made Obsolete - replaced by methods below 117 inline void AdjustIntersections(G4bool Use << 124 inline void AdjustIntersections(G4bool UseCorrection); 118 inline G4bool AreIntersectionsAdjusted(){ 125 inline G4bool AreIntersectionsAdjusted(){ return fUseNormalCorrection; } 119 // Change adjustment flag ( New Interfa 126 // Change adjustment flag ( New Interface ) 120 127 121 static void printStatus( const G4FieldTrac << 122 const G4FieldTrac << 123 G4double << 124 G4double << 125 G4int << 126 std::ostrea << 127 G4int << 128 // Print Method for any ostream - e.g. c << 129 << 130 inline void SetCheckMode( G4bool value ) { << 131 inline G4bool GetCheckMode() { << 132 << 133 protected: // with description 128 protected: // with description 134 129 135 G4FieldTrack ReEstimateEndpoint( const G4F << 130 G4FieldTrack ReEstimateEndpoint( const G4FieldTrack &CurrentStateA, 136 const G4F << 131 const G4FieldTrack &EstimtdEndStateB, 137 G4d << 132 G4double linearDistSq, 138 G4d << 133 G4double curveDist); 139 // Return new estimate for state after c 134 // Return new estimate for state after curveDist starting from 140 // CurrentStateA, to replace EstimtdEndS 135 // CurrentStateA, to replace EstimtdEndStateB, and report displacement 141 // (if field is compiled verbose) 136 // (if field is compiled verbose) 142 137 143 G4bool CheckAndReEstimateEndpoint( const G << 138 144 const G << 139 G4ThreeVector GetLocalSurfaceNormal(const G4ThreeVector &CurrentE_Point, 145 G << 140 G4bool &validNormal); 146 G << 141 // Return the SurfaceNormal of Intersecting Solid 147 // Check whether EndB is too far from St << 142 148 // and if, re-estimate new value for End << 143 G4bool AdjustmentOfFoundIntersection(const G4ThreeVector &A, 149 // Report error if EndB is before Start << 144 const G4ThreeVector &CurrentE_Point, 150 // In that case return errorCode = 2. << 145 const G4ThreeVector &CurrentF_Point, 151 << 146 const G4ThreeVector &MomentumDir, 152 G4ThreeVector GetSurfaceNormal(const G4Thr << 153 G4boo << 154 // Position *must* be the intersection p << 155 // to G4Navigator's ComputeStep (via In << 156 // Will try to use cached (last) value i << 157 // if it was kept and valid. << 158 // Value returned is in global coordinat << 159 // It does NOT guarantee to obtain Norma << 160 // - the "Intersection" Point is not on << 161 // - inaccuracies in the transformation << 162 // - issues with the Solid. << 163 << 164 G4ThreeVector GetGlobalSurfaceNormal(const << 165 << 166 // Return the SurfaceNormal of Intersect << 167 // Costlier then GetSurfaceNormal << 168 << 169 G4bool AdjustmentOfFoundIntersection(const << 170 const << 171 const << 172 const << 173 const 147 const G4bool IntersectAF, 174 << 148 G4ThreeVector &IntersectionPoint, 175 << 149 G4double &NewSafety, 176 << 150 G4double &fPrevSafety, 177 << 151 G4ThreeVector &fPrevSftOrigin ); 178 // Optional method for adjustment of loc 152 // Optional method for adjustment of located intersection point 179 // using the surface-normal 153 // using the surface-normal 180 154 181 void ReportTrialStep( G4int step_no, << 182 const G4ThreeVector& << 183 const G4ThreeVector& << 184 const G4ThreeVector& << 185 const G4ThreeVector& << 186 G4bool validNormal << 187 // Print a three-line report on the curr << 188 // intersection << 189 << 190 G4bool LocateGlobalPointWithinVolumeAndChe << 191 // Locate point using navigator - update << 192 // By default, it assumes that the point << 193 // and returns true. << 194 // In check mode, checks whether the poi << 195 // If it is inside, it returns true. << 196 // If not, issues a warning and return << 197 << 198 void LocateGlobalPointWithinVolumeCheckAnd << 199 co << 200 << 201 // As above, but report information abou << 202 // If CheckMode > 1, report extra inform << 203 << 204 protected: // without description << 205 << 206 // Auxiliary methods -- to report issues << 207 << 208 void ReportReversedPoints( std::ostringstr << 209 const G4FieldTr << 210 const G4FieldTr << 211 G4double << 212 const G4FieldTr << 213 const G4FieldTr << 214 const G4FieldTr << 215 const G4ThreeVe << 216 const G4FieldTr << 217 G4int sbstp_no, << 218 // Build error messsage (in ossMsg) to r << 219 // gone past 'A' << 220 << 221 void ReportProgress( std::ostream& oss, << 222 const G4FieldTrack& S << 223 const G4FieldTrack& E << 224 G4int s << 225 const G4FieldTrack& A << 226 const G4FieldTrack& B << 227 G4double s << 228 G4int d << 229 // Report the current status / progress << 230 << 231 void ReportImmediateHit( const char* << 232 const G4ThreeVec << 233 const G4ThreeVec << 234 G4double << 235 unsigned long << 236 // Report case: trial point is 'close' t << 237 << 238 private: // no description << 239 << 240 G4ThreeVector GetLocalSurfaceNormal(const << 241 << 242 // Return the SurfaceNormal of Intersect << 243 << 244 G4ThreeVector GetLastSurfaceNormal( const << 245 << 246 // Position *must* be the intersection p << 247 // to G4Navigator's ComputeStep (via In << 248 // Temporary - will use the same method << 249 << 250 protected: 155 protected: 251 156 252 G4double kCarTolerance; / << 157 G4double kCarTolerance; // Constant 253 158 254 G4int fVerboseLevel = 0; / << 159 G4int fVerboseLevel; // For debugging 255 G4bool fUseNormalCorrection = false; / << 160 G4bool fUseNormalCorrection; // Configuration parameter 256 G4bool fCheckMode = false; << 161 257 G4bool fiUseSafety = false; // Whethe << 162 G4Navigator *fiNavigator; 258 << 163 // Parameters set by G4PropagatorInField ( when ? ) 259 G4Navigator* fiNavigator; << 164 260 << 165 G4ChordFinder *fiChordFinder; 261 G4ChordFinder* fiChordFinder = nullptr; / << 166 G4double fiEpsilonStep; 262 G4double fiEpsilonStep = -1.0; / << 167 G4double fiDeltaIntersection; 263 G4double fiDeltaIntersection = -1.0; / << 168 G4bool fiUseSafety; 264 // Parameters set at each physical step << 169 // Parameters set at each physical step by calling method - G4PropagatorInField 265 // by G4PropagatorInField << 266 170 267 G4Navigator *fHelpingNavigator; 171 G4Navigator *fHelpingNavigator; 268 // Helper for location 172 // Helper for location 269 << 270 G4TouchableHistory *fpTouchable = nullptr; << 271 // Touchable history hook << 272 }; 173 }; 273 174 274 #include "G4VIntersectionLocator.icc" 175 #include "G4VIntersectionLocator.icc" 275 176 276 #endif 177 #endif 277 178