diff --git a/PhysicsTools/PatAlgos/plugins/PATMETSlimmer.cc b/PhysicsTools/PatAlgos/plugins/PATMETSlimmer.cc index a930cb9452fc7..b1902d557d9e9 100644 --- a/PhysicsTools/PatAlgos/plugins/PATMETSlimmer.cc +++ b/PhysicsTools/PatAlgos/plugins/PATMETSlimmer.cc @@ -117,8 +117,8 @@ pat::PATMETSlimmer::OneMETShift::OneMETShift(pat::MET::METUncertainty shift_, pa case pat::MET::NoShift : snprintf(buff, 1023, baseTagStr.c_str(), ""); break; case pat::MET::JetEnUp : snprintf(buff, 1023, baseTagStr.c_str(), "JetEnUp"); break; case pat::MET::JetEnDown: snprintf(buff, 1023, baseTagStr.c_str(), "JetEnDown"); break; - case pat::MET::JetResUp : snprintf(buff, 1023, baseTagStr.c_str(), isSmeared?"JetResUp":""); break; - case pat::MET::JetResDown: snprintf(buff, 1023, baseTagStr.c_str(), isSmeared?"JetResDown":""); break; + case pat::MET::JetResUp : snprintf(buff, 1023, baseTagStr.c_str(), "JetResUp"); break; + case pat::MET::JetResDown: snprintf(buff, 1023, baseTagStr.c_str(), "JetResDown"); break; case pat::MET::MuonEnUp : snprintf(buff, 1023, baseTagStr.c_str(), "MuonEnUp"); break; case pat::MET::MuonEnDown: snprintf(buff, 1023, baseTagStr.c_str(), "MuonEnDown"); break; case pat::MET::ElectronEnUp : snprintf(buff, 1023, baseTagStr.c_str(), "ElectronEnUp"); break; diff --git a/PhysicsTools/PatUtils/interface/SmearedJetProducerT.h b/PhysicsTools/PatUtils/interface/SmearedJetProducerT.h index 5bc1cb7bc9d8f..3a30d392873b8 100644 --- a/PhysicsTools/PatUtils/interface/SmearedJetProducerT.h +++ b/PhysicsTools/PatUtils/interface/SmearedJetProducerT.h @@ -131,14 +131,23 @@ class SmearedJetProducerT : public edm::stream::EDProducer<> { m_genJetMatcher = std::make_shared(cfg, consumesCollector()); std::int32_t variation = cfg.getParameter("variation"); + m_nomVar=1; if (variation == 0) m_systematic_variation = Variation::NOMINAL; else if (variation == 1) m_systematic_variation = Variation::UP; else if (variation == -1) m_systematic_variation = Variation::DOWN; + else if (variation == 101) { + m_systematic_variation = Variation::NOMINAL; + m_nomVar=1; + } + else if (variation == -101) { + m_systematic_variation = Variation::NOMINAL; + m_nomVar=-1; + } else - throw edm::Exception(edm::errors::ConfigFileReadError, "Invalid value for 'variation' parameter. Only -1, 0 or 1 are supported."); + throw edm::Exception(edm::errors::ConfigFileReadError, "Invalid value for 'variation' parameter. Only -1, 0, 1 or 101, -101 are supported."); } produces(); @@ -234,7 +243,7 @@ class SmearedJetProducerT : public edm::stream::EDProducer<> { } double dPt = jet.pt() - genJet->pt(); - smearFactor = 1 + (jer_sf - 1.) * dPt / jet.pt(); + smearFactor = 1 + m_nomVar*(jer_sf - 1.) * dPt / jet.pt(); } else if (jer_sf > 1) { /* @@ -247,7 +256,7 @@ class SmearedJetProducerT : public edm::stream::EDProducer<> { } std::normal_distribution<> d(0, sigma); - smearFactor = 1. + d(m_random_generator); + smearFactor = 1. + m_nomVar*d(m_random_generator); } else if (m_debug) { std::cout << "Impossible to smear this jet" << std::endl; } @@ -298,5 +307,7 @@ class SmearedJetProducerT : public edm::stream::EDProducer<> { std::mt19937 m_random_generator; GreaterByPt jetPtComparator; + + int m_nomVar; }; #endif diff --git a/PhysicsTools/PatUtils/plugins/CorrectedPATMETProducer.cc b/PhysicsTools/PatUtils/plugins/CorrectedPATMETProducer.cc index b804e1228b4a2..426cac99065d0 100644 --- a/PhysicsTools/PatUtils/plugins/CorrectedPATMETProducer.cc +++ b/PhysicsTools/PatUtils/plugins/CorrectedPATMETProducer.cc @@ -15,6 +15,7 @@ #include "DataFormats/METReco/interface/CorrMETData.h" #include "JetMETCorrections/Type1MET/interface/AddCorrectionsToGenericMET.h" +#include "RecoMET/METAlgorithms/interface/METSignificance.h" #include @@ -49,7 +50,6 @@ class CorrectedPATMETProducer : public edm::stream::EDProducer<> edm::EDGetTokenT token_; - void produce(edm::Event& evt, const edm::EventSetup& es) override { edm::Handle srcMETCollection; @@ -62,6 +62,14 @@ class CorrectedPATMETProducer : public edm::stream::EDProducer<> pat::MET outMET(corrMET, srcMET); auto product = std::make_unique(); + + reco::METCovMatrix cov=srcMET.getSignificanceMatrix(); + if( !(cov(0,0)==0 && cov(0,1)==0 && cov(1,0)==0 && cov(1,1)==0) ) { + outMET.setSignificanceMatrix(cov); + double metSig=metsig::METSignificance::getSignificance(cov, outMET); + outMET.setMETSignificance(metSig); + } + product->push_back(outMET); evt.put(std::move(product)); } diff --git a/PhysicsTools/PatUtils/python/tools/runMETCorrectionsAndUncertainties.py b/PhysicsTools/PatUtils/python/tools/runMETCorrectionsAndUncertainties.py index b27a645b6b951..f5830db301ee9 100644 --- a/PhysicsTools/PatUtils/python/tools/runMETCorrectionsAndUncertainties.py +++ b/PhysicsTools/PatUtils/python/tools/runMETCorrectionsAndUncertainties.py @@ -966,7 +966,10 @@ def getVariations(self, process, metModName, identifier,preId, objectCollection, smear=False if "Smear" in metModName: smear=True - + else: + smear=True + varyByNsigmas=101 + shiftedCollModules['Up'] = self.createShiftedJetResModule(process, smear, objectCollection, +1.*varyByNsigmas, "Up", postfix) shiftedCollModules['Down'] = self.createShiftedJetResModule(process, smear, objectCollection, -1.*varyByNsigmas, @@ -1464,6 +1467,9 @@ def miniAODConfigurationPost(self, process, postfix): if hasattr(process, "patPFMetTxyCorr"+postfix): getattr(process, "patPFMetTxyCorr"+postfix).vertexCollection = cms.InputTag("offlineSlimmedPrimaryVertices") + if self._parameters['computeUncertainties'].value: + getattr(process, "shiftedPatJetResDown"+postfix).genJets = cms.InputTag("slimmedGenJets") + getattr(process, "shiftedPatJetResUp"+postfix).genJets = cms.InputTag("slimmedGenJets") def miniAODConfiguration(self, process, pfCandCollection, jetCollection, diff --git a/RecoMET/METAlgorithms/interface/METSignificance.h b/RecoMET/METAlgorithms/interface/METSignificance.h index a2912483ce43a..33a27610ecbbe 100644 --- a/RecoMET/METAlgorithms/interface/METSignificance.h +++ b/RecoMET/METAlgorithms/interface/METSignificance.h @@ -46,7 +46,7 @@ namespace metsig { JME::JetResolutionScaleFactor & resSFObj, bool isRealData); - double getSignificance(const reco::METCovMatrix& cov, const reco::MET& met ) const; + static double getSignificance(const reco::METCovMatrix& cov, const reco::MET& met ); private: bool cleanJet(const reco::Jet& jet, diff --git a/RecoMET/METAlgorithms/src/METSignificance.cc b/RecoMET/METAlgorithms/src/METSignificance.cc index 7dbeefc274680..3ba29c5a9398c 100644 --- a/RecoMET/METAlgorithms/src/METSignificance.cc +++ b/RecoMET/METAlgorithms/src/METSignificance.cc @@ -29,7 +29,7 @@ metsig::METSignificance::METSignificance(const edm::ParameterSet& iConfig) { jetEtas_ = cfgParams.getParameter >("jeta"); jetParams_ = cfgParams.getParameter >("jpar"); pjetParams_ = cfgParams.getParameter >("pjpar"); - + } metsig::METSignificance::~METSignificance() { @@ -172,7 +172,7 @@ metsig::METSignificance::getCovariance(const edm::View& jets, } double -metsig::METSignificance::getSignificance(const reco::METCovMatrix& cov, const reco::MET& met) const { +metsig::METSignificance::getSignificance(const reco::METCovMatrix& cov, const reco::MET& met) { // covariance matrix determinant double det = cov(0,0)*cov(1,1) - cov(0,1)*cov(1,0);