00001 #include "DQMOffline/Trigger/interface/EgHLTOfflineSource.h"
00002
00003 #include "DQMOffline/Trigger/interface/EgHLTEleHLTFilterMon.h"
00004 #include "DQMOffline/Trigger/interface/EgHLTPhoHLTFilterMon.h"
00005
00006 #include "DQMOffline/Trigger/interface/EgHLTDebugFuncs.h"
00007 #include "DQMOffline/Trigger/interface/EgHLTDQMCut.h"
00008 #include "DQMOffline/Trigger/interface/EgHLTMonElemFuncs.h"
00009 #include "DQMOffline/Trigger/interface/EgHLTTrigTools.h"
00010
00011 #include "DQMServices/Core/interface/MonitorElement.h"
00012
00013 #include "FWCore/Framework/interface/Run.h"
00014 #include "HLTrigger/HLTcore/interface/HLTConfigProvider.h"
00015
00016 #include <boost/algorithm/string.hpp>
00017
00018
00019 #include "DataFormats/TrackReco/interface/Track.h"
00020 #include "DataFormats/EgammaCandidates/interface/ElectronFwd.h"
00021 #include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
00022 using namespace egHLT;
00023
00024 EgHLTOfflineSource::EgHLTOfflineSource(const edm::ParameterSet& iConfig):
00025 nrEventsProcessed_(0),isSetup_(false)
00026 {
00027 dbe_ = edm::Service<DQMStore>().operator->();
00028 if (!dbe_) {
00029
00030 edm::LogInfo("EgHLTOfflineSource") << "unable to get DQMStore service?";
00031 }
00032 if(iConfig.getUntrackedParameter<bool>("DQMStore", false)) {
00033 dbe_->setVerbose(0);
00034 }
00035
00036
00037 binData_.setup(iConfig.getParameter<edm::ParameterSet>("binData"));
00038 cutMasks_.setup(iConfig.getParameter<edm::ParameterSet>("cutMasks"));
00039 eleHLTFilterNames_ = iConfig.getParameter<std::vector<std::string> >("eleHLTFilterNames");
00040 eleHLTFilterNames2Leg_ = iConfig.getParameter<std::vector<std::string> >("eleHLTFilterNames2Leg");
00041 phoHLTFilterNames_ = iConfig.getParameter<std::vector<std::string> >("phoHLTFilterNames");
00042 eleTightLooseTrigNames_ = iConfig.getParameter<std::vector<std::string> >("eleTightLooseTrigNames");
00043 diEleTightLooseTrigNames_ = iConfig.getParameter<std::vector<std::string> >("diEleTightLooseTrigNames");
00044 phoTightLooseTrigNames_ = iConfig.getParameter<std::vector<std::string> >("phoTightLooseTrigNames");
00045 diPhoTightLooseTrigNames_ = iConfig.getParameter<std::vector<std::string> >("diPhoTightLooseTrigNames");
00046
00047 filterInactiveTriggers_ =iConfig.getParameter<bool>("filterInactiveTriggers");
00048 hltTag_ = iConfig.getParameter<std::string>("hltTag");
00049
00050
00051 dirName_=iConfig.getParameter<std::string>("DQMDirName");
00052
00053
00054 offEvtHelper_.setup(iConfig);
00055
00056 }
00057
00058
00059 EgHLTOfflineSource::~EgHLTOfflineSource()
00060 {
00061
00062 for(size_t i=0;i<eleFilterMonHists_.size();i++){
00063 delete eleFilterMonHists_[i];
00064 }
00065 for(size_t i=0;i<phoFilterMonHists_.size();i++){
00066 delete phoFilterMonHists_[i];
00067 }
00068 for(size_t i=0;i<eleMonElems_.size();i++){
00069 delete eleMonElems_[i];
00070 }
00071 for(size_t i=0;i<phoMonElems_.size();i++){
00072 delete phoMonElems_[i];
00073 }
00074 }
00075
00076 void EgHLTOfflineSource::beginJob()
00077 {
00078 if(dbe_) {
00079 dbe_->setCurrentFolder(dirName_);
00080
00081 dqmErrsMonElem_ =dbe_->book1D("dqmErrors","EgHLTOfflineSource Errors",101,-0.5,100.5);
00082 nrEventsProcessedMonElem_ = dbe_->bookInt("nrEventsProcessed");
00083 }
00084 }
00085
00086 void EgHLTOfflineSource::endJob()
00087 {
00088
00089 }
00090
00091
00092
00093
00094
00095 void EgHLTOfflineSource::beginRun(const edm::Run& run, const edm::EventSetup& c)
00096 {
00097 if(dbe_ && !isSetup_){
00098
00099 HLTConfigProvider hltConfig;
00100 bool changed=false;
00101 hltConfig.init(run,c,hltTag_,changed);
00102 if(filterInactiveTriggers_) filterTriggers(hltConfig);
00103
00104 std::vector<std::string> hltFiltersUsed;
00105 getHLTFilterNamesUsed(hltFiltersUsed);
00106 TrigCodes::setCodes(hltFiltersUsed);
00107
00108 offEvtHelper_.setupTriggers(hltConfig,hltFiltersUsed);
00109
00110
00111 dbe_->setCurrentFolder(dirName_+"/Source_Histos");
00112
00113 for(size_t i=0;i<eleHLTFilterNames_.size();i++){dbe_->setCurrentFolder(dirName_+"/Source_Histos/"+eleHLTFilterNames_[i]); addEleTrigPath(eleHLTFilterNames_[i]);}
00114 for(size_t i=0;i<phoHLTFilterNames_.size();i++){dbe_->setCurrentFolder(dirName_+"/Source_Histos/"+phoHLTFilterNames_[i]); addPhoTrigPath(phoHLTFilterNames_[i]);}
00115
00116 MonElemFuncs::initTightLooseTrigHists(eleMonElems_,eleTightLooseTrigNames_,binData_,"gsfEle");
00117
00118
00119
00120
00121 MonElemFuncs::initTightLooseTrigHists(phoMonElems_,phoTightLooseTrigNames_,binData_,"pho");
00122
00123
00124
00125
00126 MonElemFuncs::initTightLooseTrigHists(eleMonElems_,diEleTightLooseTrigNames_,binData_,"gsfEle");
00127
00128 MonElemFuncs::initTightLooseTrigHists(phoMonElems_,diPhoTightLooseTrigNames_,binData_,"pho");
00129
00130
00131 MonElemFuncs::initTightLooseDiObjTrigHistsTrigCuts(eleMonElems_,diEleTightLooseTrigNames_,binData_);
00132 MonElemFuncs::initTightLooseDiObjTrigHistsTrigCuts(phoMonElems_,diPhoTightLooseTrigNames_,binData_);
00133
00134
00135
00136
00137
00138 for(size_t i=0;i<eleHLTFilterNames_.size();i++){
00139 dbe_->setCurrentFolder(dirName_+"/Source_Histos/"+eleHLTFilterNames_[i]);
00140 MonElemFuncs::initTrigTagProbeHist(eleMonElems_,eleHLTFilterNames_[i],cutMasks_.trigTPEle,binData_);
00141 }
00142 for(size_t i=0;i<phoHLTFilterNames_.size();i++){
00143 dbe_->setCurrentFolder(dirName_+"/Source_Histos/"+phoHLTFilterNames_[i]);
00144 MonElemFuncs::initTrigTagProbeHist(phoMonElems_,phoHLTFilterNames_[i],cutMasks_.trigTPPho,binData_);
00145 }
00146 for(size_t i=0;i<eleHLTFilterNames2Leg_.size();i++){
00147 dbe_->setCurrentFolder(dirName_+"/Source_Histos/"+eleHLTFilterNames2Leg_[i].substr(eleHLTFilterNames2Leg_[i].find("::")+2));
00148
00149
00150 MonElemFuncs::initTrigTagProbeHist_2Leg(eleMonElems_,eleHLTFilterNames2Leg_[i],cutMasks_.trigTPEle,binData_);
00151 }
00152
00153
00154
00155 isSetup_=true;
00156
00157 dbe_->setCurrentFolder(dirName_);
00158 }
00159 }
00160
00161
00162 void EgHLTOfflineSource::endRun(const edm::Run& run, const edm::EventSetup& c)
00163 {
00164
00165 }
00166
00167
00168 void EgHLTOfflineSource::analyze(const edm::Event& iEvent,const edm::EventSetup& iSetup)
00169 {
00170
00171
00172
00173
00174 if(!dbe_) return;
00175
00176
00177
00178
00179
00180 const double weight=1.;
00181 nrEventsProcessed_++;
00182 nrEventsProcessedMonElem_->Fill(nrEventsProcessed_);
00183 int errCode = offEvtHelper_.makeOffEvt(iEvent,iSetup,offEvt_);
00184 if(errCode!=0){
00185 dqmErrsMonElem_->Fill(errCode);
00186 return;
00187 }
00188
00189
00190 for(size_t pathNr=0;pathNr<eleFilterMonHists_.size();pathNr++){
00191 eleFilterMonHists_[pathNr]->fill(offEvt_,weight);
00192 }
00193 for(size_t pathNr=0;pathNr<phoFilterMonHists_.size();pathNr++){
00194 phoFilterMonHists_[pathNr]->fill(offEvt_,weight);
00195 }
00196
00197 for(size_t monElemNr=0;monElemNr<eleMonElems_.size();monElemNr++){
00198 const std::vector<OffEle>& eles = offEvt_.eles();
00199 for(size_t eleNr=0;eleNr<eles.size();eleNr++){
00200 eleMonElems_[monElemNr]->fill(eles[eleNr],offEvt_,weight);
00201 }
00202 }
00203
00204 for(size_t monElemNr=0;monElemNr<phoMonElems_.size();monElemNr++){
00205 const std::vector<OffPho>& phos = offEvt_.phos();
00206 for(size_t phoNr=0;phoNr<phos.size();phoNr++){
00207 phoMonElems_[monElemNr]->fill(phos[phoNr],offEvt_,weight);
00208 }
00209 }
00210 }
00211
00212
00213 void EgHLTOfflineSource::addEleTrigPath(const std::string& name)
00214 {
00215 EleHLTFilterMon* filterMon = new EleHLTFilterMon(name,TrigCodes::getCode(name.c_str()),binData_,cutMasks_);
00216 eleFilterMonHists_.push_back(filterMon);
00217 std::sort(eleFilterMonHists_.begin(),eleFilterMonHists_.end(),EleHLTFilterMon::ptrLess<EleHLTFilterMon>());
00218 }
00219
00220 void EgHLTOfflineSource::addPhoTrigPath(const std::string& name)
00221 {
00222 PhoHLTFilterMon* filterMon = new PhoHLTFilterMon(name,TrigCodes::getCode(name.c_str()),binData_,cutMasks_);
00223 phoFilterMonHists_.push_back(filterMon);
00224 std::sort(phoFilterMonHists_.begin(),phoFilterMonHists_.end(),PhoHLTFilterMon::ptrLess<PhoHLTFilterMon>());
00225 }
00226
00227
00228
00229
00230
00231
00232
00233
00234 void EgHLTOfflineSource::getHLTFilterNamesUsed(std::vector<std::string>& filterNames)const
00235 {
00236 std::set<std::string> filterNameSet;
00237 for(size_t i=0;i<eleHLTFilterNames_.size();i++) filterNameSet.insert(eleHLTFilterNames_[i]);
00238 for(size_t i=0;i<phoHLTFilterNames_.size();i++) filterNameSet.insert(phoHLTFilterNames_[i]);
00239
00240
00241 for(size_t tightLooseNr=0;tightLooseNr<eleTightLooseTrigNames_.size();tightLooseNr++){
00242 std::vector<std::string> trigNames;
00243 boost::split(trigNames,eleTightLooseTrigNames_[tightLooseNr],boost::is_any_of(std::string(":")));
00244 if(trigNames.size()!=2) continue;
00245 filterNameSet.insert(trigNames[0]);
00246 filterNameSet.insert(trigNames[1]);
00247 }
00248 for(size_t tightLooseNr=0;tightLooseNr<diEleTightLooseTrigNames_.size();tightLooseNr++){
00249 std::vector<std::string> trigNames;
00250 boost::split(trigNames,diEleTightLooseTrigNames_[tightLooseNr],boost::is_any_of(std::string(":")));
00251 if(trigNames.size()!=2) continue;
00252 filterNameSet.insert(trigNames[0]);
00253 filterNameSet.insert(trigNames[1]);
00254 }
00255 for(size_t tightLooseNr=0;tightLooseNr<phoTightLooseTrigNames_.size();tightLooseNr++){
00256 std::vector<std::string> trigNames;
00257 boost::split(trigNames,phoTightLooseTrigNames_[tightLooseNr],boost::is_any_of(std::string(":")));
00258 if(trigNames.size()!=2) continue;
00259 filterNameSet.insert(trigNames[0]);
00260 filterNameSet.insert(trigNames[1]);
00261 }
00262 for(size_t tightLooseNr=0;tightLooseNr<diPhoTightLooseTrigNames_.size();tightLooseNr++){
00263 std::vector<std::string> trigNames;
00264 boost::split(trigNames,diPhoTightLooseTrigNames_[tightLooseNr],boost::is_any_of(std::string(":")));
00265 if(trigNames.size()!=2) continue;
00266 filterNameSet.insert(trigNames[0]);
00267 filterNameSet.insert(trigNames[1]);
00268 }
00269
00270
00271 std::vector<std::string>(filterNameSet.begin(),filterNameSet.end()).swap(filterNames);
00272 }
00273
00274 void EgHLTOfflineSource::filterTriggers(const HLTConfigProvider& hltConfig)
00275 {
00276
00277 std::vector<std::string> activeFilters;
00278 std::vector<std::string> activeEleFilters;
00279 std::vector<std::string> activeEle2LegFilters;
00280 std::vector<std::string> activePhoFilters;
00281 std::vector<std::string> activePho2LegFilters;
00282
00283 trigTools::getActiveFilters(hltConfig,activeFilters,activeEleFilters,activeEle2LegFilters,activePhoFilters,activePho2LegFilters);
00284
00285 trigTools::filterInactiveTriggers(eleHLTFilterNames_,activeFilters);
00286 trigTools::filterInactiveTriggers(phoHLTFilterNames_,activePhoFilters);
00287 trigTools::filterInactiveTriggers(eleHLTFilterNames2Leg_,activeEle2LegFilters);
00288 trigTools::filterInactiveTightLooseTriggers(eleTightLooseTrigNames_,activeEleFilters);
00289 trigTools::filterInactiveTightLooseTriggers(diEleTightLooseTrigNames_,activeEleFilters);
00290 trigTools::filterInactiveTightLooseTriggers(phoTightLooseTrigNames_,activePhoFilters);
00291 trigTools::filterInactiveTightLooseTriggers(diPhoTightLooseTrigNames_,activePhoFilters);
00292 }