Commit 7b6fdcba authored by Zolnierczuk, Piotr's avatar Zolnierczuk, Piotr
Browse files

added nseplot dtrfile, fixes in transmission plot

parent a7579e82
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -776,20 +776,27 @@ def read_transmission(filename):
    #transtab = { '"' : None,
    #             '\n': None, }
    with open(filename, mode='r', encoding='ascii') as _fdesc:
        lines = _fdesc.readlines()
        header = remove_chars(lines[1], delchars='"\n')

        lines = iter(_fdesc.readlines())
        prevline = None
        while True:
            line = next(lines)
            if line.startswith('"detector.sum'):
                break;
            prevline = line
        header = remove_chars(prevline, delchars='"\n')
        result['header']     = header
        header = header.split(',')
        result['proposal'  ] = header[0]
        result['sample'    ] = header[1].split()[-1]
        result['wavelength'] = _evaluate(header[2].split()[-1])
        thead = remove_chars(lines[2], delchars='"\n').split()
        tdata = remove_chars(lines[3], delchars='"\n').split()
        thead = remove_chars(line, delchars='"\n').split()
        tdata = remove_chars(next(lines), delchars='"\n').split()
        for k,v in zip(thead, tdata):
            result[k] = _evaluate(v)
        tmpkey = None
        tmparr = []
        for line in lines[4:]:
        for line in lines:
            line = remove_chars(line, delchars='"\n').strip()
            if not line:
                continue
+2 −1
Original line number Diff line number Diff line
@@ -3,7 +3,8 @@ plotting subpackage
"""
from .plotutil    import get_nsubplots                               # NOQA
from .qplot       import ( plot_coverage, plot_curscan,              # NOQA
                           plot_diffrun , plot_transmission)         # NOQA
                           plot_diffrun , plot_transmission,         # NOQA
                           plot_datreat)                             # NOQA
from .echo        import plot_single_echo, echo_plot, atari_plot     # NOQA
from .histplotlib import plot_var, plot_sc                           # NOQA
from .nseplotlib  import ( plot_atari, plot_echo,                    # NOQA
+57 −39
Original line number Diff line number Diff line
@@ -12,9 +12,8 @@ from pysen import version, setup_logger
from pysen.config import DEFAULT_ACCELERATOR_POWER
from pysen.inout  import convert_to_hdf
from pysen.plot   import ( plot_echo, plot_atari, plot_map, 
                           plot_xyz,
                           plot_magnetic_fields,
                           plot_diffrun, plot_transmission )
                           plot_xyz, plot_magnetic_fields,
                           plot_diffrun, plot_transmission, plot_datreat)
#from pysen.plot.cmdline import NsePlotApp

def action_default(filenames, **kwargs):
@@ -77,7 +76,7 @@ def action_diffrun(filenames, **kwargs):
def action_transmission(filenames, **kwargs):
    "action for transmission"
    savefig       = kwargs.pop('savefig')
    spectrum_only = kwargs.pop('spectrum_only')
    spectrum_only = kwargs.get('spectrum_only')
    #log = kwargs.pop('log')
    to_show = True
    ax1 = None
@@ -96,8 +95,17 @@ def action_transmission(filenames, **kwargs):
        to_show = True
    return to_show


#def action_qtau(, **kwargs):
def action_datreat(filenames, **kwargs):
    "action for datreat"
    savefig = kwargs.pop('savefig')
    #log = kwargs.pop('log')
    _, axis = plt.subplots(figsize=(8,8))
    plot_datreat(axis, filenames, **kwargs)
    if savefig:
        plt.savefig(savefig)
    else:
        to_show = True
    return to_show



@@ -131,6 +139,12 @@ def arguments_vertscale(pars):
    pars.add_argument('--normalize', '-n' , dest='normalize', action='store_true',
                           help='normalize results')

def add_subparser(name, parent, sub, helpmsg=None, filearg=None):
    parser_name = sub.add_parser(name, help=helpmsg, parents=[parent])
    if filearg:
        parser_name.add_argument('file', metavar='filename', help='file to process', nargs=filearg)
    return parser_name.add_argument_group()

def main():
    "the main"

@@ -140,7 +154,7 @@ def main():
    parser_top.set_defaults(loglevel=1, outdir='.')
    parser_top.add_argument('--version', '-V', action='version',
                            version='%(prog)s pysen={version}'.format(version=version(full=True)))
    subparsers  = parser_top.add_subparsers(dest='what', required=True, help='what to plot')
    subparsers  = parser_top.add_subparsers(dest='plot', required=True, help='what to plot')

    # common arguments
    parser = argparse.ArgumentParser(add_help=False)
@@ -152,27 +166,23 @@ def main():
                        center_only=False, whole_detector=False,
                        map_type='all', phase0=None,
                        incoherent=False, max_chi2=1e3)
    parser.add_argument('file', metavar='filename', help='file to process', nargs='+')
    parser.add_argument('--save-figure', '-S', dest='savefig',
    # version option
    parser.add_argument('--version', '-V', action='version',
                        version='%(prog)s pysen={version}'.format(version=version(full=True)))
    #
    parser.add_argument('--save-figure', '-S', dest='savefig', metavar='file',
                        help='save figure to a file (do not show)')
    parser.add_argument('--save-file', '-s', dest='savefile',
    parser.add_argument('--save-file', '-s', dest='savefile', metavar='file',
                        help='save data to a csv file')
    # mutually exclusive [ -v | -q ]
    group_vrb = parser.add_mutually_exclusive_group()
    group_vrb.add_argument('--verbose', '-v', dest='loglevel', action='count',
                           help='verbose output')
    group_vrb.add_argument('--quiet', '-q', dest='loglevel', action='store_const',
                           const=0,  help='verbose output')
    # version option
    parser.add_argument('--version', '-V', action='version',
                        version='%(prog)s pysen={version}'.format(version=version(full=True)))

                           const=0,  help='suppres output')

    # echo plot
    parser_echo = subparsers.add_parser('echo', help='plot echo (.echo or .h5 files)', parents=[parser])
    grp_echo = parser_echo.add_argument_group('echo plot options')
    grp_echo.add_argument('--tau', '-t',  dest='tau', type=int,
                          help='set tau to display (default=%(default)s)')
    grp_echo=add_subparser('echo', parser, subparsers, helpmsg='plot echo (.echo or .h5 files)', filearg='+')
    grp_echo.add_argument('--center-only'   , '-C', dest='center_only', action='store_true',
                          help='show only center patch')
    grp_echo.add_argument('--only-echo', dest='only_echo', action='store_true',
@@ -187,8 +197,7 @@ def main():
    grp_echo.add_argument('--resolution', '-R', dest='resolution_plot', action='store_true',
                          help='TBD')
    # atari plot
    parser_atari  = subparsers.add_parser('atari',  help='atari plot (.echo or .h5 files)', parents=[parser])
    grp_atari = parser_atari.add_argument_group('atari plot options')
    grp_atari=add_subparser('atari', parser, subparsers, helpmsg='atari plot (.echo or .h5 files)', filearg='+')
    grp_atari.add_argument('--tau', '-t',  dest='tau', type=int,
                          help='set tau to display (default=%(default)s)')
    arguments_selection(grp_atari)
@@ -201,9 +210,7 @@ def main():
                           help='set inital phase for echo fitting (default=%(default)s)')

    # xyz plot
    parser_xyz = subparsers.add_parser('xyz', help='plot xyz analysis (.dat or .h5 files)', parents=[parser])
    grp_xyz= parser_xyz.add_argument_group('xyz analysis plot options')

    grp_xyz=add_subparser('xyz', parser, subparsers, helpmsg='plot xyz analysis (.dat or .h5 files)', filearg='+')
    grp_xyz.set_defaults(overwrite=False, qmin=0, qmax=np.inf, deltaq=0.001)
    arguments_selection(grp_xyz)
    arguments_vertscale(grp_xyz)
@@ -214,8 +221,7 @@ def main():
    grp_xyz.add_argument('--delta-q', dest='deltaq', type=float,
                           help='q histogram bin witdth')
    # diffraction plot
    parser_diffrun = subparsers.add_parser('diffrun', help='plot diffraction scan', parents=[parser])
    grp_diffrun= parser_diffrun.add_argument_group('diffraction scan plot options')
    grp_diffrun=add_subparser('diffrun', parser, subparsers, helpmsg='plot diffraction scan(s)', filearg='+')
    grp_diffrun.set_defaults(selection=None, power=DEFAULT_ACCELERATOR_POWER)
    grp_diffrun.add_argument('--up',      '-u', dest='selection', action='append_const', const='up',
                       help="plot 'up' counts")
@@ -239,8 +245,7 @@ def main():
                        help="use attenuation table")

    # transmission plot
    parser_trans = subparsers.add_parser('transmission', help='plot transmission data', parents=[parser])
    grp_trans= parser_trans.add_argument_group('transmission plot options')
    grp_trans=add_subparser('transmission', parser, subparsers, helpmsg='plot transmission data', filearg='+')
    grp_trans.set_defaults(log_scale=False, spectrum_only=False, pos='p2')
    grp_trans.add_argument('--pos' , '-p', dest='pos' ,
                           help='set instrument position: p1, p2, p3 or p4 (default %(default)s)')
@@ -254,9 +259,16 @@ def main():
    grp_trans.add_argument('--echodet', '-e', dest='echodet', action='store_true',
                        help='report transmission for echodet 1/T')

    # datreat plot
    grp_dtr=add_subparser('datreat', parser, subparsers, helpmsg='plot datreat files (.dtr or .dat)', filearg='+')
    grp_dtr.add_argument('--logt', dest='logt', action='store_true',
                        help='set log scale for tau')
    grp_dtr.add_argument('--logs', dest='logs', action='store_true',
                        help='set log scale for S(Q,tau)')
    grp_dtr.add_argument('--prune', dest='prune', action='store_true',
                        help='prune data')
    # map plot
    parser_map = subparsers.add_parser('maps', help='plot maps (.echo or .h5 files)', parents=[parser])
    grp_map = parser_map.add_argument_group('map plot options')
    grp_map=add_subparser('maps', parser, subparsers, helpmsg='plot echo maps (.echo or .h5)', filearg='+')
    grp_map.add_argument('--tau', '-t',  dest='tau', type=int,
                         help='set tau to display (default=%(default)s)')
    grp_map.add_argument('--map-type', dest='map_type', choices=['all', 'up', 'down'],
@@ -264,8 +276,7 @@ def main():
    grp_map.add_argument('--num-pix', '-N', dest='npix', type=int,
                         help='set pixel binning (default=%(default)s)')
    # magnetic field
    parser_bfield = subparsers.add_parser('bfield', help='plot magnetic fields (.echo or .h5 files)', parents=[parser])
    grp_bfield = parser_bfield.add_argument_group('magnetic field plot options')
    grp_bfield=add_subparser('bfield', parser, subparsers, helpmsg='plot magnetic fields (.echo or .h5)', filearg='+')
    grp_bfield.add_argument('--tau', '-t',  dest='tau', type=int,
                            help='set tau to display (default=%(default)s)')
    grp_bfield.add_argument('--max-chi2', dest='max_chi2', type=float, default=1e-2,
@@ -273,31 +284,38 @@ def main():
    grp_bfield.add_argument('--axis', dest='axis', type=int, default=-1,
                            help='set axis to plot  (default=%(default)s)')

    # qtau plot
    #grp_qtau=add_subparser('qtau', parser, subparsers, helpmsg='plot q-tau coverage', filearg='?')

    # phase table
    #grp_ptab=add_subparser('phase_table', parser, subparsers, helpmsg='make phase table from echo files (.echo or .h5)', filearg='+')

    # ===================================
    args = parser_top.parse_args()
    log = setup_logger(args.loglevel)
    log.debug('program arguments %s', args)

    #if not args.what:
    #if not args.plot
    #    NsePlotApp().cmdloop()
    #    return


    plt.rcParams.update({'figure.max_open_warning': 0})
    if args.savefig:
        plt.switch_backend('Agg')

    kwargs = vars(args)

    if args.what in ('echo', 'atari', 'maps', 'bfield'):
        plot_action = dict(echo=plot_echo, atari=plot_atari, maps=plot_map, bfield=plot_magnetic_fields).get(args.what)
    if args.plot in ('echo', 'atari', 'maps', 'bfield'):
        plot_action = dict(echo=plot_echo, atari=plot_atari, maps=plot_map, bfield=plot_magnetic_fields).get(args.plot)
        to_show = action_default(args.file, action=plot_action, log=log, **kwargs)
    if args.what in ('xyz', ):
    if args.plot in ('xyz', ):
        to_show = action_xyz(args.file, log=log, **kwargs)
    if args.what in ('diffrun', ):
    if args.plot in ('diffrun', ):
        to_show = action_diffrun(args.file, log=log, **kwargs)
    if args.what in ('transmission', ):
    if args.plot in ('transmission', ):
        to_show = action_transmission(args.file, log=log, **kwargs)
    if args.plot in ('datreat', ):
        to_show = action_datreat(args.file, log=log, **kwargs)
    if to_show:
        plt.show()

+65 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ import time
import os
import logging
import collections
import itertools
import numpy as np

from matplotlib import cm
@@ -18,7 +19,7 @@ from scipy.spatial import ConvexHull

from .. import ANGSTROM
from ..config import PCHARGE_PER_SECOND, wavelength_bandwitdh
from ..inout  import read_datfile, read_diffrun, read_transmission
from ..inout  import read_datfile, read_diffrun, read_transmission, read_datreat


COLOR_MAP = { 0: None,
@@ -482,3 +483,66 @@ def plot_transmission(ax0, ax1, filenames, **kwargs):
        ax1.set_ylabel('T0/Tsam')
    ax1.grid(True)
    return


def _prune_data(data, min_points=3, min_taus=3, max_err=1.0):
    """
    Prune/cleanup DrSPINE reduced data

    """
    if len(data)<=0:
        return None
    data =  data.T
    data = data[data[:,5]>min_points] # at least min_points contributing points
    data = data[data[:,4]>0] # var(tau)
    data = data[data[:,3]>0] # var(sqt)
    data = data[data[:,2]>0] # err(sqt)
    data = data[data[:,1]>0] # require positive resultant sqt
    #
    data = data[data[:,2]/data[:,1]<max_err]
    #
    if len(data[:,4])<min_taus: # at least min_taus "good" taus
        return None
    return data.T



def plot_datreat(axis, filenames, **kwargs):
    "plot datreat-type file (DrSPINE output)"
    markers     =  itertools.cycle('^vso+*.')
    styles      =  itertools.cycle(['--',':','-.'  ])
    idx   = kwargs.pop('index', None)
    prune = kwargs.pop('prune', None)
    logt  = kwargs.pop('logt', None)
    logs  = kwargs.pop('logs', None)
    #
    for filename in filenames:
        if not os.path.exists(filename):
            continue
        data = read_datreat(filename)
        marker    = next(markers)
        linestyle = next(styles)

        for j, (m, d) in enumerate(data):
            if idx is not None and j not in idx:
                continue
            if prune:
                d = _prune_data(d)
            if d is None:
                continue
            try:
                q    = m['q']
                tau  = d[0]
                sqt  = d[1]
                serr = d[2]
                label="q=%.3f (%s[%s])" % (q, os.path.basename(filename), j)
                axis.errorbar(tau, sqt, yerr=serr, ls=linestyle, marker=marker, label=label)
            except Exception as _exc:
                print(j, _exc)

    if logt:
        axis.set_xscale('log')
    if logs:
        axis.set_yscale('log')
    axis.grid(True)
    axis.legend(loc='best')
+3 −3
Original line number Diff line number Diff line
@@ -2,9 +2,9 @@
PySEN revision module
"""
import sys
__version__  = "0.72"
__release__  = "dev4"
__date__     = "Aug 3, 2022"
__version__  = "0.73"
__release__  = "dev1"
__date__     = "Aug 8, 2022"

def version(full=False):
    "get pysen version number"
Loading