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 <<
")";