6 #include <boost/regex.hpp> 68 m_dqm_path( config.getUntrackedParameter<
std::
string>(
"dqmPath" ) )
69 , doPlotsVsScalLumi_ ( config.getParameter<bool>(
"doPlotsVsScalLumi" ) )
70 , doPlotsVsPixelLumi_( config.getParameter<bool>(
"doPlotsVsPixelLumi" ) )
71 , doPlotsVsPU_ ( config.getParameter<bool>(
"doPlotsVsPU" ) )
72 , scalLumiMEPSet_ ( doPlotsVsScalLumi_ ? getHistoPSet(config.getParameter<
edm::
ParameterSet>(
"scalLumiME") ) :
MEPSet{} )
101 static const boost::regex running_n_processes(
".*/Running [0-9]+ processes");
104 std::vector<std::string> subdirs = getter.
getSubdirs();
105 for (
auto const & subdir: subdirs) {
108 if (boost::regex_match(subdir, running_n_processes)) {
111 if ( getter.
get(subdir +
"/event time_real") )
114 std::vector<std::string> subsubdirs = getter.
getSubdirs();
115 for (
auto const & subsubdir: subsubdirs) {
116 if ( getter.
get(subsubdir +
"/event time_real") )
147 static const boost::regex process_name(
".*/process .*");
150 std::vector<std::string> subdirs = getter.
getSubdirs();
151 for (
auto const & subdir: subdirs) {
153 if (boost::regex_match(subdir, process_name)) {
157 std::vector<std::string> subsubdirs = getter.
getSubdirs();
158 for (
auto const & subsubdir: subsubdirs) {
159 if ( getter.
get(subsubdir +
"/path time_real") ) {
175 std::vector<std::string> subsubdirs = getter.
getSubdirs();
176 size_t npaths = subsubdirs.size();
178 MonitorElement* paths_time = booker.
book1D(
"paths_time_real",
"Total (real) time spent in each path", npaths, -0.5,
double(npaths)-0.5);
179 MonitorElement* paths_thread = booker.
book1D(
"paths_time_thread",
"Total (thread) time spent in each path", npaths, -0.5,
double(npaths)-0.5);
180 MonitorElement* paths_allocated = booker.
book1D(
"paths_allocated",
"Total allocated memory in each path", npaths, -0.5,
double(npaths)-0.5);
181 MonitorElement* paths_deallocated = booker.
book1D(
"paths_deallocated",
"Total deallocated in each path", npaths, -0.5,
double(npaths)-0.5);
188 for (
auto const & subsubdir: subsubdirs) {
191 if ( subsubdir.find(test)==std::string::npos )
continue;
193 static const boost::regex
prefix(current_path +
"/path ");
196 paths_time ->
getTH1F()->GetXaxis()->SetBinLabel(ibin,path.c_str());
197 paths_thread ->
getTH1F()->GetXaxis()->SetBinLabel(ibin,path.c_str());
198 paths_allocated ->
getTH1F()->GetXaxis()->SetBinLabel(ibin,path.c_str());
199 paths_deallocated->
getTH1F()->GetXaxis()->SetBinLabel(ibin,path.c_str());
202 if ( (me = getter.
get(subsubdir +
"/path time_real")) ) {
204 paths_time->
getTH1F()->SetBinContent(ibin,mean);
206 if ( (me = getter.
get(subsubdir +
"/path time_thread")) ) {
208 paths_thread->
getTH1F()->SetBinContent(ibin,mean);
210 if ( (me = getter.
get(subsubdir +
"/path allocated")) ) {
212 paths_allocated->
getTH1F()->SetBinContent(ibin,mean);
215 if ( (me = getter.
get(subsubdir +
"/path deallocated")) ) {
217 paths_deallocated->
getTH1F()->SetBinContent(ibin,mean);
224 for (
auto const & subsubdir: subsubdirs) {
231 std::vector<std::string> allmenames = getter.
getMEs();
232 if ( allmenames.empty() )
continue;
235 MonitorElement * me_real_total = getter.
get( subsubdir +
"/module_time_real_total" );
236 MonitorElement * me_thread_total = getter.
get( subsubdir +
"/module_time_thread_total" );
238 if (me_counter ==
nullptr or me_real_total ==
nullptr)
242 TH1D * real_total = me_real_total->
getTH1D();
243 TH1D * thread_total = me_thread_total->
getTH1D();
244 uint32_t
bins = counter->GetXaxis()->GetNbins() - 1;
245 double min = counter->GetXaxis()->GetXmin();
246 double max = counter->GetXaxis()->GetXmax() - 1;
250 TH1F * thread_average;
251 TH1F * thread_running;
256 me = getter.
get(
"module_time_real_average" );
259 assert( me->
getTH1F()->GetXaxis()->GetXmin() ==
min );
260 assert( me->
getTH1F()->GetXaxis()->GetXmax() ==
max );
261 real_average->Reset();
263 real_average = booker.
book1D(
"module_time_real_average",
"module real average timing", bins, min, max)->
getTH1F();
264 real_average->SetYTitle(
"average processing (real) time [ms]");
265 for (uint32_t
i = 1;
i <=
bins; ++
i) {
266 const char *
module = counter->GetXaxis()->GetBinLabel(
i);
267 real_average->GetXaxis()->SetBinLabel(
i, module);
271 me = getter.
get(
"module_time_thread_average" );
273 thread_average = me->
getTH1F();
274 assert( me->
getTH1F()->GetXaxis()->GetXmin() ==
min );
275 assert( me->
getTH1F()->GetXaxis()->GetXmax() ==
max );
276 thread_average->Reset();
278 thread_average = booker.
book1D(
"module_time_thread_average",
"module thread average timing", bins, min, max)->
getTH1F();
279 thread_average->SetYTitle(
"average processing (thread) time [ms]");
280 for (uint32_t
i = 1;
i <=
bins; ++
i) {
281 const char *
module = counter->GetXaxis()->GetBinLabel(
i);
282 thread_average->GetXaxis()->SetBinLabel(
i, module);
286 me = getter.
get(
"module_time_real_running" );
289 assert( me->
getTH1F()->GetXaxis()->GetXmin() ==
min );
290 assert( me->
getTH1F()->GetXaxis()->GetXmax() ==
max );
291 real_running->Reset();
293 real_running = booker.
book1D(
"module_time_real_running",
"module real running timing", bins, min, max)->
getTH1F();
294 real_running->SetYTitle(
"running processing (real) time [ms]");
295 for (uint32_t
i = 1;
i <=
bins; ++
i) {
296 const char *
module = counter->GetXaxis()->GetBinLabel(
i);
297 real_running->GetXaxis()->SetBinLabel(
i, module);
301 me = getter.
get(
"module_time_thread_running" );
303 thread_running = me->
getTH1F();
304 assert( me->
getTH1F()->GetXaxis()->GetXmin() ==
min );
305 assert( me->
getTH1F()->GetXaxis()->GetXmax() ==
max );
306 thread_running->Reset();
308 thread_running = booker.
book1D(
"module_time_thread_running",
"module thread running timing", bins, min, max)->
getTH1F();
309 thread_running->SetYTitle(
"running processing (thread) time [ms]");
310 for (uint32_t
i = 1;
i <=
bins; ++
i) {
311 const char *
module = counter->GetXaxis()->GetBinLabel(
i);
312 thread_running->GetXaxis()->SetBinLabel(
i, module);
316 me = getter.
get(
"module_efficiency" );
319 assert( me->
getTH1F()->GetXaxis()->GetXmin() ==
min );
320 assert( me->
getTH1F()->GetXaxis()->GetXmax() ==
max );
323 efficiency = booker.
book1D(
"module_efficiency",
"module efficiency", bins, min, max)->
getTH1F();
324 efficiency->SetYTitle(
"filter efficiency");
325 efficiency->SetMaximum(1.05);
326 for (uint32_t
i = 1;
i <=
bins; ++
i) {
327 const char *
module = counter->GetXaxis()->GetBinLabel(
i);
328 efficiency->GetXaxis()->SetBinLabel(
i, module);
333 for (uint32_t
i = 1;
i <=
bins; ++
i) {
334 double n = counter ->GetBinContent(
i);
335 double p = counter ->GetBinContent(
i+1);
337 efficiency->SetBinContent(
i, p / n);
340 double t = real_total->GetBinContent(
i);
341 real_average->SetBinContent(
i, t / events);
343 real_running->SetBinContent(
i, t / n);
346 t = thread_total->GetBinContent(
i);
347 thread_average->SetBinContent(
i, t / events);
349 thread_running->SetBinContent(
i, t / n);
368 std::vector<std::string> menames;
370 static const boost::regex byls(
".*byls");
371 static const boost::regex
test(suffix);
374 std::vector<std::string> allmenames = getter.
getMEs();
375 for (
const auto &
m : allmenames ) {
377 if (boost::regex_match(
m, byls))
378 menames.push_back(
m);
381 if ( menames.empty() )
396 edm::LogWarning(
"FastTimerServiceClient") <<
"no " << name <<
" ME is available in " << folder << std::endl;
404 std::vector<double>
lumi;
406 for (
size_t ibin=1; ibin <=
size; ++ibin ) {
408 if ( lumiVsLS->
getTProfile()->GetBinContent(ibin) == 0. )
continue;
410 lumi.push_back( lumiVsLS->
getTProfile()->GetBinContent(ibin) );
411 LS.push_back ( lumiVsLS->
getTProfile()->GetXaxis()->GetBinCenter(ibin) );
416 for (
auto m : menames ) {
418 label.erase(label.find(
"_byls"));
425 MonitorElement* meVsLumi = getter.
get( current_path +
"/" + label +
"_" + suffix );
431 meVsLumi = booker.
bookProfile(label +
"_" + suffix, label +
"_" + suffix, nbins, xmin, xmax, ymin, ymax);
433 meVsLumi->
getTProfile()->GetXaxis()->SetTitle(xtitle.c_str());
434 meVsLumi->
getTProfile()->GetYaxis()->SetTitle(ytitle.c_str());
436 for (
size_t ils=0; ils < LS.size(); ++ils ) {
437 int ibin = me->
getTProfile()->GetXaxis()->FindBin(LS[ils]);
440 meVsLumi->
Fill(lumi[ils],y);
451 pset.
add<
int> (
"nbins", 440 );
452 pset.
add<
double>(
"xmin", 0.);
453 pset.
add<
double>(
"xmax", 22000.);
461 pset.
add<
int> (
"nbins", 260 );
462 pset.
add<
double>(
"xmin", 0.);
463 pset.
add<
double>(
"xmax", 130.);
484 desc.
add<
bool>(
"doPlotsVsScalLumi",
true );
485 desc.
add<
bool>(
"doPlotsVsPixelLumi",
false );
486 desc.
add<
bool>(
"doPlotsVsPU",
true );
500 descriptions.
add(
"fastTimerServiceClient", desc);
T getParameter(std::string const &) const
static void fillPUMePSetDescription(edm::ParameterSetDescription &pset)
static MEPSet getHistoPSet(edm::ParameterSet pset)
void dqmEndLuminosityBlock(DQMStore::IBooker &booker, DQMStore::IGetter &getter, edm::LuminosityBlock const &, edm::EventSetup const &) override
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
MonitorElement * bookProfile(Args &&...args)
void fillPlotsVsLumi(DQMStore::IBooker &booker, DQMStore::IGetter &getter, std::string const ¤t_path, std::string const &suffix, MEPSet pset)
MonitorElement * get(const std::string &path)
#define DEFINE_FWK_MODULE(type)
void fillProcessSummaryPlots(DQMStore::IBooker &booker, DQMStore::IGetter &getter, std::string const &path)
TH1D * getTH1D(void) const
def setup(process, global_tag, zero_tesla=False)
double getMean(int axis=1) const
get mean value of histogram along x, y or z axis (axis=1, 2, 3 respectively)
~FastTimerServiceClient() override
void dqmEndJob(DQMStore::IBooker &booker, DQMStore::IGetter &getter) override
void fillPathSummaryPlots(DQMStore::IBooker &booker, DQMStore::IGetter &getter, double events, std::string const &path)
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::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
MonitorElement * book1D(Args &&...args)
static void fillLumiMePSetDescription(edm::ParameterSetDescription &pset)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::vector< std::string > getMEs(void)
FastTimerServiceClient(edm::ParameterSet const &)
void fillSummaryPlots(DQMStore::IBooker &booker, DQMStore::IGetter &getter)
void setCurrentFolder(const std::string &fullpath)
TH1F * getTH1F(void) const
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< std::string > getSubdirs(void)
void setCurrentFolder(const std::string &fullpath)
TProfile * getTProfile(void) const
void Reset(void)
reset ME (ie. contents, errors, etc)