diff --git a/GeneratorInterface/GenFilters/BuildFile.xml b/GeneratorInterface/GenFilters/BuildFile.xml index 01c67c0f8b07e..bb85410318e4c 100644 --- a/GeneratorInterface/GenFilters/BuildFile.xml +++ b/GeneratorInterface/GenFilters/BuildFile.xml @@ -1,3 +1,4 @@ + diff --git a/GeneratorInterface/GenFilters/python/LHEJetFilter_cfi.py b/GeneratorInterface/GenFilters/python/LHEJetFilter_cfi.py new file mode 100644 index 0000000000000..18ce6fea6939b --- /dev/null +++ b/GeneratorInterface/GenFilters/python/LHEJetFilter_cfi.py @@ -0,0 +1,8 @@ +import FWCore.ParameterSet.Config as cms + +LHEJetFilter = cms.EDFilter('LHEJetFilter', +jetPtMin = cms.double(350.), +jetR = cms.double(0.8), +src = cms.InputTag('externalLHEProducer') +) + diff --git a/GeneratorInterface/GenFilters/src/LHEJetFilter.cc b/GeneratorInterface/GenFilters/src/LHEJetFilter.cc new file mode 100644 index 0000000000000..ed09471f1c109 --- /dev/null +++ b/GeneratorInterface/GenFilters/src/LHEJetFilter.cc @@ -0,0 +1,71 @@ +#include + +#include "FWCore/Framework/interface/EDFilter.h" +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/InputTag.h" + +#include "DataFormats/Common/interface/Handle.h" + +#include "SimDataFormats/GeneratorProducts/interface/LHEEventProduct.h" + +#include "fastjet/PseudoJet.hh" +#include "fastjet/JetDefinition.hh" +#include "fastjet/ClusterSequence.hh" +#include "fastjet/Selector.hh" + +using namespace std; +using namespace fastjet; + +class LHEJetFilter : public edm::EDFilter { +public: + explicit LHEJetFilter(const edm::ParameterSet&); + ~LHEJetFilter() override {} + +private: + bool filter(edm::Event&, const edm::EventSetup&) override; + + edm::EDGetTokenT tokenLHEEvent_; + double jetPtMin_; + JetDefinition jetdef_; + + vector jetconsts_; +}; + +LHEJetFilter::LHEJetFilter(const edm::ParameterSet& params) + : tokenLHEEvent_(consumes(params.getParameter("src"))), + jetPtMin_(params.getParameter("jetPtMin")), + jetdef_(antikt_algorithm, params.getParameter("jetR")) {} + +bool LHEJetFilter::filter(edm::Event& evt, const edm::EventSetup& params) { + edm::Handle lheinfo; + evt.getByToken(tokenLHEEvent_, lheinfo); + + if (!lheinfo.isValid()) { + return true; + } + + jetconsts_.clear(); + const lhef::HEPEUP& hepeup = lheinfo->hepeup(); + for (size_t p = 0; p < hepeup.IDUP.size(); ++p) { + if (hepeup.ISTUP[p] == 1) { + const lhef::HEPEUP::FiveVector& mom = hepeup.PUP[p]; + jetconsts_.emplace_back(mom[0], mom[1], mom[2], mom[3]); + } + } + + ClusterSequence cs(jetconsts_, jetdef_); + vector jets = sorted_by_pt(cs.inclusive_jets()); + + if (jets.empty()) { + return false; + } + + return jets[0].perp() > jetPtMin_; +} + +// Define module as a plug-in +DEFINE_FWK_MODULE(LHEJetFilter);