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

Rename core classes #577

Merged
merged 3 commits into from
Oct 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions docs/examples/foo_detector.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from ophyd_async.core import (
AsyncStatus,
DetectorControl,
DetectorController,
DetectorTrigger,
PathProvider,
StandardDetector,
Expand All @@ -19,7 +19,7 @@ def __init__(self, prefix: str, name: str = "") -> None:
super().__init__(prefix, name)


class FooController(DetectorControl):
class FooController(DetectorController):
def __init__(self, driver: FooDriver) -> None:
self._drv = driver

Expand Down
2 changes: 1 addition & 1 deletion docs/explanations/decisions/0007-subpackage-structure.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ There will be a flat public namespace under core, with contents reimported from
- `_signal.py` for `Signal`, `SignalBackend`, `observe_signal`, etc.
- `_mock.py` for `MockSignalBackend`, `get_mock_put`, etc.
- `_readable.py` for `StandardReadable`, `ConfigSignal`, `HintedSignal`, etc.
- `_detector.py` for `StandardDetector`, `DetectorWriter`, `DetectorControl`, `TriggerInfo`, etc.
- `_detector.py` for `StandardDetector`, `DetectorWriter`, `DetectorController`, `TriggerInfo`, etc.
- `_flyer.py` for `StandardFlyer`, `FlyerControl`, etc.

There are some renames that will be required, e.g. `HardwareTriggeredFlyable` -> `StandardFlyer`
Expand Down
10 changes: 5 additions & 5 deletions docs/how-to/make-a-standard-detector.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Make a StandardDetector
The `StandardDetector` is a simple compound device, with 2 standard components:

- `DetectorWriter` to handle data persistence, i/o and pass information about data to the RunEngine (usually an instance of :py:class:`ADHDFWriter`)
- `DetectorControl` with logic for arming and disarming the detector. This will be unique to the StandardDetector implementation.
- `DetectorController` with logic for arming and disarming the detector. This will be unique to the StandardDetector implementation.

Writing an AreaDetector StandardDetector
----------------------------------------
Expand All @@ -28,9 +28,9 @@ Enumeration fields should be named to prevent namespace collision, i.e. for a Si
:language: python
:pyobject: FooDriver

Define a :py:class:`FooController` with handling for converting the standard pattern of :py:meth:`ophyd_async.core.DetectorControl.arm` and :py:meth:`ophyd_async.core.DetectorControl.disarm` to required state of :py:class:`FooDriver` e.g. setting a compatible "FooTriggerSource" for a given `DetectorTrigger`, or raising an exception if incompatible with the `DetectorTrigger`.
Define a :py:class:`FooController` with handling for converting the standard pattern of :py:meth:`ophyd_async.core.DetectorController.arm` and :py:meth:`ophyd_async.core.DetectorController.disarm` to required state of :py:class:`FooDriver` e.g. setting a compatible "FooTriggerSource" for a given `DetectorTrigger`, or raising an exception if incompatible with the `DetectorTrigger`.

The :py:meth:`ophyd_async.core.DetectorControl.get_deadtime` method is used when constructing sequence tables for hardware controlled scanning. Details on how to calculate the deadtime may be only available from technical manuals or otherwise complex. **If it requires fetching from signals, it is recommended to cache the value during the StandardDetector `prepare` method.**
The :py:meth:`ophyd_async.core.DetectorController.get_deadtime` method is used when constructing sequence tables for hardware controlled scanning. Details on how to calculate the deadtime may be only available from technical manuals or otherwise complex. **If it requires fetching from signals, it is recommended to cache the value during the StandardDetector `prepare` method.**

.. literalinclude:: ../examples/foo_detector.py
:pyobject: FooController
Expand All @@ -47,8 +47,8 @@ If the :py:class:`FooDriver` signals that should be read as configuration, they
Writing a non-AreaDetector StandardDetector
-------------------------------------------

A non-AreaDetector `StandardDetector` should implement `DetectorControl` and `DetectorWriter` directly.
Here we construct a `DetectorControl` that co-ordinates signals on a PandA PositionCapture block - a child device "pcap" of the `StandardDetector` implementation, analogous to the :py:class:`FooDriver`.
A non-AreaDetector `StandardDetector` should implement `DetectorController` and `DetectorWriter` directly.
Here we construct a `DetectorController` that co-ordinates signals on a PandA PositionCapture block - a child device "pcap" of the `StandardDetector` implementation, analogous to the :py:class:`FooDriver`.

.. literalinclude:: ../../src/ophyd_async/fastcs/panda/_control.py
:pyobject: PandaPcapController
Expand Down
8 changes: 4 additions & 4 deletions src/ophyd_async/core/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from ._detector import (
DetectorControl,
DetectorController,
DetectorTrigger,
DetectorWriter,
StandardDetector,
Expand All @@ -16,7 +16,7 @@
set_signal_values,
walk_rw_signals,
)
from ._flyer import StandardFlyer, TriggerLogic
from ._flyer import FlyerController, StandardFlyer
from ._hdf_dataset import HDFDataset, HDFFile
from ._log import config_ophyd_async_logging
from ._mock_signal_backend import MockSignalBackend
Expand Down Expand Up @@ -85,7 +85,7 @@
)

__all__ = [
"DetectorControl",
"DetectorController",
"DetectorTrigger",
"DetectorWriter",
"StandardDetector",
Expand All @@ -102,7 +102,7 @@
"set_signal_values",
"walk_rw_signals",
"StandardFlyer",
"TriggerLogic",
"FlyerController",
"HDFDataset",
"HDFFile",
"config_ophyd_async_logging",
Expand Down
6 changes: 3 additions & 3 deletions src/ophyd_async/core/_detector.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def total_number_of_triggers(self) -> int:
)


class DetectorControl(ABC):
class DetectorController(ABC):
"""
Classes implementing this interface should hold the logic for
arming and disarming a detector
Expand Down Expand Up @@ -181,7 +181,7 @@ class StandardDetector(

def __init__(
self,
controller: DetectorControl,
controller: DetectorController,
writer: DetectorWriter,
config_sigs: Sequence[SignalR] = (),
name: str = "",
Expand Down Expand Up @@ -217,7 +217,7 @@ def __init__(
super().__init__(name)

@property
def controller(self) -> DetectorControl:
def controller(self) -> DetectorController:
return self._controller

@property
Expand Down
6 changes: 3 additions & 3 deletions src/ophyd_async/core/_flyer.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from ._utils import T


class TriggerLogic(ABC, Generic[T]):
class FlyerController(ABC, Generic[T]):
@abstractmethod
async def prepare(self, value: T):
"""Move to the start of the flyscan"""
Expand All @@ -35,14 +35,14 @@ class StandardFlyer(
):
def __init__(
self,
trigger_logic: TriggerLogic[T],
trigger_logic: FlyerController[T],
name: str = "",
):
self._trigger_logic = trigger_logic
super().__init__(name=name)

@property
def trigger_logic(self) -> TriggerLogic[T]:
def trigger_logic(self) -> FlyerController[T]:
return self._trigger_logic

@AsyncStatus.wrap
Expand Down
4 changes: 2 additions & 2 deletions src/ophyd_async/epics/adaravis/_aravis_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import Literal

from ophyd_async.core import (
DetectorControl,
DetectorController,
DetectorTrigger,
TriggerInfo,
set_and_wait_for_value,
Expand All @@ -18,7 +18,7 @@
_HIGHEST_POSSIBLE_DEADTIME = 1961e-6


class AravisController(DetectorControl):
class AravisController(DetectorController):
GPIO_NUMBER = Literal[1, 2, 3, 4]

def __init__(self, driver: AravisDriverIO, gpio_number: GPIO_NUMBER) -> None:
Expand Down
4 changes: 2 additions & 2 deletions src/ophyd_async/epics/adcore/_core_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
DEFAULT_TIMEOUT,
AsyncStatus,
DatasetDescriber,
DetectorControl,
DetectorController,
set_and_wait_for_value,
)
from ophyd_async.epics.adcore._utils import convert_ad_dtype_to_np
Expand Down Expand Up @@ -34,7 +34,7 @@ async def shape(self) -> tuple[int, int]:


async def set_exposure_time_and_acquire_period_if_supplied(
controller: DetectorControl,
controller: DetectorController,
driver: ADBaseIO,
exposure: float | None = None,
timeout: float = DEFAULT_TIMEOUT,
Expand Down
4 changes: 2 additions & 2 deletions src/ophyd_async/epics/adkinetix/_kinetix_controller.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import asyncio

from ophyd_async.core import DetectorControl, DetectorTrigger
from ophyd_async.core import DetectorController, DetectorTrigger
from ophyd_async.core._detector import TriggerInfo
from ophyd_async.core._status import AsyncStatus
from ophyd_async.epics import adcore
Expand All @@ -15,7 +15,7 @@
}


class KinetixController(DetectorControl):
class KinetixController(DetectorController):
def __init__(
self,
driver: KinetixDriverIO,
Expand Down
4 changes: 2 additions & 2 deletions src/ophyd_async/epics/adpilatus/_pilatus_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from ophyd_async.core import (
DEFAULT_TIMEOUT,
DetectorControl,
DetectorController,
DetectorTrigger,
wait_for_value,
)
Expand All @@ -13,7 +13,7 @@
from ._pilatus_io import PilatusDriverIO, PilatusTriggerMode


class PilatusController(DetectorControl):
class PilatusController(DetectorController):
_supported_trigger_types = {
DetectorTrigger.internal: PilatusTriggerMode.internal,
DetectorTrigger.constant_gate: PilatusTriggerMode.ext_enable,
Expand Down
4 changes: 2 additions & 2 deletions src/ophyd_async/epics/adsimdetector/_sim_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

from ophyd_async.core import (
DEFAULT_TIMEOUT,
DetectorControl,
DetectorController,
DetectorTrigger,
)
from ophyd_async.core._detector import TriggerInfo
from ophyd_async.core._status import AsyncStatus
from ophyd_async.epics import adcore


class SimController(DetectorControl):
class SimController(DetectorController):
def __init__(
self,
driver: adcore.ADBaseIO,
Expand Down
4 changes: 2 additions & 2 deletions src/ophyd_async/epics/advimba/_vimba_controller.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import asyncio

from ophyd_async.core import DetectorControl, DetectorTrigger
from ophyd_async.core import DetectorController, DetectorTrigger
from ophyd_async.core._detector import TriggerInfo
from ophyd_async.core._status import AsyncStatus
from ophyd_async.epics import adcore
Expand All @@ -22,7 +22,7 @@
}


class VimbaController(DetectorControl):
class VimbaController(DetectorController):
def __init__(
self,
driver: VimbaDriverIO,
Expand Down
4 changes: 2 additions & 2 deletions src/ophyd_async/epics/eiger/_eiger_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from ophyd_async.core import (
DEFAULT_TIMEOUT,
DetectorControl,
DetectorController,
DetectorTrigger,
set_and_wait_for_other_value,
)
Expand All @@ -18,7 +18,7 @@
}


class EigerController(DetectorControl):
class EigerController(DetectorController):
def __init__(
self,
driver: EigerDriverIO,
Expand Down
4 changes: 2 additions & 2 deletions src/ophyd_async/fastcs/panda/_control.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import asyncio

from ophyd_async.core import (
DetectorControl,
DetectorController,
DetectorTrigger,
wait_for_value,
)
Expand All @@ -11,7 +11,7 @@
from ._block import PcapBlock


class PandaPcapController(DetectorControl):
class PandaPcapController(DetectorController):
def __init__(self, pcap: PcapBlock) -> None:
self.pcap = pcap
self._arm_status: AsyncStatus | None = None
Expand Down
6 changes: 3 additions & 3 deletions src/ophyd_async/fastcs/panda/_trigger.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from pydantic import BaseModel, Field

from ophyd_async.core import TriggerLogic, wait_for_value
from ophyd_async.core import FlyerController, wait_for_value

from ._block import PcompBlock, PcompDirectionOptions, SeqBlock, TimeUnits
from ._table import SeqTable
Expand All @@ -14,7 +14,7 @@ class SeqTableInfo(BaseModel):
prescale_as_us: float = Field(default=1, ge=0) # microseconds


class StaticSeqTableTriggerLogic(TriggerLogic[SeqTableInfo]):
class StaticSeqTableTriggerLogic(FlyerController[SeqTableInfo]):
def __init__(self, seq: SeqBlock) -> None:
self.seq = seq

Expand Down Expand Up @@ -63,7 +63,7 @@ class PcompInfo(BaseModel):
)


class StaticPcompTriggerLogic(TriggerLogic[PcompInfo]):
class StaticPcompTriggerLogic(FlyerController[PcompInfo]):
def __init__(self, pcomp: PcompBlock) -> None:
self.pcomp = pcomp

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import asyncio

from ophyd_async.core import DetectorControl, PathProvider
from ophyd_async.core import DetectorController, PathProvider
from ophyd_async.core._detector import TriggerInfo

from ._pattern_generator import PatternGenerator


class PatternDetectorController(DetectorControl):
class PatternDetectorController(DetectorController):
def __init__(
self,
pattern_generator: PatternGenerator,
Expand Down
10 changes: 5 additions & 5 deletions tests/core/test_flyer.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@

from ophyd_async.core import (
DEFAULT_TIMEOUT,
DetectorControl,
DetectorController,
DetectorTrigger,
DetectorWriter,
FlyerController,
StandardDetector,
StandardFlyer,
TriggerInfo,
TriggerLogic,
observe_value,
)
from ophyd_async.core._signal import assert_emitted
Expand All @@ -33,7 +33,7 @@ class TriggerState(str, Enum):
stopping = "stopping"


class DummyTriggerLogic(TriggerLogic[int]):
class DummyTriggerLogic(FlyerController[int]):
def __init__(self):
self.state = TriggerState.null

Expand Down Expand Up @@ -126,12 +126,12 @@ async def dummy_arm_2(self=None, trigger=None, num=0, exposure=None):
return writers[1].dummy_signal.set(1)

detector_1: StandardDetector[Any] = StandardDetector(
Mock(spec=DetectorControl, get_deadtime=lambda num: num, arm=dummy_arm_1),
Mock(spec=DetectorController, get_deadtime=lambda num: num, arm=dummy_arm_1),
writers[0],
name="detector_1",
)
detector_2: StandardDetector[Any] = StandardDetector(
Mock(spec=DetectorControl, get_deadtime=lambda num: num, arm=dummy_arm_2),
Mock(spec=DetectorController, get_deadtime=lambda num: num, arm=dummy_arm_2),
writers[1],
name="detector_2",
)
Expand Down
Loading
Loading