CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch13/src/DQMOffline/Trigger/src/EgHLTOfflineClient.cc

Go to the documentation of this file.
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->(); //only one chance to get this, if we every have another shot, remember to check isSetup is okay
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 //dummy analysis function
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; //we dont have the DQMStore so we cant do anything
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   }//end loop over varNames 
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   }//end loop over varNames 
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       //edm::LogInfo("EgHLTOfflineClient") <<" couldnt get hist "<<allName;
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       //edm::LogInfo("EgHLTOfflineClient") <<" couldnt get hist "<<passName;
00196       continue;
00197     }
00198     
00199     makeEffMonElemFromPassAndAll(filterName+"_trigTagProbeEff_"+objName+"_vs_"+vsVarNames[varNr]+"_"+region,pass,all);
00200   }//end loop over vsVarNames
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; //format incorrect
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         //edm::LogInfo("EgHLTOfflineClient") <<" couldnt get hist "<<dirName_+"/"+tightTrig+"_"+looseTrig+"_"+objName+"_failTrig_"+vsVarNames[varNr]+"_"+region;
00217 
00218         continue;
00219       }
00220 
00221       MonitorElement* pass = dbe_->get(dirName_+"/"+tightTrig+"_"+looseTrig+"_"+objName+"_passTrig_"+vsVarNames[varNr]+"_"+region); 
00222       if(pass==NULL){
00223 
00224         //edm::LogInfo("EgHLTOfflineClient") <<" couldnt get hist "<<dirName_+"/"+tightTrig+"_"+looseTrig+"_"+objName+"_passTrig_"+vsVarNames[varNr]+"_"+region;
00225         continue;
00226       } 
00227       const std::string newHistName(tightTrig+"_trigEffTo_"+looseTrig+"_"+objName+"_vs_"+vsVarNames[varNr]+"_"+region);
00228       makeEffMonElemFromPassAndFail(newHistName,pass,fail);
00229     }//end loop over trigger pairs
00230   } //end loop over vsVarNames
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{ //I was having problems with collating the histograms, hence why I'm just reseting the histogram value
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{ //I was having problems with collating the histograms, hence why I'm just reseting the histogram value
00266     *eff->getTH1F()=*effHist; 
00267     delete effHist;
00268   }
00269   return eff;
00270 }