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
 
void modulesDependentUpon (const std::string &iProcessName, std::vector< const char * > &oModuleLabels) 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 145 of file SmearedJetProducerT.h.

Member Typedef Documentation

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

Definition at line 147 of file SmearedJetProducerT.h.

Constructor & Destructor Documentation

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

Definition at line 151 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_.

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

References 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 >::jetResolutionExtractor_, fwrapper::jets, edm::InputTag::label(), SmearedJetProducerT< T, Textractor >::lut_, 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.

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