File indexing completed on 2026-07-16 08:08:37
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Acts/EventData/TrackContainer.hpp"
0010 #include "Acts/EventData/TrackStatePropMask.hpp"
0011 #include "Acts/EventData/TrackStateType.hpp"
0012 #include "Acts/EventData/VectorMultiTrajectory.hpp"
0013 #include "Acts/EventData/VectorTrackContainer.hpp"
0014 #include "Acts/EventData/detail/GenerateParameters.hpp"
0015 #include "Acts/Geometry/GeometryIdentifier.hpp"
0016 #include "Acts/Surfaces/PerigeeSurface.hpp"
0017 #include "Acts/Surfaces/PlaneSurface.hpp"
0018 #include "Acts/Surfaces/RectangleBounds.hpp"
0019 #include "Acts/Utilities/TrackHelpers.hpp"
0020
0021 #include <iostream>
0022 #include <numeric>
0023 #include <random>
0024 #include <type_traits>
0025
0026 using namespace Acts;
0027
0028 class BenchmarkSourceLink final {
0029 public:
0030 using Index = std::uint32_t;
0031
0032
0033 constexpr BenchmarkSourceLink(GeometryIdentifier gid, Index idx)
0034 : m_geometryId(gid), m_index(idx) {}
0035
0036 BenchmarkSourceLink() = default;
0037 BenchmarkSourceLink(const BenchmarkSourceLink&) = default;
0038 BenchmarkSourceLink(BenchmarkSourceLink&&) = default;
0039 BenchmarkSourceLink& operator=(const BenchmarkSourceLink&) = default;
0040 BenchmarkSourceLink& operator=(BenchmarkSourceLink&&) = default;
0041
0042
0043 constexpr Index index() const { return m_index; }
0044
0045 GeometryIdentifier geometryId() const { return m_geometryId; }
0046
0047 private:
0048 GeometryIdentifier m_geometryId;
0049 Index m_index = 0;
0050
0051 friend bool operator==(const BenchmarkSourceLink& lhs,
0052 const BenchmarkSourceLink& rhs) {
0053 return (lhs.geometryId() == rhs.geometryId()) &&
0054 (lhs.m_index == rhs.m_index);
0055 }
0056 };
0057
0058 int main(int , char** ) {
0059 std::size_t runs = 1000000;
0060 std::size_t nTracks = 10000;
0061
0062 VectorMultiTrajectory mtj;
0063 VectorTrackContainer vtc;
0064 TrackContainer tc{vtc, mtj};
0065
0066 VectorMultiTrajectory mtjOut;
0067 VectorTrackContainer vtcOut;
0068 TrackContainer output{vtcOut, mtjOut};
0069
0070 auto gid = GeometryIdentifier().withVolume(5).withLayer(3).withSensitive(1);
0071
0072 static_assert(sizeof(BenchmarkSourceLink) <= ACTS_SOURCELINK_SBO_SIZE);
0073
0074 static_assert(std::is_trivially_move_constructible_v<BenchmarkSourceLink>);
0075
0076 std::uniform_int_distribution<> nStatesDist(1, 20);
0077 std::uniform_int_distribution<> measDimDist(1, 3);
0078 std::uniform_real_distribution<> typeDist(0, 1);
0079 std::uniform_real_distribution<> copyDist(0, 1);
0080 std::mt19937 rng{42};
0081
0082 std::vector<std::shared_ptr<Surface>> surfaces;
0083 std::vector<std::pair<BoundVector, BoundMatrix>> parametersVector;
0084 for (std::size_t s = 0; s < 50; ++s) {
0085 surfaces.push_back(Surface::makeShared<PlaneSurface>(
0086 Transform3::Identity(), std::make_shared<RectangleBounds>(50, 50)));
0087
0088 parametersVector.push_back(
0089 detail::Test::generateBoundParametersCovariance(rng, {}));
0090 }
0091
0092 std::size_t nSurface = 0;
0093 auto surface = [&]() {
0094 nSurface++;
0095 return surfaces.at(nSurface % surfaces.size());
0096 };
0097
0098 std::size_t nParams = 0;
0099 auto parameters = [&]() -> const std::pair<BoundVector, BoundMatrix>& {
0100 nParams++;
0101 return parametersVector.at(nParams % parametersVector.size());
0102 };
0103
0104 auto perigee = Surface::makeShared<PerigeeSurface>(Vector3::Zero());
0105
0106 std::cout << "Creating " << nTracks << " tracks x " << runs << " runs"
0107 << std::endl;
0108 for (std::size_t r = 0; r < runs; ++r) {
0109 tc.clear();
0110 output.clear();
0111
0112 for (std::size_t i = 0; i < nTracks; ++i) {
0113 auto track = tc.makeTrack();
0114
0115 std::size_t nStates = nStatesDist(rng);
0116
0117 for (std::size_t j = 0; j < nStates; ++j) {
0118 auto trackState = track.appendTrackState(TrackStatePropMask::All);
0119 trackState.setReferenceSurface(surface());
0120
0121 trackState.jacobian().setZero();
0122 trackState.jacobian().row(j % eBoundSize).setOnes();
0123
0124 double crit = typeDist(rng);
0125
0126 if (crit < 0.1) {
0127
0128 trackState.typeFlags().setIsHole();
0129 } else if (crit < 0.2) {
0130
0131 trackState.typeFlags().setIsMaterial();
0132 } else {
0133 BenchmarkSourceLink bsl{gid, 123};
0134 std::size_t measdim = measDimDist(rng);
0135
0136 const auto& [predicted, covariance] = parameters();
0137 trackState.predicted() = predicted;
0138 trackState.predictedCovariance() = covariance;
0139
0140 visit_measurement(
0141 measdim,
0142 [&]<std::size_t N>(std::integral_constant<std::size_t, N> ) {
0143 trackState.allocateCalibrated(ActsVector<N>::Ones(),
0144 ActsSquareMatrix<N>::Identity());
0145
0146 std::array<std::uint8_t, eBoundSize> indices{0};
0147 std::iota(indices.begin(), indices.end(), 0);
0148 trackState.setProjectorSubspaceIndices(indices);
0149 });
0150
0151 trackState.typeFlags().setHasMeasurement();
0152 if (crit < 0.4) {
0153
0154 trackState.typeFlags().setIsOutlier();
0155 }
0156 }
0157 }
0158
0159 track.setReferenceSurface(perigee);
0160
0161 const auto& [ref, cov] = parameters();
0162 track.parameters() = ref;
0163 track.covariance() = cov;
0164
0165 track.linkForward();
0166
0167 calculateTrackQuantities(track);
0168 }
0169
0170 for (const auto& track : tc) {
0171 if (copyDist(rng) > 0.1) {
0172
0173 continue;
0174 }
0175
0176 auto target = output.makeTrack();
0177 target.copyFrom(track);
0178 }
0179 }
0180
0181 return 0;
0182 }