CMS 3D CMS Logo

SmearedJetProducerT.h
Go to the documentation of this file.
1 #ifndef PAT_SMEAREDJETPRODUCERT_H
2 #define PAT_SMEAREDJETPRODUCERT_H
3 
16 
25 
29 
31 
32 #include <TFile.h>
33 #include <TH1.h>
34 #include <TH1F.h>
35 
36 #include <memory>
37 #include <random>
38 
39 namespace pat {
40  class GenJetMatcher {
41  public:
43  : m_genJetsToken(collector.consumes<reco::GenJetCollection>(cfg.getParameter<edm::InputTag>("genJets"))),
44  m_dR_max(cfg.getParameter<double>("dRMax")),
45  m_dPt_max_factor(cfg.getParameter<double>("dPtMaxFactor")) {
46  // Empty
47  }
48 
50  desc.add<edm::InputTag>("genJets");
51  desc.add<double>("dRMax");
52  desc.add<double>("dPtMaxFactor");
53  }
54 
55  void getTokens(const edm::Event& event) { event.getByToken(m_genJetsToken, m_genJets); }
56 
57  template <class T>
58  const reco::GenJet* match(const T& jet, double resolution) {
60 
61  // Try to find a gen jet matching
62  // dR < m_dR_max
63  // dPt < m_dPt_max_factor * resolution
64 
65  double min_dR = std::numeric_limits<double>::infinity();
66  const reco::GenJet* matched_genJet = nullptr;
67 
68  for (const auto& genJet : genJets) {
69  double dR = deltaR(genJet, jet);
70 
71  if (dR > min_dR)
72  continue;
73 
74  if (dR < m_dR_max) {
75  double dPt = std::abs(genJet.pt() - jet.pt());
76  if (dPt > m_dPt_max_factor * resolution)
77  continue;
78 
79  min_dR = dR;
80  matched_genJet = &genJet;
81  }
82  }
83 
84  return matched_genJet;
85  }
86 
87  private:
90 
91  double m_dR_max;
93  };
94 }; // namespace pat
95 
96 template <typename T>
98  using JetCollection = std::vector<T>;
99 
100 public:
102  : m_enabled(cfg.getParameter<bool>("enabled")),
103  m_useDeterministicSeed(cfg.getParameter<bool>("useDeterministicSeed")),
104  m_debug(cfg.getUntrackedParameter<bool>("debug", false)) {
105  m_jets_token = consumes<JetCollection>(cfg.getParameter<edm::InputTag>("src"));
106 
107  if (m_enabled) {
108  m_rho_token = consumes<double>(cfg.getParameter<edm::InputTag>("rho"));
109 
110  m_use_txt_files = cfg.exists("resolutionFile") && cfg.exists("scaleFactorFile");
111 
112  if (m_use_txt_files) {
113  std::string resolutionFile = cfg.getParameter<edm::FileInPath>("resolutionFile").fullPath();
114  std::string scaleFactorFile = cfg.getParameter<edm::FileInPath>("scaleFactorFile").fullPath();
115 
116  m_resolution_from_file.reset(new JME::JetResolution(resolutionFile));
117  m_scale_factor_from_file.reset(new JME::JetResolutionScaleFactor(scaleFactorFile));
118  } else {
119  m_jets_algo = cfg.getParameter<std::string>("algo");
120  m_jets_algo_pt = cfg.getParameter<std::string>("algopt");
121  }
122 
123  std::uint32_t seed = cfg.getParameter<std::uint32_t>("seed");
124  m_random_generator = std::mt19937(seed);
125 
126  bool skipGenMatching = cfg.getParameter<bool>("skipGenMatching");
127  if (!skipGenMatching)
128  m_genJetMatcher = std::make_shared<pat::GenJetMatcher>(cfg, consumesCollector());
129 
130  std::int32_t variation = cfg.getParameter<std::int32_t>("variation");
131  m_uncertaintySource = cfg.getParameter<std::string>("uncertaintySource");
132  m_nomVar = 1;
133  if (variation == 0)
135  else if (variation == 1)
137  else if (variation == -1)
139  else if (variation == 101) {
141  m_nomVar = 1;
142  } else if (variation == -101) {
144  m_nomVar = -1;
145  } else
147  "Invalid value for 'variation' parameter. Only -1, 0, 1 or 101, -101 are supported.");
148  }
149 
150  produces<JetCollection>();
151  }
152 
155 
156  desc.add<edm::InputTag>("src");
157  desc.add<bool>("enabled");
158  desc.add<edm::InputTag>("rho");
159  desc.add<std::int32_t>("variation", 0);
160  desc.add<std::string>("uncertaintySource", "");
161  desc.add<std::uint32_t>("seed", 37428479);
162  desc.add<bool>("skipGenMatching", false);
163  desc.add<bool>("useDeterministicSeed", true);
164  desc.addUntracked<bool>("debug", false);
165 
166  auto source = (edm::ParameterDescription<std::string>("algo", true) and
167  edm::ParameterDescription<std::string>("algopt", true)) xor
168  (edm::ParameterDescription<edm::FileInPath>("resolutionFile", true) and
169  edm::ParameterDescription<edm::FileInPath>("scaleFactorFile", true));
170  desc.addNode(std::move(source));
171 
173 
174  descriptions.addDefault(desc);
175  }
176 
177  void produce(edm::Event& event, const edm::EventSetup& setup) override {
178  edm::Handle<JetCollection> jets_collection;
179  event.getByToken(m_jets_token, jets_collection);
180 
181  // Disable the module when running on real data
182  if (m_enabled && event.isRealData()) {
183  m_enabled = false;
184  m_genJetMatcher.reset();
185  }
186 
188  if (m_enabled)
189  event.getByToken(m_rho_token, rho);
190 
192  JME::JetResolutionScaleFactor resolution_sf;
193 
194  const JetCollection& jets = *jets_collection;
195 
196  if (m_enabled) {
197  if (m_use_txt_files) {
199  resolution_sf = *m_scale_factor_from_file;
200  } else {
203  }
204 
206  unsigned int runNum_uint = static_cast<unsigned int>(event.id().run());
207  unsigned int lumiNum_uint = static_cast<unsigned int>(event.id().luminosityBlock());
208  unsigned int evNum_uint = static_cast<unsigned int>(event.id().event());
209  unsigned int jet0eta = uint32_t(jets.empty() ? 0 : jets[0].eta() / 0.01);
210  std::uint32_t seed = jet0eta + m_nomVar + (lumiNum_uint << 10) + (runNum_uint << 20) + evNum_uint;
211  m_random_generator.seed(seed);
212  }
213  }
214 
215  if (m_genJetMatcher)
216  m_genJetMatcher->getTokens(event);
217 
218  auto smearedJets = std::make_unique<JetCollection>();
219 
220  for (const auto& jet : jets) {
221  if ((!m_enabled) || (jet.pt() == 0)) {
222  // Module disabled or invalid p4. Simply copy the input jet.
223  smearedJets->push_back(jet);
224 
225  continue;
226  }
227 
228  double jet_resolution = resolution.getResolution(
230  double jer_sf = resolution_sf.getScaleFactor({{JME::Binning::JetPt, jet.pt()}, {JME::Binning::JetEta, jet.eta()}},
233 
234  if (m_debug) {
235  std::cout << "jet: pt: " << jet.pt() << " eta: " << jet.eta() << " phi: " << jet.phi()
236  << " 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()
254  << " e: " << genJet->energy() << std::endl;
255  }
256 
257  double dPt = jet.pt() - genJet->pt();
258  smearFactor = 1 + m_nomVar * (jer_sf - 1.) * dPt / jet.pt();
259 
260  } else if (jer_sf > 1) {
261  /*
262  * Case 2: we don't have a gen jet. Smear jet pt using a random gaussian variation
263  */
264 
265  double sigma = jet_resolution * std::sqrt(jer_sf * jer_sf - 1);
266  if (m_debug) {
267  std::cout << "gaussian width: " << sigma << std::endl;
268  }
269 
270  std::normal_distribution<> d(0, sigma);
271  smearFactor = 1. + m_nomVar * d(m_random_generator);
272  } else if (m_debug) {
273  std::cout << "Impossible to smear this jet" << std::endl;
274  }
275 
276  if (jet.energy() * smearFactor < MIN_JET_ENERGY) {
277  // Negative or too small smearFactor. We would change direction of the jet
278  // and this is not what we want.
279  // Recompute the smearing factor in order to have jet.energy() == MIN_JET_ENERGY
280  double newSmearFactor = MIN_JET_ENERGY / jet.energy();
281  if (m_debug) {
282  std::cout << "The smearing factor (" << smearFactor << ") is either negative or too small. Fixing it to "
283  << newSmearFactor << " to avoid change of direction." << std::endl;
284  }
285  smearFactor = newSmearFactor;
286  }
287 
288  T smearedJet = jet;
289  smearedJet.scaleEnergy(smearFactor);
290 
291  if (m_debug) {
292  std::cout << "smeared jet (" << smearFactor << "): pt: " << smearedJet.pt() << " eta: " << smearedJet.eta()
293  << " phi: " << smearedJet.phi() << " e: " << smearedJet.energy() << std::endl;
294  }
295 
296  smearedJets->push_back(smearedJet);
297  }
298 
299  // Sort jets by pt
300  std::sort(smearedJets->begin(), smearedJets->end(), jetPtComparator);
301 
302  event.put(std::move(smearedJets));
303  }
304 
305 private:
306  static constexpr const double MIN_JET_ENERGY = 1e-2;
307 
310  bool m_enabled;
316  bool m_debug;
317  std::shared_ptr<pat::GenJetMatcher> m_genJetMatcher;
318 
320  std::unique_ptr<JME::JetResolution> m_resolution_from_file;
321  std::unique_ptr<JME::JetResolutionScaleFactor> m_scale_factor_from_file;
322 
323  std::mt19937 m_random_generator;
324 
326 
327  int m_nomVar;
328 };
329 #endif
ConfigurationDescriptions.h
JME::JetResolution
Definition: JetResolution.h:17
SmearedJetProducerT::jetPtComparator
GreaterByPt< T > jetPtComparator
Definition: SmearedJetProducerT.h:325
pat::GenJetMatcher
Definition: SmearedJetProducerT.h:40
Variation
Variation
Definition: JetResolutionObject.h:29
pat::GenJetMatcher::fillDescriptions
static void fillDescriptions(edm::ParameterSetDescription &desc)
Definition: SmearedJetProducerT.h:49
SmearedJetProducerT::m_nomVar
int m_nomVar
Definition: SmearedJetProducerT.h:327
GenJetCollection.h
JME::JetResolutionScaleFactor::getScaleFactor
float getScaleFactor(const JetParameters &parameters, Variation variation=Variation::NOMINAL, std::string uncertaintySource="") const
Definition: JetResolution.cc:56
electrons_cff.bool
bool
Definition: electrons_cff.py:393
GreaterByPt
Definition: PtComparator.h:24
reco::GenJet
Jets made from MC generator particles.
Definition: GenJet.h:23
funct::false
false
Definition: Factorize.h:29
reco::GenJetCollection
std::vector< GenJet > GenJetCollection
collection of GenJet objects
Definition: GenJetCollection.h:14
SmearedJetProducerT::produce
void produce(edm::Event &event, const edm::EventSetup &setup) override
Definition: SmearedJetProducerT.h:177
pat::GenJetMatcher::m_dPt_max_factor
double m_dPt_max_factor
Definition: SmearedJetProducerT.h:92
JME::Binning::JetEta
pat::GenJetMatcher::m_dR_max
double m_dR_max
Definition: SmearedJetProducerT.h:91
edm::EDGetTokenT< reco::GenJetCollection >
contentValuesFiles.fullPath
fullPath
Definition: contentValuesFiles.py:64
edm
HLT enums.
Definition: AlignableModifier.h:19
pat::GenJetMatcher::GenJetMatcher
GenJetMatcher(const edm::ParameterSet &cfg, edm::ConsumesCollector &&collector)
Definition: SmearedJetProducerT.h:42
SmearedJetProducerT::m_genJetMatcher
std::shared_ptr< pat::GenJetMatcher > m_genJetMatcher
Definition: SmearedJetProducerT.h:317
gather_cfg.cout
cout
Definition: gather_cfg.py:144
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89353
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
EDProducer.h
SmearedJetProducerT::JetCollection
std::vector< T > JetCollection
Definition: SmearedJetProducerT.h:98
PtComparator.h
Variation::UP
singleTopDQM_cfi.jets
jets
Definition: singleTopDQM_cfi.py:42
SmearedJetProducerT::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: SmearedJetProducerT.h:153
reco::LeafCandidate::pt
double pt() const final
transverse momentum
Definition: LeafCandidate.h:146
pat::GenJetMatcher::getTokens
void getTokens(const edm::Event &event)
Definition: SmearedJetProducerT.h:55
reco
fixed size matrix
Definition: AlignmentAlgorithmBase.h:45
SmearedJetProducerT::MIN_JET_ENERGY
static constexpr const double MIN_JET_ENERGY
Definition: SmearedJetProducerT.h:306
infinity
const double infinity
Definition: CSCChamberFitter.cc:10
edm::Handle< reco::GenJetCollection >
singleTopDQM_cfi.setup
setup
Definition: singleTopDQM_cfi.py:37
fileCollector.seed
seed
Definition: fileCollector.py:127
SmearedJetProducerT::m_jets_token
edm::EDGetTokenT< JetCollection > m_jets_token
Definition: SmearedJetProducerT.h:308
edm::FileInPath
Definition: FileInPath.h:64
SmearedJetProducerT::m_uncertaintySource
std::string m_uncertaintySource
Definition: SmearedJetProducerT.h:314
pat::GenJetMatcher::m_genJetsToken
edm::EDGetTokenT< reco::GenJetCollection > m_genJetsToken
Definition: SmearedJetProducerT.h:88
SmearedJetProducerT
Definition: SmearedJetProducerT.h:97
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
JetResolution.h
Variation::NOMINAL
source
static const std::string source
Definition: EdmProvDump.cc:47
SmearedJetProducerT::m_resolution_from_file
std::unique_ptr< JME::JetResolution > m_resolution_from_file
Definition: SmearedJetProducerT.h:320
patPFMETCorrections_cff.variation
variation
Definition: patPFMETCorrections_cff.py:134
L1TObjectsTimingClient_cff.resolution
resolution
Definition: L1TObjectsTimingClient_cff.py:52
ParameterSetDescription.h
SmearedJetProducerT::m_systematic_variation
Variation m_systematic_variation
Definition: SmearedJetProducerT.h:313
PbPb_ZMuSkimMuonDPG_cff.deltaR
deltaR
Definition: PbPb_ZMuSkimMuonDPG_cff.py:63
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
DDAxes::rho
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
pat::GenJetMatcher::m_genJets
edm::Handle< reco::GenJetCollection > m_genJets
Definition: SmearedJetProducerT.h:89
SmearedJetProducerT::m_useDeterministicSeed
bool m_useDeterministicSeed
Definition: SmearedJetProducerT.h:315
SmearedJetProducerT::m_enabled
bool m_enabled
Definition: SmearedJetProducerT.h:310
edm::ParameterSet
Definition: ParameterSet.h:47
Event.h
reco::LeafCandidate::eta
double eta() const final
momentum pseudorapidity
Definition: LeafCandidate.h:152
deltaR.h
edm::stream::EDProducer
Definition: EDProducer.h:38
ttbarCategorization_cff.genJets
genJets
Definition: ttbarCategorization_cff.py:29
edm::EventSetup
Definition: EventSetup.h:57
pat
Definition: HeavyIon.h:7
JME::JetResolutionScaleFactor
Definition: JetResolution.h:40
SmearedJetProducerT::m_jets_algo_pt
std::string m_jets_algo_pt
Definition: SmearedJetProducerT.h:311
InputTag.h
looper.cfg
cfg
Definition: looper.py:297
JME::Binning::Rho
SmearedJetProducerT::m_jets_algo
std::string m_jets_algo
Definition: SmearedJetProducerT.h:312
JME::JetResolutionScaleFactor::get
static const JetResolutionScaleFactor get(const edm::EventSetup &, const std::string &)
Definition: JetResolution.cc:48
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
SmearedJetProducerT::m_random_generator
std::mt19937 m_random_generator
Definition: SmearedJetProducerT.h:323
reco::LeafCandidate::phi
double phi() const final
momentum azimuthal angle
Definition: LeafCandidate.h:148
edm::errors::ConfigFileReadError
Definition: EDMException.h:25
pat::GenJetMatcher::match
const reco::GenJet * match(const T &jet, double resolution)
Definition: SmearedJetProducerT.h:58
Frameworkfwd.h
T
long double T
Definition: Basic3DVectorLD.h:48
SmearedJetProducerT::m_use_txt_files
bool m_use_txt_files
Definition: SmearedJetProducerT.h:319
metsig::jet
Definition: SignAlgoResolutions.h:47
Exception
Definition: hltDiff.cc:246
SmearedJetProducerT::m_debug
bool m_debug
Definition: SmearedJetProducerT.h:316
Variation::DOWN
SmearedJetProducerT::m_rho_token
edm::EDGetTokenT< double > m_rho_token
Definition: SmearedJetProducerT.h:309
patPFMETCorrections_cff.skipGenMatching
skipGenMatching
Definition: patPFMETCorrections_cff.py:110
reco::LeafCandidate::energy
double energy() const final
energy
Definition: LeafCandidate.h:125
ztail.d
d
Definition: ztail.py:151
JME::Binning::JetPt
JME::JetResolution::get
static const JetResolution get(const edm::EventSetup &, const std::string &)
Definition: JetResolution.cc:23
GenJet.h
SmearedJetProducerT::m_scale_factor_from_file
std::unique_ptr< JME::JetResolutionScaleFactor > m_scale_factor_from_file
Definition: SmearedJetProducerT.h:321
ConsumesCollector.h
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
HGC3DClusterGenMatchSelector_cfi.dR
dR
Definition: HGC3DClusterGenMatchSelector_cfi.py:7
ParameterSet.h
event
Definition: event.py:1
edm::Event
Definition: Event.h:73
edm::ConfigurationDescriptions::addDefault
void addDefault(ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:99
edm::ParameterDescription
Definition: ParameterDescription.h:110
edm::InputTag
Definition: InputTag.h:15
edm::ConsumesCollector
Definition: ConsumesCollector.h:45
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37
SmearedJetProducerT::SmearedJetProducerT
SmearedJetProducerT(const edm::ParameterSet &cfg)
Definition: SmearedJetProducerT.h:101