CMS 3D CMS Logo

ChainedJetCorrectorProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: JetMETCorrections/Modules
4 // Class: ChainedJetCorrectorProducer
5 //
13 //
14 // Original Author: Christopher Jones
15 // Created: Tue, 02 Sep 2014 18:11:02 GMT
16 //
17 //
18 
19 
20 // system include files
21 #include <memory>
22 #include <vector>
23 
24 // user include files
27 
30 
34 
37 
39 
42 
43 
44 //
45 // class declaration
46 //
47 namespace {
48  class ChainedJetCorrectorImpl : public reco::JetCorrectorImpl {
49  public:
50  ChainedJetCorrectorImpl(std::vector<reco::JetCorrector const*> correctors):
51  jetCorrectors_(std::move(correctors)) {}
52 
53  double correction (const LorentzVector& fJet) const override;
54 
56  double correction (const reco::Jet& fJet) const override;
57 
59  double correction (const reco::Jet& fJet,
60  const edm::RefToBase<reco::Jet>& fJetRef) const override ;
61 
63  bool refRequired () const override;
64 
65  private:
66  std::vector<reco::JetCorrector const*> jetCorrectors_;
67  };
68 
69  double ChainedJetCorrectorImpl::correction (const LorentzVector& fJet) const
70  {
71  LorentzVector jet = fJet;
72  double result = 1;
73  for (auto cor: jetCorrectors_) {
74  double scale = cor->correction (jet);
75  jet *= scale;
76  result *= scale;
77  }
78  return result;
79  }
80 
82  double ChainedJetCorrectorImpl::correction (const reco::Jet& fJet) const
83  {
84  std::unique_ptr<reco::Jet> jet (dynamic_cast<reco::Jet*> (fJet.clone ()));
85  double result = 1;
86  for (auto cor: jetCorrectors_) {
87  double scale = cor->correction (*jet);
88  jet->scaleEnergy (scale);
89  result *= scale;
90  }
91  return result;
92  }
93 
95  double ChainedJetCorrectorImpl::correction (const reco::Jet& fJet,
96  const edm::RefToBase<reco::Jet>& fJetRef) const
97  {
98  std::unique_ptr<reco::Jet> jet (dynamic_cast<reco::Jet*> (fJet.clone ()));
99  double result = 1;
100  for (auto cor: jetCorrectors_) {
101  double scale = cor->correction (*jet, fJetRef);
102  jet->scaleEnergy (scale);
103  result *= scale;
104  }
105  return result;
106  }
107 
109  bool ChainedJetCorrectorImpl::refRequired () const
110  {
111  for (auto cor: jetCorrectors_) {
112  if (cor->refRequired ()) return true;
113  }
114  return false;
115  }
116 
117 }
118 
119 
121  public:
123 
124  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
125 
126  private:
127  void produce(edm::Event&, const edm::EventSetup&) override;
128 
129  // ----------member data ---------------------------
130  std::vector<edm::EDGetTokenT<reco::JetCorrector>> correctorTokens_;
131 };
132 
133 //
134 // constants, enums and typedefs
135 //
136 
137 
138 //
139 // static data member definitions
140 //
141 
142 //
143 // constructors and destructor
144 //
146 {
147  //register your products
148  produces<reco::JetCorrector>();
149 
150  auto const& tags = iConfig.getParameter<std::vector<edm::InputTag>>("correctors");
151  correctorTokens_.reserve(tags.size());
152 
153  for(auto const& tag : tags) {
154  correctorTokens_.emplace_back( consumes<reco::JetCorrector>(tag));
155  }
156 }
157 
158 
159 //
160 // member functions
161 //
162 
163 // ------------ method called to produce the data ------------
164 void
166 {
167  using namespace edm;
168 
169  std::vector<reco::JetCorrector const*> correctors;
170  correctors.reserve(correctorTokens_.size());
171 
172  for(auto const& token: correctorTokens_) {
174  iEvent.getByToken(token,hCorrector);
175  correctors.emplace_back(&(*hCorrector));
176  }
177 
178  std::unique_ptr<reco::JetCorrector> pCorr( new reco::JetCorrector( std::unique_ptr<reco::JetCorrectorImpl>(new ChainedJetCorrectorImpl(std::move(correctors)) )));
179  iEvent.put(std::move(pCorr));
180 }
181 
182 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
183 void
185  //The following says we do not know what parameters are allowed so do no validation
186  // Please change this to state exactly what you do use, even if it is no parameters
188  desc.add<std::vector<edm::InputTag>>("correctors");
189  descriptions.addDefault(desc);
190 }
191 
192 //define this as a plug-in
T getParameter(std::string const &) const
std::vector< edm::EDGetTokenT< reco::JetCorrector > > correctorTokens_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
Base class for all types of Jets.
Definition: Jet.h:20
void produce(edm::Event &, const edm::EventSetup &) override
ChainedJetCorrectorProducer(const edm::ParameterSet &)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void addDefault(ParameterSetDescription const &psetDescription)
math::XYZTLorentzVector LorentzVector
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
virtual double correction(const LorentzVector &fJet) const =0
get correction using Jet information only
CompositePtrCandidate * clone() const override
returns a clone of the candidate
HLT enums.
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
def move(src, dest)
Definition: eostools.py:511
virtual bool refRequired() const =0
if correction needs the jet reference