File indexing completed on 2025-10-24 08:18:32
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/EventData/MultiTrajectory.hpp"
0012 #include "Acts/EventData/TrackContainer.hpp"
0013 #include "Acts/EventData/TransformationHelpers.hpp"
0014 #include "Acts/Geometry/Layer.hpp"
0015 #include "Acts/Geometry/TrackingVolume.hpp"
0016 #include "Acts/Surfaces/Surface.hpp"
0017 #include "Acts/Utilities/Helpers.hpp"
0018
0019 #include <functional>
0020 #include <unordered_map>
0021
0022 namespace Acts::MultiTrajectoryHelpers {
0023
0024
0025
0026 struct TrajectoryState {
0027
0028 std::size_t nStates = 0;
0029
0030 std::size_t nMeasurements = 0;
0031
0032 std::size_t nOutliers = 0;
0033
0034 std::size_t nHoles = 0;
0035
0036 double chi2Sum = 0;
0037
0038 std::vector<double> measurementChi2 = {};
0039
0040 std::vector<double> outlierChi2 = {};
0041
0042 std::size_t NDF = 0;
0043
0044 std::vector<unsigned int> measurementVolume = {};
0045
0046 std::vector<unsigned int> measurementLayer = {};
0047
0048 std::vector<unsigned int> outlierVolume = {};
0049
0050 std::vector<unsigned int> outlierLayer = {};
0051
0052 std::size_t nSharedHits = 0;
0053 };
0054
0055
0056 using VolumeTrajectoryStateContainer =
0057 std::unordered_map<GeometryIdentifier::Value, TrajectoryState>;
0058
0059
0060
0061
0062
0063
0064
0065 template <typename traj_t>
0066 TrajectoryState trajectoryState(const traj_t& multiTraj, std::size_t tipIndex) {
0067 TrajectoryState trajState;
0068 multiTraj.visitBackwards(tipIndex, [&](const auto& state) {
0069
0070 const auto& geoID = state.referenceSurface().geometryId();
0071 const auto& volume = geoID.volume();
0072 const auto& layer = geoID.layer();
0073 trajState.nStates++;
0074 auto typeFlags = state.typeFlags();
0075 if (typeFlags.test(Acts::TrackStateFlag::HoleFlag)) {
0076 trajState.nHoles++;
0077 } else if (typeFlags.test(Acts::TrackStateFlag::OutlierFlag)) {
0078 trajState.nOutliers++;
0079 trajState.outlierChi2.push_back(state.chi2());
0080 trajState.outlierVolume.push_back(volume);
0081 trajState.outlierLayer.push_back(layer);
0082 } else if (typeFlags.test(Acts::TrackStateFlag::MeasurementFlag)) {
0083 if (typeFlags.test(Acts::TrackStateFlag::SharedHitFlag)) {
0084 trajState.nSharedHits++;
0085 }
0086 trajState.nMeasurements++;
0087 trajState.measurementChi2.push_back(state.chi2());
0088 trajState.measurementVolume.push_back(volume);
0089 trajState.measurementLayer.push_back(layer);
0090 trajState.chi2Sum += state.chi2();
0091 trajState.NDF += state.calibratedSize();
0092 }
0093 });
0094 return trajState;
0095 }
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108 template <typename traj_t>
0109 VolumeTrajectoryStateContainer trajectoryState(
0110 const traj_t& multiTraj, std::size_t tipIndex,
0111 const std::vector<GeometryIdentifier::Value>& volumeIds) {
0112 VolumeTrajectoryStateContainer trajStateContainer;
0113 multiTraj.visitBackwards(tipIndex, [&](const auto& state) {
0114
0115 const auto& geoID = state.referenceSurface().geometryId();
0116 const auto& volume = geoID.volume();
0117 const auto& layer = geoID.layer();
0118
0119 if (!rangeContainsValue(volumeIds, volume)) {
0120 return true;
0121 }
0122
0123 auto& trajState = trajStateContainer[volume];
0124 trajState.nStates++;
0125 trajState.NDF += state.calibratedSize();
0126 auto typeFlags = state.typeFlags();
0127 if (typeFlags.test(Acts::TrackStateFlag::HoleFlag)) {
0128 trajState.nHoles++;
0129 } else if (typeFlags.test(Acts::TrackStateFlag::OutlierFlag)) {
0130 trajState.nOutliers++;
0131 trajState.outlierChi2.push_back(state.chi2());
0132 trajState.outlierVolume.push_back(volume);
0133 trajState.outlierLayer.push_back(layer);
0134 } else if (typeFlags.test(Acts::TrackStateFlag::MeasurementFlag)) {
0135 if (typeFlags.test(Acts::TrackStateFlag::SharedHitFlag)) {
0136 trajState.nSharedHits++;
0137 }
0138 trajState.nMeasurements++;
0139 trajState.measurementChi2.push_back(state.chi2());
0140 trajState.measurementVolume.push_back(volume);
0141 trajState.measurementLayer.push_back(layer);
0142 trajState.chi2Sum += state.chi2();
0143 }
0144 return true;
0145 });
0146 return trajStateContainer;
0147 }
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157 template <typename track_state_proxy_t>
0158 FreeVector freeFiltered(const GeometryContext& gctx,
0159 const track_state_proxy_t& trackStateProxy) {
0160 return transformBoundToFreeParameters(trackStateProxy.referenceSurface(),
0161 gctx, trackStateProxy.filtered());
0162 }
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172 template <typename track_state_proxy_t>
0173 FreeVector freeSmoothed(const GeometryContext& gctx,
0174 const track_state_proxy_t& trackStateProxy) {
0175 return transformBoundToFreeParameters(trackStateProxy.referenceSurface(),
0176 gctx, trackStateProxy.smoothed());
0177 }
0178 }