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

Public Member Functions

 SmearedJetProducerT (const edm::ParameterSet &cfg)
 
 ~SmearedJetProducerT ()
 
- Public Member Functions inherited from edm::EDProducer
 EDProducer ()
 
ModuleDescription const & moduleDescription () const
 
virtual ~EDProducer ()
 
- Public Member Functions inherited from edm::ProducerBase
 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
 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
 
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_
 
std::string jetCorrLabel_
 
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_
 
edm::EDGetTokenT< JetCollectionsrcToken_
 
int verbosity_
 

Additional Inherited Members

- Public Types inherited from edm::EDProducer
typedef EDProducer ModuleType
 
- Public Types inherited from edm::ProducerBase
typedef
ProductRegistryHelper::TypeLabelList 
TypeLabelList
 
- Static Public Member Functions inherited from edm::EDProducer
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
- Protected Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
- 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 143 of file SmearedJetProducerT.h.

Member Typedef Documentation

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

Definition at line 145 of file SmearedJetProducerT.h.

Constructor & Destructor Documentation

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

Definition at line 149 of file SmearedJetProducerT.h.

References edm::hlt::Exception, edm::ParameterSet::exists(), edm::ParameterSet::getParameter(), SmearedJetProducerT< T, Textractor >::inputFile_, PFRecoTauDiscriminationAgainstMuonMVA_cfi::inputFileName, SmearedJetProducerT< T, Textractor >::jetCorrEtaMax_, SmearedJetProducerT< T, Textractor >::jetCorrLabel_, 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 >::srcToken_, AlCaHLTBitMon_QueryRunRegistry::string, edm::FileInPath::Unknown, and SmearedJetProducerT< T, Textractor >::verbosity_.

150  : moduleLabel_(cfg.getParameter<std::string>("@module_label")),
154  {
155  //std::cout << "<SmearedJetProducer::SmearedJetProducer>:" << std::endl;
156  //std::cout << " moduleLabel = " << moduleLabel_ << std::endl;
157 
158  src_ = cfg.getParameter<edm::InputTag>("src");
159  srcToken_ = consumes<JetCollection>(src_);
160 
162  std::string lutName = cfg.getParameter<std::string>("lutName");
163  if (inputFileName.location() == edm::FileInPath::Unknown)
164  throw cms::Exception("JetMETsmearInputProducer")
165  << " Failed to find File = " << inputFileName << " !!\n";
166 
167  inputFile_ = new TFile(inputFileName.fullPath().data());
168  lut_ = dynamic_cast<TH2*>(inputFile_->Get(lutName.data()));
169  if ( !lut_ )
170  throw cms::Exception("SmearedJetProducer")
171  << " Failed to load LUT = " << lutName.data() << " from file = " << inputFileName.fullPath().data() << " !!\n";
172 
173  jetCorrLabel_ = ( cfg.exists("jetCorrLabel") ) ?
174  cfg.getParameter<std::string>("jetCorrLabel") : "";
175  jetCorrEtaMax_ = ( cfg.exists("jetCorrEtaMax") ) ?
176  cfg.getParameter<double>("jetCorrEtaMax") : 9.9;
177 
178  sigmaMaxGenJetMatch_ = cfg.getParameter<double>("sigmaMaxGenJetMatch");
179 
180  smearBy_ = ( cfg.exists("smearBy") ) ? cfg.getParameter<double>("smearBy") : 1.0;
181  //std::cout << "smearBy = " << smearBy_ << std::endl;
182 
183  shiftBy_ = ( cfg.exists("shiftBy") ) ? cfg.getParameter<double>("shiftBy") : 0.;
184  //std::cout << "shiftBy = " << shiftBy_ << std::endl;
185 
186  if ( cfg.exists("skipJetSelection") ) {
187  std::string skipJetSelection_string = cfg.getParameter<std::string>("skipJetSelection");
188  skipJetSelection_ = new StringCutObjectSelector<T>(skipJetSelection_string);
189  }
190 
191  skipRawJetPtThreshold_ = ( cfg.exists("skipRawJetPtThreshold") ) ?
192  cfg.getParameter<double>("skipRawJetPtThreshold") : 1.e-2;
193  skipCorrJetPtThreshold_ = ( cfg.exists("skipCorrJetPtThreshold") ) ?
194  cfg.getParameter<double>("skipCorrJetPtThreshold") : 1.e-2;
195 
196  verbosity_ = ( cfg.exists("verbosity") ) ?
197  cfg.getParameter<int>("verbosity") : 0;
198 
199  produces<JetCollection>();
200  }
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.
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::EDProducer.

Definition at line 210 of file SmearedJetProducerT.h.

References 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 >::jetResolutionExtractor_, fwrapper::jets, edm::InputTag::label(), SmearedJetProducerT< T, Textractor >::lut_, siStripFEDMonitor_P5_cff::Max, SmearedJetProducerT< T, Textractor >::moduleLabel_, reco::LeafCandidate::phi(), 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_, SmearedJetProducerT< T, Textractor >::src_, SmearedJetProducerT< T, Textractor >::srcToken_, SmearedJetProducerT< T, Textractor >::verbosity_, x, and detailsBasic3DVector::y.

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

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 >
std::string SmearedJetProducerT< T, Textractor >::jetCorrLabel_
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 >
edm::EDGetTokenT<JetCollection> SmearedJetProducerT< T, Textractor >::srcToken_
private
template<typename T , typename Textractor >
int SmearedJetProducerT< T, Textractor >::verbosity_
private