Back to home page

EIC code displayed by LXR

 
 

    


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

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