00001 #include "DQMOffline/Trigger/interface/EgHLTOfflineClient.h"
00002
00003
00004 #include "FWCore/Framework/interface/Run.h"
00005 #include "FWCore/Framework/interface/Event.h"
00006 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00007 #include "FWCore/ServiceRegistry/interface/Service.h"
00008
00009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00010
00011 #include "DQMServices/Core/interface/DQMStore.h"
00012 #include "DQMServices/Core/interface/MonitorElement.h"
00013
00014 #include "DQMOffline/Trigger/interface/EgHLTTrigTools.h"
00015
00016 #include "HLTrigger/HLTcore/interface/HLTConfigProvider.h"
00017
00018 #include <boost/algorithm/string.hpp>
00019
00020 EgHLTOfflineClient::EgHLTOfflineClient(const edm::ParameterSet& iConfig):dbe_(NULL),isSetup_(false)
00021 {
00022 dbe_ = edm::Service<DQMStore>().operator->();
00023 if (!dbe_) {
00024 edm::LogError("EgHLTOfflineClient") << "unable to get DQMStore service, upshot is no client histograms will be made";
00025 }
00026 if(iConfig.getUntrackedParameter<bool>("DQMStore", false)) {
00027 if(dbe_) dbe_->setVerbose(0);
00028 }
00029
00030
00031 eleHLTFilterNames_ = iConfig.getParameter<std::vector<std::string> >("eleHLTFilterNames");
00032 eleTightLooseTrigNames_ = iConfig.getParameter<std::vector<std::string> >("eleTightLooseTrigNames");
00033 phoHLTFilterNames_ = iConfig.getParameter<std::vector<std::string> >("phoHLTFilterNames");
00034 phoTightLooseTrigNames_ = iConfig.getParameter<std::vector<std::string> >("phoTightLooseTrigNames");
00035
00036 eleN1EffVars_=iConfig.getParameter<std::vector<std::string> >("eleN1EffVars");
00037 eleSingleEffVars_ = iConfig.getParameter<std::vector<std::string> >("eleSingleEffVars");
00038 eleEffTags_ = iConfig.getParameter<std::vector<std::string> >("eleEffTags");
00039 eleTrigTPEffVsVars_ = iConfig.getParameter<std::vector<std::string> >("eleTrigTPEffVsVars");
00040 eleLooseTightTrigEffVsVars_ = iConfig.getParameter<std::vector<std::string> >("eleLooseTightTrigEffVsVars");
00041
00042 phoN1EffVars_=iConfig.getParameter<std::vector<std::string> >("phoN1EffVars");
00043 phoSingleEffVars_ = iConfig.getParameter<std::vector<std::string> >("phoSingleEffVars");
00044 phoEffTags_ = iConfig.getParameter<std::vector<std::string> >("phoEffTags");
00045 phoTrigTPEffVsVars_ = iConfig.getParameter<std::vector<std::string> >("phoTrigTPEffVsVars");
00046 phoLooseTightTrigEffVsVars_ = iConfig.getParameter<std::vector<std::string> >("phoLooseTightTrigEffVsVars");
00047
00048 runClientEndLumiBlock_ = iConfig.getParameter<bool>("runClientEndLumiBlock");
00049 runClientEndRun_ = iConfig.getParameter<bool>("runClientEndRun");
00050 runClientEndJob_ = iConfig.getParameter<bool>("runClientEndJob");
00051
00052
00053
00054 dirName_=iConfig.getParameter<std::string>("DQMDirName");
00055 if(dbe_) dbe_->setCurrentFolder(dirName_);
00056
00057
00058 filterInactiveTriggers_ =iConfig.getParameter<bool>("filterInactiveTriggers");
00059 hltTag_ = iConfig.getParameter<std::string>("hltTag");
00060
00061
00062 }
00063
00064
00065 EgHLTOfflineClient::~EgHLTOfflineClient()
00066 {
00067
00068 }
00069
00070 void EgHLTOfflineClient::beginJob()
00071 {
00072
00073
00074 }
00075
00076 void EgHLTOfflineClient::endJob()
00077 {
00078 if(runClientEndJob_) runClient_();
00079 }
00080
00081 void EgHLTOfflineClient::beginRun(const edm::Run& run, const edm::EventSetup& c)
00082 {
00083 if(isSetup_){
00084 if(filterInactiveTriggers_){
00085 HLTConfigProvider hltConfig;
00086 bool changed=false;
00087 hltConfig.init(run,c,hltTag_,changed);
00088 std::vector<std::string> activeFilters;
00089 egHLT::trigTools::getActiveFilters(hltConfig,activeFilters);
00090
00091 egHLT::trigTools::filterInactiveTriggers(eleHLTFilterNames_,activeFilters);
00092 egHLT::trigTools::filterInactiveTriggers(phoHLTFilterNames_,activeFilters);
00093 egHLT::trigTools::filterInactiveTightLooseTriggers(eleTightLooseTrigNames_,activeFilters);
00094 egHLT::trigTools::filterInactiveTightLooseTriggers(phoTightLooseTrigNames_,activeFilters);
00095
00096 }
00097 isSetup_=true;
00098 }
00099 }
00100
00101
00102 void EgHLTOfflineClient::endRun(const edm::Run& run, const edm::EventSetup& c)
00103 {
00104 if(runClientEndRun_) runClient_();
00105 }
00106
00107
00108 void EgHLTOfflineClient::analyze(const edm::Event& iEvent,const edm::EventSetup& iSetup)
00109 {
00110
00111 }
00112
00113 void EgHLTOfflineClient::endLuminosityBlock(const edm::LuminosityBlock& lumiSeg,const edm::EventSetup& c)
00114 {
00115 if(runClientEndLumiBlock_) runClient_();
00116 }
00117
00118 void EgHLTOfflineClient::runClient_()
00119 {
00120 if(!dbe_) return;
00121 dbe_->setCurrentFolder(dirName_);
00122
00123
00124 std::vector<std::string> regions;
00125 regions.push_back("eb");
00126 regions.push_back("ee");
00127
00128
00129 for(size_t filterNr=0;filterNr<eleHLTFilterNames_.size();filterNr++){
00130 for(size_t regionNr=0;regionNr<regions.size();regionNr++){
00131 for(size_t effNr=0;effNr<eleEffTags_.size();effNr++){
00132 createN1EffHists(eleHLTFilterNames_[filterNr]+"_gsfEle_"+eleEffTags_[effNr],regions[regionNr],eleN1EffVars_);
00133 createSingleEffHists(eleHLTFilterNames_[filterNr]+"_gsfEle_"+eleEffTags_[effNr],regions[regionNr],eleSingleEffVars_);
00134 createTrigTagProbeEffHists(eleHLTFilterNames_[filterNr],regions[regionNr],eleTrigTPEffVsVars_,"gsfEle");
00135 }
00136 }
00137 }
00138
00139
00140 for(size_t filterNr=0;filterNr<phoHLTFilterNames_.size();filterNr++){
00141 for(size_t regionNr=0;regionNr<regions.size();regionNr++){
00142 for(size_t effNr=0;effNr<phoEffTags_.size();effNr++){
00143 createN1EffHists(eleHLTFilterNames_[filterNr]+"_pho_"+phoEffTags_[effNr],regions[regionNr],phoN1EffVars_);
00144 createSingleEffHists(eleHLTFilterNames_[filterNr]+"_gsfEle_"+phoEffTags_[effNr],regions[regionNr],phoSingleEffVars_);
00145 }
00146 }
00147 }
00148
00149 for(size_t regionNr=0;regionNr<regions.size();regionNr++){
00150 createLooseTightTrigEff(eleTightLooseTrigNames_,regions[regionNr],eleLooseTightTrigEffVsVars_,"gsfEle");
00151 createLooseTightTrigEff(eleTightLooseTrigNames_,regions[regionNr],eleLooseTightTrigEffVsVars_,"gsfEle_trigCuts");
00152 createLooseTightTrigEff(phoTightLooseTrigNames_,regions[regionNr],phoLooseTightTrigEffVsVars_,"pho");
00153 createLooseTightTrigEff(phoTightLooseTrigNames_,regions[regionNr],phoLooseTightTrigEffVsVars_,"pho_trigCuts");
00154 }
00155 }
00156
00157 void EgHLTOfflineClient::createN1EffHists(const std::string& baseName,const std::string& region,const std::vector<std::string>& varNames)
00158 {
00159 MonitorElement* numer = dbe_->get(dirName_+"/"+baseName+"_allCuts_"+region);
00160
00161 for(size_t varNr=0;varNr<varNames.size();varNr++){
00162 MonitorElement* denom = dbe_->get(dirName_+"/"+baseName+"_n1_"+varNames[varNr]+"_"+region);
00163 if(numer!=NULL && denom!=NULL){
00164 std::string effHistName(baseName+"_n1Eff_"+varNames[varNr]+"_"+region);
00165 makeEffMonElemFromPassAndAll(effHistName,numer,denom);
00166 }
00167 }
00168 }
00169
00170 void EgHLTOfflineClient::createSingleEffHists(const std::string& baseName,const std::string& region,const std::vector<std::string>& varNames)
00171 {
00172 MonitorElement* denom = dbe_->get(dirName_+"/"+baseName+"_noCuts_"+region);
00173
00174 for(size_t varNr=0;varNr<varNames.size();varNr++){
00175 MonitorElement* numer = dbe_->get(dirName_+"/"+baseName+"_single_"+varNames[varNr]+"_"+region);
00176 if(numer!=NULL && denom!=NULL){
00177 std::string effHistName(baseName+"_singleEff_"+varNames[varNr]+"_"+region);
00178 makeEffMonElemFromPassAndAll(effHistName,numer,denom);
00179 }
00180 }
00181 }
00182
00183 void EgHLTOfflineClient::createTrigTagProbeEffHists(const std::string& filterName,const std::string& region,const std::vector<std::string>& vsVarNames,const std::string& objName)
00184 {
00185 for(size_t varNr=0;varNr<vsVarNames.size();varNr++){
00186 std::string allName(dirName_+"/"+filterName+"_trigTagProbe_"+objName+"_all_"+vsVarNames[varNr]+"_"+region);
00187 MonitorElement* all = dbe_->get(allName);
00188 if(all==NULL){
00189
00190 continue;
00191 }
00192 std::string passName(dirName_+"/"+filterName+"_trigTagProbe_"+objName+"_pass_"+vsVarNames[varNr]+"_"+region);
00193 MonitorElement* pass = dbe_->get(passName);
00194 if(pass==NULL){
00195
00196 continue;
00197 }
00198
00199 makeEffMonElemFromPassAndAll(filterName+"_trigTagProbeEff_"+objName+"_vs_"+vsVarNames[varNr]+"_"+region,pass,all);
00200 }
00201 }
00202
00203
00204
00205 void EgHLTOfflineClient::createLooseTightTrigEff(const std::vector<std::string>& tightLooseTrigNames,const std::string& region,const std::vector<std::string>& vsVarNames,const std::string& objName)
00206 {
00207 for(size_t varNr=0;varNr<vsVarNames.size();varNr++){
00208 for(size_t trigNr=0;trigNr<tightLooseTrigNames.size();trigNr++){
00209 std::vector<std::string> splitString;
00210 boost::split(splitString,tightLooseTrigNames[trigNr],boost::is_any_of(std::string(":")));
00211 if(splitString.size()!=2) continue;
00212 const std::string& tightTrig = splitString[0];
00213 const std::string& looseTrig = splitString[1];
00214 MonitorElement* fail = dbe_->get(dirName_+"/"+tightTrig+"_"+looseTrig+"_"+objName+"_failTrig_"+vsVarNames[varNr]+"_"+region);
00215 if(fail==NULL){
00216
00217
00218 continue;
00219 }
00220
00221 MonitorElement* pass = dbe_->get(dirName_+"/"+tightTrig+"_"+looseTrig+"_"+objName+"_passTrig_"+vsVarNames[varNr]+"_"+region);
00222 if(pass==NULL){
00223
00224
00225 continue;
00226 }
00227 const std::string newHistName(tightTrig+"_trigEffTo_"+looseTrig+"_"+objName+"_vs_"+vsVarNames[varNr]+"_"+region);
00228 makeEffMonElemFromPassAndFail(newHistName,pass,fail);
00229 }
00230 }
00231
00232 }
00233
00234 MonitorElement* EgHLTOfflineClient::makeEffMonElemFromPassAndAll(const std::string& name,const MonitorElement* pass,const MonitorElement* all)
00235 {
00236 TH1F* passHist = pass->getTH1F();
00237 if(passHist->GetSumw2N()==0) passHist->Sumw2();
00238 TH1F* allHist = all->getTH1F();
00239 if(allHist->GetSumw2N()==0) allHist->Sumw2();
00240 TH1F* effHist = (TH1F*) passHist->Clone(name.c_str());
00241 effHist->Divide(passHist,allHist,1,1,"B");
00242
00243 MonitorElement* eff = dbe_->get(dirName_+"/"+name);
00244 if(eff==NULL) eff= dbe_->book1D(name,effHist);
00245 else{
00246 *eff->getTH1F()=*effHist;
00247 delete effHist;
00248 }
00249 return eff;
00250 }
00251
00252 MonitorElement* EgHLTOfflineClient::makeEffMonElemFromPassAndFail(const std::string& name,const MonitorElement* pass,const MonitorElement* fail)
00253 {
00254 TH1F* failHist = fail->getTH1F();
00255 if(failHist->GetSumw2N()==0) failHist->Sumw2();
00256 TH1F* passHist = pass->getTH1F();
00257 if(passHist->GetSumw2N()==0) passHist->Sumw2();
00258
00259 TH1F* effHist = (TH1F*) passHist->Clone(name.c_str());
00260 effHist->Add(failHist);
00261 effHist->Divide(passHist,effHist,1,1,"B");
00262
00263 MonitorElement* eff = dbe_->get(dirName_+"/"+name);
00264 if(eff==NULL) eff = dbe_->book1D(name,effHist);
00265 else{
00266 *eff->getTH1F()=*effHist;
00267 delete effHist;
00268 }
00269 return eff;
00270 }