File indexing completed on 2025-10-29 07:55:28
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/unit_test.hpp>
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Geometry/GeometryContext.hpp"
0013 #include "Acts/Geometry/GeometryIdentifier.hpp"
0014 #include "Acts/MagneticField/MagneticFieldContext.hpp"
0015 #include "Acts/Material/HomogeneousSurfaceMaterial.hpp"
0016 #include "Acts/Material/MaterialInteraction.hpp"
0017 #include "Acts/Material/MaterialSlab.hpp"
0018 #include "Acts/Material/MaterialValidater.hpp"
0019 #include "Acts/Material/interface/IAssignmentFinder.hpp"
0020 #include "Acts/Surfaces/CylinderSurface.hpp"
0021 #include "Acts/Utilities/Intersection.hpp"
0022 #include "ActsTests/CommonHelpers/FloatComparisons.hpp"
0023
0024 #include <numbers>
0025
0026 using namespace Acts;
0027
0028 namespace ActsTests {
0029
0030 auto tContext = GeometryContext();
0031
0032
0033
0034 class IntersectSurfacesFinder : public IAssignmentFinder {
0035 public:
0036 std::vector<const Surface*> surfaces;
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 std::pair<std::vector<IAssignmentFinder::SurfaceAssignment>,
0048 std::vector<IAssignmentFinder::VolumeAssignment>>
0049 assignmentCandidates(const GeometryContext& gctx,
0050 const MagneticFieldContext& ,
0051 const Vector3& position,
0052 const Vector3& direction) const override {
0053 std::vector<IAssignmentFinder::SurfaceAssignment> surfaceAssignments;
0054 std::vector<IAssignmentFinder::VolumeAssignment> volumeAssignments;
0055
0056 for (auto& surface : surfaces) {
0057
0058 auto multiIntersection = surface->intersect(gctx, position, direction,
0059 BoundaryTolerance::None());
0060
0061 if (multiIntersection.size() == 1u &&
0062 multiIntersection.at(0).status() >= IntersectionStatus::reachable &&
0063 multiIntersection.at(0).pathLength() >= 0.0) {
0064 surfaceAssignments.push_back(
0065 {surface, multiIntersection.at(0).position(), direction});
0066 continue;
0067 }
0068 if (multiIntersection.size() > 1u) {
0069
0070 Intersection3D closestForward = multiIntersection.closestForward();
0071 if (closestForward.status() >= IntersectionStatus::reachable &&
0072 closestForward.pathLength() > 0.0) {
0073 surfaceAssignments.push_back(
0074 {surface, closestForward.position(), direction});
0075 continue;
0076 }
0077 }
0078 }
0079 return {surfaceAssignments, volumeAssignments};
0080 }
0081 };
0082
0083 BOOST_AUTO_TEST_SUITE(MaterialSuite)
0084
0085 BOOST_AUTO_TEST_CASE(MaterialValidaterFlowTest) {
0086 auto cylinder0 =
0087 Surface::makeShared<CylinderSurface>(Transform3::Identity(), 20, 100);
0088 auto cylinder1 =
0089 Surface::makeShared<CylinderSurface>(Transform3::Identity(), 40, 100);
0090 auto cylinder2 =
0091 Surface::makeShared<CylinderSurface>(Transform3::Identity(), 60, 100);
0092
0093 auto material0 = std::make_shared<HomogeneousSurfaceMaterial>(MaterialSlab(
0094 Material::fromMolarDensity(21.0, 22.0, 23.0, 24.0, 25.0), 2.0));
0095 auto material1 = std::make_shared<HomogeneousSurfaceMaterial>(MaterialSlab(
0096 Material::fromMolarDensity(41.0, 42.0, 43.0, 44.0, 45.0), 4.0));
0097 auto material2 = std::make_shared<HomogeneousSurfaceMaterial>(MaterialSlab(
0098 Material::fromMolarDensity(61.0, 62.0, 63.0, 64.0, 65.0), 6.0));
0099
0100 cylinder0->assignSurfaceMaterial(material0);
0101 cylinder1->assignSurfaceMaterial(material1);
0102 cylinder2->assignSurfaceMaterial(material2);
0103
0104 auto materialAssinger = std::make_shared<IntersectSurfacesFinder>();
0105 materialAssinger->surfaces = {cylinder0.get(), cylinder1.get(),
0106 cylinder2.get()};
0107
0108 MaterialValidater::Config mvConfig;
0109 mvConfig.materialAssigner = materialAssinger;
0110
0111 auto materialValidater = MaterialValidater(
0112 mvConfig, getDefaultLogger("MaterialValidater", Logging::VERBOSE));
0113
0114
0115 auto [posDir, rMaterial] = materialValidater.recordMaterial(
0116 tContext, MagneticFieldContext(), Vector3(0, 0, 0), Vector3(1, 0, 0));
0117
0118 BOOST_CHECK(posDir.first == Vector3(0, 0, 0));
0119 BOOST_CHECK(posDir.second == Vector3(1, 0, 0));
0120 CHECK_CLOSE_ABS(rMaterial.materialInX0, 2. / 21. + 4. / 41. + 6. / 61., 1e-6);
0121 CHECK_CLOSE_ABS(rMaterial.materialInL0, 2. / 22. + 4. / 42. + 6. / 62., 1e-6);
0122 BOOST_CHECK_EQUAL(rMaterial.materialInteractions.size(), 3u);
0123
0124
0125 auto [posDir2, rMaterial2] = materialValidater.recordMaterial(
0126 tContext, MagneticFieldContext(), Vector3(0, 0, 0),
0127 Vector3(1, 0, 1).normalized());
0128
0129 double pathCorrection = std::numbers::sqrt2;
0130 CHECK_CLOSE_ABS(rMaterial2.materialInX0,
0131 pathCorrection * (2. / 21. + 4. / 41. + 6. / 61.), 1e-6);
0132 CHECK_CLOSE_ABS(rMaterial2.materialInL0,
0133 pathCorrection * (2. / 22. + 4. / 42. + 6. / 62.), 1e-6);
0134 BOOST_CHECK_EQUAL(rMaterial2.materialInteractions.size(), 3u);
0135 }
0136
0137 BOOST_AUTO_TEST_SUITE_END()
0138
0139 }