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