ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4Para.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4Para.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 // G4Para
27 //
28 // Class description:
29 //
30 // A G4Parallepiped, essentially a box with half lengths dx,dy,dz
31 // `skewed' so that there are angles theta & phi of the polar line
32 // joining the faces at +-dz in z, and alpha formed by the y axis
33 // and the plane joinng the centre of the faces G4Parallel to the
34 // z-x plane at -dy and +dy.
35 //
36 // A G4Para is defined by:
37 // dx,dy,dz - Half-length in x,y,z
38 // alpha - Angle formed by the y axis and by the plane joining
39 // the centre of the faces G4Parallel to the z-x plane
40 // at -dy and +dy
41 // theta - Polar angle of the line joining the centres of the
42 // faces at -dz and +dz in z
43 // phi - Azimuthal angle of the line joining the centres of the
44 // faces at -dz and +dz in z
45 // Member data:
46 //
47 // Note that the angles parameters are not stored - precomputed trig is
48 // stored instead.
49 //
50 // fDx Half-length in x
51 // fDy Half-length in y
52 // fDz Half-length in z
53 //
54 // fTalpha Tan of alpha
55 // fTthetaCphi Tan theta * Cos phi
56 // fTthetaSphi Tan theta * Sin phi
57 
58 // 21.3.94 P.Kent Old C++ code converted to tolerant geometry
59 // 31.10.96 V.Grichine Modifications according G4Box/Tubs before to commit
60 // --------------------------------------------------------------------
61 #ifndef G4PARA_HH
62 #define G4PARA_HH
63 
64 #include "G4GeomTypes.hh"
65 
66 #if defined(G4GEOM_USE_USOLIDS)
67 #define G4GEOM_USE_UPARA 1
68 #endif
69 
70 #if defined(G4GEOM_USE_UPARA)
71  #define G4UPara G4Para
72  #include "G4UPara.hh"
73 #else
74 
75 #include "G4CSGSolid.hh"
76 #include "G4Polyhedron.hh"
77 
78 class G4Para : public G4CSGSolid
79 {
80  public: // with description
81 
82  G4Para(const G4String& pName,
83  G4double pDx, G4double pDy, G4double pDz,
84  G4double pAlpha, G4double pTheta, G4double pPhi);
85 
86  G4Para(const G4String& pName,
87  const G4ThreeVector pt[8]);
88 
89  virtual ~G4Para();
90 
91  // Accessors
92 
93  inline G4double GetZHalfLength() const;
94  inline G4ThreeVector GetSymAxis() const;
95  inline G4double GetYHalfLength() const;
96  inline G4double GetXHalfLength() const;
97  inline G4double GetTanAlpha() const;
98 
99  // Modifiers
100 
101  inline void SetXHalfLength(G4double val);
102  inline void SetYHalfLength(G4double val);
103  inline void SetZHalfLength(G4double val);
104  inline void SetAlpha(G4double alpha);
105  inline void SetTanAlpha(G4double val);
106  inline void SetThetaAndPhi(double pTheta, double pPhi);
107 
108  void SetAllParameters(G4double pDx, G4double pDy, G4double pDz,
109  G4double pAlpha, G4double pTheta, G4double pPhi);
110 
111  // Methods of solid
112 
115 
117  const G4int n,
118  const G4VPhysicalVolume* pRep);
119 
121 
122  G4bool CalculateExtent(const EAxis pAxis,
123  const G4VoxelLimits& pVoxelLimit,
124  const G4AffineTransform& pTransform,
125  G4double& pMin, G4double& pMax) const;
126 
127  EInside Inside(const G4ThreeVector& p) const;
128 
129  G4ThreeVector SurfaceNormal( const G4ThreeVector& p) const;
130 
132  const G4ThreeVector& v) const;
133  G4double DistanceToIn(const G4ThreeVector& p) const;
134 
136  const G4bool calcNorm = false,
137  G4bool* validNorm = nullptr,
138  G4ThreeVector* n = nullptr) const;
139  G4double DistanceToOut(const G4ThreeVector& p) const;
140 
142 
144 
145  G4VSolid* Clone() const;
146 
147  std::ostream& StreamInfo(std::ostream& os) const;
148 
149  // Visualisation functions
150 
151  void DescribeYourselfTo (G4VGraphicsScene& scene) const;
152  G4Polyhedron* CreatePolyhedron () const;
153 
154  public: // without description
155 
156  G4Para(__void__&);
157  // Fake default constructor for usage restricted to direct object
158  // persistency for clients requiring preallocation of memory for
159  // persistifiable objects
160 
161  G4Para(const G4Para& rhs);
162  G4Para& operator=(const G4Para& rhs);
163  // Copy constructor and assignment operator
164 
165  private:
166 
167  void CheckParameters();
168  // Check parameters
169 
170  void MakePlanes();
171  // Set side planes
172 
174  // Algorithm for SurfaceNormal() following the original
175  // specification for points not on the surface
176 
177  private:
178 
182  struct { G4double a,b,c,d; } fPlanes[4];
183 };
184 
185 #include "G4Para.icc"
186 
187 #endif
188 
189 #endif