File indexing completed on 2026-07-31 08:18:53
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/data/test_case.hpp>
0010 #include <boost/test/unit_test.hpp>
0011
0012 #include "Acts/Utilities/Axis.hpp"
0013 #include "Acts/Utilities/AxisDefinitions.hpp"
0014 #include "Acts/Utilities/Diagnostics.hpp"
0015 #include "Acts/Utilities/ProtoAxis.hpp"
0016 #include "ActsTests/CommonHelpers/FloatComparisons.hpp"
0017
0018 namespace ActsTests {
0019
0020 BOOST_AUTO_TEST_SUITE(UtilitiesSuite)
0021
0022 BOOST_AUTO_TEST_CASE(EquidistantProtoAxis) {
0023 using enum Acts::AxisBoundaryType;
0024 using enum Acts::AxisType;
0025
0026
0027 Acts::ProtoAxis epab(Bound, 0.0, 1.0, 10);
0028
0029
0030 BOOST_CHECK(!epab.isAutorange());
0031
0032
0033 BOOST_CHECK(epab.getAxis().isEquidistant());
0034
0035 BOOST_CHECK(!epab.getAxis().isVariable());
0036
0037 auto edges = epab.getAxis().getBinEdges();
0038 BOOST_CHECK_EQUAL(edges.size(), 11);
0039
0040 BOOST_CHECK_EQUAL(epab.getAxis().getType(), Equidistant);
0041
0042 BOOST_CHECK_EQUAL(epab.getAxis().getBoundaryType(), Bound);
0043
0044 BOOST_CHECK_EQUAL(epab.getAxis().getNBins(), 10);
0045
0046 BOOST_CHECK_EQUAL(epab.getAxis().getBin(0.35), 4);
0047
0048 CHECK_CLOSE_ABS(epab.getAxis().getMin(), 0.0, 1e-15);
0049
0050 CHECK_CLOSE_ABS(epab.getAxis().getMax(), 1.0, 1e-15);
0051
0052 std::string rString = "ProtoAxis: 10 bins, equidistant within [0, 1]";
0053 std::string oString = epab.toString();
0054 BOOST_CHECK_EQUAL(rString, oString);
0055
0056
0057 Acts::ProtoAxis epabCopy(epab);
0058 BOOST_CHECK_EQUAL(epabCopy.isAutorange(), epab.isAutorange());
0059 BOOST_CHECK(epabCopy.getAxis() == epab.getAxis());
0060
0061
0062 Acts::ProtoAxis epabAssign(Bound, 0.0, 50.0, 20);
0063 epabAssign = epab;
0064 BOOST_CHECK_EQUAL(epabAssign.isAutorange(), epab.isAutorange());
0065 BOOST_CHECK(epabAssign.getAxis() == epab.getAxis());
0066
0067
0068 ACTS_PUSH_IGNORE_DEPRECATED()
0069 auto grid1D = Acts::makeGrid<double>(epab);
0070 ACTS_POP_IGNORE_DEPRECATED()
0071 BOOST_CHECK(grid1D != nullptr);
0072 BOOST_CHECK_EQUAL(grid1D->axes().size(), 1);
0073 auto axis1D =
0074 dynamic_cast<const Acts::Axis<Acts::AxisType::Equidistant, Bound>*>(
0075 grid1D->axes().front());
0076 BOOST_CHECK(axis1D != nullptr);
0077
0078
0079 Acts::ProtoAxis epao(Open, 0., 2.0, 10.);
0080 BOOST_CHECK_EQUAL(epao.getAxis().getBoundaryType(), Open);
0081
0082
0083 ACTS_PUSH_IGNORE_DEPRECATED()
0084 auto grid2D = Acts::makeGrid<double>(epab, epao);
0085 ACTS_POP_IGNORE_DEPRECATED()
0086 BOOST_CHECK(grid2D != nullptr);
0087 auto grid2Daxes = grid2D->axes();
0088 BOOST_CHECK_EQUAL(grid2Daxes.size(), 2);
0089 auto axis2D1 =
0090 dynamic_cast<const Acts::Axis<Acts::AxisType::Equidistant, Bound>*>(
0091 grid2Daxes[0]);
0092 BOOST_CHECK(axis2D1 != nullptr);
0093 auto axis2D2 =
0094 dynamic_cast<const Acts::Axis<Acts::AxisType::Equidistant, Open>*>(
0095 grid2Daxes[1]);
0096 BOOST_CHECK(axis2D2 != nullptr);
0097
0098
0099 BOOST_CHECK_THROW(Acts::ProtoAxis(Bound, 1.0, 0.0, 10),
0100 std::invalid_argument);
0101
0102
0103 BOOST_CHECK_THROW(Acts::ProtoAxis(Bound, 0.0, 1.0, 0), std::invalid_argument);
0104 }
0105
0106 BOOST_AUTO_TEST_CASE(AutorangeProtoAxis) {
0107 using enum Acts::AxisBoundaryType;
0108 using enum Acts::AxisType;
0109
0110
0111 Acts::ProtoAxis epa(Bound, 10);
0112
0113
0114 BOOST_CHECK(epa.isAutorange());
0115
0116
0117 BOOST_CHECK(epa.getAxis().isEquidistant());
0118
0119 BOOST_CHECK(!epa.getAxis().isVariable());
0120
0121 BOOST_CHECK_EQUAL(epa.getAxis().getType(), Equidistant);
0122
0123 BOOST_CHECK_EQUAL(epa.getAxis().getBoundaryType(), Bound);
0124
0125 BOOST_CHECK_EQUAL(epa.getAxis().getNBins(), 10);
0126
0127 std::string rString =
0128 "ProtoAxis: 10 bins, equidistant within automatic range";
0129 std::string oString = epa.toString();
0130 BOOST_CHECK_EQUAL(rString, oString);
0131
0132
0133 Acts::ProtoAxis epaCopy(epa);
0134 BOOST_CHECK_EQUAL(epaCopy.isAutorange(), epa.isAutorange());
0135 BOOST_CHECK(epaCopy.getAxis() == epa.getAxis());
0136
0137
0138 Acts::ProtoAxis epaAssign(Bound, 0.0, 50.0, 20);
0139 epaAssign = epa;
0140 BOOST_CHECK_EQUAL(epaAssign.isAutorange(), epa.isAutorange());
0141 BOOST_CHECK(epaAssign.getAxis() == epa.getAxis());
0142
0143
0144 ACTS_PUSH_IGNORE_DEPRECATED()
0145 BOOST_CHECK_THROW(Acts::makeGrid<double>(epa), std::invalid_argument);
0146 ACTS_POP_IGNORE_DEPRECATED()
0147
0148
0149 Acts::ProtoAxis epao(Open, 0., 2.0, 10.);
0150 ACTS_PUSH_IGNORE_DEPRECATED()
0151 BOOST_CHECK_THROW(Acts::makeGrid<double>(epao, epa), std::invalid_argument);
0152 BOOST_CHECK_THROW(Acts::makeGrid<double>(epa, epao), std::invalid_argument);
0153 ACTS_POP_IGNORE_DEPRECATED()
0154
0155
0156 epa.setRange(0.0, 20.0);
0157 BOOST_CHECK(!epa.isAutorange());
0158 BOOST_CHECK_EQUAL(epa.getAxis().getBin(7.9), 4);
0159
0160
0161 ACTS_PUSH_IGNORE_DEPRECATED()
0162 BOOST_CHECK_NO_THROW(Acts::makeGrid<double>(epa));
0163 ACTS_POP_IGNORE_DEPRECATED()
0164
0165
0166 ACTS_PUSH_IGNORE_DEPRECATED()
0167 BOOST_CHECK_NO_THROW(Acts::makeGrid<double>(epa, epao));
0168 ACTS_POP_IGNORE_DEPRECATED()
0169
0170
0171 BOOST_CHECK_THROW(epa.setRange(20.0, 0.0), std::invalid_argument);
0172 }
0173
0174 BOOST_AUTO_TEST_CASE(VariableProtoAxis) {
0175 using enum Acts::AxisBoundaryType;
0176 using enum Acts::AxisType;
0177
0178
0179 Acts::ProtoAxis vpab(Bound, {0.0, 1.0, 10});
0180
0181
0182 BOOST_CHECK(!vpab.isAutorange());
0183
0184
0185 BOOST_CHECK(!vpab.getAxis().isEquidistant());
0186
0187 BOOST_CHECK(vpab.getAxis().isVariable());
0188
0189 auto edges = vpab.getAxis().getBinEdges();
0190 BOOST_CHECK_EQUAL(edges.size(), 3);
0191
0192 BOOST_CHECK_EQUAL(vpab.getAxis().getType(), Variable);
0193
0194 BOOST_CHECK_EQUAL(vpab.getAxis().getBoundaryType(), Bound);
0195
0196 BOOST_CHECK_EQUAL(vpab.getAxis().getNBins(), 2);
0197
0198 BOOST_CHECK_EQUAL(vpab.getAxis().getBin(0.2), 1);
0199 BOOST_CHECK_EQUAL(vpab.getAxis().getBin(5.0), 2);
0200
0201 CHECK_CLOSE_ABS(vpab.getAxis().getMin(), 0.0, 1e-15);
0202
0203 CHECK_CLOSE_ABS(vpab.getAxis().getMax(), 10.0, 1e-15);
0204
0205 std::string rString = "ProtoAxis: 2 bins, variable within [0, 10]";
0206 std::string oString = vpab.toString();
0207 BOOST_CHECK_EQUAL(rString, oString);
0208
0209
0210 Acts::ProtoAxis vpabCopy(vpab);
0211 BOOST_CHECK_EQUAL(vpabCopy.isAutorange(), vpab.isAutorange());
0212 BOOST_CHECK(vpabCopy.getAxis() == vpab.getAxis());
0213
0214
0215 Acts::ProtoAxis vpabAssign(Bound, 0.0, 50.0, 20);
0216 vpabAssign = vpab;
0217 BOOST_CHECK_EQUAL(vpabAssign.isAutorange(), vpab.isAutorange());
0218 BOOST_CHECK(vpabAssign.getAxis() == vpab.getAxis());
0219
0220
0221 vpab.setRange(0.5, 9.5);
0222
0223 BOOST_CHECK_EQUAL(vpab.getAxis().getNBins(), 2);
0224 CHECK_CLOSE_ABS(vpab.getAxis().getMin(), 0.5, 1e-15);
0225 CHECK_CLOSE_ABS(vpab.getAxis().getMax(), 9.5, 1e-15);
0226
0227
0228 BOOST_CHECK_THROW(Acts::ProtoAxis(Bound, std::vector<double>{2.}),
0229 std::invalid_argument);
0230
0231
0232 BOOST_CHECK_THROW(Acts::ProtoAxis(Bound, {3., 2., 1}), std::invalid_argument);
0233 }
0234
0235 BOOST_AUTO_TEST_CASE(DirectedProtoAxisOfAllSorts) {
0236 using enum Acts::AxisBoundaryType;
0237 using enum Acts::AxisDirection;
0238 using enum Acts::AxisType;
0239
0240
0241 Acts::DirectedProtoAxis vpab(AxisX, Bound, {0.0, 1.0, 10});
0242 BOOST_CHECK(vpab.getAxisDirection() == AxisX);
0243 std::string rvString =
0244 "DirectedProtoAxis: 2 bins in AxisX, variable within [0, 10]";
0245 std::string ovString = vpab.toString();
0246 BOOST_CHECK_EQUAL(rvString, ovString);
0247
0248
0249 Acts::DirectedProtoAxis epa(AxisY, Bound, 10);
0250 BOOST_CHECK(epa.getAxisDirection() == AxisY);
0251 BOOST_CHECK(epa.getAxis().isEquidistant());
0252 BOOST_CHECK(epa.isAutorange());
0253 std::string reString =
0254 "DirectedProtoAxis: 10 bins in AxisY, equidistant within automatic range";
0255 std::string oeString = epa.toString();
0256 BOOST_CHECK_EQUAL(reString, oeString);
0257
0258
0259 Acts::DirectedProtoAxis epab(AxisZ, Bound, 0.0, 1.0, 10);
0260 BOOST_CHECK(epab.getAxisDirection() == AxisZ);
0261 BOOST_CHECK(epab.getAxis().isEquidistant());
0262 BOOST_CHECK(!epab.isAutorange());
0263 std::string rString =
0264 "DirectedProtoAxis: 10 bins in AxisZ, equidistant within [0, 1]";
0265 std::string oString = epab.toString();
0266 BOOST_CHECK_EQUAL(rString, oString);
0267 }
0268
0269 BOOST_AUTO_TEST_SUITE_END()
0270
0271 }