Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-17 08:35:33

0001 #ifndef VECGEOM_SURFACE_GENTRAPCONVERTER_H_
0002 #define VECGEOM_SURFACE_GENTRAPCONVERTER_H_
0003 
0004 #include <VecGeom/surfaces/conv/Builder.h>
0005 #include <VecGeom/surfaces/Model.h>
0006 
0007 #include <VecGeom/volumes/GenTrap.h>
0008 
0009 namespace vgbrep {
0010 namespace conv {
0011 
0012 /// @brief Converter for a generic trapezoid (Arb8)
0013 /// @tparam Real_t Precision type
0014 /// @param gtrap generalized trapezoid solid to be converted
0015 /// @param logical_id Id of the logical volume
0016 /// @return Conversion success
0017 template <typename Real_t>
0018 bool CreateGenTrapSurfaces(vecgeom::UnplacedGenTrap const &gtrap, int logical_id, bool intersection = false)
0019 {
0020   using Vector3 = vecgeom::Vector3D<Real_t>;
0021   int isurf;
0022   LogicExpressionCPU logic; // AND logic: 0 & 1 & 2 & 3 & 4 & 5
0023 
0024   auto vertices = gtrap.GetVertices();
0025 
0026   // corners represented as vectors (-x, -y, -z), (+x, -y, -z), (+x, +y, -z), (-x, +y, -z), same for +z
0027   std::vector<Vector3> corners = {vertices[0], vertices[3], vertices[2], vertices[1],
0028                                   vertices[4], vertices[7], vertices[6], vertices[5]};
0029 
0030   std::vector<Vector3> vert;
0031 
0032   // surface at -dx:
0033   vert  = {corners[3], corners[0], corners[4], corners[7]};
0034   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0035   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0036   logic.push_back(isurf);
0037 
0038   // surface at +dx:
0039   vert  = {corners[1], corners[2], corners[6], corners[5]};
0040   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0041   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0042   logic.push_back(land);
0043   logic.push_back(isurf);
0044 
0045   // surface at -dy:
0046   vert  = {corners[0], corners[1], corners[5], corners[4]};
0047   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0048   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0049   logic.push_back(land);
0050   logic.push_back(isurf);
0051 
0052   // surface at +dy:
0053   vert  = {corners[2], corners[3], corners[7], corners[6]};
0054   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0055   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0056   logic.push_back(land);
0057   logic.push_back(isurf);
0058 
0059   // surface at -dz:
0060   vert  = {corners[0], corners[3], corners[2], corners[1]};
0061   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0062   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0063   logic.push_back(land);
0064   logic.push_back(isurf);
0065 
0066   // surface at +dz:
0067   vert  = {corners[4], corners[5], corners[6], corners[7]};
0068   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0069   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0070   logic.push_back(land);
0071   logic.push_back(isurf);
0072 
0073   builder::AddLogicToShell<Real_t>(logical_id, logic);
0074   return true;
0075 }
0076 
0077 } // namespace conv
0078 } // namespace vgbrep
0079 #endif