allanplot.py 3.37 KB
#!/usr/bin/env python

import argparse, allantools, numpy, csv, glob, Gnuplot, fnmatch, os
import matplotlib.pyplot as plt

#==============================================================================

# Default filename
FILENAME = '*.dat'
COLUMNS = '2'
RATE = 1

#==============================================================================

def parse():
    """
    Specific parsing procedure for Allan Deviation plotting tool.
    :returns: populated namespace (parser)
    """
    parser = argparse.ArgumentParser(description = 'Plot Allan Deviation from timeseries file',
                                     epilog = 'Example: \'./allanplot.py -f \'toto.dat\' -c 2 3\' compute and plot Allan Deviation form columns 2 and 3 of toto.dat')

    parser.add_argument('-f',
                        action='store',
                        dest='filename',
                        default=FILENAME,
                        help='File(s) to import (default '+FILENAME+')')

    parser.add_argument('-c',
                        nargs = '+',
                        action='store',
                        dest='columns',
                        default=COLUMNS,
                        help='Columns to import (default '+str(COLUMNS)+')')

    parser.add_argument('-r',
                        action='store',
                        dest='rate',
                        default=RATE,
                        help='Time rate in seconds (default '+str(RATE)+')')

    parser.add_argument('-R',
                        action='store_true',
                        dest='rel',
                        default=False,
                        help='Relative ADev')

    args = parser.parse_args()
    return args

#==============================================================================

def main():
    """
    Main script
    """
    # Parse command line
    args = parse()
    # filename
    filename = args.filename
    # columns
    columns = map(int, args.columns)
    # rate
    rate = int(args.rate)
    # rel
    rel = bool(args.rel)

    try:
        list_files = []
        filename = filename.split()
        for name in filename:
            list_files.extend(sorted(glob.glob(name)))

        for name in list_files:
            print(name)
        data = []

        for f in list_files:
            with open(f, 'r') as dest_f:
                data_iter = csv.reader(dest_f, delimiter = '\t', quotechar = '"')
                temp_data = [value for value in data_iter]
                data.extend(temp_data)

        data = numpy.asarray(data, dtype = float)

        del(temp_data, list_files, value, f)

        g = Gnuplot.Gnuplot(persist = 1)
        g('set logscale x')
        g('set logscale y')
        g('set grid')
        g('set format y "%0.1e"')
        g.xlabel('Tau (s)')
        g.ylabel('Adev')

        for i in columns:
            if rel:
                (tau2, ad, ade, adn) = allantools.adev(data[:,i]/data[:,i].mean(), rate=rate, data_type="freq", taus='decade')
            else:
                (tau2, ad, ade, adn) = allantools.adev(data[:,i], rate=rate, data_type="freq", taus='decade')
            g.replot(Gnuplot.Data(tau2, ad, ade, with_='yerrorbars', title='%s : %s'%(name, str(i))))

    except Exception as ex:
            print 'Oups '+str(ex)
    print 'Program ending\n'

#==============================================================================

if __name__ == "__main__":
    main()