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()
190 uint32_t
size = size_p + size_e;
193 if (stream.paths.size() <=
pid)
194 stream.paths.resize(pid+1);
195 for (uint32_t
i = 0;
i < size_p; ++
i) {
197 for (
auto & stream: m_stream)
200 for (uint32_t
i = 0;
i < size_e; ++
i) {
202 for (
auto & stream: m_stream)
203 stream.paths[
pid][
label].index = size_p +
i;
205 for (
auto & stream: m_stream) {
207 if (stream.timing_perprocess.size() <=
pid)
208 stream.timing_perprocess.resize(pid+1);
209 stream.timing_perprocess[
pid].paths_interpaths.assign(size + 1, 0.);
211 if (stream.dqm_perprocess.size() <=
pid)
212 stream.dqm_perprocess.resize(pid+1);
213 if (stream.dqm_perprocess_byluminosity.size() <=
pid)
214 stream.dqm_perprocess_byluminosity.resize(pid+1);
215 if (stream.dqm_paths.size() <=
pid)
216 stream.dqm_paths.resize(pid+1);
221 summary[
pid].paths_interpaths.assign(size + 1, 0);
230 m_run_summary_perprocess[
rid][
pid].reset();
258 m_enable_dqm =
false;
265 uint32_t
size = size_p + size_e;
279 stream.dqm.presource = booker.book1D(
"presource",
"Pre-Source processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
280 stream.dqm.presource ->StatOverflows(
true);
281 stream.dqm.presource ->SetXTitle(
"processing time [ms]");
282 stream.dqm.source = booker.book1D(
"source",
"Source processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
283 stream.dqm.source ->StatOverflows(
true);
284 stream.dqm.source ->SetXTitle(
"processing time [ms]");
285 stream.dqm.preevent = booker.book1D(
"preevent",
"Pre-Event processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
286 stream.dqm.preevent ->StatOverflows(
true);
287 stream.dqm.preevent ->SetXTitle(
"processing time [ms]");
288 stream.dqm.event = booker.book1D(
"event",
"Event processing time", eventbins, 0.,
m_dqm_eventtime_range)->getTH1F();
289 stream.dqm.event ->StatOverflows(
true);
290 stream.dqm.event ->SetXTitle(
"processing time [ms]");
294 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name);
295 stream.dqm_perprocess[
pid].preevent = booker.book1D(
"preevent",
"Pre-Event processing time", modulebins, 0.,
m_dqm_moduletime_range)->getTH1F();
296 stream.dqm_perprocess[
pid].preevent ->StatOverflows(
true);
297 stream.dqm_perprocess[
pid].preevent ->SetXTitle(
"processing time [ms]");
298 stream.dqm_perprocess[
pid].event = booker.book1D(
"event",
"Event processing time", eventbins, 0.,
m_dqm_eventtime_range)->getTH1F();
299 stream.dqm_perprocess[
pid].event ->StatOverflows(
true);
300 stream.dqm_perprocess[
pid].event ->SetXTitle(
"processing time [ms]");
301 stream.dqm_perprocess[
pid].all_paths = booker.book1D(
"all_paths",
"Paths processing time", eventbins, 0.,
m_dqm_eventtime_range)->getTH1F();
302 stream.dqm_perprocess[
pid].all_paths ->StatOverflows(
true);
303 stream.dqm_perprocess[
pid].all_paths ->SetXTitle(
"processing time [ms]");
304 stream.dqm_perprocess[
pid].all_endpaths = booker.book1D(
"all_endpaths",
"EndPaths processing time", pathbins, 0.,
m_dqm_pathtime_range)->getTH1F();
305 stream.dqm_perprocess[
pid].all_endpaths ->StatOverflows(
true);
306 stream.dqm_perprocess[
pid].all_endpaths ->SetXTitle(
"processing time [ms]");
307 stream.dqm_perprocess[
pid].interpaths = booker.book1D(
"interpaths",
"Time spent between paths", pathbins, 0.,
m_dqm_eventtime_range)->getTH1F();
308 stream.dqm_perprocess[
pid].interpaths ->StatOverflows(
true);
309 stream.dqm_perprocess[
pid].interpaths ->SetXTitle(
"processing time [ms]");
314 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name);
315 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();
316 stream.dqm_paths[
pid].active_time ->StatOverflows(
true);
317 stream.dqm_paths[
pid].active_time ->SetYTitle(
"processing time [ms]");
318 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();
319 stream.dqm_paths[
pid].total_time ->StatOverflows(
true);
320 stream.dqm_paths[
pid].total_time ->SetYTitle(
"processing time [ms]");
321 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();
322 stream.dqm_paths[
pid].exclusive_time ->StatOverflows(
true);
323 stream.dqm_paths[
pid].exclusive_time ->SetYTitle(
"processing time [ms]");
324 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();
325 stream.dqm_paths[
pid].interpaths ->StatOverflows(
true);
326 stream.dqm_paths[
pid].interpaths ->SetYTitle(
"processing time [ms]");
328 for (uint32_t
i = 0;
i < size_p; ++
i) {
330 stream.dqm_paths[
pid].active_time ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
331 stream.dqm_paths[
pid].total_time ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
332 stream.dqm_paths[
pid].exclusive_time ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
333 stream.dqm_paths[
pid].interpaths ->GetXaxis()->SetBinLabel(
i + 1, label.c_str());
335 for (uint32_t
i = 0;
i < size_e; ++
i) {
337 stream.dqm_paths[
pid].active_time ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
338 stream.dqm_paths[
pid].total_time ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
339 stream.dqm_paths[
pid].exclusive_time ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
340 stream.dqm_paths[
pid].interpaths ->GetXaxis()->SetBinLabel(
i + size_p + 1, label.c_str());
342 stream.dqm_paths[
pid].interpaths ->GetXaxis()->SetBinLabel(size+1,
"");
354 auto &
plots = stream.dqm_byluminosity[
i];
357 plots.presource ->StatOverflows(
true);
359 plots.presource ->SetYTitle(
"processing time [ms]");
361 plots.source ->StatOverflows(
true);
363 plots.source ->SetYTitle(
"processing time [ms]");
365 plots.preevent ->StatOverflows(
true);
367 plots.preevent ->SetYTitle(
"processing time [ms]");
369 plots.event ->StatOverflows(
true);
371 plots.event ->SetYTitle(
"processing time [ms]");
379 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name);
381 auto &
plots = stream.dqm_perprocess_byluminosity[
pid][
i];
384 plots.preevent ->StatOverflows(
true);
386 plots.preevent ->SetYTitle(
"processing time [ms]");
388 plots.event ->StatOverflows(
true);
390 plots.event ->SetYTitle(
"processing time [ms]");
392 plots.all_paths ->StatOverflows(
true);
394 plots.all_paths ->SetYTitle(
"processing time [ms]");
396 plots.all_endpaths ->StatOverflows(
true);
398 plots.all_endpaths ->SetYTitle(
"processing time [ms]");
400 plots.interpaths ->StatOverflows(
true);
402 plots.interpaths ->SetYTitle(
"processing time [ms]");
408 booker.setCurrentFolder(
m_dqm_path +
"/process " + process_name +
"/Paths");
409 for (
auto & keyval: stream.paths[pid]) {
411 PathInfo & pathinfo = keyval.second;
416 pathinfo.
dqm_active ->SetXTitle(
"processing time [ms]");
421 pathinfo.
dqm_total ->StatOverflows(
true);
422 pathinfo.
dqm_total ->SetXTitle(
"processing time [ms]");
437 pathinfo.
dqm_overhead ->SetXTitle(
"processing time [ms]");
447 std::vector<std::string>();
452 static tbb::concurrent_vector<std::string> dup;
455 std::lock_guard<std::mutex>
lock(dup_mutex);
458 for (
unsigned int i = 0;
i < 32; ++
i)
463 if (modules.size() > dup.size()) {
464 std::lock_guard<std::mutex>
lock(dup_mutex);
465 unsigned int old_size = dup.size();
466 unsigned int new_size = modules.size();
467 if (new_size > old_size) {
468 dup.resize(new_size);
469 for (
unsigned int i = old_size;
i < new_size; ++
i)
474 std::vector<const char *>
labels(modules.size(),
nullptr);
475 for (uint32_t
i = 0;
i < modules.size(); ++
i)
479 if (m_enable_dqm_bypath_counters) {
480 pathinfo.
dqm_module_counter = booker.book1D(pathname +
"_module_counter", pathname +
" module counter", modules.size() + 1, -0.5, modules.size() + 0.5)->getTH1F();
482 for (uint32_t
i = 0;
i < modules.size(); ++
i)
488 pathinfo.
dqm_module_active = booker.book1D(pathname +
"_module_active", pathname +
" module active", modules.size(), -0.5, modules.size() - 0.5)->getTH1F();
490 pathinfo.
dqm_module_total = booker.book1D(pathname +
"_module_total", pathname +
" module total", modules.size(), -0.5, modules.size() - 0.5)->getTH1F();
493 for (uint32_t
i = 0;
i < modules.size(); ++
i) {
511 booker.setCurrentFolder(
m_dqm_path +
"/Modules");
512 for (
auto & keyval: stream.modules) {
517 module.
dqm_active->SetXTitle(
"processing time [ms]");
522 booker.setCurrentFolder(
m_dqm_path +
"/ModuleTypes");
523 for (
auto & keyval: stream.moduletypes) {
528 module.
dqm_active->SetXTitle(
"processing time [ms]");
557 stream.fast_moduletypes.resize(
m_module_id,
nullptr);
561 for (
auto & stream: m_stream)
642 std::ostringstream
out;
643 out << std::fixed << std::setprecision(6);
644 out <<
"FastReport for " << label <<
", process " << process <<
'\n';
646 out <<
"FastReport " << std::right << std::setw(10) << summary.
preevent / (double) total.
count <<
" Pre-Event" <<
'\n';
647 out <<
"FastReport " << std::right << std::setw(10) << summary.
event / (double) total.
count <<
" Event" <<
'\n';
648 out <<
"FastReport " << std::right << std::setw(10) << summary.
all_paths / (double) total.
count <<
" all Paths" <<
'\n';
649 out <<
"FastReport " << std::right << std::setw(10) << summary.
all_endpaths / (double) total.
count <<
" all EndPaths" <<
'\n';
650 out <<
"FastReport " << std::right << std::setw(10) << summary.
interpaths / (double) total.
count <<
" between paths" <<
'\n';
660 std::ostringstream
out;
661 out << std::fixed << std::setprecision(6);
662 out <<
"FastReport for " << label <<
", over all subprocesses" <<
'\n';
664 out <<
"FastReport " << std::right << std::setw(10) << summary.
presource / (double) summary.
count <<
" Pre-Source" <<
'\n';
665 out <<
"FastReport " << std::right << std::setw(10) << summary.
source / (double) summary.
count <<
" Source" <<
'\n';
666 out <<
"FastReport " << std::right << std::setw(10) << summary.
preevent / (double) summary.
count <<
" Pre-Event" <<
'\n';
667 out <<
"FastReport " << std::right << std::setw(10) << summary.
event / (double) summary.
count <<
" Event" <<
'\n';
739 if (module.
id() >= stream.fast_modules.size())
740 stream.fast_modules.resize(module.
id() + 1,
nullptr);
741 if (module.
id() >= stream.fast_moduletypes.size())
742 stream.fast_moduletypes.resize(module.
id() + 1,
nullptr);
744 stream.fast_modules[module.
id()] = & stream.modules[module.
moduleLabel()];;
745 stream.fast_moduletypes[module.
id()] = & stream.moduletypes[module.
moduleName()];
755 stream.timer_event.start();
758 stream.timing_perprocess[
pid].preevent =
delta(stream.timer_last_transition, stream.timer_event.getStartTime());
761 stream.timing_perprocess[
pid].event = 0;
762 stream.timing_perprocess[
pid].all_paths = 0;
763 stream.timing_perprocess[
pid].all_endpaths = 0;
764 stream.timing_perprocess[
pid].interpaths = 0;
765 stream.timing_perprocess[
pid].paths_interpaths.assign(stream.paths[pid].size() + 1, 0);
766 for (
auto & keyval : stream.paths[pid]) {
767 keyval.second.timer.reset();
768 keyval.second.time_active = 0.;
769 keyval.second.time_exclusive = 0.;
770 keyval.second.time_premodules = 0.;
771 keyval.second.time_intermodules = 0.;
772 keyval.second.time_postmodules = 0.;
773 keyval.second.time_total = 0.;
778 stream.timer_last_path = stream.timer_event.getStartTime();
792 stream.timer_event.stop();
793 stream.timer_last_transition = stream.timer_event.getStopTime();
794 stream.timing_perprocess[
pid].event = stream.timer_event.seconds();
797 double interpaths =
delta(stream.timer_last_path, stream.timer_event.getStopTime());
798 stream.timing_perprocess[
pid].interpaths += interpaths;
799 stream.timing_perprocess[
pid].paths_interpaths.back() = interpaths;
811 stream.timing.count = 1;
812 stream.timing.preevent = stream.timing_perprocess[0].preevent;
813 stream.timing.event = stream.timing_perprocess[0].event;
815 stream.timing.event += stream.timing_perprocess[
i].preevent;
816 stream.timing.event += stream.timing_perprocess[
i].event;
825 for (
auto & keyval: stream.paths[pid]) {
826 PathInfo & pathinfo = keyval.second;
844 for (
unsigned int i = 0;
i < stream.fast_modules.size(); ++
i)
846 if (stream.fast_modules[
i]) {
847 double active = stream.fast_modules[
i]->time_active;
848 ModuleInfo & moduletype = * stream.fast_moduletypes[
i];
861 for (
auto & keyval: stream.paths[pid]) {
862 PathInfo & pathinfo = keyval.second;
889 if (module ==
nullptr)
915 for (
auto & keyval : stream.modules) {
924 for (
auto & keyval : stream.moduletypes) {
932 for (
unsigned int i = 0;
i <= stream.paths[
pid].size(); ++
i)
933 stream.dqm_paths[pid].interpaths->Fill(
i, stream.timing_perprocess[pid].paths_interpaths[
i] * 1000.);
937 stream.dqm.fill(stream.timing);
938 stream.dqm_perprocess[
pid].fill(stream.timing_perprocess[pid]);
944 stream.dqm_byluminosity[i].fill(stream.luminosity[i], stream.timing);
946 stream.dqm_perprocess_byluminosity[pid][i].fill(stream.luminosity[i], stream.timing_perprocess[pid]);
955 stream.timing.reset();
956 stream.timer_source.start();
960 for (
auto & keyval : stream.modules) {
961 keyval.second.timer.reset();
962 keyval.second.time_active = 0.;
963 keyval.second.run_in_path =
nullptr;
964 keyval.second.counter = 0;
966 for (
auto & keyval : stream.moduletypes) {
967 keyval.second.timer.reset();
968 keyval.second.time_active = 0.;
969 keyval.second.run_in_path =
nullptr;
970 keyval.second.counter = 0;
974 stream.timing.presource =
delta(stream.timer_last_transition, stream.timer_source.getStartTime());
979 stream.timer_source.stop();
980 stream.timer_last_transition = stream.timer_source.getStopTime();
983 stream.timing.source = stream.timer_source.seconds();
993 auto keyval = stream.paths[
pid].find(path);
994 if (keyval != stream.paths[pid].end()) {
995 stream.current_path = & keyval->second;
998 stream.current_path =
nullptr;
999 edm::LogError(
"FastTimerService") <<
"FastTimerService::prePathEvent: unexpected path " <<
path;
1004 stream.current_path->first_module =
nullptr;
1007 stream.current_path->timer.start();
1009 if (path ==
m_process[pid].first_path) {
1011 stream.timer_paths.setStartTime(stream.current_path->timer.getStartTime());
1012 }
else if (path ==
m_process[pid].first_endpath) {
1014 stream.timer_endpaths.setStartTime(stream.current_path->timer.getStartTime());
1019 double interpaths =
delta(stream.timer_last_path, stream.current_path->timer.getStartTime());
1020 stream.timing_perprocess[
pid].interpaths += interpaths;
1021 stream.timing_perprocess[
pid].paths_interpaths[stream.current_path->index] = interpaths;
1031 if (stream.current_path ==
nullptr) {
1032 edm::LogError(
"FastTimerService") <<
"FastTimerService::postPathEvent: unexpected path " <<
path;
1037 stream.current_path->timer.stop();
1038 stream.current_path->time_active = stream.current_path->timer.seconds();
1039 stream.timer_last_path = stream.current_path->timer.getStopTime();
1041 double active = stream.current_path->time_active;
1046 PathInfo & pathinfo = * stream.current_path;
1054 double overhead = 0.;
1055 double current = 0.;
1056 double total = active;
1064 uint32_t last_run = 0;
1066 last_run = status.
index() + 1;
1067 for (uint32_t
i = 0;
i < last_run; ++
i) {
1083 if (stream.current_path->first_module ==
nullptr) {
1091 pre =
delta(stream.current_path->timer.getStartTime(), stream.current_path->first_module->timer.getStartTime());
1092 post =
delta(stream.current_module->timer.getStopTime(), stream.current_path->timer.getStopTime());
1093 inter = active - pre - current - post;
1097 overhead = active - current;
1120 stream.timer_paths.setStopTime(stream.current_path->timer.getStopTime());
1121 stream.timing_perprocess[
pid].all_paths = stream.timer_paths.seconds();
1122 }
else if (path ==
m_process[pid].last_endpath) {
1124 stream.timer_endpaths.setStopTime(stream.current_path->timer.getStopTime());
1125 stream.timing_perprocess[
pid].all_endpaths = stream.timer_endpaths.seconds();
1135 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1144 if (md.
id() < stream.fast_modules.size()) {
1148 stream.current_module = &
module;
1150 if (stream.current_path->first_module ==
nullptr)
1151 stream.current_path->first_module = &
module;
1163 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1174 if (md.
id() < stream.fast_modules.size()) {
1192 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1211 if (md.
id() < stream.fast_modules.size()) {
1216 edm::LogError(
"FastTimerService") <<
"FastTimerService::preModuleEventDelayedGet: unexpected module " << md.
moduleLabel();
1227 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: invalid module";
1237 if (md.
id() < stream.fast_modules.size()) {
1242 edm::LogError(
"FastTimerService") <<
"FastTimerService::postModuleEventDelayedGet: unexpected module " << md.
moduleLabel();
1252 std::vector<ModuleInfo *> & pathmap = stream.paths[
pid][
name].modules;
1254 pathmap.reserve( modules.size() );
1255 std::unordered_set<ModuleInfo const *>
pool;
1256 for (
auto const &
module: modules) {
1260 auto const & it = stream.modules.find(label);
1261 if (it == stream.modules.end()) {
1263 pathmap.push_back( 0 );
1264 }
else if (pool.insert(& it->second).second) {
1266 pathmap.push_back(& it->second);
1269 pathmap.push_back( 0 );
1278 std::vector<std::string const *>
p(paths.size(),
nullptr);
1284 std::transform(paths.begin(), paths.end(),
p.begin(), address_if_non_empty);
1287 if (skip and not
p.empty())
1295 return std::make_pair(*
p.front(), *
p.back());
1305 return m_stream[sid].current_module->timer.secondsUntilNow();
1310 return m_stream[sid].current_path->timer.secondsUntilNow();
1315 return m_stream[sid].timer_event.secondsUntilNow();
1320 if (module.
id() <
m_stream[sid].fast_modules.size()) {
1321 return m_stream[sid].fast_modules[module.
id()]->time_active;
1330 if (
id <
m_stream[sid].fast_modules.size()) {
1331 return m_stream[sid].fast_modules[id]->time_active;
1340 auto const & keyval =
m_stream[sid].modules.find(label);
1342 return keyval->second.time_active;
1352 auto const & keyval =
m_stream[sid].moduletypes.find(type);
1353 if (keyval !=
m_stream[sid].moduletypes.end()) {
1354 return keyval->second.time_active;
1399 return m_stream[sid].timing.source;
1425 desc.
addUntracked<
bool>(
"enableTimingExclusive",
false);
1426 desc.
addUntracked<
bool>(
"enableTimingSummary",
false);
1429 desc.
addUntracked<
bool>(
"enableDQMbyPathActive",
false);
1430 desc.
addUntracked<
bool>(
"enableDQMbyPathTotal",
true);
1431 desc.
addUntracked<
bool>(
"enableDQMbyPathOverhead",
false);
1432 desc.
addUntracked<
bool>(
"enableDQMbyPathDetails",
false);
1433 desc.
addUntracked<
bool>(
"enableDQMbyPathCounters",
true);
1434 desc.
addUntracked<
bool>(
"enableDQMbyPathExclusive",
false);
1436 desc.
addUntracked<
bool>(
"enableDQMbyModuleType",
false);
1438 desc.
addUntracked<
bool>(
"enableDQMbyLumiSection",
false);
1439 desc.
addUntracked<
bool>(
"enableDQMbyProcesses",
false);
1443 desc.
addUntracked<
double>(
"dqmPathTimeResolution", 0.5);
1444 desc.
addUntracked<
double>(
"dqmModuleTimeRange", 40. );
1445 desc.
addUntracked<
double>(
"dqmModuleTimeResolution", 0.2);
1446 desc.
addUntracked<uint32_t>(
"dqmLumiSectionsRange", 2500 );
1448 descriptions.
add(
"FastTimerService", desc);
1454 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 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
tuple rid
Histograms Source for live online DQM in P5
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
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
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 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
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 &)
std::pair< std::string, std::string > findFirstLast(unsigned int pid, std::vector< std::string > const &paths, bool skip=false)
const double m_dqm_eventtime_range
const double m_dqm_pathtime_resolution
unsigned int index() const