diff --git a/Validation/RecoTau/plugins/ObjectViewCleaner.cc b/Validation/RecoTau/plugins/ObjectViewCleaner.cc index ba98f3f13b9ab..a74d59579186f 100644 --- a/Validation/RecoTau/plugins/ObjectViewCleaner.cc +++ b/Validation/RecoTau/plugins/ObjectViewCleaner.cc @@ -1,183 +1,158 @@ /***************************************************************************** * Project: CMS detector at the CERN * - * Package: PhysicsTools/TagAndProbe - * - * - * Authors: - * - * Kalanand Mishra, Fermilab - kalanand@fnal.gov + * Package: Validation/RecoTau * * 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 *****************************************************************************/ -//////////////////////////////////////////////////////////////////////////////// -// 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/stream/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 -{ -public: - // construction/destruction - ObjectViewCleaner(const edm::ParameterSet& iConfig); - virtual ~ObjectViewCleaner(); - - // member functions - void produce(edm::Event& iEvent,const edm::EventSetup& iSetup) override; - void endJob() override; - -private: - // member data - edm::EDGetTokenT > srcCands_; - std::vector > > srcObjects_; - 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 - - unsigned int nObjectsTot_; - unsigned int nObjectsClean_; -}; - - -using namespace std; +namespace { + // 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 {}; + }; -//////////////////////////////////////////////////////////////////////////////// -// construction/destruction -//////////////////////////////////////////////////////////////////////////////// + template + class ObjectViewCleaner : public edm::stream::EDProducer> { + public: -//______________________________________________________________________________ -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)); - } -} + explicit ObjectViewCleaner(edm::ParameterSet const&, Counters const*); + + 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*); + private: -//______________________________________________________________________________ -template -ObjectViewCleaner::~ObjectViewCleaner() -{ - -} + // 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; + }; -//////////////////////////////////////////////////////////////////////////////// -// implementation of member functions -//////////////////////////////////////////////////////////////////////////////// + using namespace std; -//______________________________________________________________________________ -template -void ObjectViewCleaner::produce(edm::Event& iEvent,const edm::EventSetup& iSetup) -{ - unique_ptr > - cleanObjects(new edm::RefToBaseVector()); - - 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); + 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 + 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(); + + iEvent.put(std::move(cleanObjects)); + } + + //______________________________________________________________________________ + 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' + << "++++++++++++++++++++++++++++++++++++++++++++++++++"; + } + + //______________________________________________________________________________ + 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; - double deltaR = reco::deltaR(candidate,obj); - if (deltaR + 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; } - - for (unsigned int iObject=0;iObjectsize();iObject++) - if (isClean[iObject]) cleanObjects->push_back(candidates->refAt(iObject)); - - nObjectsTot_ +=candidates->size(); - nObjectsClean_+=cleanObjects->size(); - - delete [] isClean; - iEvent.put(std::move(cleanObjects)); -} - - -//______________________________________________________________________________ -template -void ObjectViewCleaner::endJob() -{ - stringstream ss; - ss<<"nObjectsTot="< TauValCandViewCleaner; typedef ObjectViewCleaner TauValJetViewCleaner; typedef ObjectViewCleaner TauValMuonViewCleaner; @@ -186,7 +161,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 +168,3 @@ DEFINE_FWK_MODULE(TauValGsfElectronViewCleaner); DEFINE_FWK_MODULE(TauValElectronViewCleaner); DEFINE_FWK_MODULE(TauValPhotonViewCleaner); DEFINE_FWK_MODULE(TauValTrackViewCleaner); -