Go to the documentation of this file.00001 #include "RecoTauTag/RecoTau/interface/RecoTauCommonUtilities.h"
00002
00003 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidateFwd.h"
00004 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
00005 #include "DataFormats/JetReco/interface/PFJet.h"
00006
00007 #include <algorithm>
00008
00009 typedef std::vector<reco::PFCandidatePtr> PFCandPtrs;
00010 typedef PFCandPtrs::iterator PFCandIter;
00011
00012 namespace reco { namespace tau {
00013
00014 std::vector<PFCandidatePtr>
00015 flattenPiZeros( const std::vector<RecoTauPiZero>& piZeros) {
00016 std::vector<PFCandidatePtr> output;
00017
00018 for(std::vector<RecoTauPiZero>::const_iterator piZero = piZeros.begin();
00019 piZero != piZeros.end(); ++piZero) {
00020 for(size_t iDaughter = 0; iDaughter < piZero->numberOfDaughters();
00021 ++iDaughter) {
00022 output.push_back(PFCandidatePtr(piZero->daughterPtr(iDaughter)));
00023 }
00024 }
00025 return output;
00026 }
00027
00028 std::vector<reco::PFCandidatePtr> pfCandidates(const reco::PFJet& jet,
00029 int particleId, bool sort) {
00030 PFCandPtrs pfCands = jet.getPFConstituents();
00031 PFCandPtrs selectedPFCands = filterPFCandidates(
00032 pfCands.begin(), pfCands.end(), particleId, sort);
00033 return selectedPFCands;
00034 }
00035
00036 std::vector<reco::PFCandidatePtr> pfCandidates(const reco::PFJet& jet,
00037 const std::vector<int>& particleIds, bool sort) {
00038 PFCandPtrs output;
00039
00040 for(std::vector<int>::const_iterator particleId = particleIds.begin();
00041 particleId != particleIds.end(); ++particleId) {
00042 PFCandPtrs selectedPFCands = pfCandidates(jet, *particleId, false);
00043 output.insert(output.end(), selectedPFCands.begin(), selectedPFCands.end());
00044 }
00045 if (sort) std::sort(output.begin(), output.end(), SortPFCandsDescendingPt());
00046 return output;
00047 }
00048
00049 std::vector<reco::PFCandidatePtr> pfGammas(const reco::PFJet& jet, bool sort) {
00050 return pfCandidates(jet, reco::PFCandidate::gamma, sort);
00051 }
00052
00053 std::vector<reco::PFCandidatePtr> pfChargedCands(const reco::PFJet& jet,
00054 bool sort) {
00055 PFCandPtrs output;
00056 PFCandPtrs mus = pfCandidates(jet, reco::PFCandidate::mu, false);
00057 PFCandPtrs es = pfCandidates(jet, reco::PFCandidate::e, false);
00058 PFCandPtrs chs = pfCandidates(jet, reco::PFCandidate::h, false);
00059 output.reserve(mus.size() + es.size() + chs.size());
00060 output.insert(output.end(), mus.begin(), mus.end());
00061 output.insert(output.end(), es.begin(), es.end());
00062 output.insert(output.end(), chs.begin(), chs.end());
00063 if (sort) std::sort(output.begin(), output.end(), SortPFCandsDescendingPt());
00064 return output;
00065 }
00066
00067
00068
00069 } }