Loading pysen/echo/flippers.py +32 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ Calculation of Mezei flipper curves Adopted from the SNS-NSE control program by M. Monkenbusch (FZJ) """ import json import numpy as np import scipy.optimize as opt from numpy import sqrt, cos Loading Loading @@ -110,6 +111,37 @@ def make_flipper(name, params=None): return FlipperPi2(name=name, **params) raise ValueError(f"unknown flipper type '{ftype}' for flipper '{name}'") def make_flipper_from_file(filename): """make a flipper from a JSON file containing the flipper parameters The JSON file should contain a dictionary with the following keys: - name: The name of the flipper. - type: The type of the flipper (e.g., 'pi', 'pi/2'). - position: The distance from the source (in meters). - thickness: The thickness of the flipper (in meters). - turns_density: The density of turns in the flipper (turns/meter) Args: filename (str): The path to the JSON file containing the flipper parameters. Returns: dict: A dictionary containing the flipper parameters, or None if an error occurs. """ try: # Open the file in read mode ('r') with a 'with' statement # to ensure the file is automatically closed. with open(filename, 'r', encoding='utf-8') as file: # Use json.load() to parse the file content directly data = json.load(file) name = data.pop('name', 'unknown') return make_flipper(name, params=data) except FileNotFoundError: print(f"Error: The file '{filename}' was not found.") return None except json.JSONDecodeError: print(f"Error: Could not decode JSON from the file '{filename}'. Check the file format.") return None def tof_curve(flipper, lmax, dlam, points, sample_to_source, **kwargs): """ flipper - flipper object Loading pysen/plot/fliplotlib.py +9 −4 Original line number Diff line number Diff line Loading @@ -7,7 +7,7 @@ import matplotlib.pyplot as plt from ..constants import GAUSS from ..config import L2, Ltot, HMN, ANGSTROM from ..echo.flippers import make_flipper, tof_curve from ..echo.flippers import make_flipper, make_flipper_from_file, tof_curve def plot_flipper_curve(axs, name='fpi', **kwargs): "test with plots" Loading @@ -21,6 +21,7 @@ def plot_flipper_curve(axs, name='fpi', **kwargs): out = kwargs.pop('out', None) b_x = kwargs.pop('b_x', 0.0) # horizontal external field in GAUSS b_z = kwargs.pop('b_z', 0.0) # vertical external field in GAUSS fname = kwargs.pop('file', None) # flipper definition file log = logging.getLogger() L = Ltot.get(pos) # [m] source to detector Loading @@ -29,7 +30,6 @@ def plot_flipper_curve(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: Loading @@ -38,11 +38,16 @@ def plot_flipper_curve(axs, name='fpi', **kwargs): log.error("cannot load compare file (%s)",err) compare_data = None if fname: flipper = make_flipper_from_file(fname) name = flipper.name else: flipper = make_flipper(name) title = rf'{name} $\lambda_{{max}}$={lmax:g}$\AA$' delam = HMN/(freq*L) # wavelengtgh band lmax = lmax*ANGSTROM flipper = make_flipper(name) curve = tof_curve(flipper, lmax, delam, points=points, sample_to_source=L1, freq=freq, b_ext=B_ext, rewind=5) curve = np.roll(curve, shift) Loading pysen/revision.py +2 −2 Original line number Diff line number Diff line Loading @@ -2,8 +2,8 @@ PySEN revision module """ import sys __version__ = "2.1.0.dev7" __date__ = "Mar 8, 2026" __version__ = "2.1.0.dev8" __date__ = "Mar 10, 2026" def version(full=False): "get pysen version number" Loading pysen/ui/nseplot.py +6 −3 Original line number Diff line number Diff line Loading @@ -384,11 +384,14 @@ def add_flipper_options(subparser, parents=None): pars = subparser.add_parser('flipper', parents=parents, aliases=['flp',], help='helper to create flipper curves', description='create flipper curves') pars.set_defaults(file=[], name='fpi', freq=DEFAULT_ACCELERATOR_FREQ, pos='p2', pars.set_defaults(file=[], name='fpi', fname=None, freq=DEFAULT_ACCELERATOR_FREQ, pos='p2', points=163, shift=0, lmax=8.0, scale=1.0, compare=None) #pars.add_argument('file', metavar='filename', help='file to process', nargs='+') pars.add_argument('--name', '-n', dest='name', choices=NSE_FLIPPERS.keys(), flp = pars.add_mutually_exclusive_group() flp.add_argument('--name', '-n', dest='name', choices=NSE_FLIPPERS.keys(), help='flipper name (default %(default)s)') flp.add_argument('file', metavar='filename', help='file to process', nargs='?') # pars.add_argument('--frequency', '-F', dest='freq', type=float, metavar='freq', help='accelerator frequency (default %(default)s)') pars.add_argument('--wavelength', '-L', dest='lmax', type=float, metavar='lam', Loading test/data/flipper.json 0 → 100644 +7 −0 Original line number Diff line number Diff line { "name": "new_flipper", "type": "pi", "position": -1.2345678, "thickness": 0.314, "turns_density": 333.33 } No newline at end of file Loading
pysen/echo/flippers.py +32 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ Calculation of Mezei flipper curves Adopted from the SNS-NSE control program by M. Monkenbusch (FZJ) """ import json import numpy as np import scipy.optimize as opt from numpy import sqrt, cos Loading Loading @@ -110,6 +111,37 @@ def make_flipper(name, params=None): return FlipperPi2(name=name, **params) raise ValueError(f"unknown flipper type '{ftype}' for flipper '{name}'") def make_flipper_from_file(filename): """make a flipper from a JSON file containing the flipper parameters The JSON file should contain a dictionary with the following keys: - name: The name of the flipper. - type: The type of the flipper (e.g., 'pi', 'pi/2'). - position: The distance from the source (in meters). - thickness: The thickness of the flipper (in meters). - turns_density: The density of turns in the flipper (turns/meter) Args: filename (str): The path to the JSON file containing the flipper parameters. Returns: dict: A dictionary containing the flipper parameters, or None if an error occurs. """ try: # Open the file in read mode ('r') with a 'with' statement # to ensure the file is automatically closed. with open(filename, 'r', encoding='utf-8') as file: # Use json.load() to parse the file content directly data = json.load(file) name = data.pop('name', 'unknown') return make_flipper(name, params=data) except FileNotFoundError: print(f"Error: The file '{filename}' was not found.") return None except json.JSONDecodeError: print(f"Error: Could not decode JSON from the file '{filename}'. Check the file format.") return None def tof_curve(flipper, lmax, dlam, points, sample_to_source, **kwargs): """ flipper - flipper object Loading
pysen/plot/fliplotlib.py +9 −4 Original line number Diff line number Diff line Loading @@ -7,7 +7,7 @@ import matplotlib.pyplot as plt from ..constants import GAUSS from ..config import L2, Ltot, HMN, ANGSTROM from ..echo.flippers import make_flipper, tof_curve from ..echo.flippers import make_flipper, make_flipper_from_file, tof_curve def plot_flipper_curve(axs, name='fpi', **kwargs): "test with plots" Loading @@ -21,6 +21,7 @@ def plot_flipper_curve(axs, name='fpi', **kwargs): out = kwargs.pop('out', None) b_x = kwargs.pop('b_x', 0.0) # horizontal external field in GAUSS b_z = kwargs.pop('b_z', 0.0) # vertical external field in GAUSS fname = kwargs.pop('file', None) # flipper definition file log = logging.getLogger() L = Ltot.get(pos) # [m] source to detector Loading @@ -29,7 +30,6 @@ def plot_flipper_curve(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: Loading @@ -38,11 +38,16 @@ def plot_flipper_curve(axs, name='fpi', **kwargs): log.error("cannot load compare file (%s)",err) compare_data = None if fname: flipper = make_flipper_from_file(fname) name = flipper.name else: flipper = make_flipper(name) title = rf'{name} $\lambda_{{max}}$={lmax:g}$\AA$' delam = HMN/(freq*L) # wavelengtgh band lmax = lmax*ANGSTROM flipper = make_flipper(name) curve = tof_curve(flipper, lmax, delam, points=points, sample_to_source=L1, freq=freq, b_ext=B_ext, rewind=5) curve = np.roll(curve, shift) Loading
pysen/revision.py +2 −2 Original line number Diff line number Diff line Loading @@ -2,8 +2,8 @@ PySEN revision module """ import sys __version__ = "2.1.0.dev7" __date__ = "Mar 8, 2026" __version__ = "2.1.0.dev8" __date__ = "Mar 10, 2026" def version(full=False): "get pysen version number" Loading
pysen/ui/nseplot.py +6 −3 Original line number Diff line number Diff line Loading @@ -384,11 +384,14 @@ def add_flipper_options(subparser, parents=None): pars = subparser.add_parser('flipper', parents=parents, aliases=['flp',], help='helper to create flipper curves', description='create flipper curves') pars.set_defaults(file=[], name='fpi', freq=DEFAULT_ACCELERATOR_FREQ, pos='p2', pars.set_defaults(file=[], name='fpi', fname=None, freq=DEFAULT_ACCELERATOR_FREQ, pos='p2', points=163, shift=0, lmax=8.0, scale=1.0, compare=None) #pars.add_argument('file', metavar='filename', help='file to process', nargs='+') pars.add_argument('--name', '-n', dest='name', choices=NSE_FLIPPERS.keys(), flp = pars.add_mutually_exclusive_group() flp.add_argument('--name', '-n', dest='name', choices=NSE_FLIPPERS.keys(), help='flipper name (default %(default)s)') flp.add_argument('file', metavar='filename', help='file to process', nargs='?') # pars.add_argument('--frequency', '-F', dest='freq', type=float, metavar='freq', help='accelerator frequency (default %(default)s)') pars.add_argument('--wavelength', '-L', dest='lmax', type=float, metavar='lam', Loading
test/data/flipper.json 0 → 100644 +7 −0 Original line number Diff line number Diff line { "name": "new_flipper", "type": "pi", "position": -1.2345678, "thickness": 0.314, "turns_density": 333.33 } No newline at end of file