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<> edm::stream::EDProducerBase edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

virtual 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
 
- Public Member Functions inherited from edm::stream::EDProducerBase
 EDProducerBase ()
 
ModuleDescription const & moduleDescription () const
 
virtual ~EDProducerBase ()
 
- Public Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
std::vector< edm::ProductResolverIndex > const & indiciesForPutProducts (BranchType iBranchType) const
 
 ProducerBase ()
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription const &)> registrationCallback () const
 used by the fwk to register list of products More...
 
void resolvePutIndicies (BranchType iBranchType, std::unordered_multimap< std::string, edm::ProductResolverIndex > const &iIndicies, std::string const &moduleLabel)
 
virtual ~ProducerBase () noexcept(false)
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
 EDConsumerBase ()
 
 EDConsumerBase (EDConsumerBase const &)=delete
 
 EDConsumerBase (EDConsumerBase &&)=default
 
ProductResolverIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
std::vector< ProductResolverIndexAndSkipBit > const & itemsToGetFrom (BranchType iType) const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesWhoseProductsAreConsumed (std::vector< ModuleDescription const * > &modules, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc, std::string const &processName) const
 
EDConsumerBase const & operator= (EDConsumerBase const &)=delete
 
EDConsumerBaseoperator= (EDConsumerBase &&)=default
 
bool registeredToConsume (ProductResolverIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
void updateLookup (BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
 
virtual ~EDConsumerBase () noexcept(false)
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 
- Static Public Member Functions inherited from edm::stream::EDProducerBase
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (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
 

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
 
- Public Types inherited from edm::stream::EDProducerBase
typedef EDProducerAdaptorBase ModuleType
 
- Public Types inherited from edm::ProducerBase
typedef ProductRegistryHelper::TypeLabelList TypeLabelList
 
- Public Types inherited from edm::EDConsumerBase
typedef ProductLabels Labels
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

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_debug(cfg.getUntrackedParameter<bool>("debug", false)) {
107 
108  m_jets_token = consumes<JetCollection>(cfg.getParameter<edm::InputTag>("src"));
109 
110  if (m_enabled) {
111  m_rho_token = consumes<double>(cfg.getParameter<edm::InputTag>("rho"));
112 
113  m_use_txt_files = cfg.exists("resolutionFile") && cfg.exists("scaleFactorFile");
114 
115  if (m_use_txt_files) {
116  std::string resolutionFile = cfg.getParameter<edm::FileInPath>("resolutionFile").fullPath();
117  std::string scaleFactorFile = cfg.getParameter<edm::FileInPath>("scaleFactorFile").fullPath();
118 
119  m_resolution_from_file.reset(new JME::JetResolution(resolutionFile));
120  m_scale_factor_from_file.reset(new JME::JetResolutionScaleFactor(scaleFactorFile));
121  } else {
122  m_jets_algo = cfg.getParameter<std::string>("algo");
123  m_jets_algo_pt = cfg.getParameter<std::string>("algopt");
124  }
125 
126  std::uint32_t seed = cfg.getParameter<std::uint32_t>("seed");
127  m_random_generator = std::mt19937(seed);
128 
129  bool skipGenMatching = cfg.getParameter<bool>("skipGenMatching");
130  if (! skipGenMatching)
131  m_genJetMatcher = std::make_shared<pat::GenJetMatcher>(cfg, consumesCollector());
132 
133  std::int32_t variation = cfg.getParameter<std::int32_t>("variation");
134  m_nomVar=1;
135  if (variation == 0)
137  else if (variation == 1)
139  else if (variation == -1)
141  else if (variation == 101) {
143  m_nomVar=1;
144  }
145  else if (variation == -101) {
147  m_nomVar=-1;
148  }
149  else
150  throw edm::Exception(edm::errors::ConfigFileReadError, "Invalid value for 'variation' parameter. Only -1, 0, 1 or 101, -101 are supported.");
151  }
152 
153  produces<JetCollection>();
154  }
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
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
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 156 of file SmearedJetProducerT.h.

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

156  {
158 
159  desc.add<edm::InputTag>("src");
160  desc.add<bool>("enabled");
161  desc.add<edm::InputTag>("rho");
162  desc.add<std::int32_t>("variation", 0);
163  desc.add<std::uint32_t>("seed", 37428479);
164  desc.add<bool>("skipGenMatching", false);
165  desc.addUntracked<bool>("debug", false);
166 
167  auto source =
169  (edm::ParameterDescription<edm::FileInPath>("resolutionFile", true) and edm::ParameterDescription<edm::FileInPath>("scaleFactorFile", true));
170  desc.addNode(std::move(source));
171 
173 
174  descriptions.addDefault(desc);
175  }
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:43
def move(src, dest)
Definition: eostools.py:510
template<typename T >
virtual void SmearedJetProducerT< T >::produce ( edm::Event event,
const edm::EventSetup setup 
)
inlineoverridevirtual

Definition at line 177 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(), ctppsDiamondLocalTracks_cfi::resolution, JME::Rho, ctppsDiamondLocalTracks_cfi::sigma, and mathSSE::sqrt().

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

Member Data Documentation

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

Definition at line 309 of file SmearedJetProducerT.h.

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

Definition at line 300 of file SmearedJetProducerT.h.

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

Definition at line 296 of file SmearedJetProducerT.h.

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

Definition at line 301 of file SmearedJetProducerT.h.

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

Definition at line 298 of file SmearedJetProducerT.h.

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

Definition at line 297 of file SmearedJetProducerT.h.

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

Definition at line 294 of file SmearedJetProducerT.h.

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

Definition at line 311 of file SmearedJetProducerT.h.

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

Definition at line 307 of file SmearedJetProducerT.h.

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

Definition at line 304 of file SmearedJetProducerT.h.

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

Definition at line 295 of file SmearedJetProducerT.h.

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

Definition at line 305 of file SmearedJetProducerT.h.

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

Definition at line 299 of file SmearedJetProducerT.h.

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

Definition at line 303 of file SmearedJetProducerT.h.

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

Definition at line 292 of file SmearedJetProducerT.h.