12 #include <unordered_set>
13 #include <unordered_map>
16 #include <boost/format.hpp>
41 for (
unsigned int i = dups.size();
i <
size; ++
i)
49 m_use_realtime( config.getUntrackedParameter<bool>(
"useRealTimeClock" ) ),
50 m_enable_timing_paths( config.getUntrackedParameter<bool>(
"enableTimingPaths" ) ),
51 m_enable_timing_modules( config.getUntrackedParameter<bool>(
"enableTimingModules" ) ),
52 m_enable_timing_exclusive( config.getUntrackedParameter<bool>(
"enableTimingExclusive" ) ),
53 m_enable_timing_summary( config.getUntrackedParameter<bool>(
"enableTimingSummary" ) ),
54 m_skip_first_path( config.getUntrackedParameter<bool>(
"skipFirstPath" ) ),
56 m_enable_dqm( config.getUntrackedParameter<bool>(
"enableDQM" ) ),
57 m_enable_dqm_bypath_active( config.getUntrackedParameter<bool>(
"enableDQMbyPathActive" ) ),
58 m_enable_dqm_bypath_total( config.getUntrackedParameter<bool>(
"enableDQMbyPathTotal" ) ),
59 m_enable_dqm_bypath_overhead( config.getUntrackedParameter<bool>(
"enableDQMbyPathOverhead" ) ),
60 m_enable_dqm_bypath_details( config.getUntrackedParameter<bool>(
"enableDQMbyPathDetails" ) ),
61 m_enable_dqm_bypath_counters( config.getUntrackedParameter<bool>(
"enableDQMbyPathCounters" ) ),
62 m_enable_dqm_bypath_exclusive( config.getUntrackedParameter<bool>(
"enableDQMbyPathExclusive" ) ),
63 m_enable_dqm_bymodule( config.getUntrackedParameter<bool>(
"enableDQMbyModule" ) ),
64 m_enable_dqm_bymoduletype( config.getUntrackedParameter<bool>(
"enableDQMbyModuleType" ) ),
65 m_enable_dqm_summary( config.getUntrackedParameter<bool>(
"enableDQMSummary" ) ),
66 m_enable_dqm_byls( config.getUntrackedParameter<bool>(
"enableDQMbyLumiSection" ) ),
67 m_enable_dqm_bynproc( config.getUntrackedParameter<bool>(
"enableDQMbyProcesses" ) ),
69 m_concurrent_runs( 0 ),
70 m_concurrent_streams( 0 ),
71 m_concurrent_threads( 0 ),
72 m_module_id( edm::ModuleDescription::invalidID() ),
73 m_dqm_eventtime_range( config.getUntrackedParameter<double>(
"dqmTimeRange" ) ),
74 m_dqm_eventtime_resolution( config.getUntrackedParameter<double>(
"dqmTimeResolution" ) ),
75 m_dqm_pathtime_range( config.getUntrackedParameter<double>(
"dqmPathTimeRange" ) ),
76 m_dqm_pathtime_resolution( config.getUntrackedParameter<double>(
"dqmPathTimeResolution" ) ),
77 m_dqm_moduletime_range( config.getUntrackedParameter<double>(
"dqmModuleTimeRange" ) ),
78 m_dqm_moduletime_resolution( config.getUntrackedParameter<double>(
"dqmModuleTimeResolution" ) ),
79 m_dqm_path( config.getUntrackedParameter<std::
string>(
"dqmPath" ) ),
80 m_is_first_event(
true),
90 m_run_summary_perprocess(),
91 m_job_summary_perprocess()
215 uint32_t
size = size_p + size_e;
218 if (stream.paths.size() <=
pid)
219 stream.paths.resize(pid+1);
220 for (uint32_t
i = 0;
i < size_p; ++
i) {
222 for (
auto & stream: m_stream)
225 for (uint32_t
i = 0;
i < size_e; ++
i) {
227 for (
auto & stream: m_stream)
228 stream.paths[
pid][
label].index = size_p +
i;
230 for (
auto & stream: m_stream) {
232 if (stream.timing_perprocess.size() <=
pid)
233 stream.timing_perprocess.resize(pid+1);
234 stream.timing_perprocess[
pid].paths_interpaths.assign(size + 1, 0.);
236 if (stream.dqm_perprocess.size() <=
pid)
237 stream.dqm_perprocess.resize(pid+1);
238 if (stream.dqm_perprocess_byluminosity.size() <=
pid)
239 stream.dqm_perprocess_byluminosity.resize(pid+1);
240 if (stream.dqm_paths.size() <=
pid)
241 stream.dqm_paths.resize(pid+1);
246 summary[
pid].paths_interpaths.assign(size + 1, 0);
255 m_run_summary_perprocess[rid][
pid].reset();
276 m_enable_dqm =
false;
283 uint32_t
size = size_p + size_e;
297 stream.dqm.presource = booker.book1D(
"presource",
"Pre-Source processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
298 stream.dqm.presource ->StatOverflows(
true);
299 stream.dqm.presource ->SetXTitle(
"processing time [ms]");
300 stream.dqm.source = booker.book1D(
"source",
"Source processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
301 stream.dqm.source ->StatOverflows(
true);
302 stream.dqm.source ->SetXTitle(
"processing time [ms]");
303 stream.dqm.preevent = booker.book1D(
"preevent",
"Pre-Event processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
304 stream.dqm.preevent ->StatOverflows(
true);
305 stream.dqm.preevent ->SetXTitle(
"processing time [ms]");
306 stream.dqm.event = booker.book1D(
"event",
"Event processing time", eventbins, 0.,
m_dqm_eventtime_range)->getTH1F();
307 stream.dqm.event ->StatOverflows(
true);
308 stream.dqm.event ->SetXTitle(
"processing time [ms]");
312 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name);
313 stream.dqm_perprocess[
pid].preevent = booker.book1D(
"preevent",
"Pre-Event processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
314 stream.dqm_perprocess[
pid].preevent ->StatOverflows(
true);
315 stream.dqm_perprocess[
pid].preevent ->SetXTitle(
"processing time [ms]");
316 stream.dqm_perprocess[
pid].event = booker.book1D(
"event",
"Event processing time", eventbins, 0.,
m_dqm_eventtime_range)->getTH1F();
317 stream.dqm_perprocess[
pid].event ->StatOverflows(
true);
318 stream.dqm_perprocess[
pid].event ->SetXTitle(
"processing time [ms]");
319 stream.dqm_perprocess[
pid].all_paths = booker.book1D(
"all_paths",
"Paths processing time", eventbins, 0.,
m_dqm_eventtime_range)->getTH1F();
320 stream.dqm_perprocess[
pid].all_paths ->StatOverflows(
true);
321 stream.dqm_perprocess[
pid].all_paths ->SetXTitle(
"processing time [ms]");
322 stream.dqm_perprocess[
pid].all_endpaths = booker.book1D(
"all_endpaths",
"EndPaths processing time", pathbins, 0.,
m_dqm_pathtime_range)->getTH1F();
323 stream.dqm_perprocess[
pid].all_endpaths ->StatOverflows(
true);
324 stream.dqm_perprocess[
pid].all_endpaths ->SetXTitle(
"processing time [ms]");
325 stream.dqm_perprocess[
pid].interpaths = booker.book1D(
"interpaths",
"Time spent between paths", pathbins, 0.,
m_dqm_eventtime_range)->getTH1F();
326 stream.dqm_perprocess[
pid].interpaths ->StatOverflows(
true);
327 stream.dqm_perprocess[
pid].interpaths ->SetXTitle(
"processing time [ms]");
332 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name);
333 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();
334 stream.dqm_paths[
pid].active_time ->StatOverflows(
true);
335 stream.dqm_paths[
pid].active_time ->SetYTitle(
"processing time [ms]");
336 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();
337 stream.dqm_paths[
pid].total_time ->StatOverflows(
true);
338 stream.dqm_paths[
pid].total_time ->SetYTitle(
"processing time [ms]");
339 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();
340 stream.dqm_paths[
pid].exclusive_time ->StatOverflows(
true);
341 stream.dqm_paths[
pid].exclusive_time ->SetYTitle(
"processing time [ms]");
342 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();
343 stream.dqm_paths[
pid].interpaths ->StatOverflows(
true);
344 stream.dqm_paths[
pid].interpaths ->SetYTitle(
"processing time [ms]");
346 for (uint32_t
i = 0;
i < size_p; ++
i) {
348 stream.dqm_paths[
pid].active_time ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
349 stream.dqm_paths[
pid].total_time ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
350 stream.dqm_paths[
pid].exclusive_time ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
351 stream.dqm_paths[
pid].interpaths ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
353 for (uint32_t
i = 0;
i < size_e; ++
i) {
355 stream.dqm_paths[
pid].active_time ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
356 stream.dqm_paths[
pid].total_time ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
357 stream.dqm_paths[
pid].exclusive_time ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
358 stream.dqm_paths[
pid].interpaths ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
371 auto &
plots = stream.dqm_byluminosity[
i];
374 plots.presource ->StatOverflows(
true);
376 plots.presource ->SetYTitle(
"processing time [ms]");
378 plots.source ->StatOverflows(
true);
380 plots.source ->SetYTitle(
"processing time [ms]");
382 plots.preevent ->StatOverflows(
true);
384 plots.preevent ->SetYTitle(
"processing time [ms]");
386 plots.event ->StatOverflows(
true);
388 plots.event ->SetYTitle(
"processing time [ms]");
396 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name);
398 auto &
plots = stream.dqm_perprocess_byluminosity[
pid][
i];
401 plots.preevent ->StatOverflows(
true);
403 plots.preevent ->SetYTitle(
"processing time [ms]");
405 plots.event ->StatOverflows(
true);
407 plots.event ->SetYTitle(
"processing time [ms]");
409 plots.all_paths ->StatOverflows(
true);
411 plots.all_paths ->SetYTitle(
"processing time [ms]");
413 plots.all_endpaths ->StatOverflows(
true);
415 plots.all_endpaths ->SetYTitle(
"processing time [ms]");
417 plots.interpaths ->StatOverflows(
true);
419 plots.interpaths ->SetYTitle(
"processing time [ms]");
425 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name +
"/Paths");
426 for (
auto & keyval: stream.paths[pid]) {
428 PathInfo & pathinfo = keyval.second;
433 pathinfo.
dqm_active ->SetXTitle(
"processing time [ms]");
438 pathinfo.
dqm_total ->StatOverflows(
true);
439 pathinfo.
dqm_total ->SetXTitle(
"processing time [ms]");
454 pathinfo.
dqm_overhead ->SetXTitle(
"processing time [ms]");
464 std::vector<std::string>();
466 static std::vector<std::string> dup;
467 if (modules.size() > dup.size())
470 std::vector<const char *>
labels(modules.size(),
nullptr);
471 for (uint32_t
i = 0;
i < modules.size(); ++
i)
475 if (m_enable_dqm_bypath_counters) {
476 pathinfo.
dqm_module_counter = booker.book1D(pathname +
"_module_counter", pathname +
" module counter", modules.size(), -0.5, modules.size() - 0.5)->getTH1F();
478 for (uint32_t
i = 0;
i < modules.size(); ++
i) {
484 pathinfo.
dqm_module_active = booker.book1D(pathname +
"_module_active", pathname +
" module active", modules.size(), -0.5, modules.size() - 0.5)->getTH1F();
486 pathinfo.
dqm_module_total = booker.book1D(pathname +
"_module_total", pathname +
" module total", modules.size(), -0.5, modules.size() - 0.5)->getTH1F();
489 for (uint32_t
i = 0;
i < modules.size(); ++
i) {
507 booker.setCurrentFolder(
m_dqm_path +
"/Modules");
508 for (
auto & keyval: stream.modules) {
513 module.
dqm_active->SetXTitle(
"processing time [ms]");
518 booker.setCurrentFolder(
m_dqm_path +
"/ModuleTypes");
519 for (
auto & keyval: stream.moduletypes) {
524 module.
dqm_active->SetXTitle(
"processing time [ms]");
553 stream.fast_moduletypes.resize(
m_module_id,
nullptr);
557 for (
auto & stream: m_stream)
631 std::ostringstream
out;
632 out << std::fixed << std::setprecision(6);
633 out <<
"FastReport for " << label <<
", process " << process <<
'\n';
635 out <<
"FastReport " << std::right << std::setw(10) << summary.
preevent / (double) total.
count <<
" Pre-Event" <<
'\n';
636 out <<
"FastReport " << std::right << std::setw(10) << summary.
event / (double) total.
count <<
" Event" <<
'\n';
637 out <<
"FastReport " << std::right << std::setw(10) << summary.
all_paths / (double) total.
count <<
" all Paths" <<
'\n';
638 out <<
"FastReport " << std::right << std::setw(10) << summary.
all_endpaths / (double) total.
count <<
" all EndPaths" <<
'\n';
639 out <<
"FastReport " << std::right << std::setw(10) << summary.
interpaths / (double) total.
count <<
" between paths" <<
'\n';
649 std::ostringstream
out;
650 out << std::fixed << std::setprecision(6);
651 out <<
"FastReport for " << label <<
", over all subprocesses" <<
'\n';
653 out <<
"FastReport " << std::right << std::setw(10) << summary.
presource / (double) summary.
count <<
" Pre-Source" <<
'\n';
654 out <<
"FastReport " << std::right << std::setw(10) << summary.
source / (double) summary.
count <<
" Source" <<
'\n';
655 out <<
"FastReport " << std::right << std::setw(10) << summary.
preevent / (double) summary.
count <<
" Pre-Event" <<
'\n';
656 out <<
"FastReport " << std::right << std::setw(10) << summary.
event / (double) summary.
count <<
" Event" <<
'\n';
728 if (module.
id() >= stream.fast_modules.size())
729 stream.fast_modules.resize(module.
id() + 1,
nullptr);
730 if (module.
id() >= stream.fast_moduletypes.size())
731 stream.fast_moduletypes.resize(module.
id() + 1,
nullptr);
733 stream.fast_modules[module.
id()] = & stream.modules[module.
moduleLabel()];;
734 stream.fast_moduletypes[module.
id()] = & stream.moduletypes[module.
moduleName()];
744 stream.timer_event.start();
747 stream.timing_perprocess[
pid].preevent =
delta(stream.timer_last_transition, stream.timer_event.getStartTime());
750 stream.timing_perprocess[
pid].event = 0;
751 stream.timing_perprocess[
pid].all_paths = 0;
752 stream.timing_perprocess[
pid].all_endpaths = 0;
753 stream.timing_perprocess[
pid].interpaths = 0;
754 stream.timing_perprocess[
pid].paths_interpaths.assign(stream.paths[pid].size() + 1, 0);
755 for (
auto & keyval : stream.paths[pid]) {
756 keyval.second.timer.reset();
757 keyval.second.time_active = 0.;
758 keyval.second.time_exclusive = 0.;
759 keyval.second.time_premodules = 0.;
760 keyval.second.time_intermodules = 0.;
761 keyval.second.time_postmodules = 0.;
762 keyval.second.time_total = 0.;
767 stream.timer_last_path = stream.timer_event.getStartTime();
781 stream.timer_event.stop();
782 stream.timer_last_transition = stream.timer_event.getStopTime();
783 stream.timing_perprocess[
pid].event = stream.timer_event.seconds();
786 double interpaths =
delta(stream.timer_last_path, stream.timer_event.getStopTime());
787 stream.timing_perprocess[
pid].interpaths += interpaths;
788 stream.timing_perprocess[
pid].paths_interpaths.back() = interpaths;
796 stream.timing.count = 1;
797 stream.timing.preevent = stream.timing_perprocess[0].preevent;
798 stream.timing.event = stream.timing_perprocess[0].event;
800 stream.timing.event += stream.timing_perprocess[
i].preevent;
801 stream.timing.event += stream.timing_perprocess[
i].event;
809 for (
auto & keyval: stream.paths[pid]) {
810 PathInfo & pathinfo = keyval.second;
828 for (
unsigned int i = 0;
i < stream.fast_modules.size(); ++
i)
830 if (stream.fast_modules[
i]) {
831 double active = stream.fast_modules[
i]->time_active;
832 ModuleInfo & moduletype = * stream.fast_moduletypes[
i];
848 for (
auto & keyval: stream.paths[pid]) {
849 PathInfo & pathinfo = keyval.second;
876 if (module ==
nullptr)
902 for (
auto & keyval : stream.modules) {
911 for (
auto & keyval : stream.moduletypes) {
919 for (
unsigned int i = 0;
i <= stream.paths[
pid].size(); ++
i)
920 stream.dqm_paths[pid].interpaths->Fill(
i, stream.timing_perprocess[pid].paths_interpaths[
i] * 1000.);
924 stream.dqm.fill(stream.timing);
925 stream.dqm_perprocess[
pid].fill(stream.timing_perprocess[pid]);
931 stream.dqm_byluminosity[i].fill(stream.luminosity[i], stream.timing);
933 stream.dqm_perprocess_byluminosity[pid][i].fill(stream.luminosity[i], stream.timing_perprocess[pid]);
942 stream.timing.reset();
943 stream.timer_source.start();
947 for (
auto & keyval : stream.modules) {
948 keyval.second.timer.reset();
949 keyval.second.time_active = 0.;
950 keyval.second.run_in_path =
nullptr;
951 keyval.second.counter = 0;
953 for (
auto & keyval : stream.moduletypes) {
954 keyval.second.timer.reset();
955 keyval.second.time_active = 0.;
956 keyval.second.run_in_path =
nullptr;
957 keyval.second.counter = 0;
961 stream.timing.presource =
delta(stream.timer_last_transition, stream.timer_source.getStartTime());
966 stream.timer_source.stop();
967 stream.timer_last_transition = stream.timer_source.getStopTime();
970 stream.timing.source = stream.timer_source.seconds();
980 auto keyval = stream.paths[
pid].find(path);
981 if (keyval != stream.paths[pid].end()) {
982 stream.current_path = & keyval->second;
985 stream.current_path =
nullptr;
986 edm::LogError(
"FastTimerService") <<
"FastTimerService::prePathEvent: unexpected path " <<
path;
991 stream.current_path->first_module =
nullptr;
994 stream.current_path->timer.start();
998 stream.timer_paths.setStartTime(stream.current_path->timer.getStartTime());
999 }
else if (path ==
m_process[pid].first_endpath) {
1001 stream.timer_endpaths.setStartTime(stream.current_path->timer.getStartTime());
1006 double interpaths =
delta(stream.timer_last_path, stream.current_path->timer.getStartTime());
1007 stream.timing_perprocess[
pid].interpaths += interpaths;
1008 stream.timing_perprocess[
pid].paths_interpaths[stream.current_path->index] = interpaths;
1018 if (stream.current_path ==
nullptr) {
1019 edm::LogError(
"FastTimerService") <<
"FastTimerService::postPathEvent: unexpected path " <<
path;
1024 stream.current_path->timer.stop();
1025 stream.current_path->time_active = stream.current_path->timer.seconds();
1026 stream.timer_last_path = stream.current_path->timer.getStopTime();
1028 double active = stream.current_path->time_active;
1033 PathInfo & pathinfo = * stream.current_path;
1041 double overhead = 0.;
1043 double total = active;
1051 uint32_t last_run = 0;
1053 last_run = status.
index() + 1;
1054 for (uint32_t
i = 0;
i < last_run; ++
i) {
1070 if (stream.current_path->first_module ==
nullptr) {
1078 pre =
delta(stream.current_path->timer.getStartTime(), stream.current_path->first_module->timer.getStartTime());
1079 post =
delta(stream.current_module->timer.getStopTime(), stream.current_path->timer.getStopTime());
1080 inter = active - pre - current - post;
1107 stream.timer_paths.setStopTime(stream.current_path->timer.getStopTime());
1108 stream.timing_perprocess[
pid].all_paths = stream.timer_paths.seconds();
1109 }
else if (path ==
m_process[pid].last_endpath) {
1111 stream.timer_endpaths.setStopTime(stream.current_path->timer.getStopTime());
1112 stream.timing_perprocess[
pid].all_endpaths = stream.timer_endpaths.seconds();
1122 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1131 if (md.
id() < stream.fast_modules.size()) {
1135 stream.current_module = &
module;
1137 if (stream.current_path->first_module ==
nullptr)
1138 stream.current_path->first_module = &
module;
1150 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1161 if (md.
id() < stream.fast_modules.size()) {
1179 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1198 if (md.
id() < stream.fast_modules.size()) {
1203 edm::LogError(
"FastTimerService") <<
"FastTimerService::preModuleEventDelayedGet: unexpected module " << md.
moduleLabel();
1214 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1224 if (md.
id() < stream.fast_modules.size()) {
1229 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: unexpected module " << md.
moduleLabel();
1239 std::vector<ModuleInfo *> & pathmap = stream.paths[
pid][
name].modules;
1241 pathmap.reserve( modules.size() );
1242 std::unordered_set<ModuleInfo const *>
pool;
1243 for (
auto const &
module: modules) {
1247 auto const & it = stream.modules.find(label);
1248 if (it == stream.modules.end()) {
1250 pathmap.push_back( 0 );
1251 }
else if (pool.insert(& it->second).second) {
1253 pathmap.push_back(& it->second);
1256 pathmap.push_back( 0 );
1269 return m_stream[sid].current_module->timer.secondsUntilNow();
1274 return m_stream[sid].current_path->timer.secondsUntilNow();
1279 return m_stream[sid].timer_event.secondsUntilNow();
1284 if (module.
id() <
m_stream[sid].fast_modules.size()) {
1285 return m_stream[sid].fast_modules[module.
id()]->time_active;
1287 edm::LogError(
"FastTimerService") <<
"FastTimerService::queryModuleTime: unexpected module " << module.
moduleLabel();
1294 if (
id <
m_stream[sid].fast_modules.size()) {
1295 return m_stream[sid].fast_modules[id]->time_active;
1297 edm::LogError(
"FastTimerService") <<
"FastTimerService::queryModuleTime: unexpected module id " << id;
1304 auto const & keyval =
m_stream[sid].modules.find(label);
1305 if (keyval !=
m_stream[sid].modules.end()) {
1306 return keyval->second.time_active;
1309 edm::LogError(
"FastTimerService") <<
"FastTimerService::queryModuleTimeByLabel: unexpected module " <<
label;
1316 auto const & keyval =
m_stream[sid].moduletypes.find(type);
1317 if (keyval !=
m_stream[sid].moduletypes.end()) {
1318 return keyval->second.time_active;
1321 edm::LogError(
"FastTimerService") <<
"FastTimerService::queryModuleTimeByType: unexpected module type " <<
type;
1363 return m_stream[sid].timing.source;
1389 desc.
addUntracked<
bool>(
"enableTimingExclusive",
false);
1390 desc.
addUntracked<
bool>(
"enableTimingSummary",
false);
1393 desc.
addUntracked<
bool>(
"enableDQMbyPathActive",
false);
1394 desc.
addUntracked<
bool>(
"enableDQMbyPathTotal",
true);
1395 desc.
addUntracked<
bool>(
"enableDQMbyPathOverhead",
false);
1396 desc.
addUntracked<
bool>(
"enableDQMbyPathDetails",
false);
1397 desc.
addUntracked<
bool>(
"enableDQMbyPathCounters",
true);
1398 desc.
addUntracked<
bool>(
"enableDQMbyPathExclusive",
false);
1400 desc.
addUntracked<
bool>(
"enableDQMbyModuleType",
false);
1402 desc.
addUntracked<
bool>(
"enableDQMbyLuminosity",
false)->setComment(
"deprecated: this parameter is ignored");
1403 desc.
addUntracked<
bool>(
"enableDQMbyLumiSection",
false);
1404 desc.
addUntracked<
bool>(
"enableDQMbyProcesses",
false);
1408 desc.
addUntracked<
double>(
"dqmPathTimeResolution", 0.5);
1409 desc.
addUntracked<
double>(
"dqmModuleTimeRange", 40. );
1410 desc.
addUntracked<
double>(
"dqmModuleTimeResolution", 0.2);
1411 desc.
addUntracked<
double>(
"dqmLuminosityRange", 1.e34 )->setComment(
"deprecated: this parameter is ignored");
1412 desc.
addUntracked<
double>(
"dqmLuminosityResolution", 1.e31 )->setComment(
"deprecated: this parameter is ignored");
1413 desc.
addUntracked<uint32_t>(
"dqmLumiSectionsRange", 2500 );
1416 desc.
addUntracked<std::vector<unsigned int> >(
"supportedProcesses", { })->setComment(
"deprecated: this parameter is ignored");
1417 descriptions.
add(
"FastTimerService", desc);
1423 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)
static void fill_dups(std::vector< std::string > &dups, unsigned int size)
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?
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
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
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 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
get index of module giving the status of this path