Skip to content

Commit d521958

Browse files
committed
DeformableMirror: require n_actuators instead of _n_actuators.
Replaces the documented requirement for concrete implementations to have a `_n_actuators` property and instead make the `n_actuators` an abstract property. This is better because: 1) it is enforced by abc instead of being just documented 2) one less property required. For example, mirao is always 52 and is defined on the library, and for bmc it is a field of the DM struct. 3) mypy does not like the use of the private property by the ABC which is not declared on the ABC.
1 parent 90aa4cd commit d521958

File tree

6 files changed

+23
-16
lines changed

6 files changed

+23
-16
lines changed

NEWS

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ Version 0.4.0 (upcoming)
1717
* The `Device._logger` attribute has been removed. It is
1818
recommended to use a logger for the module.
1919

20+
* DeformableMirror:
21+
22+
* Concrete classes must implement the `n_actuators` public
23+
property instead of the private _n_actuators`.
24+
2025
* The device server and clients no longer force pickle protocol
2126
version 2. If the client and server are running different Python
2227
versions it may be necessary to specify a version number. This

microscope/devices.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -941,23 +941,19 @@ class DeformableMirror(Device, metaclass=abc.ABCMeta):
941941
def __init__(self, **kwargs) -> None:
942942
"""Constructor.
943943
944-
Subclasses must define the following properties during
945-
construction:
946-
947-
_n_actuators : int
948-
949-
In addition, the private properties `_patterns` and
950-
`_pattern_idx` are initialized to None to support the queueing
951-
of patterns and software triggering.
944+
The private properties `_patterns` and `_pattern_idx` are
945+
initialized to `None` to support the queueing of patterns and
946+
software triggering.
952947
"""
953948
super().__init__(**kwargs)
954949

955950
self._patterns = None # type: typing.Optional[numpy.ndarray]
956951
self._pattern_idx = -1 # type: int
957952

958953
@property
954+
@abc.abstractmethod
959955
def n_actuators(self) -> int:
960-
return self._n_actuators
956+
raise NotImplementedError()
961957

962958
def _validate_patterns(self, patterns: numpy.ndarray) -> None:
963959
"""Validate the shape of a series of patterns.
@@ -971,10 +967,10 @@ def _validate_patterns(self, patterns: numpy.ndarray) -> None:
971967
if patterns.ndim > 2:
972968
raise Exception("PATTERNS has %d dimensions (must be 1 or 2)"
973969
% patterns.ndim)
974-
elif patterns.shape[-1] != self._n_actuators:
970+
elif patterns.shape[-1] != self.n_actuators:
975971
raise Exception(("PATTERNS length of second dimension '%d' differs"
976972
" differs from number of actuators '%d'"
977-
% (patterns.shape[-1], self._n_actuators)))
973+
% (patterns.shape[-1], self.n_actuators)))
978974

979975
@abc.abstractmethod
980976
def apply_pattern(self, pattern: numpy.ndarray) -> None:

microscope/mirror/alpao.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ def __init__(self, serial_number, **kwargs):
124124
self._trigger_type = TriggerType.SOFTWARE
125125
self._trigger_mode = TriggerMode.ONCE
126126

127+
@property
128+
def n_actuators(self) -> int:
129+
return self._n_actuators
130+
127131
def apply_pattern(self, pattern):
128132
self._validate_patterns(pattern)
129133
pattern = self._normalize_patterns(pattern)

microscope/mirror/bmc.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ def __init__(self, serial_number, **kwargs):
4242
if status:
4343
raise Exception(BMC.ErrorString(status))
4444

45-
self._n_actuators = self._dm.ActCount
45+
@property
46+
def n_actuators(self) -> int:
47+
return self._dm.ActCount
4648

4749
def apply_pattern(self, pattern):
4850
self._validate_patterns(pattern)

microscope/mirror/mirao52e.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,6 @@ def __init__(self, **kwargs) -> None:
5858
if not mro.open(self._status):
5959
self._raise_status(mro.open)
6060

61-
## super class needs this, but maybe it should be calling the
62-
## property directly?
63-
self._n_actuators = mro.NB_COMMAND_VALUES # type: int
64-
6561
@property
6662
def n_actuators(self) -> int:
6763
return mro.NB_COMMAND_VALUES

microscope/testsuite/devices.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,10 @@ def __init__(self, n_actuators, **kwargs):
376376
super().__init__(**kwargs)
377377
self._n_actuators = n_actuators
378378

379+
@property
380+
def n_actuators(self) -> int:
381+
return self._n_actuators
382+
379383
def apply_pattern(self, pattern):
380384
self._validate_patterns(pattern)
381385
self._current_pattern = pattern

0 commit comments

Comments
 (0)