File indexing completed on 2024-04-06 12:23:32
0001 #ifndef IsolationUtils_PtIsolationAlgo_h
0002 #define IsolationUtils_PtIsolationAlgo_h
0003
0004
0005
0006
0007 #include "DataFormats/Math/interface/deltaR.h"
0008
0009 template <typename T, typename C>
0010 class PtIsolationAlgo {
0011 public:
0012 typedef double value_type;
0013 PtIsolationAlgo() {}
0014 PtIsolationAlgo(double dRMin, double dRMax, double dzMax, double d0Max, double ptMin)
0015 : dRMin_(dRMin), dRMax_(dRMax), dzMax_(dzMax), d0Max_(d0Max), ptMin_(ptMin) {}
0016 double operator()(const T &, const C &) const;
0017
0018 private:
0019 double dRMin_, dRMax_, dzMax_, d0Max_, ptMin_;
0020 };
0021
0022 template <typename T, typename C>
0023 double PtIsolationAlgo<T, C>::operator()(const T &cand, const C &elements) const {
0024 double ptSum = 0;
0025 double candVz = cand.vz();
0026 double candEta = cand.eta();
0027 double candPhi = cand.phi();
0028 for (typename C::const_iterator elem = elements.begin(); elem != elements.end(); ++elem) {
0029 double elemPt = elem->pt();
0030 if (elemPt < ptMin_)
0031 continue;
0032 double elemVx = elem->vx();
0033 double elemVy = elem->vy();
0034 double elemD0 = sqrt(elemVx * elemVx + elemVy * elemVy);
0035 if (elemD0 > d0Max_)
0036 continue;
0037 double dz = fabs(elem->vz() - candVz);
0038 if (dz > dzMax_)
0039 continue;
0040 double dR = deltaR(elem->eta(), elem->phi(), candEta, candPhi);
0041 if ((dR > dRMax_) || (dR < dRMin_))
0042 continue;
0043 ptSum += elemPt;
0044 }
0045 return ptSum;
0046 }
0047
0048 #endif