ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4Trd.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4Trd.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 // G4Trd
27 //
28 // Class description:
29 //
30 // A G4Trd is a trapezoid with the x and y dimensions varying along z
31 // functions:
32 //
33 // Member Data:
34 //
35 // fDx1 Half-length along x at the surface positioned at -dz
36 // fDx2 Half-length along x at the surface positioned at +dz
37 // fDy1 Half-length along y at the surface positioned at -dz
38 // fDy2 Half-length along y at the surface positioned at +dz
39 // fDz Half-length along z axis
40 
41 // 12.01.95 P.Kent: Old prototype code converted to thick geometry
42 // 21.04.97 J.Apostolakis: Added Set Methods
43 // 19.11.99 V.Grichine: kUndefined was added to Eside enum
44 // --------------------------------------------------------------------
45 #ifndef G4TRD_HH
46 #define G4TRD_HH
47 
48 #include "G4GeomTypes.hh"
49 
50 #if defined(G4GEOM_USE_USOLIDS)
51 #define G4GEOM_USE_UTRD 1
52 #endif
53 
54 #if defined(G4GEOM_USE_UTRD)
55  #define G4UTrd G4Trd
56  #include "G4UTrd.hh"
57 #else
58 
59 #include "G4CSGSolid.hh"
60 #include "G4Polyhedron.hh"
61 
62 class G4Trd : public G4CSGSolid
63 {
64  public: // with description
65 
66  G4Trd( const G4String& pName,
67  G4double pdx1, G4double pdx2,
68  G4double pdy1, G4double pdy2,
69  G4double pdz );
70  //
71  // Constructs a trapezoid with name, and half lengths
72 
73  ~G4Trd();
74  //
75  // Destructor
76 
77  // Accessors
78 
79  inline G4double GetXHalfLength1() const;
80  inline G4double GetXHalfLength2() const;
81  inline G4double GetYHalfLength1() const;
82  inline G4double GetYHalfLength2() const;
83  inline G4double GetZHalfLength() const;
84 
85  // Modifiers
86 
87  inline void SetXHalfLength1(G4double val);
88  inline void SetXHalfLength2(G4double val);
89  inline void SetYHalfLength1(G4double val);
90  inline void SetYHalfLength2(G4double val);
91  inline void SetZHalfLength(G4double val);
92 
93  void SetAllParameters ( G4double pdx1, G4double pdx2,
94  G4double pdy1, G4double pdy2,
95  G4double pdz );
96 
97  // Methods of solid
98 
101 
103  const G4int n,
104  const G4VPhysicalVolume* pRep );
105 
107 
108  G4bool CalculateExtent( const EAxis pAxis,
109  const G4VoxelLimits& pVoxelLimit,
110  const G4AffineTransform& pTransform,
111  G4double& pMin, G4double& pMax ) const;
112 
113  EInside Inside( const G4ThreeVector& p ) const;
114 
115  G4ThreeVector SurfaceNormal( const G4ThreeVector& p ) const;
116 
118  const G4ThreeVector& v ) const;
119 
120  G4double DistanceToIn( const G4ThreeVector& p ) const;
121 
123  const G4ThreeVector& v,
124  const G4bool calcNorm = false,
125  G4bool* validNorm = nullptr,
126  G4ThreeVector* n = nullptr ) const;
127 
128  G4double DistanceToOut( const G4ThreeVector& p ) const;
129 
131 
133 
134  G4VSolid* Clone() const;
135 
136  std::ostream& StreamInfo( std::ostream& os ) const;
137 
138  // Visualisation functions
139 
140  void DescribeYourselfTo (G4VGraphicsScene& scene) const;
141  G4Polyhedron* CreatePolyhedron () const;
142 
143  public: // without description
144 
145  G4Trd(__void__&);
146  // Fake default constructor for usage restricted to direct object
147  // persistency for clients requiring preallocation of memory for
148  // persistifiable objects.
149 
150  G4Trd(const G4Trd& rhs);
151  G4Trd& operator=(const G4Trd& rhs);
152  // Copy constructor and assignment operator
153 
154  private:
155 
156  void CheckParameters();
157  // Check parameters
158 
159  void MakePlanes();
160  // Set side planes
161 
163  // Algorithm for SurfaceNormal() following the original
164  // specification for points not on the surface
165 
166  private:
167 
170  struct { G4double a,b,c,d; } fPlanes[4];
171 };
172 
173 #include "G4Trd.icc"
174 
175 #endif
176 
177 #endif