ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4UHype.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4UHype.cc
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 // Implementation for G4UHype wrapper class
27 //
28 // 16-10-2017 G.Cosmo, CERN
29 // --------------------------------------------------------------------
30 
31 #include "G4Hype.hh"
32 
33 #include "G4UHype.hh"
34 
35 #if ( defined(G4GEOM_USE_USOLIDS) || defined(G4GEOM_USE_PARTIAL_USOLIDS) )
36 
37 #include "G4AffineTransform.hh"
38 #include "G4VPVParameterisation.hh"
39 #include "G4BoundingEnvelope.hh"
40 #include "G4Polyhedron.hh"
41 
43 //
44 // Constructor
45 
46 G4UHype::G4UHype(const G4String& pName,
47  G4double newInnerRadius,
48  G4double newOuterRadius,
49  G4double newInnerStereo,
50  G4double newOuterStereo,
51  G4double newHalfLenZ)
52  : Base_t(pName, newInnerRadius, newOuterRadius,
53  newInnerStereo, newOuterStereo, newHalfLenZ)
54 { }
55 
57 //
58 // Fake default constructor - sets only member data and allocates memory
59 // for usage restricted to object persistency.
60 
61 G4UHype::G4UHype( __void__& a )
62  : Base_t(a)
63 { }
64 
66 //
67 // Destructor
68 
69 G4UHype::~G4UHype() { }
70 
72 //
73 // Copy constructor
74 
75 G4UHype::G4UHype(const G4UHype& rhs)
76  : Base_t(rhs)
77 { }
78 
80 //
81 // Assignment operator
82 
83 G4UHype& G4UHype::operator = (const G4UHype& rhs)
84 {
85  // Check assignment to self
86  //
87  if (this == &rhs) { return *this; }
88 
89  // Copy base class data
90  //
91  Base_t::operator=(rhs);
92 
93  return *this;
94 }
95 
97 //
98 // Accessors
99 
100 G4double G4UHype::GetInnerRadius () const
101 {
102  return GetRmin();
103 }
104 
105 G4double G4UHype::GetOuterRadius () const
106 {
107  return GetRmax();
108 }
109 
110 G4double G4UHype::GetZHalfLength () const
111 {
112  return GetDz();
113 }
114 
115 G4double G4UHype::GetInnerStereo () const
116 {
117  return GetStIn();
118 }
119 
120 G4double G4UHype::GetOuterStereo () const
121 {
122  return GetStOut();
123 }
124 
126 //
127 // Modifiers
128 
129 void G4UHype::SetInnerRadius (G4double newIRad)
130 {
131  SetParameters(newIRad, GetRmax(), GetStIn(), GetStOut(), GetDz());
132  fRebuildPolyhedron = true;
133 }
134 
135 void G4UHype::SetOuterRadius (G4double newORad)
136 {
137  SetParameters(GetRmin(), newORad, GetStIn(), GetStOut(), GetDz());
138  fRebuildPolyhedron = true;
139 }
140 
141 void G4UHype::SetZHalfLength (G4double newHLZ)
142 {
143  SetParameters(GetRmin(), GetRmax(), GetStIn(), GetStOut(), newHLZ);
144  fRebuildPolyhedron = true;
145 }
146 
147 void G4UHype::SetInnerStereo (G4double newISte)
148 {
149  SetParameters(GetRmin(), GetRmax(), newISte, GetStOut(), GetDz());
150  fRebuildPolyhedron = true;
151 }
152 
153 void G4UHype::SetOuterStereo (G4double newOSte)
154 {
155  SetParameters(GetRmin(), GetRmax(), GetStIn(), newOSte, GetDz());
156  fRebuildPolyhedron = true;
157 }
158 
159 
161 //
162 // Dispatch to parameterisation for replication mechanism dimension
163 // computation & modification.
164 
165 void G4UHype::ComputeDimensions(G4VPVParameterisation* p,
166  const G4int n,
167  const G4VPhysicalVolume* pRep)
168 {
169  p->ComputeDimensions(*(G4Hype*)this,n,pRep);
170 }
171 
172 
174 //
175 // Make a clone of the object
176 
177 G4VSolid* G4UHype::Clone() const
178 {
179  return new G4UHype(*this);
180 }
181 
183 //
184 // Get bounding box
185 
186 void G4UHype::BoundingLimits(G4ThreeVector& pMin,
187  G4ThreeVector& pMax) const
188 {
189  G4double endORadius = GetEndInnerRadius();
190  pMin.set(-endORadius,-endORadius,-GetDz());
191  pMax.set( endORadius, endORadius, GetDz());
192 
193  // Check correctness of the bounding box
194  //
195  if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
196  {
197  std::ostringstream message;
198  message << "Bad bounding box (min >= max) for solid: "
199  << GetName() << " !"
200  << "\npMin = " << pMin
201  << "\npMax = " << pMax;
202  G4Exception("G4UHype::BoundingLimits()", "GeomMgt0001",
203  JustWarning, message);
204  StreamInfo(G4cout);
205  }
206 }
207 
209 //
210 // Calculate extent under transform and specified limit
211 
212 G4bool
213 G4UHype::CalculateExtent(const EAxis pAxis,
214  const G4VoxelLimits& pVoxelLimit,
215  const G4AffineTransform& pTransform,
216  G4double& pMin, G4double& pMax) const
217 {
218  G4ThreeVector bmin, bmax;
219 
220  // Get bounding box
221  BoundingLimits(bmin,bmax);
222 
223  // Find extent
224  G4BoundingEnvelope bbox(bmin,bmax);
225  return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
226 }
227 
229 //
230 // CreatePolyhedron
231 //
232 G4Polyhedron* G4UHype::CreatePolyhedron() const
233 {
234  return new G4PolyhedronHype(GetRmin(), GetRmax(),
235  GetTIn2(), GetTOut2(), GetDz());
236 }
237 
238 #endif // G4GEOM_USE_USOLIDS