00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "DQM/HLTEvF/interface/PathTimerService.h"
00013 #include "FWCore/ServiceRegistry/interface/Service.h"
00014 #include "DataFormats/Provenance/interface/ModuleDescription.h"
00015 #include "FWCore/Utilities/interface/Exception.h"
00016 #include "FWCore/Framework/interface/TriggerNamesService.h"
00017 #include <iostream>
00018 #include <string>
00019 #include <vector>
00020 #include <sys/time.h>
00021 #include <sstream>
00022 #include <math.h>
00023
00024 using namespace std ;
00025 namespace edm {
00026 namespace service {
00027
00028 static double getTime() {
00029 struct timeval t;
00030 if(gettimeofday(&t,0)<0)
00031 throw cms::Exception("SysCallFailed","Failed call to gettimeofday");
00032
00033 return (double)t.tv_sec + (double(t.tv_usec) * 1E-6);
00034 }
00035
00036 edm::CPUTimer* PathTimerService::_CPUtimer = 0;
00037
00038 PathTimerService::PathTimerService(const ParameterSet& iPS, ActivityRegistry&iRegistry):
00039 total_event_count_(0),
00040 _perfInfo(new HLTPerformanceInfo)
00041 {
00042 iRegistry.watchPostBeginJob(this,&PathTimerService::postBeginJob);
00043 iRegistry.watchPostEndJob(this,&PathTimerService::postEndJob);
00044
00045 iRegistry.watchPreProcessEvent(this,&PathTimerService::preEventProcessing);
00046 iRegistry.watchPostProcessEvent(this,&PathTimerService::postEventProcessing);
00047
00048 iRegistry.watchPreModule(this,&PathTimerService::preModule);
00049 iRegistry.watchPostModule(this,&PathTimerService::postModule);
00050
00051 iRegistry.watchPostProcessPath(this,&PathTimerService::postPathProcessing);
00052
00053 _myPS=iPS;
00054
00055 if (!_CPUtimer) _CPUtimer = new edm::CPUTimer();
00056 }
00057
00058
00059 PathTimerService::~PathTimerService() {
00060 if (_CPUtimer) {
00061 delete _CPUtimer ;
00062 _CPUtimer = 0 ;
00063 }
00064 }
00065
00066
00067 void PathTimerService::postBeginJob() {
00068
00069 edm::Service<edm::service::TriggerNamesService> tns;
00070 std::vector<std::string> trigPaths= tns->getTrigPaths();
00071 for ( unsigned int i=0; i<trigPaths.size(); i++) {
00072 _pathMapping[i]=trigPaths[i];
00073 HLTPerformanceInfo::Path hltPath(trigPaths[i]);
00074 std::vector<unsigned int> loc ;
00075 const std::vector<std::string> modules=tns->getTrigPathModules(trigPaths[i]);
00076 unsigned int mIdx = 0 ;
00077 _perfInfo->addPath(hltPath);
00078 for ( unsigned int j=0; j<modules.size(); j++) {
00079 _moduleTime[modules[j]]=0. ;
00080 _moduleCPUTime[modules[j]]=0. ;
00081 HLTPerformanceInfo::Modules::const_iterator iMod =
00082 _perfInfo->findModule(modules[j].c_str());
00083 if ( iMod == _perfInfo->endModules() ) {
00084 HLTPerformanceInfo::Module hltModule(modules[j].c_str(),0.,0.,hlt::Ready);
00085 _perfInfo->addModule(hltModule);
00086 }
00087
00088
00089 bool duplicateModule = false ;
00090 for (unsigned int k=0; k<j; k++) {
00091 if (modules[k] == modules[j]) {
00092 if (!duplicateModule) loc.push_back(k) ;
00093 duplicateModule = true ;
00094 }
00095 }
00096 if (!duplicateModule) {
00097 _perfInfo->addModuleToPath(modules[j].c_str(),trigPaths[i].c_str());
00098 loc.push_back(mIdx++) ;
00099 }
00100 }
00101 _newPathIndex.push_back(loc) ;
00102 }
00103 curr_job_ = getTime();
00104 }
00105
00106 void PathTimerService::postEndJob() {}
00107
00108 void PathTimerService::preEventProcessing(const edm::EventID& iID,
00109 const edm::Timestamp& iTime) {
00110 curr_event_ = iID;
00111 curr_event_time_ = getTime();
00112
00113 _perfInfo->clearModules();
00114
00115 std::map<std::string, double>::iterator iter=_moduleTime.begin();
00116 std::map<std::string, double>::iterator iCPU=_moduleCPUTime.begin();
00117
00118 while ( iter != _moduleTime.end()) {
00119 (*iter).second=0.;
00120 iter++;
00121 }
00122 while ( iCPU != _moduleCPUTime.end()) {
00123 (*iCPU).second=0.;
00124 iCPU++;
00125 }
00126
00127 }
00128 void PathTimerService::postEventProcessing(const Event& e, const EventSetup&) {
00129 total_event_count_ = total_event_count_ + 1;
00130 }
00131
00132 void PathTimerService::preModule(const ModuleDescription&) {
00133 _CPUtimer->reset() ;
00134 _CPUtimer->start() ;
00135 }
00136
00137 void PathTimerService::postModule(const ModuleDescription& desc) {
00138
00139 _CPUtimer->stop() ;
00140 double tWall = _CPUtimer->realTime() ;
00141 double tCPU = _CPUtimer->cpuTime() ;
00142 _CPUtimer->reset() ;
00143
00144 _moduleTime[desc.moduleLabel()] = tWall ;
00145 _moduleCPUTime[desc.moduleLabel()] = tCPU ;
00146
00147 HLTPerformanceInfo::Modules::iterator iMod =
00148 _perfInfo->findModule(desc.moduleLabel().c_str());
00149 if ( iMod != _perfInfo->endModules() ) {
00150 iMod->setTime(tWall) ;
00151 iMod->setCPUTime(tCPU) ;
00152 }
00153
00154 }
00155
00156 void PathTimerService::postPathProcessing(const std::string &name,
00157 const HLTPathStatus &status) {
00158 HLTPerformanceInfo::PathList::iterator iPath=_perfInfo->beginPaths();
00159 int ctr = 0 ;
00160 while ( iPath != _perfInfo->endPaths() ) {
00161 if ( iPath->name() == name) {
00162 unsigned int pIndex = _newPathIndex.at(ctr).at(status.index()) ;
00163 iPath->setStatus(HLTPathStatus(status.state(),pIndex)) ;
00164 _perfInfo->setStatusOfModulesFromPath(name.c_str());
00165 }
00166 iPath++;
00167 ctr++;
00168
00169 }
00170
00171 }
00172 }
00173 }