00001
00012 #include "HLTrigger/HLTcore/interface/HLTPrescaleRecorder.h"
00013
00014 #include "CondFormats/HLTObjects/interface/HLTPrescaleTableCond.h"
00015 #include "CondFormats/DataRecord/interface/HLTPrescaleTableRcd.h"
00016
00017 #include "DataFormats/Provenance/interface/ProcessHistory.h"
00018
00019 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00020
00021 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00022 #include "FWCore/ParameterSet/interface/Registry.h"
00023
00024 #include <sys/time.h>
00025 #include "DataFormats/Provenance/interface/Timestamp.h"
00026
00027 #include<string>
00028 #include<ostream>
00029
00030 using namespace std;
00031 using namespace edm;
00032 using namespace trigger;
00033
00034
00035
00036
00037 HLTPrescaleRecorder::HLTPrescaleRecorder(const edm::ParameterSet& ps) :
00038 src_(ps.getParameter<int>("src")),
00039 run_(ps.getParameter<bool>("run")),
00040 lumi_(ps.getParameter<bool>("lumi")),
00041 event_(ps.getParameter<bool>("event")),
00042 condDB_(ps.getParameter<bool>("condDB")),
00043 psetName_(ps.getParameter<string>("psetName")),
00044 hltInputTag_(ps.getParameter<InputTag>("hltInputTag")),
00045 hltDBTag_(ps.getParameter<string>("hltDBTag")),
00046 ps_(0),
00047 db_(0),
00048 hltHandle_(),
00049 hltESHandle_(),
00050 hlt_()
00051 {
00052
00053 LogInfo("HLTPrescaleRecorder")
00054 << "src:run-lumi-event-condDB+psetName+tags: "
00055 << src_ << ":" << run_ << "-" << lumi_ << "-" << event_ << "-"
00056 << condDB_ << "+" << psetName_ << "+"
00057 << hltInputTag_.encode() << "+" << hltDBTag_;
00058
00059 if(edm::Service<edm::service::PrescaleService>().isAvailable()) {
00060 ps_ = edm::Service<edm::service::PrescaleService>().operator->();
00061 } else if (src_==0) {
00062 LogError("HLTPrescaleRecorder")<<"PrescaleService requested as source but unavailable!";
00063 }
00064
00065 if (edm::Service<cond::service::PoolDBOutputService>().isAvailable()) {
00066 db_ = edm::Service<cond::service::PoolDBOutputService>().operator->();
00067 } else if (condDB_) {
00068 LogError("HLTPrescaleRecorder")<<"PoolDBOutputService requested as destination but unavailable!";
00069 }
00070
00071 if (run_) produces<HLTPrescaleTable,edm::InRun>("Run");
00072 if (lumi_) produces<HLTPrescaleTable,edm::InLumi>("Lumi");
00073 if (event_) produces<HLTPrescaleTable,edm::InEvent>("Event");
00074
00075 }
00076
00077 HLTPrescaleRecorder::~HLTPrescaleRecorder()
00078 {
00079 }
00080
00081
00082
00083
00084
00085 void HLTPrescaleRecorder::beginRun(edm::Run& iRun, const edm::EventSetup& iSetup) {
00086
00087 hlt_=HLTPrescaleTable();
00088
00089 if (src_==-1) {
00091 ParameterSet pPSet(getProcessParameterSet());
00092 ParameterSet iPS(pPSet.getParameter<ParameterSet>(psetName_));
00093
00094 string defaultLabel(iPS.getUntrackedParameter<std::string>("lvl1DefaultLabel",""));
00095 vector<string> labels(iPS.getParameter<std::vector<std::string> >("lvl1Labels"));
00096 vector<ParameterSet> vpTable(iPS.getParameter<std::vector<ParameterSet> >("prescaleTable"));
00097
00098 unsigned int set(0);
00099 const unsigned int n(labels.size());
00100 for (unsigned int i=0; i!=n; ++i) {
00101 if (labels[i]==defaultLabel) set=i;
00102 }
00103
00104 map<string,vector<unsigned int> > table;
00105 const unsigned int m (vpTable.size());
00106 for (unsigned int i=0; i!=m; ++i) {
00107 table[vpTable[i].getParameter<std::string>("pathName")] =
00108 vpTable[i].getParameter<std::vector<unsigned int> >("prescales");
00109 }
00110 hlt_=HLTPrescaleTable(set,labels,table);
00111
00112 } else if (src_==0) {
00115 if (ps_!=0) {
00116 hlt_=HLTPrescaleTable(ps_->getLvl1IndexDefault(), ps_->getLvl1Labels(), ps_->getPrescaleTable());
00117 } else {
00118 hlt_=HLTPrescaleTable();
00119 LogError("HLTPrescaleRecorder")<<"PrescaleService not found!";
00120 }
00121 } else if (src_==1) {
00123 if (iRun.getByLabel(hltInputTag_,hltHandle_)) {
00124 hlt_=*hltHandle_;
00125 } else {
00126 LogError("HLTPrescaleRecorder")<<"HLTPrescaleTable not found in Run!";
00127 }
00128 } else if (src_==4) {
00130 const HLTPrescaleTableRcd& hltRecord(iSetup.get<HLTPrescaleTableRcd>());
00131 hltRecord.get(hltDBTag_,hltESHandle_);
00132 hlt_=hltESHandle_->hltPrescaleTable();
00133 }
00134
00135 return;
00136 }
00137
00138 void HLTPrescaleRecorder::beginLuminosityBlock(edm::LuminosityBlock& iLumi, const edm::EventSetup& iSetup) {
00139
00140 if (src_==0) {
00143 if (ps_!=0) {
00144 hlt_=HLTPrescaleTable(ps_->getLvl1IndexDefault(), ps_->getLvl1Labels(), ps_->getPrescaleTable());
00145 } else {
00146 hlt_=HLTPrescaleTable();
00147 LogError("HLTPrescaleRecorder")<<"PrescaleService not found!";
00148 }
00149 } else if (src_==2) {
00151 if (iLumi.getByLabel(hltInputTag_,hltHandle_)) {
00152 hlt_=*hltHandle_;
00153 } else {
00154 hlt_=HLTPrescaleTable();
00155 LogError("HLTPrescaleRecorder")<<"HLTPrescaleTable not found in LumiBlock!";
00156 }
00157 }
00158
00159 return;
00160 }
00161
00162 void HLTPrescaleRecorder::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
00163
00164 if (src_==3) {
00166 if (iEvent.getByLabel(hltInputTag_,hltHandle_)) {
00167 hlt_=*hltHandle_;
00168 } else {
00169 hlt_=HLTPrescaleTable();
00170 LogError("HLTPrescaleRecorder")<<"HLTPrescaleTable not found in Event!";
00171 }
00172 }
00173
00174 if (event_) {
00176 auto_ptr<HLTPrescaleTable> product (new HLTPrescaleTable(hlt_));
00177 iEvent.put(product,"Event");
00178 }
00179
00180 return;
00181 }
00182
00183 void HLTPrescaleRecorder::endLuminosityBlock(edm::LuminosityBlock& iLumi, const edm::EventSetup& iSetup) {
00184
00185 if (lumi_) {
00187 auto_ptr<HLTPrescaleTable> product (new HLTPrescaleTable(hlt_));
00188 iLumi.put(product,"Lumi");
00189 }
00190
00191 return;
00192 }
00193
00194 void HLTPrescaleRecorder::endRun(edm::Run& iRun, const edm::EventSetup& iSetup) {
00195
00197 ostringstream oss;
00198 const unsigned int n(hlt_.size());
00199 oss << "PrescaleTable: # of labels = " << n << endl;
00200 const vector<string>& labels(hlt_.labels());
00201 for (unsigned int i=0; i!=n; ++i) {
00202 oss << " " << i << "/'" << labels.at(i) << "'";
00203 }
00204 oss << endl;
00205 const map<string,vector<unsigned int> >& table(hlt_.table());
00206 oss << "PrescaleTable: # of paths = " << table.size() << endl;
00207 const map<string,vector<unsigned int> >::const_iterator tb(table.begin());
00208 const map<string,vector<unsigned int> >::const_iterator te(table.end());
00209 for (map<string,vector<unsigned int> >::const_iterator ti=tb; ti!=te; ++ti) {
00210 for (unsigned int i=0; i!=n; ++i) {
00211 oss << " " << ti->second.at(i);
00212 }
00213 oss << " " << ti->first << endl;
00214 }
00215 LogVerbatim("HLTPrescaleRecorder") << oss.str();
00216
00217 if (run_) {
00219 auto_ptr<HLTPrescaleTable> product (new HLTPrescaleTable(hlt_));
00220 iRun.put(product,"Run");
00221 }
00222
00223 if (condDB_) {
00225 if (db_!=0) {
00226 HLTPrescaleTableCond* product (new HLTPrescaleTableCond(hlt_));
00227 const string rcdName("HLTPrescaleTableRcd");
00228 if ( db_->isNewTagRequest(rcdName) ) {
00229 db_->createNewIOV<HLTPrescaleTableCond>(product,
00230 db_->beginOfTime(),db_->endOfTime(),rcdName);
00231 } else {
00232 ::timeval tv;
00233 gettimeofday(&tv,0);
00234 edm::Timestamp tstamp((unsigned long long)tv.tv_sec);
00235 db_->appendSinceTime<HLTPrescaleTableCond>(product,
00236
00237 tstamp.value()
00238 ,rcdName);
00239 }
00240 } else {
00241 LogError("HLTPrescaleRecorder") << "PoolDBOutputService not available!";
00242 }
00243 }
00244
00245 return;
00246 }