Back to home page

EIC code displayed by LXR

 
 

    


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

0001 #ifndef VECGEOM_SURFACE_TRAPEZOIDCONVERTER_H_
0002 #define VECGEOM_SURFACE_TRAPEZOIDCONVERTER_H_
0003 
0004 #include <VecGeom/surfaces/conv/Builder.h>
0005 #include <VecGeom/surfaces/Model.h>
0006 
0007 #include <VecGeom/volumes/Trapezoid.h>
0008 
0009 namespace vgbrep {
0010 namespace conv {
0011 
0012 /// @brief Converter for Trapezoid
0013 /// @tparam Real_t Precision type
0014 /// @param trap 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 CreateTrapezoidSurfaces(vecgeom::UnplacedTrapezoid const &trap, int logical_id, bool intersection = false)
0019 {
0020   using Vector3D = vecgeom::Vector3D<vecgeom::Precision>;
0021 
0022   auto dx1 = trap.GetDx1();
0023   auto dx2 = trap.GetDx2();
0024   auto dy1 = trap.GetDy1();
0025   auto dx3 = trap.GetDx3();
0026   auto dx4 = trap.GetDx4();
0027   auto dy2 = trap.GetDy2();
0028   auto dz  = trap.GetDz();
0029 
0030   auto txy = trap.GetTanAlpha1();
0031   auto txz = trap.GetTanThetaCosPhi();
0032   auto tyz = trap.GetTanThetaSinPhi();
0033 
0034   int isurf;
0035   LogicExpressionCPU logic; // AND logic: 0 & 1 & 2 & 3 & 4 & 5
0036   vecgeom::Transformation3D transformation;
0037   std::vector<Vector3D>
0038       vert; // Stores coordinates of the four corners that create a trapezoid. It is initialised with 3D coordinates.
0039 
0040   // corners represented as vectors (-x, -y, -z), (+x, -y, -z), (+x, +y, -z), (-x, +y, -z), same for +z
0041   std::vector<Vector3D> corners = {
0042       {-dx1 - dy1 * txy - dz * txz, -dy1 - dz * tyz, -dz}, {dx1 - dy1 * txy - dz * txz, -dy1 - dz * tyz, -dz},
0043       {+dx2 + dy1 * txy - dz * txz, +dy1 - dz * tyz, -dz}, {-dx2 + dy1 * txy - dz * txz, +dy1 - dz * tyz, -dz},
0044       {-dx3 - dy2 * txy + dz * txz, -dy2 + dz * tyz, +dz}, {dx3 - dy2 * txy + dz * txz, -dy2 + dz * tyz, +dz},
0045       {+dx4 + dy2 * txy + dz * txz, +dy2 + dz * tyz, +dz}, {-dx4 + dy2 * txy + dz * txz, +dy2 + dz * tyz, +dz}};
0046 
0047   // surface at -dx:
0048   vert  = {corners[0], corners[1], corners[5], corners[4]};
0049   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0050   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0051   if (isurf >= 0) logic.push_back(isurf);
0052 
0053   // surface at +dx:
0054   vert  = {corners[2], corners[3], corners[7], corners[6]};
0055   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0056   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0057   if (isurf >= 0) {
0058     logic.push_back(land);
0059     logic.push_back(isurf);
0060   }
0061 
0062   // surface at -dy:
0063   vert  = {corners[3], corners[0], corners[4], corners[7]};
0064   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0065   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0066   if (isurf >= 0) {
0067     logic.push_back(land);
0068     logic.push_back(isurf);
0069   }
0070 
0071   // surface at +dy:
0072   vert  = {corners[1], corners[2], corners[6], corners[5]};
0073   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0074   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0075   if (isurf >= 0) {
0076     logic.push_back(land);
0077     logic.push_back(isurf);
0078   }
0079 
0080   // surface at -dz:
0081   vert  = {corners[0], corners[3], corners[2], corners[1]};
0082   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0083   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0084   if (isurf >= 0) {
0085     logic.push_back(land);
0086     logic.push_back(isurf);
0087   }
0088 
0089   // surface at +dz:
0090   vert  = {corners[4], corners[5], corners[6], corners[7]};
0091   isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0092   if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0093   if (isurf >= 0) {
0094     logic.push_back(land);
0095     logic.push_back(isurf);
0096   }
0097   builder::AddLogicToShell<Real_t>(logical_id, logic);
0098   return true;
0099 }
0100 
0101 } // namespace conv
0102 } // namespace vgbrep
0103 #endif