File indexing completed on 2024-04-06 12:28:09
0001 #ifndef RecoTracker_FinalTrackSelectors_trackAlgoPriorityOrder_h
0002 #define RecoTracker_FinalTrackSelectors_trackAlgoPriorityOrder_h
0003
0004 #include "DataFormats/TrackReco/interface/TrackBase.h"
0005
0006 #include <array>
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 namespace impl {
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 constexpr reco::TrackBase::TrackAlgorithm algoPriorityOrder[] = {reco::TrackBase::undefAlgorithm,
0029 reco::TrackBase::ctf,
0030 reco::TrackBase::cosmics,
0031 reco::TrackBase::duplicateMerge,
0032 reco::TrackBase::initialStep,
0033 reco::TrackBase::highPtTripletStep,
0034 reco::TrackBase::detachedQuadStep,
0035 reco::TrackBase::detachedTripletStep,
0036 reco::TrackBase::lowPtQuadStep,
0037 reco::TrackBase::lowPtTripletStep,
0038 reco::TrackBase::pixelPairStep,
0039 reco::TrackBase::mixedTripletStep,
0040 reco::TrackBase::pixelLessStep,
0041 reco::TrackBase::tobTecStep,
0042 reco::TrackBase::displacedGeneralStep,
0043 reco::TrackBase::jetCoreRegionalStep,
0044 reco::TrackBase::conversionStep,
0045 reco::TrackBase::muonSeededStepInOut,
0046 reco::TrackBase::muonSeededStepOutIn,
0047 reco::TrackBase::displacedRegionalStep,
0048 reco::TrackBase::outInEcalSeededConv,
0049 reco::TrackBase::inOutEcalSeededConv,
0050 reco::TrackBase::nuclInter,
0051 reco::TrackBase::standAloneMuon,
0052 reco::TrackBase::globalMuon,
0053 reco::TrackBase::cosmicStandAloneMuon,
0054 reco::TrackBase::cosmicGlobalMuon,
0055 reco::TrackBase::bTagGhostTracks,
0056 reco::TrackBase::beamhalo,
0057 reco::TrackBase::gsf,
0058 reco::TrackBase::hltPixel,
0059 reco::TrackBase::hltIter0,
0060 reco::TrackBase::hltIter1,
0061 reco::TrackBase::hltIter2,
0062 reco::TrackBase::hltIter3,
0063 reco::TrackBase::hltIter4,
0064 reco::TrackBase::hltIterX,
0065 reco::TrackBase::hiRegitMuInitialStep,
0066 reco::TrackBase::hiRegitMuPixelPairStep,
0067 reco::TrackBase::hiRegitMuMixedTripletStep,
0068 reco::TrackBase::hiRegitMuPixelLessStep,
0069 reco::TrackBase::hiRegitMuDetachedTripletStep,
0070 reco::TrackBase::hiRegitMuMuonSeededStepInOut,
0071 reco::TrackBase::hiRegitMuMuonSeededStepOutIn,
0072 reco::TrackBase::hiRegitMuLowPtTripletStep,
0073 reco::TrackBase::hiRegitMuTobTecStep};
0074
0075 static_assert(reco::TrackBase::algoSize == sizeof(algoPriorityOrder) / sizeof(unsigned int),
0076 "Please update me too after adding new enumerators to reco::TrackBase::TrackAlgorithm");
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086 constexpr unsigned int findIndex(const reco::TrackBase::TrackAlgorithm algo, const unsigned int index) {
0087 return index < sizeof(algoPriorityOrder)/sizeof(unsigned int) ?
0088 (algo == algoPriorityOrder[index] ? index : findIndex(algo, index+1)) :
0089 throw "Index out of bounds, this means that some reco::TrackBase::TrackAlgorithm enumerator is missing from impl::algoPriorityOrder array.";
0090 }
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101 constexpr unsigned int priorityForAlgo(const reco::TrackBase::TrackAlgorithm algo) { return findIndex(algo, 0); }
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118 template <typename T, size_t N, size_t I>
0119 struct MakeArray {
0120 template <typename... Args>
0121 constexpr static std::array<T, N> value(Args&&... args) {
0122 return MakeArray<T, N, I - 1>::value(priorityForAlgo(static_cast<reco::TrackBase::TrackAlgorithm>(I - 1)),
0123 std::forward<Args>(args)...);
0124 }
0125 };
0126
0127
0128
0129
0130 template <typename T, size_t N>
0131 struct MakeArray<T, N, 0> {
0132 template <typename... Args>
0133 constexpr static std::array<T, N> value(Args&&... args) {
0134 return std::array<T, N>{{std::forward<Args>(args)...}};
0135 }
0136 };
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146 template <typename T, size_t N>
0147 constexpr std::array<T, N> makeArray() {
0148 return MakeArray<T, N, N>::value();
0149 }
0150
0151 }
0152
0153
0154
0155
0156
0157 constexpr std::array<unsigned int, reco::TrackBase::algoSize> trackAlgoPriorityOrder =
0158 impl::makeArray<unsigned int, reco::TrackBase::algoSize>();
0159
0160 #endif