CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Types | Private Member Functions | Private Attributes
SmearedJetProducerT< T, Textractor > Class Template Reference

#include <SmearedJetProducerT.h>

Inheritance diagram for SmearedJetProducerT< T, Textractor >:
edm::stream::EDProducer<> edm::stream::EDProducerBase edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

 SmearedJetProducerT (const edm::ParameterSet &cfg)
 
 ~SmearedJetProducerT ()
 
- 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)
 
 ProducerBase ()
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription
const &)> 
registrationCallback () const
 used by the fwk to register list of products More...
 
virtual ~ProducerBase ()
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
 EDConsumerBase ()
 
ProductHolderIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
std::vector
< ProductHolderIndexAndSkipBit >
const & 
itemsToGetFromEvent () const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesDependentUpon (const std::string &iProcessName, std::vector< const char * > &oModuleLabels) const
 
void modulesWhoseProductsAreConsumed (std::vector< ModuleDescription const * > &modules, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc, std::string const &processName) const
 
bool registeredToConsume (ProductHolderIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
void updateLookup (BranchType iBranchType, ProductHolderIndexHelper const &)
 
virtual ~EDConsumerBase ()
 

Private Types

typedef std::vector< TJetCollection
 

Private Member Functions

virtual void produce (edm::Event &evt, const edm::EventSetup &es)
 

Private Attributes

SmearedJetProducer_namespace::GenJetMatcherT
< T
genJetMatcher_
 
TFile * inputFile_
 
double jetCorrEtaMax_
 
Textractor jetCorrExtractor_
 
edm::InputTag jetCorrLabel_
 
edm::EDGetTokenT
< reco::JetCorrector
jetCorrToken_
 
SmearedJetProducer_namespace::JetResolutionExtractorT
< T
jetResolutionExtractor_
 
TH2 * lut_
 
std::string moduleLabel_
 
TRandom3 rnd_
 
double shiftBy_
 
double sigmaMaxGenJetMatch_
 
double skipCorrJetPtThreshold_
 
StringCutObjectSelector< T > * skipJetSelection_
 
double skipRawJetPtThreshold_
 
double smearBy_
 
edm::InputTag src_
 
double srcJetSmeared_
 
edm::EDGetTokenT< JetCollectionsrcToken_
 
int verbosity_
 

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, GlobalCache
LuminosityBlockContext
 
typedef
CacheTypes::LuminosityBlockSummaryCache 
LuminosityBlockSummaryCache
 
typedef CacheTypes::RunCache RunCache
 
typedef RunContextT< RunCache,
GlobalCache
RunContext
 
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
 
- Static Public Member Functions inherited from edm::stream::EDProducerBase
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
- 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, typename Textractor>
class SmearedJetProducerT< T, Textractor >

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. The jet energy resolutions have been measured in QCD di-jet and gamma + jets events selected in 2010 data, as documented in the PAS JME-10-014.

Author
Christian Veelken, LLR

Definition at line 146 of file SmearedJetProducerT.h.

Member Typedef Documentation

template<typename T , typename Textractor >
typedef std::vector<T> SmearedJetProducerT< T, Textractor >::JetCollection
private

Definition at line 148 of file SmearedJetProducerT.h.

Constructor & Destructor Documentation

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

Definition at line 152 of file SmearedJetProducerT.h.

References Exception, edm::ParameterSet::exists(), edm::ParameterSet::getParameter(), SmearedJetProducerT< T, Textractor >::inputFile_, writeAntiElectronDiscrMVA_cfi::inputFileName, SmearedJetProducerT< T, Textractor >::jetCorrEtaMax_, SmearedJetProducerT< T, Textractor >::jetCorrLabel_, SmearedJetProducerT< T, Textractor >::jetCorrToken_, SmearedJetProducerT< T, Textractor >::lut_, SmearedJetProducerT< T, Textractor >::shiftBy_, SmearedJetProducerT< T, Textractor >::sigmaMaxGenJetMatch_, SmearedJetProducerT< T, Textractor >::skipCorrJetPtThreshold_, SmearedJetProducerT< T, Textractor >::skipJetSelection_, SmearedJetProducerT< T, Textractor >::skipRawJetPtThreshold_, SmearedJetProducerT< T, Textractor >::smearBy_, SmearedJetProducerT< T, Textractor >::src_, SmearedJetProducerT< T, Textractor >::srcJetSmeared_, SmearedJetProducerT< T, Textractor >::srcToken_, AlCaHLTBitMon_QueryRunRegistry::string, edm::FileInPath::Unknown, and SmearedJetProducerT< T, Textractor >::verbosity_.

153  : moduleLabel_(cfg.getParameter<std::string>("@module_label")),
156  jetCorrLabel_(""),
158  {
159  //std::cout << "<SmearedJetProducer::SmearedJetProducer>:" << std::endl;
160  //std::cout << " moduleLabel = " << moduleLabel_ << std::endl;
161 
162  src_ = cfg.getParameter<edm::InputTag>("src");
163  srcToken_ = consumes<JetCollection>(src_);
164 
166  std::string lutName = cfg.getParameter<std::string>("lutName");
167  if (inputFileName.location() == edm::FileInPath::Unknown)
168  throw cms::Exception("JetMETsmearInputProducer")
169  << " Failed to find File = " << inputFileName << " !!\n";
170 
171  inputFile_ = new TFile(inputFileName.fullPath().data());
172  lut_ = dynamic_cast<TH2*>(inputFile_->Get(lutName.data()));
173  if ( !lut_ )
174  throw cms::Exception("SmearedJetProducer")
175  << " Failed to load LUT = " << lutName.data() << " from file = " << inputFileName.fullPath().data() << " !!\n";
176 
177  if ( cfg.exists("jetCorrLabel") ) {
178  jetCorrLabel_ = cfg.getParameter<edm::InputTag>("jetCorrLabel");
179  jetCorrToken_ = consumes<reco::JetCorrector>(jetCorrLabel_);
180  }
181 
182  jetCorrEtaMax_ = ( cfg.exists("jetCorrEtaMax") ) ?
183  cfg.getParameter<double>("jetCorrEtaMax") : 9.9;
184 
185  sigmaMaxGenJetMatch_ = cfg.getParameter<double>("sigmaMaxGenJetMatch");
186 
187  smearBy_ = ( cfg.exists("smearBy") ) ? cfg.getParameter<double>("smearBy") : 1.0;
188  //std::cout << "smearBy = " << smearBy_ << std::endl;
189 
190  shiftBy_ = ( cfg.exists("shiftBy") ) ? cfg.getParameter<double>("shiftBy") : 0.;
191  //std::cout << "shiftBy = " << shiftBy_ << std::endl;
192 
193  srcJetSmeared_ = ( cfg.exists("srcJetSmeared") ) ? cfg.getParameter<bool>("srcJetSmeared") : false;
194 
195  if ( cfg.exists("skipJetSelection") ) {
196  std::string skipJetSelection_string = cfg.getParameter<std::string>("skipJetSelection");
197  skipJetSelection_ = new StringCutObjectSelector<T>(skipJetSelection_string);
198  }
199 
200  skipRawJetPtThreshold_ = ( cfg.exists("skipRawJetPtThreshold") ) ?
201  cfg.getParameter<double>("skipRawJetPtThreshold") : 1.e-2;
202  skipCorrJetPtThreshold_ = ( cfg.exists("skipCorrJetPtThreshold") ) ?
203  cfg.getParameter<double>("skipCorrJetPtThreshold") : 1.e-2;
204 
205  verbosity_ = ( cfg.exists("verbosity") ) ?
206  cfg.getParameter<int>("verbosity") : 0;
207 
208  produces<JetCollection>();
209  }
T getParameter(std::string const &) const
edm::EDGetTokenT< JetCollection > srcToken_
StringCutObjectSelector< T > * skipJetSelection_
bool exists(std::string const &parameterName) const
checks if a parameter exists
SmearedJetProducer_namespace::GenJetMatcherT< T > genJetMatcher_
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
edm::EDGetTokenT< reco::JetCorrector > jetCorrToken_
SmearedJetProducer_namespace::JetResolutionExtractorT< T > jetResolutionExtractor_
template<typename T , typename Textractor >
SmearedJetProducerT< T, Textractor >::~SmearedJetProducerT ( )
inline

Member Function Documentation

template<typename T , typename Textractor >
virtual void SmearedJetProducerT< T, Textractor >::produce ( edm::Event evt,
const edm::EventSetup es 
)
inlineprivatevirtual

Implements edm::stream::EDProducerBase.

Definition at line 219 of file SmearedJetProducerT.h.

References funct::abs(), gather_cfg::cout, reco::LeafCandidate::energy(), reco::LeafCandidate::eta(), SmearedJetProducerT< T, Textractor >::genJetMatcher_, edm::Event::getByToken(), metsig::jet, SmearedJetProducerT< T, Textractor >::jetCorrEtaMax_, SmearedJetProducerT< T, Textractor >::jetCorrExtractor_, SmearedJetProducerT< T, Textractor >::jetCorrLabel_, SmearedJetProducerT< T, Textractor >::jetCorrToken_, SmearedJetProducerT< T, Textractor >::jetResolutionExtractor_, fwrapper::jets, edm::InputTag::label(), SmearedJetProducerT< T, Textractor >::lut_, bookConverter::max, SmearedJetProducerT< T, Textractor >::moduleLabel_, reco::LeafCandidate::phi(), edm::Handle< T >::product(), reco::LeafCandidate::pt(), edm::Event::put(), SmearedJetProducerT< T, Textractor >::rnd_, SmearedJetProducerT< T, Textractor >::shiftBy_, SmearedJetProducerT< T, Textractor >::sigmaMaxGenJetMatch_, SmearedJetProducerT< T, Textractor >::skipCorrJetPtThreshold_, SmearedJetProducerT< T, Textractor >::skipJetSelection_, SmearedJetProducerT< T, Textractor >::skipRawJetPtThreshold_, SmearedJetProducerT< T, Textractor >::smearBy_, mathSSE::sqrt(), SmearedJetProducerT< T, Textractor >::src_, SmearedJetProducerT< T, Textractor >::srcToken_, relativeConstraints::value, SmearedJetProducerT< T, Textractor >::verbosity_, x, and y.

220  {
221  if ( verbosity_ ) {
222  std::cout << "<SmearedJetProducerT::produce>:" << std::endl;
223  std::cout << " moduleLabel = " << moduleLabel_ << std::endl;
224  std::cout << " src = " << src_.label() << std::endl;
225  }
226 
227  std::auto_ptr<JetCollection> smearedJets(new JetCollection);
228 
230  evt.getByToken(srcToken_, jets);
231 
232  int numJets = jets->size();
233  for ( int jetIndex = 0; jetIndex < numJets; ++jetIndex ) {
234  const T& jet = jets->at(jetIndex);
235 
236  static const SmearedJetProducer_namespace::RawJetExtractorT<T> rawJetExtractor;
237  reco::Candidate::LorentzVector rawJetP4 = rawJetExtractor(jet);
238  if ( verbosity_ ) {
239  std::cout << "rawJet: Pt = " << rawJetP4.pt() << ", eta = " << rawJetP4.eta() << ", phi = " << rawJetP4.phi() << std::endl;
240  }
241 
242  reco::Candidate::LorentzVector corrJetP4 = jet.p4();
243  if ( !jetCorrLabel_.label().empty() ) {
245  evt.getByToken(jetCorrToken_, jetCorr);
246  corrJetP4 =
249  jetCorrExtractor_(jet, jetCorr.product(), jetCorrEtaMax_, &rawJetP4);
250  }
251  if ( verbosity_ ) {
252  std::cout << "corrJet: Pt = " << corrJetP4.pt() << ", eta = " << corrJetP4.eta() << ", phi = " << corrJetP4.phi() << std::endl;
253  }
254 
255  double smearFactor = 1.;
256  double x = std::abs(corrJetP4.eta());
257  double y = corrJetP4.pt();
258  if ( x > lut_->GetXaxis()->GetXmin() && x < lut_->GetXaxis()->GetXmax() &&
259  y > lut_->GetYaxis()->GetXmin() && y < lut_->GetYaxis()->GetXmax() ) {
260  int binIndex = lut_->FindBin(x, y);
261 
262  if ( smearBy_ > 0. ) smearFactor += smearBy_*(lut_->GetBinContent(binIndex) - 1.);
263  double smearFactorErr = lut_->GetBinError(binIndex);
264  if ( verbosity_ ) std::cout << "smearFactor = " << smearFactor << " +/- " << smearFactorErr << std::endl;
265 
266  if ( shiftBy_ != 0. ) {
267  smearFactor += (shiftBy_*smearFactorErr);
268  if ( verbosity_ ) std::cout << "smearFactor(shifted) = " << smearFactor << std::endl;
269  }
270  }
271 
272  double smearedJetEn = jet.energy();
273  double sigmaEn = jetResolutionExtractor_(jet)*sqrt(smearFactor*smearFactor - 1.);
274  const reco::GenJet* genJet = genJetMatcher_(jet, &evt);
275  bool isGenMatched = false;
276  if ( genJet ) {
277  if ( verbosity_ ) {
278  std::cout << "genJet: Pt = " << genJet->pt() << ", eta = " << genJet->eta() << ", phi = " << genJet->phi() << std::endl;
279  }
280  double dEn = corrJetP4.E() - genJet->energy();
281  if ( dEn < (sigmaMaxGenJetMatch_*sigmaEn) ) {
282 //--- case 1: reconstructed jet matched to generator level jet,
283 // smear difference between reconstructed and "true" jet energy
284 
285  if ( verbosity_ ) {
286  std::cout << " successfully matched to genJet" << std::endl;
287  std::cout << "corrJetEn = " << corrJetP4.E() << ", genJetEn = " << genJet->energy() << " --> dEn = " << dEn << std::endl;
288  }
289 
290  smearedJetEn = jet.energy()*(1. + (smearFactor - 1.)*dEn/std::max( rawJetP4.E(), corrJetP4.E()));
291  isGenMatched = true;
292  }
293  }
294  if ( !isGenMatched ) {
295 //--- case 2: reconstructed jet **not** matched to generator level jet,
296 // smear jet energy using MC resolution functions implemented in PFMEt significance algorithm (CMS AN-10/400)
297 
298  if ( verbosity_ ) {
299  std::cout << " not matched to genJet" << std::endl;
300  std::cout << "corrJetEn = " << corrJetP4.E() << ", sigmaEn = " << sigmaEn << std::endl;
301  }
302 
303  if ( smearFactor > 1. ) {
304  // CV: MC resolution already accounted for in reconstructed jet,
305  // add additional Gaussian smearing of width = sqrt(smearFactor^2 - 1)
306  // to account for Data/MC **difference** in jet resolutions.
307  // Take maximum(rawJetEn, corrJetEn) to avoid pathological cases
308  // (e.g. corrJetEn << rawJetEn, due to L1Fastjet corrections)
309 
310  smearedJetEn = jet.energy()*(1. + rnd_.Gaus(0., sigmaEn)/std::max( rawJetP4.E(), corrJetP4.E()) );
311  }
312  }
313 
314  // CV: keep minimum jet energy, in order not to loose direction information
315  const double minJetEn = 1.e-2;
316  if ( smearedJetEn < minJetEn ) smearedJetEn = minJetEn;
317 
318  // CV: skip smearing in case either "raw" or "corrected" jet energy is very low
319  // or jet passes selection configurable via python
320  // (allows for protection against "pathological cases",
321  // cf. PhysicsTools/PatUtils/python/tools/metUncertaintyTools.py)
322  reco::Candidate::LorentzVector smearedJetP4 = jet.p4();
323  if ( !((skipJetSelection_ && (*skipJetSelection_)(jet)) ||
324  rawJetP4.pt() < skipRawJetPtThreshold_ ||
325  corrJetP4.pt() < skipCorrJetPtThreshold_ ) ) {
326  if ( verbosity_ ) {
327  std::cout << " smearing jetP4 by factor = " << (smearedJetEn/jet.energy()) << " --> smearedJetEn = " << smearedJetEn << std::endl;
328  }
329  smearedJetP4 *= (smearedJetEn/jet.energy());
330  }
331 
332  if ( verbosity_ ) {
333  std::cout << "smearedJet: Pt = " << smearedJetP4.pt() << ", eta = " << smearedJetP4.eta() << ", phi = " << smearedJetP4.phi() << std::endl;
334  std::cout << " dPt = " << (smearedJetP4.pt() - jet.pt())
335  << " (Px = " << (smearedJetP4.px() - jet.px()) << ", Py = " << (smearedJetP4.py() - jet.py()) << ")" << std::endl;
336  }
337 
338  T smearedJet = (jet);
339  smearedJet.setP4(smearedJetP4);
340 
341  smearedJets->push_back(smearedJet);
342  }
343 
344 //--- add collection of "smeared" jets to the event
345  evt.put(smearedJets);
346  }
edm::EDGetTokenT< JetCollection > srcToken_
StringCutObjectSelector< T > * skipJetSelection_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:464
virtual double eta() const
momentum pseudorapidity
virtual double pt() const
transverse momentum
SmearedJetProducer_namespace::GenJetMatcherT< T > genJetMatcher_
virtual double energy() const
energy
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:120
T sqrt(T t)
Definition: SSEVec.h:48
vector< PseudoJet > jets
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Jets made from MC generator particles.
Definition: GenJet.h:24
edm::EDGetTokenT< reco::JetCorrector > jetCorrToken_
T const * product() const
Definition: Handle.h:81
SmearedJetProducer_namespace::JetResolutionExtractorT< T > jetResolutionExtractor_
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Candidate.h:37
std::string const & label() const
Definition: InputTag.h:43
tuple cout
Definition: gather_cfg.py:121
long double T
std::vector< T > JetCollection
virtual double phi() const
momentum azimuthal angle

Member Data Documentation

template<typename T , typename Textractor >
SmearedJetProducer_namespace::GenJetMatcherT<T> SmearedJetProducerT< T, Textractor >::genJetMatcher_
private
template<typename T , typename Textractor >
TFile* SmearedJetProducerT< T, Textractor >::inputFile_
private
template<typename T , typename Textractor >
double SmearedJetProducerT< T, Textractor >::jetCorrEtaMax_
private
template<typename T , typename Textractor >
Textractor SmearedJetProducerT< T, Textractor >::jetCorrExtractor_
private
template<typename T , typename Textractor >
edm::InputTag SmearedJetProducerT< T, Textractor >::jetCorrLabel_
private
template<typename T , typename Textractor >
edm::EDGetTokenT<reco::JetCorrector> SmearedJetProducerT< T, Textractor >::jetCorrToken_
private
template<typename T , typename Textractor >
SmearedJetProducer_namespace::JetResolutionExtractorT<T> SmearedJetProducerT< T, Textractor >::jetResolutionExtractor_
private
template<typename T , typename Textractor >
TH2* SmearedJetProducerT< T, Textractor >::lut_
private
template<typename T , typename Textractor >
std::string SmearedJetProducerT< T, Textractor >::moduleLabel_
private
template<typename T , typename Textractor >
TRandom3 SmearedJetProducerT< T, Textractor >::rnd_
private
template<typename T , typename Textractor >
double SmearedJetProducerT< T, Textractor >::shiftBy_
private
template<typename T , typename Textractor >
double SmearedJetProducerT< T, Textractor >::sigmaMaxGenJetMatch_
private
template<typename T , typename Textractor >
double SmearedJetProducerT< T, Textractor >::skipCorrJetPtThreshold_
private
template<typename T , typename Textractor >
StringCutObjectSelector<T>* SmearedJetProducerT< T, Textractor >::skipJetSelection_
private
template<typename T , typename Textractor >
double SmearedJetProducerT< T, Textractor >::skipRawJetPtThreshold_
private
template<typename T , typename Textractor >
double SmearedJetProducerT< T, Textractor >::smearBy_
private
template<typename T , typename Textractor >
edm::InputTag SmearedJetProducerT< T, Textractor >::src_
private
template<typename T , typename Textractor >
double SmearedJetProducerT< T, Textractor >::srcJetSmeared_
private
template<typename T , typename Textractor >
edm::EDGetTokenT<JetCollection> SmearedJetProducerT< T, Textractor >::srcToken_
private
template<typename T , typename Textractor >
int SmearedJetProducerT< T, Textractor >::verbosity_
private