19#include "BDSExtent.hh"
20#include "BDSGeometryInspector.hh"
21#include "BDSGlobalConstants.hh"
24#include "G4AffineTransform.hh"
26#include "G4CutTubs.hh"
27#include "G4DisplacedSolid.hh"
28#include "G4EllipticalTube.hh"
29#include "G4IntersectionSolid.hh"
30#include "G4SubtractionSolid.hh"
32#include "G4UnionSolid.hh"
33#include "G4Version.hh"
39#if G4VERSION_NUMBER < 1030
40#include "G4VisExtent.hh"
47 G4String className = solid->GetEntityType();
48 if (className ==
"G4DisplacedSolid")
50 else if (className ==
"G4SubtractionSolid")
52 else if (className ==
"G4IntersectionSolid")
54 else if (className ==
"G4UnionSolid")
56 else if (className ==
"G4Box")
58 else if (className ==
"G4Tubs")
60 else if (className ==
"G4CutTubs")
62 else if (className ==
"G4EllipticalTube")
66 G4ThreeVector low, high;
67 solid->BoundingLimits(low, high);
70 std::max(std::abs(low.y()), std::abs(high.y())),
71 std::max(std::abs(low.z()), std::abs(high.z())));
73 return std::make_pair(outer, inner);
79 const G4DisplacedSolid* solid =
dynamic_cast<const G4DisplacedSolid*
>(solidIn);
83 const G4VSolid* constituentSolid = solid->GetConstituentMovedSolid();
86 G4AffineTransform transform = solid->GetTransform();
89 G4ThreeVector translation = transform.NetTranslation();
93 return std::make_pair(outer, inner);
98 const G4SubtractionSolid* solid =
dynamic_cast<const G4SubtractionSolid*
>(solidIn);
102 const G4VSolid* a = solid->GetConstituentSolid(0);
103 const G4VSolid* b = solid->GetConstituentSolid(1);
114 return std::make_pair(outer, inner);
119 const G4IntersectionSolid* solid =
dynamic_cast<const G4IntersectionSolid*
>(solidIn);
123 const G4VSolid* a = solid->GetConstituentSolid(0);
124 const G4VSolid* b = solid->GetConstituentSolid(1);
132 return std::make_pair(outer, inner);
137 const G4UnionSolid* solid =
dynamic_cast<const G4UnionSolid*
>(solidIn);
141 const G4VSolid* a = solid->GetConstituentSolid(0);
142 const G4VSolid* b = solid->GetConstituentSolid(1);
150 return std::make_pair(outer, inner);
155 const G4Box* solid =
dynamic_cast<const G4Box*
>(solidIn);
159 G4double dx = solid->GetXHalfLength();
160 G4double dy = solid->GetYHalfLength();
161 G4double dz = solid->GetZHalfLength();
167 return std::make_pair(outer, inner);
172 const G4Tubs* solid =
dynamic_cast<const G4Tubs*
>(solidIn);
176 G4double innerR = solid->GetInnerRadius();
177 G4double outerR = solid->GetOuterRadius();
178 G4double zHalfL = solid->GetZHalfLength();
181 BDSExtent outer(outerR + lsl, outerR + lsl, zHalfL);
183 return std::make_pair(outer, inner);
188 G4ThreeVector zminV = G4ThreeVector();
189 G4ThreeVector zmaxV = G4ThreeVector();
190#if G4VERSION_NUMBER > 1039
191 solidIn->BoundingLimits(zminV, zmaxV);
192#elif G4VERSION_NUMBER > 1029
193 solidIn->Extent(zminV, zmaxV);
195 G4VisExtent v = solidIn->GetExtent();
196 zmaxV = G4ThreeVector(std::max(std::abs(v.GetXmin()),std::abs(v.GetXmax())),
197 std::max(std::abs(v.GetYmin()),std::abs(v.GetYmax())),
198 std::max(std::abs(v.GetZmin()),std::abs(v.GetZmax())));
201 const G4CutTubs* solid =
dynamic_cast<const G4CutTubs*
>(solidIn);
205 G4double innerR = solid->GetInnerRadius();
206 G4double outerR = solid->GetOuterRadius();
212 -zmaxV.z(), zmaxV.z());
215 -zmaxV.z(), zmaxV.z());
216 return std::make_pair(outer, inner);
221 const G4EllipticalTube* solid =
dynamic_cast<const G4EllipticalTube*
>(solidIn);
225 G4double dX = solid->GetDx();
226 G4double dY = solid->GetDy();
227 G4double dZ = solid->GetDz();
232 return std::make_pair(outer, inner);
Holder for +- extents in 3 dimensions.
BDSExtent Translate(const G4ThreeVector &offset) const
Provide a new copy of this extent with an offset applied.
G4bool TransverselyLessThan(const BDSExtent &r) const
Comparison operator for x,y only. Ignores z (length).
static BDSGlobalConstants * Instance()
Access method.
std::pair< BDSExtent, BDSExtent > InspectIntersectionSolid(const G4VSolid *solidIn)
Inspect a G4IntersectionSolid.
std::pair< BDSExtent, BDSExtent > InspectEllipticalTube(const G4VSolid *solidIn)
Inspect a G4EllipticalTube.
std::pair< BDSExtent, BDSExtent > InspectCutTubs(const G4VSolid *solidIn)
Inspect a G4CutTubs.
std::pair< BDSExtent, BDSExtent > InspectSubtractionSolid(const G4VSolid *solidIn)
std::pair< BDSExtent, BDSExtent > DetermineExtents(const G4VSolid *solid)
std::pair< BDSExtent, BDSExtent > InspectBox(const G4VSolid *solidIn)
Inspect a G4Box.
std::pair< BDSExtent, BDSExtent > InspectTubs(const G4VSolid *solidIn)
Inspect a G4Tubs.
std::pair< BDSExtent, BDSExtent > InspectDisplacedSolid(const G4VSolid *solidIn)
Inspect a G4DisplacedSolid.
std::pair< BDSExtent, BDSExtent > InspectUnionSolid(const G4VSolid *solidIn)
Inspect a G4UnionSolid.