File indexing completed on 2026-09-04 08:23:07
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Geometry/CylinderLayer.hpp"
0013 #include "Acts/Geometry/CylinderVolumeBounds.hpp"
0014 #include "Acts/Geometry/GeometryContext.hpp"
0015 #include "Acts/Geometry/SurfaceArrayCreator.hpp"
0016 #include "Acts/Geometry/TrackingGeometry.hpp"
0017 #include "Acts/Geometry/TrackingVolume.hpp"
0018 #include "Acts/Surfaces/CylinderBounds.hpp"
0019 #include "Acts/Surfaces/CylinderSurface.hpp"
0020 #include "Acts/Utilities/BinUtility.hpp"
0021 #include "Acts/Utilities/BinnedArrayXD.hpp"
0022
0023 using namespace Acts;
0024
0025 namespace ActsTests {
0026
0027
0028 TrackingVolumePtr constructCylinderVolume(
0029 const GeometryContext& gctx, double surfaceHalfLengthZ, double surfaceR,
0030 double surfaceRstagger, double surfaceZoverlap, double layerEnvelope,
0031 double volumeEnvelope, double innerVolumeR, double outerVolumeR,
0032 const std::string& name) {
0033
0034 auto sfnPosition = Vector3(0., 0., -3 * surfaceHalfLengthZ - surfaceZoverlap);
0035 auto sfnTransform = Transform3(Translation3(sfnPosition));
0036 auto sfcTransform = Transform3::Identity();
0037 auto sfpPosition = Vector3(0., 0., 3 * surfaceHalfLengthZ - surfaceZoverlap);
0038 auto sfpTransform = Transform3(Translation3(sfpPosition));
0039
0040 auto sfnBounds = std::make_shared<CylinderBounds>(
0041 surfaceR - 0.5 * surfaceRstagger, surfaceHalfLengthZ);
0042 auto sfn = Surface::makeShared<CylinderSurface>(sfnTransform, sfnBounds);
0043 auto sfcBounds = std::make_shared<CylinderBounds>(
0044 surfaceR + 0.5 * surfaceRstagger, surfaceHalfLengthZ);
0045 auto sfc = Surface::makeShared<CylinderSurface>(sfcTransform, sfcBounds);
0046 auto sfpBounds = std::make_shared<CylinderBounds>(
0047 surfaceR - 0.5 * surfaceRstagger, surfaceHalfLengthZ);
0048 auto sfp = Surface::makeShared<CylinderSurface>(sfpTransform, sfpBounds);
0049
0050
0051
0052
0053 double bUmax = sfpPosition.z() + surfaceHalfLengthZ;
0054
0055 std::vector<std::shared_ptr<const Surface>> surfaces_only = {{sfn, sfc, sfp}};
0056 std::vector<const Surface*> surfaces_only_raw = {
0057 {sfn.get(), sfc.get(), sfp.get()}};
0058
0059 SurfaceArrayCreator::Config sacConfig;
0060 SurfaceArrayCreator sac{sacConfig};
0061
0062 auto bArray = std::make_unique<SurfaceArray>(
0063 sac.surfaceArrayOnCylinder(gctx, surfaces_only));
0064
0065
0066 auto layer0bounds = std::make_shared<const CylinderBounds>(surfaceR, bUmax);
0067 auto layer0 = CylinderLayer::create(Transform3::Identity(), layer0bounds,
0068 std::move(bArray),
0069 surfaceRstagger + 2 * layerEnvelope);
0070 std::unique_ptr<const LayerArray> layerArray =
0071 std::make_unique<const BinnedArrayXD<LayerPtr>>(layer0);
0072
0073
0074 auto volumeBounds = std::make_shared<CylinderVolumeBounds>(
0075 innerVolumeR, outerVolumeR, bUmax + volumeEnvelope);
0076
0077 TrackingVolumePtr volume = std::make_shared<TrackingVolume>(
0078 Transform3::Identity(), volumeBounds, nullptr, std::move(layerArray),
0079 nullptr, MutableTrackingVolumeVector{}, name);
0080
0081 return volume;
0082 }
0083
0084
0085 MutableTrackingVolumePtr constructContainerVolume(const GeometryContext& gctx,
0086 TrackingVolumePtr iVolume,
0087 TrackingVolumePtr oVolume,
0088 double hVolumeR,
0089 double hVolumeHalflength,
0090 const std::string& name) {
0091
0092 using VAP = std::pair<TrackingVolumePtr, Vector3>;
0093 std::vector<VAP> volumes = {
0094 {iVolume, iVolume->referencePosition(gctx, AxisDirection::AxisR)},
0095 {oVolume, oVolume->referencePosition(gctx, AxisDirection::AxisR)}};
0096
0097 auto hVolumeBounds =
0098 std::make_shared<CylinderVolumeBounds>(0., hVolumeR, hVolumeHalflength);
0099
0100 auto vUtility = std::make_unique<const BinUtility>(
0101 volumes.size(), 0., hVolumeR, open, AxisDirection::AxisR);
0102 std::shared_ptr<const TrackingVolumeArray> vArray =
0103 std::make_shared<const BinnedArrayXD<TrackingVolumePtr>>(
0104 volumes, std::move(vUtility));
0105
0106 auto hVolume = std::make_shared<TrackingVolume>(
0107 Transform3::Identity(), hVolumeBounds, nullptr, nullptr, vArray,
0108 MutableTrackingVolumeVector{}, name);
0109
0110 return hVolume;
0111 }
0112
0113 }