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
00201
00202 cfg.exists("min") ? min_= cfg.getParameter<int>("min") : min_= -1;
00203 cfg.exists("max") ? max_= cfg.getParameter<int>("max") : max_= -1;
00204
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
00211 if(cfg.exists("jetCorrector")){ jetCorrector_= cfg.getParameter<std::string>("jetCorrector"); }
00212
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
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
00231 edm::Handle<edm::View<Object> > src;
00232 if( !event.getByLabel(src_, src) ) return false;
00233
00234
00235 edm::Handle<edm::ValueMap<float> > electronId;
00236 if(!electronId_.label().empty()) {
00237 if( !event.getByLabel(electronId_, electronId) ) return false;
00238 }
00239
00240
00241 int n=0;
00242 for(typename edm::View<Object>::const_iterator obj=src->begin(); obj!=src->end(); ++obj){
00243
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
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
00264 edm::Handle<edm::View<Object> > src;
00265 if( !event.getByLabel(src_, src) ) return false;
00266
00267
00268
00269
00270
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
00279 edm::Handle<reco::JetIDValueMap> jetID;
00280 if(jetIDSelect_){
00281 if( !event.getByLabel(jetIDLabel_, jetID) ) return false;
00282 }
00283
00284
00285 const JetCorrector* corrector=0;
00286 if(!jetCorrector_.empty()){
00287
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
00307 int n=0;
00308 for(typename edm::View<Object>::const_iterator obj=src->begin(); obj!=src->end(); ++obj){
00309
00310
00311 unsigned int idx = obj-src->begin();
00312 if( btagLabel_.label().empty() ? true : (*btagger)[bjets->refAt(idx)]>btagWorkingPoint_ ){
00313 bool passedJetID=true;
00314
00315 if( jetIDSelect_ && dynamic_cast<const reco::CaloJet*>(src->refAt(idx).get())){
00316 passedJetID=(*jetIDSelect_)((*jetID)[src->refAt(idx)]);
00317 }
00318 if(passedJetID){
00319
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