mirror of
https://github.com/bec-project/ophyd_devices.git
synced 2025-07-10 10:41:53 +02:00
fix: working acquire, line and grid scan using mcs, ddg and eiger9m
This commit is contained in:
@ -301,6 +301,13 @@ class DelayGeneratorDG645(Device):
|
||||
config_storage_name="ddg_config",
|
||||
)
|
||||
|
||||
trigger_width = Component(
|
||||
bec_utils.ConfigSignal,
|
||||
name="trigger_width",
|
||||
kind="config",
|
||||
config_storage_name="ddg_config",
|
||||
)
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
prefix="",
|
||||
@ -348,6 +355,7 @@ class DelayGeneratorDG645(Device):
|
||||
f"{name}_set_high_on_exposure": False,
|
||||
f"{name}_set_high_on_stage": False,
|
||||
f"{name}_set_trigger_source": "SINGLE_SHOT",
|
||||
f"{name}_trigger_width": None,
|
||||
}
|
||||
if ddg_config is not None:
|
||||
[self.ddg_config.update({f"{name}_{key}": value}) for key, value in ddg_config.items()]
|
||||
@ -479,18 +487,19 @@ class DelayGeneratorDG645(Device):
|
||||
if self.set_high_on_exposure.get():
|
||||
self._set_trigger(getattr(TriggerSource, self.set_trigger_source.get()))
|
||||
num_burst_cycle = 1 + self.additional_triggers.get()
|
||||
exp_time = (
|
||||
self.delta_width.get()
|
||||
+ self.scaninfo.num_points
|
||||
* self.scaninfo.frames_per_trigger
|
||||
* (self.scaninfo.exp_time + self.scaninfo.readout_time)
|
||||
|
||||
exp_time = self.delta_width.get() + self.scaninfo.frames_per_trigger * (
|
||||
self.scaninfo.exp_time + self.scaninfo.readout_time
|
||||
)
|
||||
total_exposure = exp_time
|
||||
delay_burst = self.delay_burst.get()
|
||||
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)
|
||||
if not self.trigger_width.get():
|
||||
self.set_channels("width", exp_time)
|
||||
else:
|
||||
self.set_channels("width", self.trigger_width.get())
|
||||
else:
|
||||
self._set_trigger(getattr(TriggerSource, self.set_trigger_source.get()))
|
||||
exp_time = self.delta_width.get() + self.scaninfo.exp_time
|
||||
@ -501,7 +510,10 @@ class DelayGeneratorDG645(Device):
|
||||
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)
|
||||
if not self.trigger_width.get():
|
||||
self.set_channels("width", exp_time)
|
||||
else:
|
||||
self.set_channels("width", self.trigger_width.get())
|
||||
elif self.scaninfo.scan_type == "fly":
|
||||
if self.set_high_on_exposure.get():
|
||||
# define parameters
|
||||
@ -519,7 +531,10 @@ class DelayGeneratorDG645(Device):
|
||||
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)
|
||||
if not self.trigger_width.get():
|
||||
self.set_channels("width", exp_time)
|
||||
else:
|
||||
self.set_channels("width", self.trigger_width.get())
|
||||
else:
|
||||
# define parameters
|
||||
self._set_trigger(getattr(TriggerSource, self.set_trigger_source.get()))
|
||||
@ -531,7 +546,10 @@ class DelayGeneratorDG645(Device):
|
||||
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)
|
||||
if not self.trigger_width.get():
|
||||
self.set_channels("width", exp_time)
|
||||
else:
|
||||
self.set_channels("width", self.trigger_width.get())
|
||||
|
||||
else:
|
||||
raise DDGError(f"Unknown scan type {self.scaninfo.scan_type}")
|
||||
@ -554,7 +572,8 @@ class DelayGeneratorDG645(Device):
|
||||
# if self.scaninfo.scan_type == "step":
|
||||
if self.source.read()[self.source.name]["value"] == int(TriggerSource.SINGLE_SHOT):
|
||||
self.trigger_shot.set(1).wait()
|
||||
status = super().trigger()
|
||||
# status = super().trigger(status=)
|
||||
status = DeviceStatus(self)
|
||||
burst_state = threading.Thread(target=self._check_burst_cycle, args=(status,), daemon=True)
|
||||
burst_state.start()
|
||||
return status
|
||||
|
@ -220,7 +220,7 @@ class Eiger9mCsaxs(DetectorBase):
|
||||
# self.cam.acquire_period.set(
|
||||
# self.scaninfo.exp_time + (self.scaninfo.readout_time - self.reduce_readout)
|
||||
# )
|
||||
self.cam.num_cycles.set(self.scaninfo.num_frames)
|
||||
self.cam.num_cycles.set(int(self.scaninfo.num_points * self.scaninfo.frames_per_trigger))
|
||||
self.cam.num_frames.set(1)
|
||||
|
||||
def _set_trigger(self, trigger_source: TriggerSource) -> None:
|
||||
@ -240,7 +240,10 @@ class Eiger9mCsaxs(DetectorBase):
|
||||
# self._close_file_writer()
|
||||
logger.info(f" std_daq output filepath {self.filepath}")
|
||||
self.std_client.start_writer_async(
|
||||
{"output_file": self.filepath, "n_images": self.scaninfo.num_frames}
|
||||
{
|
||||
"output_file": self.filepath,
|
||||
"n_images": int(self.scaninfo.num_points * self.scaninfo.frames_per_trigger),
|
||||
}
|
||||
)
|
||||
while True:
|
||||
det_ctrl = self.std_client.get_status()["acquisition"]["state"]
|
||||
@ -264,6 +267,11 @@ class Eiger9mCsaxs(DetectorBase):
|
||||
self._prep_file_writer()
|
||||
logger.info("std_daq is ready")
|
||||
|
||||
msg = BECMessage.FileMessage(file_path=self.filepath, done=False)
|
||||
self._producer.set_and_publish(
|
||||
MessageEndpoints.public_file(self.scaninfo.scanID, self.name),
|
||||
msg.dumps(),
|
||||
)
|
||||
msg = BECMessage.FileMessage(file_path=self.filepath, done=False)
|
||||
self._producer.set_and_publish(
|
||||
MessageEndpoints.public_file(self.scaninfo.scanID, self.name),
|
||||
|
@ -230,7 +230,10 @@ class McsCsaxs(SIS38XX):
|
||||
|
||||
self._updated = True
|
||||
self._counter += 1
|
||||
if self._counter == self.num_lines.get():
|
||||
logger.info(f"counter {self._counter}")
|
||||
if (self.scaninfo.scan_type == "fly" and self._counter == self.num_lines.get()) or (
|
||||
self.scaninfo.scan_type == "step" and self._counter == self.scaninfo.num_points
|
||||
):
|
||||
self._acquisition_done = True
|
||||
self.stop_all.put(1, use_complete=False)
|
||||
self._send_data_to_bec()
|
||||
@ -272,12 +275,17 @@ class McsCsaxs(SIS38XX):
|
||||
self._set_trigger(TriggerSource.MODE3)
|
||||
|
||||
def _set_acquisition_params(self) -> None:
|
||||
n_points = self.scaninfo.num_frames / int(self.num_lines.get())
|
||||
if n_points > 9999:
|
||||
if self.scaninfo.scan_type == "step":
|
||||
n_points = self.scaninfo.frames_per_trigger + 1
|
||||
elif self.scaninfo.scan_type == "fly":
|
||||
n_points = self.scaninfo.num_points / int(self.num_lines.get()) + 1
|
||||
else:
|
||||
raise MCSError(f"Scantype {self.scaninfo} not implemented for MCS card")
|
||||
if n_points > 1000:
|
||||
raise MCSError(
|
||||
f"Requested number of points {n_points+1} exceeds hardware limit of 10000 (n+1)"
|
||||
f"Requested number of points N={n_points} exceeds hardware limit of mcs card 10000 (N-1)"
|
||||
)
|
||||
self.num_use_all.set(n_points + 1)
|
||||
self.num_use_all.set(n_points)
|
||||
self.preset_real.set(0)
|
||||
|
||||
def _set_trigger(self, trigger_source: TriggerSource) -> None:
|
||||
|
Reference in New Issue
Block a user