CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_2_9_HLT1_bphpatch4/src/DQM/Physics/interface/TopDQMHelpers.h

Go to the documentation of this file.
00001 #ifndef TOPDQMHELPERS
00002 #define TOPDQMHELPERS
00003 
00004 #include <string>
00005 #include <vector>
00006 
00007 #include "FWCore/Framework/interface/Event.h"
00008 #include "FWCore/Common/interface/TriggerNames.h"
00009 #include "DataFormats/Common/interface/TriggerResults.h"
00010 
00020 inline bool 
00021 accept(const edm::Event& event, const edm::TriggerResults& triggerTable, const std::string& triggerPath)
00022 {
00023   bool passed=false;
00024   const edm::TriggerNames& triggerNames = event.triggerNames(triggerTable);
00025   for(unsigned int i=0; i<triggerNames.triggerNames().size(); ++i){
00026     if(triggerNames.triggerNames()[i] == triggerPath) {
00027       if(triggerTable.accept(i)){
00028         passed=true;
00029         break;
00030       }
00031     }
00032   }
00033   return passed;
00034 }
00035 
00036 inline bool 
00037 accept(const edm::Event& event, const edm::TriggerResults& triggerTable, const std::vector<std::string>& triggerPaths)
00038 {
00039   bool passed=false;
00040   for(unsigned int j=0; j<triggerPaths.size(); ++j){
00041     if(accept(event, triggerTable, triggerPaths[j])){
00042       passed=true;
00043       break;
00044     }
00045   }
00046   return passed;
00047 }
00048 
00049 
00050 #include "DataFormats/JetReco/interface/Jet.h"
00051 #include "FWCore/Framework/interface/EventSetup.h"
00052 
00064 class Calculate {
00065  public:
00067   Calculate(int maxNJets, double wMass);
00069   ~Calculate(){};
00070      
00072   double massWBoson(const std::vector<reco::Jet>& jets);
00074   double massTopQuark(const std::vector<reco::Jet>& jets); 
00075   
00076  private:
00080   void operator()(const std::vector<reco::Jet>& jets);
00081 
00082  private:
00084   bool failed_;
00086   int maxNJets_;
00088   double wMass_;
00090   double massWBoson_;
00092   double massTopQuark_;
00093 };
00094 
00095 
00096 #include "DataFormats/JetReco/interface/JetID.h"
00097 #include "DataFormats/JetReco/interface/PFJet.h"
00098 #include "DataFormats/JetReco/interface/CaloJet.h"
00099 #include "DataFormats/BTauReco/interface/JetTag.h"
00100 #include "DataFormats/Common/interface/ValueMap.h"
00101 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00102 #include "JetMETCorrections/Objects/interface/JetCorrector.h"
00103 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
00104 #include "CommonTools/Utils/interface/StringCutObjectSelector.h"
00105 #include "JetMETCorrections/Objects/interface/JetCorrectionsRecord.h"
00106 
00147 template <typename Object> 
00148 class SelectionStep {
00149 public:
00151   SelectionStep(const edm::ParameterSet& cfg);
00153   ~SelectionStep(){};
00154 
00156   bool select(const edm::Event& event);
00158   bool select(const edm::Event& event, const edm::EventSetup& setup); 
00159     
00160 private:
00162   edm::InputTag src_;
00164   int min_, max_; 
00166   edm::InputTag electronId_;
00177   int eidPattern_;
00179   std::string jetCorrector_;
00181   edm::InputTag btagLabel_;
00183   double btagWorkingPoint_;
00185   edm::InputTag jetIDLabel_;
00186 
00188   StringCutObjectSelector<Object> select_;
00190   StringCutObjectSelector<reco::JetID>* jetIDSelect_;
00191 };
00192 
00194 template <typename Object> 
00195 SelectionStep<Object>::SelectionStep(const edm::ParameterSet& cfg) :
00196   src_( cfg.getParameter<edm::InputTag>( "src"   )),
00197   select_( cfg.getParameter<std::string>("select")),
00198   jetIDSelect_(0)
00199 {
00200   // construct min/max if the corresponding params
00201   // exist otherwise they are initialized with -1
00202   cfg.exists("min") ? min_= cfg.getParameter<int>("min") : min_= -1;
00203   cfg.exists("max") ? max_= cfg.getParameter<int>("max") : max_= -1;
00204   // read electron extras if they exist
00205   if(cfg.existsAs<edm::ParameterSet>("electronId")){ 
00206     edm::ParameterSet elecId=cfg.getParameter<edm::ParameterSet>("electronId");
00207     electronId_= elecId.getParameter<edm::InputTag>("src");
00208     eidPattern_= elecId.getParameter<int>("pattern");
00209   }
00210   // read jet corrector label if it exists
00211   if(cfg.exists("jetCorrector")){ jetCorrector_= cfg.getParameter<std::string>("jetCorrector"); }
00212   // read btag information if it exists
00213   if(cfg.existsAs<edm::ParameterSet>("jetBTagger")){
00214     edm::ParameterSet jetBTagger=cfg.getParameter<edm::ParameterSet>("jetBTagger");
00215     btagLabel_=jetBTagger.getParameter<edm::InputTag>("label");
00216     btagWorkingPoint_=jetBTagger.getParameter<double>("workingPoint");
00217   }
00218   // read jetID information if it exists
00219   if(cfg.existsAs<edm::ParameterSet>("jetID")){
00220     edm::ParameterSet jetID=cfg.getParameter<edm::ParameterSet>("jetID");
00221     jetIDLabel_ =jetID.getParameter<edm::InputTag>("label");
00222     jetIDSelect_= new StringCutObjectSelector<reco::JetID>(jetID.getParameter<std::string>("select"));
00223   }
00224 }
00225 
00227 template <typename Object> 
00228 bool SelectionStep<Object>::select(const edm::Event& event)
00229 {
00230   // fetch input collection
00231   edm::Handle<edm::View<Object> > src; 
00232   if( !event.getByLabel(src_, src) ) return false;
00233 
00234   // load electronId value map if configured such
00235   edm::Handle<edm::ValueMap<float> > electronId;
00236   if(!electronId_.label().empty()) {
00237     if( !event.getByLabel(electronId_, electronId) ) return false;
00238   }
00239 
00240   // determine multiplicity of selected objects
00241   int n=0;
00242   for(typename edm::View<Object>::const_iterator obj=src->begin(); obj!=src->end(); ++obj){
00243     // special treatment for electrons
00244     if(dynamic_cast<const reco::GsfElectron*>(&*obj)){
00245       unsigned int idx = obj-src->begin();
00246       if( electronId_.label().empty() ? true : ((int)(*electronId)[src->refAt(idx)] & eidPattern_) ){   
00247         if(select_(*obj))++n;
00248       }
00249     }
00250     // normal treatment
00251     else{
00252       if(select_(*obj))++n;
00253     }
00254   }
00255   bool accept=(min_>=0 ? n>=min_:true) && (max_>=0 ? n<=max_:true);
00256   return (min_<0 && max_<0) ? (n>0):accept;
00257 }
00258 
00260 template <typename Object> 
00261 bool SelectionStep<Object>::select(const edm::Event& event, const edm::EventSetup& setup)
00262 {
00263   // fetch input collection
00264   edm::Handle<edm::View<Object> > src; 
00265   if( !event.getByLabel(src_, src) ) return false;
00266 
00267   // load btag collection if configured such
00268   // NOTE that the JetTagCollection needs an
00269   // edm::View to reco::Jets; we have to add
00270   // another Handle bjets for this purpose
00271   edm::Handle<edm::View<reco::Jet> > bjets; 
00272   edm::Handle<reco::JetTagCollection> btagger;
00273   if(!btagLabel_.label().empty()){ 
00274     if( !event.getByLabel(src_, bjets) ) return false;
00275     if( !event.getByLabel(btagLabel_, btagger) ) return false;
00276   }
00277   
00278   // load jetID value map if configured such 
00279   edm::Handle<reco::JetIDValueMap> jetID;
00280   if(jetIDSelect_){
00281     if( !event.getByLabel(jetIDLabel_, jetID) ) return false;
00282   }
00283 
00284   // load jet corrector if configured such
00285   const JetCorrector* corrector=0;
00286   if(!jetCorrector_.empty()){
00287     // check whether a jet correcto is in the event setup or not
00288     if(setup.find( edm::eventsetup::EventSetupRecordKey::makeKey<JetCorrectionsRecord>() )){
00289       corrector = JetCorrector::getJetCorrector(jetCorrector_, setup);
00290     }
00291     else{
00292       edm::LogVerbatim( "TopDQMHelpers" ) 
00293         << "\n"
00294         << "------------------------------------------------------------------------------------- \n"
00295         << " No JetCorrectionsRecord available from EventSetup:                                   \n" 
00296         << "  - Jets will not be corrected.                                                       \n"
00297         << "  - If you want to change this add the following lines to your cfg file               \n"
00298         << "                                                                                      \n"
00299         << "  ## load jet corrections                                                             \n"
00300         << "  process.load(\"JetMETCorrections.Configuration.JetCorrectionServicesAllAlgos_cff\") \n"
00301         << "  process.prefer(\"ak5CaloL2L3\")                                                     \n"
00302         << "                                                                                      \n"
00303         << "------------------------------------------------------------------------------------- \n";
00304     }
00305   }
00306   // determine multiplicity of selected objects
00307   int n=0;
00308   for(typename edm::View<Object>::const_iterator obj=src->begin(); obj!=src->end(); ++obj){
00309     // check for chosen btag discriminator to be above the 
00310     // corresponding working point if configured such 
00311     unsigned int idx = obj-src->begin();
00312     if( btagLabel_.label().empty() ? true : (*btagger)[bjets->refAt(idx)]>btagWorkingPoint_ ){   
00313       bool passedJetID=true;
00314       // check jetID for calo jets
00315       if( jetIDSelect_ && dynamic_cast<const reco::CaloJet*>(src->refAt(idx).get())){
00316         passedJetID=(*jetIDSelect_)((*jetID)[src->refAt(idx)]);
00317       }
00318       if(passedJetID){
00319         // scale jet energy if configured such
00320         Object jet=*obj; jet.scaleEnergy(corrector ? corrector->correction(*obj) : 1.);
00321         if(select_(jet))++n;
00322       }
00323     }
00324   }
00325   bool accept=(min_>=0 ? n>=min_:true) && (max_>=0 ? n<=max_:true);
00326   return (min_<0 && max_<0) ? (n>0):accept;
00327 }
00328 
00329 #endif