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.5.p2)


  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: not supported by cvs2svn $
                                                   >>  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( const G4ThreeVector&  StartPointA,
 80                                    const G4Thr     88                                    const G4ThreeVector&  EndPointB,
 81                                    G4double&   <<  89                                    G4double      &NewSafety,
 82                                    G4double&   <<  90                                    G4double      &PreviousSafety,    // In/Out
 83                                    G4ThreeVect <<  91                                    G4ThreeVector &PreviousSftOrigin, // In/Out
 84                                    G4double&   <<  92                                    G4double      &LinearStepLength,
 85                                    G4ThreeVect <<  93                                    G4ThreeVector &IntersectionPoint,
 86                                    G4bool*     <<  94                                    G4bool        *calledNavigator=0 );
 87        // Intersect the chord from StartPointA     95        // Intersect the chord from StartPointA to EndPointB and return
 88        // whether an intersection occurred. NO     96        // whether an intersection occurred. NOTE: changes the Safety!
 89                                                    97 
 90      inline void SetEpsilonStepFor( G4double E <<  98      inline void    SetEpsilonStepFor( G4double EpsilonStep );
 91      inline void SetDeltaIntersectionFor( G4do <<  99      inline void    SetDeltaIntersectionFor( G4double deltaIntersection );
 92      inline void SetNavigatorFor( G4Navigator* << 100      inline void    SetNavigatorFor( G4Navigator *fNavigator );
 93      inline void SetChordFinderFor(G4ChordFind << 101      inline void    SetChordFinderFor(G4ChordFinder *fCFinder );
 94        // These parameters must be set at each    102        // These parameters must be set at each step, in case they were changed
                                                   >> 103 
 95        // Note: This simple approach ensures t    104        // Note: This simple approach ensures that all scenarios are considered. 
 96        //       Future refinement may identify << 105        //   [ Future refinement may identify which are invariant during a 
 97        //       track, run or event            << 106        //      track, run or event ]
 98                                                   107 
 99      inline void  SetVerboseFor(G4int fVerbose << 108     inline void     SetVerboseFor(G4int fVerbose);
100      inline G4int GetVerboseFor();             << 109     inline G4int    GetVerboseFor();
101        // Controling verbosity enables checkin    110        // Controling verbosity enables checking of the locating of intersections
102                                                   111 
103   public:  // without description                 112   public:  // without description
104                                                << 
105     // Additional inline Set/Get methods for p    113     // Additional inline Set/Get methods for parameters, dependent objects
106                                                   114 
107     inline G4double       GetDeltaIntersection    115     inline G4double       GetDeltaIntersectionFor();
108     inline G4double       GetEpsilonStepFor();    116     inline G4double       GetEpsilonStepFor();
109     inline G4Navigator*   GetNavigatorFor();      117     inline G4Navigator*   GetNavigatorFor();
110     inline G4ChordFinder* GetChordFinderFor();    118     inline G4ChordFinder* GetChordFinderFor();
111                                                   119 
112     inline void SetSafetyParametersFor(G4bool  << 120     inline void   SetSafetyParametersFor(G4bool UseSafety );
113                                                   121 
114     inline void AddAdjustementOfFoundIntersect << 122     inline void   AddAdjustementOfFoundIntersection(G4bool UseCorrection);
115     inline G4bool GetAdjustementOfFoundInterse    123     inline G4bool GetAdjustementOfFoundIntersection();
116       // Methods to be made Obsolete - replace    124       // Methods to be made Obsolete - replaced by methods below
117     inline void AdjustIntersections(G4bool Use << 125     inline void   AdjustIntersections(G4bool UseCorrection); 
118     inline G4bool AreIntersectionsAdjusted(){     126     inline G4bool AreIntersectionsAdjusted(){ return fUseNormalCorrection; }  
119       // Change adjustment flag  ( New Interfa    127       // Change adjustment flag  ( New Interface ) 
120                                                   128 
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                 129   protected:  // with description
134                                                   130 
135     G4FieldTrack ReEstimateEndpoint( const G4F << 131     G4FieldTrack ReEstimateEndpoint( const G4FieldTrack &CurrentStateA,  
136                                      const G4F << 132                                      const G4FieldTrack &EstimtdEndStateB,
137                                            G4d << 133                                            G4double      linearDistSq,
138                                            G4d << 134                                            G4double      curveDist);
139       // Return new estimate for state after c    135       // Return new estimate for state after curveDist starting from
140       // CurrentStateA, to replace EstimtdEndS    136       // CurrentStateA, to replace EstimtdEndStateB, and report displacement
141       // (if field is compiled verbose)           137       // (if field is compiled verbose)
142                                                   138 
143     G4bool CheckAndReEstimateEndpoint( const G << 139     G4ThreeVector GetSurfaceNormal(const G4ThreeVector &CurrentInt_Point,
144                                        const G << 140                                          G4bool        &validNormal); // const
145                                              G << 
146                                              G << 
147       // Check whether EndB is too far from St << 
148       // and if, re-estimate new value for End << 
149       // Report error if  EndB is before Start << 
150       // In that case return errorCode = 2.    << 
151                                                << 
152     G4ThreeVector GetSurfaceNormal(const G4Thr << 
153                                          G4boo << 
154       // Position *must* be the intersection p    141       // Position *must* be the intersection point from last call
155       // to G4Navigator's ComputeStep  (via In    142       // to G4Navigator's ComputeStep  (via IntersectChord )
156       // Will try to use cached (last) value i    143       // Will try to use cached (last) value in Navigator for speed, 
157       // if it was kept and valid.                144       // if it was kept and valid.
158       // Value returned is in global coordinat    145       // Value returned is in global coordinates.
159       // It does NOT guarantee to obtain Norma    146       // It does NOT guarantee to obtain Normal. This can happen eg if:
160       //  - the "Intersection" Point is not on    147       //  - the "Intersection" Point is not on a surface, potentially due to
161       //  - inaccuracies in the transformation    148       //  - inaccuracies in the transformations used, or
162       //  - issues with the Solid.                149       //  - issues with the Solid.
163                                                   150 
164     G4ThreeVector GetGlobalSurfaceNormal(const << 151     G4ThreeVector GetGlobalSurfaceNormal(const G4ThreeVector &CurrentE_Point,
165                                                << 152                                                G4bool        &validNormal);
166       // Return the SurfaceNormal of Intersect    153       // Return the SurfaceNormal of Intersecting Solid in global coordinates
167       // Costlier then GetSurfaceNormal           154       // Costlier then GetSurfaceNormal
168                                                   155 
169     G4bool AdjustmentOfFoundIntersection(const << 156     G4bool AdjustmentOfFoundIntersection(const G4ThreeVector &A,
170                                          const << 157                                          const G4ThreeVector &CurrentE_Point, 
171                                          const << 158                                          const G4ThreeVector &CurrentF_Point,
172                                          const << 159                                          const G4ThreeVector &MomentumDir,
173                                          const    160                                          const G4bool         IntersectAF, 
174                                                << 161                                                G4ThreeVector &IntersectionPoint,
175                                                << 162                                                G4double      &NewSafety,
176                                                << 163                                                G4double      &fPrevSafety,
177                                                << 164                                                G4ThreeVector &fPrevSftOrigin );
178       // Optional method for adjustment of loc    165       // Optional method for adjustment of located intersection point
179       // using the surface-normal                 166       // using the surface-normal
180                                                   167   
181     void ReportTrialStep( G4int step_no,          168     void ReportTrialStep( G4int step_no, 
182                           const G4ThreeVector&    169                           const G4ThreeVector& ChordAB_v,
183                           const G4ThreeVector&    170                           const G4ThreeVector& ChordEF_v,
184                           const G4ThreeVector&    171                           const G4ThreeVector& NewMomentumDir,
185                           const G4ThreeVector&    172                           const G4ThreeVector& NormalAtEntry,
186                           G4bool validNormal      173                           G4bool validNormal   );
187       // Print a three-line report on the curr << 174       // Print a three-line report on the current "sub-step", ie trial intersection
188       // intersection                          << 
189                                                   175 
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                     176   private:  // no description
239                                                   177 
240     G4ThreeVector GetLocalSurfaceNormal(const  << 178     G4ThreeVector GetLocalSurfaceNormal(const G4ThreeVector &CurrentE_Point,
241                                                << 179                                               G4bool &validNormal);
242       // Return the SurfaceNormal of Intersect    180       // Return the SurfaceNormal of Intersecting Solid  in local coordinates
243                                                   181 
244     G4ThreeVector GetLastSurfaceNormal( const     182     G4ThreeVector GetLastSurfaceNormal( const G4ThreeVector& intersectPoint,
245                                                << 183                                         G4bool        &validNormal) const; 
246       // Position *must* be the intersection p    184       // Position *must* be the intersection point from last call
247       // to G4Navigator's ComputeStep  (via In    185       // to G4Navigator's ComputeStep  (via IntersectChord )
248       // Temporary - will use the same method     186       // Temporary - will use the same method in the Navigator
249                                                   187 
250   protected:                                      188   protected:
251                                                   189 
252     G4double kCarTolerance;                  / << 190     G4double kCarTolerance;         // Constant
                                                   >> 191 
                                                   >> 192     G4int    fVerboseLevel;          // For debugging
                                                   >> 193     G4bool   fUseNormalCorrection;   // Configuration parameter
                                                   >> 194 
                                                   >> 195     G4Navigator   *fiNavigator;
253                                                   196 
254     G4int    fVerboseLevel = 0;              / << 197     G4ChordFinder *fiChordFinder;
255     G4bool   fUseNormalCorrection = false;   / << 198     G4double       fiEpsilonStep;
256     G4bool   fCheckMode = false;               << 199     G4double       fiDeltaIntersection;
257     G4bool   fiUseSafety = false;    // Whethe << 200     G4bool         fiUseSafety;
258                                                << 
259     G4Navigator* fiNavigator;                  << 
260                                                << 
261     G4ChordFinder* fiChordFinder = nullptr;  / << 
262     G4double fiEpsilonStep = -1.0;           / << 
263     G4double fiDeltaIntersection = -1.0;     / << 
264       // Parameters set at each physical step     201       // Parameters set at each physical step by calling method 
265       // by G4PropagatorInField                   202       // by G4PropagatorInField
266                                                   203 
267     G4Navigator *fHelpingNavigator;               204     G4Navigator *fHelpingNavigator;
268       // Helper for location                      205       // Helper for location
269                                                   206 
270     G4TouchableHistory *fpTouchable = nullptr; << 207     G4TouchableHistory *fpTouchable;
271       // Touchable history hook                   208       // Touchable history hook
272 };                                                209 };
273                                                   210 
274 #include "G4VIntersectionLocator.icc"             211 #include "G4VIntersectionLocator.icc"
275                                                   212 
276 #endif                                            213 #endif
277                                                   214