LHEJetFilter

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
#include <vector>

#include "FWCore/Framework/interface/global/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::global::EDFilter<> {
public:
  explicit LHEJetFilter(const edm::ParameterSet&);
  ~LHEJetFilter() override {}

private:
  bool filter(edm::StreamID strid, edm::Event& evt, const edm::EventSetup& params) const override;

  edm::EDGetTokenT<LHEEventProduct> tokenLHEEvent_;
  double jetPtMin_;
  JetDefinition jetdef_;
};

LHEJetFilter::LHEJetFilter(const edm::ParameterSet& params)
    : tokenLHEEvent_(consumes<LHEEventProduct>(params.getParameter<edm::InputTag>("src"))),
      jetPtMin_(params.getParameter<double>("jetPtMin")),
      jetdef_(antikt_algorithm, params.getParameter<double>("jetR")) {}

bool LHEJetFilter::filter(edm::StreamID strid, edm::Event& evt, const edm::EventSetup& params) const {
  edm::Handle<LHEEventProduct> lheinfo;
  evt.getByToken(tokenLHEEvent_, lheinfo);

  if (!lheinfo.isValid()) {
    return true;
  }

  vector<PseudoJet> jetconsts;
  jetconsts.reserve(10);
  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<PseudoJet> jets = cs.inclusive_jets(jetPtMin_);

  return !jets.empty();
}

// Define module as a plug-in
DEFINE_FWK_MODULE(LHEJetFilter);