File indexing completed on 2025-11-01 07:55:00
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/unit_test.hpp>
0010
0011 #include "Acts/Material/AccumulatedMaterialSlab.hpp"
0012 #include "Acts/Material/Material.hpp"
0013 #include "Acts/Material/MaterialSlab.hpp"
0014 #include "ActsTests/CommonHelpers/FloatComparisons.hpp"
0015 #include "ActsTests/CommonHelpers/PredefinedMaterials.hpp"
0016
0017 #include <limits>
0018 #include <utility>
0019
0020 using namespace Acts;
0021
0022 constexpr auto eps = std::numeric_limits<float>::epsilon();
0023
0024 namespace ActsTests {
0025
0026 BOOST_AUTO_TEST_SUITE(MaterialSuite)
0027
0028 BOOST_AUTO_TEST_CASE(Nothing) {
0029 AccumulatedMaterialSlab a;
0030 auto [average, trackCount] = a.totalAverage();
0031
0032 BOOST_CHECK(average.isVacuum());
0033 BOOST_CHECK_EQUAL(trackCount, 0u);
0034 }
0035
0036
0037 BOOST_AUTO_TEST_CASE(EmptyTracksIgnored) {
0038 AccumulatedMaterialSlab a;
0039 a.trackAverage();
0040 a.trackAverage();
0041 a.trackAverage();
0042 auto [average, trackCount] = a.totalAverage();
0043 BOOST_CHECK(average.isVacuum());
0044 BOOST_CHECK_EQUAL(trackCount, 0u);
0045 }
0046
0047
0048 BOOST_AUTO_TEST_CASE(EmptyTracks) {
0049 AccumulatedMaterialSlab a;
0050 a.trackAverage(true);
0051 a.trackAverage(true);
0052 a.trackAverage(true);
0053 auto [average, trackCount] = a.totalAverage();
0054 BOOST_CHECK(average.isVacuum());
0055 BOOST_CHECK_EQUAL(trackCount, 3u);
0056 }
0057
0058 BOOST_AUTO_TEST_CASE(MultipleIdenticalThicknessTrackSteps) {
0059 MaterialSlab unit = makeUnitSlab();
0060 AccumulatedMaterialSlab a;
0061
0062 {
0063 a.accumulate(unit);
0064 a.accumulate(unit);
0065 a.accumulate(unit);
0066 a.trackAverage();
0067 auto [average, trackCount] = a.totalAverage();
0068 BOOST_CHECK_EQUAL(trackCount, 1u);
0069 BOOST_CHECK_EQUAL(average.material(), unit.material());
0070 BOOST_CHECK_EQUAL(average.thickness(), 3 * unit.thickness());
0071 BOOST_CHECK_EQUAL(average.thicknessInX0(), 3.0f);
0072 BOOST_CHECK_EQUAL(average.thicknessInL0(), 3.0f);
0073 }
0074
0075 {
0076 a.accumulate(unit);
0077 a.accumulate(unit);
0078 a.accumulate(unit);
0079 a.trackAverage();
0080 auto [average, trackCount] = a.totalAverage();
0081 BOOST_CHECK_EQUAL(trackCount, 2u);
0082
0083 BOOST_CHECK_EQUAL(average.material(), unit.material());
0084 BOOST_CHECK_EQUAL(average.thickness(), 3 * unit.thickness());
0085 BOOST_CHECK_EQUAL(average.thicknessInX0(), 3.0f);
0086 BOOST_CHECK_EQUAL(average.thicknessInL0(), 3.0f);
0087 }
0088 }
0089
0090
0091
0092 BOOST_AUTO_TEST_CASE(MultipleDifferentThicknessTrackSteps) {
0093 MaterialSlab unit = makeUnitSlab();
0094 AccumulatedMaterialSlab a;
0095
0096 {
0097 a.accumulate(unit);
0098 a.accumulate(unit);
0099 a.accumulate(unit);
0100 a.trackAverage();
0101 auto [average, trackCount] = a.totalAverage();
0102 BOOST_CHECK_EQUAL(trackCount, 1u);
0103 BOOST_CHECK_EQUAL(average.material(), unit.material());
0104 BOOST_CHECK_EQUAL(average.thickness(), 3 * unit.thickness());
0105 BOOST_CHECK_EQUAL(average.thicknessInX0(), 3.0f);
0106 BOOST_CHECK_EQUAL(average.thicknessInL0(), 3.0f);
0107 }
0108
0109 {
0110 MaterialSlab twice = unit;
0111 twice.scaleThickness(2);
0112 a.accumulate(unit);
0113 a.accumulate(twice);
0114 a.trackAverage();
0115 auto [average, trackCount] = a.totalAverage();
0116 BOOST_CHECK_EQUAL(trackCount, 2u);
0117
0118 BOOST_CHECK_EQUAL(average.material(), unit.material());
0119 BOOST_CHECK_EQUAL(average.thickness(), 3 * unit.thickness());
0120 BOOST_CHECK_EQUAL(average.thicknessInX0(), 3.0f);
0121 BOOST_CHECK_EQUAL(average.thicknessInL0(), 3.0f);
0122 }
0123
0124 {
0125 MaterialSlab thrice = unit;
0126 thrice.scaleThickness(3);
0127 a.accumulate(thrice);
0128 a.trackAverage();
0129 auto [average, trackCount] = a.totalAverage();
0130 BOOST_CHECK_EQUAL(trackCount, 3u);
0131
0132 BOOST_CHECK_EQUAL(average.material(), unit.material());
0133 BOOST_CHECK_EQUAL(average.thickness(), 3 * unit.thickness());
0134 BOOST_CHECK_EQUAL(average.thicknessInX0(), 3.0f);
0135 BOOST_CHECK_EQUAL(average.thicknessInL0(), 3.0f);
0136 }
0137 }
0138
0139
0140 BOOST_AUTO_TEST_CASE(MultipleDifferentTracks) {
0141 MaterialSlab unit = makeUnitSlab();
0142 AccumulatedMaterialSlab a;
0143
0144 {
0145 a.accumulate(unit);
0146 a.trackAverage();
0147 auto [average, trackCount] = a.totalAverage();
0148 BOOST_CHECK_EQUAL(trackCount, 1u);
0149 BOOST_CHECK_EQUAL(average.material(), unit.material());
0150 BOOST_CHECK_EQUAL(average.thickness(), unit.thickness());
0151 BOOST_CHECK_EQUAL(average.thicknessInX0(), unit.thicknessInX0());
0152 BOOST_CHECK_EQUAL(average.thicknessInL0(), unit.thicknessInL0());
0153 }
0154
0155 {
0156 MaterialSlab three = unit;
0157 three.scaleThickness(3);
0158 a.accumulate(three);
0159 a.trackAverage();
0160 auto [average, trackCount] = a.totalAverage();
0161 BOOST_CHECK_EQUAL(trackCount, 2);
0162
0163 BOOST_CHECK_EQUAL(average.material(), unit.material());
0164 BOOST_CHECK_EQUAL(average.thickness(), 2 * unit.thickness());
0165 BOOST_CHECK_EQUAL(average.thicknessInX0(), 2 * unit.thicknessInX0());
0166 BOOST_CHECK_EQUAL(average.thicknessInL0(), 2 * unit.thicknessInL0());
0167 }
0168
0169 {
0170 MaterialSlab vac = MaterialSlab::Vacuum(2 * unit.thickness());
0171
0172 a.accumulate(vac);
0173 a.trackAverage();
0174 a.accumulate(vac);
0175 a.trackAverage();
0176 auto [average, trackCount] = a.totalAverage();
0177 BOOST_CHECK_EQUAL(trackCount, 4u);
0178
0179 CHECK_CLOSE_REL(average.material().X0(), 2 * unit.material().X0(), eps);
0180 CHECK_CLOSE_REL(average.material().L0(), 2 * unit.material().L0(), eps);
0181 CHECK_CLOSE_REL(average.material().molarDensity(),
0182 0.5f * unit.material().molarDensity(), eps);
0183
0184 CHECK_CLOSE_REL(average.material().Ar(), unit.material().Ar(), eps);
0185
0186 CHECK_CLOSE_REL(average.material().Z(), 0.5 * unit.material().Z(), eps);
0187
0188 BOOST_CHECK_EQUAL(average.thicknessInX0(), 1 * unit.thicknessInX0());
0189 BOOST_CHECK_EQUAL(average.thicknessInL0(), 1 * unit.thicknessInL0());
0190
0191 BOOST_CHECK_EQUAL(average.thickness(), 2 * unit.thickness());
0192 }
0193 }
0194
0195 BOOST_AUTO_TEST_SUITE_END()
0196
0197 }