Loading Makefile +3 −1 Original line number Diff line number Diff line Loading @@ -32,10 +32,12 @@ install-user: build-ui uninstall: pip uninstall $(PROJNAME) test: runtest test: runtest integrationtest runtest: @PYTHONPATH=. $(PYTHON) -m pytest ./test integrationtest: @PYTHONPATH=. ./test/run_integration_tests.sh pylint: Loading pysen/echo/flippers.py +27 −35 Original line number Diff line number Diff line Loading @@ -25,12 +25,12 @@ def current_sheet(turns_density): class BaseFlipper: "Base flipper class" def __init__(self, name, position=0, thickness=0.01, turns_density=1): def __init__(self, name, **kwargs): "the constructor" self.name = name self.position = position # distance from the source self.thickness = thickness # self.turns_density = turns_density self.position = kwargs.pop('position', 0) self.thickness = kwargs.pop('thickness', 0.01) self.turns_density = kwargs.pop('turns_density', 1) def __str__(self): "the flipper" Loading Loading @@ -96,51 +96,43 @@ class FlipperPi2(BaseFlipper): omega_z = np.asarray([opt.newton(rxx13,PI/2,args=(x,)) for x in omega_x]) return omega_z/omega_x def make_flipper(name, params=None): def __make_flipper(name, params=None): """Make a flipper from a config dictionary""" if not params: params = NSE_FLIPPERS.get(name, {}) if not params: raise ValueError(f"unknown flipper name '{name}', choose from {list(NSE_FLIPPERS.keys())}") # make a copy, so that we can "remove" type params = params.copy() ftype = params.pop('type', 'unknown') ftype = params.get('type', 'unknown') if ftype == 'pi': return FlipperPi(name=name, **params) if ftype == 'pi/2': 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. def make_flipper(name, params=None): """make a flipper from a name or a file name - flipper definition file or flipper name in NSE_FLIPPERS params - flipper parameters (overrides the file or NSE_FLIPPERS definition) Returns: dict: A dictionary containing the flipper parameters, or None if an error occurs. returns a flipper object """ if params is not None: return __make_flipper(name, params=params) 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: with open(name, '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 params = json.load(file) name = params.pop('name', 'unknown') return __make_flipper(name, params=params) except json.JSONDecodeError: print(f"Error: Could not decode JSON from the file '{filename}'. Check the file format.") print(f"Error: Could not decode JSON from the file '{name}'. Check the file format.") return None except FileNotFoundError: pass params = NSE_FLIPPERS.get(name, {}) if not params: raise ValueError(f"unknown flipper name '{name}', choose from {list(NSE_FLIPPERS.keys())}") return __make_flipper(name, params=params) def tof_curve(flipper, lmax, dlam, points, sample_to_source, **kwargs): """ Loading pysen/plot/fliplotlib.py +9 −12 Original line number Diff line number Diff line Loading @@ -5,12 +5,13 @@ import logging import numpy as np import matplotlib.pyplot as plt from ..constants import GAUSS #from ..constants import GAUSS from ..config import L2, Ltot, HMN, ANGSTROM from ..echo.flippers import make_flipper, make_flipper_from_file, tof_curve from ..echo.flippers import make_flipper, tof_curve def plot_flipper_curve(axs, name='fpi', **kwargs): "test with plots" print(f"{name=}, {kwargs=}") pos = kwargs.pop('pos', 'p2') freq = kwargs.pop('freq', 60.0) points = kwargs.pop('points', 163) Loading @@ -19,16 +20,14 @@ def plot_flipper_curve(axs, name='fpi', **kwargs): compare = kwargs.pop('compare', None) scale = kwargs.pop('scale', 1.0) 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 b_x = kwargs.pop('bfield_x', 0.0) # horizontal external field in Tesla b_z = kwargs.pop('bfield_z', 0.0) # vertical external field in Tesla fname = kwargs.pop('file', None) # flipper definition file log = logging.getLogger() L = Ltot.get(pos) # [m] source to detector L1 = L - L2 # [m] source to sample #B_ext = [ 1.000692*GAUSS, 0, -0.039814*GAUSS ] # ext. field B_ext = np.asarray([ b_x, 0.0, b_z])*GAUSS # ext. field B_ext = np.asarray([ b_x, 0.0, b_z]) # ext. field # compare_data = None if compare is not None: Loading @@ -37,13 +36,11 @@ def plot_flipper_curve(axs, name='fpi', **kwargs): except FileNotFoundError as err: log.error("cannot load compare file (%s)",err) compare_data = None if fname: flipper = make_flipper_from_file(fname) name = flipper.name flipper = make_flipper(fname) else: flipper = make_flipper(name) title = rf'{name} $\lambda_{{max}}$={lmax:g}$\AA$' title = rf'{flipper.name} $\lambda_{{max}}$={lmax:g}$\AA$' delam = HMN/(freq*L) # wavelengtgh band lmax = lmax*ANGSTROM Loading pysen/ui/nseplot.py +11 −4 Original line number Diff line number Diff line Loading @@ -383,10 +383,11 @@ def add_flipper_options(subparser, parents=None): "make phase table" 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', fname=None, description='create flipper curves either from a json file or from a named flipper (--name)') pars.set_defaults(file=[], name='fpi', freq=DEFAULT_ACCELERATOR_FREQ, pos='p2', points=163, shift=0, lmax=8.0, scale=1.0, compare=None) points=163, shift=0, lmax=8.0, scale=1.0, bfield_x=0.0, bfield_z=0.0, compare=None) flp = pars.add_mutually_exclusive_group() flp.add_argument('--name', '-n', dest='name', choices=NSE_FLIPPERS.keys(), help='flipper name (default %(default)s)') Loading @@ -400,6 +401,12 @@ def add_flipper_options(subparser, parents=None): help='instrument position to determine wavelength band (default %(default)s)') pars.add_argument('--shift', dest='shift', type=float, metavar='off', help='shift (offset) the curve by a number of points (default %(default)s)') pars.add_argument('--points', dest='points', type=int, metavar='N', help='number of points to calculate (default %(default)s)') pars.add_argument('--bfield-x', dest='bfield_x', type=float, metavar='bx', help='external field in beam (x) direction (default %(default)s)') pars.add_argument('--bfield-z', dest='bfield_z', type=float, metavar='bz', help='external field in the vertical (z) direction (default %(default)s)') pars.add_argument('--scale', dest='scale', type=float, metavar='sc', help='current scale factor (default %(default)s)') pars.add_argument('--compare', '-c', dest='compare', metavar='file', Loading test/run_integration_tests.sh +2 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ python ./pysen/ui/nseplot.py bfield ./test/data/NSE_15617.nxs.h5 -S b python ./pysen/ui/nseplot.py qtau ./test/data/qtau_inp.py -S qtau_default.png # phase_table (pt) phase table python ./pysen/ui/nseplot.py flipper -S flipper_default.png python ./pysen/ui/nseplot.py flipper fpi21 -S flipper_fpi21.png python ./pysen/ui/nseplot.py flipper ./test/data/flipper.json -S flipper_file.png # old_xyz xyz plot (.dat or .h5 files) # gui nseplot gui Loading
Makefile +3 −1 Original line number Diff line number Diff line Loading @@ -32,10 +32,12 @@ install-user: build-ui uninstall: pip uninstall $(PROJNAME) test: runtest test: runtest integrationtest runtest: @PYTHONPATH=. $(PYTHON) -m pytest ./test integrationtest: @PYTHONPATH=. ./test/run_integration_tests.sh pylint: Loading
pysen/echo/flippers.py +27 −35 Original line number Diff line number Diff line Loading @@ -25,12 +25,12 @@ def current_sheet(turns_density): class BaseFlipper: "Base flipper class" def __init__(self, name, position=0, thickness=0.01, turns_density=1): def __init__(self, name, **kwargs): "the constructor" self.name = name self.position = position # distance from the source self.thickness = thickness # self.turns_density = turns_density self.position = kwargs.pop('position', 0) self.thickness = kwargs.pop('thickness', 0.01) self.turns_density = kwargs.pop('turns_density', 1) def __str__(self): "the flipper" Loading Loading @@ -96,51 +96,43 @@ class FlipperPi2(BaseFlipper): omega_z = np.asarray([opt.newton(rxx13,PI/2,args=(x,)) for x in omega_x]) return omega_z/omega_x def make_flipper(name, params=None): def __make_flipper(name, params=None): """Make a flipper from a config dictionary""" if not params: params = NSE_FLIPPERS.get(name, {}) if not params: raise ValueError(f"unknown flipper name '{name}', choose from {list(NSE_FLIPPERS.keys())}") # make a copy, so that we can "remove" type params = params.copy() ftype = params.pop('type', 'unknown') ftype = params.get('type', 'unknown') if ftype == 'pi': return FlipperPi(name=name, **params) if ftype == 'pi/2': 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. def make_flipper(name, params=None): """make a flipper from a name or a file name - flipper definition file or flipper name in NSE_FLIPPERS params - flipper parameters (overrides the file or NSE_FLIPPERS definition) Returns: dict: A dictionary containing the flipper parameters, or None if an error occurs. returns a flipper object """ if params is not None: return __make_flipper(name, params=params) 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: with open(name, '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 params = json.load(file) name = params.pop('name', 'unknown') return __make_flipper(name, params=params) except json.JSONDecodeError: print(f"Error: Could not decode JSON from the file '{filename}'. Check the file format.") print(f"Error: Could not decode JSON from the file '{name}'. Check the file format.") return None except FileNotFoundError: pass params = NSE_FLIPPERS.get(name, {}) if not params: raise ValueError(f"unknown flipper name '{name}', choose from {list(NSE_FLIPPERS.keys())}") return __make_flipper(name, params=params) def tof_curve(flipper, lmax, dlam, points, sample_to_source, **kwargs): """ Loading
pysen/plot/fliplotlib.py +9 −12 Original line number Diff line number Diff line Loading @@ -5,12 +5,13 @@ import logging import numpy as np import matplotlib.pyplot as plt from ..constants import GAUSS #from ..constants import GAUSS from ..config import L2, Ltot, HMN, ANGSTROM from ..echo.flippers import make_flipper, make_flipper_from_file, tof_curve from ..echo.flippers import make_flipper, tof_curve def plot_flipper_curve(axs, name='fpi', **kwargs): "test with plots" print(f"{name=}, {kwargs=}") pos = kwargs.pop('pos', 'p2') freq = kwargs.pop('freq', 60.0) points = kwargs.pop('points', 163) Loading @@ -19,16 +20,14 @@ def plot_flipper_curve(axs, name='fpi', **kwargs): compare = kwargs.pop('compare', None) scale = kwargs.pop('scale', 1.0) 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 b_x = kwargs.pop('bfield_x', 0.0) # horizontal external field in Tesla b_z = kwargs.pop('bfield_z', 0.0) # vertical external field in Tesla fname = kwargs.pop('file', None) # flipper definition file log = logging.getLogger() L = Ltot.get(pos) # [m] source to detector L1 = L - L2 # [m] source to sample #B_ext = [ 1.000692*GAUSS, 0, -0.039814*GAUSS ] # ext. field B_ext = np.asarray([ b_x, 0.0, b_z])*GAUSS # ext. field B_ext = np.asarray([ b_x, 0.0, b_z]) # ext. field # compare_data = None if compare is not None: Loading @@ -37,13 +36,11 @@ def plot_flipper_curve(axs, name='fpi', **kwargs): except FileNotFoundError as err: log.error("cannot load compare file (%s)",err) compare_data = None if fname: flipper = make_flipper_from_file(fname) name = flipper.name flipper = make_flipper(fname) else: flipper = make_flipper(name) title = rf'{name} $\lambda_{{max}}$={lmax:g}$\AA$' title = rf'{flipper.name} $\lambda_{{max}}$={lmax:g}$\AA$' delam = HMN/(freq*L) # wavelengtgh band lmax = lmax*ANGSTROM Loading
pysen/ui/nseplot.py +11 −4 Original line number Diff line number Diff line Loading @@ -383,10 +383,11 @@ def add_flipper_options(subparser, parents=None): "make phase table" 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', fname=None, description='create flipper curves either from a json file or from a named flipper (--name)') pars.set_defaults(file=[], name='fpi', freq=DEFAULT_ACCELERATOR_FREQ, pos='p2', points=163, shift=0, lmax=8.0, scale=1.0, compare=None) points=163, shift=0, lmax=8.0, scale=1.0, bfield_x=0.0, bfield_z=0.0, compare=None) flp = pars.add_mutually_exclusive_group() flp.add_argument('--name', '-n', dest='name', choices=NSE_FLIPPERS.keys(), help='flipper name (default %(default)s)') Loading @@ -400,6 +401,12 @@ def add_flipper_options(subparser, parents=None): help='instrument position to determine wavelength band (default %(default)s)') pars.add_argument('--shift', dest='shift', type=float, metavar='off', help='shift (offset) the curve by a number of points (default %(default)s)') pars.add_argument('--points', dest='points', type=int, metavar='N', help='number of points to calculate (default %(default)s)') pars.add_argument('--bfield-x', dest='bfield_x', type=float, metavar='bx', help='external field in beam (x) direction (default %(default)s)') pars.add_argument('--bfield-z', dest='bfield_z', type=float, metavar='bz', help='external field in the vertical (z) direction (default %(default)s)') pars.add_argument('--scale', dest='scale', type=float, metavar='sc', help='current scale factor (default %(default)s)') pars.add_argument('--compare', '-c', dest='compare', metavar='file', Loading
test/run_integration_tests.sh +2 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ python ./pysen/ui/nseplot.py bfield ./test/data/NSE_15617.nxs.h5 -S b python ./pysen/ui/nseplot.py qtau ./test/data/qtau_inp.py -S qtau_default.png # phase_table (pt) phase table python ./pysen/ui/nseplot.py flipper -S flipper_default.png python ./pysen/ui/nseplot.py flipper fpi21 -S flipper_fpi21.png python ./pysen/ui/nseplot.py flipper ./test/data/flipper.json -S flipper_file.png # old_xyz xyz plot (.dat or .h5 files) # gui nseplot gui