Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:10:00

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2020 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 http://mozilla.org/MPL/2.0/.
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 /// @brief Struct for brief trajectory summary info
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 // Container for trajectory summary info at a specific volume
0041 using VolumeTrajectoryStateContainer =
0042     std::unordered_map<GeometryIdentifier::Value, TrajectoryState>;
0043 
0044 /// @brief Getter for global trajectory info
0045 ///
0046 /// @param multiTraj The MultiTrajectory object
0047 /// @param entryIndex The entry index of trajectory to investigate
0048 ///
0049 /// @return The trajectory summary info
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     // Get the volume Id of this surface
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 /// @brief Getter for trajectory info for different sub-detectors
0084 ///
0085 /// @tparam source_link_t Type of source link
0086 ///
0087 /// @param multiTraj The MultiTrajectory object
0088 /// @param entryIndex The entry index of trajectory to investigate
0089 /// track states at different sub-detectors.
0090 /// @param volumeIds The container for sub-detector Ids
0091 ///
0092 /// @return The trajectory summary info at different sub-detectors (i.e.
0093 /// different volumes)
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     // Get the volume Id of this surface
0101     const auto& geoID = state.referenceSurface().geometryId();
0102     const auto& volume = geoID.volume();
0103     const auto& layer = geoID.layer();
0104     // Check if the track info for this sub-detector is requested
0105     auto it = std::find(volumeIds.begin(), volumeIds.end(), volume);
0106     if (it == volumeIds.end()) {
0107       return true;
0108     }
0109     // The trajectory state for this volume
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 /// @brief Transforms the filtered parameters from a @c TrackStateProxy to free
0137 /// parameters
0138 ///
0139 /// @tparam track_state_proxy_t Type of the @c TrackStateProxy
0140 /// @param [in] gctx Geometry context
0141 /// @param [in] trackStateProxy TrackStateProxy
0142 ///
0143 /// @return Free parameters representation of the filtered parameters
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 /// @brief Transforms the smoothed parameters from a @c TrackStateProxy to free
0152 /// parameters
0153 ///
0154 /// @tparam track_state_proxy_t Type of the @c TrackStateProxy
0155 /// @param [in] gctx Geometry context
0156 /// @param [in] trackStateProxy TrackStateProxy
0157 ///
0158 /// @return Free parameters representation of the smoothed parameters
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 }  // namespace Acts::MultiTrajectoryHelpers