10 #include "Math/VectorUtil.h"
27 template<
typename RecContainer = std::vector<RecJet>,
28 typename GenContainer = std::vector<GenJet>>
class JMEmatching {
42 using RecIt = RecContainer::iterator;
43 using GenIt = GenContainer::iterator;
44 using Couple = std::pair<RecIt, GenIt>;
53 GenContainer& genJets)
59 size_t nRec = distance(recJets.begin(), recJets.end()),
60 nGen = distance(genJets.begin(), genJets.end());
64 using Indices = pair<size_t,size_t>;
66 auto DeltaR2 = [&recJets,&genJets](
const Indices& indices) {
68 & genJet =
getP4(genJets[indices.second]);
69 return ROOT::Math::VectorUtil::DeltaR2(recJet, genJet);
72 auto ascending_DR2 = [&DeltaR2](
const Indices& l,
const Indices& r) {
73 return DeltaR2(l) > DeltaR2(r);
79 priority_queue< Indices,
80 vector<Indices>, decltype(ascending_DR2)>
81 candidates(ascending_DR2);
82 for (
size_t iRec = 0; iRec < nRec; ++iRec)
83 for (
size_t iGen = 0; iGen < nGen; ++iGen) {
84 Indices indices {iRec, iGen};
85 auto DR2 = DeltaR2(indices);
86 const auto maxDR2 = pow(
maxDR,2);
87 if (DR2 >= maxDR2)
continue;
88 candidates.emplace( std::move(indices) );
93 vector<bool> matchedRec(nRec,
false),
94 matchedGen(nGen,
false);
96 while (!candidates.empty()) {
97 auto [iRec, iGen] = candidates.top();
101 if (matchedRec.at(iRec))
continue;
102 if (matchedGen.at(iGen))
continue;
103 matchedRec.at(iRec) =
true;
104 matchedGen.at(iGen) =
true;
106 RecIt rec_it = recJets.begin();
107 GenIt gen_it = genJets.begin();
108 advance(rec_it, iRec);
109 advance(gen_it, iGen);
111 match_its.push_back( make_pair(rec_it, gen_it) );
117 for (
int iRec = 0; iRec < nRec; ++iRec) {
118 if (matchedRec.at(iRec))
continue;
119 RecIt fake_it = recJets.begin();
120 advance(fake_it, iRec);
125 for (
int iGen = 0; iGen < nGen; ++iGen) {
126 if (matchedGen.at(iGen))
continue;
127 GenIt miss_it = genJets.begin();
128 advance(miss_it, iGen);
133 template<
typename RecContainer,
typename GenContainer>