diff --git a/debye_bec/devices/pilatus/pilatus.py b/debye_bec/devices/pilatus/pilatus.py index c30b44d..5326417 100644 --- a/debye_bec/devices/pilatus/pilatus.py +++ b/debye_bec/devices/pilatus/pilatus.py @@ -83,12 +83,18 @@ class TRIGGERMODE(int, enum.Enum): MULT_TRIGGER = 3 ALIGNMENT = 4 -class MONO_TRIGGER_SOURCE(int, enum.Enum): +class MONOTRIGGERSOURCE(int, enum.Enum): """"Mono XRD trigger source""" EPICS = 0 INPOS = 1 +class MONOTRIGGERMODE(int, enum.Enum): + """"Mono XRD trigger mode""" + + PULSE = 0 + CONDITION = 1 + def description(self) -> str: """Return a description of the trigger mode.""" @@ -181,8 +187,24 @@ class Pilatus(PSIDeviceBase, ADBase): write_pv="X01DA-OP-MO1:BRAGG:xrd_trig_len", add_prefix=("a",), kind=Kind.omitted, + doc="Trigger Period in seconds", + ) + trigger_period = Cpt( + EpicsSignal, + read_pv="X01DA-OP-MO1:BRAGG:xrd_trig_period_RBV", + write_pv="X01DA-OP-MO1:BRAGG:xrd_trig_period", + add_prefix=("a",), + kind=Kind.omitted, doc="Trigger Pulse Length in seconds", ) + trigger_n_of = Cpt( + EpicsSignal, + read_pv="X01DA-OP-MO1:BRAGG:xrd_n_of_trig_RBV", + write_pv="X01DA-OP-MO1:BRAGG:xrd_n_of_trig", + add_prefix=("a",), + kind=Kind.omitted, + doc="Number of trigger to generate for each request", + ) preview = Cpt( PreviewSignal, name="preview", @@ -453,15 +475,21 @@ class Pilatus(PSIDeviceBase, ADBase): self.n_images = (total_trig_lo + total_trig_hi) * self.scan_parameter.n_of_trigger exp_time = self.scan_parameter.exp_time - self.trigger_source.set(MONO_TRIGGER_SOURCE.INPOS).wait(5) + self.trigger_source.set(MONOTRIGGERSOURCE.INPOS).wait(5) + self.trigger_n_of.set(self.scan_parameter.n_of_trigger).wait(5) elif scan_msg.scan_type == 'step': self.n_images = scan_msg.num_points * scan_msg.scan_parameters.get("frames_per_trigger", 1) exp_time = scan_msg.scan_parameters.get("exp_time") - self.trigger_source.set(MONO_TRIGGER_SOURCE.EPICS).wait(5) + self.trigger_source.set(MONOTRIGGERSOURCE.EPICS).wait(5) + self.trigger_n_of.set(1).wait(5) # BEC will trigger each acquisition else: return None # Common settings + self.trigger_mode.set(MONOTRIGGERMODE.PULSE).wait(5) + self.trigger_period.set(exp_time).wait(5) + self.trigger_pulse_length.set(0.005).wait(5) # Pulse length of 5 ms enough for Pilatus and NIDAQ + if exp_time - self._readout_time <= 0: raise ValueError((f"Exposure time {exp_time} is too short ", f"for Pilatus with readout_time {self._readout_time}."