00001 #ifndef TOPDILEPTONOFFLINEDQM
00002 #define TOPDILEPTONOFFLINEDQM
00003
00004 #include <string>
00005 #include <vector>
00006
00007 #include "FWCore/Framework/interface/Event.h"
00008 #include "DQMServices/Core/interface/DQMStore.h"
00009 #include "DQMServices/Core/interface/MonitorElement.h"
00010
00011 #include "DataFormats/Math/interface/deltaR.h"
00012 #include "DataFormats/JetReco/interface/Jet.h"
00013 #include "HLTriggerOffline/Top/interface/TopHLTDQMHelper.h"
00014 #include "DataFormats/MuonReco/interface/Muon.h"
00015 #include "DataFormats/Common/interface/ValueMap.h"
00016 #include "DataFormats/METReco/interface/CaloMET.h"
00017 #include "JetMETCorrections/Objects/interface/JetCorrector.h"
00018 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
00019
00020
00038 namespace TopDiLeptonOffline {
00039
00040 class MonitorEnsemble {
00041 public:
00043 enum Level{ STANDARD, VERBOSE, DEBUG };
00046 typedef reco::LeafCandidate::LorentzVector LorentzVector;
00048 enum DecayChannel{ NONE, DIMUON, DIELEC, ELECMU };
00049
00050 public:
00052 MonitorEnsemble(const char* label, const edm::ParameterSet& cfg);
00054 ~MonitorEnsemble(){};
00055
00057 void book(std::string directory);
00059 void fill(const edm::Event& event, const edm::EventSetup& setup);
00060
00061 private:
00064 std::string monitorPath(const std::string& label) const { return label.substr(label.find(':')+1); };
00067 std::string selectionPath(const std::string& label) const { return label.substr(0, label.find(':')); };
00069 DecayChannel decayChannel(const std::vector<const reco::Muon*>& muons, const std::vector<const reco::GsfElectron*>& elecs) const;
00070
00072 void loggerBinLabels(std::string hist);
00074 void triggerBinLabels(std::string channel, const std::vector<std::string> labels);
00076 void fill(const edm::Event& event, const edm::TriggerResults& triggerTable, std::string channel, const std::vector<std::string> labels) const;
00077
00079 bool booked(const std::string histName) const { return hists_.find(histName.c_str())!=hists_.end(); };
00081 void fill(const std::string histName, double value) const { if(booked(histName.c_str())) hists_.find(histName.c_str())->second->Fill(value); };
00083 void fill(const std::string histName, double xValue, double yValue) const { if(booked(histName.c_str())) hists_.find(histName.c_str())->second->Fill(xValue, yValue); };
00085 void fill(const std::string histName, double xValue, double yValue, double zValue) const { if(booked(histName.c_str())) hists_.find(histName.c_str())->second->Fill(xValue, yValue, zValue); };
00086
00087 private:
00089 Level verbosity_;
00091 std::string label_;
00093 edm::InputTag elecs_, muons_, jets_;
00095 std::vector<edm::InputTag> mets_;
00096
00098 edm::InputTag triggerTable_;
00101 std::vector<std::string> elecMuPaths_;
00103 std::vector<std::string> diMuonPaths_;
00104
00106 edm::InputTag electronId_;
00117 int eidPattern_;
00119 StringCutObjectSelector<reco::GsfElectron>* elecIso_;
00121 StringCutObjectSelector<reco::GsfElectron>* elecSelect_;
00122
00124 StringCutObjectSelector<reco::Muon>* muonIso_;
00126 StringCutObjectSelector<reco::Muon>* muonSelect_;
00127
00129 std::string jetCorrector_;
00131 edm::InputTag jetIDLabel_;
00133 StringCutObjectSelector<reco::JetID>* jetIDSelect_;
00136 std::string jetSelect_;
00138 double lowerEdge_, upperEdge_;
00139
00141 int elecMuLogged_, diMuonLogged_, diElecLogged_;
00143 DQMStore* store_;
00145 std::map<std::string,MonitorElement*> hists_;
00146 };
00147
00148 inline void
00149 MonitorEnsemble::loggerBinLabels(std::string hist)
00150 {
00151
00152 hists_[hist.c_str()]->getTH1()->SetOption("TEXT");
00153 hists_[hist.c_str()]->setBinLabel( 1 , "Run" , 1);
00154 hists_[hist.c_str()]->setBinLabel( 2 , "Block" , 1);
00155 hists_[hist.c_str()]->setBinLabel( 3 , "Event" , 1);
00156 hists_[hist.c_str()]->setBinLabel( 6 , "pt_{L2L3}(jet1)" , 1);
00157 hists_[hist.c_str()]->setBinLabel( 7 , "pt_{L2L3}(jet2)" , 1);
00158 hists_[hist.c_str()]->setBinLabel( 8 , "MET_{Calo}" , 1);
00159 hists_[hist.c_str()]->setAxisTitle("logged evts" , 2);
00160
00161 if(hist=="diMuonLogger_"){
00162 hists_[hist.c_str()]->setBinLabel( 4 , "pt(muon)" , 1);
00163 hists_[hist.c_str()]->setBinLabel( 5 , "pt(muon)" , 1);
00164 }
00165 if(hist=="diElecLogger_"){
00166 hists_[hist.c_str()]->setBinLabel( 4 , "pt(elec)" , 1);
00167 hists_[hist.c_str()]->setBinLabel( 5 , "pt(elec)" , 1);
00168 }
00169 if(hist=="elecMuLogger_"){
00170 hists_[hist.c_str()]->setBinLabel( 4 , "pt(elec)" , 1);
00171 hists_[hist.c_str()]->setBinLabel( 5 , "pt(muon)" , 1);
00172 }
00173 }
00174
00175 inline void
00176 MonitorEnsemble::triggerBinLabels(std::string channel, const std::vector<std::string> labels)
00177 {
00178 for(unsigned int idx=0; idx<labels.size(); ++idx){
00179 hists_[(channel+"Mon_").c_str()]->setBinLabel( idx+1, "["+monitorPath(labels[idx])+"]", 1);
00180 hists_[(channel+"Eff_").c_str()]->setBinLabel( idx+1, "["+selectionPath(labels[idx])+"]|["+monitorPath(labels[idx])+"]", 1);
00181 }
00182 }
00183
00184 inline void
00185 MonitorEnsemble::fill(const edm::Event& event, const edm::TriggerResults& triggerTable, std::string channel, const std::vector<std::string> labels) const
00186 {
00187 for(unsigned int idx=0; idx<labels.size(); ++idx){
00188 if( acceptHLT(event, triggerTable, monitorPath(labels[idx])) ){
00189 fill((channel+"Mon_").c_str(), idx+0.5 );
00190
00191 int evts = hists_.find((channel+"Mon_").c_str())->second->getBinContent(idx+1);
00192 double value = hists_.find((channel+"Eff_").c_str())->second->getBinContent(idx+1);
00193 fill((channel+"Eff_").c_str(), idx+0.5, 1./evts*(acceptHLT(event, triggerTable, selectionPath(labels[idx]))-value));
00194 }
00195 }
00196 }
00197
00198 inline MonitorEnsemble::DecayChannel
00199 MonitorEnsemble::decayChannel(const std::vector<const reco::Muon*>& muons, const std::vector<const reco::GsfElectron*>& elecs) const
00200 {
00201 DecayChannel type=NONE;
00202 if( muons.size()>1 ){ type=DIMUON; } else if( elecs.size()>1 ){ type=DIELEC; } else if( !elecs.empty() && !muons.empty() ){ type=ELECMU; }
00203 return type;
00204 }
00205
00206 }
00207
00208 #include <utility>
00209
00210 #include "FWCore/Framework/interface/EDAnalyzer.h"
00211 #include "FWCore/Framework/interface/Frameworkfwd.h"
00212 #include "FWCore/ServiceRegistry/interface/Service.h"
00213 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00214
00215 #include "FWCore/Common/interface/TriggerNames.h"
00216 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00217 #include "DataFormats/VertexReco/interface/Vertex.h"
00218 #include "DataFormats/Common/interface/TriggerResults.h"
00219
00245
00246
00247
00248 class TopHLTDiLeptonOfflineDQM : public edm::EDAnalyzer {
00249 public:
00251 TopHLTDiLeptonOfflineDQM(const edm::ParameterSet& cfg);
00253 ~TopHLTDiLeptonOfflineDQM(){
00254 if( beamspotSelect_ ) delete beamspotSelect_;
00255 if( vertexSelect_ ) delete vertexSelect_;
00256 }
00257
00259 virtual void analyze(const edm::Event& event, const edm::EventSetup& setup);
00260
00261 private:
00264 std::string objectType(const std::string& label) { return label.substr(0, label.find(':')); };
00267 std::string selectionStep(const std::string& label) { return label.substr(label.find(':')+1); };
00268
00269 private:
00271 edm::InputTag triggerTable_;
00273 std::vector<std::string> triggerPaths_;
00275 edm::InputTag vertex_;
00277 StringCutObjectSelector<reco::Vertex>* vertexSelect_;
00279 edm::InputTag beamspot_;
00281 StringCutObjectSelector<reco::BeamSpot>* beamspotSelect_;
00282
00285 std::vector<std::string> selectionOrder_;
00291 std::map<std::string, std::pair<edm::ParameterSet, TopDiLeptonOffline::MonitorEnsemble*> > selection_;
00292 };
00293
00294 #endif