From 911c8a2438c9cdf1ca2a9685e1dbbbf4a1913f5c Mon Sep 17 00:00:00 2001 From: appel_c Date: Tue, 5 Sep 2023 09:26:27 +0200 Subject: [PATCH] fix: online changes SAXS --- .../epics/devices/DelayGeneratorDG645.py | 73 +++++-------------- .../epics/devices/bec_scaninfo_mixin.py | 7 +- ophyd_devices/epics/devices/eiger9m_csaxs.py | 24 ++---- ophyd_devices/epics/devices/mcs_csaxs.py | 17 +---- 4 files changed, 29 insertions(+), 92 deletions(-) diff --git a/ophyd_devices/epics/devices/DelayGeneratorDG645.py b/ophyd_devices/epics/devices/DelayGeneratorDG645.py index 224f773..40cc546 100644 --- a/ophyd_devices/epics/devices/DelayGeneratorDG645.py +++ b/ophyd_devices/epics/devices/DelayGeneratorDG645.py @@ -61,9 +61,7 @@ class DummyPositioner(PVPositioner): setpoint = Component(EpicsSignal, "DelayAO", put_complete=True, kind=Kind.config) readback = Component(EpicsSignalRO, "DelayAI", kind=Kind.config) done = Component(Signal, value=1) - reference = Component( - EpicsSignal, "ReferenceMO", put_complete=True, kind=Kind.config - ) + reference = Component(EpicsSignal, "ReferenceMO", put_complete=True, kind=Kind.config) class DelayPair(PseudoPositioner): @@ -93,16 +91,12 @@ class DelayPair(PseudoPositioner): @pseudo_position_argument def forward(self, pseudo_pos): """Run a forward (pseudo -> real) calculation""" - return self.RealPosition( - ch1=pseudo_pos.delay, ch2=pseudo_pos.delay + pseudo_pos.width - ) + return self.RealPosition(ch1=pseudo_pos.delay, ch2=pseudo_pos.delay + pseudo_pos.width) @real_position_argument def inverse(self, real_pos): """Run an inverse (real -> pseudo) calculation""" - return self.PseudoPosition( - delay=real_pos.ch1, width=real_pos.ch2 - real_pos.ch1 - ) + return self.PseudoPosition(delay=real_pos.ch1, width=real_pos.ch2 - real_pos.ch1) class TriggerSource(int, enum.Enum): @@ -147,12 +141,8 @@ class DelayGeneratorDG645(Device): "reload_config", ] - trigger_burst_readout = Component( - EpicsSignal, "EventStatusLI.PROC", name="read_burst_state" - ) - burst_cycle_finished = Component( - EpicsSignalRO, "EventStatusMBBID.B3", name="read_burst_state" - ) + trigger_burst_readout = Component(EpicsSignal, "EventStatusLI.PROC", name="read_burst_state") + burst_cycle_finished = Component(EpicsSignalRO, "EventStatusMBBID.B3", name="read_burst_state") status = Component(EpicsSignalRO, "StatusSI", name="status") clear_error = Component(EpicsSignal, "StatusClearBO", name="clear_error") @@ -199,9 +189,7 @@ class DelayGeneratorDG645(Device): name="trigger_rate", kind=Kind.config, ) - trigger_shot = Component( - EpicsSignal, "TriggerDelayBO", name="trigger_shot", kind="config" - ) + trigger_shot = Component(EpicsSignal, "TriggerDelayBO", name="trigger_shot", kind="config") # Burst mode burstMode = Component( EpicsSignal, @@ -358,10 +346,7 @@ class DelayGeneratorDG645(Device): f"{name}_set_trigger_source": "SINGLE_SHOT", } if ddg_config is not None: - [ - self.ddg_config.update({f"{name}_{key}": value}) - for key, value in ddg_config.items() - ] + [self.ddg_config.update({f"{name}_{key}": value}) for key, value in ddg_config.items()] super().__init__( prefix=prefix, name=name, @@ -372,9 +357,7 @@ class DelayGeneratorDG645(Device): **kwargs, ) if device_manager is None and not sim_mode: - raise DDGError( - "Add DeviceManager to initialization or init with sim_mode=True" - ) + raise DDGError("Add DeviceManager to initialization or init with sim_mode=True") self.device_manager = device_manager if not sim_mode: self._producer = self.device_manager.producer @@ -447,10 +430,7 @@ class DelayGeneratorDG645(Device): self.set_channels( "reference", 0, - [ - f"channel{self._all_delay_pairs[ii]}.ch1" - for ii in range(len(self._all_delay_pairs)) - ], + [f"channel{self._all_delay_pairs[ii]}.ch1" for ii in range(len(self._all_delay_pairs))], ) for ii in range(len(self._all_delay_pairs)): self.set_channels( @@ -468,12 +448,7 @@ class DelayGeneratorDG645(Device): """ while True: self.trigger_burst_readout.set(1) - if ( - self.burst_cycle_finished.read()[self.burst_cycle_finished.name][ - "value" - ] - == 1 - ): + if self.burst_cycle_finished.read()[self.burst_cycle_finished.name]["value"] == 1: self._acquisition_done = True return if self._stopped == True: @@ -499,9 +474,7 @@ class DelayGeneratorDG645(Device): ) total_exposure = exp_time delay_burst = self.delay_burst.get() - self.burst_enable( - num_burst_cycle, delay_burst, total_exposure, config="first" - ) + self.burst_enable(num_burst_cycle, delay_burst, total_exposure, config="first") self.set_channels("delay", 0) # Set burst length to half of the experimental time! self.set_channels("width", exp_time) @@ -509,13 +482,9 @@ class DelayGeneratorDG645(Device): exp_time = self.delta_width.get() + self.scaninfo.exp_time total_exposure = exp_time + self.scaninfo.readout_time delay_burst = self.delay_burst.get() - num_burst_cycle = ( - self.scaninfo.num_frames + self.additional_triggers.get() - ) + num_burst_cycle = self.scaninfo.num_frames + self.additional_triggers.get() # set parameters in DDG - self.burst_enable( - num_burst_cycle, delay_burst, total_exposure, config="first" - ) + self.burst_enable(num_burst_cycle, delay_burst, total_exposure, config="first") self.set_channels("delay", 0) # Set burst length to half of the experimental time! self.set_channels("width", exp_time) @@ -534,9 +503,7 @@ class DelayGeneratorDG645(Device): # self.additional_triggers should be 0 for self.set_high_on_exposure or remove here fully.. num_burst_cycle = 1 + self.additional_triggers.get() # set parameters in DDG - self.burst_enable( - num_burst_cycle, delay_burst, total_exposure, config="first" - ) + self.burst_enable(num_burst_cycle, delay_burst, total_exposure, config="first") self.set_channels("delay", 0.0) # Set burst length to half of the experimental time! self.set_channels("width", exp_time) @@ -546,13 +513,9 @@ class DelayGeneratorDG645(Device): exp_time = self.delta_width.get() + self.scaninfo.exp_time total_exposure = exp_time + self.scaninfo.readout_time delay_burst = self.delay_burst.get() - num_burst_cycle = ( - self.scaninfo.num_frames + self.additional_triggers.get() - ) + num_burst_cycle = self.scaninfo.num_frames + self.additional_triggers.get() # set parameters in DDG - self.burst_enable( - num_burst_cycle, delay_burst, total_exposure, config="first" - ) + self.burst_enable(num_burst_cycle, delay_burst, total_exposure, config="first") self.set_channels("delay", 0.0) # Set burst length to half of the experimental time! self.set_channels("width", exp_time) @@ -577,9 +540,7 @@ class DelayGeneratorDG645(Device): def trigger(self) -> None: # if self.scaninfo.scan_type == "step": - if self.source.read()[self.source.name]["value"] == int( - TriggerSource.SINGLE_SHOT - ): + if self.source.read()[self.source.name]["value"] == int(TriggerSource.SINGLE_SHOT): self.trigger_shot.set(1).wait() super().trigger() diff --git a/ophyd_devices/epics/devices/bec_scaninfo_mixin.py b/ophyd_devices/epics/devices/bec_scaninfo_mixin.py index 179da3d..5c79e48 100644 --- a/ophyd_devices/epics/devices/bec_scaninfo_mixin.py +++ b/ophyd_devices/epics/devices/bec_scaninfo_mixin.py @@ -4,9 +4,7 @@ from bec_lib.core import DeviceManagerBase, BECMessage, MessageEndpoints class BecScaninfoMixin: - def __init__( - self, device_manager: DeviceManagerBase = None, sim_mode=False - ) -> None: + def __init__(self, device_manager: DeviceManagerBase = None, sim_mode=False) -> None: self.device_manager = device_manager self.sim_mode = sim_mode self.scan_msg = None @@ -57,8 +55,7 @@ class BecScaninfoMixin: self.scan_number = scan_msg.content["info"]["scan_number"] self.exp_time = scan_msg.content["info"]["exp_time"] self.num_frames = ( - scan_msg.content["info"]["num_points"] - * scan_msg.content["info"]["frames_per_trigger"] + scan_msg.content["info"]["num_points"] * scan_msg.content["info"]["frames_per_trigger"] ) self.scan_type = scan_msg.content["info"].get("scan_type", "step") self.readout_time = scan_msg.content["info"]["readout_time"] diff --git a/ophyd_devices/epics/devices/eiger9m_csaxs.py b/ophyd_devices/epics/devices/eiger9m_csaxs.py index f5a6293..261d398 100644 --- a/ophyd_devices/epics/devices/eiger9m_csaxs.py +++ b/ophyd_devices/epics/devices/eiger9m_csaxs.py @@ -126,9 +126,7 @@ class Eiger9mCsaxs(DetectorBase): **kwargs, ) if device_manager is None and not sim_mode: - raise EigerError( - "Add DeviceManager to initialization or init with sim_mode=True" - ) + raise EigerError("Add DeviceManager to initialization or init with sim_mode=True") self.name = name self.wait_for_connection() # Make sure to be connected before talking to PVs @@ -142,9 +140,7 @@ class Eiger9mCsaxs(DetectorBase): # TODO self.filepath = "" self.scaninfo.username = "e21206" - self.service_cfg = { - "base_path": f"/sls/X12SA/data/{self.scaninfo.username}/Data10/" - } + self.service_cfg = {"base_path": f"/sls/X12SA/data/{self.scaninfo.username}/Data10/"} self.filewriter = FileWriterMixin(self.service_cfg) self.reduce_readout = 1e-3 # 3 ms self.triggermode = 0 # 0 : internal, scan must set this if hardware triggered @@ -172,9 +168,7 @@ class Eiger9mCsaxs(DetectorBase): f"Type of new value {type(value)}:{value} does not match old value {type(old_value)}:{old_value}" ) cfg.update({cfg_key: value}) - logger.info( - f"Updated std_daq config for key {cfg_key} from {old_value} to {value}" - ) + logger.info(f"Updated std_daq config for key {cfg_key} from {old_value} to {value}") def _init_standard_daq(self) -> None: self.std_rest_server_url = "http://xbl-daq-29:5000" @@ -207,9 +201,7 @@ class Eiger9mCsaxs(DetectorBase): energy = self.cam.beam_energy.read()[self.cam.beam_energy.name]["value"] if setp_energy != energy: self.cam.beam_energy.set(setp_energy) # .wait() - threshold = self.cam.threshold_energy.read()[self.cam.threshold_energy.name][ - "value" - ] + threshold = self.cam.threshold_energy.read()[self.cam.threshold_energy.name]["value"] if not np.isclose(setp_energy / 2, threshold, rtol=0.05): self.cam.threshold_energy.set(setp_energy / 2) # .wait() @@ -271,9 +263,7 @@ class Eiger9mCsaxs(DetectorBase): self.arm_acquisition() logger.info("Waiting for detector to be armed") while True: - det_ctrl = self.cam.detector_state.read()[self.cam.detector_state.name][ - "value" - ] + det_ctrl = self.cam.detector_state.read()[self.cam.detector_state.name]["value"] if det_ctrl == int(DetectorState.RUNNING): break time.sleep(0.005) @@ -300,9 +290,7 @@ class Eiger9mCsaxs(DetectorBase): # Message to BEC state = True - msg = BECMessage.FileMessage( - file_path=self.filepath, done=True, successful=state - ) + msg = BECMessage.FileMessage(file_path=self.filepath, done=True, successful=state) self._producer.set_and_publish( MessageEndpoints.public_file(self.scaninfo.scanID, self.name), msg.dumps(), diff --git a/ophyd_devices/epics/devices/mcs_csaxs.py b/ophyd_devices/epics/devices/mcs_csaxs.py index 59f1147..f00095d 100644 --- a/ophyd_devices/epics/devices/mcs_csaxs.py +++ b/ophyd_devices/epics/devices/mcs_csaxs.py @@ -152,10 +152,7 @@ class McsCsaxs(SIS38XX): f"{name}_num_lines": 1, } if mcs_config is not None: - [ - self.mcs_config.update({f"{name}_{key}": value}) - for key, value in mcs_config.items() - ] + [self.mcs_config.update({f"{name}_{key}": value}) for key, value in mcs_config.items()] super().__init__( prefix=prefix, @@ -168,9 +165,7 @@ class McsCsaxs(SIS38XX): ) if device_manager is None and not sim_mode: - raise MCSError( - "Add DeviceManager to initialization or init with sim_mode=True" - ) + raise MCSError("Add DeviceManager to initialization or init with sim_mode=True") self.name = name self._stream_ttl = 1800 @@ -187,9 +182,7 @@ class McsCsaxs(SIS38XX): self.scaninfo = BecScaninfoMixin(device_manager, sim_mode) # TODO self.scaninfo.username = "e21206" - self.service_cfg = { - "base_path": f"/sls/X12SA/data/{self.scaninfo.username}/Data10/" - } + self.service_cfg = {"base_path": f"/sls/X12SA/data/{self.scaninfo.username}/Data10/"} self.filewriter = FileWriterMixin(self.service_cfg) self._stopped = False self._acquisition_done = False @@ -212,9 +205,7 @@ class McsCsaxs(SIS38XX): self.input_polarity.set(0) self.output_polarity.set(1) self.count_on_start.set(0) - self.mca_names = [ - signal for signal in self.component_names if signal.startswith("mca") - ] + self.mca_names = [signal for signal in self.component_names if signal.startswith("mca")] self.mca_data = defaultdict(lambda: []) for mca in self.mca_names: signal = getattr(self, mca)