Skip to content

Commit 2fbbcd2

Browse files
authored
Merge pull request #173 from ISISComputingGroup/redefine_refl_param_optional
allow redefine to be optional for refl param
2 parents 84d8e76 + 44393a6 commit 2fbbcd2

File tree

4 files changed

+27
-5
lines changed

4 files changed

+27
-5
lines changed

doc/plan_stubs/redefining.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def my_plan():
3131
## `redefine_refl_parameter`
3232

3333
The {py:obj}`ibex_bluesky_core.plan_stubs.redefine_refl_parameter` plan stub can be used to redefine the current
34-
position of a {py:obj}`ibex_bluesky_core.devices.reflectometry.ReflParameter` to a new value.
34+
position of a {py:obj}`ibex_bluesky_core.devices.reflectometry.ReflParameter` to a new value. Note that some reflectometry parameters ie. `Theta` cannot be redefined, so these must be constructed with `has_redefine=False`. This plan stub will handle this case and raise an error if a user tries to redefine it.
3535

3636
This plan stub has an identical API to that of the {py:obj}`ibex_bluesky_core.plan_stubs.redefine_motor` plan stub
3737
described above, but operates on a reflectometry parameter rather than a motor.

src/ibex_bluesky_core/devices/reflectometry/__init__.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import asyncio
44
import logging
55

6+
from bluesky.protocols import NamedMovable
67
from ophyd_async.core import (
78
AsyncStatus,
89
SignalR,
@@ -18,16 +19,19 @@
1819
logger = logging.getLogger(__name__)
1920

2021

21-
class ReflParameter(StandardReadable):
22+
class ReflParameter(StandardReadable, NamedMovable[float]):
2223
"""Utility device for a reflectometry server parameter."""
2324

24-
def __init__(self, prefix: str, name: str, changing_timeout_s: float) -> None:
25+
def __init__(
26+
self, prefix: str, name: str, changing_timeout_s: float, *, has_redefine: bool = True
27+
) -> None:
2528
"""Reflectometry server parameter.
2629
2730
Args:
2831
prefix: the PV prefix.
2932
name: the name of the parameter.
3033
changing_timeout_s: seconds to wait for the CHANGING signal to go to False after a set.
34+
has_redefine: whether this parameter can be redefined.
3135
3236
"""
3337
with self.add_children_as_readables(StandardReadableFormat.HINTED_SIGNAL):
@@ -36,7 +40,10 @@ def __init__(self, prefix: str, name: str, changing_timeout_s: float) -> None:
3640
self.changing: SignalR[bool] = epics_signal_r(
3741
bool, f"{prefix}REFL_01:PARAM:{name}:CHANGING"
3842
)
39-
self.redefine = ReflParameterRedefine(prefix=f"{prefix}REFL_01:PARAM:{name}:", name="")
43+
if has_redefine:
44+
self.redefine = ReflParameterRedefine(prefix=f"{prefix}REFL_01:PARAM:{name}:", name="")
45+
else:
46+
self.redefine = None
4047
self.changing_timeout = changing_timeout_s
4148
super().__init__(name=name)
4249
self.readback.set_name(name)

src/ibex_bluesky_core/plan_stubs/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ def redefine_refl_parameter(
120120
position: The position to set.
121121
122122
"""
123+
if parameter.redefine is None:
124+
raise ValueError(f"Parameter {parameter.name} cannot be redefined.")
123125
logger.info("Redefining refl parameter %s to %s", parameter.name, position)
124126
yield from bps.mv(parameter.redefine, position)
125127

tests/test_plan_stubs.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,20 @@ async def test_redefine_refl_parameter(RE):
155155

156156
RE(redefine_refl_parameter(param, 42.0))
157157

158-
get_mock_put(param.redefine.define_pos_sp).assert_called_once_with(42.0, wait=True)
158+
get_mock_put(param.redefine.define_pos_sp).assert_called_once_with(42.0, wait=True) # pyright: ignore [reportOptionalMemberAccess]
159+
160+
161+
async def test_raises_when_attempting_to_redefine_refl_parameter_with_no_redefine(RE):
162+
param = ReflParameter(
163+
prefix="", name="some_refl_parameter_no_redefine", changing_timeout_s=1, has_redefine=False
164+
)
165+
await param.connect(mock=True)
166+
with pytest.raises(
167+
ValueError,
168+
match=r"Parameter some_refl_parameter_no_redefine"
169+
r" cannot be redefined.",
170+
):
171+
RE(redefine_refl_parameter(param, 42.0))
159172

160173

161174
def test_get_user_input(RE):

0 commit comments

Comments
 (0)