From f6fe055aa67a0d35dd9e703913e3edc449c8cc75 Mon Sep 17 00:00:00 2001 From: Roy Smart Date: Mon, 16 Oct 2023 14:19:51 -0600 Subject: [PATCH] Added `optika.metrology.SlopeErrorParameters` class. --- optika/metrology/__init__.py | 1 + optika/metrology/_slope_error.py | 38 +++++++++++++++++++++ optika/metrology/_tests/__init__.py | 0 optika/metrology/_tests/test_slope_error.py | 31 +++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 optika/metrology/__init__.py create mode 100644 optika/metrology/_slope_error.py create mode 100644 optika/metrology/_tests/__init__.py create mode 100644 optika/metrology/_tests/test_slope_error.py diff --git a/optika/metrology/__init__.py b/optika/metrology/__init__.py new file mode 100644 index 0000000..ea92359 --- /dev/null +++ b/optika/metrology/__init__.py @@ -0,0 +1 @@ +from ._slope_error import * diff --git a/optika/metrology/_slope_error.py b/optika/metrology/_slope_error.py new file mode 100644 index 0000000..936ea20 --- /dev/null +++ b/optika/metrology/_slope_error.py @@ -0,0 +1,38 @@ +import abc +import dataclasses +import astropy.units as u +import named_arrays as na +import optika.mixins + +__all__ = [ + "AbstractSlopeErrorParameters", + "SlopeErrorParameters", +] + + +@dataclasses.dataclass(eq=False, repr=False) +class AbstractSlopeErrorParameters( + optika.mixins.Printable, +): + """collection of parameters used to compute the slope error""" + + @property + @abc.abstractmethod + def kernel_size(self) -> na.ScalarLike: + """ + size of the boxcar kernel that is convolved with the wavefront error + before measuring the slope + """ + + @property + @abc.abstractmethod + def step_size(self) -> na.ScalarLike: + """the horizontal distance to use when measuring the slope""" + + +@dataclasses.dataclass(eq=False, repr=False) +class SlopeErrorParameters( + AbstractSlopeErrorParameters, +): + kernel_size: na.ScalarLike = 0 * u.mm + step_size: na.ScalarLike = 0 * u.mm diff --git a/optika/metrology/_tests/__init__.py b/optika/metrology/_tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/optika/metrology/_tests/test_slope_error.py b/optika/metrology/_tests/test_slope_error.py new file mode 100644 index 0000000..1aeb845 --- /dev/null +++ b/optika/metrology/_tests/test_slope_error.py @@ -0,0 +1,31 @@ +import pytest +import abc +import numpy as np +import astropy.units as u +import named_arrays as na +import optika + + +class AbstractTestAbstractSlopeErrorParameters(abc.ABC): + def test_kernel_size(self, a: optika.metrology.AbstractSlopeErrorParameters): + assert np.issubdtype(na.get_dtype(a.kernel_size), float) + assert na.unit_normalized(a.kernel_size).is_equivalent(u.mm) + + def test_step_size(self, a: optika.metrology.AbstractSlopeErrorParameters): + assert np.issubdtype(na.get_dtype(a.step_size), float) + assert na.unit_normalized(a.step_size).is_equivalent(u.mm) + + +@pytest.mark.parametrize( + argnames="a", + argvalues=[ + optika.metrology.SlopeErrorParameters( + kernel_size=2 * u.mm, + step_size=4 * u.mm, + ) + ], +) +class TestSlopeErrorParameters( + AbstractTestAbstractSlopeErrorParameters, +): + pass