From 07df2011fb5620b8528c2e26c3956cb4a2d7a7ed Mon Sep 17 00:00:00 2001 From: Mathias Sander Date: Sun, 10 Dec 2023 13:54:05 +0100 Subject: [PATCH] fix --- eco/bernina/bernina.py | 33 ++++++++++++++------ eco/detector/jungfrau.py | 52 ++++++++++++++++++++++++++++--- eco/devices_general/sensors_ai.py | 22 +++++++++++++ eco/devices_general/wago.py | 6 ++-- eco/loptics/bernina_laser.py | 34 +++++++++++++++++++- 5 files changed, 129 insertions(+), 18 deletions(-) create mode 100644 eco/devices_general/sensors_ai.py diff --git a/eco/bernina/bernina.py b/eco/bernina/bernina.py index 770bbf0..9911499 100644 --- a/eco/bernina/bernina.py +++ b/eco/bernina/bernina.py @@ -826,13 +826,13 @@ namespace.append_obj( module_name="eco.devices_general.wago", ) -namespace.append_obj( - "AnalogInput", - "SARES20-CWAG-GPS01:ADC08", - lazy=True, - name="oxygen_sensor", - module_name="eco.devices_general.wago", -) +# namespace.append_obj( +# "AnalogInput", +# "SARES20-CWAG-GPS01:ADC08", +# lazy=True, +# name="oxygen_sensor", +# module_name="eco.devices_general.wago", +# ) namespace.append_obj( "GudeStrip", @@ -1722,7 +1722,7 @@ namespace.append_obj( namespace.append_obj( "MicroscopeMotorRecord", - "SARES20-CAMS142-C2", + "SARES20-CAMS142-C1", lazy=True, pvname_zoom="SARES20-MF1:MOT_7", name="samplecam_topview", @@ -1744,6 +1744,15 @@ namespace.append_obj( module_name="eco.devices_general.cameras_swissfel", ) + +namespace.append_obj( + "OxygenSensor", + "SARES20-CWAG-GPS01:ADC08", + lazy=True, + name="oxygen_sensor", + module_name="eco.devices_general.sensors_ai", +) + # namespace.append_obj( # "CameraBasler", # "SARES20-CAMS142-C2", @@ -2677,11 +2686,17 @@ from eco.devices_general.powersockets import MpodChannel class IlluminatorsLasers(Assembly): def __init__(self, name="sample_illumination"): super().__init__(name=name) + self._append( + MpodChannel, + pvbase="SARES21-CPCL-PS7071", + channel_number=5, + name="illumination_inline", + ) self._append( MpodChannel, pvbase="SARES21-CPCL-PS7071", channel_number=2, - name="illumination_1", + name="illumination_side", ) self._append( MpodChannel, diff --git a/eco/detector/jungfrau.py b/eco/detector/jungfrau.py index fb92b95..ab42450 100644 --- a/eco/detector/jungfrau.py +++ b/eco/detector/jungfrau.py @@ -12,6 +12,16 @@ from datetime import datetime import requests +class JungfrauChannel(Assembly): + def __init__( + self, + jf_id, + name=None, + ): + super().__init__(name=name) + self.alias = Alias(name, channel=jf_id, channeltype="JF") + + class Jungfrau(Assembly): def __init__( self, @@ -25,10 +35,15 @@ class Jungfrau(Assembly): name=None, ): super().__init__(name=name) - self.alias = Alias(name, channel=jf_id, channeltype="JF") + # self.alias = Alias(name, channel=jf_id, channeltype="JF") self.pgroup = pgroup_adj self.jf_id = jf_id self.broker_address = broker_address + self._append(JungfrauChannel,jf_id,name='data') + self._append(JungfrauChannel,jf_id+'_rawdata',name='raw_data') + self._append(JungfrauChannel,jf_id+'_raw',name='data_raw') + self._append(JungfrauChannel,jf_id+'_dap_col4',name='data_online_processing') + self._append(JungfrauChannel,jf_id+'_dap_col3',name='ppref_online_processing') self._append( AdjustablePv, pv_trigger, @@ -161,7 +176,7 @@ class Jungfrau(Assembly): def get_isrunning(self): is_running = ( self.jf_id - in requests.get(f"{self.broker_address}/get_running_detectors_list").json()[ + in requests.get(f"{self.broker_adc_to_energyaddress}/get_running_detectors_list").json()[ "detectors" ] ) @@ -181,7 +196,7 @@ class Jungfrau(Assembly): # JF_list = self.get_JFs_running() # parameters = { # "pgroup": pgroup, - # "rate_multiplicator": 1, + # "rate_multiplicator": 1,adc_to_energy # "detectors": {tJF: {} for tJF in JF_list}, # } # return requests.post( @@ -256,6 +271,14 @@ class JungfrauDaqConfig(Assembly): is_display=True, is_setting=True, ) + self._append( + AdjustableGetSet, + self._get_save_online_processing, + self._set_save_online_processing, + name="save_online_processing", + is_display=True, + is_setting=True, + ) def _get_adc_to_energy(self, *args): try: @@ -286,7 +309,7 @@ class JungfrauDaqConfig(Assembly): self._jf_daq_cfg.set_target_value(cfg).wait() else: cfg = self._jf_daq_cfg.get_current_value() - cfg[self._jf_id]["adc_to_energy"] = False + cfg[self._jf_id]["geometry"] = False self._jf_daq_cfg.set_target_value(cfg).wait() def _get_compressed_bitshuffle(self, *args): @@ -305,6 +328,25 @@ class JungfrauDaqConfig(Assembly): cfg[self._jf_id]["compression"] = False self._jf_daq_cfg.set_target_value(cfg).wait() + def _get_save_online_processing(self, *args): + try: + return not self._jf_daq_cfg.get_current_value()[self._jf_id][ + "save_dap_results" + ] + except KeyError: + # raise Exception("unclear what the default for keeping raw files is!") + return None + + def _set_save_online_processing(self, value): + if value: + cfg = self._jf_daq_cfg.get_current_value() + cfg[self._jf_id]["save_dap_results"] = False + self._jf_daq_cfg.set_target_value(cfg).wait() + else: + cfg = self._jf_daq_cfg.get_current_value() + cfg[self._jf_id]["save_dap_results"] = True + self._jf_daq_cfg.set_target_value(cfg).wait() + def _get_keep_raw_data(self, *args): try: return not self._jf_daq_cfg.get_current_value()[self._jf_id][ @@ -321,7 +363,7 @@ class JungfrauDaqConfig(Assembly): self._jf_daq_cfg.set_target_value(cfg).wait() else: cfg = self._jf_daq_cfg.get_current_value() - cfg[self._jf_id]["remove_raw_files"] = True + cfg[self._jf_id]["remove_raw_files"] = Trueadc_to_energy self._jf_daq_cfg.set_target_value(cfg).wait() def _get_large_pixel_processing(self, *args): diff --git a/eco/devices_general/sensors_ai.py b/eco/devices_general/sensors_ai.py new file mode 100644 index 0000000..53b78c2 --- /dev/null +++ b/eco/devices_general/sensors_ai.py @@ -0,0 +1,22 @@ +from eco.devices_general.wago import AnalogInput +from eco.elements.adjustable import AdjustableVirtual + +class OxygenSensor(AnalogInput): + def __init__(self,pvname,name=None): + super().__init__(pvname,name=name) + self.unit.set_target_value('%') + + def set_no_oxygen(self, val_curr=None): + if not val_curr: + val_curr = self.raw.get_current_value() + slo = self.linear_calibration_slope.get_current_value() + off = self.linear_calibration_offset.get_current_value() + slo_new = slo*((100-val_curr)/(100-off)) + self.linear_calibration_offset(val_curr) + self.linear_calibration_slope(slo_new) + + def set_full_oxygen(self, val_curr=None): + if not val_curr: + val_curr = self.raw.get_current_value() + sval = (100-self.linear_calibration_offset.get_current_value())/val_curr + self.linear_calibration_slope(sval) diff --git a/eco/devices_general/wago.py b/eco/devices_general/wago.py index 4c3d9e4..0c35248 100644 --- a/eco/devices_general/wago.py +++ b/eco/devices_general/wago.py @@ -30,7 +30,7 @@ class AnalogInput(Assembly): self.pvname + ".EGU", name="unit", is_setting=False, - is_display=True, + is_display=False, ) self.value.unit = self.unit self._append( @@ -59,14 +59,14 @@ class AnalogInput(Assembly): self.pvname + ".EOFF", name="linear_calibration_offset", is_setting=True, - is_display=True, + is_display=False, ) self._append( AdjustablePv, self.pvname + ".ESLO", name="linear_calibration_slope", is_setting=True, - is_display=True, + is_display=False, ) def get_current_value(self): diff --git a/eco/loptics/bernina_laser.py b/eco/loptics/bernina_laser.py index 7544654..412de26 100644 --- a/eco/loptics/bernina_laser.py +++ b/eco/loptics/bernina_laser.py @@ -306,10 +306,42 @@ class LaserBernina(Assembly): MotorRecord, self.pvname + "-M534:MOT", name="wp_att", is_setting=True ) + + ######## Implementation segmented ND filter wheel in rotation stage ######### self._append( - MotorRecord, "SARES20-MF1:MOT_16", name="nd_filt", is_setting=True + MotorRecord, "SARES20-MF1:MOT_16", name="nd_filt_stg", is_setting=True ) + filters = np.array([ + [0.912010839, 330], + [0.794328235, 15], + [0.630957345, 60], + [0.501187234, 105], + [0.398107171, 150], + [0.316227766, 195], + [0.251188643, 240], + [0.1, 285], + ]) + + def set_transmission(t): + idx = np.argmin(abs(filters.T[0]-t)) + stg = filters[idx][1] + t = filters[idx][0] + print(f"Setting ND filter transmission to {t:.3} at position {stg}") + return stg + + def get_transmission(stg): + idx = np.argmin(abs(filters.T[1]-stg)) + t = filters[idx][0] + return t + + self._append( + AdjustableVirtual, [self.nd_filt_stg], get_transmission, set_transmission, name="nd_filt" + ) + + ######## END Implementation segmented ND filter wheel in rotation stage ######### + + self._append( AdjustableFS, "/photonics/home/gac-bernina/eco/configuration/wp_att_calibration",