Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-10-24 08:18:32

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 #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 /// @brief Struct for brief trajectory summary info
0025 ///
0026 struct TrajectoryState {
0027   /// Total number of track states in trajectory
0028   std::size_t nStates = 0;
0029   /// Number of track states with measurements
0030   std::size_t nMeasurements = 0;
0031   /// Number of track states marked as outliers
0032   std::size_t nOutliers = 0;
0033   /// Number of hole states in trajectory
0034   std::size_t nHoles = 0;
0035   /// Sum of chi-squared values from measurements
0036   double chi2Sum = 0;
0037   /// Chi-squared contribution from each measurement
0038   std::vector<double> measurementChi2 = {};
0039   /// Chi-squared contribution from each outlier
0040   std::vector<double> outlierChi2 = {};
0041   /// Number of degrees of freedom in track fit
0042   std::size_t NDF = 0;
0043   /// Volume identifiers for measurement surfaces
0044   std::vector<unsigned int> measurementVolume = {};
0045   /// Layer identifiers for measurement surfaces
0046   std::vector<unsigned int> measurementLayer = {};
0047   /// Volume identifiers for outlier surfaces
0048   std::vector<unsigned int> outlierVolume = {};
0049   /// Layer identifiers for outlier surfaces
0050   std::vector<unsigned int> outlierLayer = {};
0051   /// Number of hits shared with other tracks
0052   std::size_t nSharedHits = 0;
0053 };
0054 
0055 // Container for trajectory summary info at a specific volume
0056 using VolumeTrajectoryStateContainer =
0057     std::unordered_map<GeometryIdentifier::Value, TrajectoryState>;
0058 
0059 /// @brief Getter for global trajectory info
0060 ///
0061 /// @param multiTraj The MultiTrajectory object
0062 /// @param tipIndex The entry index of trajectory to investigate
0063 ///
0064 /// @return The trajectory summary info
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     // Get the volume Id of this surface
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 /// @brief Getter for trajectory info for different sub-detectors
0098 ///
0099 /// @tparam source_link_t Type of source link
0100 ///
0101 /// @param multiTraj The MultiTrajectory object
0102 /// @param tipIndex The entry index of trajectory to investigate
0103 /// track states at different sub-detectors.
0104 /// @param volumeIds The container for sub-detector Ids
0105 ///
0106 /// @return The trajectory summary info at different sub-detectors (i.e.
0107 /// different volumes)
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     // Get the volume Id of this surface
0115     const auto& geoID = state.referenceSurface().geometryId();
0116     const auto& volume = geoID.volume();
0117     const auto& layer = geoID.layer();
0118     // Check if the track info for this sub-detector is requested
0119     if (!rangeContainsValue(volumeIds, volume)) {
0120       return true;
0121     }
0122     // The trajectory state for this volume
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 /// @brief Transforms the filtered parameters from a @c TrackStateProxy to free
0150 /// parameters
0151 ///
0152 /// @tparam track_state_proxy_t Type of the @c TrackStateProxy
0153 /// @param [in] gctx Geometry context
0154 /// @param [in] trackStateProxy TrackStateProxy
0155 ///
0156 /// @return Free parameters representation of the filtered parameters
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 /// @brief Transforms the smoothed parameters from a @c TrackStateProxy to free
0165 /// parameters
0166 ///
0167 /// @tparam track_state_proxy_t Type of the @c TrackStateProxy
0168 /// @param [in] gctx Geometry context
0169 /// @param [in] trackStateProxy TrackStateProxy
0170 ///
0171 /// @return Free parameters representation of the smoothed parameters
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 }  // namespace Acts::MultiTrajectoryHelpers