From 6a8763f9e2ab2a94cdb361961caea3dbca24274a Mon Sep 17 00:00:00 2001 From: Mathias Sander Date: Fri, 3 Jun 2022 22:18:47 +0200 Subject: [PATCH] sequencer fixed --- eco/__init__.py | 4 +- eco/bernina/bernina.py | 53 +++++++++++++ eco/devices_general/digitizers.py | 75 +++++++++++++++++++ eco/elements/assembly.py | 18 ++++- eco/elements/protocols.py | 4 +- .../bernina_sample_environments.py | 2 + eco/timing/sequencer.py | 19 ++++- 7 files changed, 168 insertions(+), 7 deletions(-) create mode 100644 eco/devices_general/digitizers.py diff --git a/eco/__init__.py b/eco/__init__.py index de99330..33e053b 100644 --- a/eco/__init__.py +++ b/eco/__init__.py @@ -1,6 +1,6 @@ try: - from elements.protocols import Adjustable, Detector + from eco.elements.protocols import Adjustable, Detector except: print("cannot import Prototypic protocol classes") -from .elements.assembly import Assembly +from eco.elements.assembly import Assembly diff --git a/eco/bernina/bernina.py b/eco/bernina/bernina.py index 8a375f7..7d161d3 100644 --- a/eco/bernina/bernina.py +++ b/eco/bernina/bernina.py @@ -1,4 +1,6 @@ from eco.elements.adjustable import AdjustableFS + +# from eco.endstations.bernina_sample_environments import Organic_crystal_breadboard_old from eco.motion.smaract import SmaractController from .config import components from .config import config as config_berninamesp @@ -387,6 +389,20 @@ namespace.append_obj( lazy=True, # lazy=False, ) +namespace.append_obj( + "DigitizerIoxos", + "SARES20-LSCP9-FNS", + name="digitizer_ioxos_user", + module_name="eco.devices_general.digitizers", + lazy=True, +) +namespace.append_obj( + "DigitizerIoxos", + "SLAAR21-LSCP1-FNS", + name="digitizer_ioxos_laser", + module_name="eco.devices_general.digitizers", + lazy=True, +) namespace.append_obj( "AxisPTZ", @@ -936,6 +952,43 @@ namespace.append_obj( ) +class THz_in_air(Assembly): + def __init__(self, name=None): + super().__init__(name=name) + + self._append(SmaractRecord, "SARES23:ESB4", name="eos_rot", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB12", name="eos_tilt", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB5", name="crystal_ROT", is_setting=True) + self._append(SmaractRecord, "SARES23:LIC15", name="ir_1_z", is_setting=True) + self._append(SmaractRecord, "SARES23:LIC13", name="ir_1_Ry", is_setting=True) + self._append(SmaractRecord, "SARES23:LIC14", name="ir_1_Rx", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB10", name="ir_2_Rx", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB7", name="ir_2_Ry", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB9", name="para_2_x", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB3", name="thz_mir_x", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB1", name="thz_mir_z", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB8", name="thz_mir_Ry", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB2", name="thz_mir_Rz", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB6", name="focus_x", is_setting=True) + self._append( + MotorRecord, + "SARES20-MF1:MOT_4", + name="focus_y", + is_setting=True, + is_display=True, + ) + self._append(SmaractRecord, "SARES23:ESB14", name="focus_z", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB13", name="focus_Rx", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB15", name="focus_Ry", is_setting=True) + self._append(SmaractRecord, "SARES23:ESB11", name="focus_Rz", is_setting=True) + + +namespace.append_obj( + THz_in_air, + lazy=True, + name="tia", +) + namespace.append_obj( "SmaractController", "SARES23:LIC", diff --git a/eco/devices_general/digitizers.py b/eco/devices_general/digitizers.py new file mode 100644 index 0000000..842f038 --- /dev/null +++ b/eco/devices_general/digitizers.py @@ -0,0 +1,75 @@ +from ..detector.detectors_psi import DetectorBsStream +from eco.elements.assembly import Assembly +from eco.epics.detector import DetectorPvDataStream +from eco.epics.adjustable import AdjustablePv, AdjustablePvEnum + + +class DigitizerIoxos(Assembly): + def __init__(self, pvbase="SARES20-LSCP9-FNS", name=None): + super().__init__(name=name) + self.pvbase = pvbase + for chno in range(8): + self._append( + DigitizerIoxosBoxcarChannel, + f"{self.pvbase}:CH{chno}", + name=f"channel_{chno:d}", + is_setting=True, + ) + + +class DigitizerIoxosBoxcarChannel(Assembly): + def __init__(self, pvbase, name=None): + super().__init__(name=name) + self.pvbase = pvbase + self._append(DetectorBsStream, self.pvbase + ":VAL_GET", name="value") + self._append(AdjustablePv, self.pvbase + ":VAL_GET.EGU", name="unit", is_setting='auto') + self._append( + DetectorPvDataStream, + self.pvbase + ":WFM", + name="waveform_slow", + is_display=False, + is_status=True, + ) + self.status_collection.append(self.waveform_slow, force=True) + self._append( + DetectorPvDataStream, + self.pvbase + ":BOXCAR.VALH", + name="background", + ) + self._append( + DetectorPvDataStream, + self.pvbase + ":BOXCAR.VALI", + name="signal", + ) + self._append( + DetectorPvDataStream, + self.pvbase + ":BOXCAR.VALG", + name="difference", + ) + self._append( + DetectorPvDataStream, self.pvbase + ":BOXCAR.VALO", name="signal_integral" + ) + self._append( + DetectorPvDataStream, self.pvbase + ":BOXCAR.VALE", name="signal_average" + ) + self._append( + DetectorPvDataStream, + self.pvbase + ":BOXCAR.VALP", + name="background_integral", + ) + self._append( + DetectorPvDataStream, + self.pvbase + ":BOXCAR.VALD", + name="background_average", is_setting='auto' + ) + self._append(AdjustablePv, self.pvbase + ":BSTART", name="bgregion_start", is_setting='auto') + self._append(AdjustablePv, self.pvbase + ":BEND", name="bgregion_end", is_setting='auto') + self._append(AdjustablePv, self.pvbase + ":START", name="sigregion_start", is_setting='auto') + self._append(AdjustablePv, self.pvbase + ":END", name="sigregion_end", is_setting='auto') + self._append(AdjustablePv, self.pvbase + ":CALIB", name="calibration_gain", is_setting='auto') + self._append(AdjustablePv, self.pvbase + ":OFFS", name="calibration_offset", is_setting='auto') + self._append(AdjustablePvEnum, self.pvbase + ":BOXCAR.SCAN", name="scan_mode", is_setting='auto') + self._append(AdjustablePvEnum, self.pvbase + ":WHICH_CHAN", name="output_mode", is_setting='auto') + + def get_current_value(self): + return self.value.get_current_value() diff --git a/eco/elements/assembly.py b/eco/elements/assembly.py index e483fc2..b4e4445 100644 --- a/eco/elements/assembly.py +++ b/eco/elements/assembly.py @@ -1,3 +1,8 @@ +from tkinter import W + +from numpy import isin + +from eco.elements.protocols import Detector from ..aliases import Alias from tabulate import tabulate import colorama @@ -6,6 +11,7 @@ from enum import Enum import os import subprocess from rich.progress import track +from eco import Adjustable, Detector class Collection: @@ -87,8 +93,12 @@ class Assembly: # except: # print(f'object {name} / {foo_obj_init} not initialized with name/parent') # self.__dict__[name] = foo_obj_init(*args, **kwargs) + if is_setting == "auto": + is_setting = isinstance(self.__dict__[name], Adjustable) if is_setting: self.settings_collection.append(self.__dict__[name], recursive=True) + if is_status == "auto": + is_status = isinstance(self.__dict__[name], Detector) if is_status: self.status_collection.append(self.__dict__[name], recursive=True) if is_display: @@ -192,13 +202,19 @@ class Assembly: for to in stats: name = to.alias.get_full_name(base=self) value = to.get_current_value() + is_adjustable = isinstance(to, Adjustable) + if is_adjustable: + typechar = "✏️" + else: + typechar = "👁️" + is_detector = isinstance(to, Detector) if isinstance(value, Enum): value = f"{value.value} ({value.name})" try: unit = to.unit() except: unit = None - tab.append([".".join([main_name, name]), value, unit]) + tab.append([".".join([main_name, name]), value, unit, typechar]) s = tabulate(tab) return s diff --git a/eco/elements/protocols.py b/eco/elements/protocols.py index 66b2d9e..196be7a 100644 --- a/eco/elements/protocols.py +++ b/eco/elements/protocols.py @@ -3,7 +3,7 @@ from typing import Protocol, runtime_checkable @runtime_checkable class Adjustable(Protocol): - def get_target_value(self): + def get_current_value(self): ... def set_target_value(self, value): @@ -14,5 +14,5 @@ class Adjustable(Protocol): @runtime_checkable class Detector(Protocol): - def get_target_value(self): + def get_current_value(self): ... diff --git a/eco/endstations/bernina_sample_environments.py b/eco/endstations/bernina_sample_environments.py index e6e3e05..3e8f0c4 100644 --- a/eco/endstations/bernina_sample_environments.py +++ b/eco/endstations/bernina_sample_environments.py @@ -354,6 +354,8 @@ class Organic_crystal_breadboard(Assembly): }, } + + ### smaract motors ### for name, config in self.motor_configuration.items(): self._append( diff --git a/eco/timing/sequencer.py b/eco/timing/sequencer.py index a655bb6..eedcee7 100644 --- a/eco/timing/sequencer.py +++ b/eco/timing/sequencer.py @@ -71,7 +71,7 @@ class CtaSequencer(Assembly): self._append( AdjustablePv, self._pvstr(f"Ser{i}-Data-I"), - element_count=self.max_length.get_current_value(), + # element_count=self.max_length.get_current_value(), name=f"seq_code{eventcode}", is_setting=True, is_display=False, @@ -104,7 +104,22 @@ class CtaSequencer(Assembly): ) oldlength = self.length.get_current_value() newlength = oldlength + step_delay - self.event_code_sequences[code]._value[newlength - 1] = 1 + changes = [] + for i, ec in self.event_code_sequences.items(): + if oldlength == 0: + o = [] + else: + o = list(ec.get_current_value()) + if i == code: + n = o + [0] * (newlength - oldlength - 1) + [1] + else: + n = o + [0] * (newlength - oldlength) + # print(o, n) + changes.append(ec.set_target_value(n)) + for change in changes: + change.wait() + + # self.event_code_sequences[code]._value[newlength - 1] = 1 self.length.set_target_value(newlength).wait()