File indexing completed on 2025-01-31 02:19:45
0001
0002
0003
0004 #include "JetMETCorrections/Algorithms/interface/LXXXCorrectorImpl.h"
0005 #include "CondFormats/JetMETObjects/interface/FactorizedJetCorrectorCalculator.h"
0006
0007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0008 #include "FWCore/Framework/interface/ConsumesCollector.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0011 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0012 #include "DataFormats/JetReco/interface/Jet.h"
0013 #include "DataFormats/JetReco/interface/CaloJet.h"
0014 #include "DataFormats/JetReco/interface/JPTJet.h"
0015
0016 using namespace std;
0017
0018 LXXXCorrectorImplMaker::LXXXCorrectorImplMaker(edm::ParameterSet const& fConfig, edm::ConsumesCollector iC)
0019 : JetCorrectorImplMakerBase(fConfig, std::move(iC)) {}
0020
0021 std::unique_ptr<reco::JetCorrectorImpl> LXXXCorrectorImplMaker::make(edm::Event const&, edm::EventSetup const& fSetup) {
0022 unsigned int level = 0;
0023 auto calculator = getCalculator(fSetup, [&level](std::string const& levelName) {
0024 if (levelName == "L2Relative")
0025 level = 2;
0026 else if (levelName == "L3Absolute")
0027 level = 3;
0028 else if (levelName == "L4EMF")
0029 level = 4;
0030 else if (levelName == "L5Flavor")
0031 level = 5;
0032 else if (levelName == "L7Parton")
0033 level = 7;
0034 else if (levelName == "L2L3Residual")
0035 level = 8;
0036 else
0037 throw cms::Exception("LXXXCorrectorImpl") << " unknown correction level " << levelName;
0038 });
0039 return std::unique_ptr<reco::JetCorrectorImpl>(new LXXXCorrectorImpl(calculator, level));
0040 }
0041
0042 void LXXXCorrectorImplMaker::fillDescriptions(edm::ConfigurationDescriptions& iDescriptions) {
0043 edm::ParameterSetDescription desc;
0044 addToDescription(desc);
0045 iDescriptions.addWithDefaultLabel(desc);
0046 }
0047
0048
0049
0050
0051 LXXXCorrectorImpl::LXXXCorrectorImpl(std::shared_ptr<FactorizedJetCorrectorCalculator const> calculator,
0052 unsigned int level)
0053 : mLevel(level), mCorrector(calculator) {}
0054
0055
0056
0057 double LXXXCorrectorImpl::correction(const LorentzVector& fJet) const {
0058
0059 if (mLevel == 4) {
0060 throw cms::Exception("Invalid jet type") << "L4EMFCorrection is applicable to CaloJets only";
0061 return 1;
0062 }
0063
0064 FactorizedJetCorrectorCalculator::VariableValues values;
0065 values.setJetEta(fJet.eta());
0066 values.setJetE(fJet.energy());
0067 values.setJetPt(fJet.pt());
0068 values.setJetPhi(fJet.phi());
0069
0070 return mCorrector->getCorrection(values);
0071 }
0072
0073
0074
0075 double LXXXCorrectorImpl::correction(const reco::Jet& fJet) const {
0076 double result = 1.;
0077
0078 if (mLevel == 4) {
0079 const reco::CaloJet& caloJet = dynamic_cast<const reco::CaloJet&>(fJet);
0080 FactorizedJetCorrectorCalculator::VariableValues values;
0081 values.setJetEta(fJet.eta());
0082 values.setJetPt(fJet.pt());
0083 values.setJetEMF(caloJet.emEnergyFraction());
0084 result = mCorrector->getCorrection(values);
0085 } else
0086 result = correction(fJet.p4());
0087 return result;
0088 }