CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/JetMETCorrections/Modules/interface/JetCorrectionProducer.h

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     // cache
00042     std::vector <const JetCorrector*> mCorrectors;
00043     unsigned long long mCacheId;
00044     bool mVerbose;
00045   };
00046 }
00047 
00048 // ---------- implementation ----------
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     // look for correctors
00072     const JetCorrectionsRecord& record = fSetup.get <JetCorrectionsRecord> ();
00073     if (record.cacheIdentifier() != mCacheId) 
00074       { // need to renew cache
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;                         //Define Inputs
00084     fEvent.getByLabel (mInput, jets);                        //Get Inputs
00085     std::auto_ptr<JetCollection> result (new JetCollection); //Corrected jets
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; //copy original 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               // Scalar correction
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); // apply scalar correction
00106               referenceJet = &correctedJet;
00107             } else {
00108               // Vectorial correction
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 ); // apply vectorial correction
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     // reorder corrected jets
00126     std::sort (result->begin (), result->end (), compJets);
00127     // put corrected jet collection into event
00128     fEvent.put(result);
00129   }
00130   
00131 }
00132 
00133 #endif