File indexing completed on 2026-04-17 08:35:33
0001 #ifndef VECGEOM_SURFACE_TRAPEZOIDCONVERTER_H_
0002 #define VECGEOM_SURFACE_TRAPEZOIDCONVERTER_H_
0003
0004 #include <VecGeom/surfaces/conv/Builder.h>
0005 #include <VecGeom/surfaces/Model.h>
0006
0007 #include <VecGeom/volumes/Trapezoid.h>
0008
0009 namespace vgbrep {
0010 namespace conv {
0011
0012
0013
0014
0015
0016
0017 template <typename Real_t>
0018 bool CreateTrapezoidSurfaces(vecgeom::UnplacedTrapezoid const &trap, int logical_id, bool intersection = false)
0019 {
0020 using Vector3D = vecgeom::Vector3D<vecgeom::Precision>;
0021
0022 auto dx1 = trap.GetDx1();
0023 auto dx2 = trap.GetDx2();
0024 auto dy1 = trap.GetDy1();
0025 auto dx3 = trap.GetDx3();
0026 auto dx4 = trap.GetDx4();
0027 auto dy2 = trap.GetDy2();
0028 auto dz = trap.GetDz();
0029
0030 auto txy = trap.GetTanAlpha1();
0031 auto txz = trap.GetTanThetaCosPhi();
0032 auto tyz = trap.GetTanThetaSinPhi();
0033
0034 int isurf;
0035 LogicExpressionCPU logic;
0036 vecgeom::Transformation3D transformation;
0037 std::vector<Vector3D>
0038 vert;
0039
0040
0041 std::vector<Vector3D> corners = {
0042 {-dx1 - dy1 * txy - dz * txz, -dy1 - dz * tyz, -dz}, {dx1 - dy1 * txy - dz * txz, -dy1 - dz * tyz, -dz},
0043 {+dx2 + dy1 * txy - dz * txz, +dy1 - dz * tyz, -dz}, {-dx2 + dy1 * txy - dz * txz, +dy1 - dz * tyz, -dz},
0044 {-dx3 - dy2 * txy + dz * txz, -dy2 + dz * tyz, +dz}, {dx3 - dy2 * txy + dz * txz, -dy2 + dz * tyz, +dz},
0045 {+dx4 + dy2 * txy + dz * txz, +dy2 + dz * tyz, +dz}, {-dx4 + dy2 * txy + dz * txz, +dy2 + dz * tyz, +dz}};
0046
0047
0048 vert = {corners[0], corners[1], corners[5], corners[4]};
0049 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0050 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0051 if (isurf >= 0) logic.push_back(isurf);
0052
0053
0054 vert = {corners[2], corners[3], corners[7], corners[6]};
0055 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0056 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0057 if (isurf >= 0) {
0058 logic.push_back(land);
0059 logic.push_back(isurf);
0060 }
0061
0062
0063 vert = {corners[3], corners[0], corners[4], corners[7]};
0064 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0065 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0066 if (isurf >= 0) {
0067 logic.push_back(land);
0068 logic.push_back(isurf);
0069 }
0070
0071
0072 vert = {corners[1], corners[2], corners[6], corners[5]};
0073 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0074 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0075 if (isurf >= 0) {
0076 logic.push_back(land);
0077 logic.push_back(isurf);
0078 }
0079
0080
0081 vert = {corners[0], corners[3], corners[2], corners[1]};
0082 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0083 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0084 if (isurf >= 0) {
0085 logic.push_back(land);
0086 logic.push_back(isurf);
0087 }
0088
0089
0090 vert = {corners[4], corners[5], corners[6], corners[7]};
0091 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0092 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0093 if (isurf >= 0) {
0094 logic.push_back(land);
0095 logic.push_back(isurf);
0096 }
0097 builder::AddLogicToShell<Real_t>(logical_id, logic);
0098 return true;
0099 }
0100
0101 }
0102 }
0103 #endif