"""
This module defines the API of any online control plugin. Note that the API
is subject to change (as is most parts of madgui…).
The user must add their derived :class:`Backend` to the madgui config as:
.. code-block:: yaml
online_control:
backend: 'hit_acs.plugin:HitACS'
"""
__all__ = [
'Backend',
'ParamInfo',
]
from abc import ABCMeta, abstractmethod
from collections import namedtuple
[docs]class Backend(metaclass=ABCMeta):
"""Interface for a online control plugin."""
@abstractmethod
def __init__(self, session, settings):
"""Get a :class:`Backend` instance."""
raise NotImplementedError
[docs] @abstractmethod
def connect(self):
"""Connect the online plugin to the control system."""
[docs] @abstractmethod
def disconnect(self):
"""Unload the online plugin, free resources."""
[docs] @abstractmethod
def execute(self):
"""Commit transaction."""
[docs] @abstractmethod
def param_info(self, knob):
"""Get parameter info for backend key."""
[docs] @abstractmethod
def read_monitor(self, name):
"""
Read out one monitor, return values as dict with keys:
widthx: Beam x width
widthy: Beam y width
posx: Beam x position
posy: Beam y position
"""
[docs] @abstractmethod
def read_params(self, param_names=None):
"""Read all specified params (by default all). Return dict."""
[docs] @abstractmethod
def read_param(self, param):
"""Read parameter. Return numeric value."""
[docs] @abstractmethod
def write_param(self, param, value):
"""Update parameter into control system."""
[docs] @abstractmethod
def get_beam(self):
"""
Return a dict ``{name: value}`` for all beam properties, in MAD-X
units. At least: particle, mass, charge, energy
"""
ParamInfo = namedtuple('ParamInfo', [
'name',
'ui_name',
'ui_hint',
'ui_prec',
'unit',
'ui_unit',
'ui_conv',
])