Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <boost/ptr_container/ptr_vector.hpp>
00019 #include <algorithm>
00020 #include <memory>
00021
00022 #include "FWCore/Framework/interface/EDProducer.h"
00023 #include "FWCore/Framework/interface/EventSetup.h"
00024 #include "FWCore/Framework/interface/ESHandle.h"
00025 #include "FWCore/Framework/interface/Event.h"
00026 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00027
00028 #include "RecoTauTag/RecoTau/interface/RecoTauBuilderPlugins.h"
00029 #include "RecoTauTag/RecoTau/interface/RecoTauCleaningTools.h"
00030 #include "RecoTauTag/RecoTau/interface/RecoTauCommonUtilities.h"
00031
00032 #include "DataFormats/TauReco/interface/PFTau.h"
00033 #include "DataFormats/TauReco/interface/PFTauFwd.h"
00034
00035 #include "CommonTools/Utils/interface/StringCutObjectSelector.h"
00036
00037 template<typename Prod>
00038 class RecoTauCleanerImpl : public edm::EDProducer {
00039 typedef reco::tau::RecoTauCleanerPlugin Cleaner;
00040 typedef boost::ptr_vector<Cleaner> CleanerList;
00041
00042 typedef typename Prod::value_type output_type;
00043
00044
00045 class RemoveDuplicateJets {
00046 public:
00047 bool operator()(const reco::PFTauRef& a, const reco::PFTauRef& b)
00048 { return a->jetRef() == b->jetRef(); }
00049 };
00050
00051 public:
00052 explicit RecoTauCleanerImpl(const edm::ParameterSet& pset);
00053 ~RecoTauCleanerImpl() {}
00054 void produce(edm::Event& evt, const edm::EventSetup& es);
00055
00056 private:
00057
00058 typedef reco::tau::RecoTauLexicographicalRanking<
00059 CleanerList, reco::PFTauRef> Predicate;
00060 std::auto_ptr<Predicate> predicate_;
00061 edm::InputTag tauSrc_;
00062 CleanerList cleaners_;
00063
00064 std::auto_ptr<StringCutObjectSelector<reco::PFTau> > outputSelector_;
00065 };
00066
00067 template<typename Prod>
00068 RecoTauCleanerImpl<Prod>::RecoTauCleanerImpl(const edm::ParameterSet& pset) {
00069 tauSrc_ = pset.getParameter<edm::InputTag>("src");
00070
00071 typedef std::vector<edm::ParameterSet> VPSet;
00072
00073 const VPSet& cleaners = pset.getParameter<VPSet>("cleaners");
00074 for (VPSet::const_iterator cleanerPSet = cleaners.begin();
00075 cleanerPSet != cleaners.end(); ++cleanerPSet) {
00076
00077 const std::string& pluginType =
00078 cleanerPSet->getParameter<std::string>("plugin");
00079
00080 cleaners_.push_back(
00081 RecoTauCleanerPluginFactory::get()->create(pluginType, *cleanerPSet));
00082 }
00083
00084
00085 if (pset.exists("outputSelection")) {
00086 std::string selection = pset.getParameter<std::string>("outputSelection");
00087 if (selection != "") {
00088 outputSelector_.reset(
00089 new StringCutObjectSelector<reco::PFTau>(selection));
00090 }
00091 }
00092
00093
00094
00095 predicate_ = std::auto_ptr<Predicate>(new Predicate(cleaners_));
00096 produces<Prod>();
00097 }
00098
00099 namespace {
00100
00101 template<typename T> const T convert(const reco::PFTauRef &tau);
00102
00103 template<> const edm::RefToBase<reco::PFTau>
00104 convert<edm::RefToBase<reco::PFTau> >(const reco::PFTauRef &tau) {
00105 return edm::RefToBase<reco::PFTau>(tau);
00106 }
00107
00108 template<> const reco::PFTauRef
00109 convert<reco::PFTauRef>(const reco::PFTauRef &tau) { return tau; }
00110
00111 template<> const reco::PFTau
00112 convert<reco::PFTau>(const reco::PFTauRef &tau) { return *tau; }
00113 }
00114
00115 template<typename Prod>
00116 void RecoTauCleanerImpl<Prod>::produce(edm::Event& evt,
00117 const edm::EventSetup& es) {
00118
00119 for (CleanerList::iterator cleaner = cleaners_.begin();
00120 cleaner != cleaners_.end(); ++cleaner) {
00121 cleaner->setup(evt, es);
00122 }
00123
00124
00125 edm::Handle<reco::CandidateView> input;
00126 evt.getByLabel(tauSrc_, input);
00127
00128
00129 reco::PFTauRefVector inputRefs =
00130 reco::tau::castView<reco::PFTauRefVector>(input);
00131
00132
00133 typedef std::vector<reco::PFTauRef> PFTauRefs;
00134
00135 PFTauRefs dirty;
00136 dirty.reserve(inputRefs.size());
00137 std::copy(inputRefs.begin(), inputRefs.end(), std::back_inserter(dirty));
00138
00139
00140 std::sort(dirty.begin(), dirty.end(), *predicate_);
00141
00142
00143 PFTauRefs cleanTaus = reco::tau::cleanOverlaps<PFTauRefs,
00144 RemoveDuplicateJets>(dirty);
00145
00146
00147 std::auto_ptr<Prod> output(new Prod());
00148
00149
00150
00151 for (PFTauRefs::const_iterator tau = cleanTaus.begin();
00152 tau != cleanTaus.end(); ++tau) {
00153
00154 bool selected = true;
00155 if (outputSelector_.get() && !(*outputSelector_)(**tau)) {
00156 selected = false;
00157 }
00158 if (selected) {
00159 output->push_back(convert<output_type>(*tau));
00160 }
00161 }
00162 evt.put(output);
00163 }
00164
00165 typedef RecoTauCleanerImpl<reco::PFTauCollection> RecoTauCleaner;
00166 typedef RecoTauCleanerImpl<reco::PFTauRefVector> RecoTauRefCleaner;
00167
00168 #include "FWCore/Framework/interface/MakerMacros.h"
00169 DEFINE_FWK_MODULE(RecoTauCleaner);
00170 DEFINE_FWK_MODULE(RecoTauRefCleaner);
00171