CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Classes | Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes
FastTimerService Class Reference

#include <FastTimerService.h>

Classes

struct  LuminosityDescription
 
struct  ModuleInfo
 
struct  PathInfo
 
struct  PathProfilesPerProcess
 
struct  ProcessDescription
 
struct  StreamData
 
struct  SummaryPlots
 
struct  SummaryPlotsPerProcess
 
struct  SummaryProfiles
 
struct  SummaryProfilesPerProcess
 
struct  Timing
 
struct  TimingPerProcess
 

Public Member Functions

double currentEventTime (edm::StreamID) const
 
double currentModuleTime (edm::StreamID) const
 
double currentPathTime (edm::StreamID) const
 
 FastTimerService (const edm::ParameterSet &, edm::ActivityRegistry &)
 
double queryEventTime (edm::StreamID) const
 
double queryModuleTime (edm::StreamID, const edm::ModuleDescription &) const
 
double queryModuleTime (edm::StreamID, unsigned int id) const
 
double queryModuleTimeByLabel (edm::StreamID, const std::string &) const
 
double queryModuleTimeByType (edm::StreamID, const std::string &) const
 
double querySourceTime (edm::StreamID) const
 
unsigned int reserveLuminosityPlots (std::string const &name, std::string const &title, std::string const &label, double range, double resolution)
 
unsigned int reserveLuminosityPlots (std::string &&name, std::string &&title, std::string &&label, double range, double resolution)
 
void setLuminosity (unsigned int stream_id, unsigned int luminosity_id, double value)
 
 ~FastTimerService ()
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 

Private Types

template<typename T >
using ModuleMap = std::vector< T >
 
template<typename T >
using PathMap = std::vector< std::unordered_map< std::string, T >>
 

Private Member Functions

void fillPathMap (unsigned int pid, std::string const &name, std::vector< std::string > const &modules)
 
void postEndJob ()
 
void postEvent (edm::StreamContext const &)
 
void postGlobalEndRun (edm::GlobalContext const &)
 
void postModuleEvent (edm::StreamContext const &, edm::ModuleCallingContext const &)
 
void postModuleEventDelayedGet (edm::StreamContext const &, edm::ModuleCallingContext const &)
 
void postPathEvent (edm::StreamContext const &, edm::PathContext const &, edm::HLTPathStatus const &)
 
void postSourceEvent (edm::StreamID)
 
void postStreamBeginLumi (edm::StreamContext const &)
 
void postStreamBeginRun (edm::StreamContext const &)
 
void postStreamEndLumi (edm::StreamContext const &)
 
void postStreamEndRun (edm::StreamContext const &)
 
void preallocate (edm::service::SystemBounds const &)
 
void preEvent (edm::StreamContext const &)
 
void preGlobalBeginRun (edm::GlobalContext const &)
 
void preModuleBeginJob (edm::ModuleDescription const &)
 
void preModuleEvent (edm::StreamContext const &, edm::ModuleCallingContext const &)
 
void preModuleEventDelayedGet (edm::StreamContext const &, edm::ModuleCallingContext const &)
 
void prePathEvent (edm::StreamContext const &, edm::PathContext const &)
 
void preSourceEvent (edm::StreamID)
 
void preStreamBeginRun (edm::StreamContext const &)
 
void printProcessSummary (Timing const &total, TimingPerProcess const &summary, std::string const &label, std::string const &process) const
 
void printSummary (Timing const &summary, std::string const &label) const
 

Static Private Member Functions

static double delta (FastTimer::Clock::time_point const &first, FastTimer::Clock::time_point const &second)
 
static unsigned int processID (edm::ProcessContext const *)
 

Private Attributes

unsigned int m_concurrent_runs
 
unsigned int m_concurrent_streams
 
unsigned int m_concurrent_threads
 
const double m_dqm_eventtime_range
 
const double m_dqm_eventtime_resolution
 
std::vector
< LuminosityDescription
m_dqm_luminosity
 
const double m_dqm_moduletime_range
 
const double m_dqm_moduletime_resolution
 
std::string m_dqm_path
 
const double m_dqm_pathtime_range
 
const double m_dqm_pathtime_resolution
 
bool m_enable_dqm
 
const bool m_enable_dqm_byls
 
const bool m_enable_dqm_bymodule
 
const bool m_enable_dqm_bymoduletype
 
const bool m_enable_dqm_bynproc
 
const bool m_enable_dqm_bypath_active
 
const bool m_enable_dqm_bypath_counters
 
const bool m_enable_dqm_bypath_details
 
const bool m_enable_dqm_bypath_exclusive
 
const bool m_enable_dqm_bypath_overhead
 
const bool m_enable_dqm_bypath_total
 
const bool m_enable_dqm_summary
 
bool m_enable_timing_exclusive
 
bool m_enable_timing_modules
 
bool m_enable_timing_paths
 
const bool m_enable_timing_summary
 
Timing m_job_summary
 
std::vector< TimingPerProcessm_job_summary_perprocess
 
unsigned int m_module_id
 
std::vector< ProcessDescriptionm_process
 
std::vector< Timingm_run_summary
 
std::vector< std::vector
< TimingPerProcess > > 
m_run_summary_perprocess
 
const bool m_skip_first_path
 
std::vector< StreamDatam_stream
 
std::mutex m_summary_mutex
 
bool m_use_realtime
 

Detailed Description

Definition at line 84 of file FastTimerService.h.

Member Typedef Documentation

template<typename T >
using FastTimerService::ModuleMap = std::vector<T>
private

Definition at line 328 of file FastTimerService.h.

template<typename T >
using FastTimerService::PathMap = std::vector<std::unordered_map<std::string, T>>
private

Definition at line 324 of file FastTimerService.h.

Constructor & Destructor Documentation

FastTimerService::FastTimerService ( const edm::ParameterSet config,
edm::ActivityRegistry registry 
)

Definition at line 41 of file FastTimerService.cc.

References edm::ParameterSet::getUntrackedParameter(), m_enable_dqm_byls, m_enable_dqm_bymodule, m_enable_dqm_bymoduletype, m_enable_dqm_bypath_active, m_enable_dqm_bypath_counters, m_enable_dqm_bypath_details, m_enable_dqm_bypath_exclusive, m_enable_dqm_bypath_overhead, m_enable_dqm_bypath_total, m_enable_timing_exclusive, m_enable_timing_modules, m_enable_timing_paths, or, postEndJob(), postEvent(), postGlobalEndRun(), postModuleEvent(), postModuleEventDelayedGet(), postPathEvent(), postSourceEvent(), postStreamBeginLumi(), postStreamBeginRun(), postStreamEndLumi(), postStreamEndRun(), preallocate(), preEvent(), preGlobalBeginRun(), preModuleBeginJob(), preModuleEvent(), preModuleEventDelayedGet(), prePathEvent(), preSourceEvent(), preStreamBeginRun(), reserveLuminosityPlots(), edm::ActivityRegistry::watchPostEndJob(), edm::ActivityRegistry::watchPostEvent(), edm::ActivityRegistry::watchPostGlobalEndRun(), edm::ActivityRegistry::watchPostModuleEvent(), edm::ActivityRegistry::watchPostModuleEventDelayedGet(), edm::ActivityRegistry::watchPostPathEvent(), edm::ActivityRegistry::watchPostSourceEvent(), edm::ActivityRegistry::watchPostStreamBeginLumi(), edm::ActivityRegistry::watchPostStreamBeginRun(), edm::ActivityRegistry::watchPostStreamEndLumi(), edm::ActivityRegistry::watchPostStreamEndRun(), edm::ActivityRegistry::watchPreallocate(), edm::ActivityRegistry::watchPreEvent(), edm::ActivityRegistry::watchPreGlobalBeginRun(), edm::ActivityRegistry::watchPreModuleBeginJob(), edm::ActivityRegistry::watchPreModuleEvent(), edm::ActivityRegistry::watchPreModuleEventDelayedGet(), edm::ActivityRegistry::watchPrePathEvent(), edm::ActivityRegistry::watchPreSourceEvent(), and edm::ActivityRegistry::watchPreStreamBeginRun().

41  :
42  // configuration
43  // FIXME - reimplement support for cpu time vs. real time
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" ) ),
50  // dqm configuration
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" ) ),
63  // job configuration
64  m_concurrent_runs( 0 ),
68  m_dqm_eventtime_range( config.getUntrackedParameter<double>( "dqmTimeRange" ) ), // ms
69  m_dqm_eventtime_resolution( config.getUntrackedParameter<double>( "dqmTimeResolution" ) ), // ms
70  m_dqm_pathtime_range( config.getUntrackedParameter<double>( "dqmPathTimeRange" ) ), // ms
71  m_dqm_pathtime_resolution( config.getUntrackedParameter<double>( "dqmPathTimeResolution" ) ), // ms
72  m_dqm_moduletime_range( config.getUntrackedParameter<double>( "dqmModuleTimeRange" ) ), // ms
73  m_dqm_moduletime_resolution( config.getUntrackedParameter<double>( "dqmModuleTimeResolution" ) ), // ms
74  m_dqm_path( config.getUntrackedParameter<std::string>("dqmPath" ) ),
75  // description of the process(es)
76  m_process(),
77  // description of the luminosity axes
79  // DQM - these are initialized at preStreamBeginRun(), to make sure the DQM service has been loaded
80  m_stream(),
81  // summary data
82  m_run_summary(),
83  m_job_summary(),
86 {
87  // enable timers if required by DQM plots
95 
104 
107 
108 
117  registry.watchPostEndJob( this, & FastTimerService::postEndJob );
121  registry.watchPreEvent( this, & FastTimerService::preEvent );
122  registry.watchPostEvent( this, & FastTimerService::postEvent );
123  // watch per-path events
126  // watch per-module events if enabled
132  }
133 
134  // if requested, reserve plots for timing vs. lumisection
135  // there is no need to store the id, as it wil always be 0
136  if (m_enable_dqm_byls)
137  reserveLuminosityPlots("ls", "lumisection", "lumisection", config.getUntrackedParameter<uint32_t>("dqmLumiSectionsRange"), 1.);
138 
139 }
void preGlobalBeginRun(edm::GlobalContext const &)
void preModuleEventDelayedGet(edm::StreamContext const &, edm::ModuleCallingContext const &)
T getUntrackedParameter(std::string const &, T const &) const
void postStreamBeginRun(edm::StreamContext const &)
void watchPreEvent(PreEvent::slot_type const &iSlot)
const double m_dqm_eventtime_resolution
void postStreamEndLumi(edm::StreamContext const &)
void watchPrePathEvent(PrePathEvent::slot_type const &iSlot)
void watchPreallocate(Preallocate::slot_type const &iSlot)
void watchPostEndJob(PostEndJob::slot_type const &iSlot)
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
Definition: Activities.doc:12
void postModuleEvent(edm::StreamContext const &, edm::ModuleCallingContext const &)
void watchPreModuleEvent(PreModuleEvent::slot_type const &iSlot)
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
std::vector< ProcessDescription > m_process
void watchPostStreamEndLumi(PostStreamEndLumi::slot_type const &iSlot)
const double m_dqm_pathtime_range
void watchPostPathEvent(PostPathEvent::slot_type const &iSlot)
void watchPostModuleEvent(PostModuleEvent::slot_type const &iSlot)
void watchPostSourceEvent(PostSourceEvent::slot_type const &iSlot)
std::vector< TimingPerProcess > m_job_summary_perprocess
void postPathEvent(edm::StreamContext const &, edm::PathContext const &, edm::HLTPathStatus const &)
unsigned int m_concurrent_threads
std::string m_dqm_path
unsigned int m_concurrent_runs
void postStreamBeginLumi(edm::StreamContext const &)
void preModuleBeginJob(edm::ModuleDescription const &)
const bool m_enable_dqm_bynproc
std::vector< LuminosityDescription > m_dqm_luminosity
unsigned int m_module_id
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
void watchPreModuleEventDelayedGet(PreModuleEventDelayedGet::slot_type const &iSlot)
void postEvent(edm::StreamContext const &)
void postGlobalEndRun(edm::GlobalContext const &)
std::vector< std::vector< TimingPerProcess > > m_run_summary_perprocess
void postStreamEndRun(edm::StreamContext const &)
void preModuleEvent(edm::StreamContext const &, edm::ModuleCallingContext const &)
const bool m_enable_dqm_bypath_details
std::vector< Timing > m_run_summary
const bool m_enable_dqm_bypath_overhead
static constexpr unsigned int invalidID()
Returns a value identifying an invalid id (the max unsigned int value)
void watchPreModuleBeginJob(PreModuleBeginJob::slot_type const &iSlot)
void watchPostStreamEndRun(PostStreamEndRun::slot_type const &iSlot)
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
void watchPostModuleEventDelayedGet(PostModuleEventDelayedGet::slot_type const &iSlot)
void watchPostGlobalEndRun(PostGlobalEndRun::slot_type const &iSlot)
void preSourceEvent(edm::StreamID)
void preEvent(edm::StreamContext const &)
const bool m_enable_timing_summary
void postSourceEvent(edm::StreamID)
const bool m_enable_dqm_bymoduletype
const bool m_enable_dqm_summary
void watchPostStreamBeginRun(PostStreamBeginRun::slot_type const &iSlot)
const bool m_enable_dqm_bypath_total
void watchPreStreamBeginRun(PreStreamBeginRun::slot_type const &iSlot)
const bool m_enable_dqm_bypath_active
void watchPreSourceEvent(PreSourceEvent::slot_type const &iSlot)
void preStreamBeginRun(edm::StreamContext const &)
std::vector< StreamData > m_stream
unsigned int reserveLuminosityPlots(std::string const &name, std::string const &title, std::string const &label, double range, double resolution)
void preallocate(edm::service::SystemBounds const &)
const double m_dqm_eventtime_range
const double m_dqm_pathtime_resolution
FastTimerService::~FastTimerService ( )

Definition at line 141 of file FastTimerService.cc.

142 {
143 }

Member Function Documentation

double FastTimerService::currentEventTime ( edm::StreamID  sid) const

Definition at line 1303 of file FastTimerService.cc.

References m_stream.

1303  {
1304  return m_stream[sid].timer_event.secondsUntilNow();
1305 }
std::vector< StreamData > m_stream
double FastTimerService::currentModuleTime ( edm::StreamID  sid) const

Definition at line 1293 of file FastTimerService.cc.

References m_stream.

1293  {
1294  return m_stream[sid].current_module->timer.secondsUntilNow();
1295 }
std::vector< StreamData > m_stream
double FastTimerService::currentPathTime ( edm::StreamID  sid) const

Definition at line 1298 of file FastTimerService.cc.

References m_stream.

1298  {
1299  return m_stream[sid].current_path->timer.secondsUntilNow();
1300 }
std::vector< StreamData > m_stream
static double FastTimerService::delta ( FastTimer::Clock::time_point const &  first,
FastTimer::Clock::time_point const &  second 
)
inlinestaticprivate

Definition at line 754 of file FastTimerService.h.

References prof2calltree::count, and plotBeamSpotDB::first.

Referenced by postEvent(), postPathEvent(), preEvent(), prePathEvent(), and preSourceEvent().

755  {
756  return std::chrono::duration_cast<std::chrono::duration<double>>(second - first).count();
757  }
U second(std::pair< T, U > const &p)
void FastTimerService::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 1409 of file FastTimerService.cc.

References edm::ConfigurationDescriptions::add(), edm::ParameterSetDescription::addUntracked(), and AlCaHLTBitMon_QueryRunRegistry::string.

1409  {
1411  desc.addUntracked<bool>( "useRealTimeClock", true);
1412  desc.addUntracked<bool>( "enableTimingPaths", true);
1413  desc.addUntracked<bool>( "enableTimingModules", true);
1414  desc.addUntracked<bool>( "enableTimingExclusive", false);
1415  desc.addUntracked<bool>( "enableTimingSummary", false);
1416  desc.addUntracked<bool>( "skipFirstPath", false),
1417  desc.addUntracked<bool>( "enableDQM", true);
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);
1424  desc.addUntracked<bool>( "enableDQMbyModule", false);
1425  desc.addUntracked<bool>( "enableDQMbyModuleType", false);
1426  desc.addUntracked<bool>( "enableDQMSummary", false);
1427  desc.addUntracked<bool>( "enableDQMbyLumiSection", false);
1428  desc.addUntracked<bool>( "enableDQMbyProcesses", false);
1429  desc.addUntracked<double>( "dqmTimeRange", 1000. ); // ms
1430  desc.addUntracked<double>( "dqmTimeResolution", 5. ); // ms
1431  desc.addUntracked<double>( "dqmPathTimeRange", 100. ); // ms
1432  desc.addUntracked<double>( "dqmPathTimeResolution", 0.5); // ms
1433  desc.addUntracked<double>( "dqmModuleTimeRange", 40. ); // ms
1434  desc.addUntracked<double>( "dqmModuleTimeResolution", 0.2); // ms
1435  desc.addUntracked<uint32_t>( "dqmLumiSectionsRange", 2500 ); // ~ 16 hours
1436  desc.addUntracked<std::string>( "dqmPath", "HLT/TimerService");
1437  descriptions.add("FastTimerService", desc);
1438 }
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void FastTimerService::fillPathMap ( unsigned int  pid,
std::string const &  name,
std::vector< std::string > const &  modules 
)
private

Definition at line 1261 of file FastTimerService.cc.

References diffTwoXMLs::label, m_stream, python.rootplot.argparse::module, mergeVDriftHistosByStation::name, or, sysUtil::pid, fetchall_from_DQM_v2::pool, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by preGlobalBeginRun().

1261  {
1262  for (auto & stream: m_stream) {
1263 
1264  std::vector<ModuleInfo *> & pathmap = stream.paths[pid][name].modules;
1265  pathmap.clear();
1266  pathmap.reserve( modules.size() );
1267  std::unordered_set<ModuleInfo const *> pool; // keep track of inserted modules
1268  for (auto const & module: modules) {
1269  // fix the name of negated or ignored modules
1270  std::string const & label = (module[0] == '!' or module[0] == '-') ? module.substr(1) : module;
1271 
1272  auto const & it = stream.modules.find(label);
1273  if (it == stream.modules.end()) {
1274  // no matching module was found
1275  pathmap.push_back( 0 );
1276  } else if (pool.insert(& it->second).second) {
1277  // new module
1278  pathmap.push_back(& it->second);
1279  } else {
1280  // duplicate module
1281  pathmap.push_back( 0 );
1282  }
1283  }
1284 
1285  }
1286 }
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
Definition: Activities.doc:12
tuple pid
Definition: sysUtil.py:22
std::vector< StreamData > m_stream
Definition: vlib.h:208
void FastTimerService::postEndJob ( )
private

Definition at line 639 of file FastTimerService.cc.

References diffTwoXMLs::label, m_enable_timing_summary, m_job_summary, m_job_summary_perprocess, m_process, mergeVDriftHistosByStation::name, sysUtil::pid, printProcessSummary(), printSummary(), and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by FastTimerService().

640 {
642  const std::string label = "the whole job";
643  for (unsigned int pid = 0; pid < m_process.size(); ++pid)
645 
646  printSummary(m_job_summary, label);
647  }
648 }
void printSummary(Timing const &summary, std::string const &label) const
std::vector< ProcessDescription > m_process
std::vector< TimingPerProcess > m_job_summary_perprocess
tuple pid
Definition: sysUtil.py:22
const bool m_enable_timing_summary
void printProcessSummary(Timing const &total, TimingPerProcess const &summary, std::string const &label, std::string const &process) const
void FastTimerService::postEvent ( edm::StreamContext const &  sc)
private

Definition at line 797 of file FastTimerService.cc.

References FastTimerService::PathInfo::accept, FastTimerService::ModuleInfo::counter, delta(), FastTimerService::ModuleInfo::dqm_active, FastTimerService::PathInfo::dqm_active, FastTimerService::PathInfo::dqm_exclusive, FastTimerService::PathInfo::dqm_intermodules, FastTimerService::PathInfo::dqm_module_active, FastTimerService::PathInfo::dqm_module_counter, FastTimerService::PathInfo::dqm_module_total, FastTimerService::PathInfo::dqm_overhead, FastTimerService::PathInfo::dqm_postmodules, FastTimerService::PathInfo::dqm_premodules, FastTimerService::PathInfo::dqm_total, i, FastTimerService::PathInfo::index, FastTimerService::PathInfo::last_run, m_dqm_luminosity, m_enable_dqm, m_enable_dqm_bymodule, m_enable_dqm_bymoduletype, m_enable_dqm_bypath_active, m_enable_dqm_bypath_counters, m_enable_dqm_bypath_details, m_enable_dqm_bypath_exclusive, m_enable_dqm_bypath_overhead, m_enable_dqm_bypath_total, m_enable_dqm_summary, m_enable_timing_exclusive, m_enable_timing_modules, m_enable_timing_paths, m_job_summary, m_job_summary_perprocess, m_process, m_run_summary, m_run_summary_perprocess, m_stream, m_summary_mutex, FastTimerService::PathInfo::modules, sysUtil::pid, edm::StreamContext::processContext(), processID(), FastTimerService::ModuleInfo::run_in_path, edm::StreamContext::runIndex(), edm::StreamContext::streamID(), FastTimerService::ModuleInfo::summary_active, FastTimerService::ModuleInfo::time_active, FastTimerService::PathInfo::time_active, FastTimerService::PathInfo::time_exclusive, FastTimerService::PathInfo::time_intermodules, FastTimerService::PathInfo::time_overhead, FastTimerService::PathInfo::time_postmodules, FastTimerService::PathInfo::time_premodules, and FastTimerService::PathInfo::time_total.

Referenced by FastTimerService().

797  {
798  unsigned int pid = processID(sc.processContext());
799  unsigned int sid = sc.streamID();
800  unsigned int rid = sc.runIndex();
801  auto & stream = m_stream[sid];
802 
803  // stop the per-event timer, and account event time
804  stream.timer_event.stop();
805  stream.timer_last_transition = stream.timer_event.getStopTime();
806  stream.timing_perprocess[pid].event = stream.timer_event.seconds();
807 
808  // the last part of inter-path overhead is the time between the end of the last (end)path and the end of the event processing
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;
812 
813  {
814  // prevent different threads from updating the summary information at the same time
815  std::lock_guard<std::mutex> lock_summary(m_summary_mutex);
816 
817  // keep track of the total number of events and add this event's time to the per-run and per-job summary
818  m_run_summary_perprocess[rid][pid] += stream.timing_perprocess[pid];
819  m_job_summary_perprocess[pid] += stream.timing_perprocess[pid];
820 
821  // account the whole event timing details
822  if (pid+1 == m_process.size()) {
823  stream.timing.count = 1;
824  stream.timing.preevent = stream.timing_perprocess[0].preevent;
825  stream.timing.event = stream.timing_perprocess[0].event;
826  for (unsigned int i = 1; i < m_process.size(); ++i) {
827  stream.timing.event += stream.timing_perprocess[i].preevent;
828  stream.timing.event += stream.timing_perprocess[i].event;
829  }
830  m_run_summary[rid] += stream.timing;
831  m_job_summary += stream.timing;
832  }
833  }
834 
835  // elaborate "exclusive" modules
837  for (auto & keyval: stream.paths[pid]) {
838  PathInfo & pathinfo = keyval.second;
839  pathinfo.time_exclusive = pathinfo.time_overhead;
840 
841  for (uint32_t i = 0; i < pathinfo.last_run; ++i) {
842  ModuleInfo * module = pathinfo.modules[i];
843  if (module == 0)
844  // this is a module occurring more than once in the same path, skip it after the first occurrence
845  continue;
846  if ((module->run_in_path == & pathinfo) and (module->counter == 1))
847  pathinfo.time_exclusive += module->time_active;
848  }
849  }
850  }
851 
852  // fill the information per module type
853  // note: this is done here because during event processing two theads could try to update the same module type at the same time
854  // note: this is done only for the last subprocess, to avoid double conuting the modules' contributions
855  if ((m_enable_timing_modules) and (pid+1 == m_process.size())) {
856  for (unsigned int i = 0; i < stream.fast_modules.size(); ++i)
857  // check for null pointers - there is no guarantee that all module ids are valid and used
858  if (stream.fast_modules[i]) {
859  double active = stream.fast_modules[i]->time_active;
860  ModuleInfo & moduletype = * stream.fast_moduletypes[i];
861  moduletype.time_active += active;
862  moduletype.summary_active += active;
863  }
864  }
865 
866  // fill the DQM plots from the internal buffers
867  if (not m_enable_dqm)
868  return;
869 
870  // fill plots for per-event time by path
871  if (m_enable_timing_paths) {
872 
873  for (auto & keyval: stream.paths[pid]) {
874  PathInfo & pathinfo = keyval.second;
875 
876  stream.dqm_paths[pid].active_time->Fill(pathinfo.index, pathinfo.time_active * 1000.);
878  pathinfo.dqm_active->Fill(pathinfo.time_active * 1000.);
879 
880  stream.dqm_paths[pid].exclusive_time->Fill(pathinfo.index, pathinfo.time_exclusive * 1000.);
882  pathinfo.dqm_exclusive->Fill(pathinfo.time_exclusive * 1000.);
883 
884  stream.dqm_paths[pid].total_time->Fill(pathinfo.index, pathinfo.time_total * 1000.);
886  pathinfo.dqm_total->Fill(pathinfo.time_total * 1000.);
887 
888  // fill path overhead histograms
890  pathinfo.dqm_premodules ->Fill(pathinfo.time_premodules * 1000.);
891  pathinfo.dqm_intermodules->Fill(pathinfo.time_intermodules * 1000.);
892  pathinfo.dqm_postmodules ->Fill(pathinfo.time_postmodules * 1000.);
893  pathinfo.dqm_overhead ->Fill(pathinfo.time_overhead * 1000.);
894  }
895 
896  // fill detailed timing histograms
898  for (uint32_t i = 0; i < pathinfo.last_run; ++i) {
899  ModuleInfo * module = pathinfo.modules[i];
900  // skip duplicate modules
901  if (module == nullptr)
902  continue;
903  // fill the total time for all non-duplicate modules
904  pathinfo.dqm_module_total->Fill(i, module->time_active * 1000.);
905  // fill the active time only for module that have actually run in this path
906  if (module->run_in_path == & pathinfo)
907  pathinfo.dqm_module_active->Fill(i, module->time_active * 1000.);
908  }
909  }
910 
911  // fill path counter histograms
912  // - also for duplicate modules, to properly extract rejection information
913  // - fill the N+1th bin for paths accepting the event, so the FastTimerServiceClient can properly measure the last filter efficiency
915  for (uint32_t i = 0; i < pathinfo.last_run; ++i)
916  pathinfo.dqm_module_counter->Fill(i);
917  if (pathinfo.accept)
918  pathinfo.dqm_module_counter->Fill(pathinfo.modules.size());
919  }
920 
921  }
922  }
923 
924  // fill plots for per-event time by module
925  // note: this is done only for the last subprocess, to avoid filling the same plots multiple times
926  if ((m_enable_dqm_bymodule) and (pid+1 == m_process.size())) {
927  for (auto & keyval : stream.modules) {
928  ModuleInfo & module = keyval.second;
929  module.dqm_active->Fill(module.time_active * 1000.);
930  }
931  }
932 
933  // fill plots for per-event time by module type
934  // note: this is done only for the last subprocess, to avoid filling the same plots multiple times
935  if ((m_enable_dqm_bymoduletype) and (pid+1 == m_process.size())) {
936  for (auto & keyval : stream.moduletypes) {
937  ModuleInfo & module = keyval.second;
938  module.dqm_active->Fill(module.time_active * 1000.);
939  }
940  }
941 
942  // fill the interpath overhead plot
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.);
946 
947  if (m_enable_dqm_summary) {
948  if (pid+1 == m_process.size())
949  stream.dqm.fill(stream.timing);
950  stream.dqm_perprocess[pid].fill(stream.timing_perprocess[pid]);
951  }
952 
953  if (not m_dqm_luminosity.empty()) {
954  if (pid+1 == m_process.size())
955  for (unsigned int i = 0; i < m_dqm_luminosity.size(); ++i)
956  stream.dqm_byluminosity[i].fill(stream.luminosity[i], stream.timing);
957  for (unsigned int i = 0; i < m_dqm_luminosity.size(); ++i)
958  stream.dqm_perprocess_byluminosity[pid][i].fill(stream.luminosity[i], stream.timing_perprocess[pid]);
959  }
960 
961 }
int i
Definition: DBlmapReader.cc:9
static double delta(FastTimer::Clock::time_point const &first, FastTimer::Clock::time_point const &second)
const bool m_enable_dqm_bypath_counters
const bool m_enable_dqm_bypath_exclusive
std::vector< ProcessDescription > m_process
std::vector< TimingPerProcess > m_job_summary_perprocess
std::vector< LuminosityDescription > m_dqm_luminosity
std::mutex m_summary_mutex
std::vector< std::vector< TimingPerProcess > > m_run_summary_perprocess
const bool m_enable_dqm_bypath_details
std::vector< Timing > m_run_summary
const bool m_enable_dqm_bypath_overhead
const bool m_enable_dqm_bymodule
tuple pid
Definition: sysUtil.py:22
const bool m_enable_dqm_bymoduletype
const bool m_enable_dqm_summary
const bool m_enable_dqm_bypath_total
const bool m_enable_dqm_bypath_active
static unsigned int processID(edm::ProcessContext const *)
std::vector< StreamData > m_stream
Definition: vlib.h:208
void FastTimerService::postGlobalEndRun ( edm::GlobalContext const &  gc)
private

Definition at line 623 of file FastTimerService.cc.

References cmsPerfStripChart::format, diffTwoXMLs::label, edm::GlobalContext::luminosityBlockID(), m_enable_timing_summary, m_process, m_run_summary, m_run_summary_perprocess, mergeVDriftHistosByStation::name, sysUtil::pid, printProcessSummary(), printSummary(), edm::GlobalContext::processContext(), processID(), edm::LuminosityBlockID::run(), DTTTrigCorrFirst::run, edm::GlobalContext::runIndex(), and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by FastTimerService().

624 {
626  unsigned int pid = processID(gc.processContext());
627  unsigned int rid = gc.runIndex();
628  unsigned int run = gc.luminosityBlockID().run();
629  const std::string label = (boost::format("run %d") % run).str();
630 
632 
633  if (pid+1 == m_process.size())
634  printSummary(m_run_summary[rid], label);
635  }
636 }
void printSummary(Timing const &summary, std::string const &label) const
std::vector< ProcessDescription > m_process
string format
Some error handling for the usage.
std::vector< std::vector< TimingPerProcess > > m_run_summary_perprocess
std::vector< Timing > m_run_summary
tuple pid
Definition: sysUtil.py:22
const bool m_enable_timing_summary
static unsigned int processID(edm::ProcessContext const *)
void printProcessSummary(Timing const &total, TimingPerProcess const &summary, std::string const &label, std::string const &process) const
void FastTimerService::postModuleEvent ( edm::StreamContext const &  sc,
edm::ModuleCallingContext const &  mcc 
)
private

Definition at line 1170 of file FastTimerService.cc.

References assert(), edm::ModuleDescription::id(), m_enable_timing_modules, m_stream, popcon2dropbox_job_conf::md, edm::ModuleCallingContext::moduleDescription(), edm::ModuleDescription::moduleLabel(), FastTimer::seconds(), FastTimer::stop(), edm::StreamContext::streamID(), FastTimerService::ModuleInfo::summary_active, FastTimerService::ModuleInfo::time_active, FastTimerService::ModuleInfo::timer, and edm::StreamID::value().

Referenced by FastTimerService().

1170  {
1171  // this is ever called only if m_enable_timing_modules = true
1173 
1174  if (mcc.moduleDescription() == nullptr) {
1175  edm::LogError("FastTimerService") << "FastTimerService::postModuleEventDelayedGet: invalid module";
1176  return;
1177  }
1178 
1179  edm::ModuleDescription const & md = * mcc.moduleDescription();
1180  unsigned int sid = sc.streamID().value();
1181  auto & stream = m_stream[sid];
1182 
1183  double active = 0.;
1184 
1185  // time and account each module
1186  if (md.id() < stream.fast_modules.size()) {
1187  ModuleInfo & module = * stream.fast_modules[md.id()];
1188  module.timer.stop();
1189  active = module.timer.seconds();
1190  module.time_active = active;
1191  module.summary_active += active;
1192  // plots are filled post event processing
1193  } else {
1194  // should never get here
1195  edm::LogError("FastTimerService") << "FastTimerService::postModuleEvent: unexpected module " << md.moduleLabel();
1196  }
1197 }
assert(m_qm.get())
std::string const & moduleLabel() const
std::vector< StreamData > m_stream
Definition: vlib.h:208
unsigned int id() const
void FastTimerService::postModuleEventDelayedGet ( edm::StreamContext const &  sc,
edm::ModuleCallingContext const &  mcc 
)
private

Definition at line 1234 of file FastTimerService.cc.

References assert(), edm::ModuleDescription::id(), edm::ModuleCallingContext::kRunning, m_enable_timing_modules, m_stream, popcon2dropbox_job_conf::md, edm::ModuleCallingContext::moduleDescription(), edm::ModuleDescription::moduleLabel(), FastTimer::resume(), edm::ModuleCallingContext::state(), edm::StreamContext::streamID(), FastTimerService::ModuleInfo::timer, and edm::StreamID::value().

Referenced by FastTimerService().

1234  {
1235  // this is ever called only if m_enable_timing_modules = true
1237 
1238  if (mcc.moduleDescription() == nullptr) {
1239  edm::LogError("FastTimerService") << "FastTimerService::postModuleEventDelayedGet: invalid module";
1240  return;
1241  }
1242 
1243  edm::ModuleDescription const & md = * mcc.moduleDescription();
1244  unsigned int sid = sc.streamID().value();
1245  auto & stream = m_stream[sid];
1246 
1247  // see the description of the possible ModuleCallingContext states in preModuleEventDelayedGet, above.
1248  if (mcc.state() == edm::ModuleCallingContext::State::kRunning) {
1249  if (md.id() < stream.fast_modules.size()) {
1250  ModuleInfo & module = * stream.fast_modules[md.id()];
1251  module.timer.resume();
1252  } else {
1253  // should never get here
1254  edm::LogError("FastTimerService") << "FastTimerService::postModuleEventDelayedGet: unexpected module " << md.moduleLabel();
1255  }
1256  }
1257 
1258 }
assert(m_qm.get())
std::string const & moduleLabel() const
std::vector< StreamData > m_stream
Definition: vlib.h:208
unsigned int id() const
void FastTimerService::postPathEvent ( edm::StreamContext const &  sc,
edm::PathContext const &  pc,
edm::HLTPathStatus const &  status 
)
private

Definition at line 1037 of file FastTimerService.cc.

References funct::abs(), edm::HLTPathStatus::accept(), FastTimerService::PathInfo::accept, FastTimerService::ModuleInfo::counter, cond::rpcobimon::current, delta(), alignCSCRings::e, i, edm::HLTPathStatus::index(), inter, FastTimerService::PathInfo::last_run, m_enable_timing_modules, m_enable_timing_paths, m_process, m_stream, FastTimerService::PathInfo::modules, cmsHarvester::path, edm::PathContext::pathName(), sysUtil::pid, edm::StreamContext::processContext(), processID(), FastTimerService::ModuleInfo::run_in_path, edm::StreamContext::streamID(), AlCaHLTBitMon_QueryRunRegistry::string, FastTimerService::PathInfo::summary_active, FastTimerService::PathInfo::summary_intermodules, FastTimerService::PathInfo::summary_overhead, FastTimerService::PathInfo::summary_postmodules, FastTimerService::PathInfo::summary_premodules, FastTimerService::PathInfo::summary_total, FastTimerService::ModuleInfo::time_active, FastTimerService::PathInfo::time_intermodules, FastTimerService::PathInfo::time_overhead, FastTimerService::PathInfo::time_postmodules, FastTimerService::PathInfo::time_premodules, FastTimerService::PathInfo::time_total, pileupDistInMC::total, edm::StreamID::value(), and edm::HLTPathStatus::wasrun().

Referenced by FastTimerService().

1037  {
1038  std::string const & path = pc.pathName();
1039  unsigned int pid = processID(sc.processContext());
1040  unsigned int sid = sc.streamID().value();
1041  auto & stream = m_stream[sid];
1042 
1043  if (stream.current_path == nullptr) {
1044  edm::LogError("FastTimerService") << "FastTimerService::postPathEvent: unexpected path " << path;
1045  return;
1046  }
1047 
1048  // time each (end)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();
1052 
1053  double active = stream.current_path->time_active;
1054 
1055  // if enabled, account each (end)path
1056  if (m_enable_timing_paths) {
1057 
1058  PathInfo & pathinfo = * stream.current_path;
1059  pathinfo.summary_active += active;
1060 
1061  // measure the time spent between the execution of the last module and the end of the path
1063  double pre = 0.; // time spent before the first active module
1064  double inter = 0.; // time spent between active modules
1065  double post = 0.; // time spent after the last active module
1066  double overhead = 0.; // time spent before, between, or after modules
1067  double current = 0.; // time spent in modules active in the current path
1068  double total = active; // total per-path time, including modules already run as part of other paths
1069 
1070  // implementation note:
1071  // "active" has already measured all the time spent in this path
1072  // "current" will be the sum of the time spent inside each module while running this path, so that
1073  // "overhead" will be active - current
1074  // "total" will be active + the sum of the time spent in non-active modules
1075 
1076  uint32_t last_run = 0; // index of the last module run in this path, plus one
1077  if (status.wasrun() and not pathinfo.modules.empty())
1078  last_run = status.index() + 1; // index of the last module run in this path, plus one
1079  for (uint32_t i = 0; i < last_run; ++i) {
1080  ModuleInfo * module = pathinfo.modules[i];
1081 
1082  if (module == 0)
1083  // this is a module occurring more than once in the same path, skip it after the first occurrence
1084  continue;
1085 
1086  ++module->counter;
1087  if (module->run_in_path == & pathinfo) {
1088  current += module->time_active;
1089  } else {
1090  total += module->time_active;
1091  }
1092 
1093  }
1094 
1095  if (stream.current_path->first_module == nullptr) {
1096  // no modules were active during this path, account all the time as overhead
1097  pre = 0.;
1098  inter = 0.;
1099  post = active;
1100  overhead = active;
1101  } else {
1102  // extract overhead information
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;
1106  // take care of numeric precision and rounding errors - the timer is less precise than nanosecond resolution
1107  if (std::abs(inter) < 1e-9)
1108  inter = 0.;
1109  overhead = active - current;
1110  // take care of numeric precision and rounding errors - the timer is less precise than nanosecond resolution
1111  if (std::abs(overhead) < 1e-9)
1112  overhead = 0.;
1113  }
1114 
1115  pathinfo.time_premodules = pre;
1116  pathinfo.time_intermodules = inter;
1117  pathinfo.time_postmodules = post;
1118  pathinfo.time_overhead = overhead;
1119  pathinfo.time_total = total;
1120  pathinfo.summary_premodules += pre;
1121  pathinfo.summary_intermodules += inter;
1122  pathinfo.summary_postmodules += post;
1123  pathinfo.summary_overhead += overhead;
1124  pathinfo.summary_total += total;
1125  pathinfo.last_run = last_run;
1126  pathinfo.accept = status.accept();
1127  }
1128  }
1129 
1130  if (path == m_process[pid].last_path) {
1131  // this is the last path, stop and account the "all paths" counter
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) {
1135  // this is the last endpath, stop and account the "all endpaths" counter
1136  stream.timer_endpaths.setStopTime(stream.current_path->timer.getStopTime());
1137  stream.timing_perprocess[pid].all_endpaths = stream.timer_endpaths.seconds();
1138  }
1139 
1140 }
int i
Definition: DBlmapReader.cc:9
static double delta(FastTimer::Clock::time_point const &first, FastTimer::Clock::time_point const &second)
std::vector< ProcessDescription > m_process
tuple path
else: Piece not in the list, fine.
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int inter
tuple pid
Definition: sysUtil.py:22
tuple status
Definition: ntuplemaker.py:245
static unsigned int processID(edm::ProcessContext const *)
std::vector< StreamData > m_stream
Definition: vlib.h:208
void FastTimerService::postSourceEvent ( edm::StreamID  sid)
private

Definition at line 989 of file FastTimerService.cc.

References m_stream.

Referenced by FastTimerService().

989  {
990  auto & stream = m_stream[sid];
991  stream.timer_source.stop();
992  stream.timer_last_transition = stream.timer_source.getStopTime();
993 
994  // account the time spent in the source
995  stream.timing.source = stream.timer_source.seconds();
996 }
std::vector< StreamData > m_stream
void FastTimerService::postStreamBeginLumi ( edm::StreamContext const &  sc)
private

Definition at line 602 of file FastTimerService.cc.

References m_stream, fileCollector::now, edm::StreamContext::streamID(), and edm::StreamID::value().

Referenced by FastTimerService().

602  {
603  unsigned int sid = sc.streamID().value();
604  auto & stream = m_stream[sid];
605  stream.timer_last_transition = FastTimer::Clock::now();
606 }
std::vector< StreamData > m_stream
void FastTimerService::postStreamBeginRun ( edm::StreamContext const &  sc)
private

Definition at line 579 of file FastTimerService.cc.

References m_stream, fileCollector::now, edm::StreamContext::streamID(), and edm::StreamID::value().

Referenced by FastTimerService().

579  {
580  unsigned int sid = sc.streamID().value();
581  auto & stream = m_stream[sid];
582  stream.timer_last_transition = FastTimer::Clock::now();
583 }
std::vector< StreamData > m_stream
void FastTimerService::postStreamEndLumi ( edm::StreamContext const &  sc)
private

Definition at line 609 of file FastTimerService.cc.

References assert(), edm::StreamContext::eventID(), edm::EventID::luminosityBlock(), m_enable_dqm, m_module_id, m_stream, DQMStore::mergeAndResetMEsLuminositySummaryCache(), fileCollector::now, cppFunctionSkipper::operator, edm::EventID::run(), edm::StreamContext::streamID(), and edm::StreamID::value().

Referenced by FastTimerService().

609  {
610  unsigned int sid = sc.streamID().value();
611  auto & stream = m_stream[sid];
612 
613  if (m_enable_dqm) {
614  DQMStore * store = edm::Service<DQMStore>().operator->();
615  assert(store);
616  store->mergeAndResetMEsLuminositySummaryCache(sc.eventID().run(),sc.eventID().luminosityBlock(),sid, m_module_id);
617  }
618 
619  stream.timer_last_transition = FastTimer::Clock::now();
620 }
assert(m_qm.get())
unsigned int m_module_id
std::vector< StreamData > m_stream
void FastTimerService::postStreamEndRun ( edm::StreamContext const &  sc)
private

Definition at line 586 of file FastTimerService.cc.

References assert(), edm::StreamContext::eventID(), m_enable_dqm, m_module_id, m_stream, DQMStore::mergeAndResetMEsRunSummaryCache(), fileCollector::now, cppFunctionSkipper::operator, edm::EventID::run(), edm::StreamContext::streamID(), and edm::StreamID::value().

Referenced by FastTimerService().

587 {
588  unsigned int sid = sc.streamID().value();
589  auto & stream = m_stream[sid];
590 
591  if (m_enable_dqm) {
592  DQMStore * store = edm::Service<DQMStore>().operator->();
593  assert(store);
594  store->mergeAndResetMEsRunSummaryCache(sc.eventID().run(), sid, m_module_id);
595  }
596 
597  stream.reset();
598  stream.timer_last_transition = FastTimer::Clock::now();
599 }
assert(m_qm.get())
unsigned int m_module_id
std::vector< StreamData > m_stream
void FastTimerService::preallocate ( edm::service::SystemBounds const &  bounds)
private

Definition at line 552 of file FastTimerService.cc.

References cmsPerfStripChart::format, edm::ModuleDescription::getUniqueID(), m_concurrent_runs, m_concurrent_streams, m_concurrent_threads, m_dqm_luminosity, m_dqm_path, m_enable_dqm_bynproc, m_module_id, m_run_summary, m_run_summary_perprocess, m_stream, edm::service::SystemBounds::maxNumberOfConcurrentRuns(), edm::service::SystemBounds::maxNumberOfStreams(), and edm::service::SystemBounds::maxNumberOfThreads().

Referenced by FastTimerService().

553 {
554  m_concurrent_runs = bounds.maxNumberOfConcurrentRuns();
555  m_concurrent_streams = bounds.maxNumberOfStreams();
556  m_concurrent_threads = bounds.maxNumberOfThreads();
557 
559  m_dqm_path += (boost::format("/Running %d processes") % m_concurrent_threads).str();
560 
564 
565  // assign a pseudo module id to the FastTimerService
567  for (auto & stream: m_stream) {
568  stream.fast_modules.resize( m_module_id, nullptr);
569  stream.fast_moduletypes.resize(m_module_id, nullptr);
570  }
571 
572  // resize the luminosity per event buffer
573  for (auto & stream: m_stream)
574  stream.luminosity.resize(m_dqm_luminosity.size(), 0);
575 }
unsigned int m_concurrent_streams
string format
Some error handling for the usage.
unsigned int m_concurrent_threads
static unsigned int getUniqueID()
Returns a unique id each time called. Intended to be passed to ModuleDescription&#39;s constructor&#39;s modI...
std::string m_dqm_path
unsigned int m_concurrent_runs
const bool m_enable_dqm_bynproc
std::vector< LuminosityDescription > m_dqm_luminosity
unsigned int m_module_id
std::vector< std::vector< TimingPerProcess > > m_run_summary_perprocess
std::vector< Timing > m_run_summary
std::vector< StreamData > m_stream
void FastTimerService::preEvent ( edm::StreamContext const &  sc)
private

Definition at line 761 of file FastTimerService.cc.

References delta(), edm::StreamContext::eventID(), edm::EventID::luminosityBlock(), m_enable_dqm_byls, m_stream, sysUtil::pid, edm::StreamContext::processContext(), processID(), setLuminosity(), edm::StreamContext::streamID(), and edm::StreamID::value().

Referenced by FastTimerService().

761  {
762  unsigned int pid = processID(sc.processContext());
763  unsigned int sid = sc.streamID().value();
764  auto & stream = m_stream[sid];
765 
766  // new event, reset the per-event counter
767  stream.timer_event.start();
768 
769  // account the time spent between the last transition and the beginning of the event
770  stream.timing_perprocess[pid].preevent = delta(stream.timer_last_transition, stream.timer_event.getStartTime());
771 
772  // clear the event counters
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.;
786  }
787 
788  // copy the start event timestamp as the end of the previous path
789  // used by the inter-path overhead measurement
790  stream.timer_last_path = stream.timer_event.getStartTime();
791 
792  // if requested, set the lumisection for timing vs. lumisection plots
793  if (m_enable_dqm_byls and pid == 0)
794  setLuminosity(sid, 0, sc.eventID().luminosityBlock());
795 }
static double delta(FastTimer::Clock::time_point const &first, FastTimer::Clock::time_point const &second)
const bool m_enable_dqm_byls
void setLuminosity(unsigned int stream_id, unsigned int luminosity_id, double value)
tuple pid
Definition: sysUtil.py:22
static unsigned int processID(edm::ProcessContext const *)
std::vector< StreamData > m_stream
void FastTimerService::preGlobalBeginRun ( edm::GlobalContext const &  gc)
private

Definition at line 179 of file FastTimerService.cc.

References fillPathMap(), edm::service::TriggerNamesService::getEndPath(), edm::service::TriggerNamesService::getEndPathModules(), edm::service::TriggerNamesService::getEndPaths(), edm::service::TriggerNamesService::getTrigPath(), edm::service::TriggerNamesService::getTrigPathModules(), edm::service::TriggerNamesService::getTrigPaths(), i, diffTwoXMLs::label, m_job_summary_perprocess, m_process, m_run_summary, m_run_summary_perprocess, m_skip_first_path, m_stream, sysUtil::pid, edm::GlobalContext::processContext(), processID(), edm::ProcessContext::processName(), edm::GlobalContext::runIndex(), findQualityFiles::size, AlCaHLTBitMon_QueryRunRegistry::string, and edmLumisInFiles::summary.

Referenced by FastTimerService().

180 {
181  unsigned int pid = processID(gc.processContext());
182  unsigned int rid = gc.runIndex();
183 
185 
186  // cache the names of the first and last path and endpath
187  if (m_process.size() <= pid)
188  m_process.resize(pid+1);
189  m_process[pid].name = gc.processContext()->processName();
190  if (m_skip_first_path and pid == 0) {
191  // skip the first path
192  if (tns.getTrigPaths().size() > 1) {
193  m_process[pid].first_path = tns.getTrigPaths().at(1);
194  m_process[pid].last_path = tns.getTrigPaths().back();
195  }
196  } else {
197  if (not tns.getTrigPaths().empty()) {
198  m_process[pid].first_path = tns.getTrigPaths().front();
199  m_process[pid].last_path = tns.getTrigPaths().back();
200  }
201  }
202  if (not tns.getEndPaths().empty()) {
203  m_process[pid].first_endpath = tns.getEndPaths().front();
204  m_process[pid].last_endpath = tns.getEndPaths().back();
205  }
206 
207  uint32_t size_p = tns.getTrigPaths().size();
208  uint32_t size_e = tns.getEndPaths().size();
209  uint32_t size = size_p + size_e;
210  // resize the path maps
211  for (auto & stream: m_stream)
212  if (stream.paths.size() <= pid)
213  stream.paths.resize(pid+1);
214  for (uint32_t i = 0; i < size_p; ++i) {
215  std::string const & label = tns.getTrigPath(i);
216  for (auto & stream: m_stream)
217  stream.paths[pid][label].index = i;
218  }
219  for (uint32_t i = 0; i < size_e; ++i) {
220  std::string const & label = tns.getEndPath(i);
221  for (auto & stream: m_stream)
222  stream.paths[pid][label].index = size_p + i;
223  }
224  for (auto & stream: m_stream) {
225  // resize the stream buffers to account the number of subprocesses
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.);
229  // resize the stream plots to account the number of subprocesses
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);
236  }
237  for (auto & summary: m_run_summary_perprocess) {
238  if (summary.size() <= pid)
239  summary.resize(pid+1);
240  summary[pid].paths_interpaths.assign(size + 1, 0);
241  }
242  if (m_job_summary_perprocess.size() <= pid)
243  m_job_summary_perprocess.resize(pid+1);
244  m_job_summary_perprocess[pid].paths_interpaths.assign(size + 1, 0.);
245 
246  // reset the run summaries
247  if (pid == 0)
248  m_run_summary[rid].reset();
249  m_run_summary_perprocess[rid][pid].reset();
250 
251  // associate to each path all the modules it contains
252  for (uint32_t i = 0; i < tns.getTrigPaths().size(); ++i)
253  fillPathMap( pid, tns.getTrigPath(i), tns.getTrigPathModules(i) );
254  for (uint32_t i = 0; i < tns.getEndPaths().size(); ++i)
255  fillPathMap( pid, tns.getEndPath(i), tns.getEndPathModules(i) );
256 }
int i
Definition: DBlmapReader.cc:9
Strings const & getTrigPathModules(std::string const &name) const
std::string const & getTrigPath(size_type const i) const
Strings const & getEndPaths() const
const bool m_skip_first_path
std::vector< ProcessDescription > m_process
std::vector< TimingPerProcess > m_job_summary_perprocess
Strings const & getEndPathModules(std::string const &name) const
std::vector< std::vector< TimingPerProcess > > m_run_summary_perprocess
std::vector< Timing > m_run_summary
void fillPathMap(unsigned int pid, std::string const &name, std::vector< std::string > const &modules)
tuple pid
Definition: sysUtil.py:22
std::string const & getEndPath(size_type const i) const
Strings const & getTrigPaths() const
static unsigned int processID(edm::ProcessContext const *)
std::vector< StreamData > m_stream
tuple size
Write out results.
void FastTimerService::preModuleBeginJob ( edm::ModuleDescription const &  module)
private

Definition at line 748 of file FastTimerService.cc.

References edm::ModuleDescription::id(), m_stream, edm::ModuleDescription::moduleLabel(), and edm::ModuleDescription::moduleName().

Referenced by FastTimerService().

748  {
749  // allocate a counter for each module and module type
750  for (auto & stream: m_stream) {
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);
755 
756  stream.fast_modules[module.id()] = & stream.modules[module.moduleLabel()];;
757  stream.fast_moduletypes[module.id()] = & stream.moduletypes[module.moduleName()];
758  }
759 }
std::vector< StreamData > m_stream
Definition: vlib.h:208
void FastTimerService::preModuleEvent ( edm::StreamContext const &  sc,
edm::ModuleCallingContext const &  mcc 
)
private

Definition at line 1142 of file FastTimerService.cc.

References assert(), edm::ModuleDescription::id(), m_enable_timing_modules, m_stream, popcon2dropbox_job_conf::md, python.rootplot.argparse::module, edm::ModuleCallingContext::moduleDescription(), edm::ModuleDescription::moduleLabel(), FastTimerService::ModuleInfo::run_in_path, FastTimer::start(), edm::StreamContext::streamID(), FastTimerService::ModuleInfo::timer, and edm::StreamID::value().

Referenced by FastTimerService().

1142  {
1143  // this is ever called only if m_enable_timing_modules = true
1145 
1146  if (mcc.moduleDescription() == nullptr) {
1147  edm::LogError("FastTimerService") << "FastTimerService::postModuleEventDelayedGet: invalid module";
1148  return;
1149  }
1150 
1151  edm::ModuleDescription const & md = * mcc.moduleDescription();
1152  unsigned int sid = sc.streamID().value();
1153  auto & stream = m_stream[sid];
1154 
1155  // time each module
1156  if (md.id() < stream.fast_modules.size()) {
1157  ModuleInfo & module = * stream.fast_modules[md.id()];
1158  module.run_in_path = stream.current_path;
1159  module.timer.start();
1160  stream.current_module = & module;
1161  // used to measure the time spent between the beginning of the path and the execution of the first module
1162  if (stream.current_path->first_module == nullptr)
1163  stream.current_path->first_module = & module;
1164  } else {
1165  // should never get here
1166  edm::LogError("FastTimerService") << "FastTimerService::preModuleEvent: unexpected module " << md.moduleLabel();
1167  }
1168 }
assert(m_qm.get())
std::string const & moduleLabel() const
std::vector< StreamData > m_stream
Definition: vlib.h:208
unsigned int id() const
void FastTimerService::preModuleEventDelayedGet ( edm::StreamContext const &  sc,
edm::ModuleCallingContext const &  mcc 
)
private

Definition at line 1199 of file FastTimerService.cc.

References assert(), edm::ModuleDescription::id(), edm::ModuleCallingContext::kRunning, m_enable_timing_modules, m_stream, popcon2dropbox_job_conf::md, edm::ModuleCallingContext::moduleDescription(), edm::ModuleDescription::moduleLabel(), FastTimer::pause(), edm::ModuleCallingContext::state(), edm::StreamContext::streamID(), FastTimerService::ModuleInfo::timer, and edm::StreamID::value().

Referenced by FastTimerService().

1199  {
1200  // this is ever called only if m_enable_timing_modules = true
1202 
1203  if (mcc.moduleDescription() == nullptr) {
1204  edm::LogError("FastTimerService") << "FastTimerService::postModuleEventDelayedGet: invalid module";
1205  return;
1206  }
1207 
1208  edm::ModuleDescription const & md = * mcc.moduleDescription();
1209  unsigned int sid = sc.streamID().value();
1210  auto & stream = m_stream[sid];
1211 
1212  // if the ModuleCallingContext state is "Pefetching", the module is not running,
1213  // and is asking for its dependencies due to a "consumes" declaration.
1214  // we can ignore this signal.
1215 
1216  // if the ModuleCallingContext state is "Running", the module was running:
1217  // it declared its dependencies as "mayConsume", and is now calling getByToken/getByLabel.
1218  // we pause the timer for this module, and resume it later in the postModuleEventDelayedGet signal.
1219 
1220  // if the ModuleCallingContext state is "Invalid", we ignore the signal.
1221 
1222  if (mcc.state() == edm::ModuleCallingContext::State::kRunning) {
1223  if (md.id() < stream.fast_modules.size()) {
1224  ModuleInfo & module = * stream.fast_modules[md.id()];
1225  module.timer.pause();
1226  } else {
1227  // should never get here
1228  edm::LogError("FastTimerService") << "FastTimerService::preModuleEventDelayedGet: unexpected module " << md.moduleLabel();
1229  }
1230  }
1231 
1232 }
assert(m_qm.get())
std::string const & moduleLabel() const
std::vector< StreamData > m_stream
Definition: vlib.h:208
unsigned int id() const
void FastTimerService::prePathEvent ( edm::StreamContext const &  sc,
edm::PathContext const &  pc 
)
private

Definition at line 999 of file FastTimerService.cc.

References delta(), m_process, m_stream, cmsHarvester::path, edm::PathContext::pathName(), sysUtil::pid, edm::StreamContext::processContext(), processID(), edm::StreamContext::streamID(), and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by FastTimerService().

999  {
1000  std::string const & path = pc.pathName();
1001  unsigned int pid = processID(sc.processContext());
1002  unsigned int sid = sc.streamID();
1003  auto & stream = m_stream[sid];
1004 
1005  auto keyval = stream.paths[pid].find(path);
1006  if (keyval != stream.paths[pid].end()) {
1007  stream.current_path = & keyval->second;
1008  } else {
1009  // should never get here
1010  stream.current_path = nullptr;
1011  edm::LogError("FastTimerService") << "FastTimerService::prePathEvent: unexpected path " << path;
1012  return;
1013  }
1014 
1015  // prepare to measure the time spent between the beginning of the path and the execution of the first module
1016  stream.current_path->first_module = nullptr;
1017 
1018  // time each (end)path
1019  stream.current_path->timer.start();
1020 
1021  if (path == m_process[pid].first_path) {
1022  // this is the first path, start the "all paths" counter
1023  stream.timer_paths.setStartTime(stream.current_path->timer.getStartTime());
1024  } else if (path == m_process[pid].first_endpath) {
1025  // this is the first endpath, start the "all paths" counter
1026  stream.timer_endpaths.setStartTime(stream.current_path->timer.getStartTime());
1027  }
1028 
1029  // measure the inter-path overhead as the time elapsed since the end of preiovus path
1030  // (or the beginning of the event, if this is the first path - see preEvent)
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;
1034 }
static double delta(FastTimer::Clock::time_point const &first, FastTimer::Clock::time_point const &second)
std::vector< ProcessDescription > m_process
tuple path
else: Piece not in the list, fine.
tuple pid
Definition: sysUtil.py:22
static unsigned int processID(edm::ProcessContext const *)
std::vector< StreamData > m_stream
void FastTimerService::preSourceEvent ( edm::StreamID  sid)
private

Definition at line 963 of file FastTimerService.cc.

References delta(), and m_stream.

Referenced by FastTimerService().

963  {
964  auto & stream = m_stream[sid];
965 
966  // clear the event counters
967  stream.timing.reset();
968  stream.timer_source.start();
969 
970  // clear the event counters
971  // note: this is done here and not in preEvent to avoid clearing the counter before each subprocess
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;
977  }
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;
983  }
984 
985  // account the time spent before the source
986  stream.timing.presource = delta(stream.timer_last_transition, stream.timer_source.getStartTime());
987 }
static double delta(FastTimer::Clock::time_point const &first, FastTimer::Clock::time_point const &second)
std::vector< StreamData > m_stream
void FastTimerService::preStreamBeginRun ( edm::StreamContext const &  sc)
private

Definition at line 258 of file FastTimerService.cc.

References FastTimerService::ModuleInfo::dqm_active, FastTimerService::PathInfo::dqm_active, FastTimerService::PathInfo::dqm_exclusive, FastTimerService::PathInfo::dqm_intermodules, FastTimerService::PathInfo::dqm_module_active, FastTimerService::PathInfo::dqm_module_counter, FastTimerService::PathInfo::dqm_module_total, FastTimerService::PathInfo::dqm_overhead, FastTimerService::PathInfo::dqm_postmodules, FastTimerService::PathInfo::dqm_premodules, FastTimerService::PathInfo::dqm_total, edm::StreamContext::eventID(), edm::service::TriggerNamesService::findEndPath(), edm::service::TriggerNamesService::findTrigPath(), cmsPerfStripChart::format, edm::service::TriggerNamesService::getEndPath(), edm::service::TriggerNamesService::getEndPathModules(), edm::service::TriggerNamesService::getEndPaths(), edm::service::TriggerNamesService::getTrigPath(), edm::service::TriggerNamesService::getTrigPathModules(), edm::service::TriggerNamesService::getTrigPaths(), i, infinity, diffTwoXMLs::label, HLT_25ns14e33_v1_cff::labels, CommonMethods::lock(), m_dqm_eventtime_range, m_dqm_eventtime_resolution, m_dqm_luminosity, m_dqm_moduletime_range, m_dqm_moduletime_resolution, m_dqm_path, m_dqm_pathtime_range, m_dqm_pathtime_resolution, m_enable_dqm, m_enable_dqm_bymodule, m_enable_dqm_bymoduletype, m_enable_dqm_bypath_active, m_enable_dqm_bypath_counters, m_enable_dqm_bypath_details, m_enable_dqm_bypath_exclusive, m_enable_dqm_bypath_overhead, m_enable_dqm_bypath_total, m_enable_dqm_summary, m_enable_timing_paths, m_module_id, m_stream, edmConvertToStreamModule::modules, FastTimerService::PathInfo::modules, mutex, mergeVDriftHistosByStation::name, or, timingPdfMaker::pathname, sysUtil::pid, RecoTauValidation_cfi::plots, relval_parameters_module::process_name, edm::StreamContext::processContext(), processID(), edm::ProcessContext::processName(), dtDQMClient_cfg::resolution, edm::EventID::run(), findQualityFiles::size, edm::StreamContext::streamID(), AlCaHLTBitMon_QueryRunRegistry::string, indexGen::title, and edm::StreamID::value().

Referenced by FastTimerService().

259 {
260  std::string const & process_name = sc.processContext()->processName();
261  unsigned int pid = processID(sc.processContext());
262  unsigned int sid = sc.streamID().value();
263  auto & stream = m_stream[sid];
264 
265  if (not m_enable_dqm)
266  return;
267 
268  if (not edm::Service<DQMStore>().isAvailable()) {
269  // the DQMStore is not available, disable all DQM plots
270  m_enable_dqm = false;
271  return;
272  }
273 
275  uint32_t size_p = tns.getTrigPaths().size();
276  uint32_t size_e = tns.getEndPaths().size();
277  uint32_t size = size_p + size_e;
278 
279  int eventbins = (int) std::ceil(m_dqm_eventtime_range / m_dqm_eventtime_resolution);
280  int pathbins = (int) std::ceil(m_dqm_pathtime_range / m_dqm_pathtime_resolution);
281  int modulebins = (int) std::ceil(m_dqm_moduletime_range / m_dqm_moduletime_resolution);
282 
283  // define a callback that can book the histograms
284  auto bookTransactionCallback = [&, this] (DQMStore::IBooker & booker) {
285 
286  // event summary plots
287  if (m_enable_dqm_summary) {
288  // whole event
289  if (pid == 0) {
290  booker.setCurrentFolder(m_dqm_path);
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]");
303  }
304 
305  // per subprocess
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]");
322  }
323 
324  // plots by path
325  if (m_enable_timing_paths) {
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]");
339 
340  for (uint32_t i = 0; i < size_p; ++i) {
341  std::string const & label = tns.getTrigPath(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());
346  }
347  for (uint32_t i = 0; i < size_e; ++i) {
348  std::string const & label = tns.getEndPath(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());
353  }
354  stream.dqm_paths[pid].interpaths ->GetXaxis()->SetBinLabel(size+1, "");
355  }
356 
357  // plots vs. instantaneous luminosity
358  if (not m_dqm_luminosity.empty()) {
359  if (pid == 0) {
360  // resize the plots vs. luminosity
361  stream.dqm_byluminosity.resize(m_dqm_luminosity.size());
362 
363  // whole event
364  booker.setCurrentFolder(m_dqm_path);
365  for (unsigned int i = 0; i < m_dqm_luminosity.size(); ++i) {
366  auto & plots = stream.dqm_byluminosity[i];
367  int lumibins = (int) std::ceil(m_dqm_luminosity[i].range / m_dqm_luminosity[i].resolution);
368  plots.presource = booker.bookProfile("presource_by" + m_dqm_luminosity[i].name, "Pre-Source processing time vs. " + m_dqm_luminosity[i].title, lumibins, 0., m_dqm_luminosity[i].range, pathbins, 0., std::numeric_limits<double>::infinity(), " ")->getTProfile();
369  plots.presource ->StatOverflows(true);
370  plots.presource ->SetXTitle(m_dqm_luminosity[i].label.c_str());
371  plots.presource ->SetYTitle("processing time [ms]");
372  plots.source = booker.bookProfile("source_by" + m_dqm_luminosity[i].name, "Source processing time vs. " + m_dqm_luminosity[i].title, lumibins, 0., m_dqm_luminosity[i].range, pathbins, 0., std::numeric_limits<double>::infinity(), " ")->getTProfile();
373  plots.source ->StatOverflows(true);
374  plots.source ->SetXTitle(m_dqm_luminosity[i].label.c_str());
375  plots.source ->SetYTitle("processing time [ms]");
376  plots.preevent = booker.bookProfile("preevent_by" + m_dqm_luminosity[i].name, "Pre-Event processing time vs. " + m_dqm_luminosity[i].title, lumibins, 0., m_dqm_luminosity[i].range, pathbins, 0., std::numeric_limits<double>::infinity(), " ")->getTProfile();
377  plots.preevent ->StatOverflows(true);
378  plots.preevent ->SetXTitle(m_dqm_luminosity[i].label.c_str());
379  plots.preevent ->SetYTitle("processing time [ms]");
380  plots.event = booker.bookProfile("event_by" + m_dqm_luminosity[i].name, "Event processing time vs. " + m_dqm_luminosity[i].title, lumibins, 0., m_dqm_luminosity[i].range, eventbins, 0., std::numeric_limits<double>::infinity(), " ")->getTProfile();
381  plots.event ->StatOverflows(true);
382  plots.event ->SetXTitle(m_dqm_luminosity[i].label.c_str());
383  plots.event ->SetYTitle("processing time [ms]");
384  }
385  }
386 
387  // resize the plots vs. luminosity
388  stream.dqm_perprocess_byluminosity[pid].resize(m_dqm_luminosity.size());
389 
390  // per subprocess
391  booker.setCurrentFolder(m_dqm_path + "/process " + process_name);
392  for (unsigned int i = 0; i < m_dqm_luminosity.size(); ++i) {
393  auto & plots = stream.dqm_perprocess_byluminosity[pid][i];
394  int lumibins = (int) std::ceil(m_dqm_luminosity[i].range / m_dqm_luminosity[i].resolution);
395  plots.preevent = booker.bookProfile("preevent_by" + m_dqm_luminosity[i].name, "Pre-Event processing time vs. " + m_dqm_luminosity[i].title, lumibins, 0., m_dqm_luminosity[i].range, pathbins, 0., std::numeric_limits<double>::infinity(), " ")->getTProfile();
396  plots.preevent ->StatOverflows(true);
397  plots.preevent ->SetXTitle(m_dqm_luminosity[i].label.c_str());
398  plots.preevent ->SetYTitle("processing time [ms]");
399  plots.event = booker.bookProfile("event_by" + m_dqm_luminosity[i].name, "Event processing time vs. " + m_dqm_luminosity[i].title, lumibins, 0., m_dqm_luminosity[i].range, eventbins, 0., std::numeric_limits<double>::infinity(), " ")->getTProfile();
400  plots.event ->StatOverflows(true);
401  plots.event ->SetXTitle(m_dqm_luminosity[i].label.c_str());
402  plots.event ->SetYTitle("processing time [ms]");
403  plots.all_paths = booker.bookProfile("all_paths_by" + m_dqm_luminosity[i].name, "Paths processing time vs. " + m_dqm_luminosity[i].title, lumibins, 0., m_dqm_luminosity[i].range, eventbins, 0., std::numeric_limits<double>::infinity(), " ")->getTProfile();
404  plots.all_paths ->StatOverflows(true);
405  plots.all_paths ->SetXTitle(m_dqm_luminosity[i].label.c_str());
406  plots.all_paths ->SetYTitle("processing time [ms]");
407  plots.all_endpaths = booker.bookProfile("all_endpaths_by" + m_dqm_luminosity[i].name, "EndPaths processing time vs. " + m_dqm_luminosity[i].title, lumibins, 0., m_dqm_luminosity[i].range, pathbins, 0., std::numeric_limits<double>::infinity(), " ")->getTProfile();
408  plots.all_endpaths ->StatOverflows(true);
409  plots.all_endpaths ->SetXTitle(m_dqm_luminosity[i].label.c_str());
410  plots.all_endpaths ->SetYTitle("processing time [ms]");
411  plots.interpaths = booker.bookProfile("interpaths_by" + m_dqm_luminosity[i].name, "Time spent between paths vs. " + m_dqm_luminosity[i].title, lumibins, 0., m_dqm_luminosity[i].range, pathbins, 0., std::numeric_limits<double>::infinity(), " ")->getTProfile();
412  plots.interpaths ->StatOverflows(true);
413  plots.interpaths ->SetXTitle(m_dqm_luminosity[i].label.c_str());
414  plots.interpaths ->SetYTitle("processing time [ms]");
415  }
416  }
417 
418  // per-path and per-module accounting
419  if (m_enable_timing_paths) {
420  booker.setCurrentFolder(m_dqm_path + "/process " + process_name + "/Paths");
421  for (auto & keyval: stream.paths[pid]) {
422  std::string const & pathname = keyval.first;
423  PathInfo & pathinfo = keyval.second;
424 
426  pathinfo.dqm_active = booker.book1D(pathname + "_active", pathname + " active time", pathbins, 0., m_dqm_pathtime_range)->getTH1F();
427  pathinfo.dqm_active ->StatOverflows(true);
428  pathinfo.dqm_active ->SetXTitle("processing time [ms]");
429  }
430 
432  pathinfo.dqm_total = booker.book1D(pathname + "_total", pathname + " total time", pathbins, 0., m_dqm_pathtime_range)->getTH1F();
433  pathinfo.dqm_total ->StatOverflows(true);
434  pathinfo.dqm_total ->SetXTitle("processing time [ms]");
435  }
436 
438  pathinfo.dqm_premodules = booker.book1D(pathname + "_premodules", pathname + " pre-modules overhead", modulebins, 0., m_dqm_moduletime_range)->getTH1F();
439  pathinfo.dqm_premodules ->StatOverflows(true);
440  pathinfo.dqm_premodules ->SetXTitle("processing time [ms]");
441  pathinfo.dqm_intermodules = booker.book1D(pathname + "_intermodules", pathname + " inter-modules overhead", modulebins, 0., m_dqm_moduletime_range)->getTH1F();
442  pathinfo.dqm_intermodules ->StatOverflows(true);
443  pathinfo.dqm_intermodules ->SetXTitle("processing time [ms]");
444  pathinfo.dqm_postmodules = booker.book1D(pathname + "_postmodules", pathname + " post-modules overhead", modulebins, 0., m_dqm_moduletime_range)->getTH1F();
445  pathinfo.dqm_postmodules ->StatOverflows(true);
446  pathinfo.dqm_postmodules ->SetXTitle("processing time [ms]");
447  pathinfo.dqm_overhead = booker.book1D(pathname + "_overhead", pathname + " overhead time", modulebins, 0., m_dqm_moduletime_range)->getTH1F();
448  pathinfo.dqm_overhead ->StatOverflows(true);
449  pathinfo.dqm_overhead ->SetXTitle("processing time [ms]");
450  }
451 
453  // book histograms for modules-in-paths statistics
454 
455  // find histograms X-axis labels
456  uint32_t id;
457  std::vector<std::string> const & modules = ((id = tns.findTrigPath(pathname)) != tns.getTrigPaths().size()) ? tns.getTrigPathModules(id) :
458  ((id = tns.findEndPath(pathname)) != tns.getEndPaths().size()) ? tns.getEndPathModules(id) :
459  std::vector<std::string>();
460 
461  // use a mutex to prevent two threads from assigning to the same element at the same time
462  static std::mutex dup_mutex;
463  // use a tbb::concurrent_vector because growing does not invalidate existing iterators and pointers
464  static tbb::concurrent_vector<std::string> dup;
465  // lock, and fill the first 32 elements
466  if (dup.empty()) {
467  std::lock_guard<std::mutex> lock(dup_mutex);
468  if (dup.empty()) {
469  dup.resize(32);
470  for (unsigned int i = 0; i < 32; ++i)
471  dup[i] = (boost::format("(dup.) (%d)") % i).str();
472  }
473  }
474  // lock, and fill as many elements as needed
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)
482  dup[i] = (boost::format("(dup.) (%d)") % i).str();
483  }
484  }
485 
486  std::vector<const char *> labels(modules.size(), nullptr);
487  for (uint32_t i = 0; i < modules.size(); ++i)
488  labels[i] = (pathinfo.modules[i]) ? modules[i].c_str() : dup[i].c_str();
489 
490  // book counter histograms
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();
493  // find module labels
494  for (uint32_t i = 0; i < modules.size(); ++i)
495  pathinfo.dqm_module_counter->GetXaxis()->SetBinLabel( i+1, labels[i] );
496  pathinfo.dqm_module_counter->GetXaxis()->SetBinLabel( modules.size() + 1, "" );
497  }
498  // book detailed timing histograms
500  pathinfo.dqm_module_active = booker.book1D(pathname + "_module_active", pathname + " module active", modules.size(), -0.5, modules.size() - 0.5)->getTH1F();
501  pathinfo.dqm_module_active ->SetYTitle("cumulative processing time [ms]");
502  pathinfo.dqm_module_total = booker.book1D(pathname + "_module_total", pathname + " module total", modules.size(), -0.5, modules.size() - 0.5)->getTH1F();
503  pathinfo.dqm_module_total ->SetYTitle("cumulative processing time [ms]");
504  // find module labels
505  for (uint32_t i = 0; i < modules.size(); ++i) {
506  pathinfo.dqm_module_active ->GetXaxis()->SetBinLabel( i+1, labels[i] );
507  pathinfo.dqm_module_total ->GetXaxis()->SetBinLabel( i+1, labels[i] );
508  }
509  }
510  }
511 
512  // book exclusive path time histograms
514  pathinfo.dqm_exclusive = booker.book1D(pathname + "_exclusive", pathname + " exclusive time", pathbins, 0., m_dqm_pathtime_range)->getTH1F();
515  pathinfo.dqm_exclusive ->StatOverflows(true);
516  pathinfo.dqm_exclusive ->SetXTitle("processing time [ms]");
517  }
518 
519  }
520  }
521 
522  if (m_enable_dqm_bymodule) {
523  booker.setCurrentFolder(m_dqm_path + "/Modules");
524  for (auto & keyval: stream.modules) {
525  std::string const & label = keyval.first;
526  ModuleInfo & module = keyval.second;
527  module.dqm_active = booker.book1D(label, label, modulebins, 0., m_dqm_moduletime_range)->getTH1F();
528  module.dqm_active->StatOverflows(true);
529  module.dqm_active->SetXTitle("processing time [ms]");
530  }
531  }
532 
534  booker.setCurrentFolder(m_dqm_path + "/ModuleTypes");
535  for (auto & keyval: stream.moduletypes) {
536  std::string const & label = keyval.first;
537  ModuleInfo & module = keyval.second;
538  module.dqm_active = booker.book1D(label, label, modulebins, 0., m_dqm_moduletime_range)->getTH1F();
539  module.dqm_active->StatOverflows(true);
540  module.dqm_active->SetXTitle("processing time [ms]");
541  }
542  }
543 
544  };
545 
546  // book MonitorElement's for this stream
547  edm::Service<DQMStore>()->bookTransaction(bookTransactionCallback, sc.eventID().run(), sid, m_module_id);
548 }
int i
Definition: DBlmapReader.cc:9
const double m_dqm_eventtime_resolution
Strings const & getTrigPathModules(std::string const &name) const
std::string const & getTrigPath(size_type const i) const
Strings const & getEndPaths() const
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
Definition: Activities.doc:12
static boost::mutex mutex
Definition: LHEProxy.cc:11
const bool m_enable_dqm_bypath_counters
const bool m_enable_dqm_bypath_exclusive
const double m_dqm_pathtime_range
string format
Some error handling for the usage.
std::string m_dqm_path
Strings const & getEndPathModules(std::string const &name) const
size_type findTrigPath(std::string const &name) const
std::vector< LuminosityDescription > m_dqm_luminosity
unsigned int m_module_id
const double m_dqm_moduletime_resolution
const double infinity
const bool m_enable_dqm_bypath_details
const bool m_enable_dqm_bypath_overhead
size_type findEndPath(std::string const &name) const
const bool m_enable_dqm_bymodule
const double m_dqm_moduletime_range
tuple pid
Definition: sysUtil.py:22
const bool m_enable_dqm_bymoduletype
const bool m_enable_dqm_summary
std::string const & getEndPath(size_type const i) const
const bool m_enable_dqm_bypath_total
Strings const & getTrigPaths() const
const bool m_enable_dqm_bypath_active
static unsigned int processID(edm::ProcessContext const *)
std::vector< StreamData > m_stream
Definition: vlib.h:208
tuple size
Write out results.
const double m_dqm_eventtime_range
const double m_dqm_pathtime_resolution
void FastTimerService::printProcessSummary ( Timing const &  total,
TimingPerProcess const &  summary,
std::string const &  label,
std::string const &  process 
) const
private

Definition at line 651 of file FastTimerService.cc.

References FastTimerService::TimingPerProcess::all_endpaths, FastTimerService::TimingPerProcess::all_paths, FastTimerService::Timing::count, FastTimerService::TimingPerProcess::event, FastTimerService::TimingPerProcess::interpaths, dbtoconf::out, and FastTimerService::TimingPerProcess::preevent.

Referenced by postEndJob(), and postGlobalEndRun().

652 {
653  // print a timing summary for the run or job, for each subprocess
654  std::ostringstream out;
655  out << std::fixed << std::setprecision(6);
656  out << "FastReport for " << label << ", process " << process << '\n';
657  //out << "FastReport " << (m_use_realtime ? "(real time) " : "(CPU time) ") << '\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';
663  edm::LogVerbatim("FastReport") << out.str();
664 }
tuple out
Definition: dbtoconf.py:99
tuple process
Definition: LaserDQM_cfg.py:3
void FastTimerService::printSummary ( Timing const &  summary,
std::string const &  label 
) const
private

Definition at line 667 of file FastTimerService.cc.

References FastTimerService::Timing::count, FastTimerService::Timing::event, dbtoconf::out, FastTimerService::Timing::preevent, FastTimerService::Timing::presource, and FastTimerService::Timing::source.

Referenced by postEndJob(), and postGlobalEndRun().

668 {
669  // print a timing summary for the run or job
670  //edm::service::TriggerNamesService & tns = * edm::Service<edm::service::TriggerNamesService>();
671 
672  std::ostringstream out;
673  out << std::fixed << std::setprecision(6);
674  out << "FastReport for " << label << ", over all subprocesses" << '\n';
675  //out << "FastReport " << (m_use_realtime ? "(real time) " : "(CPU time) ") << '\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';
680  edm::LogVerbatim("FastReport") << out.str();
681 }
tuple out
Definition: dbtoconf.py:99
unsigned int FastTimerService::processID ( edm::ProcessContext const *  context)
staticprivate

Definition at line 1441 of file FastTimerService.cc.

References edm::ProcessContext::isSubProcess(), edm::ProcessContext::parentProcessContext(), and sysUtil::pid.

Referenced by postEvent(), postGlobalEndRun(), postPathEvent(), preEvent(), preGlobalBeginRun(), prePathEvent(), and preStreamBeginRun().

1442 {
1443  unsigned int pid = 0;
1444 
1445  // iterate through the chain of ProcessContext until we reach the topmost process
1446  while (context->isSubProcess()) {
1447  context = & context->parentProcessContext();
1448  ++pid;
1449  }
1450  return pid;
1451 }
tuple pid
Definition: sysUtil.py:22
double FastTimerService::queryEventTime ( edm::StreamID  sid) const

Definition at line 1392 of file FastTimerService.cc.

References m_stream.

1392  {
1393  return m_stream[sid].timing.event;
1394 }
std::vector< StreamData > m_stream
double FastTimerService::queryModuleTime ( edm::StreamID  sid,
const edm::ModuleDescription module 
) const

Definition at line 1308 of file FastTimerService.cc.

References edm::ModuleDescription::id(), m_stream, and edm::ModuleDescription::moduleLabel().

1308  {
1309  if (module.id() < m_stream[sid].fast_modules.size()) {
1310  return m_stream[sid].fast_modules[module.id()]->time_active;
1311  } else {
1312  edm::LogError("FastTimerService") << "FastTimerService::queryModuleTime: unexpected module " << module.moduleLabel();
1313  return 0.;
1314  }
1315 }
std::string const & moduleLabel() const
std::vector< StreamData > m_stream
unsigned int id() const
double FastTimerService::queryModuleTime ( edm::StreamID  sid,
unsigned int  id 
) const

Definition at line 1318 of file FastTimerService.cc.

References m_stream.

1318  {
1319  if (id < m_stream[sid].fast_modules.size()) {
1320  return m_stream[sid].fast_modules[id]->time_active;
1321  } else {
1322  edm::LogError("FastTimerService") << "FastTimerService::queryModuleTime: unexpected module id " << id;
1323  return 0.;
1324  }
1325 }
std::vector< StreamData > m_stream
double FastTimerService::queryModuleTimeByLabel ( edm::StreamID  sid,
const std::string &  label 
) const

Definition at line 1328 of file FastTimerService.cc.

References diffTwoXMLs::label, m_stream, and edmConvertToStreamModule::modules.

Referenced by IsoTrig::studyTiming().

1328  {
1329  auto const & keyval = m_stream[sid].modules.find(label);
1330  if (keyval != m_stream[sid].modules.end()) {
1331  return keyval->second.time_active;
1332  } else {
1333  // module not found
1334  edm::LogError("FastTimerService") << "FastTimerService::queryModuleTimeByLabel: unexpected module " << label;
1335  return 0.;
1336  }
1337 }
std::vector< StreamData > m_stream
double FastTimerService::queryModuleTimeByType ( edm::StreamID  sid,
const std::string &  type 
) const

Definition at line 1340 of file FastTimerService.cc.

References m_stream.

1340  {
1341  auto const & keyval = m_stream[sid].moduletypes.find(type);
1342  if (keyval != m_stream[sid].moduletypes.end()) {
1343  return keyval->second.time_active;
1344  } else {
1345  // module not found
1346  edm::LogError("FastTimerService") << "FastTimerService::queryModuleTimeByType: unexpected module type " << type;
1347  return 0.;
1348  }
1349 }
type
Definition: HCALResponse.h:21
std::vector< StreamData > m_stream
double FastTimerService::querySourceTime ( edm::StreamID  sid) const

Definition at line 1387 of file FastTimerService.cc.

References m_stream.

1387  {
1388  return m_stream[sid].timing.source;
1389 }
std::vector< StreamData > m_stream
unsigned int FastTimerService::reserveLuminosityPlots ( std::string const &  name,
std::string const &  title,
std::string const &  label,
double  range,
double  resolution 
)

Definition at line 146 of file FastTimerService.cc.

References m_dqm_luminosity, and m_stream.

Referenced by FastTimerService().

147 {
148  // FIXME check that this is only called before any preStreamBeginRun
149  // FIXME check that this is not called with the same "name" twice
150  m_dqm_luminosity.push_back(LuminosityDescription(name, title, label, range, resolution));
151 
152  // resize the luminosity per event buffer
153  for (auto & stream: m_stream)
154  stream.luminosity.resize(m_dqm_luminosity.size(), 0);
155 
156  return m_dqm_luminosity.size() - 1;
157 }
std::vector< LuminosityDescription > m_dqm_luminosity
std::vector< StreamData > m_stream
unsigned int FastTimerService::reserveLuminosityPlots ( std::string &&  name,
std::string &&  title,
std::string &&  label,
double  range,
double  resolution 
)

Definition at line 159 of file FastTimerService.cc.

References diffTwoXMLs::label, m_dqm_luminosity, m_stream, mergeVDriftHistosByStation::name, and indexGen::title.

160 {
161  // FIXME check that this is only called before any preStreamBeginRun
162  // FIXME check that this is not called with the same "name" twice
163  m_dqm_luminosity.push_back(LuminosityDescription(name, title, label, range, resolution));
164 
165  // resize the luminosity per event buffer
166  for (auto & stream: m_stream)
167  stream.luminosity.resize(m_dqm_luminosity.size(), 0);
168 
169  return m_dqm_luminosity.size() - 1;
170 }
std::vector< LuminosityDescription > m_dqm_luminosity
std::vector< StreamData > m_stream
void FastTimerService::setLuminosity ( unsigned int  stream_id,
unsigned int  luminosity_id,
double  value 
)

Definition at line 173 of file FastTimerService.cc.

References m_stream, and relativeConstraints::value.

Referenced by preEvent().

174 {
175  // FIXME check that the luminosity id is valid ?
176  m_stream[stream_id].luminosity[luminosity_id] = value;
177 }
std::vector< StreamData > m_stream

Member Data Documentation

unsigned int FastTimerService::m_concurrent_runs
private

Definition at line 352 of file FastTimerService.h.

Referenced by preallocate().

unsigned int FastTimerService::m_concurrent_streams
private

Definition at line 353 of file FastTimerService.h.

Referenced by preallocate().

unsigned int FastTimerService::m_concurrent_threads
private

Definition at line 354 of file FastTimerService.h.

Referenced by preallocate().

const double FastTimerService::m_dqm_eventtime_range
private

Definition at line 357 of file FastTimerService.h.

Referenced by preStreamBeginRun().

const double FastTimerService::m_dqm_eventtime_resolution
private

Definition at line 358 of file FastTimerService.h.

Referenced by preStreamBeginRun().

std::vector<LuminosityDescription> FastTimerService::m_dqm_luminosity
private
const double FastTimerService::m_dqm_moduletime_range
private

Definition at line 361 of file FastTimerService.h.

Referenced by preStreamBeginRun().

const double FastTimerService::m_dqm_moduletime_resolution
private

Definition at line 362 of file FastTimerService.h.

Referenced by preStreamBeginRun().

std::string FastTimerService::m_dqm_path
private

Definition at line 363 of file FastTimerService.h.

Referenced by preallocate(), and preStreamBeginRun().

const double FastTimerService::m_dqm_pathtime_range
private

Definition at line 359 of file FastTimerService.h.

Referenced by preStreamBeginRun().

const double FastTimerService::m_dqm_pathtime_resolution
private

Definition at line 360 of file FastTimerService.h.

Referenced by preStreamBeginRun().

bool FastTimerService::m_enable_dqm
private
const bool FastTimerService::m_enable_dqm_byls
private

Definition at line 349 of file FastTimerService.h.

Referenced by FastTimerService(), and preEvent().

const bool FastTimerService::m_enable_dqm_bymodule
private

Definition at line 346 of file FastTimerService.h.

Referenced by FastTimerService(), postEvent(), and preStreamBeginRun().

const bool FastTimerService::m_enable_dqm_bymoduletype
private

Definition at line 347 of file FastTimerService.h.

Referenced by FastTimerService(), postEvent(), and preStreamBeginRun().

const bool FastTimerService::m_enable_dqm_bynproc
private

Definition at line 350 of file FastTimerService.h.

Referenced by preallocate().

const bool FastTimerService::m_enable_dqm_bypath_active
private

Definition at line 340 of file FastTimerService.h.

Referenced by FastTimerService(), postEvent(), and preStreamBeginRun().

const bool FastTimerService::m_enable_dqm_bypath_counters
private

Definition at line 344 of file FastTimerService.h.

Referenced by FastTimerService(), postEvent(), and preStreamBeginRun().

const bool FastTimerService::m_enable_dqm_bypath_details
private

Definition at line 343 of file FastTimerService.h.

Referenced by FastTimerService(), postEvent(), and preStreamBeginRun().

const bool FastTimerService::m_enable_dqm_bypath_exclusive
private

Definition at line 345 of file FastTimerService.h.

Referenced by FastTimerService(), postEvent(), and preStreamBeginRun().

const bool FastTimerService::m_enable_dqm_bypath_overhead
private

Definition at line 342 of file FastTimerService.h.

Referenced by FastTimerService(), postEvent(), and preStreamBeginRun().

const bool FastTimerService::m_enable_dqm_bypath_total
private

Definition at line 341 of file FastTimerService.h.

Referenced by FastTimerService(), postEvent(), and preStreamBeginRun().

const bool FastTimerService::m_enable_dqm_summary
private

Definition at line 348 of file FastTimerService.h.

Referenced by postEvent(), and preStreamBeginRun().

bool FastTimerService::m_enable_timing_exclusive
private

Definition at line 334 of file FastTimerService.h.

Referenced by FastTimerService(), and postEvent().

bool FastTimerService::m_enable_timing_modules
private
bool FastTimerService::m_enable_timing_paths
private

Definition at line 332 of file FastTimerService.h.

Referenced by FastTimerService(), postEvent(), postPathEvent(), and preStreamBeginRun().

const bool FastTimerService::m_enable_timing_summary
private

Definition at line 335 of file FastTimerService.h.

Referenced by postEndJob(), and postGlobalEndRun().

Timing FastTimerService::m_job_summary
private

Definition at line 748 of file FastTimerService.h.

Referenced by postEndJob(), and postEvent().

std::vector<TimingPerProcess> FastTimerService::m_job_summary_perprocess
private

Definition at line 750 of file FastTimerService.h.

Referenced by postEndJob(), postEvent(), and preGlobalBeginRun().

unsigned int FastTimerService::m_module_id
private
std::vector<ProcessDescription> FastTimerService::m_process
private
std::vector<Timing> FastTimerService::m_run_summary
private

Definition at line 747 of file FastTimerService.h.

Referenced by postEvent(), postGlobalEndRun(), preallocate(), and preGlobalBeginRun().

std::vector<std::vector<TimingPerProcess> > FastTimerService::m_run_summary_perprocess
private

Definition at line 749 of file FastTimerService.h.

Referenced by postEvent(), postGlobalEndRun(), preallocate(), and preGlobalBeginRun().

const bool FastTimerService::m_skip_first_path
private

Definition at line 336 of file FastTimerService.h.

Referenced by preGlobalBeginRun().

std::vector<StreamData> FastTimerService::m_stream
private
std::mutex FastTimerService::m_summary_mutex
private

Definition at line 751 of file FastTimerService.h.

Referenced by postEvent().

bool FastTimerService::m_use_realtime
private

Definition at line 331 of file FastTimerService.h.