Back to home page

Project CMSSW displayed by LXR

 
 

    


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;  // GeV
0024     float chi2Scale;
0025 
0026     struct Region {
0027       float maxTip;  // cm
0028       float minPt;   // GeV
0029       float maxZip;  // cm
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       // impose "region cuts" based on the fit results (phi, Tip, pt, cotan(theta)), Zip)
0037       // default cuts:
0038       //   - for triplets:    |Tip| < 0.3 cm, pT > 0.5 GeV, |Zip| < 12.0 cm
0039       //   - for quadruplets: |Tip| < 0.5 cm, pT > 0.3 GeV, |Zip| < 12.0 cm
0040       // (see CAHitNtupletGeneratorGPU.cc)
0041       auto const &region = (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         // max diff [0.5,12] at 1.25 0.16143
0049         // average diff  0.0662998
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         // log2(1+0.25*f)
0063         // averaged over bins
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 }  // namespace pixelTrack
0100 
0101 #endif  // DataFormats_TrackSoA_interface_alpaka_TrackUtilities_h