37 os << *(defined.first) <<
" ";
40 solid.
rep().stream(os);
42 os <<
"* solid not defined * ";
45 os <<
"* solid not declared * ";
59 std::unique_ptr<DDI::Solid> solid(
nullptr);
60 std::vector<double> dummy;
63 solid = std::make_unique<DDI::Box>(0, 0, 0);
66 solid = std::make_unique<DDI::Tubs>(0, 0, 0, 0, 0);
69 solid = std::make_unique<DDI::Cons>(0, 0, 0, 0, 0, 0, 0);
72 solid = std::make_unique<DDI::PseudoTrap>(0, 0, 0, 0, 0, 0,
false);
75 solid = std::make_unique<DDI::Shapeless>();
78 solid = std::make_unique<DDI::Trap>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
81 solid = std::make_unique<DDI::Polyhedra>(0, 0, 0, dummy, dummy);
84 solid = std::make_unique<DDI::Polyhedra>(0, 0, 0, dummy, dummy, dummy);
87 solid = std::make_unique<DDI::Polycone>(0, 0, dummy, dummy);
90 solid = std::make_unique<DDI::Polycone>(0, 0, dummy, dummy, dummy);
93 solid = std::make_unique<DDI::TruncTubs>(0, 0, 0, 0, 0, 0, 0,
false);
96 solid = std::make_unique<DDI::Torus>(0, 0, 0, 0, 0);
99 solid = std::make_unique<DDI::Sphere>(0, 0, 0, 0, 0, 0);
102 solid = std::make_unique<DDI::EllipticalTube>(0, 0, 0);
105 solid = std::make_unique<DDI::CutTubs>(0., 0., 0., 0., 0., 0., 0., 1., 0., 0., -1.);
108 solid = std::make_unique<DDI::ExtrudedPolygon>(dummy, dummy, dummy, dummy, dummy, dummy);
111 solid = std::make_unique<DDI::Assembly>();
115 <<
"DDSolid::DDSolid( DDName, DDSolidShape, std::vector<double> ): wrong shape.";
117 solid->setParameters(pars);
130 ex = ex +
"Use a different solid interface!";
161 ex = ex +
"Use a different solid interface!";
185 ex = ex +
"Use a different solid interface!";
207 ex = ex +
"Use a different solid interface!";
221 ex = ex +
"Use a different solid interface!";
229 ex = ex +
"Use a different solid interface!";
237 ex = ex +
"Use a different solid interface!";
245 ex = ex +
"Use a different solid interface!";
256 edm::LogError(
"DDSolid") <<
"Could not find equal sized components of std::vectors in a PolySolid description."
257 <<
"rep().parameters().size()=" <<
rep().parameters().size() <<
" numVecs=" << numVecs
258 <<
" offset=" << offset << std::endl;
260 std::vector<double> tvec;
261 for (
size_t i = offset + which;
i <
rep().parameters().size();
i =
i + numVecs) {
270 ex = ex +
"Use a different solid interface!";
280 std::vector<double> tvec;
294 std::vector<double> tvec;
301 std::vector<double> tvec;
310 ex = ex +
"Use a different solid interface!";
322 std::vector<double> tvec;
336 std::vector<double> tvec;
343 std::vector<double> tvec;
352 ex = ex +
"Use a different solid interface!";
375 return rep().parameters()[0];
379 return std::vector<double>(
rep().parameters().begin() + 1,
rep().parameters().begin() + 1 +
xyPointsSize());
383 return std::vector<double>(
rep().parameters().begin() + 1 +
xyPointsSize(),
403 return std::vector<double>(
rep().parameters().end() -
zSectionsSize(),
rep().parameters().end());
409 ex = ex +
"Use a different solid interface!";
431 ex = ex +
"Use a different solid interface!";
449 ex = ex +
"Use a different solid interface!";
477 ex = ex +
"Use a different solid interface!";
497 ex = ex +
"Use a different solid interface!";
511 ex = ex +
"Use a different solid interface!";
527 return std::array<double, 3>{{
rep().parameters()[5],
rep().parameters()[6],
rep().parameters()[7]}};
531 return std::array<double, 3>{{
rep().parameters()[8],
rep().parameters()[9],
rep().parameters()[10]}};
537 ex = ex +
"Use a different solid interface!";
548 return DDSolid(name, std::make_unique<DDI::Box>(xHalf, yHalf, zHalf));
554 const std::vector<double>&
z,
555 const std::vector<double>& rmin,
556 const std::vector<double>& rmax) {
557 return DDSolid(name, std::make_unique<DDI::Polycone>(startPhi, deltaPhi, z, rmin, rmax));
561 const DDName&
name,
double startPhi,
double deltaPhi,
const std::vector<double>&
z,
const std::vector<double>&
r) {
562 return DDSolid(name, std::make_unique<DDI::Polycone>(startPhi, deltaPhi, z, r));
569 const std::vector<double>&
z,
570 const std::vector<double>& rmin,
571 const std::vector<double>& rmax) {
572 return DDSolid(name, std::make_unique<DDI::Polyhedra>(sides, startPhi, deltaPhi, z, rmin, rmax));
579 const std::vector<double>&
z,
580 const std::vector<double>&
r) {
581 return DDSolid(name, std::make_unique<DDI::Polyhedra>(sides, startPhi, deltaPhi, z, r));
585 const std::vector<double>&
x,
586 const std::vector<double>&
y,
587 const std::vector<double>&
z,
588 const std::vector<double>& zx,
589 const std::vector<double>& zy,
590 const std::vector<double>& zscale) {
591 return DDSolid(name, std::make_unique<DDI::ExtrudedPolygon>(x, y, z, zx, zy, zscale));
596 return DDSolid(name, std::make_unique<DDI::Union>(a, b, t, r));
601 return DDSolid(name, std::make_unique<DDI::Subtraction>(a, b, t, r));
606 return DDSolid(name, std::make_unique<DDI::Intersection>(a, b, t, r));
622 std::make_unique<DDI::Trap>(pDz, pTheta, pPhi, pDy1, pDx1, pDx2, pAlp1, pDy2, pDx3, pDx4, pAlp2));
634 return DDSolid(name, std::make_unique<DDI::PseudoTrap>(pDx1, pDx2, pDy1, pDy2, pDz, radius, atMinusZ));
647 name, std::make_unique<DDI::TruncTubs>(zHalf, rIn, rOut, startPhi, deltaPhi, cutAtStart, cutAtDelta, cutInside));
659 std::make_unique<DDI::Cons>(zhalf, rInMinusZ, rOutMinusZ, rInPlusZ, rOutPlusZ, phiFrom, deltaPhi));
663 const DDName&
name,
double rMin,
double rMax,
double rTorus,
double startPhi,
double deltaPhi) {
664 return DDSolid(name, std::make_unique<DDI::Torus>(rMin, rMax, rTorus, startPhi, deltaPhi));
668 const DDName&
name,
double zhalf,
double rIn,
double rOut,
double phiFrom,
double deltaPhi) {
669 return DDSolid(name, std::make_unique<DDI::Tubs>(zhalf, rIn, rOut, phiFrom, deltaPhi));
684 return DDSolid(name, std::make_unique<DDI::CutTubs>(zhalf, rIn, rOut, phiFrom, deltaPhi, lx, ly, lz, tx, ty, tz));
695 std::make_unique<DDI::Sphere>(innerRadius, outerRadius, startPhi, deltaPhi, startTheta, deltaTheta));
699 return DDSolid(name, std::make_unique<DDI::EllipticalTube>(xSemiAxis, ySemiAxis, zHeight));
DDPseudoTrap(void)=delete
DDExtrudedPolygon(void)=delete
static DDSolid torus(const DDName &name, double rMin, double rMax, double rTorus, double startPhi, double deltaPhi)
double startPhi(void) const
double cutAtStart(void) const
truncation at begin of the tube-section
const std::vector< double > & parameters(void) const
Give the parameters of the solid.
double halfZ(void) const
half of the z-Axis
def_type isDefined() const
bool cutInside(void) const
true, if truncation is on the inner side of the tube-section
std::vector< double > rVec(void) const
double x1(void) const
Half-length along x of the side at y=-pDy1 of the face at -pDz.
double zHalf(void) const
half of the z-Axis
const DDTranslation & t() const
double y2(void) const
half length along y on +z
double startTheta(void) const
std::vector< double > rMaxVec(void) const
double deltaPhi(void) const
angular span of the tube-section
static DDSolid pseudoTrap(const DDName &name, double pDx1, double pDx2, double pDy1, double pDy2, double pDz, double radius, bool atMinusZ)
double deltaPhi(void) const
std::vector< double > rMaxVec(void) const
Abstract class for DDPolycone and DDPolyhedra. Basically a common member function.
double phi(void) const
Azimuthal angle of the line joining the centres of the faces at -/+pDz.
virtual std::vector< double > getVec(const size_t &which, const size_t &offset=0, const size_t &nVecs=1) const
note defaults please.
static DDSolid cons(const DDName &name, double zhalf, double rInMinusZ, double rOutMinusZ, double rInPlusZ, double rOutPlusZ, double phiFrom, double deltaPhi)
std::array< double, 3 > highNorm(void) const
static DDSolid polycone(const DDName &name, double startPhi, double deltaPhi, const std::vector< double > &z, const std::vector< double > &rmin, const std::vector< double > &rmax)
Creates a polycone (refere to Geant3 or Geant4 documentation)
double rTorus(void) const
std::vector< double > rVec(void) const
double cutAtDelta(void) const
truncation at end of the tube-section
std::vector< double > yVec(void) const
double phiFrom(void) const
auto xyPointsSize(void) const -> std::size_t
const DDI::rep_traits< N, C >::reference rep() const
const std::string & ns() const
Returns the namespace.
DDName is used to identify DDD entities uniquely.
double rIn(void) const
inner radius
const DDSolid & a() const
double rOutMinusZ(void) const
double rOutPlusZ(void) const
std::vector< double > zyVec(void) const
const DDRotation & r() const
DDTranslation translation(void) const
Log< level::Error, false > LogError
std::ostream & operator<<(std::ostream &out, const ALILine &li)
std::unique_ptr< T, impl::DeviceDeleter > unique_ptr
DDIntersection(void)=delete
double innerRadius(void) const
const DDI::BooleanSolid & boolean_
A DDSolid represents the shape of a part.
double y1(void) const
half length along y on -z
DDSolid solidB(void) const
Represents a uniquely identifyable rotation matrix.
std::vector< double > xVec(void) const
static DDSolid cuttubs(const DDName &name, double zhalf, double rIn, double rOut, double startPhi, double deltaPhi, double lx, double ly, double lz, double tx, double ty, double tz)
std::array< double, 3 > lowNorm(void) const
double outerRadius(void) const
static const char *const name(DDSolidShape s)
double x4(void) const
Half-length along x of the side at y=+pDy2 of the face at +pDz.
static DDSolid intersection(const DDName &name, const DDSolid &a, const DDSolid &b, const DDTranslation &t, const DDRotation &r)
DDRotation rotation(void) const
bool atMinusZ(void) const
true, if cut-out or rounding is on the -z side
double halfZ(void) const
half of the z-Axis
std::vector< double > rMinVec(void) const
double startPhi(void) const
double startPhi(void) const
double xSemiAxis(void) const
static DDSolid sphere(const DDName &name, double innerRadius, double outerRadius, double startPhi, double deltaPhi, double startTheta, double deltaTheta)
const DDSolid & b() const
double deltaPhi(void) const
double startPhi(void) const
double y1(void) const
Half-length along y of the face at -pDz.
double rInMinusZ(void) const
static DDSolid assembly(const DDName &name)
Creates an assembly.
uint16_t const *__restrict__ x
DDSolidShape shape(void) const
The type of the solid.
double deltaTheta(void) const
static DDSolid tubs(const DDName &name, double zhalf, double rIn, double rOut, double startPhi, double deltaPhi)
double ySemiAxis(void) const
static DDSolid truncTubs(const DDName &name, double zHalf, double rIn, double rOut, double startPhi, double deltaPhi, double cutAtStart, double cutAtDelta, bool cutInside)
static DDSolid trap(const DDName &name, double pDz, double pTheta, double pPhi, double pDy1, double pDx1, double pDx2, double pAlp1, double pDy2, double pDx3, double pDx4, double pAlp2)
static DDSolid box(const DDName &name, double xHalf, double yHalf, double zHalf)
Creates a box with side length 2*xHalf, 2*yHalf, 2*zHalf.
std::vector< double > rMinVec(void) const
double deltaPhi(void) const
DDSolid solidA(void) const
double deltaPhi(void) const
double deltaPhi(void) const
double startPhi(void) const
std::vector< double > zVec(void) const
std::vector< double > zxVec(void) const
static DDSolid ellipticalTube(const DDName &name, double xSemiAxis, double ySemiAxis, double zHeight)
std::vector< double > zVec(void) const
double deltaPhi(void) const
static DDSolid extrudedpolygon(const DDName &name, const std::vector< double > &x, const std::vector< double > &y, const std::vector< double > &z, const std::vector< double > &zx, const std::vector< double > &zy, const std::vector< double > &zscale)
static DDSolid subtraction(const DDName &name, const DDSolid &a, const DDSolid &b, const DDTranslation &t, const DDRotation &r)
double alpha1(void) const
Angle with respect to the y axis from the centre of the side at y=-pDy1 to the centre at y=+pDy1 of t...
double alpha2(void) const
Angle with respect to the y axis from the centre of the side at y=-pDy2 to the centre at y=+pDy2 of t...
double startPhi(void) const
angular start of the tube-section
auto zSectionsSize(void) const -> std::size_t
double x2(void) const
Half-length along x of the side at y=+pDy1 of the face at -pDz.
static DDSolid shapeless(const DDName &name)
DDEllipticalTube(void)=delete
DDShapelessSolid(void)=delete
double zHeight(void) const
double deltaPhi(void) const
double y2(void) const
Half-length along y of the face at +pDz.
std::pair< const N *, bool > def_type
DDBooleanSolid(void)=delete
DDSubtraction(void)=delete
double rInPlusZ(void) const
DDSolid(void)
Uninitialilzed solid reference-object; for further details on reference-objects see documentation of ...
static DDSolid unionSolid(const DDName &name, const DDSolid &a, const DDSolid &b, const DDTranslation &t, const DDRotation &r)
double x2(void) const
half length along x on +z
double rOut(void) const
outer radius
double theta(void) const
Polar angle of the line joining the centres of the faces at -/+pDz.
std::vector< double > zscaleVec(void) const
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
const std::string & name() const
Returns the name.
static DDSolid polyhedra(const DDName &name, int sides, double startPhi, double deltaPhi, const std::vector< double > &z, const std::vector< double > &rmin, const std::vector< double > &rmax)
Creates a polyhedra (refere to Geant3 or Geant4 documentation)
tuple size
Write out results.
double x3(void) const
Half-length along x of the side at y=-pDy2 of the face at +pDz.
double volume(void) const
Returns the volume of the given solid (does not work with boolean soids !)
std::vector< double > zVec(void) const
double x1(void) const
half length along x on -z
double startPhi(void) const
double radius(void) const
radius of the cut-out (neg.) or rounding (pos.)
void create(const DDName &name, std::unique_ptr< DDI::Solid >vals)