Back to home page

EIC code displayed by LXR

 
 

    


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

0001 #ifndef VECGEOM_SURFACE_TETCONVERTER_H_
0002 #define VECGEOM_SURFACE_TETCONVERTER_H_
0003 
0004 #include <VecGeom/surfaces/conv/Builder.h>
0005 #include <VecGeom/surfaces/Model.h>
0006 
0007 #include <VecGeom/volumes/Tet.h>
0008 
0009 namespace vgbrep {
0010 namespace conv {
0011 
0012 /// @brief Converter for Tet, a tetrahedron
0013 /// @tparam Real_t Precision type
0014 /// @param tet Tet solid to be converted
0015 /// @param logical_id Id of the logical volume
0016 /// @return Conversion success
0017 template <typename Real_t>
0018 bool CreateTetSurfaces(vecgeom::UnplacedTet const &tet, int logical_id, bool intersection = false)
0019 {
0020   using Vector3D = vecgeom::Vector3D<Real_t>;
0021 
0022   const auto &tetstr = tet.GetStruct();
0023   int isurf;
0024   LogicExpressionCPU logic; // AND logic: 0 & 1 & 2 & 3
0025   vecgeom::Transformation3D transf;
0026   std::vector<Vector3D>
0027       vert; // Stores coordinates of the four corners that define a tet. It is initialised with 3D coordinates.
0028 
0029   // corners represented as vectors
0030   auto const *corners = tetstr.fVertex;
0031   auto assertFace     = [](int isurf) {
0032     VECGEOM_ASSERT(isurf >= 0 &&
0033                        CPUsurfData<Real_t>::Instance().fLocalSurfaces[isurf].fFrame.type == FrameType::kTriangle);
0034   };
0035 
0036   // surface 1:
0037   vert  = {corners[0], corners[1], corners[2]};
0038   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0039   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0040   assertFace(isurf);
0041   logic.push_back(isurf);
0042 
0043   // surface 2:
0044   vert  = {corners[0], corners[2], corners[3]};
0045   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0046   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0047   assertFace(isurf);
0048   logic.push_back(land);
0049   logic.push_back(isurf);
0050 
0051   // surface 3:
0052   vert  = {corners[0], corners[3], corners[1]};
0053   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0054   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0055   assertFace(isurf);
0056   logic.push_back(land);
0057   logic.push_back(isurf);
0058 
0059   // surface 4:
0060   vert  = {corners[1], corners[3], corners[2]};
0061   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0062   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0063   assertFace(isurf);
0064   logic.push_back(land);
0065   logic.push_back(isurf);
0066 
0067   builder::AddLogicToShell<Real_t>(logical_id, logic);
0068   return true;
0069 }
0070 
0071 } // namespace conv
0072 } // namespace vgbrep
0073 #endif