CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CorrectedJetProducer.h
Go to the documentation of this file.
1 #ifndef CorrectedJetProducer_h
2 #define CorrectedJetProducer_h
3 
4 #include <sstream>
5 #include <string>
6 #include <vector>
7 
19 
20 namespace edm
21 {
22  class ParameterSet;
23 }
24 
25 namespace reco
26 {
27  template<class T>
29  {
30  public:
31  typedef std::vector<T> JetCollection;
32  explicit CorrectedJetProducer (const edm::ParameterSet& fParameters);
33  virtual ~CorrectedJetProducer () {}
34  virtual void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
35  private:
37  const std::vector <edm::EDGetTokenT<reco::JetCorrector> > mCorrectorTokens;
38  const bool mVerbose;
39  };
40 }
41 
42 // ---------- implementation ----------
43 
44 namespace reco {
45 
46  template<class T>
48  : mInput(consumes<JetCollection>(fConfig.getParameter <edm::InputTag> ("src")))
49  , mCorrectorTokens(edm::vector_transform(fConfig.getParameter<std::vector<edm::InputTag> >("correctors"), [this](edm::InputTag const & tag){return consumes<reco::JetCorrector>(tag);}))
50  , mVerbose (fConfig.getUntrackedParameter <bool> ("verbose", false))
51  {
52  std::string alias = fConfig.getUntrackedParameter <std::string> ("alias", "");
53  if (alias.empty ())
54  produces <JetCollection>();
55  else
56  produces <JetCollection>().setBranchAlias(alias);
57  }
58 
59  template<class T>
61  {
62  // FIXME - use something more efficient instead of an std::vector
63  std::vector<reco::JetCorrector const *> correctors(mCorrectorTokens.size(), nullptr);
64 
65  // look for correctors
66  for (unsigned i = 0; i < mCorrectorTokens.size(); i++)
67  {
69  fEvent.getByToken (mCorrectorTokens [i], handle);
70  correctors[i] = handle.product();
71  }
72  edm::Handle<JetCollection> jets; //Define Inputs
73  fEvent.getByToken (mInput, jets); //Get Inputs
74  std::auto_ptr<JetCollection> result (new JetCollection); //Corrected jets
75  typename JetCollection::const_iterator jet;
76  for (jet = jets->begin(); jet != jets->end(); jet++)
77  {
78  const T* referenceJet = &*jet;
79  int index = jet-jets->begin();
81  T correctedJet = *jet; //copy original jet
82  if (mVerbose)
83  std::cout<<"CorrectedJetProducer::produce-> original jet: "
84  <<jet->print()<<std::endl;
85  for (unsigned i = 0; i < mCorrectorTokens.size(); ++i)
86  {
87  if ( !(correctors[i]->vectorialCorrection()) ) {
88  // Scalar correction
89  double scale = 1.;
90  if (!(correctors[i]->refRequired()))
91  scale = correctors[i]->correction (*referenceJet);
92  else
93  scale = correctors[i]->correction (*referenceJet,jetRef);
94  if (mVerbose)
95  std::cout<<"CorrectedJetProducer::produce-> Corrector # "
96  <<i<<", correction factor: "<<scale<<std::endl;
97  correctedJet.scaleEnergy (scale); // apply scalar correction
98  referenceJet = &correctedJet;
99  } else {
100  // Vectorial correction
102  double scale = correctors[i]->correction (*referenceJet, jetRef, corrected);
103  if (mVerbose)
104  std::cout<<"CorrectedJetProducer::produce-> Corrector # "
105  <<i<<", correction factor: "<<scale<<std::endl;
106  correctedJet.setP4( corrected ); // apply vectorial correction
107  referenceJet = &correctedJet;
108  }
109  }
110  if (mVerbose)
111  std::cout<<"CorrectedJetProducer::produce-> corrected jet: "
112  <<correctedJet.print ()<<std::endl;
113  result->push_back (correctedJet);
114  }
115  NumericSafeGreaterByPt<T> compJets;
116  // reorder corrected jets
117  std::sort (result->begin (), result->end (), compJets);
118  // put corrected jet collection into event
119  fEvent.put(result);
120  }
121 
122 }
123 
124 #endif
int i
Definition: DBlmapReader.cc:9
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:464
virtual void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
Definition: transform.h:11
const edm::EDGetTokenT< JetCollection > mInput
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:120
vector< PseudoJet > jets
tuple result
Definition: query.py:137
tuple handle
Definition: patZpeak.py:22
const std::vector< edm::EDGetTokenT< reco::JetCorrector > > mCorrectorTokens
CorrectedJetProducer(const edm::ParameterSet &fParameters)
T const * product() const
Definition: Handle.h:81
string const
Definition: compareJSON.py:14
reco::Particle::LorentzVector LorentzVector
Definition: JetCorrector.h:43
mVerbose(fConfig.getUntrackedParameter< bool >("verbose", false))
tuple cout
Definition: gather_cfg.py:121
long double T