Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bimorph mirrors #992

Open
wants to merge 128 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 113 commits
Commits
Show all changes
128 commits
Select commit Hold shift + click to select a range
8728995
Create bimorph_mirrors dir with __init__.py
dan-fernandes Nov 27, 2024
ec85bd8
Create bimorph_mirror.py with basic class structure
dan-fernandes Nov 27, 2024
62f5488
Add VOUT_RBV channel creation to __init__
dan-fernandes Nov 27, 2024
6bd8b07
Move bimorph_mirror.py out of bimorph_mirrors directory
dan-fernandes Nov 28, 2024
70a75f5
Create BimorphMirrorChannel with vout_rbv SignalR
dan-fernandes Nov 28, 2024
4a129a2
Change BimorphMirrorChannel child creation to procedural
dan-fernandes Nov 28, 2024
82ec406
Replace BimorphMirror child decleration to use BimorphMirrorChannel
dan-fernandes Nov 28, 2024
9bb6e50
Remove unused imports
dan-fernandes Nov 28, 2024
c6ab0dd
Remove unused import
dan-fernandes Nov 28, 2024
b615c94
Remove uneccesary Format in add_children_as_readables
dan-fernandes Nov 28, 2024
3f265bf
Add super().__init__ call
dan-fernandes Nov 28, 2024
24cf9d9
Add VTRGT_RBV, STATUS to BimorphMirrorChannel
dan-fernandes Nov 28, 2024
5b10523
Add BimorphMirror.set method
dan-fernandes Nov 28, 2024
fcec361
Add bimorph test file
dan-fernandes Nov 28, 2024
e7e8021
Fix STATUS type
dan-fernandes Nov 28, 2024
3944b78
Make BimorphMirror.set await values in VOUT_RBV
dan-fernandes Nov 28, 2024
3139761
Add assertion that channel exists to BimorphMirror.set
dan-fernandes Nov 29, 2024
503aa0a
Replace .get with square brackets in BimorphMirror.set to avoid typin…
dan-fernandes Nov 29, 2024
a4fd4d3
Add BimorphMirrorChannel.shift
dan-fernandes Nov 29, 2024
bebf974
Add BimorphMirror.all_shift, .add_volt
dan-fernandes Nov 29, 2024
81870c6
Add BimorphMirror.channels, .status, .temps
dan-fernandes Nov 29, 2024
5bdaf89
Rename previous BimorphMirror.channels to BimorphMirror.channel_list …
dan-fernandes Nov 29, 2024
8c17c91
Add BimorphMirror.reset_err_proc, .err
dan-fernandes Nov 29, 2024
b6df119
Add BimorphOnOff Strict Enum
dan-fernandes Nov 29, 2024
1823217
Add BimorphMirror.on_off
dan-fernandes Nov 29, 2024
a216906
Add BimorphMirrorMode StrictEnum
dan-fernandes Nov 29, 2024
e9916c2
Add BimorphMirror.op_mode
dan-fernandes Nov 29, 2024
5867146
Change BimorphMirror.on_off datatype to BimorphMirrorOnOff rather th…
dan-fernandes Nov 29, 2024
916d909
Add docstrings
dan-fernandes Nov 29, 2024
ea19f02
Remove uneccesary signals from BimorphMirror
dan-fernandes Nov 29, 2024
0794a9b
Add missing attribute to docstring
dan-fernandes Nov 29, 2024
c2cbf88
Remove duplicate signal decleration
dan-fernandes Nov 29, 2024
90a842c
Remove uneccesary BimorphMirror signal
dan-fernandes Nov 29, 2024
bd405eb
Change BimorphMirrorChannel.status to datatype BimorphMirrorOnOff
dan-fernandes Nov 29, 2024
20e9768
Add BimorphMirrorStatus, set as BimorphMirror.status datatype
dan-fernandes Nov 29, 2024
0f9a081
Change BimorphMirror.channels datatype to str
dan-fernandes Nov 29, 2024
3ff0a06
Change BimorphMirrorChannel to declare all signals declaratively
dan-fernandes Nov 29, 2024
5b7325b
Remove uneccesary argument
dan-fernandes Nov 29, 2024
664d636
Move all PV delimiters from suffix into prefix
dan-fernandes Nov 29, 2024
a2327a5
Fix incorrect use of PVSuffix
dan-fernandes Nov 29, 2024
521963f
Make BimorphMirrorChannel inherit from EpicsDevice
dan-fernandes Nov 29, 2024
7199a8c
Remove :CHANNELS signal from BimorphMirror
dan-fernandes Nov 29, 2024
051f23e
Rename BimorphMirror.channel_list to .channels
dan-fernandes Nov 29, 2024
2dc2bab
Remove unused import
dan-fernandes Nov 29, 2024
f827c05
Replace BimorphMirror.set wait on rbv with wait=True
dan-fernandes Nov 29, 2024
3af9f88
Add bimorph test_set_channels
dan-fernandes Nov 29, 2024
bd86838
Organise imports
dan-fernandes Nov 29, 2024
5a7cfa8
Make wait_for_value in BimorphMirror.set use DEFAULT_TIMEOUT instead …
dan-fernandes Nov 29, 2024
d0156c0
Rename test_set_channels, fix said test, and add test_set_channels_tr…
dan-fernandes Nov 29, 2024
dcb0b7e
Remove whitespace
dan-fernandes Nov 29, 2024
507139c
Remove unused import
dan-fernandes Nov 29, 2024
aff1a58
Add comments
dan-fernandes Nov 29, 2024
6b83f14
Parametrize test_set_channels_wait_for_readback
dan-fernandes Dec 2, 2024
6774344
Abstract setting vout mock values into fixture
dan-fernandes Dec 2, 2024
0b13698
Parametrize test_set_channels_wait_for_readback
dan-fernandes Dec 2, 2024
550f406
Add whitespace
dan-fernandes Dec 2, 2024
27f72fb
Renam set_vout_mock_values to set_vout_mock_and_return_value
dan-fernandes Dec 2, 2024
81e0ddb
Add test_set_channels_waits_for_vout_readback unimplemented
dan-fernandes Dec 2, 2024
5ffad56
Add test_read, and BIMORPH_NAME global variable
dan-fernandes Dec 2, 2024
31c6bec
Make mirror fixture take number_of_channels argument
dan-fernandes Dec 4, 2024
b7cf4bd
Correct BimorphMirrorChannel Format signal types
dan-fernandes Dec 4, 2024
6f83b30
Add valid_bimorph_values fixture
dan-fernandes Dec 4, 2024
0de2413
Change test parametrization from bimorph input to number of channels
dan-fernandes Dec 4, 2024
35f253b
Add format changes generated by tox pre-commit
dan-fernandes Dec 5, 2024
5dae56f
Change explcit channel number parameter to reference to global list o…
dan-fernandes Dec 4, 2024
e3e5a31
Implement test_set_channels_waits_for_vout_readback
dan-fernandes Dec 4, 2024
e9c578e
Add test_set_invalid_chanel_throws_error
dan-fernandes Dec 4, 2024
ffce233
Add Raises section to BimorphMirror.set docstring
dan-fernandes Dec 4, 2024
61a39af
Make BiorphMirror.__init__ number_of_channels have no default value
dan-fernandes Dec 9, 2024
6ea4522
Replace all asserts inside for loops, to comprehension and comparison
dan-fernandes Dec 9, 2024
b8d81ee
Remove BIMORPH_NAME global variable
dan-fernandes Dec 9, 2024
e015ba5
Remove prng from test input generation
dan-fernandes Dec 9, 2024
09185f0
Add BimorphMirror.__init__ number_of_channels validation
dan-fernandes Dec 9, 2024
cfe357d
Add test_init_mirror_with_invalid_channels_throws_error
dan-fernandes Dec 9, 2024
bdd93d5
Add BimorphMirror.__init__ docstring
dan-fernandes Dec 9, 2024
aba2bc1
Replace assertion in BimorphMirror.set arg validation with raise Valu…
dan-fernandes Dec 9, 2024
db20860
Make test_set_invalid_channel_throws_error expect correct error type
dan-fernandes Dec 9, 2024
b4ca49d
Replace real PV prefix with fake
dan-fernandes Dec 9, 2024
d028438
Add mock_vtrgt_vout_propogation, remove set_vout_mock fixtures
dan-fernandes Dec 10, 2024
318fcd6
Remove unused import
dan-fernandes Dec 10, 2024
0bb79d8
Merge branch 'main' into bimorph-mirrors
dan-fernandes Dec 10, 2024
448eb19
Fix import for ophyd async 0.9.0a1
dan-fernandes Dec 10, 2024
7272218
Update src/dodal/devices/bimorph_mirror.py
dan-fernandes Dec 11, 2024
3237790
Update src/dodal/devices/bimorph_mirror.py
dan-fernandes Dec 11, 2024
7953ceb
Update src/dodal/devices/bimorph_mirror.py
dan-fernandes Dec 11, 2024
d06a8ab
Remove BimorphMirror.number_of_channels
dan-fernandes Dec 11, 2024
db19e2a
Rename BimorphMirror.alltrgt_proc, .on_off for readability
dan-fernandes Dec 11, 2024
095861d
Rename BimorphMirrorChannel.vtrgt, .vout for readbility
dan-fernandes Dec 11, 2024
8ceaad1
Change BimorphMirror.set type hinting
dan-fernandes Dec 11, 2024
86d9cf2
Replace BimorphMirror.set sequential input validation with collection
dan-fernandes Dec 12, 2024
0bfb429
Add test_init_mirror_with_zero_channels
dan-fernandes Dec 12, 2024
bfe6832
Ensure bimorph has finished moving after set
DiamondRC Jan 7, 2025
289a324
Merge branch 'main' into bimorph-mirrors
DiamondRC Jan 7, 2025
5b1beca
wait for value
DiamondRC Jan 7, 2025
b79924d
Update test_bimorph_mirror.py
DiamondRC Jan 7, 2025
18f6438
Crop PV name for BUSY toggle
DiamondRC Jan 7, 2025
d3a80ae
Crop PV name for BUSY toggle
DiamondRC Jan 7, 2025
8f98f54
await IDLE status
DiamondRC Jan 7, 2025
519349e
Update test to account for idling
DiamondRC Jan 8, 2025
b849a67
Make BimorphMirrorChannel Movable, add set method
dan-fernandes Jan 9, 2025
4fe2693
Merge branch 'main' into bimorph-mirrors
dan-fernandes Jan 9, 2025
489c931
Remove unnecessary fixture from test_bimorph_mirror_channel_set
dan-fernandes Jan 9, 2025
ea2e1c8
Make BimorphMirror.set set to target_voltage in serial, and wait chec…
dan-fernandes Jan 16, 2025
502040c
Add wait for BimorphMirrorStatus.IDLE before trigger in BimorphMirror…
dan-fernandes Jan 16, 2025
3b6c62d
Refactor mock_vtrgt_vout_propogation to use callback_on_mock_put
dan-fernandes Jan 16, 2025
792d8e1
Add mock_bimorph_mirror_status_functionality
dan-fernandes Jan 16, 2025
2049ac1
Aggregate mock_vtrgt_vout_propogation, mock_bimorph_mirror_status_fun…
dan-fernandes Jan 16, 2025
62c50f2
Make test_set_channels_waits_for_vout_readback check subset of call_a…
dan-fernandes Jan 16, 2025
08091ab
Add bimorph_functionality fixture to test_set_channels_allows_tolerance
dan-fernandes Jan 16, 2025
fe8bae5
Merge branch 'main' into bimorph-mirrors
dan-fernandes Jan 16, 2025
c81c50c
Remove tolerance in BimorphMirror.set
dan-fernandes Jan 16, 2025
6ceefb6
Merge branch 'main' into bimorph-mirrors
dan-fernandes Jan 16, 2025
eec80b4
Remove unused argument in BimorphMirror.set
dan-fernandes Jan 16, 2025
cfa4185
Add comment to BimorphMirror.set explaining serial set
dan-fernandes Jan 16, 2025
15c7077
Refactor test_bimorph_mirror to use mirror_with_mocked_put fixture
dan-fernandes Jan 16, 2025
2f7ec85
Add typing to mirror_with_mocked_put status function
dan-fernandes Jan 24, 2025
fba60a7
Add type hinting to mirror_with_mocked_put vout_propogation_and_statu…
dan-fernandes Jan 24, 2025
4c6403b
Rename all ..vout.. references to ..output_voltage..
dan-fernandes Jan 24, 2025
597198a
Make BimorphMirror.set use set_and_wait_for_other_value rather than t…
dan-fernandes Jan 24, 2025
bad136f
Rewrite mirror_with_mocked_put to not use default arguments in helper…
dan-fernandes Jan 24, 2025
3e05c45
Renamed functions in mirror_with_mocked_put fixture for readability
dan-fernandes Jan 27, 2025
f0e4877
Set DEFAULT_TIMEOUT to 60
dan-fernandes Jan 28, 2025
dae23a1
Change BimorphMirror.set to write to output_voltage and to not trigge…
dan-fernandes Jan 28, 2025
5aa7c20
Remove BimorphMirror.commit_target_voltages
dan-fernandes Jan 28, 2025
316ff61
Remove test_set_channels_triggers_alltrgt_proc
dan-fernandes Jan 28, 2025
e8e36c3
Change test_set_channels_waits_for_readback to read from output_voltage
dan-fernandes Jan 28, 2025
4b6a65b
Make test_set_one_channel read from output_voltage
dan-fernandes Jan 28, 2025
5d0de0b
Merge branch 'main' into bimorph-mirrors
dan-fernandes Jan 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 13 additions & 15 deletions src/dodal/devices/bimorph_mirror.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ def __init__(self, prefix: str, number_of_channels: int, name=""):
super().__init__(name=name)

@AsyncStatus.wrap
async def set(self, value: Mapping[int, float], tolerance: float = 0.0001) -> None:
async def set(self, value: Mapping[int, float]) -> None:
"""Sets bimorph voltages in parrallel via target voltage and all proc.

Args:
Expand All @@ -118,22 +118,27 @@ async def set(self, value: Mapping[int, float], tolerance: float = 0.0001) -> No
)

# Write target voltages:
await asyncio.gather(
*[
self.channels[i].target_voltage.set(target, wait=True)
for i, target in value.items()
]
)
for i, target in value.items():
dan-fernandes marked this conversation as resolved.
Show resolved Hide resolved
await wait_for_value(
self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT
)
await self.channels[i].target_voltage.set(target, wait=True)
await wait_for_value(
self.status, BimorphMirrorStatus.BUSY, timeout=DEFAULT_TIMEOUT
)
dan-fernandes marked this conversation as resolved.
Show resolved Hide resolved

# Trigger set target voltages:
await wait_for_value(
self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT
)
await self.commit_target_voltages.trigger()

# Wait for values to propogate to voltage out rbv:
await asyncio.gather(
*[
wait_for_value(
self.channels[i].output_voltage,
tolerance_func_builder(tolerance, target),
target,
timeout=DEFAULT_TIMEOUT,
)
for i, target in value.items()
Expand All @@ -142,10 +147,3 @@ async def set(self, value: Mapping[int, float], tolerance: float = 0.0001) -> No
self.status, BimorphMirrorStatus.IDLE, timeout=DEFAULT_TIMEOUT
),
)


def tolerance_func_builder(tolerance: float, target_value: float):
def is_within_value(x):
return abs(x - target_value) <= tolerance

return is_within_value
57 changes: 29 additions & 28 deletions tests/devices/unit_tests/test_bimorph_mirror.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import asyncio
from unittest.mock import ANY, call, patch

import pytest
from bluesky.run_engine import RunEngine
from ophyd_async.core import DeviceCollector
from ophyd_async.testing import get_mock_put
from ophyd_async.core import DeviceCollector, walk_rw_signals
from ophyd_async.testing import callback_on_mock_put, get_mock_put, set_mock_value

from dodal.devices.bimorph_mirror import BimorphMirror, BimorphMirrorStatus

Expand All @@ -29,20 +30,35 @@ def valid_bimorph_values(mirror: BimorphMirror) -> dict[int, float]:


@pytest.fixture
def mock_vtrgt_vout_propogation(mirror: BimorphMirror):
def bimorph_functionality(mirror: BimorphMirror):
dan-fernandes marked this conversation as resolved.
Show resolved Hide resolved
async def busy_idle():
await asyncio.sleep(0)
set_mock_value(mirror.status, BimorphMirrorStatus.BUSY)
await asyncio.sleep(0)
set_mock_value(mirror.status, BimorphMirrorStatus.IDLE)

async def status(*_, **__):
asyncio.create_task(busy_idle())
dan-fernandes marked this conversation as resolved.
Show resolved Hide resolved

for signal in walk_rw_signals(mirror).values():
callback_on_mock_put(signal, status)

for channel in mirror.channels.values():

def effect(value: float, wait=False, signal=channel.output_voltage):
def vout_propogation_and_status(
dan-fernandes marked this conversation as resolved.
Show resolved Hide resolved
value: float, wait=False, signal=channel.output_voltage
):
dan-fernandes marked this conversation as resolved.
Show resolved Hide resolved
signal.set(value, wait=wait)
asyncio.create_task(busy_idle())

get_mock_put(channel.target_voltage).side_effect = effect
callback_on_mock_put(channel.target_voltage, vout_propogation_and_status)


@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True)
async def test_set_channels_waits_for_readback(
mirror: BimorphMirror,
valid_bimorph_values: dict[int, float],
mock_vtrgt_vout_propogation,
bimorph_functionality,
):
await mirror.set(valid_bimorph_values)

Expand All @@ -56,7 +72,7 @@ async def test_set_channels_waits_for_readback(
async def test_set_channels_triggers_alltrgt_proc(
mirror: BimorphMirror,
valid_bimorph_values: dict[int, float],
mock_vtrgt_vout_propogation,
bimorph_functionality,
):
mock_alltrgt_proc = get_mock_put(mirror.commit_target_voltages)

Expand All @@ -71,7 +87,7 @@ async def test_set_channels_triggers_alltrgt_proc(
async def test_set_channels_waits_for_vout_readback(
mirror: BimorphMirror,
valid_bimorph_values: dict[int, float],
mock_vtrgt_vout_propogation,
bimorph_functionality,
):
with patch("dodal.devices.bimorph_mirror.wait_for_value") as mock_wait_for_value:
mock_wait_for_value.assert_not_called()
Expand All @@ -82,29 +98,14 @@ async def test_set_channels_waits_for_vout_readback(
call(mirror.channels[i].output_voltage, ANY, timeout=ANY)
for i, val in valid_bimorph_values.items()
]
expected_call_arg_list.append(
call(mirror.status, BimorphMirrorStatus.IDLE, timeout=ANY)
)
assert expected_call_arg_list == mock_wait_for_value.call_args_list


@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True)
async def test_set_channels_allows_tolerance(
mirror: BimorphMirror,
valid_bimorph_values: dict[int, float],
):
for channel in mirror.channels.values():

def out_by_a_little(value: float, wait=False, signal=channel.output_voltage):
signal.set(value + 0.00001, wait=wait)

get_mock_put(channel.target_voltage).side_effect = out_by_a_little

await mirror.set(valid_bimorph_values)
assert all(
c in mock_wait_for_value.call_args_list for c in expected_call_arg_list
)


@pytest.mark.parametrize("mirror", VALID_BIMORPH_CHANNELS, indirect=True)
async def test_set_one_channel(mirror: BimorphMirror, mock_vtrgt_vout_propogation):
async def test_set_one_channel(mirror: BimorphMirror, bimorph_functionality):
values = {1: 1}

await mirror.set(values)
Expand All @@ -124,7 +125,7 @@ async def test_set_one_channel(mirror: BimorphMirror, mock_vtrgt_vout_propogatio
async def test_read(
mirror: BimorphMirror,
valid_bimorph_values: dict[int, float],
mock_vtrgt_vout_propogation,
bimorph_functionality,
):
await mirror.set(valid_bimorph_values)

Expand Down
Loading