[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/AetherModel/Aether/refs/heads/develop/srcPython/plot_logfiles.py [Back]  [Original]

#!/usr/bin/env python3

import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
import re
import argparse
import datetime as dt

# ----------------------------------------------------------------------
# Function to parse input arguments
# ----------------------------------------------------------------------

def get_args_timeline():

    parser = argparse.ArgumentParser(description =
                                     'Post process and move model results')
    parser.add_argument('-plotfile',
                        help = 'output file for plot',
                        default = 'timeline.png')

    parser.add_argument('-vars',
                        help = 'var(s) to plot (e.g. -vars 0 or -vars 0 1 2',
                        default = [0], nargs = '+', type = int)
    
    parser.add_argument('filelist', nargs='+', \
                        help = 'list files to use for generating plots')
    
    args = parser.parse_args()

    return args

# ----------------------------------------------------------------------
# Read space seperated file with header containing variable names
# ----------------------------------------------------------------------

def read_ssv_file(file):

    data = {"times" : [],
            'vars': [],
            'alt' : 0.0,
            "integral" : 'values',
            "file": file}

    fpin = open(file, 'r')
    lines = fpin.readlines()
    fpin.close()
    
    vars = lines[0].split(' ')
    if (vars[6] == 'milli'):
        iOff = 7
    else:
        iOff = 6

    data['vars'] = vars[iOff:]
    nVars = len(data['vars'])
        
    iStart = 1
    iEnd = len(lines)
    iLine = iStart
    allValues = np.zeros((nVars, iEnd - iStart))

    while (iLine < iEnd):
        aline = lines[iLine].split(' ')

        if ((len(aline) - iOff) == nVars):

            year = int(aline[0])
            month = int(aline[1])
            day = int(aline[2])
            hour = int(aline[3])
            minute = int(aline[4])
            second = int(aline[5])
            if (iOff == 6):
                milli = 0
            else:
                milli = int(aline[6])
            t = dt.datetime(year, month, day, hour, minute, second, milli)
        
            data["times"].append(t)
            for iVar in range(nVars):
                allValues[iVar, iLine - iStart] = float(aline[iOff + iVar])
        iLine += 1
        
    data['values'] = allValues
    
    return data
        

# ----------------------------------------------------------------------
# Read file
# ----------------------------------------------------------------------

def read_timeline_file(file):

    data = {"times" : [],
            'vars': [],
            'alt' : 0.0,
            "integral" : 'values',
            "file": file}

    fpin = open(file, 'r')

    lines = fpin.readlines()

    iStart = 0
    iEnd = len(lines)
    iLine = iStart

    while (iLine < iEnd):
        line = lines[iLine]

        m = re.match(r'#VAR',line)
        if m:
            # skip year, month, day, hour, minute, second:
            if (lines[iLine+1].strip().lower() == 'year'):
                iLine += 7
            else:
                iLine += 1
            while (len(lines[iLine].strip()) > 1):
                data["vars"].append(lines[iLine].strip())
                iLine += 1
            data['var'] = data["vars"][0]

        m = re.match(r'#INTEGRAL',line)
        if m:
            iLine += 1
            data["integral"] = lines[iLine].strip()

        m = re.match(r'#ALTITUDE',line)
        if m:
            iLine += 1
            data["alt"] = float(lines[iLine].strip())

        m = re.match(r'#DIRECTORY',line)
        if m:
            iLine += 1
            data["dir"] = lines[iLine].strip()

        m = re.match(r'#START',line)
        if m:
            iStart = iLine + 1
            break

        iLine += 1

    nVars = len(data['vars'])
    nTimes = iEnd - iStart
    allValues = np.zeros([nVars, nTimes])
    for i in range(iStart, iEnd):
        aline = lines[i].split()
        year = int(aline[0])
        month = int(aline[1])
        day = int(aline[2])
        hour = int(aline[3])
        minute = int(aline[4])
        second = int(aline[5])
        t = dt.datetime(year, month, day, hour, minute, second)
        
        data["times"].append(t)
        for iVar in range(nVars):
            allValues[iVar, i - iStart] = float(aline[6 + iVar])

    data['values'] = allValues
            
    return data

# ----------------------------------------------------------------------
# match filename with colors and linestyles
# ----------------------------------------------------------------------

def assign_var_to_color(var):

    color = 'black'
    line = 'solid'
    label = file
    
    m = re.match('.*GOCE.*', var)
    if m:
        color = 'black'
        line = 'solid'
        label = 'GOCE'

    m = re.match('.*GITM.*', var)
    if m:
        color = 'blue'
        line = 'solid'
        label = 'GITM'
        
    m = re.match('.*Smooth.*', var)
    if m:
        line = 'dashed'
        label = label + ' (smoothed)'
        
    return color, line, label

# ----------------------------------------------------------------------
# match filename with colors and linestyles
# ----------------------------------------------------------------------

def assign_file_to_color(file):

    color = 'black'
    line = 'solid'
    label = file
    
    m = re.match('gdcA.*', file)
    if m:
        color = 'black'

    m = re.match('gdcB.*', file)
    if m:
        color = 'blue'

    m = re.match('gdcC.*', file)
    if m:
        color = 'cyan'

    m = re.match('gdcD.*', file)
    if m:
        color = 'purple'

    m = re.match('gdcE.*', file)
    if m:
        color = 'orange'

    m = re.match('gdcF.*', file)
    if m:
        color = 'red'

    m = re.match(r'base', file)
    if m:
        color = 'black'
        line = 'solid'
        label = 'Idealized Model'

    m = re.match(r'fre', file)
    if m:
        color = 'grey'
        line = 'solid'
        label = 'FRE Model'

    m = re.match(r'ovation', file)
    if m:
        color = 'blue'
        line = 'dashed'
        label = 'Ovation'

    m = re.match(r'avee_050', file)
    if m:
        color = 'darkblue'
        line = 'dashed'
    m = re.match(r'avee_075', file)
    if m:
        color = 'blue'
        line = 'dashed'

    m = re.match(r'avee_150', file)
    if m:
        color = 'firebrick'
        line = 'dashdot'
        
    m = re.match(r'avee_200', file)
    if m:
        color = 'red'
        line = 'dashdot'
        
    m = re.match(r'fta', file)
    if m:
        color = 'forestgreen'
        line = 'dashed'
        label = 'FTA Model'

    m = re.match(r'ae', file)
    if m:
        color = 'plum'
        line = 'dashed'
        label = 'FRE, AE Power'
        
    m = re.match(r'ions', file)
    if m:
        color = 'plum'
        line = 'dashdot'
        label = 'Ions'
        
    m = re.match(r'.*no', file)
    if m:
        color = 'cyan'
        label = 'NO Cooling'
    m = re.match(r'.*ch', file)
    if m:
        color = 'red'
        label = 'Chemical Heating'
    m = re.match(r'.*ht', file)
    if m:
        color = 'blue'
        label = 'Heat Transfer'
    m = re.match(r'.*jh', file)
    if m:
        label = 'Joule Heating'
        
    return color, line, label

# Needed to run main script as the default executable from the command line
if __name__ == '__main__':

    args = get_args_timeline()

    iVar = args.vars[0]

    nFiles = len(args.filelist)
    nVars = len(args.vars)
    
    fig = plt.figure(figsize = (10,10))
    ax = fig.add_subplot(111)
    
    for file in args.filelist:
        print("Reading file : ",file)
        #data = read_timeline_file(file)
        data = read_ssv_file(file)
        nT = len(data["times"])-1
        for iVar in args.vars:
            label = data["vars"][iVar]
            color = 'black'
            line = '--'
            if (nFiles > 1):
                color,line,label = assign_file_to_color(file)
            if (nVars > 1):
                color,line,label = assign_var_to_color(data['vars'][iVar])
                
            ax.plot(data["times"][:nT], data["values"][iVar,:nT], label = label,
                    color = color, linestyle = line, linewidth = 2.0)

    iVar = args.vars[0]
    ytitle = data["integral"] + " of " + data["vars"][iVar]
    if (data["alt"] > 0):
        ytitle += " at %5.1f" % data["alt"] + " km Alt"
    ax.set_ylabel(ytitle)

    ax.legend()
    plotfile = args.plotfile
    print('writing : ',plotfile)    
    fig.savefig(plotfile)
    plt.close()

Web Proxy Viewer  |  New URL  |  Original Page