ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4Paraboloid.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4Paraboloid.hh
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 // G4Paraboloid
27 //
28 // Class description:
29 //
30 // A G4Paraboloid represents a solid with parabolic profile with possible
31 // cuts along the Z axis.
32 //
33 // Member Data:
34 //
35 // dz z half lenght
36 // r1 radius at -dz
37 // r2 radius at dz
38 // r2 > r1
39 //
40 // Equation for the solid:
41 // rho^2 <= k1 * z + k2;
42 // -dz <= z <= dz
43 // r1^2 = k1 * (-dz) + k2
44 // r2^2 = k1 * ( dz) + k2
45 
46 // 10.07.2007, L.Lindroos (CERN) - First implementation
47 // --------------------------------------------------------------------
48 #ifndef G4PARABOLOID_HH
49 #define G4PARABOLOID_HH
50 
51 #include "G4GeomTypes.hh"
52 
53 #if defined(G4GEOM_USE_USOLIDS)
54 #define G4GEOM_USE_UPARABOLOID 1
55 #endif
56 
57 #if (defined(G4GEOM_USE_UPARABOLOID) && defined(G4GEOM_USE_SYS_USOLIDS))
58  #define G4UParaboloid G4Paraboloid
59  #include "G4UParaboloid.hh"
60 #else
61 
63 
64 #include "G4VSolid.hh"
65 #include "G4Polyhedron.hh"
66 
67 class G4Paraboloid : public G4VSolid
68 {
69  public: // with description
70 
71  G4Paraboloid(const G4String& pName,
72  G4double pDz,
73  G4double pR1,
74  G4double pR2);
75 
76  virtual ~G4Paraboloid();
77 
78  // Access functions
79 
80  inline G4double GetZHalfLength() const;
81  inline G4double GetRadiusMinusZ() const;
82  inline G4double GetRadiusPlusZ() const;
83 
84  inline G4double GetCubicVolume();
85  inline G4double GetSurfaceArea();
86  inline G4double CalculateSurfaceArea() const;
87 
88  // Modifiers functions
89 
90  inline void SetZHalfLength(G4double dz);
91  inline void SetRadiusMinusZ(G4double R1);
92  inline void SetRadiusPlusZ(G4double R2);
93 
94  // Solid standard methods
95 
97  G4bool CalculateExtent(const EAxis pAxis,
98  const G4VoxelLimits& pVoxelLimit,
99  const G4AffineTransform& pTransform,
100  G4double& pmin, G4double& pmax) const;
101  EInside Inside(const G4ThreeVector& p) const;
102  G4ThreeVector SurfaceNormal( const G4ThreeVector& p) const;
104  const G4ThreeVector& v) const;
105  G4double DistanceToIn(const G4ThreeVector& p) const;
107  const G4ThreeVector& v,
108  const G4bool calcNorm = false,
109  G4bool* validNorm = nullptr,
110  G4ThreeVector* n = nullptr) const;
111  G4double DistanceToOut(const G4ThreeVector& p) const;
112 
114 
115  G4VSolid* Clone() const;
116 
117  std::ostream& StreamInfo(std::ostream& os) const;
118 
120 
121  // Visualisation functions
122 
123  void DescribeYourselfTo(G4VGraphicsScene& scene) const;
125  G4Polyhedron* GetPolyhedron () const;
126 
127  public: // without description
128 
129  G4Paraboloid(__void__&);
130  // Fake default constructor for usage restricted to direct object
131  // persistency for clients requiring preallocation of memory for
132  // persistifiable objects.
133 
134  G4Paraboloid(const G4Paraboloid& rhs);
135  G4Paraboloid& operator=(const G4Paraboloid& rhs);
136  // Copy constructor and assignment operator.
137 
138  protected: // without description
139 
140  mutable G4bool fRebuildPolyhedron = false;
141  mutable G4Polyhedron* fpPolyhedron = nullptr;
142 
143  private:
144 
145  // Making this mutable to allow GetPointOnSurface to have access to
146  // area function.
147  mutable G4double fSurfaceArea = 0.0;
149 
152  // Defined to make some calculations easier to follow
153 };
154 
155 #include "G4Paraboloid.icc"
156 
157 #endif // defined(G4GEOM_USE_UPARABOLOID) && defined(G4GEOM_USE_SYS_USOLIDS)
158 
159 #endif // G4Paraboloid_HH