Commit 6bf98f2c authored by Zolnierczuk, Piotr's avatar Zolnierczuk, Piotr
Browse files

new subcommand flipper

parent 85a48d64
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -64,6 +64,15 @@ J2_MAX = 0.0200 # [T*m] max field integral (20 mTm = 200 Gauss*m) # TODO: verif
#
J_LIMS = (J2_MIN, J1_MAX)

# 4b. Flipper names
NSE_FLIPPER_NAMES = {
    "fpi21"  : dict(type='pi/2', position =-2.824663, thickness=0.010, turns_density=833.33), #w=0.10 h=0.18, i33
    "fpi21rs": dict(type='pi'  , position =-2.283902, thickness=0.010, turns_density=833.33), #w=0.10 h=0.18, i37
    "fpi"    : dict(type='pi'  , position =-0.146000, thickness=0.013, turns_density=833.33), #w=0.18 h=0.18, i32
    "fpi22rs": dict(type='pi'  , position =+2.279194, thickness=0.010, turns_density=821.40), #w=0.28 h=0.28, i38
    "fpi22"  : dict(type='pi/2', position =+2.823903, thickness=0.010, turns_density=821.40), #w=0.28 h=0.28, i34
}

# 5. Misc other data
ATTENUATOR_TABLE_08A = {
    'ERROR' :  1.0,
+1 −0
Original line number Diff line number Diff line
@@ -16,5 +16,6 @@ from .xyzplotlib import ( plot_xyz, plot_xyz_nexus,
                           action_xyz, action_old_xyz )              # NOQA
from .nxsplotlib  import plot_detimage, action_detimage              # NOQA
from .miscplotlib import action_phase_table                          # NOQA
from .fliplotlib  import plot_flipper_curve, action_flipper          # NOQA
# obsolete
from .histplotlib import plot_var, plot_sc                           # NOQA
+98 −0
Original line number Diff line number Diff line
#!/usr/bin/env python
""" script to calculate Mezei flipper curves

""" calculate Mezei flipper curves
"""
import argparse
import logging
import numpy as np
import matplotlib.pyplot as plt

from pysen import version, setup_logger
from pysen.constants import GAUSS
from pysen.config import INST_POSITIONS, L2, Ltot, HMN, ANGSTROM, DEFAULT_ACCELERATOR_FREQ
from pysen.echo.flippers import FlipperPi, FlipperPi2, tof_curve
from ..constants import GAUSS
from ..config import L2, Ltot, HMN, ANGSTROM, NSE_FLIPPER_NAMES
from ..echo.flippers import FlipperPi, FlipperPi2, tof_curve

#NSE_FLIPPERS = {
#    "fpi21"  : FlipperPi2('fpi21',   position =-2.824663, thickness=0.010, turns_density=833.33), #w=0.10 h=0.18, i33
#    "fpi21rs": FlipperPi ('fpi21rs', position =-2.283902, thickness=0.010, turns_density=833.33), #w=0.10 h=0.18, i37
#    "fpi"    : FlipperPi ('fpi',     position =-0.146000, thickness=0.013, turns_density=833.33), #w=0.18 h=0.18, i32
#    "fpi22rs": FlipperPi ('fpi22rs', position =+2.279194, thickness=0.010, turns_density=821.40), #w=0.28 h=0.28, i38
#    "fpi22"  : FlipperPi2('fpi22',   position =+2.823903, thickness=0.010, turns_density=821.40), #w=0.28 h=0.28, i34
#}

flippers = {
    "fpi21"  : FlipperPi2('fpi21',   position =-2.824663, thickness=0.010, turns_density=833.33), #w=0.10 h=0.18, i33
    "fpi21rs": FlipperPi ('fpi21rs', position =-2.283902, thickness=0.010, turns_density=833.33), #w=0.10 h=0.18, i37
    "fpi"    : FlipperPi ('fpi',     position =-0.146000, thickness=0.013, turns_density=833.33), #w=0.18 h=0.18, i32
    "fpi22rs": FlipperPi ('fpi22rs', position =+2.279194, thickness=0.010, turns_density=821.40), #w=0.28 h=0.28, i38
    "fpi22"  : FlipperPi2('fpi22',   position =+2.823903, thickness=0.010, turns_density=821.40), #w=0.28 h=0.28, i34
}
NSE_FLIPPERS = {}

def curve_test(axs, name='fpi', **kwargs):
def plot_flipper_curve(axs, name='fpi', **kwargs):
    "test with plots"
    pos     = kwargs.pop('pos', 'p2')
    freq    = kwargs.pop('freq', 60.0)
@@ -41,6 +39,7 @@ def curve_test(axs, name='fpi', **kwargs):
    #B_ext = [ 1.000692*GAUSS, 0, -0.039814*GAUSS ] # ext. field
    B_ext = np.asarray([ b_x, 0.0, b_z])*GAUSS  # ext. field
    #
    title = rf'{name} $\lambda_{{max}}$={lmax:g}$\AA$'
    compare_data = None
    if compare is not None:
        try:
@@ -52,7 +51,18 @@ def curve_test(axs, name='fpi', **kwargs):
    delam = HMN/(freq*L) # wavelengtgh band
    lmax = lmax*ANGSTROM

    f = flippers.get(name)
    params = NSE_FLIPPER_NAMES.get(name, {})
    if not params:
        raise ValueError(f"unknown flipper name '{name}', choose from {list(NSE_FLIPPER_NAMES.keys())}")
    flipper_type = params.pop('type', 'unknown')
    if flipper_type == 'pi':
        f = FlipperPi(name=name, **params)
    elif flipper_type  == 'pi/2':
        f = FlipperPi2(name=name, **params)
    else:
        raise ValueError(f"unknown flipper type '{params.get('type')}' for flipper '{name}'")


    curve =  tof_curve(f, lmax, delam, points=points, sample_to_source=L1,
                       freq=freq, b_ext=B_ext, rewind=5)
    curve = np.roll(curve, shift)
@@ -62,68 +72,27 @@ def curve_test(axs, name='fpi', **kwargs):
        axs.plot(compare_data,'--', lw=1, label='compare %s' % compare, color=p[0].get_color())

    if out:
        with open(out, 'wt') as fd:
        with open(out, 'wt', encoding='ascii') as fd:
            fd.write(f"# flipper {f}\n")
            fd.write(f"# lambda = ({lmax-delam/ANGSTROM:g} - {lmax:g}) A\n")
            for point in scurve:
                fd.write(f"{point:g}\n")

def main():
    "TBD"
    description="<unknown>"
    #
    description='Tool to generate flipper curves'
    parser = argparse.ArgumentParser(description=description)
    parser.set_defaults(name='fpi',
                        pos='p2', freq=DEFAULT_ACCELERATOR_FREQ,
                        points=163, shift=0,
                        lmax=8.0, scale=1.0,
                        compare=None, loglevel=2, out=None, savefig=None)
    #parser.add_argument('filename', metavar='file', nargs='+', help='file name to process')
    parser.add_argument('--name', '-n', dest='name', choices=flippers.keys(),
                        help='flipper name (default %(default)s)')
    parser.add_argument('--frequency', '-F', dest='freq', type=float,
                        help='accelerator frequency (default %(default)s)')
    parser.add_argument('--wavelength', '-L', dest='lmax', type=float,
                        help='set (max) neutron wavelength in Angstroms (default %(default)s)')
    parser.add_argument('--pos', '-p', dest='pos', choices=INST_POSITIONS,
                        help='instrument position to determine wavelength band (default %(default)s)')
    parser.add_argument('--shift', dest='shift', type=float,
                        help='shift the curve by a number of points (default %(default)s)')
    parser.add_argument('--scale', dest='scale', type=float,
                        help='current scale factor (default %(default)s)')
    parser.add_argument('--compare', '-c', dest='compare',
                        help='compare with file (default %(default)s)')
    parser.add_argument('--safe-figure', '-S', dest='savefig', metavar='file',
                        help='save the output figure to a file and do not show it.')
    parser.add_argument('--outdir', '-o', dest='out',
                        help='write data into a file (default %(default)s)')
    parser.add_argument('--version', action='version',
                        version='%(prog)s pysen={version}'.format(version=version(full=True)))
    parser.add_argument('--verbose', '-v', dest='loglevel', action='count',
                        help='verbose output')
    parser.add_argument('--quiet', '-q', dest='loglevel', action='store_const', const=0,
                        help='verbose output')

    args = parser.parse_args()
    kwargs = vars(args)
    loglevel  = kwargs.pop('loglevel')
    savefig   = kwargs.pop('savefig')
    setup_logger(loglevel)
    axs.legend()
    axs.set_ylabel(r'I (A)')
    axs.grid()
    return title, scurve


    fig, ax1 = plt.subplots(1,1,figsize=(8,6))
    fig.suptitle(rf'{args.name} $\lambda_{{max}}$={args.lmax:g}$\AA$')
    curve_test(ax1, **kwargs)
def action_flipper(_filenames, **kwargs):
    "default action for echo, atari, etc"
    savefig = kwargs.pop('savefig')

    ax1.legend()
    ax1.set_ylabel(r'I (A)')
    ax1.grid()
    fig, ax = plt.subplots(1,1,figsize=(8,6))
    title, _ = plot_flipper_curve(ax, **kwargs)
    fig.suptitle(title)

    if savefig:
        fig.savefig(savefig)
    else:
        plt.show()


if __name__ == "__main__":
    main()
+2 −2
Original line number Diff line number Diff line
@@ -3,8 +3,8 @@ PySEN revision module
"""
import sys
__version__  = "2.0"
__release__  = ".7b2"
__date__     = "Sep 15, 2025"
__release__  = ".7b3"
__date__     = "Oct 10, 2025"

def version(full=False):
    "get pysen version number"
+8 −7
Original line number Diff line number Diff line
@@ -9,7 +9,8 @@ import numpy as np
import matplotlib.pyplot as plt

from pysen        import version, setup_logger, DEFAULT_LOG_LEVEL
from pysen.config import INST_POSITIONS, INST_MODES, DEFAULT_ACCELERATOR_POWER, TDC_MAXCH, TDC_MAXPIX
from pysen.config import (INST_POSITIONS, INST_MODES, DEFAULT_ACCELERATOR_POWER, TDC_MAXCH, TDC_MAXPIX,
                          DEFAULT_ACCELERATOR_FREQ, NSE_FLIPPER_NAMES)

# ACTION imports
import pysen.plot as nseplt
@@ -351,11 +352,11 @@ def add_flipper_options(subparser, parents=None):
    pars = subparser.add_parser('flipper', parents=parents, aliases=['flp',],
                                help='helpe to creat flipper curves',
                                description='is flipper')
    pars.set_defaults(name='fpi', pos='p2', #freq=DEFAULT_ACCELERATOR_FREQ,
    pars.set_defaults(file=None, name='fpi', pos='p2', freq=DEFAULT_ACCELERATOR_FREQ,
                        points=163, shift=0, lmax=8.0, scale=1.0,
                        compare=None, loglevel=2, out=None, savefig=None)
    #pars.add_argument('file', metavar='filename', help='file to process', nargs='+')
    pars.add_argument('--name', '-n', dest='name', choices=['f1', 'f2'], #flippers.keys(),
    pars.add_argument('--name', '-n', dest='name', choices=NSE_FLIPPER_NAMES.keys(),
                        help='flipper name (default %(default)s)')
    pars.add_argument('--frequency', '-F', dest='freq', type=float,
                        help='accelerator frequency (default %(default)s)')
@@ -451,7 +452,7 @@ def main():
                    datreat=nseplt.action_datreat, dtr=nseplt.action_datreat,
                    qtau=nseplt.action_qtau, qt=nseplt.action_qtau,
                    phase_table=nseplt.action_phase_table, pt=nseplt.action_phase_table,
                    flipper=nseplt.phase_table, #action_flipper, flp=nseplt.action_flipper,
                    flipper=nseplt.action_flipper, flp=nseplt.action_flipper,
                    old_xyz=nseplt.action_old_xyz).get(args.command, None)
    if action is None:
        raise RuntimeError('no action specified for %s' % args.command)
Loading