CMS 3D CMS Logo

GenericOverlapFinder.h
Go to the documentation of this file.
1 #ifndef PhysicsTools_PatUtils_GenericOverlapFinder_h
2 #define PhysicsTools_PatUtils_GenericOverlapFinder_h
3 
5 
6 #include <memory>
7 #include <vector>
8 #include <algorithm>
9 
10 namespace pat {
11 
15  typedef std::vector< std::pair<size_t, size_t> > OverlapList;
16 
23  template<typename Comparator>
24  struct OverlapDistance {
25  public:
27  OverlapDistance(const Comparator &comp) : comp_(comp) {}
28  template<typename T1, typename T2>
29  double operator()(const T1 &t1, const T2 &t2) const {
30  return 1.0 - comp_(t1,t2);
31  }
32  private:
34  }; //struct
35 
38  struct OverlapByDeltaR {
39  public:
40  OverlapByDeltaR(double deltaR) : scale_(1.0/(deltaR*deltaR)) {}
41  template<typename T1, typename T2>
42  double operator()(const T1 &t1, const T2 &t2) const {
43  return deltaR2(t1,t2) * scale_;
44  }
45  private:
46  double scale_;
47  }; //struct
48 
49 
50  template <typename Distance>
52 
53  public:
54 
56  GenericOverlapFinder(const Distance &dist) : distance_(dist) {}
57 
61  template <typename Collection, typename OtherCollection>
62  std::unique_ptr< OverlapList >
63  find(const Collection &items, const OtherCollection &other) const ;
64 
65  private:
66  Distance distance_;
67 
68  }; // class
69 }
70 
71 template<typename Distance>
72 template<typename Collection, typename OtherCollection>
73 std::unique_ptr< pat::OverlapList >
74 pat::GenericOverlapFinder<Distance>::find(const Collection &items, const OtherCollection &other) const
75 {
76  size_t size = items.size(), size2 = other.size();
77 
78  auto ret = std::make_unique<OverlapList>();
79 
80  for (size_t ie = 0; ie < size; ++ie) {
81  double dmin = 1.0;
82  size_t match = 0;
83 
84  for (size_t je = 0; je < size2; ++je) {
85  double dist = distance_(items[ie], other[je]);
86  if (dist < dmin) { match = je; dmin = dist; }
87  }
88 
89  if (dmin < 1.0) {
90  ret->push_back(std::make_pair(ie,match));
91  }
92  }
93 
94  return ret;
95 }
96 
97 
98 #endif
size
Write out results.
double operator()(const T1 &t1, const T2 &t2) const
double operator()(const T1 &t1, const T2 &t2) const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
Definition: HeavyIon.h:7
GenericOverlapFinder(const Distance &dist)
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
std::vector< std::pair< size_t, size_t > > OverlapList
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
std::unique_ptr< OverlapList > find(const Collection &items, const OtherCollection &other) const
OverlapByDeltaR(double deltaR)
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
OverlapDistance(const Comparator &comp)