Go to the documentation of this file.00001 #ifndef JetCorrectionProducer_h
00002 #define JetCorrectionProducer_h
00003
00004 #include <sstream>
00005 #include <string>
00006 #include <vector>
00007
00008 #include "CommonTools/Utils/interface/PtComparator.h"
00009 #include "DataFormats/Common/interface/Handle.h"
00010 #include "DataFormats/Common/interface/Ref.h"
00011 #include "DataFormats/Common/interface/RefToBase.h"
00012 #include "FWCore/Framework/interface/EDProducer.h"
00013 #include "FWCore/Framework/interface/ESHandle.h"
00014 #include "FWCore/Framework/interface/Event.h"
00015 #include "FWCore/Framework/interface/EventSetup.h"
00016 #include "FWCore/Utilities/interface/InputTag.h"
00017 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00018 #include "JetMETCorrections/Objects/interface/JetCorrectionsRecord.h"
00019 #include "JetMETCorrections/Objects/interface/JetCorrector.h"
00020
00021 namespace edm
00022 {
00023 class ParameterSet;
00024 }
00025
00026 class JetCorrector;
00027
00028 namespace cms
00029 {
00030 template<class T>
00031 class JetCorrectionProducer : public edm::EDProducer
00032 {
00033 public:
00034 typedef std::vector<T> JetCollection;
00035 explicit JetCorrectionProducer (const edm::ParameterSet& fParameters);
00036 virtual ~JetCorrectionProducer () {}
00037 virtual void produce(edm::Event&, const edm::EventSetup&);
00038 private:
00039 edm::InputTag mInput;
00040 std::vector <std::string> mCorrectorNames;
00041
00042 std::vector <const JetCorrector*> mCorrectors;
00043 unsigned long long mCacheId;
00044 bool mVerbose;
00045 };
00046 }
00047
00048
00049
00050 namespace cms {
00051
00052 template<class T>
00053 JetCorrectionProducer<T>::JetCorrectionProducer(const edm::ParameterSet& fConfig)
00054 : mInput(fConfig.getParameter <edm::InputTag> ("src"))
00055 , mCorrectorNames(fConfig.getParameter<std::vector<std::string> >("correctors"))
00056 , mCorrectors(mCorrectorNames.size(), 0)
00057 , mCacheId (0)
00058 , mVerbose (fConfig.getUntrackedParameter <bool> ("verbose", false))
00059 {
00060 std::string alias = fConfig.getUntrackedParameter <std::string> ("alias", "");
00061 if (alias.empty ())
00062 produces <JetCollection>();
00063 else
00064 produces <JetCollection>().setBranchAlias(alias);
00065 }
00066
00067 template<class T>
00068 void JetCorrectionProducer<T>::produce(edm::Event& fEvent,
00069 const edm::EventSetup& fSetup)
00070 {
00071
00072 const JetCorrectionsRecord& record = fSetup.get <JetCorrectionsRecord> ();
00073 if (record.cacheIdentifier() != mCacheId)
00074 {
00075 for (unsigned i = 0; i < mCorrectorNames.size(); i++)
00076 {
00077 edm::ESHandle <JetCorrector> handle;
00078 record.get (mCorrectorNames [i], handle);
00079 mCorrectors [i] = &*handle;
00080 }
00081 mCacheId = record.cacheIdentifier();
00082 }
00083 edm::Handle<JetCollection> jets;
00084 fEvent.getByLabel (mInput, jets);
00085 std::auto_ptr<JetCollection> result (new JetCollection);
00086 typename JetCollection::const_iterator jet;
00087 for (jet = jets->begin(); jet != jets->end(); jet++)
00088 {
00089 const T* referenceJet = &*jet;
00090 int index = jet-jets->begin();
00091 edm::RefToBase<reco::Jet> jetRef(edm::Ref<JetCollection>(jets,index));
00092 T correctedJet = *jet;
00093 if (mVerbose)
00094 std::cout<<"JetCorrectionProducer::produce-> original jet: "
00095 <<jet->print()<<std::endl;
00096 for (unsigned i = 0; i < mCorrectors.size(); ++i)
00097 {
00098 if ( !(mCorrectors[i]->vectorialCorrection()) ) {
00099
00100 double scale = mCorrectors[i]->correction (*referenceJet,jetRef,
00101 fEvent,fSetup);
00102 if (mVerbose)
00103 std::cout<<"JetCorrectionProducer::produce-> Corrector # "
00104 <<i<<", correction factor: "<<scale<<std::endl;
00105 correctedJet.scaleEnergy (scale);
00106 referenceJet = &correctedJet;
00107 } else {
00108
00109 JetCorrector::LorentzVector corrected;
00110 double scale = mCorrectors[i]->correction (*referenceJet, jetRef,
00111 fEvent, fSetup, corrected);
00112 if (mVerbose)
00113 std::cout<<"JetCorrectionProducer::produce-> Corrector # "
00114 <<i<<", correction factor: "<<scale<<std::endl;
00115 correctedJet.setP4( corrected );
00116 referenceJet = &correctedJet;
00117 }
00118 }
00119 if (mVerbose)
00120 std::cout<<"JetCorrectionProducer::produce-> corrected jet: "
00121 <<correctedJet.print ()<<std::endl;
00122 result->push_back (correctedJet);
00123 }
00124 NumericSafeGreaterByPt<T> compJets;
00125
00126 std::sort (result->begin (), result->end (), compJets);
00127
00128 fEvent.put(result);
00129 }
00130
00131 }
00132
00133 #endif