Skip to content
Snippets Groups Projects
Commit 79cf3f72 authored by Cammille Carinan's avatar Cammille Carinan
Browse files

Rename methods, fix and test finite_array

parent d22f5551
No related branches found
No related tags found
No related merge requests found
...@@ -6,7 +6,9 @@ from scipy.optimize import curve_fit ...@@ -6,7 +6,9 @@ from scipy.optimize import curve_fit
def knife_edge(positions, intensities, axisRange=None, p0=None): def knife_edge(positions, intensities, axisRange=None, p0=None):
popt, pcov = knife_edge_base(positions, intensities, popt, pcov = knife_edge_base(positions, intensities,
axisRange=axisRange, p0=p0) axisRange=axisRange, p0=p0)
width, std = popt[1], pcov[1, 1]**0.5 width, std = 0, 0
if popt is not None and pcov is not None:
width, std = popt[1], pcov[1, 1]**0.5
return width, std return width, std
...@@ -36,7 +38,7 @@ def prepare_arrays(positions: np.ndarray, intensities: np.ndarray, ...@@ -36,7 +38,7 @@ def prepare_arrays(positions: np.ndarray, intensities: np.ndarray,
axisRange=None): axisRange=None):
# Slice # Slice
if axisRange is not None: if axisRange is not None:
slice_ = range_slice(positions, *axisRange) slice_ = range_mask(positions, *axisRange)
positions = positions[slice_] positions = positions[slice_]
intensities = intensities[slice_] intensities = intensities[slice_]
...@@ -46,33 +48,28 @@ def prepare_arrays(positions: np.ndarray, intensities: np.ndarray, ...@@ -46,33 +48,28 @@ def prepare_arrays(positions: np.ndarray, intensities: np.ndarray,
intensities = intensities.flatten() intensities = intensities.flatten()
assert positions.shape == intensities.shape assert positions.shape == intensities.shape
# Clean both arrays by only getting finite values and sorting # Clean both arrays by only getting finite values
positions, intensities = finite_arrays(positions, wrt=intensities) positions, intensities = finite_array(positions, wrt=intensities)
intensities, positions = sort_arrays(intensities, wrt=positions) intensities, positions = finite_array(intensities, wrt=positions)
return positions, intensities return positions, intensities
def sort_arrays(array, *, wrt=None): def finite_array(array, *, wrt):
index = np.argsort(wrt)
return array[index], wrt[index]
def finite_arrays(array, *, wrt=None):
index = np.isfinite(wrt) index = np.isfinite(wrt)
return array[index], wrt[index] return array[index], wrt[index]
def range_slice(array, minimum=None, maximum=None): def range_mask(array, minimum=None, maximum=None):
default = np.ones(array.shape, dtype=np.bool) default = np.ones(array.shape, dtype=np.bool)
min_slice, max_slice = default, default min_slice, max_slice = default, default
if minimum is not None: if minimum is not None:
if minimum > array[-1]: if minimum > np.nanmax(array):
raise ValueError('The range minimum is too large.') raise ValueError('The range minimum is too large.')
min_slice = array >= minimum min_slice = array >= minimum
if maximum is not None: if maximum is not None:
if maximum < array[0]: if maximum < np.nanmin(array):
raise ValueError('The range maximum is too small.') raise ValueError('The range maximum is too small.')
max_slice = array <= maximum max_slice = array <= maximum
......
import numpy as np import numpy as np
import pytest import pytest
from ..knife_edge import range_slice from ..knife_edge import prepare_arrays, range_mask
def test_range_slice(): def test_range_mask():
arr = np.array([1, 2, 3, 4, 5]) arr = np.array([1, 2, 3, 4, 5])
# Exact # Exact
slice_ = range_slice(arr, minimum=2, maximum=4) slice_ = range_mask(arr, minimum=2, maximum=4)
np.testing.assert_array_equal(slice_, [False, True, True, True, False]) np.testing.assert_array_equal(slice_, [False, True, True, True, False])
# Range exceeds the closest values # Range exceeds the closest values
slice_ = range_slice(arr, minimum=1.75, maximum=4.25) slice_ = range_mask(arr, minimum=1.75, maximum=4.25)
np.testing.assert_array_equal(slice_, [False, True, True, True, False]) np.testing.assert_array_equal(slice_, [False, True, True, True, False])
# Range misses the closest values # Range misses the closest values
slice_ = range_slice(arr, minimum=2.25, maximum=3.75) slice_ = range_mask(arr, minimum=2.25, maximum=3.75)
np.testing.assert_array_equal(slice_, [False, False, True, False, False]) np.testing.assert_array_equal(slice_, [False, False, True, False, False])
# Equidistant # Equidistant
slice_ = range_slice(arr, minimum=2.5, maximum=4.5) slice_ = range_mask(arr, minimum=2.5, maximum=4.5)
np.testing.assert_array_equal(slice_, [False, False, True, True, False]) np.testing.assert_array_equal(slice_, [False, False, True, True, False])
# Out of bounds, valid minimum # Out of bounds, valid minimum
slice_ = range_slice(arr, minimum=0) slice_ = range_mask(arr, minimum=0)
np.testing.assert_array_equal(slice_, [True, True, True, True, True]) np.testing.assert_array_equal(slice_, [True, True, True, True, True])
# Out of bounds, invalid minimum # Out of bounds, invalid minimum
with pytest.raises(ValueError): with pytest.raises(ValueError):
range_slice(arr, minimum=6) range_mask(arr, minimum=6)
# Out of bounds, valid maximum # Out of bounds, valid maximum
slice_ = range_slice(arr, maximum=6) slice_ = range_mask(arr, maximum=6)
np.testing.assert_array_equal(slice_, [True, True, True, True, True]) np.testing.assert_array_equal(slice_, [True, True, True, True, True])
# Out of bounds, invalid minimum # Out of bounds, invalid minimum
with pytest.raises(ValueError): with pytest.raises(ValueError):
range_slice(arr, maximum=0) range_mask(arr, maximum=0)
# with NaNs # with NaNs
arr = np.array([1, np.nan, 3, np.nan, 5]) arr = np.array([1, np.nan, 3, np.nan, 5])
slice_ = range_slice(arr, minimum=3) slice_ = range_mask(arr, minimum=3)
np.testing.assert_array_equal(slice_, [False, False, True, False, True]) np.testing.assert_array_equal(slice_, [False, False, True, False, True])
def test_prepare_arrays():
# Setup test values
trains, pulses = 5, 10
size = trains * pulses
motor = np.arange(trains)
signal = np.random.randint(100, size=(trains, pulses))
# Test finite motor and signal values
positions, intensities = prepare_arrays(motor, signal)
assert positions.shape == (size,)
assert intensities.shape == (size,)
# Test finite motors and signals with NaNs
signal_nan = with_values(signal, value=np.nan, num=20)
positions, intensities = prepare_arrays(motor, signal_nan)
assert positions.shape == (size-20,)
assert np.isfinite(positions).all()
assert intensities.shape == (size-20,)
assert np.isfinite(intensities).all()
# Test finite signals and motors with NaNs
motor_nan = with_values(motor, value=np.nan, num=3)
positions, intensities = prepare_arrays(motor_nan, signal)
assert positions.shape == ((trains-3) * pulses,)
assert np.isfinite(positions).all()
assert intensities.shape == ((trains-3) * pulses,)
assert np.isfinite(intensities).all()
def with_values(array, value, num=5):
copy = array.astype(np.float)
copy.ravel()[np.random.choice(copy.size, num, replace=False)] = value
return copy
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment