Commit dfc67c84 authored by Zolnierczuk, Piotr's avatar Zolnierczuk, Piotr
Browse files

custom flipper

allow to read a custom flipper config file (json)
example in test/data/flipper.json
parent 44f04e17
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -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
@@ -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
+9 −4
Original line number Diff line number Diff line
@@ -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"
@@ -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
@@ -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:
@@ -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)
+2 −2
Original line number Diff line number Diff line
@@ -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"
+6 −3
Original line number Diff line number Diff line
@@ -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',

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