CMS 3D CMS Logo

List of all members | Public Member Functions | Static Public Member Functions | Private Types | Private Attributes | Static Private Attributes
SmearedJetProducerT< T > Class Template Reference

#include <SmearedJetProducerT.h>

Inheritance diagram for SmearedJetProducerT< T >:
edm::stream::EDProducer<>

Public Member Functions

void produce (edm::Event &event, const edm::EventSetup &setup) override
 
 SmearedJetProducerT (const edm::ParameterSet &cfg)
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
bool hasAbilityToProduceInLumis () const final
 
bool hasAbilityToProduceInRuns () const final
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 

Private Types

using JetCollection = std::vector< T >
 

Private Attributes

GreaterByPt< TjetPtComparator
 
bool m_debug
 
bool m_enabled
 
std::shared_ptr< pat::GenJetMatcherm_genJetMatcher
 
std::string m_jets_algo
 
std::string m_jets_algo_pt
 
edm::EDGetTokenT< JetCollectionm_jets_token
 
int m_nomVar
 
std::mt19937 m_random_generator
 
std::unique_ptr< JME::JetResolutionm_resolution_from_file
 
edm::EDGetTokenT< double > m_rho_token
 
std::unique_ptr< JME::JetResolutionScaleFactorm_scale_factor_from_file
 
Variation m_systematic_variation
 
bool m_use_txt_files
 
bool m_useDeterministicSeed
 

Static Private Attributes

static const double MIN_JET_ENERGY = 1e-2
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer<>
typedef CacheContexts< T... > CacheTypes
 
typedef CacheTypes::GlobalCache GlobalCache
 
typedef AbilityChecker< T... > HasAbility
 
typedef CacheTypes::LuminosityBlockCache LuminosityBlockCache
 
typedef LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCacheLuminosityBlockContext
 
typedef CacheTypes::LuminosityBlockSummaryCache LuminosityBlockSummaryCache
 
typedef CacheTypes::RunCache RunCache
 
typedef RunContextT< RunCache, GlobalCacheRunContext
 
typedef CacheTypes::RunSummaryCache RunSummaryCache
 

Detailed Description

template<typename T>
class SmearedJetProducerT< T >

Produce collection of "smeared" jets.

The aim of this correction is to account for the difference in jet energy resolution between Monte Carlo simulation and Data.

Author
Sébastien Brochet

Definition at line 99 of file SmearedJetProducerT.h.

Member Typedef Documentation

template<typename T >
using SmearedJetProducerT< T >::JetCollection = std::vector<T>
private

Definition at line 101 of file SmearedJetProducerT.h.

Constructor & Destructor Documentation

template<typename T >
SmearedJetProducerT< T >::SmearedJetProducerT ( const edm::ParameterSet cfg)
inlineexplicit

Definition at line 104 of file SmearedJetProducerT.h.

References looper::cfg, edm::errors::ConfigFileReadError, DOWN, Exception, edm::ParameterSet::exists(), edm::ParameterSet::getParameter(), NOMINAL, SurveyInfoScenario_cff::seed, patPFMETCorrections_cff::skipGenMatching, AlCaHLTBitMon_QueryRunRegistry::string, UP, and patPFMETCorrections_cff::variation.

104  :
105  m_enabled(cfg.getParameter<bool>("enabled")),
106  m_useDeterministicSeed(cfg.getParameter<bool>("useDeterministicSeed")),
107  m_debug(cfg.getUntrackedParameter<bool>("debug", false)) {
108 
109  m_jets_token = consumes<JetCollection>(cfg.getParameter<edm::InputTag>("src"));
110 
111  if (m_enabled) {
112  m_rho_token = consumes<double>(cfg.getParameter<edm::InputTag>("rho"));
113 
114  m_use_txt_files = cfg.exists("resolutionFile") && cfg.exists("scaleFactorFile");
115 
116  if (m_use_txt_files) {
117  std::string resolutionFile = cfg.getParameter<edm::FileInPath>("resolutionFile").fullPath();
118  std::string scaleFactorFile = cfg.getParameter<edm::FileInPath>("scaleFactorFile").fullPath();
119 
120  m_resolution_from_file.reset(new JME::JetResolution(resolutionFile));
121  m_scale_factor_from_file.reset(new JME::JetResolutionScaleFactor(scaleFactorFile));
122  } else {
123  m_jets_algo = cfg.getParameter<std::string>("algo");
124  m_jets_algo_pt = cfg.getParameter<std::string>("algopt");
125  }
126 
127  std::uint32_t seed = cfg.getParameter<std::uint32_t>("seed");
128  m_random_generator = std::mt19937(seed);
129 
130  bool skipGenMatching = cfg.getParameter<bool>("skipGenMatching");
131  if (! skipGenMatching)
132  m_genJetMatcher = std::make_shared<pat::GenJetMatcher>(cfg, consumesCollector());
133 
134  std::int32_t variation = cfg.getParameter<std::int32_t>("variation");
135  m_nomVar=1;
136  if (variation == 0)
138  else if (variation == 1)
140  else if (variation == -1)
142  else if (variation == 101) {
144  m_nomVar=1;
145  }
146  else if (variation == -101) {
148  m_nomVar=-1;
149  }
150  else
151  throw edm::Exception(edm::errors::ConfigFileReadError, "Invalid value for 'variation' parameter. Only -1, 0, 1 or 101, -101 are supported.");
152  }
153 
154  produces<JetCollection>();
155  }
edm::EDGetTokenT< JetCollection > m_jets_token
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
bool exists(std::string const &parameterName) const
checks if a parameter exists
std::unique_ptr< JME::JetResolution > m_resolution_from_file
edm::EDGetTokenT< double > m_rho_token
std::mt19937 m_random_generator
std::shared_ptr< pat::GenJetMatcher > m_genJetMatcher
std::unique_ptr< JME::JetResolutionScaleFactor > m_scale_factor_from_file

Member Function Documentation

template<typename T >
static void SmearedJetProducerT< T >::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
inlinestatic

Definition at line 157 of file SmearedJetProducerT.h.

References edm::ParameterSetDescription::add(), edm::ConfigurationDescriptions::addDefault(), edm::ParameterSetDescription::addNode(), edm::ParameterSetDescription::addUntracked(), pat::GenJetMatcher::fillDescriptions(), eostools::move(), and source.

157  {
159 
160  desc.add<edm::InputTag>("src");
161  desc.add<bool>("enabled");
162  desc.add<edm::InputTag>("rho");
163  desc.add<std::int32_t>("variation", 0);
164  desc.add<std::uint32_t>("seed", 37428479);
165  desc.add<bool>("skipGenMatching", false);
166  desc.add<bool>("useDeterministicSeed", true);
167  desc.addUntracked<bool>("debug", false);
168 
169  auto source =
171  (edm::ParameterDescription<edm::FileInPath>("resolutionFile", true) and edm::ParameterDescription<edm::FileInPath>("scaleFactorFile", true));
172  desc.addNode(std::move(source));
173 
175 
176  descriptions.addDefault(desc);
177  }
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
static void fillDescriptions(edm::ParameterSetDescription &desc)
void addDefault(ParameterSetDescription const &psetDescription)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static std::string const source
Definition: EdmProvDump.cc:47
def move(src, dest)
Definition: eostools.py:511
template<typename T >
void SmearedJetProducerT< T >::produce ( edm::Event event,
const edm::EventSetup setup 
)
inlineoverride

Definition at line 179 of file SmearedJetProducerT.h.

References gather_cfg::cout, edmIntegrityCheck::d, reco::LeafCandidate::energy(), reco::LeafCandidate::eta(), JME::JetResolution::get(), JME::JetResolutionScaleFactor::get(), JME::JetResolution::getResolution(), JME::JetResolutionScaleFactor::getScaleFactor(), edm::EventBase::isRealData(), metsig::jet, JME::JetEta, JME::JetPt, fwrapper::jets, eostools::move(), reco::LeafCandidate::phi(), reco::LeafCandidate::pt(), fftjetproducer_cfi::resolution, JME::Rho, SurveyInfoScenario_cff::seed, and mathSSE::sqrt().

179  {
180 
181  edm::Handle<JetCollection> jets_collection;
182  event.getByToken(m_jets_token, jets_collection);
183 
184  // Disable the module when running on real data
185  if (m_enabled && event.isRealData()) {
186  m_enabled = false;
187  m_genJetMatcher.reset();
188  }
189 
191  if (m_enabled)
192  event.getByToken(m_rho_token, rho);
193 
195  JME::JetResolutionScaleFactor resolution_sf;
196 
197  const JetCollection& jets = *jets_collection;
198 
199  if (m_enabled) {
200  if (m_use_txt_files) {
201  resolution = *m_resolution_from_file;
202  resolution_sf = *m_scale_factor_from_file;
203  } else {
204  resolution = JME::JetResolution::get(setup, m_jets_algo_pt);
205  resolution_sf = JME::JetResolutionScaleFactor::get(setup, m_jets_algo);
206  }
207 
209  unsigned int runNum_uint = static_cast <unsigned int> (event.id().run());
210  unsigned int lumiNum_uint = static_cast <unsigned int> (event.id().luminosityBlock());
211  unsigned int evNum_uint = static_cast <unsigned int> (event.id().event());
212  unsigned int jet0eta = uint32_t(jets.empty() ? 0 : jets[0].eta()/0.01);
213  std::uint32_t seed = jet0eta + m_nomVar + (lumiNum_uint<<10) + (runNum_uint<<20) + evNum_uint;
214  m_random_generator.seed(seed);
215  }
216  }
217 
218  if (m_genJetMatcher)
219  m_genJetMatcher->getTokens(event);
220 
221  auto smearedJets = std::make_unique<JetCollection>();
222 
223  for (const auto& jet: jets) {
224 
225  if ((! m_enabled) || (jet.pt() == 0)) {
226  // Module disabled or invalid p4. Simply copy the input jet.
227  smearedJets->push_back(jet);
228 
229  continue;
230  }
231 
232  double jet_resolution = resolution.getResolution({{JME::Binning::JetPt, jet.pt()}, {JME::Binning::JetEta, jet.eta()}, {JME::Binning::Rho, *rho}});
233  double jer_sf = resolution_sf.getScaleFactor({{JME::Binning::JetEta, jet.eta()}}, m_systematic_variation);
234 
235  if (m_debug) {
236  std::cout << "jet: pt: " << jet.pt() << " eta: " << jet.eta() << " phi: " << jet.phi() << " e: " << jet.energy() << std::endl;
237  std::cout << "resolution: " << jet_resolution << std::endl;
238  std::cout << "resolution scale factor: " << jer_sf << std::endl;
239  }
240 
241  const reco::GenJet* genJet = nullptr;
242  if (m_genJetMatcher)
243  genJet = m_genJetMatcher->match(jet, jet.pt() * jet_resolution);
244 
245  double smearFactor = 1.;
246 
247  if (genJet) {
248  /*
249  * Case 1: we have a "good" gen jet matched to the reco jet
250  */
251 
252  if (m_debug) {
253  std::cout << "gen jet: pt: " << genJet->pt() << " eta: " << genJet->eta() << " phi: " << genJet->phi() << " e: " << genJet->energy() << std::endl;
254  }
255 
256  double dPt = jet.pt() - genJet->pt();
257  smearFactor = 1 + m_nomVar*(jer_sf - 1.) * dPt / jet.pt();
258 
259  } else if (jer_sf > 1) {
260  /*
261  * Case 2: we don't have a gen jet. Smear jet pt using a random gaussian variation
262  */
263 
264  double sigma = jet_resolution * std::sqrt(jer_sf * jer_sf - 1);
265  if (m_debug) {
266  std::cout << "gaussian width: " << sigma << std::endl;
267  }
268 
269  std::normal_distribution<> d(0, sigma);
270  smearFactor = 1. + m_nomVar*d(m_random_generator);
271  } else if (m_debug) {
272  std::cout << "Impossible to smear this jet" << std::endl;
273  }
274 
275  if (jet.energy() * smearFactor < MIN_JET_ENERGY) {
276  // Negative or too small smearFactor. We would change direction of the jet
277  // and this is not what we want.
278  // Recompute the smearing factor in order to have jet.energy() == MIN_JET_ENERGY
279  double newSmearFactor = MIN_JET_ENERGY / jet.energy();
280  if (m_debug) {
281  std::cout << "The smearing factor (" << smearFactor << ") is either negative or too small. Fixing it to " << newSmearFactor << " to avoid change of direction." << std::endl;
282  }
283  smearFactor = newSmearFactor;
284  }
285 
286  T smearedJet = jet;
287  smearedJet.scaleEnergy(smearFactor);
288 
289  if (m_debug) {
290  std::cout << "smeared jet (" << smearFactor << "): pt: " << smearedJet.pt() << " eta: " << smearedJet.eta() << " phi: " << smearedJet.phi() << " e: " << smearedJet.energy() << std::endl;
291  }
292 
293  smearedJets->push_back(smearedJet);
294  }
295 
296  // Sort jets by pt
297  std::sort(smearedJets->begin(), smearedJets->end(), jetPtComparator);
298 
299  event.put(std::move(smearedJets));
300  }
edm::EDGetTokenT< JetCollection > m_jets_token
float getResolution(const JetParameters &parameters) const
double eta() const final
momentum pseudorapidity
static const JetResolution get(const edm::EventSetup &, const std::string &)
double pt() const final
transverse momentum
bool isRealData() const
Definition: EventBase.h:62
GreaterByPt< T > jetPtComparator
std::unique_ptr< JME::JetResolution > m_resolution_from_file
std::vector< T > JetCollection
T sqrt(T t)
Definition: SSEVec.h:18
vector< PseudoJet > jets
double energy() const final
energy
Jets made from MC generator particles.
Definition: GenJet.h:25
edm::EDGetTokenT< double > m_rho_token
static const double MIN_JET_ENERGY
std::mt19937 m_random_generator
float getScaleFactor(const JetParameters &parameters, Variation variation=Variation::NOMINAL) const
static const JetResolutionScaleFactor get(const edm::EventSetup &, const std::string &)
std::shared_ptr< pat::GenJetMatcher > m_genJetMatcher
std::unique_ptr< JME::JetResolutionScaleFactor > m_scale_factor_from_file
long double T
double phi() const final
momentum azimuthal angle
def move(src, dest)
Definition: eostools.py:511

Member Data Documentation

template<typename T >
GreaterByPt<T> SmearedJetProducerT< T >::jetPtComparator
private

Definition at line 321 of file SmearedJetProducerT.h.

template<typename T >
bool SmearedJetProducerT< T >::m_debug
private

Definition at line 312 of file SmearedJetProducerT.h.

template<typename T >
bool SmearedJetProducerT< T >::m_enabled
private

Definition at line 307 of file SmearedJetProducerT.h.

template<typename T >
std::shared_ptr<pat::GenJetMatcher> SmearedJetProducerT< T >::m_genJetMatcher
private

Definition at line 313 of file SmearedJetProducerT.h.

template<typename T >
std::string SmearedJetProducerT< T >::m_jets_algo
private

Definition at line 309 of file SmearedJetProducerT.h.

template<typename T >
std::string SmearedJetProducerT< T >::m_jets_algo_pt
private

Definition at line 308 of file SmearedJetProducerT.h.

template<typename T >
edm::EDGetTokenT<JetCollection> SmearedJetProducerT< T >::m_jets_token
private

Definition at line 305 of file SmearedJetProducerT.h.

template<typename T >
int SmearedJetProducerT< T >::m_nomVar
private

Definition at line 323 of file SmearedJetProducerT.h.

template<typename T >
std::mt19937 SmearedJetProducerT< T >::m_random_generator
private

Definition at line 319 of file SmearedJetProducerT.h.

template<typename T >
std::unique_ptr<JME::JetResolution> SmearedJetProducerT< T >::m_resolution_from_file
private

Definition at line 316 of file SmearedJetProducerT.h.

template<typename T >
edm::EDGetTokenT<double> SmearedJetProducerT< T >::m_rho_token
private

Definition at line 306 of file SmearedJetProducerT.h.

template<typename T >
std::unique_ptr<JME::JetResolutionScaleFactor> SmearedJetProducerT< T >::m_scale_factor_from_file
private

Definition at line 317 of file SmearedJetProducerT.h.

template<typename T >
Variation SmearedJetProducerT< T >::m_systematic_variation
private

Definition at line 310 of file SmearedJetProducerT.h.

template<typename T >
bool SmearedJetProducerT< T >::m_use_txt_files
private

Definition at line 315 of file SmearedJetProducerT.h.

template<typename T >
bool SmearedJetProducerT< T >::m_useDeterministicSeed
private

Definition at line 311 of file SmearedJetProducerT.h.

template<typename T >
const double SmearedJetProducerT< T >::MIN_JET_ENERGY = 1e-2
staticprivate

Definition at line 303 of file SmearedJetProducerT.h.