Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/navigation/include/G4VIntersectionLocator.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /geometry/navigation/include/G4VIntersectionLocator.hh (Version 11.3.0) and /geometry/navigation/include/G4VIntersectionLocator.hh (Version 9.3)


  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-03 $
                                                   >>  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