25 #include "GaudiKernel/MsgStream.h" 
   26 #include "GaudiKernel/SystemOfUnits.h" 
   43   , m_boundaryAccessors()
 
   44   , m_subtractedVolume(nullptr)
 
   54   , m_innerRadius(std::abs(rinner))
 
   55   , m_outerRadius(std::abs(router))
 
   56   , m_halfPhiSector(haphi)
 
   57   , m_halfZ(std::abs(halez))
 
   61   , m_boundaryAccessors()
 
   62   , m_subtractedVolume(nullptr)
 
   68   , m_innerRadius(cylbo.m_innerRadius)
 
   69   , m_outerRadius(cylbo.m_outerRadius)
 
   70   , m_halfPhiSector(cylbo.m_halfPhiSector)
 
   71   , m_halfZ(cylbo.m_halfZ)
 
   72   , m_thetaMinus(cylbo.m_thetaMinus)
 
   73   , m_thetaPlus(cylbo.m_thetaPlus)
 
   75   , m_boundaryAccessors()
 
   76   , m_subtractedVolume(nullptr)
 
   93     m_subtractedVolume.store(
nullptr);
 
   98 std::vector<std::unique_ptr<Trk::Surface>>
 
  102   auto retsf = std::vector<std::unique_ptr<Trk::Surface>>();
 
  110   if (
m_type > -1 && !m_subtractedVolume) {
 
  111     m_subtractedVolume.set(std::unique_ptr<Trk::Volume>(subtractedVolume()));
 
  116     retsf.push_back(std::make_unique<Trk::PlaneSurface>(
 
  121           cylCenter - (halflengthZ() - m_outerRadius * 
tan(m_thetaMinus)) *
 
  123       bottomEllipseBounds()));
 
  125     if (m_subtractedVolume) {
 
  126       auto subtrVol = std::make_unique<Trk::Volume>(*m_subtractedVolume);
 
  132       retsf.push_back(std::make_unique<Trk::SubtractedDiscSurface>(
 
  133           bottomDisc, std::make_shared<Trk::VolumeExcluder>(std::move(subtrVol)), 
false));
 
  135       retsf.push_back(std::make_unique<Trk::DiscSurface>(
 
  144     retsf.push_back(std::make_unique<Trk::PlaneSurface>(
 
  149           (halflengthZ() - m_outerRadius * 
tan(m_thetaPlus)) * discRot.col(2))),
 
  150       topEllipseBounds()));
 
  152     if (m_subtractedVolume) {
 
  153       auto subtrVol = std::make_unique<Trk::Volume>(*m_subtractedVolume);
 
  158       retsf.push_back(std::make_unique<Trk::SubtractedDiscSurface>(
 
  159         topDisc, std::make_shared<Trk::VolumeExcluder>(std::move(subtrVol)), 
false));
 
  161       retsf.push_back(std::make_unique<Trk::DiscSurface>(
 
  169     retsf.push_back(std::make_unique<Trk::CylinderSurface>(
 
  172     retsf.push_back(std::make_unique<Trk::CylinderSurface>(
 
  175     retsf.push_back(std::make_unique<Trk::PlaneSurface>(
 
  181       outerBevelledPlaneBounds()));
 
  184   if (innerRadius() > s_numericalStable) {
 
  186       retsf.push_back(std::make_unique<Trk::CylinderSurface>(
 
  189       retsf.push_back(std::make_unique<Trk::CylinderSurface>(
 
  192       retsf.push_back(std::make_unique<Trk::PlaneSurface>(
 
  199         innerBevelledPlaneBounds()));
 
  202   if (std::abs(halfPhiSector() - 
M_PI) > s_numericalStable) {
 
  205       retsf.push_back(std::make_unique<Trk::PlaneSurface>(
 
  213       retsf.push_back(std::make_unique<Trk::PlaneSurface>(
 
  222       double ri = innerRadius();
 
  223       double ro = outerRadius();
 
  225         ri *= 1. / 
cos(halfPhiSector());
 
  227         ro *= 1. / 
cos(halfPhiSector());
 
  228       retsf.push_back(std::make_unique<Trk::PlaneSurface>(
 
  234         sectorPlaneBounds()));
 
  236       retsf.push_back(std::make_unique<Trk::PlaneSurface>(
 
  242         sectorPlaneBounds()));
 
  255   if (m_innerRadius != 0. && std::abs(m_halfPhiSector - 
M_PI) < s_numericalStable) {
 
  257     double posZ = gp.z();
 
  258     double posR = gp.perp();
 
  266     bool isOnFace = 
false;
 
  267     bool intersectionIndicator = (
deltaR > 0.);
 
  268     bool choiceIndicator = 
false;
 
  273       std::abs(
posZ + m_halfZ) < s_numericalStable ||
 
  277       std::abs(
posZ - m_halfZ) < s_numericalStable ||
 
  282       std::abs(posR - m_innerRadius) < s_numericalStable ||
 
  283       (posR < m_innerRadius && deltaR > 0.)) {
 
  289       std::abs(posR - m_outerRadius) < s_numericalStable ||
 
  290       (posR > m_outerRadius && 
deltaR < 0.)) {
 
  300       if (intersectionIndicator) {
 
  304         double zOfIntersect = intersectRmax.
yOfX;
 
  306         if (std::abs(zOfIntersect) <= m_halfZ)
 
  307           return {(choiceIndicator || zOfIntersect > 0.)
 
  308                       ? m_boundaryAccessors.bevelledtubeAccessor(
 
  310                       : m_boundaryAccessors.bevelledtubeAccessor(
 
  313         return {(choiceIndicator || zOfIntersect > 0.)
 
  314                     ? m_boundaryAccessors.bevelledtubeAccessor(
 
  316                     : m_boundaryAccessors.bevelledtubeAccessor(
 
  322       double zOfIntersect = intersectRmin.
yOfX;
 
  324       if (std::abs(zOfIntersect) <= m_halfZ)
 
  325         return {(choiceIndicator || zOfIntersect > 0.)
 
  326                     ? m_boundaryAccessors.bevelledtubeAccessor(
 
  328                     : m_boundaryAccessors.bevelledtubeAccessor(
 
  331       return {(choiceIndicator || zOfIntersect > 0.)
 
  332                   ? m_boundaryAccessors.bevelledtubeAccessor(
 
  334                   : m_boundaryAccessors.bevelledtubeAccessor(
 
  342     if (posR < m_innerRadius && 
deltaR < 0.)
 
  343       return {m_boundaryAccessors.bevelledtubeAccessor(
 
  345     if (posR > m_outerRadius && 
deltaR > 0.)
 
  346       return {m_boundaryAccessors.bevelledtubeAccessor(
 
  349       return {m_boundaryAccessors.bevelledtubeAccessor(
 
  352       return {m_boundaryAccessors.bevelledtubeAccessor(
 
  360       double zOfIntersect = intersectRmax.
yOfX;
 
  362       if (std::abs(zOfIntersect) <= m_halfZ && zOfIntersect > 0.)
 
  363         return {m_boundaryAccessors.bevelledtubeAccessor(
 
  365       if (std::abs(zOfIntersect) <= m_halfZ && zOfIntersect < 0.)
 
  366         return {m_boundaryAccessors.bevelledtubeAccessor(
 
  368       if (std::abs(zOfIntersect) > m_halfZ && zOfIntersect < 0.)
 
  369         return {m_boundaryAccessors.bevelledtubeAccessor(
 
  371       if (std::abs(zOfIntersect) > m_halfZ && zOfIntersect > 0.)
 
  372         return {m_boundaryAccessors.bevelledtubeAccessor(
 
  379       double zOfIntersect = intersectRmin.
yOfX;
 
  381       if (std::abs(zOfIntersect) <= m_halfZ && zOfIntersect > 0.)
 
  382         return {m_boundaryAccessors.bevelledtubeAccessor(
 
  384       if (std::abs(zOfIntersect) <= m_halfZ && zOfIntersect < 0.)
 
  385         return {m_boundaryAccessors.bevelledtubeAccessor(
 
  387       if (std::abs(zOfIntersect) > m_halfZ && zOfIntersect > 0.)
 
  388         return {m_boundaryAccessors.bevelledtubeAccessor(
 
  390       return {m_boundaryAccessors.bevelledtubeAccessor(
 
  395   if (m_innerRadius == 0. && std::abs(m_halfPhiSector - 
M_PI) < 10
e-3) {
 
  397     double posZ = gp.z();
 
  398     double posR = gp.perp();
 
  409     double zOfIntersect = intersectR.
yOfX;
 
  411     if (std::abs(zOfIntersect) <= m_halfZ && zOfIntersect > 0.)
 
  412       return {m_boundaryAccessors.bevelledcylinderAccessor(
 
  414     if (std::abs(zOfIntersect) <= m_halfZ && zOfIntersect < 0.)
 
  415       return {m_boundaryAccessors.bevelledcylinderAccessor(
 
  417     if (std::abs(zOfIntersect) > m_halfZ && zOfIntersect > 0.)
 
  418       return {m_boundaryAccessors.bevelledcylinderAccessor(
 
  420     return {m_boundaryAccessors.bevelledcylinderAccessor(
 
  424   if (m_innerRadius != 0. && std::abs(m_halfPhiSector - 
M_PI) > 10
e-3)
 
  425     return {m_boundaryAccessors.sectoralBevelledCylinderAccessor(
 
  428   return {m_boundaryAccessors.sectoralBevelledTubeAccessor(
 
  432 std::shared_ptr<Trk::CylinderBounds>
 
  435   return std::make_shared<Trk::CylinderBounds>(m_innerRadius, m_halfPhiSector, m_halfZ);
 
  438 std::shared_ptr<Trk::CylinderBounds>
 
  441   return std::make_shared<Trk::CylinderBounds>(m_outerRadius, m_halfPhiSector, m_halfZ);
 
  444 std::shared_ptr<Trk::RectangleBounds>
 
  447   return std::make_shared<Trk::RectangleBounds>(m_outerRadius * 
tan(m_halfPhiSector), m_halfZ);
 
  450 std::shared_ptr<Trk::RectangleBounds>
 
  453   return std::make_shared<Trk::RectangleBounds>(m_innerRadius * 
tan(m_halfPhiSector), m_halfZ);
 
  456 std::shared_ptr<Trk::EllipseBounds>
 
  459   return std::make_shared<Trk::EllipseBounds>(
 
  460     m_innerRadius / 
cos(m_thetaMinus),
 
  462     m_outerRadius / 
cos(m_thetaMinus),
 
  467 std::shared_ptr<Trk::EllipseBounds>
 
  470   return std::make_shared<Trk::EllipseBounds>(
 
  471     m_innerRadius / 
cos(m_thetaPlus),
 
  473     m_outerRadius / 
cos(m_thetaPlus),
 
  478 std::shared_ptr<Trk::CylinderBounds>
 
  481   return std::make_shared<Trk::CylinderBounds>(m_innerRadius, m_halfPhiSector, m_halfZ);
 
  484 std::shared_ptr<Trk::CylinderBounds>
 
  487   return std::make_shared<Trk::CylinderBounds>(m_outerRadius, m_halfPhiSector, m_halfZ);
 
  490 std::shared_ptr<Trk::DiscBounds>
 
  495     (
m_type > 1) ? m_outerRadius / 
cos(m_halfPhiSector) : m_outerRadius;
 
  496   return std::make_shared<Trk::DiscBounds>(m_innerRadius, outerRadius, m_halfPhiSector);
 
  499 std::shared_ptr<Trk::TrapezoidBounds>
 
  502   return std::make_shared<Trk::TrapezoidBounds>(
 
  503       0.5 * (outerRadius() - innerRadius()), m_halfZ, m_thetaMinus,
 
  507 std::shared_ptr<Trk::RectangleBounds>
 
  510   double ri = innerRadius();
 
  511   double ro = outerRadius();
 
  513     ri *= 1. / 
cos(halfPhiSector());
 
  515     ro *= 1. / 
cos(halfPhiSector());
 
  516   return std::make_shared<Trk::RectangleBounds>(0.5 * (ro - ri), m_halfZ);
 
  525   double tp = 
tan(m_halfPhiSector);
 
  526   std::unique_ptr<Trk::Volume> volIn;
 
  527   std::unique_ptr<Trk::Volume> volOut;
 
  529     volIn = std::make_unique<Trk::Volume>(
 
  531         std::make_shared<Trk::CuboidVolumeBounds>(m_innerRadius, m_innerRadius * 
tp + 0.1, m_halfZ + 0.1));
 
  534     double hz = m_outerRadius * (1. / 
cos(m_halfPhiSector) - 1.);
 
  535     volOut = std::make_unique<Trk::Volume>(
 
  537         std::make_shared<Trk::CuboidVolumeBounds>(
hz, m_outerRadius * 
tp + 0.1, m_halfZ + 0.1));
 
  541     return volOut.release();
 
  544     return volIn.release();
 
  547     nullptr, std::make_shared<Trk::CombinedVolumeBounds>(std::move(volIn), std::move(volOut), 
false));
 
  555   std::stringstream sl_temp;
 
  556   sl_temp << std::setiosflags(std::ios::fixed);
 
  557   sl_temp << std::setprecision(7);
 
  558   sl_temp << 
"Trk::BevelledCylinderVolumeBounds: (innerR, outerR, " 
  559              "halfPhiSector, halflengthInZ, thetaMinus, thetaPlus) = ";
 
  560   sl_temp << 
"(" << m_innerRadius << 
", " << m_outerRadius << 
", " 
  561           << m_halfPhiSector << 
", " << m_halfZ << 
", " << m_thetaMinus << 
", " 
  562           << m_thetaPlus << 
")";
 
  570   std::stringstream sl_temp;
 
  571   sl_temp << std::setiosflags(std::ios::fixed);
 
  572   sl_temp << std::setprecision(7);
 
  573   sl_temp << 
"Trk::BevelledCylinderVolumeBounds: (innerR, outerR, " 
  574              "halfPhiSector, halflengthInZ, thetaMinus, thetaPlus) = ";
 
  575   sl_temp << 
"(" << m_innerRadius << 
", " << m_outerRadius << 
", " 
  576           << m_halfPhiSector << 
", " << m_halfZ << m_thetaMinus << 
", " 
  577           << m_thetaPlus << 
")";