File indexing completed on 2024-09-22 22:37:23
0001 #include "FWCore/Framework/interface/Frameworkfwd.h"
0002 #include "FWCore/Framework/interface/stream/EDProducer.h"
0003
0004 #include "FWCore/Framework/interface/Event.h"
0005 #include "FWCore/Framework/interface/MakerMacros.h"
0006
0007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0008 #include "FWCore/Utilities/interface/StreamID.h"
0009
0010 #include "DataFormats/PatCandidates/interface/Jet.h"
0011 #include "DataFormats/PatCandidates/interface/PackedCandidate.h"
0012 #include "DataFormats/PatCandidates/interface/PackedGenParticle.h"
0013
0014 #include "DataFormats/Candidate/interface/CandidateFwd.h"
0015
0016 #include "CommonTools/Utils/interface/StringCutObjectSelector.h"
0017 #include "DataFormats/NanoAOD/interface/FlatTable.h"
0018
0019 template <typename T>
0020 class SimpleJetConstituentTableProducer : public edm::stream::EDProducer<> {
0021 public:
0022 explicit SimpleJetConstituentTableProducer(const edm::ParameterSet &);
0023 ~SimpleJetConstituentTableProducer() override;
0024
0025 static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
0026
0027 private:
0028 void produce(edm::Event &, const edm::EventSetup &) override;
0029
0030 const std::string name_;
0031 const std::string candIdxName_;
0032 const std::string candIdxDoc_;
0033
0034 edm::EDGetTokenT<edm::View<T>> jet_token_;
0035 edm::EDGetTokenT<reco::CandidateView> cand_token_;
0036
0037 const StringCutObjectSelector<T> jetCut_;
0038
0039 edm::Handle<reco::CandidateView> cands_;
0040 };
0041
0042
0043
0044
0045 template <typename T>
0046 SimpleJetConstituentTableProducer<T>::SimpleJetConstituentTableProducer(const edm::ParameterSet &iConfig)
0047 : name_(iConfig.getParameter<std::string>("name")),
0048 candIdxName_(iConfig.getParameter<std::string>("candIdxName")),
0049 candIdxDoc_(iConfig.getParameter<std::string>("candIdxDoc")),
0050 jet_token_(consumes<edm::View<T>>(iConfig.getParameter<edm::InputTag>("jets"))),
0051 cand_token_(consumes<reco::CandidateView>(iConfig.getParameter<edm::InputTag>("candidates"))),
0052 jetCut_(iConfig.getParameter<std::string>("jetCut")) {
0053 produces<nanoaod::FlatTable>(name_);
0054 produces<std::vector<reco::CandidatePtr>>();
0055 }
0056
0057 template <typename T>
0058 SimpleJetConstituentTableProducer<T>::~SimpleJetConstituentTableProducer() {}
0059
0060 template <typename T>
0061 void SimpleJetConstituentTableProducer<T>::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) {
0062
0063 auto outCands = std::make_unique<std::vector<reco::CandidatePtr>>();
0064
0065 auto jets = iEvent.getHandle(jet_token_);
0066
0067 iEvent.getByToken(cand_token_, cands_);
0068 auto candPtrs = cands_->ptrs();
0069
0070
0071
0072
0073 std::vector<T> jetsPassCut;
0074 for (unsigned jetIdx = 0; jetIdx < jets->size(); ++jetIdx) {
0075 const auto &jet = jets->at(jetIdx);
0076 if (!jetCut_(jet))
0077 continue;
0078 jetsPassCut.push_back(jets->at(jetIdx));
0079 }
0080
0081
0082
0083
0084 std::vector<int> parentJetIdx;
0085 std::vector<int> candIdx;
0086 for (unsigned jetIdx = 0; jetIdx < jetsPassCut.size(); ++jetIdx) {
0087 const auto &jet = jetsPassCut.at(jetIdx);
0088
0089
0090
0091
0092 std::vector<reco::CandidatePtr> const &daughters = jet.daughterPtrVector();
0093 for (const auto &cand : daughters) {
0094 auto candInNewList = std::find(candPtrs.begin(), candPtrs.end(), cand);
0095 if (candInNewList == candPtrs.end()) {
0096 continue;
0097 }
0098 outCands->push_back(cand);
0099 parentJetIdx.push_back(jetIdx);
0100 candIdx.push_back(candInNewList - candPtrs.begin());
0101 }
0102 }
0103
0104 auto candTable = std::make_unique<nanoaod::FlatTable>(outCands->size(), name_, false);
0105
0106 candTable->addColumn<int>(candIdxName_, candIdx, candIdxDoc_);
0107
0108 std::string parentJetIdxName("jetIdx");
0109 std::string parentJetIdxDoc("Index of the parent jet");
0110 if constexpr (std::is_same<T, reco::GenJet>::value) {
0111 parentJetIdxName = "genJetIdx";
0112 parentJetIdxDoc = "Index of the parent gen jet";
0113 }
0114 candTable->addColumn<int>(parentJetIdxName, parentJetIdx, parentJetIdxDoc);
0115
0116 iEvent.put(std::move(candTable), name_);
0117 iEvent.put(std::move(outCands));
0118 }
0119
0120 template <typename T>
0121 void SimpleJetConstituentTableProducer<T>::fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
0122 edm::ParameterSetDescription desc;
0123 desc.add<std::string>("name", "FatJetPFCand");
0124 desc.add<std::string>("candIdxName", "PFCandIdx");
0125 desc.add<std::string>("candIdxDoc", "Index in PFCand table");
0126 desc.add<edm::InputTag>("jets", edm::InputTag("finalJetsAK8"));
0127 desc.add<edm::InputTag>("candidates", edm::InputTag("packedPFCandidates"));
0128 desc.add<std::string>("jetCut", "");
0129 descriptions.addWithDefaultLabel(desc);
0130 }
0131
0132 typedef SimpleJetConstituentTableProducer<pat::Jet> SimplePatJetConstituentTableProducer;
0133 typedef SimpleJetConstituentTableProducer<reco::GenJet> SimpleGenJetConstituentTableProducer;
0134
0135 DEFINE_FWK_MODULE(SimplePatJetConstituentTableProducer);
0136 DEFINE_FWK_MODULE(SimpleGenJetConstituentTableProducer);