36 #if ( defined(G4GEOM_USE_USOLIDS) || defined(G4GEOM_USE_PARTIAL_USOLIDS) )
43 using namespace CLHEP;
50 G4UCons::G4UCons(
const G4String& pName,
55 : G4USolid(pName, new UCons(pName, pRmin1, pRmax1, pRmin2, pRmax2,
65 G4UCons::G4UCons( __void__&
a )
82 G4UCons::G4UCons(
const G4UCons& rhs)
91 G4UCons& G4UCons::operator = (
const G4UCons& rhs)
95 if (
this == &rhs) {
return *
this; }
99 G4USolid::operator=(rhs);
108 G4double G4UCons::GetInnerRadiusMinusZ()
const
110 return GetShape()->GetInnerRadiusMinusZ();
112 G4double G4UCons::GetOuterRadiusMinusZ()
const
114 return GetShape()->GetOuterRadiusMinusZ();
116 G4double G4UCons::GetInnerRadiusPlusZ()
const
118 return GetShape()->GetInnerRadiusPlusZ();
120 G4double G4UCons::GetOuterRadiusPlusZ()
const
122 return GetShape()->GetOuterRadiusPlusZ();
124 G4double G4UCons::GetZHalfLength()
const
126 return GetShape()->GetZHalfLength();
128 G4double G4UCons::GetStartPhiAngle()
const
130 return GetShape()->GetStartPhiAngle();
132 G4double G4UCons::GetDeltaPhiAngle()
const
134 return GetShape()->GetDeltaPhiAngle();
136 G4double G4UCons::GetSinStartPhi()
const
138 G4double phi = GetShape()->GetStartPhiAngle();
139 return std::sin(phi);
141 G4double G4UCons::GetCosStartPhi()
const
143 G4double phi = GetShape()->GetStartPhiAngle();
144 return std::cos(phi);
146 G4double G4UCons::GetSinEndPhi()
const
148 G4double phi = GetShape()->GetStartPhiAngle() +
149 GetShape()->GetDeltaPhiAngle();
150 return std::sin(phi);
152 G4double G4UCons::GetCosEndPhi()
const
154 G4double phi = GetShape()->GetStartPhiAngle() +
155 GetShape()->GetDeltaPhiAngle();
156 return std::cos(phi);
159 void G4UCons::SetInnerRadiusMinusZ(
G4double Rmin1)
161 GetShape()->SetInnerRadiusMinusZ(Rmin1);
162 fRebuildPolyhedron =
true;
164 void G4UCons::SetOuterRadiusMinusZ(
G4double Rmax1)
166 GetShape()->SetOuterRadiusMinusZ(Rmax1);
167 fRebuildPolyhedron =
true;
169 void G4UCons::SetInnerRadiusPlusZ(
G4double Rmin2)
171 GetShape()->SetInnerRadiusPlusZ(Rmin2);
172 fRebuildPolyhedron =
true;
174 void G4UCons::SetOuterRadiusPlusZ(
G4double Rmax2)
176 GetShape()->SetOuterRadiusPlusZ(Rmax2);
177 fRebuildPolyhedron =
true;
179 void G4UCons::SetZHalfLength(
G4double newDz)
181 GetShape()->SetZHalfLength(newDz);
182 fRebuildPolyhedron =
true;
186 GetShape()->SetStartPhiAngle(newSPhi, trig);
187 fRebuildPolyhedron =
true;
189 void G4UCons::SetDeltaPhiAngle(
G4double newDPhi)
191 GetShape()->SetDeltaPhiAngle(newDPhi);
192 fRebuildPolyhedron =
true;
213 return new G4UCons(*
this);
222 static G4bool checkBBox =
true;
230 if (GetDeltaPhiAngle() <
twopi)
234 GetSinStartPhi(),GetCosStartPhi(),
235 GetSinEndPhi(),GetCosEndPhi(),
237 pMin.
set(vmin.
x(),vmin.
y(),-dz);
238 pMax.
set(vmax.
x(),vmax.
y(), dz);
242 pMin.
set(-rmax,-rmax,-dz);
243 pMax.
set( rmax, rmax, dz);
248 if (pMin.
x() >= pMax.
x() || pMin.
y() >= pMax.
y() || pMin.
z() >= pMax.
z())
250 std::ostringstream message;
251 message <<
"Bad bounding box (min >= max) for solid: "
253 <<
"\npMin = " << pMin
254 <<
"\npMax = " << pMax;
264 GetShape()->Extent(vmin,vmax);
272 std::ostringstream message;
273 message <<
"Inconsistency in bounding boxes for solid: "
275 <<
"\nBBox min: wrapper = " << pMin <<
" solid = " << vmin
276 <<
"\nBBox max: wrapper = " << pMax <<
" solid = " << vmax;
288 G4UCons::CalculateExtent(
const EAxis pAxis,
302 if (
true)
return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
304 if (bbox.BoundingBoxVsVoxelLimits(pAxis,pVoxelLimit,pTransform,pMin,pMax))
306 return exist = (pMin < pMax) ?
true :
false;
310 G4double rmin1 = GetInnerRadiusMinusZ();
311 G4double rmax1 = GetOuterRadiusMinusZ();
312 G4double rmin2 = GetInnerRadiusPlusZ();
313 G4double rmax2 = GetOuterRadiusPlusZ();
319 const G4int NSTEPS = 24;
324 G4double sinHalf = std::sin(0.5*ang);
325 G4double cosHalf = std::cos(0.5*ang);
326 G4double sinStep = 2.*sinHalf*cosHalf;
327 G4double cosStep = 1. - 2.*sinHalf*sinHalf;
333 if (rmin1 == 0 && rmin2 == 0 && dphi ==
twopi)
339 for (
G4int k=0; k<NSTEPS; ++k)
341 baseA[k].set(rext1*cosCur,rext1*sinCur,-dz);
342 baseB[k].set(rext2*cosCur,rext2*sinCur, dz);
345 sinCur = sinCur*cosStep + cosCur*sinStep;
346 cosCur = cosCur*cosStep - sinTmp*sinStep;
348 std::vector<const G4ThreeVectorList *> polygons(2);
349 polygons[0] = &baseA;
350 polygons[1] = &baseB;
352 exist = benv.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
356 G4double sinStart = GetSinStartPhi();
357 G4double cosStart = GetCosStartPhi();
360 G4double sinCur = sinStart*cosHalf + cosStart*sinHalf;
361 G4double cosCur = cosStart*cosHalf - sinStart*sinHalf;
365 for (
G4int k=0; k<ksteps+2; ++k) pols[k].resize(4);
366 pols[0][0].set(rmin2*cosStart,rmin2*sinStart, dz);
367 pols[0][1].set(rmin1*cosStart,rmin1*sinStart,-dz);
368 pols[0][2].set(rmax1*cosStart,rmax1*sinStart,-dz);
369 pols[0][3].set(rmax2*cosStart,rmax2*sinStart, dz);
370 for (
G4int k=1; k<ksteps+1; ++k)
372 pols[k][0].set(rmin2*cosCur,rmin2*sinCur, dz);
373 pols[k][1].set(rmin1*cosCur,rmin1*sinCur,-dz);
374 pols[k][2].set(rext1*cosCur,rext1*sinCur,-dz);
375 pols[k][3].set(rext2*cosCur,rext2*sinCur, dz);
378 sinCur = sinCur*cosStep + cosCur*sinStep;
379 cosCur = cosCur*cosStep - sinTmp*sinStep;
381 pols[ksteps+1][0].set(rmin2*cosEnd,rmin2*sinEnd, dz);
382 pols[ksteps+1][1].set(rmin1*cosEnd,rmin1*sinEnd,-dz);
383 pols[ksteps+1][2].set(rmax1*cosEnd,rmax1*sinEnd,-dz);
384 pols[ksteps+1][3].set(rmax2*cosEnd,rmax2*sinEnd, dz);
387 std::vector<const G4ThreeVectorList *> polygons;
388 polygons.resize(ksteps+2);
389 for (
G4int k=0; k<ksteps+2; ++k) polygons[k] = &pols[k];
391 exist = benv.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
403 GetOuterRadiusMinusZ(),
404 GetInnerRadiusPlusZ(),
405 GetOuterRadiusPlusZ(),
411 #endif // G4GEOM_USE_USOLIDS
void set(double x, double y, double z)
std::vector< ExP01TrackerHit * > a
static constexpr double twopi
G4GLOB_DLL std::ostream G4cout
const G4double kCarTolerance
std::vector< G4ThreeVector > G4ThreeVectorList
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
virtual void ComputeDimensions(G4Box &, const G4int, const G4VPhysicalVolume *) const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
static constexpr double deg