From c36fa8540cd832566c80476f1b895862c34f87c0 Mon Sep 17 00:00:00 2001 From: Kyle Knoepfel Date: Tue, 21 Feb 2017 13:19:05 -0600 Subject: [PATCH 1/2] Significant cleanups to legacy version. --- .../RecoTau/plugins/ObjectViewCleaner.cc | 202 ++++++++---------- 1 file changed, 95 insertions(+), 107 deletions(-) diff --git a/Validation/RecoTau/plugins/ObjectViewCleaner.cc b/Validation/RecoTau/plugins/ObjectViewCleaner.cc index ba98f3f13b9ab..9c78bd6471495 100644 --- a/Validation/RecoTau/plugins/ObjectViewCleaner.cc +++ b/Validation/RecoTau/plugins/ObjectViewCleaner.cc @@ -1,7 +1,7 @@ /***************************************************************************** * Project: CMS detector at the CERN * - * Package: PhysicsTools/TagAndProbe + * Package: Validation/RecoTau * * * Authors: @@ -9,71 +9,70 @@ * Kalanand Mishra, Fermilab - kalanand@fnal.gov * * Description: - * - Cleans a given object collection of other + * - Cleans a given object collection of other * cross-object candidates using deltaR-matching. - * - For example: can clean a muon collection by + * - For example: can clean a muon collection by * removing all jets in the muon collection. * - Saves collection of the reference vectors of cleaned objects. * History: * Generalized the existing CandViewCleaner * - * 2010 FNAL + * 2010 FNAL *****************************************************************************/ -//////////////////////////////////////////////////////////////////////////////// -// Includes -//////////////////////////////////////////////////////////////////////////////// -#include "FWCore/Framework/interface/EDProducer.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/Utilities/interface/EDGetToken.h" -#include "FWCore/Utilities/interface/InputTag.h" - -#include "DataFormats/Common/interface/View.h" -#include "DataFormats/Math/interface/deltaR.h" +#include "CommonTools/Utils/interface/StringCutObjectSelector.h" #include "DataFormats/Candidate/interface/Candidate.h" #include "DataFormats/Candidate/interface/CandidateFwd.h" -#include "DataFormats/MuonReco/interface/Muon.h" -#include "DataFormats/EgammaCandidates/interface/GsfElectron.h" +#include "DataFormats/Common/interface/View.h" #include "DataFormats/EgammaCandidates/interface/Electron.h" -#include "DataFormats/JetReco/interface/Jet.h" +#include "DataFormats/EgammaCandidates/interface/GsfElectron.h" #include "DataFormats/EgammaCandidates/interface/Photon.h" +#include "DataFormats/JetReco/interface/Jet.h" +#include "DataFormats/Math/interface/deltaR.h" +#include "DataFormats/MuonReco/interface/Muon.h" #include "DataFormats/TrackReco/interface/Track.h" -#include "CommonTools/Utils/interface/StringCutObjectSelector.h" -#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/Framework/interface/EDProducer.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/EDGetToken.h" +#include "FWCore/Utilities/interface/InputTag.h" #include -#include #include +#include //////////////////////////////////////////////////////////////////////////////// // class definition //////////////////////////////////////////////////////////////////////////////// -template -class ObjectViewCleaner : public edm::EDProducer -{ +template +class ObjectViewCleaner : public edm::EDProducer { public: + // construction/destruction - ObjectViewCleaner(const edm::ParameterSet& iConfig); - virtual ~ObjectViewCleaner(); - + explicit ObjectViewCleaner(edm::ParameterSet const& iConfig); + // member functions - void produce(edm::Event& iEvent,const edm::EventSetup& iSetup) override; + void produce(edm::Event& iEvent, edm::EventSetup const& iSetup) override; void endJob() override; -private: +private: + // member data - edm::EDGetTokenT > srcCands_; - std::vector > > srcObjects_; - double deltaRMin_; - - std::string moduleLabel_; + edm::EDGetTokenT> srcCands_; + std::vector>> srcObjectsToRemove_; + double deltaRMin_; + std::string moduleLabel_; StringCutObjectSelector objKeepCut_; // lazy parsing, to allow cutting on variables not in reco::Candidate class - StringCutObjectSelector objRemoveCut_; // lazy parsing, to allow cutting on variables + StringCutObjectSelector objRemoveCut_; // lazy parsing, to allow cutting on variables + + std::size_t nObjectsTot_ {}; + std::size_t nObjectsClean_ {}; + + auto tagsToTokens(std::vector const&) -> decltype(srcObjectsToRemove_); + bool isIsolated(edm::Event const&, T const&) const; - unsigned int nObjectsTot_; - unsigned int nObjectsClean_; }; @@ -84,100 +83,91 @@ using namespace std; // construction/destruction //////////////////////////////////////////////////////////////////////////////// -//______________________________________________________________________________ -template -ObjectViewCleaner::ObjectViewCleaner(const edm::ParameterSet& iConfig) - : srcCands_ (consumes >(iConfig.getParameter ("srcObject"))) - , srcObjects_ () - , deltaRMin_ (iConfig.getParameter ("deltaRMin")) - , moduleLabel_(iConfig.getParameter ("@module_label")) - , objKeepCut_(iConfig.existsAs("srcObjectSelection") ? iConfig.getParameter("srcObjectSelection") : "", true) - ,objRemoveCut_(iConfig.existsAs("srcObjectsToRemoveSelection") ? iConfig.getParameter("srcObjectsToRemoveSelection") : "", true) - , nObjectsTot_(0) - , nObjectsClean_(0) -{ - produces >(); - std::vector srcTags = iConfig.getParameter >("srcObjectsToRemove"); - srcObjects_.reserve(srcTags.size()); - for (auto const& tag : srcTags) { - srcObjects_.emplace_back(consumes >(tag)); - } -} - - -//______________________________________________________________________________ template -ObjectViewCleaner::~ObjectViewCleaner() +ObjectViewCleaner::ObjectViewCleaner(edm::ParameterSet const& iConfig) + : srcCands_{consumes>(iConfig.getParameter("srcObject"))} + , srcObjectsToRemove_{tagsToTokens(iConfig.getParameter>("srcObjectsToRemove"))} + , deltaRMin_{iConfig.getParameter("deltaRMin")} + , moduleLabel_{iConfig.getParameter("@module_label")} + , objKeepCut_{iConfig.existsAs("srcObjectSelection") ? iConfig.getParameter("srcObjectSelection") : "", true} + , objRemoveCut_{iConfig.existsAs("srcObjectsToRemoveSelection") ? iConfig.getParameter("srcObjectsToRemoveSelection") : "", true} { - + produces>(); } - - //////////////////////////////////////////////////////////////////////////////// // implementation of member functions //////////////////////////////////////////////////////////////////////////////// //______________________________________________________________________________ -template -void ObjectViewCleaner::produce(edm::Event& iEvent,const edm::EventSetup& iSetup) +template +void ObjectViewCleaner::produce(edm::Event& iEvent, edm::EventSetup const&) { - unique_ptr > - cleanObjects(new edm::RefToBaseVector()); - - edm::Handle > candidates; + edm::Handle> candidates; iEvent.getByToken(srcCands_,candidates); - - bool* isClean = new bool[candidates->size()]; - for (unsigned int iObject=0;iObjectsize();iObject++) isClean[iObject] = true; - - for (auto const& object : srcObjects_) { - edm::Handle > objects; - iEvent.getByToken(object,objects); - - for (unsigned int iObject=0;iObjectsize();iObject++) { - const T& candidate = candidates->at(iObject); - if (!objKeepCut_(candidate)) isClean[iObject] = false; - - for (unsigned int iObj=0;iObjsize();iObj++) { - const reco::Candidate& obj = objects->at(iObj); - if (!objRemoveCut_(obj)) continue; - - double deltaR = reco::deltaR(candidate,obj); - if (deltaRsize(); + + auto cleanObjects = std::make_unique>(); + for (unsigned int iCand {}; iCand < candidates->size(); ++iCand) { + auto const& candidate = candidates->at(iCand); + if (objKeepCut_(candidate) && isIsolated(iEvent, candidate)) { + cleanObjects->push_back(candidates->refAt(iCand)); } } - - for (unsigned int iObject=0;iObjectsize();iObject++) - if (isClean[iObject]) cleanObjects->push_back(candidates->refAt(iObject)); - - nObjectsTot_ +=candidates->size(); - nObjectsClean_+=cleanObjects->size(); - - delete [] isClean; + nObjectsClean_ += cleanObjects->size(); + iEvent.put(std::move(cleanObjects)); } //______________________________________________________________________________ -template +template void ObjectViewCleaner::endJob() { - stringstream ss; - ss<<"nObjectsTot="< +bool ObjectViewCleaner::isIsolated(edm::Event const& iEvent, T const& candidate) const +{ + for (auto const& srcObject : srcObjectsToRemove_) { + edm::Handle> objects; + iEvent.getByToken(srcObject, objects); + + for (unsigned int iObj {}; iObj < objects->size() ; ++iObj) { + auto const& obj = objects->at(iObj); + if (!objRemoveCut_(obj)) continue; + + if (reco::deltaR(candidate,obj) < deltaRMin_) { + return false; + } + } + } + return true; +}; + +//______________________________________________________________________________ +template +auto ObjectViewCleaner::tagsToTokens(std::vector const& tags) -> decltype(srcObjectsToRemove_) +{ + std::vector>> result; + std::transform(std::cbegin(tags), std::cend(tags), std::back_inserter(result), + [this](auto const& tag) { return this->consumes>(tag); }); + return result; } //////////////////////////////////////////////////////////////////////////////// -// plugin definition +// plugin definitions //////////////////////////////////////////////////////////////////////////////// - typedef ObjectViewCleaner TauValCandViewCleaner; typedef ObjectViewCleaner TauValJetViewCleaner; typedef ObjectViewCleaner TauValMuonViewCleaner; @@ -186,7 +176,6 @@ typedef ObjectViewCleaner TauValElectronViewCleaner; typedef ObjectViewCleaner TauValPhotonViewCleaner; typedef ObjectViewCleaner TauValTrackViewCleaner; -#include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(TauValCandViewCleaner); DEFINE_FWK_MODULE(TauValJetViewCleaner); DEFINE_FWK_MODULE(TauValMuonViewCleaner); @@ -194,4 +183,3 @@ DEFINE_FWK_MODULE(TauValGsfElectronViewCleaner); DEFINE_FWK_MODULE(TauValElectronViewCleaner); DEFINE_FWK_MODULE(TauValPhotonViewCleaner); DEFINE_FWK_MODULE(TauValTrackViewCleaner); - From 040d081b61876d1a71be32daeef828509bf7d732 Mon Sep 17 00:00:00 2001 From: Kyle Knoepfel Date: Tue, 21 Feb 2017 16:01:23 -0600 Subject: [PATCH 2/2] Convert from legacy producer to stream producer. --- .../RecoTau/plugins/ObjectViewCleaner.cc | 209 ++++++++---------- 1 file changed, 97 insertions(+), 112 deletions(-) diff --git a/Validation/RecoTau/plugins/ObjectViewCleaner.cc b/Validation/RecoTau/plugins/ObjectViewCleaner.cc index 9c78bd6471495..a74d59579186f 100644 --- a/Validation/RecoTau/plugins/ObjectViewCleaner.cc +++ b/Validation/RecoTau/plugins/ObjectViewCleaner.cc @@ -3,21 +3,12 @@ * * Package: Validation/RecoTau * - * - * Authors: - * - * Kalanand Mishra, Fermilab - kalanand@fnal.gov - * * Description: * - Cleans a given object collection of other * cross-object candidates using deltaR-matching. * - For example: can clean a muon collection by * removing all jets in the muon collection. * - Saves collection of the reference vectors of cleaned objects. - * History: - * Generalized the existing CandViewCleaner - * - * 2010 FNAL *****************************************************************************/ #include "CommonTools/Utils/interface/StringCutObjectSelector.h" @@ -32,7 +23,7 @@ #include "DataFormats/MuonReco/interface/Muon.h" #include "DataFormats/TrackReco/interface/Track.h" -#include "FWCore/Framework/interface/EDProducer.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/MakerMacros.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" @@ -43,126 +34,120 @@ #include #include -//////////////////////////////////////////////////////////////////////////////// -// class definition -//////////////////////////////////////////////////////////////////////////////// -template -class ObjectViewCleaner : public edm::EDProducer { -public: - - // construction/destruction - explicit ObjectViewCleaner(edm::ParameterSet const& iConfig); +namespace { - // member functions - void produce(edm::Event& iEvent, edm::EventSetup const& iSetup) override; - void endJob() override; + // Job-level data + struct Counters { + explicit Counters(std::string const& label) : moduleLabel{label} {} + std::string const moduleLabel; + mutable std::atomic nObjectsTot {}; + mutable std::atomic nObjectsClean {}; + }; -private: + template + class ObjectViewCleaner : public edm::stream::EDProducer> { + public: - // member data - edm::EDGetTokenT> srcCands_; - std::vector>> srcObjectsToRemove_; - double deltaRMin_; - std::string moduleLabel_; - StringCutObjectSelector objKeepCut_; // lazy parsing, to allow cutting on variables not in reco::Candidate class - StringCutObjectSelector objRemoveCut_; // lazy parsing, to allow cutting on variables + explicit ObjectViewCleaner(edm::ParameterSet const&, Counters const*); - std::size_t nObjectsTot_ {}; - std::size_t nObjectsClean_ {}; + void produce(edm::Event&, edm::EventSetup const&) override; + static auto initializeGlobalCache(edm::ParameterSet const& iConfig) + { + return std::make_unique(iConfig.getParameter("@module_label")); + } + static void globalEndJob(Counters const*); - auto tagsToTokens(std::vector const&) -> decltype(srcObjectsToRemove_); - bool isIsolated(edm::Event const&, T const&) const; + private: -}; + // member data + edm::EDGetTokenT> srcCands_; + std::vector>> srcObjectsToRemove_; + double deltaRMin_; + StringCutObjectSelector objKeepCut_; // lazy parsing, to allow cutting on variables not in reco::Candidate class + StringCutObjectSelector objRemoveCut_; // lazy parsing, to allow cutting on variables + auto tagsToTokens(std::vector const&) -> decltype(srcObjectsToRemove_); + bool isIsolated(edm::Event const&, T const&) const; -using namespace std; + }; + using namespace std; -//////////////////////////////////////////////////////////////////////////////// -// construction/destruction -//////////////////////////////////////////////////////////////////////////////// + template + ObjectViewCleaner::ObjectViewCleaner(edm::ParameterSet const& iConfig, Counters const*) + : srcCands_{consumes>(iConfig.getParameter("srcObject"))} + , srcObjectsToRemove_{tagsToTokens(iConfig.getParameter>("srcObjectsToRemove"))} + , deltaRMin_{iConfig.getParameter("deltaRMin")} + , objKeepCut_{iConfig.existsAs("srcObjectSelection") ? iConfig.getParameter("srcObjectSelection") : "", true} + , objRemoveCut_{iConfig.existsAs("srcObjectsToRemoveSelection") ? iConfig.getParameter("srcObjectsToRemoveSelection") : "", true} + { + produces>(); + } -template -ObjectViewCleaner::ObjectViewCleaner(edm::ParameterSet const& iConfig) - : srcCands_{consumes>(iConfig.getParameter("srcObject"))} - , srcObjectsToRemove_{tagsToTokens(iConfig.getParameter>("srcObjectsToRemove"))} - , deltaRMin_{iConfig.getParameter("deltaRMin")} - , moduleLabel_{iConfig.getParameter("@module_label")} - , objKeepCut_{iConfig.existsAs("srcObjectSelection") ? iConfig.getParameter("srcObjectSelection") : "", true} - , objRemoveCut_{iConfig.existsAs("srcObjectsToRemoveSelection") ? iConfig.getParameter("srcObjectsToRemoveSelection") : "", true} -{ - produces>(); -} + //______________________________________________________________________________ + template + void ObjectViewCleaner::produce(edm::Event& iEvent, edm::EventSetup const&) + { + edm::Handle> candidates; + iEvent.getByToken(srcCands_,candidates); + globalCache()->nObjectsTot += candidates->size(); + + auto cleanObjects = std::make_unique>(); + for (unsigned int iCand {}; iCand < candidates->size(); ++iCand) { + auto const& candidate = candidates->at(iCand); + if (objKeepCut_(candidate) && isIsolated(iEvent, candidate)) { + cleanObjects->push_back(candidates->refAt(iCand)); + } + } + globalCache()->nObjectsClean += cleanObjects->size(); -//////////////////////////////////////////////////////////////////////////////// -// implementation of member functions -//////////////////////////////////////////////////////////////////////////////// + iEvent.put(std::move(cleanObjects)); + } -//______________________________________________________________________________ -template -void ObjectViewCleaner::produce(edm::Event& iEvent, edm::EventSetup const&) -{ - edm::Handle> candidates; - iEvent.getByToken(srcCands_,candidates); - nObjectsTot_ += candidates->size(); - - auto cleanObjects = std::make_unique>(); - for (unsigned int iCand {}; iCand < candidates->size(); ++iCand) { - auto const& candidate = candidates->at(iCand); - if (objKeepCut_(candidate) && isIsolated(iEvent, candidate)) { - cleanObjects->push_back(candidates->refAt(iCand)); - } + //______________________________________________________________________________ + template + void ObjectViewCleaner::globalEndJob(Counters const* counters) + { + ostringstream oss; + oss << "nObjectsTot=" << counters->nObjectsTot << " nObjectsClean=" << counters->nObjectsClean + << " fObjectsClean=" << 100*(counters->nObjectsClean/static_cast(counters->nObjectsTot)) << "%\n"; + edm::LogInfo("ObjectViewCleaner") << "++++++++++++++++++++++++++++++++++++++++++++++++++\n" + << counters->moduleLabel << "(ObjectViewCleaner) SUMMARY:\n" + << oss.str() << '\n' + << "++++++++++++++++++++++++++++++++++++++++++++++++++"; } - nObjectsClean_ += cleanObjects->size(); - - iEvent.put(std::move(cleanObjects)); -} - - -//______________________________________________________________________________ -template -void ObjectViewCleaner::endJob() -{ - ostringstream oss; - oss << "nObjectsTot=" << nObjectsTot_ << " nObjectsClean=" << nObjectsClean_ - << " fObjectsClean=" << 100*(nObjectsClean_/static_cast(nObjectsTot_)) << "%\n"; - edm::LogInfo("ObjectViewCleaner") << "++++++++++++++++++++++++++++++++++++++++++++++++++\n" - << moduleLabel_ << "(ObjectViewCleaner) SUMMARY:\n" - << oss.str() << '\n' - << "++++++++++++++++++++++++++++++++++++++++++++++++++"; -} - -//______________________________________________________________________________ -template -bool ObjectViewCleaner::isIsolated(edm::Event const& iEvent, T const& candidate) const -{ - for (auto const& srcObject : srcObjectsToRemove_) { - edm::Handle> objects; - iEvent.getByToken(srcObject, objects); - - for (unsigned int iObj {}; iObj < objects->size() ; ++iObj) { - auto const& obj = objects->at(iObj); - if (!objRemoveCut_(obj)) continue; - - if (reco::deltaR(candidate,obj) < deltaRMin_) { - return false; + + //______________________________________________________________________________ + template + bool ObjectViewCleaner::isIsolated(edm::Event const& iEvent, T const& candidate) const + { + for (auto const& srcObject : srcObjectsToRemove_) { + edm::Handle> objects; + iEvent.getByToken(srcObject, objects); + + for (unsigned int iObj {}; iObj < objects->size() ; ++iObj) { + auto const& obj = objects->at(iObj); + if (!objRemoveCut_(obj)) continue; + + if (reco::deltaR(candidate,obj) < deltaRMin_) { + return false; + } } } + return true; + }; + + //______________________________________________________________________________ + template + auto ObjectViewCleaner::tagsToTokens(std::vector const& tags) -> decltype(srcObjectsToRemove_) + { + std::vector>> result; + std::transform(std::cbegin(tags), std::cend(tags), std::back_inserter(result), + [this](auto const& tag) { return this->consumes>(tag); }); + return result; } - return true; -}; - -//______________________________________________________________________________ -template -auto ObjectViewCleaner::tagsToTokens(std::vector const& tags) -> decltype(srcObjectsToRemove_) -{ - std::vector>> result; - std::transform(std::cbegin(tags), std::cend(tags), std::back_inserter(result), - [this](auto const& tag) { return this->consumes>(tag); }); - return result; -} +} // anonymous namespace //////////////////////////////////////////////////////////////////////////////// // plugin definitions