Commit d91972d3 authored by Zolnierczuk, Piotr's avatar Zolnierczuk, Piotr
Browse files

options cleanup, more robust option parsing

parent 4fd4d19f
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -41,18 +41,18 @@ def list_variables(filenames):
                    break
                if rekw.search(line):
                    tag  = ElementTree.fromstring(line)
                    vals = _evaluate(tag.text)
                    name = tag.attrib['name']
                    results[name] = results.setdefault(name, 0) + 1
    results = results.keys()
    results.sort()
                    results[name] = vals
    return results

def extract_data(filenames, patterns, start_date=None, verbose=True):
def extract_data(filenames, patterns, start_date=None, stop_date=None,
                 verbose=True):
    "extract history data from history.log type files"
    found    = patterns[:]
    header   = dict.fromkeys(patterns)
    result   = { patt: list() for patt in patterns }
    patterns = { patt: re.compile(patt) for patt in patterns }

    for filename in filenames:
        _fname, fext = os.path.splitext(filename)
        _open = open
@@ -65,27 +65,29 @@ def extract_data(filenames, patterns, start_date=None, verbose=True):
                        tag  = ElementTree.fromstring(line)
                        vals = _evaluate(tag.text)
                        date = datetime.strptime(tag.attrib['time'], "%Y/%m/%d %H:%M:%S")
                        if start_date and date < start_date:
                            continue

                        if not header[patt]:
                            header[patt] = ['Date Time', ] + [ "%s_%d" % (patt, _x+1) for _x in range(len(vals))]
                        if not result[patt]:
                            result[patt] = []

                        if start_date and date < start_date:
                            continue
                        if stop_date  and date > stop_date:
                            break
                        result[patt].append([date, ]+vals)
                        break
        if verbose:
            print 'read', filename

    found = []
    for patt in patterns:
        if header[patt] is None:
            print "*WARNING*: pattern", patt, "not found"
            found.remove(patt)
            continue

        if verbose:
            print patt, header[patt]

        tmp = pd.DataFrame(result[patt], columns=header[patt])
        found.append(patt)
        result[patt] = tmp.sort()
    return found, result

+87 −28
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ Piotr Zolnierczuk, JCNS FZ-Juelich, 2013

"""


import os
import argparse
import matplotlib.pyplot as plt
import datetime as dt
@@ -18,12 +18,20 @@ from pysen.history import extract_data, list_variables
def plot_var(data, names, columns=None):
    "plot variable"
    nplots = len(names)
    _fig, axes = plt.subplots(nplots, 1, sharex=True)
    fig, axes = plt.subplots(nplots, 1, sharex=True)

    min_date = None
    max_date = None
    for iplot, name in enumerate(names):
        datap = data[name]
        if datap is None:
            continue
        xdates = min(datap['Date Time']), max(datap['Date Time'])

        if min_date is None or xdates[0] < min_date:
            min_date = xdates[0]
        if max_date is None or xdates[1] > max_date:
            max_date = xdates[1]

        if columns and columns.get(name):
            cols = columns.get(name)
@@ -45,7 +53,11 @@ def plot_var(data, names, columns=None):
        datap.plot(ax=axs, x='Date Time', y=cols)
        axs.grid(True)
        axs.legend(loc='best')
        axs.set_xlabel('')

    fig.subplots_adjust(hspace=0.05)
    fig.suptitle("NSE History from %s to %s" % (min_date.strftime("%Y-%m-%d %H:%M"),
                                                 max_date.strftime("%Y-%m-%d %H:%M")))

def plot_sc(data):
    "special plot SC Temps and Currents"
@@ -53,7 +65,7 @@ def plot_sc(data):
    data['i00']['i00_3'] = data['i00']['i00_3']
    data['i00'].columns = ['Date Time', 'SC Current', 'SC Setpoint' ,'SC Voltage' ]

    _fig, ax1 = plt.subplots()
    fig, ax1 = plt.subplots()
    ax2 = ax1.twinx()

    data['SC1'].plot(ax=ax1, x='Date Time', y=['SC1_3', 'SC1_4' ], style=['b-', 'g-'])
@@ -63,12 +75,20 @@ def plot_sc(data):

    ax2.set_ylim((-1, 1))
    ax2.set_ylabel('Current [kA], |Voltage[V]|')
    ax2.set_xlabel('')
    ax2.legend(loc='upper right')

    ax1.grid(True)
    ax1.set_ylabel('SC Temperature [K]')
    ax1.set_xlabel('')
    ax1.legend(loc='upper left')

    min_date, max_date = min(data['i00']['Date Time']), max(data['i00']['Date Time'])
    fig.subplots_adjust(hspace=0.05)
    fig.suptitle("NSE History from %s to %s" % (min_date.strftime("%Y-%m-%d %H:%M"),
                                                max_date.strftime("%Y-%m-%d %H:%M")))



def parse_indices(args):
    "parse indices"
@@ -82,56 +102,95 @@ def parse_indices(args):
        cols[key] = vals
    return names, cols

def parse_date(arg):
    "parse date"
    formats = [ "%Y-%m-%d",
                "%Y-%m-%d %H",
                "%Y-%m-%d %H:%M",
                "%Y-%m-%d %H:%M:%S" ]
    res = None
    for fmt in formats:
        try:
            res = dt.datetime.strptime(arg, fmt)
            break
        except ValueError:
            pass
    if not res:
        raise ValueError
    return res

def main():
    "run the script"
    coil_patt = ['SC1', 'SC2', 'i00']
    coil_patt = ['SC1', 'SC2', 'i00'] # for -C option

    parser = argparse.ArgumentParser(description='plot var')
    parser.add_argument('file', metavar='filename', help='file to process', nargs='+')
    description = """
     Plot selected variables from history file.
     NSE_HISTORY_LOG environment varable may be used to specify history file.
    """

    group = parser.add_mutually_exclusive_group()
    group.add_argument('--name',  '-n', dest='name', default=['Oil',], type=str, nargs='*',
                        help='set variable name (default=%(default)s)')
    group.add_argument('--coils', '-C',  action='store_true',
                        help='special plot - superconducting coils')
    parser = argparse.ArgumentParser(description=description)
    parser.add_argument('file', metavar='filename',
                        help='file to process', nargs='*')

    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('--list',  '-l', action='store_true',
                        help='list variables to plot')
    group.add_argument('--coils', '-C',  action='store_true',
                        help='special plot - superconducting coils')
    group.add_argument('--name',  '-n', dest='name', metavar='var',
                       type=str, nargs='+', help='set variable name')


    #parser.add_argument('--col1', '-c1', dest='c1',   type=int, default=1,
    #                    help='set first col to show (default=%(default)s)')
    #parser.add_argument('--col2', '-c2', dest='c2',   type=int, default=None,
    #                    help='set last col to show (default=%(default)s)')
    parser.add_argument('--start-date',  '-s', dest='start',
                        help='set start date (YYYY-mm-dd)')
    parser.add_argument('--begin',  '-b', dest='begin', metavar='date',
                        type=parse_date,
                        help='set begin/start date (YYYY-mm-dd [HH:MM:SS])')
    parser.add_argument('--end',    '-e', dest='end', metavar='date',
                        type=parse_date,
                        help='set end/stop date (YYYY-mm-dd [HH:MM:SS])')
    parser.add_argument('--noplot', action='store_true', help=argparse.SUPPRESS)

    args = parser.parse_args()

    # list variables
    # if no files to process let's check NSE_HISTORY_LOG env variable
    if not args.file:
        envfile = os.getenv('NSE_HISTORY_LOG')
        if envfile:
            args.file = [envfile,]
        else:
            parser.error('no files to process')


    # list available variables
    if args.list:
        print list_variables(args.file)
        vardict = list_variables(args.file)
        keys = vardict.keys()
        keys.sort()
        for key in keys:
            if vardict[key]:
                print "%-20s" % key, vardict[key]
        print
        return


    if args.coils:
        args.name = coil_patt

    if args.start:
        try:
            args.start = dt.datetime.strptime(args.start, "%Y-%m-%d")
        except ValueError:
            args.start = dt.datetime.strptime(args.start, "%Y-%m-%d %H:%M:%S")


    names, columns = parse_indices(args.name)
    found, data = extract_data(args.file, names,
                               start_date=args.begin, stop_date=args.end)

    if not found:
        parser.error("no variables found, use -l to list available vars")


    found, data = extract_data(args.file, patterns=names, start_date=args.start)

    if args.coils:
        plot_sc(data)
    else:
        plot_var(data, found, columns=columns)

    if args.noplot:
        return

    plt.show()