File indexing completed on 2023-10-25 09:58:26
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include "CondFormats/JetMETObjects/interface/JetCorrectionUncertainty.h"
0021 #include "CondFormats/JetMETObjects/interface/JetCorrectorParameters.h"
0022 #include "DataFormats/Candidate/interface/Candidate.h"
0023 #include "DataFormats/JetReco/interface/PFJet.h"
0024 #include "DataFormats/JetReco/interface/PFJetCollection.h"
0025 #include "DataFormats/Math/interface/deltaR.h"
0026 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
0027 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidateFwd.h"
0028 #include "FWCore/Framework/interface/ESHandle.h"
0029 #include "FWCore/Framework/interface/Event.h"
0030 #include "FWCore/Framework/interface/EventSetup.h"
0031 #include "FWCore/Framework/interface/stream/EDProducer.h"
0032 #include "FWCore/ParameterSet/interface/FileInPath.h"
0033 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0034 #include "FWCore/Utilities/interface/InputTag.h"
0035 #include "JetMETCorrections/Objects/interface/JetCorrectionsRecord.h"
0036
0037 #include <string>
0038 #include <vector>
0039
0040 class ShiftedPFCandidateProducerForNoPileUpPFMEt : public edm::stream::EDProducer<> {
0041 public:
0042 explicit ShiftedPFCandidateProducerForNoPileUpPFMEt(const edm::ParameterSet&);
0043
0044 private:
0045 void produce(edm::Event&, const edm::EventSetup&) override;
0046
0047 edm::EDGetTokenT<reco::PFCandidateCollection> srcPFCandidatesToken_;
0048 edm::EDGetTokenT<reco::PFJetCollection> srcJetsToken_;
0049
0050 edm::FileInPath jetCorrInputFileName_;
0051 std::string jetCorrPayloadName_;
0052 edm::ESGetToken<JetCorrectorParametersCollection, JetCorrectionsRecord> jetCorrPayloadToken_;
0053 std::string jetCorrUncertaintyTag_;
0054 std::unique_ptr<JetCorrectorParameters> jetCorrParameters_;
0055 std::unique_ptr<JetCorrectionUncertainty> jecUncertainty_;
0056
0057 double minJetPt_;
0058
0059 double shiftBy_;
0060
0061 double unclEnUncertainty_;
0062 };
0063
0064 ShiftedPFCandidateProducerForNoPileUpPFMEt::ShiftedPFCandidateProducerForNoPileUpPFMEt(const edm::ParameterSet& cfg)
0065 : srcPFCandidatesToken_(consumes<reco::PFCandidateCollection>(cfg.getParameter<edm::InputTag>("srcPFCandidates"))),
0066 srcJetsToken_(consumes<reco::PFJetCollection>(cfg.getParameter<edm::InputTag>("srcJets"))) {
0067 jetCorrUncertaintyTag_ = cfg.getParameter<std::string>("jetCorrUncertaintyTag");
0068 if (cfg.exists("jetCorrInputFileName")) {
0069 jetCorrInputFileName_ = cfg.getParameter<edm::FileInPath>("jetCorrInputFileName");
0070 if (jetCorrInputFileName_.location() == edm::FileInPath::Unknown)
0071 throw cms::Exception("ShiftedJetProducerT")
0072 << " Failed to find JEC parameter file = " << jetCorrInputFileName_ << " !!\n";
0073 jetCorrParameters_ =
0074 std::make_unique<JetCorrectorParameters>(jetCorrInputFileName_.fullPath(), jetCorrUncertaintyTag_);
0075 jecUncertainty_ = std::make_unique<JetCorrectionUncertainty>(*jetCorrParameters_);
0076 } else {
0077 jetCorrPayloadName_ = cfg.getParameter<std::string>("jetCorrPayloadName");
0078 jetCorrPayloadToken_ = esConsumes(edm::ESInputTag("", jetCorrPayloadName_));
0079 }
0080
0081 minJetPt_ = cfg.getParameter<double>("minJetPt");
0082
0083 shiftBy_ = cfg.getParameter<double>("shiftBy");
0084
0085 unclEnUncertainty_ = cfg.getParameter<double>("unclEnUncertainty");
0086
0087 produces<reco::PFCandidateCollection>();
0088 }
0089
0090 void ShiftedPFCandidateProducerForNoPileUpPFMEt::produce(edm::Event& evt, const edm::EventSetup& es) {
0091 edm::Handle<reco::PFCandidateCollection> originalPFCandidates;
0092 evt.getByToken(srcPFCandidatesToken_, originalPFCandidates);
0093
0094 edm::Handle<reco::PFJetCollection> jets;
0095 evt.getByToken(srcJetsToken_, jets);
0096
0097 std::vector<const reco::PFJet*> selectedJets;
0098 for (reco::PFJetCollection::const_iterator jet = jets->begin(); jet != jets->end(); ++jet) {
0099 if (jet->pt() > minJetPt_)
0100 selectedJets.push_back(&(*jet));
0101 }
0102
0103 if (!jetCorrPayloadName_.empty()) {
0104 const JetCorrectorParametersCollection& jetCorrParameterSet = es.getData(jetCorrPayloadToken_);
0105 const JetCorrectorParameters& jetCorrParameters = (jetCorrParameterSet)[jetCorrUncertaintyTag_];
0106 jecUncertainty_ = std::make_unique<JetCorrectionUncertainty>(jetCorrParameters);
0107 }
0108
0109 auto shiftedPFCandidates = std::make_unique<reco::PFCandidateCollection>();
0110 for (reco::PFCandidateCollection::const_iterator originalPFCandidate = originalPFCandidates->begin();
0111 originalPFCandidate != originalPFCandidates->end();
0112 ++originalPFCandidate) {
0113 const reco::PFJet* jet_matched = nullptr;
0114 for (std::vector<const reco::PFJet*>::iterator jet = selectedJets.begin(); jet != selectedJets.end(); ++jet) {
0115 std::vector<reco::PFCandidatePtr> jetConstituents = (*jet)->getPFConstituents();
0116 for (std::vector<reco::PFCandidatePtr>::const_iterator jetConstituent = jetConstituents.begin();
0117 jetConstituent != jetConstituents.end() && !jet_matched;
0118 ++jetConstituent) {
0119 if (deltaR(originalPFCandidate->p4(), (*jetConstituent)->p4()) < 1.e-2)
0120 jet_matched = (*jet);
0121 }
0122 }
0123
0124 double shift = 0.;
0125 if (jet_matched) {
0126 jecUncertainty_->setJetEta(jet_matched->eta());
0127 jecUncertainty_->setJetPt(jet_matched->pt());
0128
0129 shift = jecUncertainty_->getUncertainty(true);
0130 } else {
0131 shift = unclEnUncertainty_;
0132 }
0133
0134 shift *= shiftBy_;
0135
0136 reco::Candidate::LorentzVector shiftedPFCandidateP4 = originalPFCandidate->p4();
0137 shiftedPFCandidateP4 *= (1. + shift);
0138
0139 reco::PFCandidate shiftedPFCandidate(*originalPFCandidate);
0140 shiftedPFCandidate.setP4(shiftedPFCandidateP4);
0141
0142 shiftedPFCandidates->push_back(shiftedPFCandidate);
0143 }
0144
0145 evt.put(std::move(shiftedPFCandidates));
0146 }
0147
0148 #include "FWCore/Framework/interface/MakerMacros.h"
0149
0150 DEFINE_FWK_MODULE(ShiftedPFCandidateProducerForNoPileUpPFMEt);