File indexing completed on 2026-05-19 07:47:21
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/EventData/TrackParameters.hpp"
0012 #include "Acts/Utilities/Delegate.hpp"
0013 #include "Acts/Vertexing/LinearizedTrack.hpp"
0014
0015 #include <any>
0016 #include <functional>
0017 #include <typeindex>
0018
0019 namespace Acts {
0020
0021
0022 struct InputTrack {
0023
0024
0025 template <typename input_track_t>
0026 explicit InputTrack(const input_track_t* inputTrack)
0027 : m_type{typeid(inputTrack)}, m_ptr{inputTrack} {}
0028
0029 InputTrack() = delete;
0030
0031 InputTrack(const InputTrack&) = default;
0032
0033 InputTrack(InputTrack&&) = default;
0034
0035
0036 InputTrack& operator=(const InputTrack&) = default;
0037
0038
0039 InputTrack& operator=(InputTrack&&) = default;
0040
0041
0042
0043
0044 bool operator==(const InputTrack& other) const {
0045 return m_ptr == other.m_ptr;
0046 }
0047
0048
0049
0050
0051 template <typename input_track_t>
0052 bool operator==(const input_track_t* other) const {
0053 return m_ptr == other;
0054 }
0055
0056
0057
0058
0059 bool operator<(const InputTrack& other) const { return m_ptr < other.m_ptr; }
0060
0061
0062
0063 template <typename T>
0064 const T* as() const {
0065 using ptr_t = const T*;
0066 if (m_type != typeid(ptr_t)) {
0067 throw std::bad_any_cast();
0068 }
0069 return static_cast<ptr_t>(m_ptr);
0070 }
0071
0072 friend std::ostream& operator<<(std::ostream& os, const InputTrack& track) {
0073 os << track.m_ptr;
0074 return os;
0075 }
0076
0077 friend struct std::hash<Acts::InputTrack>;
0078
0079
0080
0081
0082 static BoundTrackParameters extractParameters(const InputTrack& track) {
0083 return *track.as<BoundTrackParameters>();
0084 }
0085
0086
0087 using Extractor = Acts::Delegate<BoundTrackParameters(const InputTrack&)>;
0088
0089 private:
0090 std::type_index m_type;
0091 const void* m_ptr;
0092 };
0093
0094
0095
0096
0097 struct TrackAtVertex {
0098
0099 TrackAtVertex() = delete;
0100
0101
0102
0103
0104
0105
0106 TrackAtVertex(double chi2perTrack, const BoundTrackParameters& paramsAtVertex,
0107 InputTrack originalTrack)
0108 : fittedParams(paramsAtVertex),
0109 originalParams(originalTrack),
0110 chi2Track(chi2perTrack) {}
0111
0112
0113
0114
0115
0116 TrackAtVertex(const BoundTrackParameters& paramsAtVertex,
0117 InputTrack originalTrack)
0118 : fittedParams(paramsAtVertex), originalParams(originalTrack) {}
0119
0120
0121 BoundTrackParameters fittedParams;
0122
0123
0124 InputTrack originalParams;
0125
0126
0127 double chi2Track = 0;
0128
0129
0130
0131
0132
0133 double ndf = 0;
0134
0135
0136
0137 double vertexCompatibility = 0;
0138
0139
0140 double trackWeight = 1;
0141
0142
0143 LinearizedTrack linearizedState;
0144
0145
0146 bool isLinearized = false;
0147 };
0148
0149 }
0150
0151 template <>
0152 struct std::hash<Acts::InputTrack> {
0153 std::size_t operator()(const Acts::InputTrack& track) const noexcept {
0154 return std::hash<const void*>{}(track.m_ptr);
0155 }
0156 };