13 #include <unordered_set>
14 #include <unordered_map>
17 #include <boost/format.hpp>
20 #include <tbb/concurrent_vector.h>
44 m_use_realtime( config.getUntrackedParameter<bool>(
"useRealTimeClock" ) ),
45 m_enable_timing_paths( config.getUntrackedParameter<bool>(
"enableTimingPaths" ) ),
46 m_enable_timing_modules( config.getUntrackedParameter<bool>(
"enableTimingModules" ) ),
47 m_enable_timing_exclusive( config.getUntrackedParameter<bool>(
"enableTimingExclusive" ) ),
48 m_enable_timing_summary( config.getUntrackedParameter<bool>(
"enableTimingSummary" ) ),
49 m_skip_first_path( config.getUntrackedParameter<bool>(
"skipFirstPath" ) ),
51 m_enable_dqm( config.getUntrackedParameter<bool>(
"enableDQM" ) ),
52 m_enable_dqm_bypath_active( config.getUntrackedParameter<bool>(
"enableDQMbyPathActive" ) ),
53 m_enable_dqm_bypath_total( config.getUntrackedParameter<bool>(
"enableDQMbyPathTotal" ) ),
54 m_enable_dqm_bypath_overhead( config.getUntrackedParameter<bool>(
"enableDQMbyPathOverhead" ) ),
55 m_enable_dqm_bypath_details( config.getUntrackedParameter<bool>(
"enableDQMbyPathDetails" ) ),
56 m_enable_dqm_bypath_counters( config.getUntrackedParameter<bool>(
"enableDQMbyPathCounters" ) ),
57 m_enable_dqm_bypath_exclusive( config.getUntrackedParameter<bool>(
"enableDQMbyPathExclusive" ) ),
58 m_enable_dqm_bymodule( config.getUntrackedParameter<bool>(
"enableDQMbyModule" ) ),
59 m_enable_dqm_bymoduletype( config.getUntrackedParameter<bool>(
"enableDQMbyModuleType" ) ),
60 m_enable_dqm_summary( config.getUntrackedParameter<bool>(
"enableDQMSummary" ) ),
61 m_enable_dqm_byls( config.getUntrackedParameter<bool>(
"enableDQMbyLumiSection" ) ),
62 m_enable_dqm_bynproc( config.getUntrackedParameter<bool>(
"enableDQMbyProcesses" ) ),
64 m_concurrent_runs( 0 ),
65 m_concurrent_streams( 0 ),
66 m_concurrent_threads( 0 ),
67 m_module_id( edm::ModuleDescription::invalidID() ),
68 m_dqm_eventtime_range( config.getUntrackedParameter<double>(
"dqmTimeRange" ) ),
69 m_dqm_eventtime_resolution( config.getUntrackedParameter<double>(
"dqmTimeResolution" ) ),
70 m_dqm_pathtime_range( config.getUntrackedParameter<double>(
"dqmPathTimeRange" ) ),
71 m_dqm_pathtime_resolution( config.getUntrackedParameter<double>(
"dqmPathTimeResolution" ) ),
72 m_dqm_moduletime_range( config.getUntrackedParameter<double>(
"dqmModuleTimeRange" ) ),
73 m_dqm_moduletime_resolution( config.getUntrackedParameter<double>(
"dqmModuleTimeResolution" ) ),
74 m_dqm_path( config.getUntrackedParameter<std::
string>(
"dqmPath" ) ),
84 m_run_summary_perprocess(),
85 m_job_summary_perprocess()
209 uint32_t
size = size_p + size_e;
212 if (stream.paths.size() <=
pid)
213 stream.paths.resize(pid+1);
214 for (uint32_t
i = 0;
i < size_p; ++
i) {
216 for (
auto & stream: m_stream)
219 for (uint32_t
i = 0;
i < size_e; ++
i) {
221 for (
auto & stream: m_stream)
222 stream.paths[
pid][
label].index = size_p +
i;
224 for (
auto & stream: m_stream) {
226 if (stream.timing_perprocess.size() <=
pid)
227 stream.timing_perprocess.resize(pid+1);
228 stream.timing_perprocess[
pid].paths_interpaths.assign(size + 1, 0.);
230 if (stream.dqm_perprocess.size() <=
pid)
231 stream.dqm_perprocess.resize(pid+1);
232 if (stream.dqm_perprocess_byluminosity.size() <=
pid)
233 stream.dqm_perprocess_byluminosity.resize(pid+1);
234 if (stream.dqm_paths.size() <=
pid)
235 stream.dqm_paths.resize(pid+1);
240 summary[
pid].paths_interpaths.assign(size + 1, 0);
249 m_run_summary_perprocess[rid][
pid].reset();
270 m_enable_dqm =
false;
277 uint32_t
size = size_p + size_e;
291 stream.dqm.presource = booker.book1D(
"presource",
"Pre-Source processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
292 stream.dqm.presource ->StatOverflows(
true);
293 stream.dqm.presource ->SetXTitle(
"processing time [ms]");
294 stream.dqm.source = booker.book1D(
"source",
"Source processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
295 stream.dqm.source ->StatOverflows(
true);
296 stream.dqm.source ->SetXTitle(
"processing time [ms]");
297 stream.dqm.preevent = booker.book1D(
"preevent",
"Pre-Event processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
298 stream.dqm.preevent ->StatOverflows(
true);
299 stream.dqm.preevent ->SetXTitle(
"processing time [ms]");
300 stream.dqm.event = booker.book1D(
"event",
"Event processing time", eventbins, 0.,
m_dqm_eventtime_range)->getTH1F();
301 stream.dqm.event ->StatOverflows(
true);
302 stream.dqm.event ->SetXTitle(
"processing time [ms]");
306 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name);
307 stream.dqm_perprocess[
pid].preevent = booker.book1D(
"preevent",
"Pre-Event processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
308 stream.dqm_perprocess[
pid].preevent ->StatOverflows(
true);
309 stream.dqm_perprocess[
pid].preevent ->SetXTitle(
"processing time [ms]");
310 stream.dqm_perprocess[
pid].event = booker.book1D(
"event",
"Event processing time", eventbins, 0.,
m_dqm_eventtime_range)->getTH1F();
311 stream.dqm_perprocess[
pid].event ->StatOverflows(
true);
312 stream.dqm_perprocess[
pid].event ->SetXTitle(
"processing time [ms]");
313 stream.dqm_perprocess[
pid].all_paths = booker.book1D(
"all_paths",
"Paths processing time", eventbins, 0.,
m_dqm_eventtime_range)->getTH1F();
314 stream.dqm_perprocess[
pid].all_paths ->StatOverflows(
true);
315 stream.dqm_perprocess[
pid].all_paths ->SetXTitle(
"processing time [ms]");
316 stream.dqm_perprocess[
pid].all_endpaths = booker.book1D(
"all_endpaths",
"EndPaths processing time", pathbins, 0.,
m_dqm_pathtime_range)->getTH1F();
317 stream.dqm_perprocess[
pid].all_endpaths ->StatOverflows(
true);
318 stream.dqm_perprocess[
pid].all_endpaths ->SetXTitle(
"processing time [ms]");
319 stream.dqm_perprocess[
pid].interpaths = booker.book1D(
"interpaths",
"Time spent between paths", pathbins, 0.,
m_dqm_eventtime_range)->getTH1F();
320 stream.dqm_perprocess[
pid].interpaths ->StatOverflows(
true);
321 stream.dqm_perprocess[
pid].interpaths ->SetXTitle(
"processing time [ms]");
326 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name);
327 stream.dqm_paths[
pid].active_time = booker.bookProfile(
"paths_active_time",
"Additional time spent in each path", size, -0.5, size-0.5, pathbins, 0.,
std::numeric_limits<double>::infinity(),
" ")->getTProfile();
328 stream.dqm_paths[
pid].active_time ->StatOverflows(
true);
329 stream.dqm_paths[
pid].active_time ->SetYTitle(
"processing time [ms]");
330 stream.dqm_paths[
pid].total_time = booker.bookProfile(
"paths_total_time",
"Total time spent in each path", size, -0.5, size-0.5, pathbins, 0.,
std::numeric_limits<double>::infinity(),
" ")->getTProfile();
331 stream.dqm_paths[
pid].total_time ->StatOverflows(
true);
332 stream.dqm_paths[
pid].total_time ->SetYTitle(
"processing time [ms]");
333 stream.dqm_paths[
pid].exclusive_time = booker.bookProfile(
"paths_exclusive_time",
"Exclusive time spent in each path", size, -0.5, size-0.5, pathbins, 0.,
std::numeric_limits<double>::infinity(),
" ")->getTProfile();
334 stream.dqm_paths[
pid].exclusive_time ->StatOverflows(
true);
335 stream.dqm_paths[
pid].exclusive_time ->SetYTitle(
"processing time [ms]");
336 stream.dqm_paths[
pid].interpaths = booker.bookProfile(
"paths_interpaths",
"Time spent between each path", size+1, -0.5, size+0.5, pathbins, 0.,
std::numeric_limits<double>::infinity(),
" ")->getTProfile();
337 stream.dqm_paths[
pid].interpaths ->StatOverflows(
true);
338 stream.dqm_paths[
pid].interpaths ->SetYTitle(
"processing time [ms]");
340 for (uint32_t
i = 0;
i < size_p; ++
i) {
342 stream.dqm_paths[
pid].active_time ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
343 stream.dqm_paths[
pid].total_time ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
344 stream.dqm_paths[
pid].exclusive_time ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
345 stream.dqm_paths[
pid].interpaths ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
347 for (uint32_t
i = 0;
i < size_e; ++
i) {
349 stream.dqm_paths[
pid].active_time ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
350 stream.dqm_paths[
pid].total_time ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
351 stream.dqm_paths[
pid].exclusive_time ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
352 stream.dqm_paths[
pid].interpaths ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
354 stream.dqm_paths[
pid].interpaths ->GetXaxis()->SetBinLabel(size+1,
"");
366 auto &
plots = stream.dqm_byluminosity[
i];
369 plots.presource ->StatOverflows(
true);
371 plots.presource ->SetYTitle(
"processing time [ms]");
373 plots.source ->StatOverflows(
true);
375 plots.source ->SetYTitle(
"processing time [ms]");
377 plots.preevent ->StatOverflows(
true);
379 plots.preevent ->SetYTitle(
"processing time [ms]");
381 plots.event ->StatOverflows(
true);
383 plots.event ->SetYTitle(
"processing time [ms]");
391 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name);
393 auto &
plots = stream.dqm_perprocess_byluminosity[
pid][
i];
396 plots.preevent ->StatOverflows(
true);
398 plots.preevent ->SetYTitle(
"processing time [ms]");
400 plots.event ->StatOverflows(
true);
402 plots.event ->SetYTitle(
"processing time [ms]");
404 plots.all_paths ->StatOverflows(
true);
406 plots.all_paths ->SetYTitle(
"processing time [ms]");
408 plots.all_endpaths ->StatOverflows(
true);
410 plots.all_endpaths ->SetYTitle(
"processing time [ms]");
412 plots.interpaths ->StatOverflows(
true);
414 plots.interpaths ->SetYTitle(
"processing time [ms]");
420 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name +
"/Paths");
421 for (
auto & keyval: stream.paths[pid]) {
423 PathInfo & pathinfo = keyval.second;
428 pathinfo.
dqm_active ->SetXTitle(
"processing time [ms]");
433 pathinfo.
dqm_total ->StatOverflows(
true);
434 pathinfo.
dqm_total ->SetXTitle(
"processing time [ms]");
449 pathinfo.
dqm_overhead ->SetXTitle(
"processing time [ms]");
459 std::vector<std::string>();
464 static tbb::concurrent_vector<std::string> dup;
467 std::lock_guard<std::mutex>
lock(dup_mutex);
470 for (
unsigned int i = 0;
i < 32; ++
i)
475 if (modules.size() > dup.size()) {
476 std::lock_guard<std::mutex>
lock(dup_mutex);
477 unsigned int old_size = dup.size();
478 unsigned int new_size = modules.size();
479 if (new_size > old_size) {
480 dup.resize(new_size);
481 for (
unsigned int i = old_size;
i < new_size; ++
i)
486 std::vector<const char *>
labels(modules.size(),
nullptr);
487 for (uint32_t
i = 0;
i < modules.size(); ++
i)
491 if (m_enable_dqm_bypath_counters) {
492 pathinfo.
dqm_module_counter = booker.book1D(pathname +
"_module_counter", pathname +
" module counter", modules.size() + 1, -0.5, modules.size() + 0.5)->getTH1F();
494 for (uint32_t
i = 0;
i < modules.size(); ++
i)
500 pathinfo.
dqm_module_active = booker.book1D(pathname +
"_module_active", pathname +
" module active", modules.size(), -0.5, modules.size() - 0.5)->getTH1F();
502 pathinfo.
dqm_module_total = booker.book1D(pathname +
"_module_total", pathname +
" module total", modules.size(), -0.5, modules.size() - 0.5)->getTH1F();
505 for (uint32_t
i = 0;
i < modules.size(); ++
i) {
523 booker.setCurrentFolder(
m_dqm_path +
"/Modules");
524 for (
auto & keyval: stream.modules) {
529 module.
dqm_active->SetXTitle(
"processing time [ms]");
534 booker.setCurrentFolder(
m_dqm_path +
"/ModuleTypes");
535 for (
auto & keyval: stream.moduletypes) {
540 module.
dqm_active->SetXTitle(
"processing time [ms]");
569 stream.fast_moduletypes.resize(
m_module_id,
nullptr);
573 for (
auto & stream: m_stream)
654 std::ostringstream
out;
655 out << std::fixed << std::setprecision(6);
656 out <<
"FastReport for " << label <<
", process " << process <<
'\n';
658 out <<
"FastReport " << std::right << std::setw(10) << summary.
preevent / (double) total.
count <<
" Pre-Event" <<
'\n';
659 out <<
"FastReport " << std::right << std::setw(10) << summary.
event / (double) total.
count <<
" Event" <<
'\n';
660 out <<
"FastReport " << std::right << std::setw(10) << summary.
all_paths / (double) total.
count <<
" all Paths" <<
'\n';
661 out <<
"FastReport " << std::right << std::setw(10) << summary.
all_endpaths / (double) total.
count <<
" all EndPaths" <<
'\n';
662 out <<
"FastReport " << std::right << std::setw(10) << summary.
interpaths / (double) total.
count <<
" between paths" <<
'\n';
672 std::ostringstream
out;
673 out << std::fixed << std::setprecision(6);
674 out <<
"FastReport for " << label <<
", over all subprocesses" <<
'\n';
676 out <<
"FastReport " << std::right << std::setw(10) << summary.
presource / (double) summary.
count <<
" Pre-Source" <<
'\n';
677 out <<
"FastReport " << std::right << std::setw(10) << summary.
source / (double) summary.
count <<
" Source" <<
'\n';
678 out <<
"FastReport " << std::right << std::setw(10) << summary.
preevent / (double) summary.
count <<
" Pre-Event" <<
'\n';
679 out <<
"FastReport " << std::right << std::setw(10) << summary.
event / (double) summary.
count <<
" Event" <<
'\n';
751 if (module.
id() >= stream.fast_modules.size())
752 stream.fast_modules.resize(module.
id() + 1,
nullptr);
753 if (module.
id() >= stream.fast_moduletypes.size())
754 stream.fast_moduletypes.resize(module.
id() + 1,
nullptr);
756 stream.fast_modules[module.
id()] = & stream.modules[module.
moduleLabel()];;
757 stream.fast_moduletypes[module.
id()] = & stream.moduletypes[module.
moduleName()];
767 stream.timer_event.start();
770 stream.timing_perprocess[
pid].preevent =
delta(stream.timer_last_transition, stream.timer_event.getStartTime());
773 stream.timing_perprocess[
pid].event = 0;
774 stream.timing_perprocess[
pid].all_paths = 0;
775 stream.timing_perprocess[
pid].all_endpaths = 0;
776 stream.timing_perprocess[
pid].interpaths = 0;
777 stream.timing_perprocess[
pid].paths_interpaths.assign(stream.paths[pid].size() + 1, 0);
778 for (
auto & keyval : stream.paths[pid]) {
779 keyval.second.timer.reset();
780 keyval.second.time_active = 0.;
781 keyval.second.time_exclusive = 0.;
782 keyval.second.time_premodules = 0.;
783 keyval.second.time_intermodules = 0.;
784 keyval.second.time_postmodules = 0.;
785 keyval.second.time_total = 0.;
790 stream.timer_last_path = stream.timer_event.getStartTime();
804 stream.timer_event.stop();
805 stream.timer_last_transition = stream.timer_event.getStopTime();
806 stream.timing_perprocess[
pid].event = stream.timer_event.seconds();
809 double interpaths =
delta(stream.timer_last_path, stream.timer_event.getStopTime());
810 stream.timing_perprocess[
pid].interpaths += interpaths;
811 stream.timing_perprocess[
pid].paths_interpaths.back() = interpaths;
823 stream.timing.count = 1;
824 stream.timing.preevent = stream.timing_perprocess[0].preevent;
825 stream.timing.event = stream.timing_perprocess[0].event;
827 stream.timing.event += stream.timing_perprocess[
i].preevent;
828 stream.timing.event += stream.timing_perprocess[
i].event;
837 for (
auto & keyval: stream.paths[pid]) {
838 PathInfo & pathinfo = keyval.second;
856 for (
unsigned int i = 0;
i < stream.fast_modules.size(); ++
i)
858 if (stream.fast_modules[
i]) {
859 double active = stream.fast_modules[
i]->time_active;
860 ModuleInfo & moduletype = * stream.fast_moduletypes[
i];
873 for (
auto & keyval: stream.paths[pid]) {
874 PathInfo & pathinfo = keyval.second;
901 if (module ==
nullptr)
927 for (
auto & keyval : stream.modules) {
936 for (
auto & keyval : stream.moduletypes) {
944 for (
unsigned int i = 0;
i <= stream.paths[
pid].size(); ++
i)
945 stream.dqm_paths[pid].interpaths->Fill(
i, stream.timing_perprocess[pid].paths_interpaths[
i] * 1000.);
949 stream.dqm.fill(stream.timing);
950 stream.dqm_perprocess[
pid].fill(stream.timing_perprocess[pid]);
956 stream.dqm_byluminosity[i].fill(stream.luminosity[i], stream.timing);
958 stream.dqm_perprocess_byluminosity[pid][i].fill(stream.luminosity[i], stream.timing_perprocess[pid]);
967 stream.timing.reset();
968 stream.timer_source.start();
972 for (
auto & keyval : stream.modules) {
973 keyval.second.timer.reset();
974 keyval.second.time_active = 0.;
975 keyval.second.run_in_path =
nullptr;
976 keyval.second.counter = 0;
978 for (
auto & keyval : stream.moduletypes) {
979 keyval.second.timer.reset();
980 keyval.second.time_active = 0.;
981 keyval.second.run_in_path =
nullptr;
982 keyval.second.counter = 0;
986 stream.timing.presource =
delta(stream.timer_last_transition, stream.timer_source.getStartTime());
991 stream.timer_source.stop();
992 stream.timer_last_transition = stream.timer_source.getStopTime();
995 stream.timing.source = stream.timer_source.seconds();
1005 auto keyval = stream.paths[
pid].find(path);
1006 if (keyval != stream.paths[pid].end()) {
1007 stream.current_path = & keyval->second;
1010 stream.current_path =
nullptr;
1011 edm::LogError(
"FastTimerService") <<
"FastTimerService::prePathEvent: unexpected path " <<
path;
1016 stream.current_path->first_module =
nullptr;
1019 stream.current_path->timer.start();
1021 if (path ==
m_process[pid].first_path) {
1023 stream.timer_paths.setStartTime(stream.current_path->timer.getStartTime());
1024 }
else if (path ==
m_process[pid].first_endpath) {
1026 stream.timer_endpaths.setStartTime(stream.current_path->timer.getStartTime());
1031 double interpaths =
delta(stream.timer_last_path, stream.current_path->timer.getStartTime());
1032 stream.timing_perprocess[
pid].interpaths += interpaths;
1033 stream.timing_perprocess[
pid].paths_interpaths[stream.current_path->index] = interpaths;
1043 if (stream.current_path ==
nullptr) {
1044 edm::LogError(
"FastTimerService") <<
"FastTimerService::postPathEvent: unexpected path " <<
path;
1049 stream.current_path->timer.stop();
1050 stream.current_path->time_active = stream.current_path->timer.seconds();
1051 stream.timer_last_path = stream.current_path->timer.getStopTime();
1053 double active = stream.current_path->time_active;
1058 PathInfo & pathinfo = * stream.current_path;
1066 double overhead = 0.;
1068 double total = active;
1076 uint32_t last_run = 0;
1078 last_run = status.
index() + 1;
1079 for (uint32_t
i = 0;
i < last_run; ++
i) {
1095 if (stream.current_path->first_module ==
nullptr) {
1103 pre =
delta(stream.current_path->timer.getStartTime(), stream.current_path->first_module->timer.getStartTime());
1104 post =
delta(stream.current_module->timer.getStopTime(), stream.current_path->timer.getStopTime());
1105 inter = active - pre - current - post;
1132 stream.timer_paths.setStopTime(stream.current_path->timer.getStopTime());
1133 stream.timing_perprocess[
pid].all_paths = stream.timer_paths.seconds();
1134 }
else if (path ==
m_process[pid].last_endpath) {
1136 stream.timer_endpaths.setStopTime(stream.current_path->timer.getStopTime());
1137 stream.timing_perprocess[
pid].all_endpaths = stream.timer_endpaths.seconds();
1147 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1156 if (md.
id() < stream.fast_modules.size()) {
1160 stream.current_module = &
module;
1162 if (stream.current_path->first_module ==
nullptr)
1163 stream.current_path->first_module = &
module;
1175 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1186 if (md.
id() < stream.fast_modules.size()) {
1204 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1223 if (md.
id() < stream.fast_modules.size()) {
1228 edm::LogError(
"FastTimerService") <<
"FastTimerService::preModuleEventDelayedGet: unexpected module " << md.
moduleLabel();
1239 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1249 if (md.
id() < stream.fast_modules.size()) {
1254 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: unexpected module " << md.
moduleLabel();
1264 std::vector<ModuleInfo *> & pathmap = stream.paths[
pid][
name].modules;
1266 pathmap.reserve( modules.size() );
1267 std::unordered_set<ModuleInfo const *>
pool;
1268 for (
auto const &
module: modules) {
1272 auto const & it = stream.modules.find(label);
1273 if (it == stream.modules.end()) {
1275 pathmap.push_back( 0 );
1276 }
else if (pool.insert(& it->second).second) {
1278 pathmap.push_back(& it->second);
1281 pathmap.push_back( 0 );
1294 return m_stream[sid].current_module->timer.secondsUntilNow();
1299 return m_stream[sid].current_path->timer.secondsUntilNow();
1304 return m_stream[sid].timer_event.secondsUntilNow();
1309 if (module.
id() <
m_stream[sid].fast_modules.size()) {
1310 return m_stream[sid].fast_modules[module.
id()]->time_active;
1312 edm::LogError(
"FastTimerService") <<
"FastTimerService::queryModuleTime: unexpected module " << module.
moduleLabel();
1319 if (
id <
m_stream[sid].fast_modules.size()) {
1320 return m_stream[sid].fast_modules[id]->time_active;
1322 edm::LogError(
"FastTimerService") <<
"FastTimerService::queryModuleTime: unexpected module id " << id;
1329 auto const & keyval =
m_stream[sid].modules.find(label);
1331 return keyval->second.time_active;
1334 edm::LogError(
"FastTimerService") <<
"FastTimerService::queryModuleTimeByLabel: unexpected module " <<
label;
1341 auto const & keyval =
m_stream[sid].moduletypes.find(type);
1342 if (keyval !=
m_stream[sid].moduletypes.end()) {
1343 return keyval->second.time_active;
1346 edm::LogError(
"FastTimerService") <<
"FastTimerService::queryModuleTimeByType: unexpected module type " <<
type;
1388 return m_stream[sid].timing.source;
1414 desc.
addUntracked<
bool>(
"enableTimingExclusive",
false);
1415 desc.
addUntracked<
bool>(
"enableTimingSummary",
false);
1418 desc.
addUntracked<
bool>(
"enableDQMbyPathActive",
false);
1419 desc.
addUntracked<
bool>(
"enableDQMbyPathTotal",
true);
1420 desc.
addUntracked<
bool>(
"enableDQMbyPathOverhead",
false);
1421 desc.
addUntracked<
bool>(
"enableDQMbyPathDetails",
false);
1422 desc.
addUntracked<
bool>(
"enableDQMbyPathCounters",
true);
1423 desc.
addUntracked<
bool>(
"enableDQMbyPathExclusive",
false);
1425 desc.
addUntracked<
bool>(
"enableDQMbyModuleType",
false);
1427 desc.
addUntracked<
bool>(
"enableDQMbyLumiSection",
false);
1428 desc.
addUntracked<
bool>(
"enableDQMbyProcesses",
false);
1432 desc.
addUntracked<
double>(
"dqmPathTimeResolution", 0.5);
1433 desc.
addUntracked<
double>(
"dqmModuleTimeRange", 40. );
1434 desc.
addUntracked<
double>(
"dqmModuleTimeResolution", 0.2);
1435 desc.
addUntracked<uint32_t>(
"dqmLumiSectionsRange", 2500 );
1437 descriptions.
add(
"FastTimerService", desc);
1443 unsigned int pid = 0;
void preGlobalBeginRun(edm::GlobalContext const &)
void preModuleEventDelayedGet(edm::StreamContext const &, edm::ModuleCallingContext const &)
std::string const & pathName() const
unsigned int maxNumberOfThreads() const
T getUntrackedParameter(std::string const &, T const &) const
void postStreamBeginRun(edm::StreamContext const &)
void watchPreEvent(PreEvent::slot_type const &iSlot)
double queryEventTime(edm::StreamID) const
const double m_dqm_eventtime_resolution
Strings const & getTrigPathModules(std::string const &name) const
void postStreamEndLumi(edm::StreamContext const &)
std::string const & processName() const
std::string const & getTrigPath(size_type const i) const
void watchPrePathEvent(PrePathEvent::slot_type const &iSlot)
void watchPreallocate(Preallocate::slot_type const &iSlot)
static double delta(FastTimer::Clock::time_point const &first, FastTimer::Clock::time_point const &second)
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
bool m_enable_timing_modules
void watchPostEndJob(PostEndJob::slot_type const &iSlot)
Strings const & getEndPaths() const
unsigned int m_concurrent_streams
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
void postModuleEvent(edm::StreamContext const &, edm::ModuleCallingContext const &)
bool wasrun() const
was this path run?
static boost::mutex mutex
void watchPreModuleEvent(PreModuleEvent::slot_type const &iSlot)
double summary_postmodules
const bool m_enable_dqm_bypath_counters
const bool m_skip_first_path
void watchPostEvent(PostEvent::slot_type const &iSlot)
const bool m_enable_dqm_bypath_exclusive
LuminosityBlockID const & luminosityBlockID() const
void printSummary(Timing const &summary, std::string const &label) const
std::vector< ProcessDescription > m_process
void watchPostStreamEndLumi(PostStreamEndLumi::slot_type const &iSlot)
const double m_dqm_pathtime_range
std::string const & moduleName() const
void watchPostPathEvent(PostPathEvent::slot_type const &iSlot)
void watchPostModuleEvent(PostModuleEvent::slot_type const &iSlot)
double currentPathTime(edm::StreamID) const
void watchPostSourceEvent(PostSourceEvent::slot_type const &iSlot)
std::vector< TimingPerProcess > m_job_summary_perprocess
RunIndex const & runIndex() const
string format
Some error handling for the usage.
void postPathEvent(edm::StreamContext const &, edm::PathContext const &, edm::HLTPathStatus const &)
unsigned int m_concurrent_threads
LuminosityBlockNumber_t luminosityBlock() const
std::string const & moduleLabel() const
static unsigned int getUniqueID()
Returns a unique id each time called. Intended to be passed to ModuleDescription's constructor's modI...
ProcessContext const & parentProcessContext() const
unsigned int m_concurrent_runs
void postStreamBeginLumi(edm::StreamContext const &)
RunIndex const & runIndex() const
unsigned int maxNumberOfStreams() const
void preModuleBeginJob(edm::ModuleDescription const &)
const bool m_enable_dqm_bynproc
Strings const & getEndPathModules(std::string const &name) const
bool m_enable_timing_paths
size_type findTrigPath(std::string const &name) const
std::vector< LuminosityDescription > m_dqm_luminosity
tuple path
else: Piece not in the list, fine.
void prePathEvent(edm::StreamContext const &, edm::PathContext const &)
const bool m_enable_dqm_byls
void watchPostStreamBeginLumi(PostStreamBeginLumi::slot_type const &iSlot)
const double m_dqm_moduletime_resolution
std::mutex m_summary_mutex
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
FastTimerService(const edm::ParameterSet &, edm::ActivityRegistry &)
double queryModuleTimeByLabel(edm::StreamID, const std::string &) const
double currentEventTime(edm::StreamID) const
void watchPreModuleEventDelayedGet(PreModuleEventDelayedGet::slot_type const &iSlot)
void postEvent(edm::StreamContext const &)
void postGlobalEndRun(edm::GlobalContext const &)
void setLuminosity(unsigned int stream_id, unsigned int luminosity_id, double value)
ModuleDescription const * moduleDescription() const
std::vector< std::vector< TimingPerProcess > > m_run_summary_perprocess
void postStreamEndRun(edm::StreamContext const &)
void preModuleEvent(edm::StreamContext const &, edm::ModuleCallingContext const &)
Abs< T >::type abs(const T &t)
const bool m_enable_dqm_bypath_details
std::vector< Timing > m_run_summary
void fillPathMap(unsigned int pid, std::string const &name, std::vector< std::string > const &modules)
ProcessContext const * processContext() const
const bool m_enable_dqm_bypath_overhead
size_type findEndPath(std::string const &name) const
void watchPreModuleBeginJob(PreModuleBeginJob::slot_type const &iSlot)
void watchPostStreamEndRun(PostStreamEndRun::slot_type const &iSlot)
void mergeAndResetMEsRunSummaryCache(uint32_t run, uint32_t streamId, uint32_t moduleId)
StreamID const & streamID() const
void watchPreGlobalBeginRun(PreGlobalBeginRun::slot_type const &iSlot)
const bool m_enable_dqm_bymodule
void postModuleEventDelayedGet(edm::StreamContext const &, edm::ModuleCallingContext const &)
const double m_dqm_moduletime_range
unsigned int value() const
void watchPostModuleEventDelayedGet(PostModuleEventDelayedGet::slot_type const &iSlot)
bool m_enable_timing_exclusive
double querySourceTime(edm::StreamID) const
void watchPostGlobalEndRun(PostGlobalEndRun::slot_type const &iSlot)
void preSourceEvent(edm::StreamID)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void preEvent(edm::StreamContext const &)
const bool m_enable_timing_summary
bool accept() const
has this path accepted the event?
ProcessContext const * processContext() const
void postSourceEvent(edm::StreamID)
const bool m_enable_dqm_bymoduletype
const bool m_enable_dqm_summary
void watchPostStreamBeginRun(PostStreamBeginRun::slot_type const &iSlot)
double queryModuleTimeByType(edm::StreamID, const std::string &) const
double summary_premodules
std::string const & getEndPath(size_type const i) const
const bool m_enable_dqm_bypath_total
void watchPreStreamBeginRun(PreStreamBeginRun::slot_type const &iSlot)
Strings const & getTrigPaths() const
double queryModuleTime(edm::StreamID, const edm::ModuleDescription &) const
const bool m_enable_dqm_bypath_active
unsigned int maxNumberOfConcurrentRuns() const
std::vector< ModuleInfo * > modules
double summary_intermodules
EventID const & eventID() const
void watchPreSourceEvent(PreSourceEvent::slot_type const &iSlot)
TH1F * dqm_module_counter
static unsigned int processID(edm::ProcessContext const *)
double currentModuleTime(edm::StreamID) const
void mergeAndResetMEsLuminositySummaryCache(uint32_t run, uint32_t lumi, uint32_t streamId, uint32_t moduleId)
void preStreamBeginRun(edm::StreamContext const &)
std::vector< StreamData > m_stream
bool isSubProcess() const
tuple size
Write out results.
unsigned int reserveLuminosityPlots(std::string const &name, std::string const &title, std::string const &label, double range, double resolution)
void printProcessSummary(Timing const &total, TimingPerProcess const &summary, std::string const &label, std::string const &process) const
void preallocate(edm::service::SystemBounds const &)
const double m_dqm_eventtime_range
const double m_dqm_pathtime_resolution
unsigned int index() const