19#include "VecGeom/volumes/PlacedVolume.h"
20#include "VecGeom/volumes/UnplacedVolume.h"
21#include "VecGeom/volumes/UnplacedBox.h"
22#include "VecGeom/volumes/UnplacedTube.h"
23#include "VecGeom/volumes/UnplacedCone.h"
24#include "VecGeom/volumes/UnplacedParaboloid.h"
25#include "VecGeom/volumes/UnplacedParallelepiped.h"
26#include "VecGeom/volumes/UnplacedPolyhedron.h"
27#include "VecGeom/volumes/UnplacedTrd.h"
28#include "VecGeom/volumes/UnplacedOrb.h"
29#include "VecGeom/volumes/UnplacedSphere.h"
30#include "VecGeom/volumes/UnplacedBooleanVolume.h"
31#include "VecGeom/volumes/UnplacedTorus2.h"
32#include "VecGeom/volumes/UnplacedTrapezoid.h"
33#include "VecGeom/volumes/UnplacedPolycone.h"
34#include "VecGeom/volumes/UnplacedScaledShape.h"
35#include "VecGeom/volumes/UnplacedGenTrap.h"
36#include "VecGeom/volumes/UnplacedSExtruVolume.h"
37#include "VecGeom/volumes/UnplacedTessellated.h"
38#include "VecGeom/volumes/UnplacedEllipticalTube.h"
39#include "VecGeom/volumes/UnplacedHype.h"
40#include "VecGeom/volumes/UnplacedCutTube.h"
108 vecgeom::cxx::VUnplacedVolume *unplaced =
Convert(shape);
113 vecgeom::cxx::LogicalVolume *lvol =
new vecgeom::cxx::LogicalVolume(
"", unplaced);
114 return (lvol->Place());
124 vecgeom::cxx::Transformation3D *
const transformation =
125 new vecgeom::cxx::Transformation3D(t[0], t[1], t[2],
r[0],
r[1],
r[2],
r[3],
r[4],
r[5],
r[6],
r[7],
r[8]);
126 return transformation;
135 using Vector3D = vecgeom::cxx::Vector3D<Precision>;
136 VUnplacedVolume *unplaced_volume =
nullptr;
141 if ((
box->GetOrigin()[0] != 0.0) || (
box->GetOrigin()[1] != 0.0) || (
box->GetOrigin()[2] != 0.0)) {
143 printf(
"Unsupported box shape with shifted origin\n");
145 unplaced_volume = GeoManager::MakeInstance<UnplacedBox>(
box->GetDX(),
box->GetDY(),
box->GetDZ());
153 GeoManager::MakeInstance<UnplacedTube>(tube->
GetRmin(), tube->
GetRmax(), tube->
GetDz(), 0., kTwoPi);
159 unplaced_volume = GeoManager::MakeInstance<UnplacedTube>(tube->
GetRmin(), tube->
GetRmax(), tube->
GetDz(),
167 unplaced_volume = GeoManager::MakeInstance<UnplacedCone>(
182 unplaced_volume = GeoManager::MakeInstance<UnplacedParaboloid>(p->
GetRlo(), p->
GetRhi(), p->
GetDz());
188 unplaced_volume = GeoManager::MakeInstance<UnplacedParallelepiped>(p->
GetX(), p->
GetY(), p->
GetZ(), p->
GetAlpha(),
195 unplaced_volume = GeoManager::MakeInstance<UnplacedPolyhedron>(pgon->
GetPhi1(),
215 unplaced_volume = GeoManager::MakeInstance<UnplacedTrd>(p->
GetDx1(), p->
GetDx2(), p->
GetDy(), p->
GetDz());
221 unplaced_volume = GeoManager::MakeInstance<UnplacedTrapezoid>(
232 unplaced_volume = GeoManager::MakeInstance<UnplacedOrb>(p->
GetRmax());
234 unplaced_volume = GeoManager::MakeInstance<UnplacedSphere>(
250 if (!leftunplaced || !rightunplaced) {
255 delete rightunplaced;
259 assert(leftunplaced !=
nullptr);
260 assert(rightunplaced !=
nullptr);
263 VPlacedVolume *
const leftplaced = (
new LogicalVolume(
"inner_virtual", leftunplaced))->Place(lefttrans);
265 VPlacedVolume *
const rightplaced = (
new LogicalVolume(
"inner_virtual", rightunplaced))->Place(righttrans);
270 GeoManager::MakeInstance<UnplacedBooleanVolume<kSubtraction>>(kSubtraction, leftplaced, rightplaced);
273 GeoManager::MakeInstance<UnplacedBooleanVolume<kIntersection>>(kIntersection, leftplaced, rightplaced);
275 unplaced_volume = GeoManager::MakeInstance<UnplacedBooleanVolume<kUnion>>(kUnion, leftplaced, rightplaced);
283 unplaced_volume = GeoManager::MakeInstance<UnplacedTorus2>(p->
GetRmin(), p->
GetRmax(), p->
GetR(),
290 unplaced_volume = GeoManager::MakeInstance<UnplacedPolycone>(p->
GetPhi1() * kDegToRad, p->
GetDphi() * kDegToRad,
299 if (!referenced_shape)
303 GeoManager::MakeInstance<UnplacedScaledShape>(referenced_shape, scale_root[0], scale_root[1], scale_root[2]);
311 auto const bottomNormal = Vector3D{low[0], low[1], low[2]};
312 auto const topNormal = Vector3D{high[0], high[1], high[2]};
316 kDegToRad * (p->
GetPhi2() - p->
GetPhi1()), bottomNormal, topNormal);
322 unplaced_volume = GeoManager::MakeInstance<UnplacedEllipticalTube>(p->
GetA(), p->
GetB(), p->
GetDz());
328 unplaced_volume = GeoManager::MakeInstance<UnplacedHype>(p->
GetRmin(), p->
GetRmax(), kDegToRad * p->
GetStIn(),
337 Precision verticesx[8], verticesy[8];
338 for (
auto ivert = 0; ivert < 8; ++ivert) {
339 verticesx[ivert] = vertices[2 * ivert];
340 verticesy[ivert] = vertices[2 * ivert + 1];
342 unplaced_volume = GeoManager::MakeInstance<UnplacedGenTrap>(verticesx, verticesy, p->
GetDz());
349 if (p->
GetNz() == 2) {
351 size_t Nvert = (size_t)p->
GetNvert();
352 double *
x =
new double[Nvert];
353 double *
y =
new double[Nvert];
354 for (
size_t i = 0; i < Nvert; ++i) {
359 if (PlanarPolygon::GetOrientation(
x,
y, Nvert) > 0.) {
361 for (
size_t i = 0; i < Nvert; ++i) {
362 x[Nvert - 1 - i] = p->
GetX(i);
363 y[Nvert - 1 - i] = p->
GetY(i);
367 GeoManager::MakeInstance<UnplacedSExtruVolume>(p->
GetNvert(),
x,
y, p->
GetZ()[0], p->
GetZ()[1]);
376 unplaced_volume = GeoManager::MakeInstance<UnplacedTessellated>();
377 auto vtsl =
static_cast<UnplacedTessellated *
>(unplaced_volume);
379 for (
auto i = 0; i < tsl->
GetNfacets(); ++i) {
380 auto const &facet = tsl->
GetFacet(i);
386 vtsl->AddTriangularFacet(Vector3D(
v0[0],
v0[1],
v0[2]), Vector3D(
v1[0],
v1[1],
v1[2]),
387 Vector3D(
v2[0],
v2[1],
v2[2]));
388 }
else if (nvert == 4) {
390 vtsl->AddQuadrilateralFacet(Vector3D(
v0[0],
v0[1],
v0[2]), Vector3D(
v1[0],
v1[1],
v1[2]),
391 Vector3D(
v2[0],
v2[1],
v2[2]), Vector3D(
v3[0],
v3[1],
v3[2]));
406 if (!unplaced_volume) {
407 printf(
"Unsupported shape for ROOT shape \"%s\" of type %s. "
408 "Using ROOT implementation.\n",
413 return (unplaced_volume);
437 vecgeom::cxx::Vector3D<Double_t> vnorm;
438 fVGShape->Normal(vecgeom::cxx::Vector3D<Double_t>(point[0], point[1], point[2]), vnorm);
440 norm[1] = vnorm.y(), norm[2] = vnorm.z();
448 return (
fVGShape->Contains(vecgeom::cxx::Vector3D<Double_t>(point[0], point[1], point[2])));
456 Double_t dist =
fVGShape->DistanceToOut(vecgeom::cxx::Vector3D<Double_t>(point[0], point[1], point[2]),
457 vecgeom::cxx::Vector3D<Double_t>(dir[0], dir[1], dir[2]), step);
458 return ((dist < 0.) ? 0. : dist);
466 Double_t dist =
fVGShape->DistanceToIn(vecgeom::cxx::Vector3D<Double_t>(point[0], point[1], point[2]),
467 vecgeom::cxx::Vector3D<Double_t>(dir[0], dir[1], dir[2]), step);
468 return ((dist < 0.) ? 0. : dist);
475 Double_t safety = (in) ?
fVGShape->SafetyToOut(vecgeom::cxx::Vector3D<Double_t>(point[0], point[1], point[2]))
476 :
fVGShape->SafetyToIn(vecgeom::cxx::Vector3D<Double_t>(point[0], point[1], point[2]));
477 return ((safety < 0.) ? 0. : safety);
485 fVGShape->GetUnplacedVolume()->Print();
498 "This geometry contains solids converted to VecGeom and needs a VecGeom-enabled ROOT to read.");
int Int_t
Signed integer 4 bytes (int).
bool Bool_t
Boolean (0=false, 1=true) (bool).
double Double_t
Double 8 bytes.
Buffer base class used for serializing objects.
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=nullptr)=0
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
void SetBoxDimensions(Double_t dx, Double_t dy, Double_t dz, Double_t *origin=nullptr)
TGeoBBox(const TGeoBBox &)=delete
Base class for Boolean operations between two shapes.
virtual EGeoBoolType GetBooleanOperator() const =0
TGeoMatrix * GetRightMatrix() const
TGeoShape * GetLeftShape() const
TGeoMatrix * GetLeftMatrix() const
TGeoShape * GetRightShape() const
Composite shapes are Boolean combinations of two or more shape components.
TGeoBoolNode * GetBoolNode() const
virtual Double_t GetRmax2() const
virtual Double_t GetDz() const
virtual Double_t GetRmin2() const
virtual Double_t GetRmin1() const
virtual Double_t GetRmax1() const
const Double_t * GetNlow() const
const Double_t * GetNhigh() const
virtual Double_t GetA() const
virtual Double_t GetB() const
Double_t GetStOut() const
Geometrical transformation package.
virtual const Double_t * GetTranslation() const =0
virtual const Double_t * GetRotationMatrix() const =0
Double_t GetAlpha() const
Double_t GetTheta() const
A paraboloid is defined by the revolution surface generated by a parabola and is bounded by two plane...
Double_t * GetRmax() const
Double_t * GetRmin() const
const Double_t * GetScale() const override
A shape scaled by a TGeoScale transformation.
TGeoShape * GetShape() const
TGeoScale * GetScale() const
TGeoShape()
Default constructor.
const char * GetName() const override
Get the shape name.
TClass * IsA() const override
virtual Double_t GetRmin() const
Double_t GetTheta2() const
virtual Double_t GetRmax() const
Double_t GetTheta1() const
const TGeoFacet & GetFacet(int i) const
const Vertex_t & GetVertex(int i) const
Double_t GetAlpha2() const
Double_t GetTheta() const
Double_t GetAlpha1() const
virtual Double_t GetRmin() const
virtual Double_t GetDz() const
virtual Double_t GetRmax() const
~TGeoVGShape() override
Destructor.
static vecgeom::cxx::VPlacedVolume * CreateVecGeomSolid(TGeoShape *shape)
Conversion method to create VecGeom solid corresponding to TGeoShape.
static TGeoVGShape * Create(TGeoShape *shape)
Factory creating TGeoVGShape from a Root shape.
Bool_t Contains(const Double_t *point) const override
Test if point is inside this shape.
Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const override
Double_t Capacity() const override
Returns analytic capacity of the solid.
TGeoVGShape(TGeoShape *shape, vecgeom::cxx::VPlacedVolume *vgshape)
Default constructor.
vecgeom::cxx::VPlacedVolume * fVGShape
! VecGeom placed solid
void ComputeBBox() override
Compute bounding box.
const char * GetName() const override
Get the shape name.
Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
void InspectShape() const override
Print info about the VecGeom solid.
static vecgeom::cxx::Transformation3D * Convert(TGeoMatrix const *const geomatrix)
Convert a TGeoMatrix to a TRansformation3D.
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) const override
Normal computation.
A TGeoXtru shape is represented by the extrusion of an arbitrary polygon with fixed outline between s...
Double_t GetY(Int_t i) const
Double_t GetX(Int_t i) const
void Streamer(TBuffer &) override
Stream an object of class TObject.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
static TVirtualGeoConverter * Instance(TGeoManager *geom=nullptr)
Static function returning a pointer to the current geometry converter.
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)