File indexing completed on 2025-10-23 08:24:01
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/unit_test.hpp>
0010
0011 #include "Acts/Clusterization/TimedClusterization.hpp"
0012
0013 #include <algorithm>
0014
0015 using namespace Acts;
0016
0017
0018 using Identifier = std::size_t;
0019 struct Cell {
0020 Cell(Identifier identifier, int c, int r, double t)
0021 : id(identifier), column(c), row(r), time(t) {}
0022
0023 Identifier id{};
0024 int column{0};
0025 int row{0};
0026 int label{-1};
0027 double time{0.};
0028 };
0029
0030 struct Cluster {
0031 std::vector<Identifier> ids{};
0032 };
0033
0034 using CellCollection = std::vector<Cell>;
0035 using ClusterCollection = std::vector<Cluster>;
0036
0037
0038 static inline int getCellRow(const Cell& cell) {
0039 return cell.row;
0040 }
0041
0042 static inline int getCellColumn(const Cell& cell) {
0043 return cell.column;
0044 }
0045
0046 static inline double getCellTime(const Cell& cell) {
0047 return cell.time;
0048 }
0049
0050 static void clusterAddCell(Cluster& cl, const Cell& cell) {
0051 cl.ids.push_back(cell.id);
0052 }
0053
0054 BOOST_AUTO_TEST_SUITE(ClusterizationSuite)
0055
0056 BOOST_AUTO_TEST_CASE(TimedGrid_1D_withtime) {
0057
0058
0059
0060
0061
0062
0063 std::vector<Cell> cells;
0064
0065 cells.emplace_back(0ul, 0, -1, 0);
0066 cells.emplace_back(1ul, 1, -1, 0);
0067 cells.emplace_back(2ul, 2, -1, 0);
0068 cells.emplace_back(3ul, 5, -1, 0);
0069 cells.emplace_back(4ul, 8, -1, 0);
0070 cells.emplace_back(5ul, 9, -1, 0);
0071
0072 cells.emplace_back(6ul, 3, 0, 1);
0073 cells.emplace_back(7ul, 6, 1, 1);
0074 cells.emplace_back(8ul, 7, 1, 1);
0075
0076 std::vector<std::vector<Identifier>> expectedResults;
0077 expectedResults.push_back({0ul, 1ul, 2ul});
0078 expectedResults.push_back({6ul});
0079 expectedResults.push_back({3ul});
0080 expectedResults.push_back({7ul, 8ul});
0081 expectedResults.push_back({4ul, 5ul});
0082
0083 Acts::Ccl::ClusteringData data;
0084 ClusterCollection clusters;
0085 Acts::Ccl::createClusters<CellCollection, ClusterCollection, 1>(
0086 data, cells, clusters, Acts::Ccl::TimedConnect<Cell, 1>(0.5));
0087
0088 BOOST_CHECK_EQUAL(5ul, clusters.size());
0089
0090 for (std::size_t i(0); i < clusters.size(); ++i) {
0091 std::vector<Identifier>& timedIds = clusters[i].ids;
0092 const std::vector<Identifier>& expected = expectedResults[i];
0093 std::ranges::sort(timedIds);
0094 BOOST_CHECK_EQUAL(timedIds.size(), expected.size());
0095
0096 for (std::size_t j(0); j < timedIds.size(); ++j) {
0097 BOOST_CHECK_EQUAL(timedIds[j], expected[j]);
0098 }
0099 }
0100 }
0101
0102 BOOST_AUTO_TEST_CASE(TimedGrid_2D_notime) {
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112 std::vector<Cell> cells;
0113 cells.emplace_back(0ul, 0, 0, 0);
0114 cells.emplace_back(1ul, 3, 0, 0);
0115 cells.emplace_back(2ul, 3, 1, 0);
0116 cells.emplace_back(3ul, 0, 2, 0);
0117 cells.emplace_back(4ul, 1, 2, 0);
0118 cells.emplace_back(5ul, 0, 3, 0);
0119 cells.emplace_back(6ul, 3, 3, 0);
0120
0121 std::vector<std::vector<Identifier>> expectedResults;
0122 expectedResults.push_back({0ul});
0123 expectedResults.push_back({3ul, 4ul, 5ul});
0124 expectedResults.push_back({1ul, 2ul});
0125 expectedResults.push_back({6ul});
0126
0127 Acts::Ccl::ClusteringData data;
0128 ClusterCollection clusters;
0129 Acts::Ccl::createClusters<CellCollection, ClusterCollection, 2>(
0130 data, cells, clusters,
0131 Acts::Ccl::TimedConnect<Cell, 2>(std::numeric_limits<double>::max()));
0132
0133 BOOST_CHECK_EQUAL(4ul, clusters.size());
0134
0135
0136 data.clear();
0137 ClusterCollection defaultClusters;
0138 Acts::Ccl::createClusters<CellCollection, ClusterCollection, 2>(
0139 data, cells, defaultClusters, Acts::Ccl::DefaultConnect<Cell, 2>());
0140
0141 BOOST_CHECK_EQUAL(4ul, defaultClusters.size());
0142 BOOST_CHECK_EQUAL(defaultClusters.size(), expectedResults.size());
0143
0144 std::vector<std::size_t> sizes{1, 3, 2, 1};
0145 for (std::size_t i(0); i < clusters.size(); ++i) {
0146 std::vector<Identifier>& timedIds = clusters[i].ids;
0147 std::vector<Identifier>& defaultIds = defaultClusters[i].ids;
0148 const std::vector<Identifier>& expected = expectedResults[i];
0149 BOOST_CHECK_EQUAL(timedIds.size(), defaultIds.size());
0150 BOOST_CHECK_EQUAL(timedIds.size(), sizes[i]);
0151 BOOST_CHECK_EQUAL(timedIds.size(), expected.size());
0152
0153 std::ranges::sort(timedIds);
0154 std::ranges::sort(defaultIds);
0155 for (std::size_t j(0); j < timedIds.size(); ++j) {
0156 BOOST_CHECK_EQUAL(timedIds[j], defaultIds[j]);
0157 BOOST_CHECK_EQUAL(timedIds[j], expected[j]);
0158 }
0159 }
0160 }
0161
0162 BOOST_AUTO_TEST_CASE(TimedGrid_2D_withtime) {
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172 std::vector<Cell> cells;
0173
0174 cells.emplace_back(0ul, 0, 0, 0);
0175 cells.emplace_back(1ul, 3, 0, 0);
0176 cells.emplace_back(2ul, 3, 1, 0);
0177 cells.emplace_back(3ul, 0, 2, 0);
0178 cells.emplace_back(4ul, 1, 2, 0);
0179 cells.emplace_back(5ul, 0, 3, 0);
0180 cells.emplace_back(6ul, 3, 3, 0);
0181
0182 cells.emplace_back(7ul, 1, 0, 1);
0183 cells.emplace_back(8ul, 1, 1, 1);
0184 cells.emplace_back(9ul, 2, 1, 1);
0185
0186 cells.emplace_back(10ul, 2, 2, 2);
0187 cells.emplace_back(11ul, 3, 2, 2);
0188
0189 std::vector<std::vector<Identifier>> expectedResults;
0190 expectedResults.push_back({0ul});
0191 expectedResults.push_back({3ul, 4ul, 5ul});
0192 expectedResults.push_back({7ul, 8ul, 9ul});
0193 expectedResults.push_back({10ul, 11ul});
0194 expectedResults.push_back({1ul, 2ul});
0195 expectedResults.push_back({6ul});
0196
0197 Acts::Ccl::ClusteringData data;
0198 ClusterCollection clusters;
0199 Acts::Ccl::createClusters<CellCollection, ClusterCollection, 2>(
0200 data, cells, clusters, Acts::Ccl::TimedConnect<Cell, 2>(0.5));
0201
0202 BOOST_CHECK_EQUAL(6ul, clusters.size());
0203
0204 std::vector<std::size_t> sizes{1, 3, 3, 2, 2, 1};
0205 for (std::size_t i(0); i < clusters.size(); ++i) {
0206 std::vector<Identifier>& timedIds = clusters[i].ids;
0207 BOOST_CHECK_EQUAL(timedIds.size(), sizes[i]);
0208 std::ranges::sort(timedIds);
0209
0210 const std::vector<Identifier>& expected = expectedResults[i];
0211 BOOST_CHECK_EQUAL(timedIds.size(), expected.size());
0212
0213 for (std::size_t j(0); j < timedIds.size(); ++j) {
0214 BOOST_CHECK_EQUAL(timedIds[j], expected[j]);
0215 }
0216 }
0217 }
0218
0219 BOOST_AUTO_TEST_CASE(TimedGrid_2D_noTollerance) {
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230 std::vector<Cell> cells;
0231 cells.emplace_back(0ul, 0, 0, 0);
0232 cells.emplace_back(1ul, 3, 0, 0);
0233 cells.emplace_back(2ul, 3, 1, 0);
0234 cells.emplace_back(3ul, 0, 2, 0);
0235 cells.emplace_back(4ul, 1, 2, 0);
0236 cells.emplace_back(5ul, 0, 3, 0);
0237 cells.emplace_back(6ul, 3, 3, 0);
0238
0239 std::vector<std::vector<Identifier>> expectedResults;
0240 expectedResults.push_back({0ul});
0241 expectedResults.push_back({3ul});
0242 expectedResults.push_back({5ul});
0243 expectedResults.push_back({4ul});
0244 expectedResults.push_back({1ul});
0245 expectedResults.push_back({2ul});
0246 expectedResults.push_back({6ul});
0247
0248 Acts::Ccl::ClusteringData data;
0249 ClusterCollection clusters;
0250 Acts::Ccl::createClusters<CellCollection, ClusterCollection, 2>(
0251 data, cells, clusters, Acts::Ccl::TimedConnect<Cell, 2>(0.));
0252
0253 BOOST_CHECK_EQUAL(7ul, clusters.size());
0254
0255 for (std::size_t i(0); i < clusters.size(); ++i) {
0256 std::vector<Identifier>& timedIds = clusters[i].ids;
0257 const std::vector<Identifier>& expected = expectedResults[i];
0258
0259 BOOST_CHECK_EQUAL(timedIds.size(), 1);
0260 BOOST_CHECK_EQUAL(timedIds.size(), expected.size());
0261 BOOST_CHECK_EQUAL(timedIds[0], expected[0]);
0262 }
0263 }
0264
0265 BOOST_AUTO_TEST_SUITE_END()