Warning, file /acts/Tests/UnitTests/Core/Geometry/TrackingGeometryClosureTests.cpp was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/unit_test.hpp>
0010
0011 #include "Acts/Definitions/Units.hpp"
0012 #include "Acts/Geometry/ApproachDescriptor.hpp"
0013 #include "Acts/Geometry/BoundarySurfaceT.hpp"
0014 #include "Acts/Geometry/GeometryContext.hpp"
0015 #include "Acts/Geometry/GeometryIdentifier.hpp"
0016 #include "Acts/Geometry/Layer.hpp"
0017 #include "Acts/Geometry/TrackingGeometry.hpp"
0018 #include "Acts/Geometry/TrackingVolume.hpp"
0019 #include "Acts/Surfaces/Surface.hpp"
0020 #include "Acts/Surfaces/SurfaceArray.hpp"
0021 #include "Acts/Utilities/BinnedArray.hpp"
0022
0023 #include <cstddef>
0024 #include <memory>
0025 #include <unordered_map>
0026 #include <vector>
0027
0028 #include "TrackingVolumeCreation.hpp"
0029
0030 using namespace Acts;
0031 using namespace Acts::UnitLiterals;
0032
0033 namespace ActsTests {
0034
0035
0036 GeometryContext tgContext = GeometryContext();
0037
0038 TrackingGeometry makeTrackingGeometry(const GeometryIdentifierHook& hook) {
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 double surfaceHalfLengthZ = 50_mm;
0050 double surfaceRstagger = 5_mm;
0051 double surfaceZoverlap = 10_mm;
0052 double layerEnvelope = 0.5_mm;
0053 double volumeEnvelope = 10_mm;
0054
0055
0056 double iiv_surfaceR = 25_mm;
0057 double iiv_volumeR =
0058 iiv_surfaceR + 0.5 * surfaceRstagger + layerEnvelope + volumeEnvelope;
0059
0060
0061 double iov_surfaceR = 100_mm;
0062 double iov_volumeR =
0063 iov_surfaceR + 0.5 * surfaceRstagger + layerEnvelope + volumeEnvelope;
0064
0065
0066 auto iiVolume = constructCylinderVolume(
0067 tgContext, surfaceHalfLengthZ, iiv_surfaceR, surfaceRstagger,
0068 surfaceZoverlap, layerEnvelope, volumeEnvelope, 0., iiv_volumeR,
0069 "InnerInnerVolume");
0070
0071 auto ioVolume = constructCylinderVolume(
0072 tgContext, surfaceHalfLengthZ, iov_surfaceR, surfaceRstagger,
0073 surfaceZoverlap, layerEnvelope, volumeEnvelope, iiv_volumeR, iov_volumeR,
0074 "InnerOuterVolume");
0075
0076
0077 double volumeHalfZ =
0078 (4 * surfaceHalfLengthZ - surfaceZoverlap) + volumeEnvelope;
0079
0080 auto iVolume = constructContainerVolume(
0081 tgContext, iiVolume, ioVolume, iov_volumeR, volumeHalfZ, "InnerVolume");
0082
0083
0084 double ov_surfaceR = 150_mm;
0085 double ov_volumeR =
0086 ov_surfaceR + 0.5 * surfaceRstagger + layerEnvelope + volumeEnvelope;
0087
0088
0089 auto oVolume = constructCylinderVolume(
0090 tgContext, surfaceHalfLengthZ, ov_surfaceR, surfaceRstagger,
0091 surfaceZoverlap, layerEnvelope, volumeEnvelope, iov_volumeR, ov_volumeR,
0092 "OuterVolume");
0093
0094 auto volume = constructContainerVolume(
0095 tgContext, iVolume, oVolume, ov_volumeR, volumeHalfZ, "WorldVolume");
0096
0097
0098
0099 TrackingGeometry tGeometry(volume, nullptr, hook);
0100 return tGeometry;
0101 }
0102
0103 BOOST_AUTO_TEST_SUITE(GeometrySuite)
0104
0105 BOOST_AUTO_TEST_CASE(GeometryIdentifier_closeGeometry_test) {
0106 GeometryIdentifierHook hook{};
0107 TrackingGeometry tGeometry = makeTrackingGeometry(hook);
0108 auto world = tGeometry.highestTrackingVolume();
0109
0110
0111 auto check_vol = [](const TrackingVolume& vol,
0112 GeometryIdentifier::Value geoid) {
0113
0114 BOOST_CHECK_EQUAL(geoid, vol.geometryId().volume());
0115
0116
0117 GeometryIdentifier::Value bsurface_id = 0;
0118 for (const auto& bSf : vol.boundarySurfaces()) {
0119
0120 auto bs_vol_id = bSf->surfaceRepresentation().geometryId().volume();
0121 BOOST_CHECK_EQUAL(geoid, bs_vol_id);
0122
0123 auto bs_bsf_id = bSf->surfaceRepresentation().geometryId().boundary();
0124 auto bs_ext_id = bSf->surfaceRepresentation().geometryId().extra();
0125 BOOST_CHECK_EQUAL(++bsurface_id, bs_bsf_id);
0126 BOOST_CHECK_EQUAL(bs_ext_id, 0);
0127 }
0128
0129 if (vol.confinedLayers() != nullptr) {
0130
0131 GeometryIdentifier::Value layer_id = 0;
0132 for (const auto& lay : vol.confinedLayers()->arrayObjects()) {
0133
0134 auto lay_vol_id = lay->geometryId().volume();
0135 auto lay_lay_id = lay->geometryId().layer();
0136 BOOST_CHECK_EQUAL(++layer_id, lay_lay_id);
0137 BOOST_CHECK_EQUAL(geoid, lay_vol_id);
0138
0139 if (lay->approachDescriptor() != nullptr) {
0140
0141 GeometryIdentifier::Value asurface_id = 0;
0142 for (const auto& asf :
0143 lay->approachDescriptor()->containedSurfaces()) {
0144
0145 auto asf_vol_id = asf->geometryId().volume();
0146 auto asf_lay_id = asf->geometryId().layer();
0147 auto asf_asf_id = asf->geometryId().approach();
0148 auto ssf_ext_id = asf->geometryId().extra();
0149 BOOST_CHECK_EQUAL(layer_id, asf_lay_id);
0150 BOOST_CHECK_EQUAL(geoid, asf_vol_id);
0151 BOOST_CHECK_EQUAL(++asurface_id, asf_asf_id);
0152 BOOST_CHECK_EQUAL(0, ssf_ext_id);
0153 }
0154 }
0155
0156 if (lay->surfaceArray() != nullptr) {
0157
0158 GeometryIdentifier::Value ssurface_id = 0;
0159 for (const auto& ssf : lay->surfaceArray()->surfaces()) {
0160
0161 auto ssf_vol_id = ssf->geometryId().volume();
0162 auto ssf_lay_id = ssf->geometryId().layer();
0163 auto ssf_ssf_id = ssf->geometryId().sensitive();
0164 auto ssf_ext_id = ssf->geometryId().extra();
0165 BOOST_CHECK_EQUAL(layer_id, ssf_lay_id);
0166 BOOST_CHECK_EQUAL(geoid, ssf_vol_id);
0167 BOOST_CHECK_EQUAL(++ssurface_id, ssf_ssf_id);
0168 BOOST_CHECK_EQUAL(0, ssf_ext_id);
0169 }
0170 }
0171 }
0172 }
0173 };
0174
0175
0176 auto ioVolumes = world->confinedVolumes()->arrayObjects();
0177
0178 BOOST_CHECK_EQUAL(2ul, ioVolumes.size());
0179
0180 auto iioVolumes = ioVolumes[0]->confinedVolumes()->arrayObjects();
0181
0182 BOOST_CHECK_EQUAL(2ul, iioVolumes.size());
0183
0184
0185 check_vol(*world, 1);
0186
0187 check_vol(*ioVolumes[0], 2);
0188
0189 check_vol(*iioVolumes[0], 3);
0190
0191 check_vol(*iioVolumes[1], 4);
0192
0193 check_vol(*ioVolumes[1], 5);
0194 }
0195
0196 template <typename Callable>
0197 struct CallableHook : public GeometryIdentifierHook {
0198 Callable callable;
0199
0200 explicit CallableHook(const Callable& c) : callable(c) {}
0201
0202 GeometryIdentifier decorateIdentifier(GeometryIdentifier identifier,
0203 const Surface& surface) const override {
0204 return callable(identifier, surface);
0205 }
0206 };
0207
0208 BOOST_AUTO_TEST_CASE(GeometryIdentifier_closeGeometry_test_extra) {
0209 std::size_t extra = 0;
0210 std::unordered_map<const Surface*, std::size_t> extraMap;
0211 auto hookImpl = [&](GeometryIdentifier orig, const Surface& srf) {
0212 ++extra;
0213 extraMap[&srf] = extra;
0214 return orig.withExtra(extra);
0215 };
0216 CallableHook<decltype(hookImpl)> hook{hookImpl};
0217
0218 TrackingGeometry tGeometry = makeTrackingGeometry(hook);
0219 auto world = tGeometry.highestTrackingVolume();
0220
0221
0222 auto check_vol = [&extraMap](const TrackingVolume& vol,
0223 GeometryIdentifier::Value geoid) {
0224
0225 BOOST_CHECK_EQUAL(geoid, vol.geometryId().volume());
0226
0227
0228 GeometryIdentifier::Value bsurface_id = 0;
0229 for (const auto& bSf : vol.boundarySurfaces()) {
0230
0231 auto bs_vol_id = bSf->surfaceRepresentation().geometryId().volume();
0232 BOOST_CHECK_EQUAL(geoid, bs_vol_id);
0233
0234 auto bs_bsf_id = bSf->surfaceRepresentation().geometryId().boundary();
0235 auto bs_ext_id = bSf->surfaceRepresentation().geometryId().extra();
0236 BOOST_CHECK_EQUAL(++bsurface_id, bs_bsf_id);
0237 BOOST_CHECK_EQUAL(bs_ext_id, 0);
0238 }
0239
0240 if (vol.confinedLayers() != nullptr) {
0241
0242 GeometryIdentifier::Value layer_id = 0;
0243 for (const auto& lay : vol.confinedLayers()->arrayObjects()) {
0244
0245 auto lay_vol_id = lay->geometryId().volume();
0246 auto lay_lay_id = lay->geometryId().layer();
0247 BOOST_CHECK_EQUAL(++layer_id, lay_lay_id);
0248 BOOST_CHECK_EQUAL(geoid, lay_vol_id);
0249
0250 if (lay->approachDescriptor() != nullptr) {
0251
0252 GeometryIdentifier::Value asurface_id = 0;
0253 for (const auto& asf :
0254 lay->approachDescriptor()->containedSurfaces()) {
0255
0256 auto asf_vol_id = asf->geometryId().volume();
0257 auto asf_lay_id = asf->geometryId().layer();
0258 auto asf_asf_id = asf->geometryId().approach();
0259 auto ssf_ext_id = asf->geometryId().extra();
0260 BOOST_CHECK_EQUAL(layer_id, asf_lay_id);
0261 BOOST_CHECK_EQUAL(geoid, asf_vol_id);
0262 BOOST_CHECK_EQUAL(++asurface_id, asf_asf_id);
0263 BOOST_CHECK_EQUAL(0, ssf_ext_id);
0264 }
0265 }
0266
0267 if (lay->surfaceArray() != nullptr) {
0268
0269 GeometryIdentifier::Value ssurface_id = 0;
0270 for (const auto& ssf : lay->surfaceArray()->surfaces()) {
0271
0272 auto ssf_vol_id = ssf->geometryId().volume();
0273 auto ssf_lay_id = ssf->geometryId().layer();
0274 auto ssf_ssf_id = ssf->geometryId().sensitive();
0275 auto ssf_ext_id = ssf->geometryId().extra();
0276 BOOST_CHECK_EQUAL(layer_id, ssf_lay_id);
0277 BOOST_CHECK_EQUAL(geoid, ssf_vol_id);
0278 BOOST_CHECK_EQUAL(++ssurface_id, ssf_ssf_id);
0279 BOOST_CHECK_EQUAL(extraMap[ssf], ssf_ext_id);
0280 }
0281 }
0282 }
0283 }
0284 };
0285
0286
0287 auto ioVolumes = world->confinedVolumes()->arrayObjects();
0288
0289 BOOST_CHECK_EQUAL(2ul, ioVolumes.size());
0290
0291 auto iioVolumes = ioVolumes[0]->confinedVolumes()->arrayObjects();
0292
0293 BOOST_CHECK_EQUAL(2ul, iioVolumes.size());
0294
0295
0296 check_vol(*world, 1);
0297
0298 check_vol(*ioVolumes[0], 2);
0299
0300 check_vol(*iioVolumes[0], 3);
0301
0302 check_vol(*iioVolumes[1], 4);
0303
0304 check_vol(*ioVolumes[1], 5);
0305 }
0306
0307 BOOST_AUTO_TEST_CASE(TrackingGeometry_testVisitSurfaces) {
0308 GeometryIdentifierHook hook{};
0309 auto tGeometry = makeTrackingGeometry(hook);
0310
0311
0312 std::size_t nSurfaces = 0;
0313 tGeometry.visitSurfaces([&nSurfaces](const auto*) { nSurfaces++; });
0314 BOOST_CHECK_EQUAL(nSurfaces, 9u);
0315
0316
0317 std::size_t nVolumes = 0;
0318 tGeometry.visitVolumes([&nVolumes](const auto*) { nVolumes++; });
0319 BOOST_CHECK_EQUAL(nVolumes,
0320 5u);
0321
0322
0323 bool volumeCalled = false;
0324 tGeometry.apply([&](TrackingVolume& ) { volumeCalled = true; });
0325 BOOST_CHECK(volumeCalled);
0326
0327
0328 bool constVolumeCalled = false;
0329 tGeometry.apply(
0330 [&](const TrackingVolume& ) { constVolumeCalled = true; });
0331 BOOST_CHECK(constVolumeCalled);
0332
0333
0334 bool surfaceCalled = false;
0335 bool portalCalled = false;
0336 tGeometry.apply(overloaded{
0337 [&](Surface& ) { surfaceCalled = true; },
0338 [&](Portal& ) { portalCalled = true; },
0339 [&](TrackingVolume& ) {},
0340 });
0341 BOOST_CHECK(surfaceCalled);
0342
0343 BOOST_CHECK(!portalCalled);
0344
0345
0346 bool lambdaVolumeCalled = false;
0347 tGeometry.apply([&](Volume& ) { lambdaVolumeCalled = true; });
0348 BOOST_CHECK(lambdaVolumeCalled);
0349 }
0350
0351 BOOST_AUTO_TEST_SUITE_END()
0352
0353 }