3 #include <Math/VectorUtil.h>
6 const std::vector<reco::GenJet>&
j,
8 const bool useMaxDist =
true,
9 const bool useDeltaR =
true,
10 const double maxDist = 0.3)
11 :
partons(p), algorithm_(
algorithm), useMaxDist_(useMaxDist), useDeltaR_(useDeltaR), maxDist_(maxDist) {
12 std::vector<const reco::Candidate*> js;
13 for (
unsigned int i = 0;
i < j.size(); ++
i)
14 js.push_back(&(j[
i]));
20 const std::vector<reco::CaloJet>&
j,
22 const bool useMaxDist =
true,
23 const bool useDeltaR =
true,
24 const double maxDist = 0.3)
25 :
partons(p), algorithm_(
algorithm), useMaxDist_(useMaxDist), useDeltaR_(useDeltaR), maxDist_(maxDist) {
26 std::vector<const reco::Candidate*> js;
27 for (
unsigned int i = 0;
i < j.size(); ++
i)
28 js.push_back(&(j[
i]));
34 const std::vector<pat::Jet>&
j,
36 const bool useMaxDist =
true,
37 const bool useDeltaR =
true,
38 const double maxDist = 0.3)
39 :
partons(p), algorithm_(
algorithm), useMaxDist_(useMaxDist), useDeltaR_(useDeltaR), maxDist_(maxDist) {
40 std::vector<const reco::Candidate*> js;
41 for (
unsigned int i = 0;
i < j.size(); ++
i)
42 js.push_back(&(j[
i]));
48 const std::vector<const reco::Candidate*>&
j,
50 const bool useMaxDist =
true,
51 const bool useDeltaR =
true,
52 const double maxDist = 0.3)
53 :
partons(p),
jets(j), algorithm_(
algorithm), useMaxDist_(useMaxDist), useDeltaR_(useDeltaR), maxDist_(maxDist) {
67 bool emptyParton =
false;
68 for (
unsigned int ip = 0; ip <
partons.size(); ++ip) {
69 if (
partons[ip]->pdgId() == 0) {
78 if (
jets.empty() || emptyParton) {
80 for (
unsigned int ip = 0; ip <
partons.size(); ++ip)
81 dummyMatch.push_back(std::make_pair(ip, -1));
112 std::sort(match.begin(), match.end());
115 int nUnmatchedPartons =
partons.size();
120 double sumDE = -999.;
121 double sumDPt = -999.;
122 double sumDR = -999.;
123 if (nUnmatchedPartons == 0) {
127 for (
unsigned int i = 0;
i < match.size(); ++
i) {
146 return ROOT::Math::VectorUtil::Angle(v1, v2);
156 std::vector<std::pair<double, unsigned int> > distances;
157 for (
unsigned int ip = 0; ip <
partons.size(); ++ip) {
158 for (
unsigned int ij = 0; ij <
jets.size(); ++ij) {
160 distances.push_back(std::pair<double, unsigned int>(dist, ip *
jets.size() + ij));
163 std::sort(distances.begin(), distances.end());
167 while (match.size() <
partons.size()) {
168 unsigned int partonIndex = distances[0].second /
jets.size();
169 int jetIndex = distances[0].second -
jets.size() * partonIndex;
176 if (distances.empty())
177 match.push_back(std::make_pair(partonIndex, -1));
179 match.push_back(std::make_pair(partonIndex, jetIndex));
183 for (
unsigned int a = 0;
a < distances.size(); ++
a) {
184 unsigned int pIndex = distances[
a].second /
jets.size();
185 int jIndex = distances[
a].second -
jets.size() * pIndex;
186 if ((pIndex == partonIndex) || (jIndex == jetIndex)) {
187 distances.erase(distances.begin() +
a, distances.begin() +
a + 1);
199 std::vector<unsigned int>& jetIndices,
200 std::vector<bool>& usedJets,
201 std::vector<std::pair<double, MatchingCollection> >& distMatchVec) {
204 for (
unsigned int ij = 0; ij <
jets.size(); ++ij) {
210 usedJets[ij] =
false;
218 for (
unsigned int ip = 0; ip <
partons.size(); ++ip) {
223 match.push_back(std::make_pair(ip, jetIndices[ip]));
226 distMatchVec.push_back(std::make_pair(sumDist, match));
234 std::vector<std::pair<double, MatchingCollection> > distMatchVec;
236 std::vector<bool> usedJets;
237 for (
unsigned int i = 0;
i <
jets.size(); ++
i) {
238 usedJets.push_back(
false);
241 std::vector<unsigned int> jetIndices;
242 jetIndices.reserve(
partons.size());
246 std::sort(distMatchVec.begin(), distMatchVec.end());
250 if (distMatchVec.empty()) {
252 for (
unsigned int ip = 0; ip <
partons.size(); ++ip)
253 dummyMatch.push_back(std::make_pair(ip, -1));
256 for (
unsigned int i = 0;
i < distMatchVec.size(); ++
i)
257 matching.push_back(distMatchVec[
i].second);
266 std::vector<std::pair<double, unsigned int> > ptOrderedPartons;
268 for (
unsigned int ip = 0; ip <
partons.size(); ++ip)
269 ptOrderedPartons.push_back(std::make_pair(
partons[ip]->pt(), ip));
271 std::sort(ptOrderedPartons.begin(), ptOrderedPartons.end());
272 std::reverse(ptOrderedPartons.begin(), ptOrderedPartons.end());
274 std::vector<unsigned int> jetIndices;
275 for (
unsigned int ij = 0; ij <
jets.size(); ++ij)
276 jetIndices.push_back(ij);
280 for (
unsigned int ip = 0; ip < ptOrderedPartons.size(); ++ip) {
281 double minDist = 999.;
284 for (
unsigned int ij = 0; ij < jetIndices.size(); ++ij) {
286 if (dist < minDist) {
295 match.push_back(std::make_pair(ptOrderedPartons[ip].
second, jetIndices[ijMin]));
296 jetIndices.erase(jetIndices.begin() + ijMin, jetIndices.begin() + ijMin + 1);
298 match.push_back(std::make_pair(ptOrderedPartons[ip].
second, -1));
309 std::vector<bool> jetMatched;
310 for (
unsigned int ij = 0; ij <
jets.size(); ++ij)
311 jetMatched.push_back(
false);
315 for (
unsigned int ip = 0; ip <
partons.size(); ++ip) {
317 for (
unsigned int ij = 0; ij <
jets.size(); ++ij) {
320 if (!jetMatched[ij]) {
321 jetMatched[ij] =
true;
330 match.push_back(std::make_pair(ip, iMatch));
352 std::vector<int> jetIndices;
367 double sumDists = 0.;
380 log <<
"++++++++++++++++++++++++++++++++++++++++++++++ \n";
381 log <<
" algorithm : ";
384 log <<
"totalMinDist ";
387 log <<
"minSumDist ";
390 log <<
"ptOrderedMinDist";
393 log <<
"unambiguousOnly ";
399 log <<
" useDeltaR : " << std::boolalpha <<
useDeltaR_;
401 log <<
" useMaxDist: " << std::boolalpha <<
useMaxDist_;
402 log <<
" maxDist: " <<
maxDist_ <<
"\n";
403 log <<
" number of partons / jets: " <<
partons.size() <<
" / " <<
jets.size() <<
"\n";
406 log <<
" -------------------------------------------- \n";
407 log <<
" ind. of matched jets:";
415 log <<
"++++++++++++++++++++++++++++++++++++++++++++++";
void matchingTotalMinDist()
std::vector< const reco::Candidate * > partons
static std::vector< std::string > checklist log
std::vector< double > sumDeltaE
unsigned int getNumberOfAvailableCombinations()
void matchingPtOrderedMinDist()
U second(std::pair< T, U > const &p)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
std::vector< int > getMatchesForPartons(const unsigned int comb=0)
void matchingUnambiguousOnly()
double getSumDeltaE(const unsigned int comb=0)
std::vector< unsigned int > numberOfUnmatchedPartons
std::vector< std::pair< unsigned int, int > > MatchingCollection
void matchingMinSumDist()
void minSumDist_recursion(const unsigned int, std::vector< unsigned int > &, std::vector< bool > &, std::vector< std::pair< double, MatchingCollection > > &)
int getMatchForParton(const unsigned int part, const unsigned int comb=0)
double distance(const math::XYZTLorentzVector &, const math::XYZTLorentzVector &)
std::vector< const reco::Candidate * > jets
std::vector< MatchingCollection > matching
std::vector< double > sumDeltaR
double getSumDeltaR(const unsigned int comb=0)
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
std::vector< double > sumDeltaPt
double getSumDistances(const unsigned int comb=0)
tuple size
Write out results.
double getSumDeltaPt(const unsigned int comb=0)
double getDistanceForParton(const unsigned int part, const unsigned int comb=0)