Geant4  10.00.p01
UCons.icc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * This Software is part of the AIDA Unified Solids Library package *
4 // * See: https://aidasoft.web.cern.ch/USolids *
5 // ********************************************************************
6 //
7 // $Id:$
8 //
9 // --------------------------------------------------------------------
10 //
11 // UCons.icc
12 //
13 // Implementation of inline methods of UCons
14 //
15 // 19.10.12 Marek Gayer
16 // Created from original implementation in Geant4
17 // --------------------------------------------------------------------
18 
19 inline
20 double UCons::GetInnerRadiusMinusZ() const
21 {
22  return fRmin1 ;
23 }
24 
25 inline
26 double UCons::GetOuterRadiusMinusZ() const
27 {
28  return fRmax1 ;
29 }
30 
31 inline
32 double UCons::GetInnerRadiusPlusZ() const
33 {
34  return fRmin2 ;
35 }
36 
37 inline
38 double UCons::GetOuterRadiusPlusZ() const
39 {
40  return fRmax2 ;
41 }
42 
43 inline
44 double UCons::GetZHalfLength() const
45 {
46  return fDz ;
47 }
48 
49 inline
50 double UCons::GetStartPhiAngle() const
51 {
52  return fSPhi ;
53 }
54 
55 inline
56 double UCons::GetDeltaPhiAngle() const
57 {
58  return fDPhi;
59 }
60 
61 inline
62 void UCons::Initialize()
63 {
64  fCubicVolume = 0.;
65  fSurfaceArea = 0.;
66 
67  tanRMin = (fRmin2 - fRmin1) * 0.5 / fDz;
68  secRMin = std::sqrt(1.0 + tanRMin * tanRMin);
69 
70  tanRMax = (fRmax2 - fRmax1) * 0.5 / fDz;
71  secRMax = std::sqrt(1.0 + tanRMax * tanRMax);
72 }
73 
74 inline
75 void UCons::InitializeTrigonometry()
76 {
77  double hDPhi = 0.5 * fDPhi; // half delta phi
78  double cPhi = fSPhi + hDPhi;
79  double ePhi = fSPhi + fDPhi;
80 
81  sinCPhi = std::sin(cPhi);
82  cosCPhi = std::cos(cPhi);
83  cosHDPhiIT = std::cos(hDPhi - 0.5 * kAngTolerance); // inner/outer tol half dphi
84  cosHDPhiOT = std::cos(hDPhi + 0.5 * kAngTolerance);
85  sinSPhi = std::sin(fSPhi);
86  cosSPhi = std::cos(fSPhi);
87  sinEPhi = std::sin(ePhi);
88  cosEPhi = std::cos(ePhi);
89 }
90 
91 inline void UCons::CheckSPhiAngle(double sPhi)
92 {
93  // Ensure fSphi in 0-2PI or -2PI-0 range if shape crosses 0
94 
95  if (sPhi < 0)
96  {
97  fSPhi = 2 * UUtils::kPi - std::fmod(std::fabs(sPhi), 2 * UUtils::kPi);
98  }
99  else
100  {
101  fSPhi = std::fmod(sPhi, 2 * UUtils::kPi) ;
102  }
103  if (fSPhi + fDPhi > 2 * UUtils::kPi)
104  {
105  fSPhi -= 2 * UUtils::kPi ;
106  }
107 }
108 
109 inline void UCons::CheckDPhiAngle(double dPhi)
110 {
111  fPhiFullCone = true;
112  if (dPhi >= 2 * UUtils::kPi - kAngTolerance * 0.5)
113  {
114  fDPhi = 2 * UUtils::kPi;
115  fSPhi = 0;
116  }
117  else
118  {
119  fPhiFullCone = false;
120  if (dPhi > 0)
121  {
122  fDPhi = dPhi;
123  }
124  else
125  {
126  std::ostringstream message;
127  message << "Invalid dphi." << std::endl
128  << "Negative or zero delta-Phi (" << dPhi << ") in solid: "
129  << GetName();
130  UUtils::Exception("UCons::CheckDPhiAngle()", "GeomSolids0002",
131  FatalErrorInArguments, 1, message.str().c_str());
132  }
133  }
134 }
135 
136 inline void UCons::CheckPhiAngles(double sPhi, double dPhi)
137 {
138  CheckDPhiAngle(dPhi);
139  if ((fDPhi < 2 * UUtils::kPi) && (sPhi))
140  {
141  CheckSPhiAngle(sPhi);
142  }
143  InitializeTrigonometry();
144 }
145 
146 inline
147 void UCons::SetInnerRadiusMinusZ(double Rmin1)
148 {
149  fRmin1 = Rmin1 ;
150  Initialize();
151 }
152 
153 inline
154 void UCons::SetOuterRadiusMinusZ(double Rmax1)
155 {
156  fRmax1 = Rmax1 ;
157  Initialize();
158 }
159 
160 inline
161 void UCons::SetInnerRadiusPlusZ(double Rmin2)
162 {
163  fRmin2 = Rmin2 ;
164  Initialize();
165 }
166 
167 inline
168 void UCons::SetOuterRadiusPlusZ(double Rmax2)
169 {
170  fRmax2 = Rmax2 ;
171  Initialize();
172 }
173 
174 inline
175 void UCons::SetZHalfLength(double newDz)
176 {
177  fDz = newDz ;
178  Initialize();
179 }
180 
181 inline
182 void UCons::SetStartPhiAngle(double newSPhi, bool compute)
183 {
184  // Flag 'compute' can be used to explicitely avoid recomputation of
185  // trigonometry in case SetDeltaPhiAngle() is invoked afterwards
186 
187  CheckSPhiAngle(newSPhi);
188  fPhiFullCone = false;
189  if (compute)
190  {
191  InitializeTrigonometry();
192  }
193  Initialize();
194 }
195 
196 void UCons::SetDeltaPhiAngle(double newDPhi)
197 {
198  CheckPhiAngles(fSPhi, newDPhi);
199  Initialize();
200 }
201 
202 // Old access methods ...
203 
204 inline
205 double UCons::GetRmin1() const
206 {
207  return GetInnerRadiusMinusZ();
208 }
209 
210 inline
211 double UCons::GetRmax1() const
212 {
213  return GetOuterRadiusMinusZ();
214 }
215 
216 inline
217 double UCons::GetRmin2() const
218 {
219  return GetInnerRadiusPlusZ();
220 }
221 
222 inline
223 double UCons::GetRmax2() const
224 {
225  return GetOuterRadiusPlusZ();
226 }
227 
228 inline
229 double UCons::GetDz() const
230 {
231  return GetZHalfLength();
232 }
233 
234 inline
235 double UCons::GetSPhi() const
236 {
237  return GetStartPhiAngle();
238 }
239 
240 inline
241 double UCons::GetDPhi() const
242 {
243  return GetDeltaPhiAngle();
244 }
245 
246 inline
247 double UCons::Capacity()
248 {
249  if (fCubicVolume != 0.)
250  {
251  ;
252  }
253  else
254  {
255  double Rmean, rMean, deltaR, deltar;
256 
257  Rmean = 0.5 * (fRmax1 + fRmax2);
258  deltaR = fRmax1 - fRmax2;
259 
260  rMean = 0.5 * (fRmin1 + fRmin2);
261  deltar = fRmin1 - fRmin2;
262  fCubicVolume = fDPhi * fDz * (Rmean * Rmean - rMean * rMean
263  + (deltaR * deltaR - deltar * deltar) / 12);
264  }
265  return fCubicVolume;
266 }
267 
268 inline
269 double UCons::SurfaceArea()
270 {
271  if (fSurfaceArea != 0.)
272  {
273  ;
274  }
275  else
276  {
277  double mmin, mmax, dmin, dmax;
278 
279  mmin = (fRmin1 + fRmin2) * 0.5;
280  mmax = (fRmax1 + fRmax2) * 0.5;
281  dmin = (fRmin2 - fRmin1);
282  dmax = (fRmax2 - fRmax1);
283 
284  fSurfaceArea = fDPhi * (mmin * std::sqrt(dmin * dmin + 4 * fDz * fDz)
285  + mmax * std::sqrt(dmax * dmax + 4 * fDz * fDz)
286  + 0.5 * (fRmax1 * fRmax1 - fRmin1 * fRmin1
287  + fRmax2 * fRmax2 - fRmin2 * fRmin2));
288  if (!fPhiFullCone)
289  {
290  fSurfaceArea = fSurfaceArea + 4 * fDz * (mmax - mmin);
291  }
292  }
293  return fSurfaceArea;
294 }