CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes
pat::JetCorrFactorsProducer Class Reference

Produces a ValueMap between JetCorrFactors and the to the originating reco jets. More...

#include "PhysicsTools/PatAlgos/interface/JetCorrFactorsProducer.h"

Inheritance diagram for pat::JetCorrFactorsProducer:
edm::stream::EDProducer<>

Public Types

typedef std::map< JetCorrFactors::Flavor, std::vector< std::string > > FlavorCorrLevelMap
 map of correction levels to different flavors More...
 
typedef edm::ValueMap< pat::JetCorrFactorsJetCorrFactorsMap
 value map for JetCorrFactors (to be written into the event) More...
 
- 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 Member Functions

 JetCorrFactorsProducer (const edm::ParameterSet &cfg)
 default constructor More...
 
void produce (edm::Event &event, const edm::EventSetup &setup) override
 everything that needs to be done per event More...
 
 ~JetCorrFactorsProducer () override
 default destructor More...
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
bool hasAbilityToProduceInLumis () const final
 
bool hasAbilityToProduceInRuns () const final
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 description of configuration file parameters More...
 

Private Member Functions

float evaluate (edm::View< reco::Jet >::const_iterator &jet, const JetCorrFactors::Flavor &flavor, int level)
 evaluate jet correction factor up to a given level More...
 
std::vector< std::string > expand (const std::vector< std::string > &levels, const JetCorrFactors::Flavor &flavor)
 
bool flavorDependent () const
 return true if the jec levels contain at least one flavor dependent correction level More...
 
int numberOf (const edm::Handle< std::vector< reco::Vertex > > &primaryVertices)
 determines the number of valid primary vertices for the standard L1Offset correction of JetMET More...
 
std::vector< JetCorrectorParametersparams (const JetCorrectorParametersCollection &parameters, const std::vector< std::string > &levels) const
 return the jec parameters as input to the FactorizedJetCorrector for different flavors More...
 
std::string payload ()
 map jet algorithm to payload in DB More...
 

Private Attributes

unsigned long long cacheId_
 cache identifier for JetCorrectionsRecord More...
 
std::map< JetCorrFactors::Flavor, std::unique_ptr< FactorizedJetCorrector > > correctors_
 cache container for jet corrections More...
 
bool emf_
 use electromagnetic fraction for jet energy corrections or not (will only have an effect for jets CaloJets) More...
 
std::vector< std::string > extraJPTOffset_
 
std::unique_ptr< FactorizedJetCorrectorextraJPTOffsetCorrector_
 cache container for JPTOffset jet corrections More...
 
std::string label_
 label of jec factors More...
 
FlavorCorrLevelMap levels_
 
std::string payload_
 label of payload More...
 
edm::InputTag primaryVertices_
 label for L1Offset primaryVertex collection More...
 
edm::EDGetTokenT< std::vector< reco::Vertex > > primaryVerticesToken_
 
edm::InputTag rho_
 label for L1FastJet energy density parameter rho More...
 
edm::EDGetTokenT< double > rhoToken_
 
edm::EDGetTokenT< edm::View< reco::Jet > > srcToken_
 input jet collection More...
 
std::string type_
 type of flavor dependent JEC factors (only 'J' and 'T' are allowed) More...
 
bool useNPV_
 use the NPV and rho with the JEC? (used for L1Offset/L1FastJet and L1FastJet, resp.) More...
 
bool useRho_
 

Detailed Description

Produces a ValueMap between JetCorrFactors and the to the originating reco jets.

The JetCorrFactorsProducer produces a set of correction factors, defined in the class pat::JetCorrFactors. This vector is linked to the originating reco jets through an edm::ValueMap. The initializing parameters of the module can be found in the recoLayer1/jetCorrFactors_cfi.py of the PatAlgos package. In the standard PAT workflow the module has to be run before the creation of the pat::Jet. The edm::ValueMap will then be embedded into the pat::Jet.

Jets corrected up to a given correction level can then be accessed via the pat::Jet member function correctedJet. For more details have a look into the class description of the pat::Jet.

ATTENTION: available options for flavor corrections are L5Flavor_gJ L7Parton_gJ gluon from dijets L5Flavor_qJ/_qT L7Parton_qJ/_qT quark from dijets/top L5Flavor_cJ/_cT L7Parton_cJ/_cT charm from dijets/top L5Flavor_bJ/_bT L7Parton_bJ/_bT beauty from dijets/top L7Parton_jJ/_tT mixture from dijets/top

where mixture refers to the flavor mixture as determined from the MC sample the flavor dependent corrections have been derived from. 'J' and 'T' stand for a typical dijet (ttbar) sample.

L1Offset corrections require the collection of offlinePrimaryVertices, which are supposed to be added as an additional optional parameter primaryVertices in the jetCorrFactors_cfi.py file.

L1FastJet corrections, which are an alternative to the standard L1Offset correction as recommended by the JetMET PAG the energy density parameter rho is supposed to be added as an additional optional parameter rho in the jetCorrFactors_cfi.py file.

NOTE: the mixed mode (mc input mixture from dijets/ttbar) only exists for parton level corrections. jJ and tT are not covered in this implementation of the JetCorrFactorsProducer there are no gluon corrections available from the top sample on the L7Parton level.

Definition at line 60 of file JetCorrFactorsProducer.h.

Member Typedef Documentation

typedef std::map<JetCorrFactors::Flavor, std::vector<std::string> > pat::JetCorrFactorsProducer::FlavorCorrLevelMap

map of correction levels to different flavors

Definition at line 65 of file JetCorrFactorsProducer.h.

value map for JetCorrFactors (to be written into the event)

Definition at line 63 of file JetCorrFactorsProducer.h.

Constructor & Destructor Documentation

JetCorrFactorsProducer::JetCorrFactorsProducer ( const edm::ParameterSet cfg)
explicit

default constructor

Definition at line 21 of file JetCorrFactorsProducer.cc.

References pat::JetCorrFactors::BOTTOM, pat::JetCorrFactors::CHARM, Exception, edm::ParameterSet::existsAs(), expand(), extraJPTOffset_, spr::find(), edm::ParameterSet::getParameter(), pat::JetCorrFactors::GLUON, jets_cff::levels, levels_, pat::JetCorrFactors::NONE, primaryVertices_, primaryVerticesToken_, rho_, rhoToken_, AlCaHLTBitMon_QueryRunRegistry::string, pat::JetCorrFactors::UDS, useNPV_, and useRho_.

22  : emf_(cfg.getParameter<bool>("emf")),
24  type_(cfg.getParameter<std::string>("flavorType")),
25  label_(cfg.getParameter<std::string>("@module_label")),
26  payload_(cfg.getParameter<std::string>("payload")),
27  useNPV_(cfg.getParameter<bool>("useNPV")),
28  useRho_(cfg.getParameter<bool>("useRho")),
29  cacheId_(0) {
30  std::vector<std::string> levels = cfg.getParameter<std::vector<std::string> >("levels");
31  // fill the std::map for levels_, which might be flavor dependent or not;
32  // flavor dependency is determined from the fact whether the std::string
33  // L5Flavor or L7Parton can be found in levels; if flavor dependent four
34  // vectors of strings will be filled into the map corresponding to GLUON,
35  // UDS, CHARM and BOTTOM (according to JetCorrFactors::Flavor), 'L5Flavor'
36  // and 'L7Parton' will be expanded accordingly; if not levels_ is filled
37  // with only one vector of strings according to NONE. This vector will be
38  // equivalent to the original vector of strings.
39  if (std::find(levels.begin(), levels.end(), "L5Flavor") != levels.end() ||
40  std::find(levels.begin(), levels.end(), "L7Parton") != levels.end()) {
45  } else {
47  }
48  // if the std::string L1JPTOffset can be found in levels an additional
49  // parameter extraJPTOffset is needed, which should pass on the the usual
50  // L1Offset correction, which is an additional input to the L1JPTOffset
51  // corrector
52  if (std::find(levels.begin(), levels.end(), "L1JPTOffset") != levels.end()) {
53  if (cfg.existsAs<std::string>("extraJPTOffset")) {
54  extraJPTOffset_.push_back(cfg.getParameter<std::string>("extraJPTOffset"));
55  } else {
56  throw cms::Exception("No parameter extraJPTOffset specified")
57  << "The configured correction levels contain a L1JPTOffset correction, which re- \n"
58  << "quires the additional parameter extraJPTOffset or type std::string. This \n"
59  << "string should correspond to the L1Offset corrections that should be applied \n"
60  << "together with the JPTL1Offset corrections. These corrections can be of type \n"
61  << "L1Offset or L1FastJet. \n";
62  }
63  }
64  // if the std::string L1Offset can be found in levels an additional para-
65  // meter primaryVertices is needed, which should pass on the offline pri-
66  // mary vertex collection. The size of this collection is needed for the
67  // L1Offset correction.
68  if (useNPV_) {
69  if (cfg.existsAs<edm::InputTag>("primaryVertices")) {
70  primaryVertices_ = cfg.getParameter<edm::InputTag>("primaryVertices");
71  primaryVerticesToken_ = mayConsume<std::vector<reco::Vertex> >(primaryVertices_);
72  } else {
73  throw cms::Exception("No primaryVertices specified")
74  << "The configured correction levels contain an L1Offset or L1FastJet correction, \n"
75  << "which requires the number of offlinePrimaryVertices. Please specify this col- \n"
76  << "lection as additional optional parameter primaryVertices of type edm::InputTag\n"
77  << "in the jetCorrFactors module. \n";
78  }
79  }
80  // if the std::string L1FastJet can be found in levels an additional
81  // parameter rho is needed, which should pass on the energy density
82  // parameter for the corresponding jet collection.
83  if (useRho_) {
84  if ((!extraJPTOffset_.empty() && extraJPTOffset_.front() == std::string("L1FastJet")) ||
85  std::find(levels.begin(), levels.end(), "L1FastJet") != levels.end()) {
86  if (cfg.existsAs<edm::InputTag>("rho")) {
87  rho_ = cfg.getParameter<edm::InputTag>("rho");
88  rhoToken_ = mayConsume<double>(rho_);
89  } else {
90  throw cms::Exception("No parameter rho specified")
91  << "The configured correction levels contain a L1FastJet correction, which re- \n"
92  << "quires the energy density parameter rho. Please specify this collection as \n"
93  << "additional optional parameter rho of type edm::InputTag in the jetCorrFac- \n"
94  << "tors module. \n";
95  }
96  } else {
97  edm::LogInfo message("Parameter rho not used");
98  message << "Module is configured to use the parameter rho, but rho is only used \n"
99  << "for L1FastJet corrections. The configuration of levels does not contain \n"
100  << "L1FastJet corrections though, so rho will not be used by this module. \n";
101  }
102  }
103  produces<JetCorrFactorsMap>();
104 }
T getParameter(std::string const &) const
edm::EDGetTokenT< double > rhoToken_
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:161
std::string label_
label of jec factors
edm::EDGetTokenT< std::vector< reco::Vertex > > primaryVerticesToken_
std::vector< std::string > extraJPTOffset_
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
bool emf_
use electromagnetic fraction for jet energy corrections or not (will only have an effect for jets Cal...
std::string payload_
label of payload
std::vector< std::string > expand(const std::vector< std::string > &levels, const JetCorrFactors::Flavor &flavor)
edm::EDGetTokenT< edm::View< reco::Jet > > srcToken_
input jet collection
edm::InputTag primaryVertices_
label for L1Offset primaryVertex collection
edm::InputTag rho_
label for L1FastJet energy density parameter rho
bool useNPV_
use the NPV and rho with the JEC? (used for L1Offset/L1FastJet and L1FastJet, resp.)
std::string type_
type of flavor dependent JEC factors (only &#39;J&#39; and &#39;T&#39; are allowed)
unsigned long long cacheId_
cache identifier for JetCorrectionsRecord
pat::JetCorrFactorsProducer::~JetCorrFactorsProducer ( )
inlineoverride

default destructor

Definition at line 71 of file JetCorrFactorsProducer.h.

References fillDescriptions(), produce(), and GeneralSetup::setup().

71 {};

Member Function Documentation

float JetCorrFactorsProducer::evaluate ( edm::View< reco::Jet >::const_iterator &  jet,
const JetCorrFactors::Flavor flavor,
int  level 
)
private

evaluate jet correction factor up to a given level

Definition at line 143 of file JetCorrFactorsProducer.cc.

References pat::Jet::correctedP4(), mitigatedMETSequence_cff::corrector, correctors_, emf_, reco::LeafCandidate::energy(), reco::LeafCandidate::eta(), extraJPTOffsetCorrector_, reco::JPTJet::getCaloJetRef(), metsig::jet, hcalDigis_cfi::level, p4, reco::LeafCandidate::phi(), and reco::LeafCandidate::pt().

Referenced by flavorDependent(), and produce().

145  {
146  std::unique_ptr<FactorizedJetCorrector>& corrector = correctors_.find(flavor)->second;
147  // add parameters for JPT corrections
148  const reco::JPTJet* jpt = dynamic_cast<reco::JPTJet const*>(&*jet);
149  if (jpt) {
150  TLorentzVector p4;
151  p4.SetPtEtaPhiE(jpt->getCaloJetRef()->pt(),
152  jpt->getCaloJetRef()->eta(),
153  jpt->getCaloJetRef()->phi(),
154  jpt->getCaloJetRef()->energy());
156  extraJPTOffsetCorrector_->setJPTrawP4(p4);
157  corrector->setJPTrawOff(extraJPTOffsetCorrector_->getSubCorrections()[0]);
158  }
159  corrector->setJPTrawP4(p4);
160  }
161  //For PAT jets undo previous jet energy corrections
162  const Jet* patjet = dynamic_cast<Jet const*>(&*jet);
163  if (patjet) {
164  corrector->setJetEta(patjet->correctedP4(0).eta());
165  corrector->setJetPt(patjet->correctedP4(0).pt());
166  corrector->setJetPhi(patjet->correctedP4(0).phi());
167  corrector->setJetE(patjet->correctedP4(0).energy());
168  } else {
169  corrector->setJetEta(jet->eta());
170  corrector->setJetPt(jet->pt());
171  corrector->setJetPhi(jet->phi());
172  corrector->setJetE(jet->energy());
173  }
174  if (emf_ && dynamic_cast<const reco::CaloJet*>(&*jet)) {
175  corrector->setJetEMF(dynamic_cast<const reco::CaloJet*>(&*jet)->emEnergyFraction());
176  }
177  return corrector->getSubCorrections()[level];
178 }
const LorentzVector correctedP4(const std::string &level, const std::string &flavor="none", const std::string &set="") const
Definition: Jet.h:158
double eta() const final
momentum pseudorapidity
double pt() const final
transverse momentum
const edm::RefToBase< reco::Jet > & getCaloJetRef() const
Definition: JPTJet.h:130
bool emf_
use electromagnetic fraction for jet energy corrections or not (will only have an effect for jets Cal...
Definition: Jet.py:1
double p4[4]
Definition: TauolaWrapper.h:92
Jets made from CaloJets corrected for ZSP and tracks.
Definition: JPTJet.h:29
double energy() const final
energy
std::unique_ptr< FactorizedJetCorrector > extraJPTOffsetCorrector_
cache container for JPTOffset jet corrections
std::map< JetCorrFactors::Flavor, std::unique_ptr< FactorizedJetCorrector > > correctors_
cache container for jet corrections
double phi() const final
momentum azimuthal angle
std::vector< std::string > JetCorrFactorsProducer::expand ( const std::vector< std::string > &  levels,
const JetCorrFactors::Flavor flavor 
)
private

return an expanded version of correction levels for different flavors; the result should be of type ['L2Relative', 'L3Absolute', 'L5FLavor_gJ', 'L7Parton_gJ']; L7Parton_gT will result in an empty string as this correction level is not available

Definition at line 106 of file JetCorrFactorsProducer.cc.

References pat::JetCorrFactors::BOTTOM, pat::JetCorrFactors::CHARM, pat::JetCorrFactors::GLUON, hcalDigis_cfi::level, AlCaHLTBitMon_QueryRunRegistry::string, type_, and pat::JetCorrFactors::UDS.

Referenced by flavorDependent(), and JetCorrFactorsProducer().

107  {
108  std::vector<std::string> expand;
109  for (std::vector<std::string>::const_iterator level = levels.begin(); level != levels.end(); ++level) {
110  if ((*level) == "L5Flavor" || (*level) == "L7Parton") {
111  if (flavor == JetCorrFactors::GLUON) {
112  if (*level == "L7Parton" && type_ == "T") {
113  edm::LogWarning message("L7Parton::GLUON not available");
114  message << "Jet energy corrections requested for level: L7Parton and type: 'T'. \n"
115  << "For this combination there is no GLUON correction available. The \n"
116  << "correction for this flavor type will be taken from 'J'.";
117  }
118  expand.push_back(std::string(*level).append("_").append("g").append("J"));
119  }
120  if (flavor == JetCorrFactors::UDS)
121  expand.push_back(std::string(*level).append("_").append("q").append(type_));
122  if (flavor == JetCorrFactors::CHARM)
123  expand.push_back(std::string(*level).append("_").append("c").append(type_));
124  if (flavor == JetCorrFactors::BOTTOM)
125  expand.push_back(std::string(*level).append("_").append("b").append(type_));
126  } else {
127  expand.push_back(*level);
128  }
129  }
130  return expand;
131 }
std::vector< std::string > expand(const std::vector< std::string > &levels, const JetCorrFactors::Flavor &flavor)
std::string type_
type of flavor dependent JEC factors (only &#39;J&#39; and &#39;T&#39; are allowed)
void JetCorrFactorsProducer::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

description of configuration file parameters

Definition at line 294 of file JetCorrFactorsProducer.cc.

References edm::ConfigurationDescriptions::add(), edm::ParameterSetDescription::add(), DEFINE_FWK_MODULE, jets_cff::levels, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by ~JetCorrFactorsProducer().

294  {
296  iDesc.add<bool>("emf", false);
297  iDesc.add<std::string>("flavorType", "J");
298  iDesc.add<edm::InputTag>("src", edm::InputTag("ak5CaloJets"));
299  iDesc.add<std::string>("payload", "AK5Calo");
300  iDesc.add<bool>("useNPV", true);
301  iDesc.add<edm::InputTag>("primaryVertices", edm::InputTag("offlinePrimaryVertices"));
302  iDesc.add<bool>("useRho", true);
303  iDesc.add<edm::InputTag>("rho", edm::InputTag("fixedGridRhoFastjetAllCalo"));
304  iDesc.add<std::string>("extraJPTOffset", "L1Offset");
305 
306  std::vector<std::string> levels;
307  levels.push_back(std::string("L1Offset"));
308  levels.push_back(std::string("L2Relative"));
309  levels.push_back(std::string("L3Absolute"));
310  levels.push_back(std::string("L2L3Residual"));
311  levels.push_back(std::string("L5Flavor"));
312  levels.push_back(std::string("L7Parton"));
313  iDesc.add<std::vector<std::string> >("levels", levels);
314  descriptions.add("JetCorrFactorsProducer", iDesc);
315 }
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool pat::JetCorrFactorsProducer::flavorDependent ( ) const
inlineprivate

return true if the jec levels contain at least one flavor dependent correction level

Definition at line 79 of file JetCorrFactorsProducer.h.

References evaluate(), expand(), metsig::jet, hcalDigis_cfi::level, jets_cff::levels, levels_, numberOf(), params(), payload(), jets_cff::primaryVertices, and AlCaHLTBitMon_QueryRunRegistry::string.

79 { return (levels_.size()>1); };
int pat::JetCorrFactorsProducer::numberOf ( const edm::Handle< std::vector< reco::Vertex > > &  primaryVertices)
inlineprivate

determines the number of valid primary vertices for the standard L1Offset correction of JetMET

Definition at line 136 of file JetCorrFactorsProducer.h.

References jets_cff::primaryVertices, and MetAnalyzer::pv().

Referenced by flavorDependent(), and produce().

137  {
138  int npv=0;
139  for(std::vector<reco::Vertex>::const_iterator pv=primaryVertices->begin(); pv!=primaryVertices->end(); ++pv){
140  if(pv->ndof()>=4) ++npv;
141  }
142  return npv;
143  }
def pv(vc)
Definition: MetAnalyzer.py:7
std::vector< JetCorrectorParameters > JetCorrFactorsProducer::params ( const JetCorrectorParametersCollection parameters,
const std::vector< std::string > &  levels 
) const
private

return the jec parameters as input to the FactorizedJetCorrector for different flavors

Definition at line 133 of file JetCorrFactorsProducer.cc.

References hcalDigis_cfi::level, and JetCorrectorParametersCollection::push_back().

Referenced by flavorDependent(), and produce().

134  {
135  std::vector<JetCorrectorParameters> params;
136  for (std::vector<std::string>::const_iterator level = levels.begin(); level != levels.end(); ++level) {
137  const JetCorrectorParameters& ip = parameters[*level]; //ip.printScreen();
138  params.push_back(ip);
139  }
140  return params;
141 }
void push_back(key_type i, value_type const &j, label_type const &flav="")
std::vector< JetCorrectorParameters > params(const JetCorrectorParametersCollection &parameters, const std::vector< std::string > &levels) const
return the jec parameters as input to the FactorizedJetCorrector for different flavors ...
std::string JetCorrFactorsProducer::payload ( )
private

map jet algorithm to payload in DB

Definition at line 180 of file JetCorrFactorsProducer.cc.

References payload_.

Referenced by flavorDependent(), and produce().

180 { return payload_; }
std::string payload_
label of payload
void JetCorrFactorsProducer::produce ( edm::Event event,
const edm::EventSetup setup 
)
override

everything that needs to be done per event

Definition at line 182 of file JetCorrFactorsProducer.cc.

References cacheId_, correctors_, PatJetAnalyzer_cfi::corrLevel, evaluate(), Exception, extraJPTOffset_, extraJPTOffsetCorrector_, objects.autophobj::filler, edm::EventSetup::get(), edm::Event::getByToken(), training_settings::idx, patTestJEC_cfi::jec, metsig::jet, fwrapper::jets, edm::InputTag::label(), label_, levels_, eostools::move(), numberOf(), params(), payload(), jets_cff::primaryVertices, primaryVertices_, primaryVerticesToken_, rho_, rhoToken_, srcToken_, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by ~JetCorrFactorsProducer().

182  {
183  // get jet collection from the event
185  event.getByToken(srcToken_, jets);
186 
187  // get primary vertices for L1Offset correction level if needed
189  if (!primaryVertices_.label().empty())
190  event.getByToken(primaryVerticesToken_, primaryVertices);
191 
192  // get parameter rho for L1FastJet correction level if needed
194  if (!rho_.label().empty())
195  event.getByToken(rhoToken_, rho);
196 
197  auto const& rec = setup.get<JetCorrectionsRecord>();
198  if (cacheId_ != rec.cacheIdentifier()) {
199  // retreive parameters from the DB
201  setup.get<JetCorrectionsRecord>().get(payload(), parameters);
202  // initialize jet correctors
203  for (FlavorCorrLevelMap::const_iterator flavor = levels_.begin(); flavor != levels_.end(); ++flavor) {
204  correctors_[flavor->first].reset(new FactorizedJetCorrector(params(*parameters, flavor->second)));
205  }
206  // initialize extra jet corrector for jpt if needed
207  if (!extraJPTOffset_.empty()) {
209  }
210  cacheId_ = rec.cacheIdentifier();
211  }
212 
213  // fill the jetCorrFactors
214  std::vector<JetCorrFactors> jcfs;
215  for (edm::View<reco::Jet>::const_iterator jet = jets->begin(); jet != jets->end(); ++jet) {
216  // the JetCorrFactors::CorrectionFactor is a std::pair<std::string, std::vector<float> >
217  // the string corresponds to the label of the correction level, the vector contains four
218  // floats if flavor dependent and one float else. Per construction jet energy corrections
219  // will be flavor independent up to the first flavor dependent correction and flavor de-
220  // pendent afterwards. The first correction level is predefined with label 'Uncorrected'.
221  // Per definition it is flavor independent. The correction factor is 1.
222  std::vector<JetCorrFactors::CorrectionFactor> jec;
223  jec.push_back(
224  std::make_pair<std::string, std::vector<float> >(std::string("Uncorrected"), std::vector<float>(1, 1)));
225 
226  // pick the first element in the map (which could be the only one) and loop all jec
227  // levels listed for that element. If this is not the only element all jec levels, which
228  // are flavor independent will give the same correction factors until the first flavor
229  // dependent correction level is reached. So the first element is still a good choice.
230  FlavorCorrLevelMap::const_iterator corrLevel = levels_.begin();
231  if (corrLevel == levels_.end()) {
232  throw cms::Exception("No JECFactors")
233  << "You request to create a jetCorrFactors object with no JEC Levels indicated. \n"
234  << "This makes no sense, either you should correct this or drop the module from \n"
235  << "the sequence.";
236  }
237  for (unsigned int idx = 0; idx < corrLevel->second.size(); ++idx) {
238  std::vector<float> factors;
239  if (corrLevel->second[idx].find("L5Flavor") != std::string::npos ||
240  corrLevel->second[idx].find("L7Parton") != std::string::npos) {
241  for (FlavorCorrLevelMap::const_iterator flavor = corrLevel; flavor != levels_.end(); ++flavor) {
242  if (!primaryVertices_.label().empty()) {
243  // if primaryVerticesToken_ has a value the number of primary vertices needs to be
244  // specified
245  correctors_.find(flavor->first)->second->setNPV(numberOf(primaryVertices));
246  }
247  if (!rho_.label().empty()) {
248  // if rhoToken_ has a value the energy density parameter rho and the jet area need
249  // to be specified
250  correctors_.find(flavor->first)->second->setRho(*rho);
251  correctors_.find(flavor->first)->second->setJetA(jet->jetArea());
252  }
253  factors.push_back(evaluate(jet, flavor->first, idx));
254  }
255  } else {
256  if (!primaryVertices_.label().empty()) {
257  // if primaryVerticesToken_ has a value the number of primary vertices needs to be
258  // specified
259  correctors_.find(corrLevel->first)->second->setNPV(numberOf(primaryVertices));
260  }
261  if (!rho_.label().empty()) {
262  // if rhoToken_ has a value the energy density parameter rho and the jet area need
263  // to be specified
264  correctors_.find(corrLevel->first)->second->setRho(*rho);
265  correctors_.find(corrLevel->first)->second->setJetA(jet->jetArea());
266  }
267  factors.push_back(evaluate(jet, corrLevel->first, idx));
268  }
269  // push back the set of JetCorrFactors: the first entry corresponds to the label
270  // of the correction level, which is taken from the first element in levels_. For
271  // L5Flavor and L7Parton the part including the first '_' indicating the flavor
272  // of the first element in levels_ is chopped of from the label to avoid confusion
273  // of the correction levels. The second parameter corresponds to the set of jec
274  // factors, which might be flavor dependent or not. In the default configuration
275  // the CorrectionFactor will look like this: 'Uncorrected': 1 ; 'L2Relative': x ;
276  // 'L3Absolute': x ; 'L5Flavor': v, x, y, z ; 'L7Parton': v, x, y, z
277  jec.push_back(std::make_pair((corrLevel->second[idx]).substr(0, (corrLevel->second[idx]).find("_")), factors));
278  }
279  // create the actual object with the scale factors we want the valuemap to refer to
280  // label_ corresponds to the label of the module instance
281  JetCorrFactors corrFactors(label_, jec);
282  jcfs.push_back(corrFactors);
283  }
284  // build the value map
285  auto jetCorrsMap = std::make_unique<JetCorrFactorsMap>();
286  JetCorrFactorsMap::Filler filler(*jetCorrsMap);
287  // jets and jetCorrs have their indices aligned by construction
288  filler.insert(jets, jcfs.begin(), jcfs.end());
289  filler.fill(); // do the actual filling
290  // put our produced stuff in the event
291  event.put(std::move(jetCorrsMap));
292 }
edm::EDGetTokenT< double > rhoToken_
std::string payload()
map jet algorithm to payload in DB
std::string label_
label of jec factors
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
edm::EDGetTokenT< std::vector< reco::Vertex > > primaryVerticesToken_
std::vector< std::string > extraJPTOffset_
int numberOf(const edm::Handle< std::vector< reco::Vertex > > &primaryVertices)
determines the number of valid primary vertices for the standard L1Offset correction of JetMET ...
Class for the storage of jet correction factors.
vector< PseudoJet > jets
helper::Filler< ValueMap< T > > Filler
Definition: ValueMap.h:169
primaryVertices
Definition: jets_cff.py:24
edm::EDGetTokenT< edm::View< reco::Jet > > srcToken_
input jet collection
std::vector< JetCorrectorParameters > params(const JetCorrectorParametersCollection &parameters, const std::vector< std::string > &levels) const
return the jec parameters as input to the FactorizedJetCorrector for different flavors ...
std::string const & label() const
Definition: InputTag.h:36
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
T get() const
Definition: EventSetup.h:71
std::unique_ptr< FactorizedJetCorrector > extraJPTOffsetCorrector_
cache container for JPTOffset jet corrections
std::map< JetCorrFactors::Flavor, std::unique_ptr< FactorizedJetCorrector > > correctors_
cache container for jet corrections
edm::InputTag primaryVertices_
label for L1Offset primaryVertex collection
edm::InputTag rho_
label for L1FastJet energy density parameter rho
float evaluate(edm::View< reco::Jet >::const_iterator &jet, const JetCorrFactors::Flavor &flavor, int level)
evaluate jet correction factor up to a given level
unsigned long long cacheId_
cache identifier for JetCorrectionsRecord
def move(src, dest)
Definition: eostools.py:511

Member Data Documentation

unsigned long long pat::JetCorrFactorsProducer::cacheId_
private

cache identifier for JetCorrectionsRecord

Definition at line 128 of file JetCorrFactorsProducer.h.

Referenced by produce().

std::map<JetCorrFactors::Flavor, std::unique_ptr<FactorizedJetCorrector> > pat::JetCorrFactorsProducer::correctors_
private

cache container for jet corrections

Definition at line 130 of file JetCorrFactorsProducer.h.

Referenced by evaluate(), and produce().

bool pat::JetCorrFactorsProducer::emf_
private

use electromagnetic fraction for jet energy corrections or not (will only have an effect for jets CaloJets)

Definition at line 95 of file JetCorrFactorsProducer.h.

Referenced by evaluate().

std::vector<std::string> pat::JetCorrFactorsProducer::extraJPTOffset_
private

label of additional L1Offset corrector for JPT jets; for format reasons this string is kept in a vector of strings

Definition at line 106 of file JetCorrFactorsProducer.h.

Referenced by JetCorrFactorsProducer(), and produce().

std::unique_ptr<FactorizedJetCorrector> pat::JetCorrFactorsProducer::extraJPTOffsetCorrector_
private

cache container for JPTOffset jet corrections

Definition at line 132 of file JetCorrFactorsProducer.h.

Referenced by evaluate(), and produce().

std::string pat::JetCorrFactorsProducer::label_
private
FlavorCorrLevelMap pat::JetCorrFactorsProducer::levels_
private

jec levels for different flavors. In the default configuration this map would look like this: GLUON : 'L2Relative', 'L3Absolute', 'L5FLavor_jg', L7Parton_jg' UDS : 'L2Relative', 'L3Absolute', 'L5FLavor_jq', L7Parton_jq' CHARM : 'L2Relative', 'L3Absolute', 'L5FLavor_jc', L7Parton_jc' BOTTOM : 'L2Relative', 'L3Absolute', 'L5FLavor_jb', L7Parton_jb' or just like this: NONE : 'L2Relative', 'L3Absolute', 'L2L3Residual' per definition the vectors for all elements in this map should have the same size

Definition at line 126 of file JetCorrFactorsProducer.h.

Referenced by flavorDependent(), JetCorrFactorsProducer(), and produce().

std::string pat::JetCorrFactorsProducer::payload_
private

label of payload

Definition at line 103 of file JetCorrFactorsProducer.h.

Referenced by payload().

edm::InputTag pat::JetCorrFactorsProducer::primaryVertices_
private

label for L1Offset primaryVertex collection

Definition at line 108 of file JetCorrFactorsProducer.h.

Referenced by JetCorrFactorsProducer(), and produce().

edm::EDGetTokenT<std::vector<reco::Vertex> > pat::JetCorrFactorsProducer::primaryVerticesToken_
private

Definition at line 109 of file JetCorrFactorsProducer.h.

Referenced by JetCorrFactorsProducer(), and produce().

edm::InputTag pat::JetCorrFactorsProducer::rho_
private

label for L1FastJet energy density parameter rho

Definition at line 111 of file JetCorrFactorsProducer.h.

Referenced by JetCorrFactorsProducer(), and produce().

edm::EDGetTokenT<double> pat::JetCorrFactorsProducer::rhoToken_
private

Definition at line 112 of file JetCorrFactorsProducer.h.

Referenced by JetCorrFactorsProducer(), and produce().

edm::EDGetTokenT<edm::View<reco::Jet> > pat::JetCorrFactorsProducer::srcToken_
private

input jet collection

Definition at line 97 of file JetCorrFactorsProducer.h.

Referenced by produce().

std::string pat::JetCorrFactorsProducer::type_
private
bool pat::JetCorrFactorsProducer::useNPV_
private

use the NPV and rho with the JEC? (used for L1Offset/L1FastJet and L1FastJet, resp.)

Definition at line 114 of file JetCorrFactorsProducer.h.

Referenced by JetCorrFactorsProducer().

bool pat::JetCorrFactorsProducer::useRho_
private

Definition at line 115 of file JetCorrFactorsProducer.h.

Referenced by JetCorrFactorsProducer().