Back to home page

Project CMSSW displayed by LXR

 
 

    


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 // constructors and destructor
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   // elements in all these collections must have the same order!
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   // First, select jets
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   // Then loop over selected jets
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     // Loop over jet constituents
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   }  // end jet loop
0103 
0104   auto candTable = std::make_unique<nanoaod::FlatTable>(outCands->size(), name_, false);
0105   // We fill from here only stuff that cannot be created with the SimpleFlatTableProducer
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);