File indexing completed on 2025-08-06 08:11:23
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/Material/AccumulatedVolumeMaterial.hpp"
0013 #include "Acts/Material/Material.hpp"
0014 #include "Acts/Material/MaterialGridHelper.hpp"
0015 #include "Acts/Material/MaterialSlab.hpp"
0016 #include "Acts/Tests/CommonHelpers/FloatComparisons.hpp"
0017 #include "Acts/Utilities/BinUtility.hpp"
0018 #include "Acts/Utilities/BinningType.hpp"
0019 #include "Acts/Utilities/Grid.hpp"
0020 #include "Acts/Utilities/detail/Axis.hpp"
0021 #include "Acts/Utilities/detail/AxisFwd.hpp"
0022
0023 #include <cmath>
0024 #include <functional>
0025 #include <memory>
0026 #include <utility>
0027 #include <vector>
0028
0029 namespace Acts::Test {
0030
0031 using EAxis = Acts::detail::EquidistantAxis;
0032 using Grid2D = Acts::Grid<Acts::AccumulatedVolumeMaterial, EAxis, EAxis>;
0033 using Grid3D = Acts::Grid<Acts::AccumulatedVolumeMaterial, EAxis, EAxis, EAxis>;
0034 using MaterialGrid2D =
0035 Acts::Grid<Acts::Material::ParametersVector, EAxis, EAxis>;
0036 using MaterialGrid3D =
0037 Acts::Grid<Acts::Material::ParametersVector, EAxis, EAxis, EAxis>;
0038
0039
0040
0041 BOOST_AUTO_TEST_CASE(Square_Grid_test) {
0042 BinUtility bu(7, -3., 3., open, binX);
0043 bu += BinUtility(3, -2., 2., open, binY);
0044 auto bd = bu.binningData();
0045 std::function<Acts::Vector2(Acts::Vector3)> transfoGlobalToLocal;
0046
0047 Grid2D Grid = createGrid2D(bu, transfoGlobalToLocal);
0048
0049
0050 Acts::Vector3 pos(1., 2., 3.);
0051 Acts::Vector2 pos_2d(1., 2.);
0052 BOOST_CHECK_EQUAL(pos_2d, transfoGlobalToLocal(pos));
0053
0054
0055 BOOST_CHECK_EQUAL(Grid.dimensions(), 2);
0056
0057 BOOST_CHECK_EQUAL(Grid.numLocalBins()[0], bd[0].bins());
0058 BOOST_CHECK_EQUAL(Grid.numLocalBins()[1], bd[1].bins());
0059
0060 BOOST_CHECK_EQUAL(Grid.minPosition()[0], bd[0].min);
0061 BOOST_CHECK_EQUAL(Grid.minPosition()[1], bd[1].min);
0062
0063 float max1 =
0064 bd[0].max + std::fabs(bd[0].max - bd[0].min) / (bd[0].bins() - 1);
0065 float max2 =
0066 bd[1].max + std::fabs(bd[1].max - bd[1].min) / (bd[1].bins() - 1);
0067
0068 BOOST_CHECK_EQUAL(Grid.maxPosition()[0], max1);
0069 BOOST_CHECK_EQUAL(Grid.maxPosition()[1], max2);
0070
0071
0072 Grid2D::index_t index1 = {1, 1};
0073 Grid2D::index_t index2 = {7, 2};
0074 Grid2D::index_t index3 = {1, 3};
0075
0076 Acts::Vector3 pos1 = {-2.6, -1.5, -0.7};
0077 Acts::Vector3 pos2 = {2.8, 0, 0.2};
0078 Acts::Vector3 pos3 = {-2.7, 1.8, 0.8};
0079
0080 for (int i = 0; i < 2; i++) {
0081 BOOST_CHECK_EQUAL(
0082 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos1))[i],
0083 index1[i]);
0084 BOOST_CHECK_EQUAL(
0085 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos2))[i],
0086 index2[i]);
0087 BOOST_CHECK_EQUAL(
0088 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos3))[i],
0089 index3[i]);
0090 }
0091
0092
0093 std::vector<Acts::Vector3> vectPos1;
0094 vectPos1.push_back(pos1);
0095 std::vector<Acts::Vector3> vectPos2;
0096 vectPos2.push_back(pos2);
0097 std::vector<Acts::Vector3> vectPos3;
0098 vectPos3.push_back(pos3);
0099
0100 std::vector<std::pair<MaterialSlab, std::vector<Vector3>>> matRecord;
0101 Material mat1 = Material::fromMolarDensity(1., 2., 3., 4., 5.);
0102 Material mat2 = Material::fromMolarDensity(6., 7., 8., 9., 10.);
0103 Material vacuum;
0104
0105 MaterialSlab matprop1(mat1, 1);
0106 MaterialSlab matprop2(mat2, 1);
0107
0108 matRecord.clear();
0109 matRecord.push_back(std::make_pair(matprop1, vectPos1));
0110 matRecord.push_back(std::make_pair(matprop2, vectPos2));
0111
0112
0113 for (const auto& rm : matRecord) {
0114
0115 for (const auto& point : rm.second) {
0116
0117 Acts::Grid2D::index_t index =
0118 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(point));
0119 Grid.atLocalBins(index).accumulate(rm.first);
0120 }
0121 }
0122
0123 MaterialGrid2D matMap = mapMaterialPoints(Grid);
0124
0125 CHECK_CLOSE_REL(matMap.atLocalBins(index1), mat1.parameters(), 1e-4);
0126 CHECK_CLOSE_REL(matMap.atLocalBins(index2), mat2.parameters(), 1e-4);
0127 BOOST_CHECK_EQUAL(matMap.atLocalBins(index3), vacuum.parameters());
0128 }
0129
0130
0131
0132 BOOST_AUTO_TEST_CASE(PhiZ_Grid_test) {
0133 BinUtility bu(2, -2., 2., open, binZ);
0134 bu += BinUtility(3, -M_PI, M_PI, closed, binPhi);
0135 auto bd = bu.binningData();
0136 std::function<Acts::Vector2(Acts::Vector3)> transfoGlobalToLocal;
0137
0138 Grid2D Grid = createGrid2D(bu, transfoGlobalToLocal);
0139
0140
0141 Acts::Vector3 pos(1., 2., 3.);
0142
0143 CHECK_CLOSE_REL(transfoGlobalToLocal(pos)[1], atan2(2, 1), 1e-4);
0144 CHECK_CLOSE_REL(transfoGlobalToLocal(pos)[0], 3, 1e-4);
0145
0146
0147 BOOST_CHECK_EQUAL(Grid.dimensions(), 2);
0148
0149 BOOST_CHECK_EQUAL(Grid.numLocalBins()[0], bd[0].bins());
0150 BOOST_CHECK_EQUAL(Grid.numLocalBins()[1], bd[1].bins());
0151
0152 BOOST_CHECK_EQUAL(Grid.minPosition()[0], bd[0].min);
0153 BOOST_CHECK_EQUAL(Grid.minPosition()[1], bd[1].min);
0154
0155 float max1 =
0156 bd[0].max + std::fabs(bd[0].max - bd[0].min) / (bd[0].bins() - 1);
0157 float max2 =
0158 bd[1].max + std::fabs(bd[1].max - bd[1].min) / (bd[1].bins() - 1);
0159
0160 BOOST_CHECK_EQUAL(Grid.maxPosition()[0], max1);
0161 BOOST_CHECK_EQUAL(Grid.maxPosition()[1], max2);
0162
0163
0164 Grid2D::index_t index1 = {1, 1};
0165 Grid2D::index_t index2 = {1, 2};
0166 Grid2D::index_t index3 = {2, 3};
0167
0168 Acts::Vector3 pos1 = {-0.2, -1, -1};
0169 Acts::Vector3 pos2 = {3.6, 0., -1.5};
0170 Acts::Vector3 pos3 = {-1, 0.3, 0.8};
0171
0172 for (int i = 0; i < 2; i++) {
0173 BOOST_CHECK_EQUAL(
0174 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos1))[i],
0175 index1[i]);
0176 BOOST_CHECK_EQUAL(
0177 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos2))[i],
0178 index2[i]);
0179 BOOST_CHECK_EQUAL(
0180 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos3))[i],
0181 index3[i]);
0182 }
0183
0184
0185 std::vector<Acts::Vector3> vectPos1;
0186 vectPos1.push_back(pos1);
0187 std::vector<Acts::Vector3> vectPos2;
0188 vectPos2.push_back(pos2);
0189 std::vector<Acts::Vector3> vectPos3;
0190 vectPos3.push_back(pos3);
0191
0192 std::vector<std::pair<MaterialSlab, std::vector<Vector3>>> matRecord;
0193 Material mat1 = Material::fromMolarDensity(1., 2., 3., 4., 5.);
0194 Material mat2 = Material::fromMolarDensity(6., 7., 8., 9., 10.);
0195 Material vacuum;
0196
0197 MaterialSlab matprop1(mat1, 1);
0198 MaterialSlab matprop2(mat2, 1);
0199
0200 matRecord.clear();
0201 matRecord.push_back(std::make_pair(matprop1, vectPos1));
0202 matRecord.push_back(std::make_pair(matprop2, vectPos2));
0203
0204
0205 for (const auto& rm : matRecord) {
0206
0207 for (const auto& point : rm.second) {
0208
0209 Acts::Grid2D::index_t index =
0210 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(point));
0211 Grid.atLocalBins(index).accumulate(rm.first);
0212 }
0213 }
0214
0215 MaterialGrid2D matMap = mapMaterialPoints(Grid);
0216
0217 CHECK_CLOSE_REL(matMap.atLocalBins(index1), mat1.parameters(), 1e-4);
0218 CHECK_CLOSE_REL(matMap.atLocalBins(index2), mat2.parameters(), 1e-4);
0219 BOOST_CHECK_EQUAL(matMap.atLocalBins(index3), vacuum.parameters());
0220 }
0221
0222
0223 BOOST_AUTO_TEST_CASE(Cubic_Grid_test) {
0224 BinUtility bu(7, -3., 3., open, binX);
0225 bu += BinUtility(3, -2., 2., open, binY);
0226 bu += BinUtility(2, -1., 1., open, binZ);
0227 auto bd = bu.binningData();
0228 std::function<Acts::Vector3(Acts::Vector3)> transfoGlobalToLocal;
0229
0230 Grid3D Grid = createGrid3D(bu, transfoGlobalToLocal);
0231
0232
0233 Acts::Vector3 pos(1., 2., 3.);
0234 BOOST_CHECK_EQUAL(pos, transfoGlobalToLocal(pos));
0235
0236
0237 BOOST_CHECK_EQUAL(Grid.dimensions(), 3);
0238
0239 BOOST_CHECK_EQUAL(Grid.numLocalBins()[0], bd[0].bins());
0240 BOOST_CHECK_EQUAL(Grid.numLocalBins()[1], bd[1].bins());
0241 BOOST_CHECK_EQUAL(Grid.numLocalBins()[2], bd[2].bins());
0242
0243 BOOST_CHECK_EQUAL(Grid.minPosition()[0], bd[0].min);
0244 BOOST_CHECK_EQUAL(Grid.minPosition()[1], bd[1].min);
0245 BOOST_CHECK_EQUAL(Grid.minPosition()[2], bd[2].min);
0246
0247 float max1 =
0248 bd[0].max + std::fabs(bd[0].max - bd[0].min) / (bd[0].bins() - 1);
0249 float max2 =
0250 bd[1].max + std::fabs(bd[1].max - bd[1].min) / (bd[1].bins() - 1);
0251 float max3 =
0252 bd[2].max + std::fabs(bd[2].max - bd[2].min) / (bd[2].bins() - 1);
0253
0254 BOOST_CHECK_EQUAL(Grid.maxPosition()[0], max1);
0255 BOOST_CHECK_EQUAL(Grid.maxPosition()[1], max2);
0256 BOOST_CHECK_EQUAL(Grid.maxPosition()[2], max3);
0257
0258
0259 Grid3D::index_t index1 = {1, 1, 1};
0260 Grid3D::index_t index2 = {7, 2, 2};
0261 Grid3D::index_t index3 = {1, 3, 2};
0262
0263 Acts::Vector3 pos1 = {-2.6, -1.5, -0.7};
0264 Acts::Vector3 pos2 = {2.8, 0, 0.2};
0265 Acts::Vector3 pos3 = {-2.7, 1.8, 0.8};
0266
0267 for (int i = 0; i < 3; i++) {
0268 BOOST_CHECK_EQUAL(
0269 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos1))[i],
0270 index1[i]);
0271 BOOST_CHECK_EQUAL(
0272 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos2))[i],
0273 index2[i]);
0274 BOOST_CHECK_EQUAL(
0275 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos3))[i],
0276 index3[i]);
0277 }
0278
0279 std::vector<Acts::Vector3> vectPos1;
0280 vectPos1.push_back(pos1);
0281 std::vector<Acts::Vector3> vectPos2;
0282 vectPos2.push_back(pos2);
0283 std::vector<Acts::Vector3> vectPos3;
0284 vectPos3.push_back(pos3);
0285
0286 std::vector<std::pair<MaterialSlab, std::vector<Vector3>>> matRecord;
0287 Material mat1 = Material::fromMolarDensity(1., 2., 3., 4., 5.);
0288 Material mat2 = Material::fromMolarDensity(6., 7., 8., 9., 10.);
0289 Material vacuum;
0290
0291 MaterialSlab matprop1(mat1, 1);
0292 MaterialSlab matprop2(mat2, 1);
0293
0294 matRecord.clear();
0295 matRecord.push_back(std::make_pair(matprop1, vectPos1));
0296 matRecord.push_back(std::make_pair(matprop2, vectPos2));
0297
0298
0299 for (const auto& rm : matRecord) {
0300
0301 for (const auto& point : rm.second) {
0302
0303 Acts::Grid3D::index_t index =
0304 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(point));
0305 Grid.atLocalBins(index).accumulate(rm.first);
0306 }
0307 }
0308
0309 MaterialGrid3D matMap = mapMaterialPoints(Grid);
0310
0311 CHECK_CLOSE_REL(matMap.atLocalBins(index1), mat1.parameters(), 1e-4);
0312 CHECK_CLOSE_REL(matMap.atLocalBins(index2), mat2.parameters(), 1e-4);
0313 BOOST_CHECK_EQUAL(matMap.atLocalBins(index3), vacuum.parameters());
0314 }
0315
0316
0317 BOOST_AUTO_TEST_CASE(Cylindrical_Grid_test) {
0318 BinUtility bu(4, 1., 4., open, binR);
0319 bu += BinUtility(3, -M_PI, M_PI, closed, binPhi);
0320 bu += BinUtility(2, -2., 2., open, binZ);
0321 auto bd = bu.binningData();
0322 std::function<Acts::Vector3(Acts::Vector3)> transfoGlobalToLocal;
0323
0324 Grid3D Grid = createGrid3D(bu, transfoGlobalToLocal);
0325
0326
0327 Acts::Vector3 pos(1., 2., 3.);
0328
0329 CHECK_CLOSE_REL(transfoGlobalToLocal(pos)[0], sqrt(5), 1e-4);
0330 CHECK_CLOSE_REL(transfoGlobalToLocal(pos)[1], atan2(2, 1), 1e-4);
0331 CHECK_CLOSE_REL(transfoGlobalToLocal(pos)[2], 3, 1e-4);
0332
0333
0334 BOOST_CHECK_EQUAL(Grid.dimensions(), 3);
0335
0336 BOOST_CHECK_EQUAL(Grid.numLocalBins()[0], bd[0].bins());
0337 BOOST_CHECK_EQUAL(Grid.numLocalBins()[1], bd[1].bins());
0338 BOOST_CHECK_EQUAL(Grid.numLocalBins()[2], bd[2].bins());
0339
0340 BOOST_CHECK_EQUAL(Grid.minPosition()[0], bd[0].min);
0341 BOOST_CHECK_EQUAL(Grid.minPosition()[1], bd[1].min);
0342 BOOST_CHECK_EQUAL(Grid.minPosition()[2], bd[2].min);
0343
0344 float max1 =
0345 bd[0].max + std::fabs(bd[0].max - bd[0].min) / (bd[0].bins() - 1);
0346 float max2 =
0347 bd[1].max + std::fabs(bd[1].max - bd[1].min) / (bd[1].bins() - 1);
0348 float max3 =
0349 bd[2].max + std::fabs(bd[2].max - bd[2].min) / (bd[2].bins() - 1);
0350
0351 BOOST_CHECK_EQUAL(Grid.maxPosition()[0], max1);
0352 BOOST_CHECK_EQUAL(Grid.maxPosition()[1], max2);
0353 BOOST_CHECK_EQUAL(Grid.maxPosition()[2], max3);
0354
0355
0356 Grid3D::index_t index1 = {1, 1, 1};
0357 Grid3D::index_t index2 = {4, 2, 1};
0358 Grid3D::index_t index3 = {1, 3, 2};
0359
0360 Acts::Vector3 pos1 = {-0.2, -1, -1};
0361 Acts::Vector3 pos2 = {3.6, 0., -1.5};
0362 Acts::Vector3 pos3 = {-1, 0.3, 0.8};
0363
0364 for (int i = 0; i < 3; i++) {
0365 BOOST_CHECK_EQUAL(
0366 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos1))[i],
0367 index1[i]);
0368 BOOST_CHECK_EQUAL(
0369 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos2))[i],
0370 index2[i]);
0371 BOOST_CHECK_EQUAL(
0372 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(pos3))[i],
0373 index3[i]);
0374 }
0375
0376
0377 std::vector<Acts::Vector3> vectPos1;
0378 vectPos1.push_back(pos1);
0379 std::vector<Acts::Vector3> vectPos2;
0380 vectPos2.push_back(pos2);
0381 std::vector<Acts::Vector3> vectPos3;
0382 vectPos3.push_back(pos3);
0383
0384 std::vector<std::pair<MaterialSlab, std::vector<Vector3>>> matRecord;
0385 Material mat1 = Material::fromMolarDensity(1., 2., 3., 4., 5.);
0386 Material mat2 = Material::fromMolarDensity(6., 7., 8., 9., 10.);
0387 Material vacuum;
0388
0389 MaterialSlab matprop1(mat1, 1);
0390 MaterialSlab matprop2(mat2, 1);
0391
0392 matRecord.clear();
0393 matRecord.push_back(std::make_pair(matprop1, vectPos1));
0394 matRecord.push_back(std::make_pair(matprop2, vectPos2));
0395
0396
0397 for (const auto& rm : matRecord) {
0398
0399 for (const auto& point : rm.second) {
0400
0401 Acts::Grid3D::index_t index =
0402 Grid.localBinsFromLowerLeftEdge(transfoGlobalToLocal(point));
0403 Grid.atLocalBins(index).accumulate(rm.first);
0404 }
0405 }
0406
0407 MaterialGrid3D matMap = mapMaterialPoints(Grid);
0408
0409 CHECK_CLOSE_REL(matMap.atLocalBins(index1), mat1.parameters(), 1e-4);
0410 CHECK_CLOSE_REL(matMap.atLocalBins(index2), mat2.parameters(), 1e-4);
0411 BOOST_CHECK_EQUAL(matMap.atLocalBins(index3), vacuum.parameters());
0412 }
0413
0414 }