diff --git a/tools/plotting/fastnnlo_runtime_ah.py b/tools/plotting/fastnnlo_runtime_ah.py deleted file mode 100755 index 8a16a4d9bee6812415addab058625959fe74e65e..0000000000000000000000000000000000000000 --- a/tools/plotting/fastnnlo_runtime_ah.py +++ /dev/null @@ -1,277 +0,0 @@ -#!/usr/bin/env python3 -#-*- coding:utf-8 -*- - -import glob -import argparse -import glob -import sys -import matplotlib as mpl -import matplotlib.gridspec as gridspec -import matplotlib.lines as mlines -import matplotlib.patches as mpatches -import matplotlib.ticker as mticker -from matplotlib.ticker import (FormatStrFormatter, LogFormatter, NullFormatter, ScalarFormatter, AutoMinorLocator, MultipleLocator) -from matplotlib import cm -# We do not want any interactive plotting! Figures are saved to files instead. -# This also avoids the ANNOYANCE of frequently missing Tkinter/tkinter (python2/3) GUI backends! -# To produce scalable graphics for publication use eps, pdf, or svg as file format. -# For this to work we try the Cairo backend, which can do all of these plus the raster format png. -# If this is not usable, we fall back to the Agg backend capable only of png for nice web plots. -#ngbackends = mpl.rcsetup.non_interactive_bk -#print('[fastnnlo_pdfunc]: Non GUI backends are: ', ngbackends) -# 1st try cairo -backend = 'cairo' -usecairo = True -try: - import cairocffi as cairo -except ImportError: - try: - import cairo - except ImportError: - usecairo = False -# print('[fastnnlo_pdfunc]: Can not use cairo backend :-(') -# print(' cairocffi or pycairo are required to be installed') - else: - if cairo.version_info < (1, 11, 0): - # Introduced create_for_data for Py3. - usecairo = False -# print('[fastnnlo_pdfunc]: Can not use cairo backend :-(') -# print(' cairo {} is installed; cairo>=1.11.0 is required'.format(cairo.version)) -if usecairo: - mpl.use('cairo') -else: - backend = 'agg' - useagg = True - try: - mpl.use(backend, force=True) - except: - useagg = False - raise ImportError('[PlotRuntime]: Neither cairo nor agg backend found :-( Cannot produce any plots. Good bye!') - mpl.use('agg') -import matplotlib.pyplot as plt -# numpy -import numpy as np - - - -def main(): - - # Parse arguments - args = arguments() - - # extract correct paths for input and outputfiles - logfiles = get_files(args['logfiles']) - outputpath = args['output'] - all_plot = args['All'] - fmt = args['format'] - - # get all the information from logfiles as dict - # dict contains: runtime, runtime_unit, channel, events - loginformation = get_loginformation(logfiles) - - # plot all the information - if args['CPUtime']: - plot_elapsed_time(loginformation, outputpath, all_plot, fmt) - if args['Events']: - plot_events_per_hour(loginformation, outputpath, all_plot, fmt) - if not args['CPUtime'] and not args['Events']: - plot_elapsed_time(loginformation, outputpath, all_plot, fmt) - plot_events_per_hour(loginformation, outputpath, all_plot, fmt) - - exit(0) - -def arguments(): - - # Define arguments and options - parser = argparse.ArgumentParser(epilog='Skript to plot elapsed time of fastNLO channels', formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - # positional argument - parser.add_argument('logfiles', nargs='+', type=str, help='Either input is a single string from LAW Task or it is a list') - - # optional arguments - parser.add_argument('-o', '--output', nargs=1, type=str, default='./', - help='Set here the outputpath') - parser.add_argument('--CPUtime', dest='CPUtime', action='store_true', - help='Plot only the elapsed time') - parser.add_argument('--Events', dest='Events', action='store_true', - help='Plot only the events per hour') - parser.add_argument('--All', dest='All', action='store_true', - help='Set plotoptions according to plot for all channels') - parser.add_argument('--format', required=False, nargs=1, type=str, default='png', - help='Comma-separated list of plot formats to use: eps, pdf, png, svg. If nothing is chosen, png is used.') - - return vars(parser.parse_args()) - - -def get_files(files): - # check if logfiles argument is one filename glob or a list of files - if len(files)==1: - files = glob.glob(files[0]) - if len(files)==1: - print('fastnnlo_runtime: ERROR! Aborted, only one log file found: {}'.format(files[0])) - exit(3) - - return files - -def get_loginformation(files): - - run_time = [] - number_events = [] - channel = None - - for file in files: - event = False - run_time_temp = [] - - with open(file) as origin: - for line in origin: - # extract elapsed time with time unit - if 'Time elapsed' in line: - line = line.split(':') - hours = float(line[1]) - minutes = float(line[2]) - seconds = float(line[3]) - - if hours == True: - run_time_temp.append(hours + minutes/60 + seconds/360) - unit = 'hours' - else: - run_time_temp.append(minutes + seconds/60) - unit = 'minutes' - - # extract channel name - if 'Tablename' in line and not channel: - line = line.split() - tablename = line[2].split('.') - channel = tablename[0] + '.' + tablename[1] - # extract total events - if 'ncalltot=' in line and not event: - line = line.split(',') - number_events.append(float(line[4][10:])) - event = True - - run_time.append(run_time_temp[-1]) - - - run_time = np.array(run_time) - number_events = np.array(number_events) - - information = { - 'runtime': run_time, - 'runtime_unit': unit, - 'channel': channel, - 'events': number_events - } - - return information - - -def plot_elapsed_time(informationdict, out_path, plot_all=False, format='png'): - - time = informationdict['runtime'] - unit = informationdict['runtime_unit'] - channel = informationdict['channel'] - - if plot_all: - channel = channel.split('.') - channel = channel[0] - - # get relevant values - mean = np.mean(time) - std = np.std(time) - median = np.median(time) - iqd = np.subtract(*np.percentile(time, [75, 25], interpolation='linear'))/2. - - CPUtime = np.sum(time) / (1 if unit == 'hours' else 60) - - # set saving location - filename = out_path[0] + ('' if out_path[0][-1] == '/' else '/') - filename += channel + '.Hist_Elapsed_time.' + format - - # set figure - fig = plt.figure(figsize=(16, 12)) - ax = fig.gca() - - # plot histogram - n, batches, _ = ax.hist(time, bins=20, color='deepskyblue', edgecolor='black', label='Total CPU time: {0:0.0f} hours'.format(CPUtime)) - - if not plot_all: - # plot mean and median - ax.vlines(mean, 0, max(n), colors='red', linestyles='dashed', label=r'Mean: {0:0.1f}$\pm${2:0.1f} {1}'.format(mean, unit, std)) - ax.vlines(median, 0, max(n), colors='green', linestyles='dashed', label=r'Median: {0:0.1f}$\pm${2:0.1f} {1}'.format(median, unit, iqd)) - - # finish and save figure - ax.set_title('Elapsed time of ' + channel + ' production', fontsize=20) - ax.set_xlabel('CPU time [' + unit + ']', horizontalalignment='right', x=1.0, verticalalignment='top', y=1.0, fontsize=20, labelpad=15) - ax.set_ylabel('frequency', horizontalalignment='right', x=1.0, verticalalignment='top', y=1.0, fontsize=20, labelpad=15) - ax.set_yscale('log') - ax.tick_params(axis='both', which='major', labelsize=20) - - ax.legend(loc='best', fontsize=20) - ax.grid() - ax.set_axisbelow(True) - - fig.savefig(filename) - -def plot_events_per_hour(informationdict, out_path, plot_all=False, format='png'): - - time = informationdict['runtime'] - unit = informationdict['runtime_unit'] - channel = informationdict['channel'] - events = informationdict['events'] - - if unit == 'hours': - eph = events/time - else: - eph = events/(time/60) - - if plot_all: - channel = channel.split('.') - channel = channel[0] - - # get relevant values - mean = np.mean(eph) - std = np.std(eph) - median = np.median(eph) - iqd = np.subtract(*np.percentile(eph, [75, 25], interpolation='linear'))/2. - - CPUtime = np.sum(time) / (1 if unit == 'hours' else 60) - - - # set saving location - filename = out_path[0] + ('' if out_path[0][-1] == '/' else '/') - filename += channel + '.Hist_Events_per_hour.' + format - - # set figure - fig = plt.figure(figsize=(16, 12)) - ax = fig.gca() - - # plot histogram - n, batches, _ = ax.hist(eph, bins=20, color='deepskyblue', edgecolor='black', label='Total CPU time: {0:0.0f} hours'.format(CPUtime)) - - if not plot_all: - # scientific format - f = mticker.ScalarFormatter(useOffset=False, useMathText=True) - g = lambda x,pos : "${}$".format(f._formatSciNotation('%0.2e' % x)) - sci = mticker.FuncFormatter(g) - - # plot mean and median - ax.vlines(mean, 0, max(n), colors='red', linestyles='dashed', label=r'Mean: {0}$\pm${1} events/hour'.format(sci(mean), sci(std))) - ax.vlines(median, 0, max(n), colors='green', linestyles='dashed', label=r'Median: {0}$\pm${1} events/hour'.format(sci(median), sci(iqd))) - - # finish and save figure - ax.set_title('Events per hour of ' + channel + ' production', fontsize=20) - ax.set_xlabel('events/hour', horizontalalignment='right', x=1.0, verticalalignment='top', y=1.0, fontsize=20, labelpad=15) - ax.set_ylabel('frequency', horizontalalignment='right', x=1.0, verticalalignment='top', y=1.0, fontsize=20, labelpad=15) - ax.set_yscale('log') - ax.tick_params(axis='both', which='major', labelsize=20) - - ax.legend(loc='best', fontsize=20) - ax.grid() - ax.set_axisbelow(True) - - fig.savefig(filename) - - -if __name__ == "__main__": - main()