Back to home page

EIC code displayed by LXR

 
 

    


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 /// @brief Converter for Trd
0013 /// @tparam Real_t Precision type
0014 /// @param trd Trd solid to be converted
0015 /// @param logical_id Id of the logical volume
0016 /// @return Conversion success
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; // AND logic: 0 & 1 & 2 & 3 & 4 & 5
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   // corners represented as vectors (-x, -y, -z), (+x, -y, -z), (+x, +y, -z), (-x, +y, -z), same for +z
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   // surface at -dx:
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   // surface at +dx:
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   // surface at -dy:
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   // surface at +dy:
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   // surface at -dz:
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   // surface at +dz:
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 } // namespace conv
0080 } // namespace vgbrep
0081 #endif