File indexing completed on 2025-10-18 08:22:57
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/Definitions/TrackParametrization.hpp"
0013 #include "Acts/Definitions/Units.hpp"
0014 #include "Acts/EventData/GenericBoundTrackParameters.hpp"
0015 #include "Acts/EventData/TrackParameters.hpp"
0016 #include "Acts/Geometry/GeometryContext.hpp"
0017 #include "Acts/Surfaces/PerigeeSurface.hpp"
0018 #include "Acts/Surfaces/Surface.hpp"
0019 #include "Acts/Utilities/Result.hpp"
0020 #include "Acts/Vertexing/GaussianGridTrackDensity.hpp"
0021
0022 #include <algorithm>
0023 #include <cstddef>
0024 #include <memory>
0025 #include <optional>
0026 #include <utility>
0027
0028 using namespace Acts;
0029 using namespace Acts::UnitLiterals;
0030
0031 namespace ActsTests {
0032
0033 using Covariance = BoundSquareMatrix;
0034
0035
0036 GeometryContext geoContext = GeometryContext();
0037
0038 BOOST_AUTO_TEST_SUITE(VertexingSuite)
0039
0040 BOOST_AUTO_TEST_CASE(gaussian_grid_density_test) {
0041
0042 constexpr std::size_t mainGridSize = 400;
0043 constexpr std::size_t trkGridSize = 15;
0044
0045 using Grid = GaussianGridTrackDensity;
0046
0047 double binSize = 0.1;
0048 double zMinMax = mainGridSize / 2 * binSize;
0049
0050
0051 Grid::Config cfg(zMinMax, mainGridSize, trkGridSize);
0052 Grid grid(cfg);
0053
0054
0055 Covariance covMat;
0056 covMat << 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0,
0057 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1;
0058
0059 BoundVector paramVec1;
0060 paramVec1 << 0.01, 0.15, 0, 0, 0, 0;
0061
0062 BoundVector paramVec2;
0063 paramVec2 << trkGridSize * binSize - 0.1, 0.15, 0, 0, 0, 0;
0064
0065 BoundVector paramVec3;
0066 paramVec3 << trkGridSize * binSize + 0.01, 0.15, 0, 0, 0, 0;
0067
0068 BoundVector paramVec3_1;
0069 paramVec3_1 << -(trkGridSize * binSize + 0.01), 0.15, 0, 0, 0, 0;
0070
0071 BoundVector paramVec4;
0072 paramVec4 << 0.01, 19.95, 0, 0, 0, 0;
0073
0074 BoundVector paramVec5;
0075 paramVec5 << 0.01, -19.95, 0, 0, 0, 0;
0076
0077 BoundVector paramVec6;
0078 paramVec6 << 0.01, -100.0, 0, 0, 0, 0;
0079
0080 BoundVector paramVec7;
0081 paramVec7 << 0.01, +100.0, 0, 0, 0, 0;
0082
0083
0084 std::shared_ptr<PerigeeSurface> perigeeSurface =
0085 Surface::makeShared<PerigeeSurface>(Vector3(0., 0., 0.));
0086
0087 BoundTrackParameters params1(perigeeSurface, paramVec1, covMat,
0088 ParticleHypothesis::pion());
0089 BoundTrackParameters params2(perigeeSurface, paramVec2, covMat,
0090 ParticleHypothesis::pion());
0091 BoundTrackParameters params3(perigeeSurface, paramVec3, covMat,
0092 ParticleHypothesis::pion());
0093 BoundTrackParameters params3_1(perigeeSurface, paramVec3_1, covMat,
0094 ParticleHypothesis::pion());
0095 BoundTrackParameters params4(perigeeSurface, paramVec4, covMat,
0096 ParticleHypothesis::pion());
0097 BoundTrackParameters params5(perigeeSurface, paramVec5, covMat,
0098 ParticleHypothesis::pion());
0099 BoundTrackParameters params6(perigeeSurface, paramVec6, covMat,
0100 ParticleHypothesis::pion());
0101 BoundTrackParameters params7(perigeeSurface, paramVec7, covMat,
0102 ParticleHypothesis::pion());
0103
0104
0105 Grid::MainGridVector mainGrid = Grid::MainGridVector::Zero(mainGridSize);
0106
0107
0108
0109 std::pair<int, Grid::TrackGridVector> binAndTrackGrid;
0110
0111
0112 binAndTrackGrid = grid.addTrack(params3, mainGrid);
0113 binAndTrackGrid = grid.addTrack(params3_1, mainGrid);
0114
0115 binAndTrackGrid = grid.addTrack(params6, mainGrid);
0116 binAndTrackGrid = grid.addTrack(params7, mainGrid);
0117
0118
0119
0120 auto zeroGrid = Grid::MainGridVector::Zero(mainGridSize);
0121 BOOST_CHECK_EQUAL(mainGrid, zeroGrid);
0122
0123
0124 binAndTrackGrid = grid.addTrack(params1, mainGrid);
0125 auto gridCopy = mainGrid;
0126
0127 mainGrid = Grid::MainGridVector::Zero(mainGridSize);
0128 binAndTrackGrid = grid.addTrack(params2, mainGrid);
0129
0130
0131
0132 BOOST_CHECK_GT(gridCopy.sum(), mainGrid.sum());
0133
0134
0135
0136 binAndTrackGrid = grid.addTrack(params1, mainGrid);
0137 BOOST_CHECK_EQUAL(gridCopy.sum(), mainGrid.sum());
0138
0139 binAndTrackGrid = grid.addTrack(params4, mainGrid);
0140
0141
0142 BOOST_CHECK_EQUAL(
0143 mainGrid(mainGridSize - static_cast<int>((trkGridSize - 1) / 2) - 2), 0.);
0144 BOOST_CHECK_GT(
0145 mainGrid(mainGridSize - static_cast<int>((trkGridSize - 1) / 2) - 1), 0.);
0146 BOOST_CHECK_GT(mainGrid(mainGridSize - 1), 0.);
0147
0148 binAndTrackGrid = grid.addTrack(params5, mainGrid);
0149
0150 BOOST_CHECK_EQUAL(mainGrid(static_cast<int>((trkGridSize - 1) / 2) + 1), 0.);
0151 BOOST_CHECK_GT(mainGrid(static_cast<int>((trkGridSize - 1) / 2)), 0.);
0152 BOOST_CHECK_GT(mainGrid(0), 0.);
0153
0154
0155 auto maxRes = grid.getMaxZPosition(mainGrid);
0156 int maxBin = static_cast<int>((*maxRes / binSize) + mainGridSize / 2);
0157 BOOST_CHECK_EQUAL(maxBin, 0);
0158
0159
0160 mainGrid = Grid::MainGridVector::Zero(mainGridSize);
0161 auto maxResErr = grid.getMaxZPosition(mainGrid);
0162 BOOST_CHECK(!maxResErr.ok());
0163
0164
0165 binAndTrackGrid = grid.addTrack(params1, mainGrid);
0166 binAndTrackGrid = grid.addTrack(params2, mainGrid);
0167
0168 gridCopy = mainGrid;
0169 binAndTrackGrid = grid.addTrack(params4, mainGrid);
0170
0171 BOOST_CHECK_NE(gridCopy, mainGrid);
0172
0173 int zBin = binAndTrackGrid.first;
0174 auto trackGrid = binAndTrackGrid.second;
0175 grid.removeTrackGridFromMainGrid(zBin, trackGrid, mainGrid);
0176
0177 BOOST_CHECK_EQUAL(gridCopy, mainGrid);
0178 }
0179
0180
0181 BOOST_AUTO_TEST_CASE(gaussian_grid_sum_max_densitytest) {
0182
0183 constexpr int mainGridSize = 50;
0184 constexpr int trkGridSize = 11;
0185
0186 using Grid = Acts::GaussianGridTrackDensity;
0187
0188 double binSize = 0.1;
0189 double zMinMax = mainGridSize / 2 * binSize;
0190
0191
0192 Grid::Config cfg(zMinMax, mainGridSize, trkGridSize);
0193 cfg.useHighestSumZPosition = true;
0194 Grid grid(cfg);
0195
0196
0197 Covariance covMat;
0198 covMat << 1e-2, 0, 0, 0, 0, 0, 0, 1e-2, 0, 0, 0, 0, 0, 0, 1e-2, 0, 0, 0, 0, 0,
0199 0, 1e-2, 0, 0, 0, 0, 0, 0, 1e-2, 0, 0, 0, 0, 0, 0, 1e-2;
0200
0201 const double posZ1 = -1.75;
0202 const double posZ2 = 1.75;
0203
0204
0205
0206 BoundVector paramVec1;
0207 paramVec1 << 0.01, posZ1, 0, 0, 0, 0;
0208 BoundVector paramVec2;
0209 paramVec2 << 0.015, posZ2, 0, 0, 0, 0;
0210
0211
0212 std::shared_ptr<PerigeeSurface> perigeeSurface =
0213 Surface::makeShared<PerigeeSurface>(Vector3(0., 0., 0.));
0214
0215 BoundTrackParameters params1(perigeeSurface, paramVec1, covMat,
0216 ParticleHypothesis::pion());
0217 BoundTrackParameters params2(perigeeSurface, paramVec2, covMat,
0218 ParticleHypothesis::pion());
0219
0220
0221 Grid::MainGridVector mainGrid = Grid::MainGridVector::Zero(mainGridSize);
0222
0223
0224
0225 std::pair<int, Grid::TrackGridVector> binAndTrackGrid;
0226
0227 binAndTrackGrid = grid.addTrack(params1, mainGrid);
0228 binAndTrackGrid = grid.addTrack(params2, mainGrid);
0229
0230
0231 int maxZbin = static_cast<int>((posZ2 / binSize + mainGridSize / 2.));
0232 mainGrid(maxZbin - 1) += 1;
0233 mainGrid(maxZbin + 1) += 1;
0234
0235
0236
0237
0238 auto maxRes = grid.getMaxZPosition(mainGrid);
0239 BOOST_CHECK(maxRes.ok());
0240 BOOST_CHECK_EQUAL(*maxRes, posZ2);
0241 }
0242
0243
0244 BOOST_AUTO_TEST_CASE(gaussian_grid_seed_width_test) {
0245
0246 constexpr int mainGridSize = 50;
0247 constexpr int trkGridSize = 11;
0248
0249 using Grid = Acts::GaussianGridTrackDensity;
0250
0251 double binSize = 0.1;
0252 double zMinMax = mainGridSize / 2 * binSize;
0253
0254
0255 Grid::Config cfg(zMinMax, mainGridSize, trkGridSize);
0256 cfg.useHighestSumZPosition = true;
0257 Grid grid(cfg);
0258
0259
0260 Covariance covMat;
0261 covMat << 1e-2, 0, 0, 0, 0, 0, 0, 1e-2, 0, 0, 0, 0, 0, 0, 1e-2, 0, 0, 0, 0, 0,
0262 0, 1e-2, 0, 0, 0, 0, 0, 0, 1e-2, 0, 0, 0, 0, 0, 0, 1e-2;
0263
0264 const double posZ1 = -1.75;
0265 const double posZ2 = 1.75;
0266
0267
0268
0269 BoundVector paramVec1;
0270 paramVec1 << 0.01, posZ1, 0, 0, 0, 0;
0271 BoundVector paramVec2;
0272 paramVec2 << 0.015, posZ2, 0, 0, 0, 0;
0273
0274
0275 std::shared_ptr<PerigeeSurface> perigeeSurface =
0276 Surface::makeShared<PerigeeSurface>(Vector3(0., 0., 0.));
0277
0278 BoundTrackParameters params1(perigeeSurface, paramVec1, covMat,
0279 ParticleHypothesis::pion());
0280 BoundTrackParameters params2(perigeeSurface, paramVec2, covMat,
0281 ParticleHypothesis::pion());
0282
0283
0284 Grid::MainGridVector mainGrid = Grid::MainGridVector::Zero(mainGridSize);
0285
0286
0287
0288 std::pair<int, Grid::TrackGridVector> binAndTrackGrid;
0289
0290 binAndTrackGrid = grid.addTrack(params1, mainGrid);
0291 binAndTrackGrid = grid.addTrack(params2, mainGrid);
0292
0293
0294 int maxZbin = static_cast<int>((posZ2 / binSize + mainGridSize / 2.));
0295 mainGrid(maxZbin - 1) += 1;
0296 mainGrid(maxZbin + 1) += 1;
0297
0298
0299
0300
0301
0302 auto maxRes = grid.getMaxZPositionAndWidth(mainGrid);
0303 BOOST_CHECK(maxRes.ok());
0304 double z = (*maxRes).first;
0305 double width = (*maxRes).second;
0306
0307 BOOST_CHECK_EQUAL(z, posZ2);
0308
0309 BOOST_CHECK_NE(width, 0.);
0310 }
0311
0312 BOOST_AUTO_TEST_SUITE_END()
0313
0314 }