13 #include <unordered_set> 14 #include <unordered_map> 17 #include <boost/format.hpp> 18 #include <boost/range/irange.hpp> 46 template <
class Rep,
class Period>
47 double ms(std::chrono::duration<Rep, Period> duration)
49 return std::chrono::duration_cast<std::chrono::duration<double, std::milli>>(duration).
count();;
53 template <
class Rep,
class Period>
54 double ms(boost::chrono::duration<Rep, Period> duration)
56 return boost::chrono::duration_cast<boost::chrono::duration<double, boost::milli>>(duration).
count();;
82 time_real = boost::chrono::nanoseconds::zero();
215 paths(process.paths_.
size()),
216 endpaths(process.endPaths_.
size())
233 for (
unsigned int i: boost::irange(0ul,
paths.size()))
236 for (
unsigned int i: boost::irange(0ul,
endpaths.size()))
258 highlight( groups.
size() ),
286 event += other.
event;
288 for (
unsigned int i: boost::irange(0ul,
highlight.size()))
291 for (
unsigned int i: boost::irange(0ul,
modules.size()))
294 for (
unsigned int i: boost::irange(0ul,
processes.size()))
318 #ifdef DEBUG_THREAD_CONCURRENCY 319 id = std::this_thread::get_id();
320 #endif // DEBUG_THREAD_CONCURRENCY 329 #ifdef DEBUG_THREAD_CONCURRENCY 330 assert(std::this_thread::get_id() ==
id);
331 #endif // DEBUG_THREAD_CONCURRENCY 337 store.
time_real = new_time_real - time_real;
338 store.
allocated = new_allocated - allocated;
340 time_thread = new_time_thread;
341 time_real = new_time_real;
342 allocated = new_allocated;
343 deallocated = new_deallocated;
348 #ifdef DEBUG_THREAD_CONCURRENCY 349 assert(std::this_thread::get_id() ==
id);
350 #endif // DEBUG_THREAD_CONCURRENCY 356 store.
time_real += boost::chrono::duration_cast<boost::chrono::nanoseconds>(new_time_real - time_real).
count();
357 store.
allocated += new_allocated - allocated;
358 store.
deallocated += new_deallocated - deallocated;
359 time_thread = new_time_thread;
360 time_real = new_time_real;
361 allocated = new_allocated;
362 deallocated = new_deallocated;
399 unsigned int lumisections,
408 name +
" time_thread",
409 title +
" processing time (cpu)",
418 title +
" processing time (real)",
422 time_real_->SetXTitle(
"processing time [ms]");
429 title +
" allocated memory",
437 name +
" deallocated",
438 title +
" deallocated memory",
450 name +
" time_thread_byls",
451 title +
" processing time (cpu) vs. lumisection",
452 lumisections, 0.5, lumisections + 0.5,
460 name +
" time_real_byls",
461 title +
" processing time (real) vs. lumisection",
462 lumisections, 0.5, lumisections + 0.5,
472 name +
" allocated_byls",
473 title +
" allocated memory vs. lumisection",
474 lumisections, 0.5, lumisections + 0.5,
482 name +
" deallocated_byls",
483 title +
" deallocated memory vs. lumisection",
484 lumisections, 0.5, lumisections + 0.5,
592 module_time_thread_total_(
nullptr),
593 module_time_real_total_(
nullptr),
594 module_allocated_total_(
nullptr),
595 module_deallocated_total_(
nullptr)
618 unsigned int lumisections,
631 bins + 1, -0.5, bins + 0.5
635 "module_time_thread_total",
636 "total module time (cpu)",
637 bins, -0.5, bins - 0.5
641 "module_time_real_total",
642 "total module time (real)",
643 bins, -0.5, bins - 0.5
649 "module_allocated_total",
650 "total allocated memory",
651 bins, -0.5, bins - 0.5
655 "module_deallocated_total",
656 "total deallocated memory",
657 bins, -0.5, bins - 0.5
661 for (
unsigned int bin: boost::irange(0u, bins)) {
685 for (
unsigned int i = 0;
i < path.
last; ++
i) {
709 paths_(process.paths_.
size()),
710 endpaths_(process.endPaths_.
size())
731 unsigned int lumisections,
737 "process " + process.
name_,
"process " + process.
name_,
743 for (
unsigned int id: boost::irange(0ul,
paths_.size()))
751 for (
unsigned int id: boost::irange(0ul,
endpaths_.size()))
770 for (
unsigned int id: boost::irange(0ul,
paths_.size()))
774 for (
unsigned int id: boost::irange(0ul,
endpaths_.size()))
782 highlight_(groups.
size()),
783 modules_(job.
size()),
809 std::vector<GroupOfModules>
const& groups,
813 unsigned int lumisections,
828 "event_ex",
"Event (explicit)",
834 "overhead",
"Overhead",
846 for (
unsigned int group: boost::irange(0ul, groups.size())) {
856 for (
unsigned int pid: boost::irange(0ul, job.
processes().size())) {
868 for (
unsigned int id:
process.modules_)
895 for (
unsigned int id: boost::irange(0ul,
modules_.size()))
898 for (
unsigned int pid: boost::irange(0ul,
processes_.size()))
927 config.getUntrackedParameter<
double>(
"dqmPathTimeResolution" ),
928 config.getUntrackedParameter<
double>(
"dqmPathMemoryRange" ),
929 config.getUntrackedParameter<
double>(
"dqmPathMemoryResolution" ) } ),
931 config.getUntrackedParameter<
double>(
"dqmModuleTimeResolution" ),
932 config.getUntrackedParameter<
double>(
"dqmModuleMemoryRange" ),
933 config.getUntrackedParameter<
double>(
"dqmModuleMemoryResolution") } ),
941 tbb::task_scheduler_observer::observe();
1016 auto const& stream =
streams_[sid];
1017 auto const&
module = stream.modules[
id];
1030 auto const& stream =
streams_[sid];
1031 return ms(stream.total.time_real);
1038 auto const& stream =
streams_[sid];
1039 return ms(stream.processes[pid].total.time_real);
1083 auto const& stream =
streams_[sid];
1087 for (
unsigned int id: boost::irange(0ul, desc.paths_.size()))
1088 if (desc.paths_[
id].name_ == path)
1089 return ms(stream.processes[
pid].paths[
id].total.time_real);
1090 for (
unsigned int id: boost::irange(0ul, desc.endPaths_.size()))
1091 if (desc.paths_[
id].name_ == path)
1092 return ms(stream.processes[
pid].endpaths[
id].total.time_real);
1102 auto const& stream =
streams_[sid];
1105 for (
unsigned int id: boost::irange(0ul, desc.paths_.size()))
1106 if (desc.paths_[
id].name_ == path)
1107 return ms(stream.processes[pid].paths[
id].total.time_real);
1108 for (
unsigned int id: boost::irange(0ul, desc.endPaths_.size()))
1109 if (desc.paths_[
id].name_ == path)
1110 return ms(stream.processes[pid].endpaths[
id].total.time_real);
1119 auto const& stream =
streams_[sid];
1122 return ms(stream.highlight[
group].time_real);
1132 LogDebug(
"FastTimerService") <<
"The FastTimerService received is currently not monitoring the signal \"" << signal <<
"\".\n";
1140 edm::LogWarning(
"FastTimerService") <<
"The FastTimerService received the unsupported signal \"" << signal <<
"\".\n" 1141 <<
"Please report how to reproduce the issue to cms-hlt@cern.ch .";
1417 template <
typename T>
1420 out <<
"FastReport ";
1421 if (label.size() < 60)
1422 for (
unsigned int i = (60-label.size()) / 2;
i > 0; --
i)
1424 out <<
' ' << label <<
" Summary ";
1425 if (label.size() < 60)
1426 for (
unsigned int i = (59-label.size()) / 2;
i > 0; --
i)
1431 template <
typename T>
1434 out <<
"FastReport CPU time Real time Allocated Deallocated " << label <<
"\n";
1438 template <
typename T>
1441 out <<
boost::format(
"FastReport %10.3f ms %10.3f ms %+10d kB %+10d kB %s\n")
1449 template <
typename T>
1461 for (
unsigned int m: proc_d.modules_) {
1475 for (
unsigned int p = 0;
p <
proc.paths.size(); ++
p) {
1476 auto const&
name = proc_d.paths_[
p].name_;
1481 for (
unsigned int p = 0;
p <
proc.endpaths.size(); ++
p) {
1482 auto const&
name = proc_d.endPaths_[
p].name_;
1502 template <
typename T>
1506 out <<
"FastReport CPU time avg. when run Real time avg. when run Alloc, avg. when run Dealloc. avg. when run " <<
label;
1509 out <<
"FastReport CPU time avg. Real time avg. Alloc, avg. Dealloc. avg. " <<
label;
1513 template <
typename T>
1516 out <<
boost::format(
"FastReport %10.3f ms %10.3f ms %+10d kB %+10d kB %s\n")
1519 % (events ? kB(data.
allocated) / events : 0)
1524 template <
typename T>
1527 out <<
boost::format(
"FastReport %10.3f ms %10.3f ms %10.3f ms %10.3f ms %+10d kB %+10d kB %+10d kB %+10d kB %s\n")
1530 % (events ? kB(data.
allocated) / events : 0) % (active ? kB(data.
allocated) / active : 0)
1535 template <
typename T>
1547 for (
unsigned int m: proc_d.modules_) {
1561 for (
unsigned int p = 0;
p <
proc.paths.size(); ++
p) {
1562 auto const&
name = proc_d.paths_[
p].name_;
1567 for (
unsigned int p = 0;
p <
proc.endpaths.size(); ++
p) {
1568 auto const&
name = proc_d.endPaths_[
p].name_;
1607 unsigned int old_value = check.fetch_add(1, std::memory_order_acq_rel);
1628 auto &
data = stream.processes[
pid].total;
1629 for (
unsigned int i:
process.modules_)
1630 data += stream.modules[
i].total;
1631 stream.total +=
data;
1639 stream.event_measurement.measure_and_store(stream.event);
1644 stream.highlight[
group] += stream.modules[
i].total;
1673 auto & measurement =
thread();
1674 measurement.measure_and_accumulate(stream.overhead);
1675 stream.event_measurement = measurement;
1683 unsigned int id = md.
id();
1687 ++stream.modules[
id].events;
1696 unsigned int id = pc.
pathID();
1699 data.status =
false;
1709 unsigned int id = pc.
pathID();
1714 unsigned int index =
path.modules_on_path_.empty() ? 0 : status.
index() + 1;
1715 data.last =
path.modules_on_path_.empty() ? 0 :
path.last_dependency_of_module_[status.
index()];
1717 for (
unsigned int i = 0;
i <
index; ++
i) {
1718 auto const&
module = stream.modules[
path.modules_on_path_[
i]];
1721 for (
unsigned int i = 0;
i <
data.last; ++
i) {
1722 auto const&
module = stream.modules[
path.modules_and_dependencies_[
i]];
1739 unsigned int id = md.
id();
1744 ++stream.modules[
id].events;
1914 desc.
addUntracked<
bool>(
"enableDQMbyLumiSection",
false);
1915 desc.
addUntracked<
bool>(
"enableDQMbyProcesses",
false);
1918 desc.
addUntracked<
double>(
"dqmMemoryRange", 1000000. );
1919 desc.
addUntracked<
double>(
"dqmMemoryResolution", 5000. );
1921 desc.
addUntracked<
double>(
"dqmPathTimeResolution", 0.5);
1922 desc.
addUntracked<
double>(
"dqmPathMemoryRange", 1000000. );
1923 desc.
addUntracked<
double>(
"dqmPathMemoryResolution", 5000. );
1924 desc.
addUntracked<
double>(
"dqmModuleTimeRange", 40. );
1925 desc.
addUntracked<
double>(
"dqmModuleTimeResolution", 0.2);
1926 desc.
addUntracked<
double>(
"dqmModuleMemoryRange", 100000. );
1927 desc.
addUntracked<
double>(
"dqmModuleMemoryResolution", 500. );
1928 desc.
addUntracked<
unsigned>(
"dqmLumiSectionsRange", 2500 );
1932 highlightModulesDescription.
addUntracked<std::vector<std::string>>(
"modules", {});
1933 highlightModulesDescription.addUntracked<
std::string>(
"label",
"producers");
1953 descriptions.
add(
"FastTimerService", desc);
void preGlobalBeginRun(edm::GlobalContext const &)
void preModuleEventDelayedGet(edm::StreamContext const &, edm::ModuleCallingContext const &)
const bool print_run_summary_
unsigned int maxNumberOfThreads() const
void fill(Resources const &, unsigned int lumisection)
void setComment(std::string const &value)
T getUntrackedParameter(std::string const &, T const &) const
void postStreamBeginRun(edm::StreamContext const &)
double queryEventTime(edm::StreamID) const
void postGlobalEndLumi(edm::GlobalContext const &)
void postGlobalBeginLumi(edm::GlobalContext const &)
void on_scheduler_entry(bool worker) final
void postStreamEndLumi(edm::StreamContext const &)
void on_scheduler_exit(bool worker) final
std::vector< edm::ParameterSet > highlight_module_psets_
void postModuleGlobalEndLumi(edm::GlobalContext const &, edm::ModuleCallingContext const &)
void preEventReadFromSource(edm::StreamContext const &, edm::ModuleCallingContext const &)
void preGlobalEndRun(edm::GlobalContext const &)
PlotsPerElement event_ex_
void preBeginJob(edm::PathsAndConsumesOfModulesBase const &, edm::ProcessContext const &)
AtomicResources operator+(AtomicResources const &other) const
unsigned int concurrent_threads_
std::vector< unsigned int > modules_and_dependencies_
void postEventReadFromSource(edm::StreamContext const &, edm::ModuleCallingContext const &)
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
double queryHighlightTime(edm::StreamID sid, std::string const &label) const
const PlotRanges dqm_event_ranges_
void postModuleGlobalEndRun(edm::GlobalContext const &, edm::ModuleCallingContext const &)
void postModuleEvent(edm::StreamContext const &, edm::ModuleCallingContext const &)
void unsupportedSignal(const std::string &signal) const
std::vector< GroupOfModules > highlight_modules_
ResourcesPerJob job_summary_
MonitorElement * bookProfile(Args &&...args)
PlotsPerJob(ProcessCallGraph const &job, std::vector< GroupOfModules > const &groups)
unsigned int processId(edm::ProcessContext const &) const
TrainProcessor *const proc
PlotsPerProcess(ProcessCallGraph::ProcessType const &)
void preGlobalEndLumi(edm::GlobalContext const &)
std::vector< ResourcesPerPath > endpaths
TH1D * module_time_real_total_
const std::string & pwd(void)
TProfile * allocated_byls_
void book(DQMStore::IBooker &, std::string const &, ProcessCallGraph const &, ProcessCallGraph::PathType const &, PlotRanges const &ranges, unsigned int lumisections, bool byls)
double queryModuleTime_(edm::StreamID, unsigned int id) const
bool isFirstSubprocess(edm::StreamContext const &)
const bool enable_dqm_bynproc_
unsigned int concurrent_runs_
boost::chrono::nanoseconds time_real
TH1D * getTH1D(void) const
void measure_and_accumulate(AtomicResources &store)
std::atomic< uint64_t > deallocated
PlotsPerElement overhead_
std::unique_ptr< std::atomic< unsigned int >[]> subprocess_global_run_check_
std::vector< ResourcesPerJob > streams_
std::atomic< uint64_t > allocated
RunIndex const & runIndex() const
void postPathEvent(edm::StreamContext const &, edm::PathContext const &, edm::HLTPathStatus const &)
std::vector< PlotsPerElement > highlight_
void preModuleGlobalBeginLumi(edm::GlobalContext const &, edm::ModuleCallingContext const &)
void book(DQMStore::IBooker &, ProcessCallGraph const &, ProcessCallGraph::ProcessType const &, PlotRanges const &event_ranges, PlotRanges const &path_ranges, unsigned int lumisections, bool bypath, bool byls)
ResourcesPerProcess & operator+=(ResourcesPerProcess const &other)
LuminosityBlockNumber_t luminosityBlock() const
const bool print_job_summary_
std::string const & moduleLabel() const
const bool enable_dqm_bypath_
edm::ModuleDescription const & source() const
static unsigned int getUniqueID()
Returns a unique id each time called. Intended to be passed to ModuleDescription's constructor's modI...
tbb::enumerable_thread_specific< Measurement, tbb::cache_aligned_allocator< Measurement >, tbb::ets_key_per_instance > threads_
void postStreamBeginLumi(edm::StreamContext const &)
void printSummary(T &out, ResourcesPerJob const &, std::string const &label) const
const PlotRanges dqm_path_ranges_
RunIndex const & runIndex() const
unsigned int maxNumberOfStreams() const
ResourcesPerProcess operator+(ResourcesPerProcess const &other) const
ResourcesPerJob operator+(ResourcesPerJob const &other) const
std::vector< ResourcesPerModule > modules
void printEvent(T &out, ResourcesPerJob const &) const
void printHeader(T &out, std::string const &label) const
void postModuleStreamEndLumi(edm::StreamContext const &, edm::ModuleCallingContext const &)
std::mutex summary_mutex_
TProfile * time_thread_byls_
ResourcesPerJob & operator+=(ResourcesPerJob const &other)
std::vector< PlotsPerJob > stream_plots_
void printSummaryHeader(T &out, std::string const &label, bool detaile) const
void fill(ProcessCallGraph::ProcessType const &, ResourcesPerJob const &, ResourcesPerProcess const &, unsigned int ls)
double queryModuleTime(edm::StreamID, const edm::ModuleDescription &module) const
TProfile * time_real_byls_
TH1D * module_allocated_total_
void prePathEvent(edm::StreamContext const &, edm::PathContext const &)
std::vector< ResourcesPerJob > run_summary_
void printEventHeader(T &out, std::string const &label) const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
FastTimerService(const edm::ParameterSet &, edm::ActivityRegistry &)
void preModuleStreamEndLumi(edm::StreamContext const &, edm::ModuleCallingContext const &)
TH1D * module_time_thread_total_
void postEvent(edm::StreamContext const &)
std::unique_ptr< std::atomic< unsigned int >[]> subprocess_lumisection_check_
void preBeginJob(edm::PathsAndConsumesOfModulesBase const &, edm::ProcessContext const &)
void postGlobalEndRun(edm::GlobalContext const &)
static uint64_t deallocated()
ModuleDescription const * moduleDescription() const
std::unique_ptr< std::atomic< unsigned int >[]> subprocess_event_check_
void fill_fraction(Resources const &, Resources const &, unsigned int lumisection)
std::vector< ProcessType > const & processes() const
MonitorElement * book1D(Args &&...args)
ResourcesPerModule operator+(ResourcesPerModule const &other) const
const unsigned int dqm_lumisections_range_
void postStreamEndRun(edm::StreamContext const &)
std::vector< PathType > paths_
void preModuleEvent(edm::StreamContext const &, edm::ModuleCallingContext const &)
ResourcesPerPath & operator+=(ResourcesPerPath const &other)
std::vector< PlotsPerElement > modules_
ProcessType const & processDescription(unsigned int) const
ParameterDescriptionNode * addOptionalNode(ParameterDescriptionNode const &node, bool writeToCfi)
void preSourceConstruction(edm::ModuleDescription const &)
void printSummaryLine(T &out, Resources const &data, uint64_t events, std::string const &label) const
unsigned int pathID() const
format
Some error handling for the usage.
ProcessContext const * processContext() const
void printEventLine(T &out, Resources const &data, std::string const &label) const
std::atomic< boost::chrono::nanoseconds::rep > time_thread
void mergeAndResetMEsRunSummaryCache(uint32_t run, uint32_t streamId, uint32_t moduleId)
Resources operator+(Resources const &other) const
std::vector< Resources > highlight
const bool enable_dqm_bymodule_
bin
set the eta bin as selection string.
StreamID const & streamID() const
~FastTimerService() override
const PlotRanges dqm_module_ranges_
std::vector< PlotsPerPath > endpaths_
static bool is_available()
const bool enable_dqm_byls_
std::vector< PlotsPerProcess > processes_
TProfile * deallocated_byls_
void postModuleEventDelayedGet(edm::StreamContext const &, edm::ModuleCallingContext const &)
const bool print_event_summary_
unsigned int value() const
void setCurrentFolder(const std::string &fullpath)
unsigned long long uint64_t
void postModuleStreamBeginLumi(edm::StreamContext const &, edm::ModuleCallingContext const &)
void book(DQMStore::IBooker &, ProcessCallGraph const &, std::vector< GroupOfModules > const &, PlotRanges const &event_ranges, PlotRanges const &path_ranges, PlotRanges const &module_ranges, unsigned int lumisections, bool bymodule, bool bypath, bool byls)
double querySourceTime(edm::StreamID) const
void preModuleStreamEndRun(edm::StreamContext const &, edm::ModuleCallingContext const &)
void postModuleStreamEndRun(edm::StreamContext const &, edm::ModuleCallingContext const &)
static uint64_t allocated()
void postModuleStreamBeginRun(edm::StreamContext const &, edm::ModuleCallingContext const &)
TH1F * getTH1F(void) const
void preSourceEvent(edm::StreamID)
boost::chrono::nanoseconds time_thread
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void preEvent(edm::StreamContext const &)
void postGlobalBeginRun(edm::GlobalContext const &)
ProcessContext const * processContext() const
void preStreamBeginLumi(edm::StreamContext const &)
ResourcesPerProcess(ProcessCallGraph::ProcessType const &process)
void ignoredSignal(const std::string &signal) const
void postSourceEvent(edm::StreamID)
void preModuleStreamBeginLumi(edm::StreamContext const &, edm::ModuleCallingContext const &)
void preStreamEndRun(edm::StreamContext const &)
char data[epos_bytes_allocation]
std::atomic< boost::chrono::nanoseconds::rep > time_real
void preModuleStreamBeginRun(edm::StreamContext const &, edm::ModuleCallingContext const &)
void preStreamEndLumi(edm::StreamContext const &)
void measure_and_store(Resources &store)
ResourcesPerModule & operator+=(ResourcesPerModule const &other)
std::vector< PathType > endPaths_
TProfile * getTProfile(void) const
void postModuleEventPrefetching(edm::StreamContext const &, edm::ModuleCallingContext const &)
void preModuleGlobalEndLumi(edm::GlobalContext const &, edm::ModuleCallingContext const &)
unsigned int size() const
edm::ModuleDescription const & module(unsigned int module) const
double queryPathTime(edm::StreamID, std::string const &path) const
void preGlobalBeginLumi(edm::GlobalContext const &)
unsigned int maxNumberOfConcurrentRuns() const
AtomicResources & operator+=(AtomicResources const &other)
Resources & operator+=(Resources const &other)
void preModuleEventPrefetching(edm::StreamContext const &, edm::ModuleCallingContext const &)
void preSourceConstruction(edm::ModuleDescription const &)
void preModuleGlobalEndRun(edm::GlobalContext const &, edm::ModuleCallingContext const &)
tbb::concurrent_unordered_set< std::string > unsupported_signals_
std::vector< PlotsPerPath > paths_
EventID const & eventID() const
void postModuleGlobalBeginRun(edm::GlobalContext const &, edm::ModuleCallingContext const &)
std::vector< ResourcesPerProcess > processes
double queryModuleTimeByLabel(edm::StreamID, std::string const &module) const
boost::date_time::subsecond_duration< boost::posix_time::time_duration, 1000000000 > nanoseconds
AtomicResources & operator=(AtomicResources const &other)
void book(DQMStore::IBooker &, std::string const &name, std::string const &title, PlotRanges const &ranges, unsigned int lumisections, bool byls)
ProcessCallGraph callgraph_
void mergeAndResetMEsLuminositySummaryCache(uint32_t run, uint32_t lumi, uint32_t streamId, uint32_t moduleId)
void postModuleGlobalBeginLumi(edm::GlobalContext const &, edm::ModuleCallingContext const &)
void preStreamBeginRun(edm::StreamContext const &)
std::vector< ResourcesPerPath > paths
MonitorElement * book1DD(Args &&...args)
bool isSubProcess() const
ResourcesPerPath operator+(ResourcesPerPath const &other) const
void preModuleGlobalBeginRun(edm::GlobalContext const &, edm::ModuleCallingContext const &)
ParameterDescriptionBase * addVPSetUntracked(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
static std::string const source
std::unique_ptr< std::atomic< unsigned int >[]> subprocess_run_check_
std::vector< unsigned int > modules_
unsigned int concurrent_streams_
bool isLastSubprocess(std::atomic< unsigned int > &check)
void preallocate(edm::service::SystemBounds const &)
void fill(ProcessCallGraph const &, ResourcesPerJob const &, unsigned int ls)
TH1D * module_deallocated_total_
void fill(ProcessCallGraph::PathType const &, ResourcesPerJob const &, ResourcesPerPath const &, unsigned int lumisection)
unsigned int index() const