Back to home page

EIC code displayed by LXR

 
 

    


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

0001 #ifndef VECGEOM_SURFACE_PARALLELEPIPEDCONVERTER_H_
0002 #define VECGEOM_SURFACE_PARALLELEPIPEDCONVERTER_H_
0003 
0004 #include <VecGeom/surfaces/conv/Builder.h>
0005 #include <VecGeom/surfaces/Model.h>
0006 
0007 #include <VecGeom/volumes/Parallelepiped.h>
0008 
0009 namespace vgbrep {
0010 namespace conv {
0011 
0012 /// @brief Converter for Parallelepiped
0013 /// @tparam Real_t Precision type
0014 /// @param para Parallelepiped solid to be converted
0015 /// @param logical_id Id of the logical volume
0016 /// @return Conversion success
0017 template <typename Real_t>
0018 bool CreateParallelepipedSurfaces(vecgeom::UnplacedParallelepiped const &para, int logical_id,
0019                                   bool intersection = false)
0020 {
0021   using Vector3D = vecgeom::Vector3D<vecgeom::Precision>;
0022 
0023   auto dx = para.GetX(); // half length in x
0024   auto dy = para.GetY(); // half length in y
0025   auto dz = para.GetZ(); // half length in z
0026 
0027   auto txy = para.GetTanAlpha();
0028   auto txz = para.GetTanThetaCosPhi();
0029   auto tyz = para.GetTanThetaSinPhi();
0030 
0031   int isurf;
0032   LogicExpressionCPU logic; // AND logic: 0 & 1 & 2 & 3 & 4 & 5
0033   vecgeom::Transformation3D transformation;
0034   std::vector<Vector3D> vert; // Stores coordinates of the four corners that create a parallelogram. It is initialised
0035                               // with 3D coordinates.
0036 
0037   // corners represented as vectors (-x, -y, -z), (+x, -y, -z), (+x, +y, -z), (-x, +y, -z), same for +z
0038   std::vector<Vector3D> corners = {
0039       {-dx - dy * txy - dz * txz, -dy - dz * tyz, -dz}, {-dx + dy * txy - dz * txz, +dy - dz * tyz, -dz},
0040       {+dx + dy * txy - dz * txz, +dy - dz * tyz, -dz}, {+dx - dy * txy - dz * txz, -dy - dz * tyz, -dz},
0041       {-dx - dy * txy + dz * txz, -dy + dz * tyz, +dz}, {-dx + dy * txy + dz * txz, +dy + dz * tyz, +dz},
0042       {+dx + dy * txy + dz * txz, +dy + dz * tyz, +dz}, {+dx - dy * txy + dz * txz, -dy + dz * tyz, +dz}};
0043 
0044   // surface at -dx:
0045   vert  = {corners[1], corners[0], corners[4], corners[5]};
0046   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0047   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0048   logic.push_back(isurf);
0049 
0050   // surface at +dx:
0051   vert  = {corners[3], corners[2], corners[6], corners[7]};
0052   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0053   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0054   logic.push_back(land);
0055   logic.push_back(isurf);
0056 
0057   // surface at -dy:
0058   vert  = {corners[0], corners[3], corners[7], corners[4]};
0059   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0060   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0061   logic.push_back(land);
0062   logic.push_back(isurf);
0063 
0064   // surface at +dy:
0065   vert  = {corners[2], corners[1], corners[5], corners[6]};
0066   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0067   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0068   logic.push_back(land);
0069   logic.push_back(isurf);
0070 
0071   // surface at -dz:
0072   vert  = {corners[0], corners[1], corners[2], corners[3]};
0073   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0074   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0075   logic.push_back(land);
0076   logic.push_back(isurf);
0077 
0078   // surface at +dz:
0079   vert  = {corners[7], corners[6], corners[5], corners[4]};
0080   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0081   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0082   logic.push_back(land);
0083   logic.push_back(isurf);
0084   builder::AddLogicToShell<Real_t>(logical_id, logic);
0085   return true;
0086 }
0087 
0088 } // namespace conv
0089 } // namespace vgbrep
0090 #endif