Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/navigation/include/G4ReplicaNavigation.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 ]

  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 G4ReplicaNavigation
 27 //
 28 // Class description:
 29 //
 30 // Utility for navigation in volumes containing a single G4PVParameterised
 31 // volume for which voxels for the replicated volumes have been constructed.
 32 // [Voxels MUST be along one axis only: NOT refined]
 33 
 34 // History:
 35 // - Created: Paul Kent, Aug 96
 36 // --------------------------------------------------------------------
 37 #ifndef G4REPLICANAVIGATION_HH
 38 #define G4REPLICANAVIGATION_HH
 39 
 40 #include <CLHEP/Units/SystemOfUnits.h>
 41 
 42 #include "G4Types.hh"
 43 #include "G4NavigationHistory.hh"
 44 #include "G4LogicalVolume.hh"
 45 #include "G4VPhysicalVolume.hh"
 46 #include "G4ThreeVector.hh"
 47 #include "G4BlockingList.hh"
 48 
 49 // Required for voxel handling
 50 //
 51 #include "G4SmartVoxelHeader.hh"
 52 
 53 class G4VSolid;
 54 
 55 struct G4ExitNormal
 56 {
 57    // Bucket to hold value of Normal (3-vector), 
 58    // bools for calculated and leave-behind or 'validConvex',
 59    // and exiting side.
 60    
 61    enum  ESide {kNull,kRMin,kRMax,kSPhi,kEPhi,kPX,kMX,kPY,kMY,kPZ,kMZ,kMother};
 62      // Identity of 'Side' of Replicas. Used by DistanceToOut methods.
 63 
 64    G4ThreeVector exitNormal;
 65    G4bool        calculated;   // Normal
 66    G4bool        validConvex;  // Solid locally convex
 67    ESide         exitSide;
 68 
 69  public:
 70 
 71    G4ExitNormal(const G4ThreeVector& norm = G4ThreeVector(0.,0.,0.),
 72                 G4bool        calc = false,
 73                 G4bool        valid= false,
 74                 ESide         side = kNull )
 75    { exitNormal= norm; calculated= calc; validConvex=valid; exitSide=side;}
 76 };
 77 
 78 class G4ReplicaNavigation
 79 {
 80   public:
 81 
 82     G4ReplicaNavigation();
 83    ~G4ReplicaNavigation() = default;
 84 
 85     inline G4bool LevelLocate( G4NavigationHistory& history,
 86                          const G4VPhysicalVolume* blockedVol,
 87                          const G4int blockedNum,
 88                          const G4ThreeVector& globalPoint,
 89                          const G4ThreeVector* globalDirection,
 90                          const G4bool pLocatedOnEdge, 
 91                                G4ThreeVector& localPoint );
 92 
 93     G4double ComputeStep( const G4ThreeVector& globalPoint,
 94                           const G4ThreeVector& globalDirection,
 95                           const G4ThreeVector& localPoint,
 96                           const G4ThreeVector& localDirection,
 97                           const G4double currentProposedStepLength,
 98                                 G4double& newSafety,
 99                                 G4NavigationHistory& history,
100                                 G4bool& validExitNormal,
101                                 G4bool& calculatedExitNormal,
102                                 G4ThreeVector &exitNormal,
103                                 G4bool& exiting,
104                                 G4bool& entering,
105                                 G4VPhysicalVolume* (*pBlockedPhysical),
106                                 G4int &blockedReplicaNo );
107 
108     G4double ComputeSafety( const G4ThreeVector& globalPoint,
109                             const G4ThreeVector& localPoint,
110                             const G4NavigationHistory& history,
111                             const G4double pProposedMaxLength = DBL_MAX ) const;
112 
113     EInside BackLocate( G4NavigationHistory &history,
114                   const G4ThreeVector& globalPoint,
115                         G4ThreeVector& localPoint,
116                   const G4bool& exiting,
117                         G4bool& notKnownInside ) const;
118 
119     void ComputeTransformation( const G4int replicaNo,
120                                       G4VPhysicalVolume* pVol,
121                                       G4ThreeVector& point ) const; 
122     void ComputeTransformation( const G4int replicaNo,
123                                       G4VPhysicalVolume* pVol ) const; 
124 
125     EInside Inside( const G4VPhysicalVolume* pVol,
126                     const G4int replicaNo,
127                     const G4ThreeVector& localPoint ) const;
128     G4double DistanceToOut( const G4VPhysicalVolume* pVol,
129                             const G4int replicaNo,
130                             const G4ThreeVector &localPoint ) const;
131     G4double DistanceToOut( const G4VPhysicalVolume* pVol,
132                             const G4int replicaNo,
133                             const G4ThreeVector& localPoint,
134                             const G4ThreeVector& localDirection,
135                                   G4ExitNormal& candidateNormal ) const;
136 
137     inline G4int GetVerboseLevel() const;
138     inline void  SetVerboseLevel(G4int level);
139       // Get/Set Verbose(ness) level.
140       // [if level>0 && G4VERBOSE, printout can occur]
141 
142     inline void CheckMode(G4bool mode);
143       // Run navigation in "check-mode", therefore using additional
144       // verifications and more strict correctness conditions.
145       // Is effective only with G4VERBOSE set.
146 
147   private:
148 
149     inline G4int VoxelLocate( const G4SmartVoxelHeader* pHead,
150                               const G4ThreeVector& localPoint,
151                               const G4int blocked=-1 ) const;
152 
153     G4double DistanceToOutPhi( const G4ThreeVector& localPoint,
154                                const G4ThreeVector& localDirection,
155                                const G4double width,
156                                G4ExitNormal& foundNormal ) const;
157 
158     G4double DistanceToOutRad( const G4ThreeVector& localPoint,
159                                const G4ThreeVector& localDirection,
160                                const G4double width,
161                                const G4double offset,
162                                const G4int replicaNo,
163                                      G4ExitNormal& foundNormal ) const;
164     inline void SetPhiTransformation( const G4double ang,
165                                             G4VPhysicalVolume* pVol=nullptr ) const;
166   private:
167 
168     // Invariants - unaltered during navigation
169     // **********
170 
171     G4bool fCheck = false; 
172     G4int  fVerbose = 0;
173       // Configuration parameters
174 
175     G4double kCarTolerance, kRadTolerance, kAngTolerance,
176              halfkCarTolerance, halfkRadTolerance, halfkAngTolerance,
177              fMinStep;
178       // Local copy of constants
179 };
180 
181 #include "G4ReplicaNavigation.icc"
182 
183 #endif
184