File indexing completed on 2025-07-03 00:42:11
0001 #ifndef DataFormats_TrackSoA_interface_alpaka_TrackUtilities_h
0002 #define DataFormats_TrackSoA_interface_alpaka_TrackUtilities_h
0003
0004 #include <algorithm>
0005 #include <cmath>
0006 #include <cstdint>
0007
0008 #include <alpaka/alpaka.hpp>
0009
0010 #include "DataFormats/TrackSoA/interface/TracksSoA.h"
0011 #include "Geometry/CommonTopologies/interface/SimplePixelTopology.h"
0012
0013 namespace pixelTrack {
0014
0015 template <typename TrackerTraits, typename Enable = void>
0016 struct QualityCutsT {};
0017
0018 template <typename TrackerTraits>
0019 struct QualityCutsT<TrackerTraits, pixelTopology::isPhase1Topology<TrackerTraits>> {
0020 using TrackSoAView = reco::TrackSoAView;
0021 using TrackSoAConstView = reco::TrackSoAConstView;
0022 float chi2Coeff[4];
0023 float chi2MaxPt;
0024 float chi2Scale;
0025
0026 struct Region {
0027 float maxTip;
0028 float minPt;
0029 float maxZip;
0030 };
0031
0032 Region triplet;
0033 Region quadruplet;
0034
0035 ALPAKA_FN_ACC ALPAKA_FN_INLINE bool isHP(const TrackSoAConstView &tracks, int nHits, int it) const {
0036
0037
0038
0039
0040
0041 auto const ®ion = (nHits > 3) ? quadruplet : triplet;
0042 return (std::abs(reco::tip(tracks, it)) < region.maxTip) and (tracks.pt(it) > region.minPt) and
0043 (std::abs(reco::zip(tracks, it)) < region.maxZip);
0044 }
0045
0046 ALPAKA_FN_ACC ALPAKA_FN_INLINE bool strictCut(const TrackSoAConstView &tracks, int it) const {
0047 auto roughLog = [](float x) {
0048
0049
0050 union IF {
0051 uint32_t i;
0052 float f;
0053 };
0054 IF z;
0055 z.f = x;
0056 uint32_t lsb = 1 < 21;
0057 z.i += lsb;
0058 z.i >>= 21;
0059 auto f = z.i & 3;
0060 int ex = int(z.i >> 2) - 127;
0061
0062
0063
0064 const float frac[4] = {0.160497f, 0.452172f, 0.694562f, 0.901964f};
0065 return float(ex) + frac[f];
0066 };
0067
0068 float pt = std::min<float>(tracks.pt(it), chi2MaxPt);
0069 float chi2Cut = chi2Scale * (chi2Coeff[0] + roughLog(pt) * chi2Coeff[1]);
0070 if (tracks.chi2(it) >= chi2Cut) {
0071 #ifdef NTUPLE_FIT_DEBUG
0072 printf("Bad chi2 %d pt %f eta %f chi2 %f\n", it, tracks.pt(it), tracks.eta(it), tracks.chi2(it));
0073 #endif
0074 return true;
0075 }
0076 return false;
0077 }
0078 };
0079
0080 template <typename TrackerTraits>
0081 struct QualityCutsT<TrackerTraits, pixelTopology::isPhase2Topology<TrackerTraits>> {
0082 using TrackSoAView = reco::TrackSoAView;
0083 using TrackSoAConstView = reco::TrackSoAConstView;
0084
0085 float maxChi2;
0086 float minPt;
0087 float maxTip;
0088 float maxZip;
0089
0090 ALPAKA_FN_ACC ALPAKA_FN_INLINE bool isHP(const TrackSoAConstView &tracks, int nHits, int it) const {
0091 return (std::abs(reco::tip(tracks, it)) < maxTip) and (tracks.pt(it) > minPt) and
0092 (std::abs(reco::zip(tracks, it)) < maxZip);
0093 }
0094 ALPAKA_FN_ACC ALPAKA_FN_INLINE bool strictCut(const TrackSoAConstView &tracks, int it) const {
0095 return tracks.chi2(it) >= maxChi2;
0096 }
0097 };
0098
0099 }
0100
0101 #endif