File indexing completed on 2026-04-17 08:35:33
0001 #ifndef VECGEOM_SURFACE_TRDCONVERTER_H_
0002 #define VECGEOM_SURFACE_TRDCONVERTER_H_
0003
0004 #include <VecGeom/surfaces/conv/Builder.h>
0005 #include <VecGeom/surfaces/Model.h>
0006
0007 #include <VecGeom/volumes/Trd.h>
0008
0009 namespace vgbrep {
0010 namespace conv {
0011
0012
0013
0014
0015
0016
0017 template <typename Real_t>
0018 bool CreateTrdSurfaces(vecgeom::UnplacedTrd const &trd, int logical_id, bool intersection = false)
0019 {
0020 using Vector3 = vecgeom::Vector3D<vecgeom::Precision>;
0021 int isurf;
0022 LogicExpressionCPU logic;
0023
0024 auto dx1 = trd.dx1();
0025 auto dx2 = trd.dx2();
0026 auto dy1 = trd.dy1();
0027 auto dy2 = trd.dy2();
0028 auto dz = trd.dz();
0029
0030
0031 std::vector<Vector3> corners = {{-dx1, -dy1, -dz}, {dx1, -dy1, -dz}, {dx1, dy1, -dz}, {-dx1, dy1, -dz},
0032 {-dx2, -dy2, dz}, {dx2, -dy2, dz}, {dx2, dy2, dz}, {-dx2, dy2, dz}};
0033 auto assertWindow = [](int isurf) {
0034 VECGEOM_ASSERT(isurf >= 0 &&
0035 CPUsurfData<Real_t>::Instance().fLocalSurfaces[isurf].fFrame.type == FrameType::kWindow);
0036 };
0037 std::vector<Vector3> vert;
0038
0039 vert = {corners[3], corners[0], corners[4], corners[7]};
0040 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0041 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0042 logic.push_back(isurf);
0043
0044 vert = {corners[1], corners[2], corners[6], corners[5]};
0045 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0046 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0047 logic.push_back(land);
0048 logic.push_back(isurf);
0049
0050 vert = {corners[0], corners[1], corners[5], corners[4]};
0051 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0052 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0053 logic.push_back(land);
0054 logic.push_back(isurf);
0055
0056 vert = {corners[2], corners[3], corners[7], corners[6]};
0057 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0058 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0059 logic.push_back(land);
0060 logic.push_back(isurf);
0061
0062 vert = {corners[0], corners[3], corners[2], corners[1]};
0063 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0064 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0065 assertWindow(isurf);
0066 logic.push_back(land);
0067 logic.push_back(isurf);
0068
0069 vert = {corners[4], corners[5], corners[6], corners[7]};
0070 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0071 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0072 assertWindow(isurf);
0073 logic.push_back(land);
0074 logic.push_back(isurf);
0075 builder::AddLogicToShell<Real_t>(logical_id, logic);
0076 return true;
0077 }
0078
0079 }
0080 }
0081 #endif