Ready-to-Use Devices ******************** These devices are have ready-made classes in Python. To configure them, the user need only provide a PV prefix and a name. EpicsMotor ---------- Create an ``EpicsMotor`` to communicate with a single `EPICS motor record `_: .. code-block:: python from ophyd import EpicsMotor # the two-theta motor tth = EpicsMotor('XF:28IDC-ES:1{Dif:1-Ax:2ThI}Mtr', name='tth') .. autoclass:: ophyd.epics_motor.EpicsMotor :members: EpicsScaler ----------- Create an ``EpicsScaler`` to control an EPICS `scaler record `_: .. code-block:: python from ophyd import EpicsScaler scaler = EpicsScaler('XF:28IDC-ES:1{Sclr:1}', name='tth') .. autoclass:: ophyd.scaler.EpicsScaler :members: EpicsMCA and EpicsDXP --------------------- `MCA records `_ and DXP-based devices are also supported, through the ``EpicsMCA`` and ``EpicsDXP`` devices. .. autoclass:: ophyd.mca.EpicsMCARecord :members: .. autoclass:: ophyd.mca.EpicsDXP :members: .. index:: read_attrs .. index:: configuration_attrs .. index:: hints MotorBundle ----------- Creating 'bundles' of motors is very common so we also have a helper class that tweaks the default behavior of :attr:`read_attrs`, :attr:`configuration_attrs`, and :attr:`hints` .. autoclass:: ophyd.epics_motor.MotorBundle :members: This must be sub-classed (like :class:`~ophyd.device.Device`) to be useful. .. code-block:: python from ophyd import MotorBundle, EpicsMotor from ophyd import Component as Cpt class StageXY(MotorBundle): x = Cpt(EpicsMotor, ':X') y = Cpt(EpicsMotor, ':Y') stage = StageXY('STAGE_PV', name='stage')