diff --git a/eco/acquisition/scan_nd.py b/eco/acquisition/scan_nd.py index 556467a..6a5b732 100644 --- a/eco/acquisition/scan_nd.py +++ b/eco/acquisition/scan_nd.py @@ -1,4 +1,6 @@ from .scan import Scan +import numpy as np +from numpy.random import RandomState # class Scan: @@ -30,17 +32,18 @@ class ScanND: fina, Npulses=100, basepath="", - Npulses=100, - basepath="", scan_info_dir="", checker=None, scan_directories=False, - callbackStartStep=None, + cb_start_scan=None, + cb_start_step=None, + cb_end_step=None, + cb_end_scan=None, checker_sleep_time=0.2, return_at_end="question", run_table=None, elog=None, - ): + ): scan_array = [] scan_adjustables = [] for n_dim, (adj_tdim, arr_tdim) in enumerate(zip(adjustables, arrays)): @@ -60,3 +63,26 @@ class ScanND: except TypeError: scan_array.append(tuple([arr_tdim])) scan_adjustables.append(tuple([adj_tdim])) + self.scan_adjustables = scan_adjustables + self.scan_array = scan_array + self.scan_dimension = n_dim + 1 + + @property + def steps_total(self): + return np.prod([len(ta[0]) for ta in self.scan_array]) + + @property + def shape(self): + return tuple([len(ta[0]) for ta in self.scan_array]) + + def create_stepping_order(self,order='C'): + return [tuple(te) for te in np.vstack(np.unravel_index(np.arange(self.steps_total),self.shape,order=order)).T] + + def create_random_selection(self,N_elements=None,scan_percentage=None,random_type=equal,sort_dimensions=False): + + rs = RandomState(seed=0) + rs.choice(a,5,p=np.exp(-a)/sum(np.exp(-a)),replace=False) + + + + diff --git a/eco/devices_general/adjustable.py b/eco/devices_general/adjustable.py index 79c8e9f..6000ab9 100644 --- a/eco/devices_general/adjustable.py +++ b/eco/devices_general/adjustable.py @@ -358,7 +358,7 @@ class PvRecord: self.pvname = self.Id else: self._pvreadback = PV(pvreadbackname) - self.pvname = self.pvreadbackname + self.pvname = pvreadbackname self.alias = Alias(name, channel=pvreadbackname, channeltype="CA") def get_current_value(self, readback=True): diff --git a/eco/devices_general/motors.py b/eco/devices_general/motors.py index 6469f6d..2f69966 100755 --- a/eco/devices_general/motors.py +++ b/eco/devices_general/motors.py @@ -156,6 +156,8 @@ class SmaractStreamdevice(Assembly): name="sensor_type", is_setting=True, ) + self._append(PvRecord, self.pvname + ":GET_SENSOR_TYPE", name="sensor_type_getter_number", is_setting=False) + self._append(PvRecord, self.pvname + ":SET_SENSOR_TYPE", name="sensor_type_setter_number", is_setting=False) self._append(PvRecord, self.pvname + ":LLM", name="limit_low", is_setting=False) self._append( PvRecord, self.pvname + ":HLM", name="limit_high", is_setting=False diff --git a/eco/elements/assembly.py b/eco/elements/assembly.py index 4378246..a98acd2 100644 --- a/eco/elements/assembly.py +++ b/eco/elements/assembly.py @@ -66,9 +66,13 @@ class Assembly: is_status=True, is_alias=True, view_toplevel_only=True, + call_obj=True, **kwargs, - ): - self.__dict__[name] = foo_obj_init(*args, **kwargs, name=name) + ): + if call_obj and callable(foo_obj_init): + self.__dict__[name] = foo_obj_init(*args, **kwargs, name=name) + else: + self.__dict__[name] = foo_obj_init self.alias.append(self.__dict__[name].alias) # except: # print(f'object {name} / {foo_obj_init} not initialized with name/parent') diff --git a/eco/utilities/config.py b/eco/utilities/config.py index ef02324..aad99cc 100644 --- a/eco/utilities/config.py +++ b/eco/utilities/config.py @@ -7,6 +7,7 @@ from functools import partial # from .lazy_proxy import Proxy from ..aliases import Alias +from ..elements.assembly import Assembly import getpass import colorama import socket @@ -254,9 +255,10 @@ class Terminal: print(colorama.ansi.set_title("♻️ " + self.get_string() + extension)) -class Namespace(object): +class Namespace(Assembly): def __init__(self, name=None, root_module=None, alias_namespace=None): - self.name = name + super().__init__(name) + # self.name = name self.lazy_items = {} self.initialized_items = {} self.root_module = root_module @@ -350,6 +352,8 @@ class Namespace(object): obj_initialized = obj_maker(*args, **kwargs) self.initialized_items[name] = self.lazy_items.pop(name) + if hasattr(obj_initialized, "alias"): + self._append(obj_initialized,name=name,is_setting=True,is_status='recursive',call_obj=False) if self.alias_namespace and hasattr(obj_initialized, "alias"): for ta in obj_initialized.alias.get_all(): try: @@ -382,6 +386,8 @@ class Namespace(object): self.initialized_items[name] = obj if self.root_module: sys.modules[self.root_module].__dict__[name] = obj + if hasattr(obj, "alias"): + self._append(obj,name=name,is_setting=True,is_status='recursive',call_obj=False) if self.alias_namespace and hasattr(obj, "alias"): for ta in obj.alias.get_all(): try: diff --git a/eco/xoptics/shutters.py b/eco/xoptics/shutters.py index eac1a00..3d2d355 100644 --- a/eco/xoptics/shutters.py +++ b/eco/xoptics/shutters.py @@ -1,22 +1,26 @@ from epics import PV from ..aliases import Alias +from ..elements.assembly import Assembly +from ..devices_general.adjustable import PvEnum -class PhotonShutter: +class PhotonShutter(Assembly): def __init__(self, pvname, name=None): - self.name = name - self.pv = PV(pvname) - if name: - self.alias = Alias(name, channel=pvname, channeltype="CA") + super().__init__(name=name) + self._append(PvEnum,pvname,name='request') def open(self): - self.pv.put(1) + self.request(1) def close(self): - self.pv.put(0) + self.request(0) + + def __call__(self,*args): + if args: + self.request.set_target_value(args[0]) + else: + return self.request.get_current_value() - def get_state(self): - return self.pv.get() class SafetyShutter: