Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2026-07-16 08:08:37

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
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   /// Construct from geometry identifier and index.
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   /// Access the index.
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 /*argc*/, char** /*argv[]*/) {
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           // hole
0128           trackState.typeFlags().setIsHole();
0129         } else if (crit < 0.2) {
0130           // material
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> /*d*/) {
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             // outlier
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         // copy only 10% of tracks
0173         continue;
0174       }
0175 
0176       auto target = output.makeTrack();
0177       target.copyFrom(track);
0178     }
0179   }
0180 
0181   return 0;
0182 }