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:
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 
33  private:
35  }; //struct
36 
39  struct OverlapByDeltaR {
40  public:
41  OverlapByDeltaR(double deltaR) : scale_(1.0 / (deltaR * deltaR)) {}
42  template <typename T1, typename T2>
43  double operator()(const T1 &t1, const T2 &t2) const {
44  return deltaR2(t1, t2) * scale_;
45  }
46 
47  private:
48  double scale_;
49  }; //struct
50 
51  template <typename Distance>
53  public:
55  GenericOverlapFinder(const Distance &dist) : distance_(dist) {}
56 
60  template <typename Collection, typename OtherCollection>
61  std::unique_ptr<OverlapList> find(const Collection &items, const OtherCollection &other) const;
62 
63  private:
64  Distance distance_;
65 
66  }; // class
67 } // namespace pat
68 
69 template <typename Distance>
70 template <typename Collection, typename OtherCollection>
71 std::unique_ptr<pat::OverlapList> pat::GenericOverlapFinder<Distance>::find(const Collection &items,
72  const OtherCollection &other) const {
73  size_t size = items.size(), size2 = other.size();
74 
75  auto ret = std::make_unique<OverlapList>();
76 
77  for (size_t ie = 0; ie < size; ++ie) {
78  double dmin = 1.0;
79  size_t match = 0;
80 
81  for (size_t je = 0; je < size2; ++je) {
82  double dist = distance_(items[ie], other[je]);
83  if (dist < dmin) {
84  match = je;
85  dmin = dist;
86  }
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 #endif
size
Write out results.
ret
prodAgent to be discontinued
double operator()(const T1 &t1, const T2 &t2) const
Definition: HeavyIon.h:7
std::vector< std::pair< size_t, size_t > > OverlapList
std::unique_ptr< OverlapList > find(const Collection &items, const OtherCollection &other) const
GenericOverlapFinder(const Distance &dist)
OverlapByDeltaR(double deltaR)
double operator()(const T1 &t1, const T2 &t2) const
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)