CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/RecoTauTag/RecoTau/src/RecoTauCommonUtilities.cc

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   // Get each desired candidate type, unsorted for now
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 } }