add check for xmap to trigger

This commit is contained in:
gac-x07mb
2024-12-20 11:40:26 +01:00
parent feb911ab68
commit 010fefd11d
5 changed files with 76 additions and 15 deletions

View File

@ -89,7 +89,10 @@ class PhoenixTriggerSetup(CustomDetectorMixin):
# TODO Test the proper check for the falcon state # TODO Test the proper check for the falcon state
# Check first that falcon is set to acquiring # Check first that falcon is set to acquiring
falcon = self.parent.device_manager.devices.get("falcon_nohdf5", None) # get device
# check for falcon
falcon = self.parent.device_manager.devices.get("falcon", None) # get device
timeout = 1 timeout = 1
if falcon is not None: if falcon is not None:
# TODO Check that falcon.state.get() == 1 is the correct check. # TODO Check that falcon.state.get() == 1 is the correct check.
@ -102,6 +105,20 @@ class PhoenixTriggerSetup(CustomDetectorMixin):
f"Device {self.parent.name} is not ready to take trigger, timeout due to waiting for Falcon to get ready. Timeout after {timeout}s" f"Device {self.parent.name} is not ready to take trigger, timeout due to waiting for Falcon to get ready. Timeout after {timeout}s"
) )
xmap = self.parent.device_manager.devices.get("xmap", None) # get device
timeout = 1
if xmap is not None:
# TODO Check that falcon.state.get() == 1 is the correct check.
# --> When is the falcon acquiring, this assumes 1?
# self.wait_for_signals is defined in PSI_detector_base.CustomDetectorMixin
#
if not self.wait_for_signals([(xmap.state.get, 1)], timeout=timeout):
raise PhoenixTriggerError(
f"Device {self.parent.name} is not ready to take trigger, timeout due to waiting for xmap to get ready. Timeout after {timeout}s"
)
if self.parent.scaninfo.scan_type == "step": if self.parent.scaninfo.scan_type == "step":
time.sleep(0.2) time.sleep(0.2)
self.parent.smpl.put(1) self.parent.smpl.put(1)
@ -232,6 +249,15 @@ class PhoenixTrigger(PSIDetectorBase):
EpicsSignalRO, "SMPL-DONE", kind=Kind.config EpicsSignalRO, "SMPL-DONE", kind=Kind.config
) # show trigger is done, consider using string=True ) # show trigger is done, consider using string=True
ph_start_csmpl = start_csmpl
ph_intr_count = intr_count
ph_total_cycles = total_cycles
ph_smpl = smpl
ph_smpl_done = smpl_done
# create subset in name spacs
def help(self): def help(self):
""" """
Help function for phoenix_trigger Help function for phoenix_trigger
@ -268,9 +294,18 @@ class PhoenixTrigger(PSIDetectorBase):
dev.PH_TTL.total_cycles.set(1) dev.PH_TTL.total_cycles.set(1)
For further general help try the attributes For further general help try the attributes
.describe() .describe_confguration() .summary() .describe() considered as stable dict
.describe_confguration()
.summary()
._config ._info ._config ._info
Important channel are collected with prefix ph, to ease finding of the channels
for example
dev.PH_TTl.ph_total_cycles = dev.PH_TTl.total_cycles
.. etc
""" """
print("Name of device is", self.name) print("Name of device is", self.name)

View File

@ -94,12 +94,14 @@ class XMAPSetup(CustomDetectorMixin):
def update_readout_time(self) -> None: def update_readout_time(self) -> None:
"""Set readout time for Eiger9M detector""" """Set readout time for Eiger9M detector"""
"""
readout_time = ( readout_time = (
self.parent.scaninfo.readout_time self.parent.scaninfo.readout_time
if hasattr(self.parent.scaninfo, "readout_time") if hasattr(self.parent.scaninfo, "readout_time")
else self.parent.MIN_READOUT else self.parent.MIN_READOUT
) )
self.parent.readout_time = max(readout_time, self.parent.MIN_READOUT) self.parent.readout_time = max(readout_time, self.parent.MIN_READOUT)
"""
def initialize_detector(self) -> None: def initialize_detector(self) -> None:
"""Initialize XMAP detector""" """Initialize XMAP detector"""
@ -141,9 +143,12 @@ class XMAPSetup(CustomDetectorMixin):
# self.parent.nd_array_mode.put(1) # self.parent.nd_array_mode.put(1)
def on_stage(self) -> None: def on_stage(self) -> None:
"""Prepare detector and backend for acquisition""" """
Prepare detector and backend for acquisition
"""
# staging for XMAP as used in FDA # staging for XMAP as used in FDA
self.parent.stop_all.set(1) self.parent.stop_all.set(1)
time.sleep(0.05) time.sleep(0.05)
self.parent.collect_mode.set(0) self.parent.collect_mode.set(0)
@ -159,7 +164,9 @@ class XMAPSetup(CustomDetectorMixin):
# self.arm_acquisition() time.sleep(0.05) # self.arm_acquisition() time.sleep(0.05)
def prepare_detector(self) -> None: def prepare_detector(self) -> None:
"""Prepare detector for acquisition""" """Prepare detector for acquisition.. originally called from on stage """
pass
"""
self.set_trigger( self.set_trigger(
mapping_mode=MappingSource.MAPPING, trigger_source=TriggerSource.GATE, ignore_gate=0 mapping_mode=MappingSource.MAPPING, trigger_source=TriggerSource.GATE, ignore_gate=0
) )
@ -167,9 +174,10 @@ class XMAPSetup(CustomDetectorMixin):
self.parent.pixels_per_run.put( self.parent.pixels_per_run.put(
int(self.parent.scaninfo.num_points * self.parent.scaninfo.frames_per_trigger) int(self.parent.scaninfo.num_points * self.parent.scaninfo.frames_per_trigger)
) )
"""
def prepare_data_backend(self) -> None: def prepare_data_backend(self) -> None:
"""Prepare data backend for acquisition""" """Prepare data backend for acquisition.. originally called from on_stage """
pass pass
""" -------------------------------------------------------------- """ --------------------------------------------------------------
self.parent.filepath.set( self.parent.filepath.set(
@ -190,7 +198,9 @@ class XMAPSetup(CustomDetectorMixin):
""" """
def arm_acquisition(self) -> None: def arm_acquisition(self) -> None:
"""Arm detector for acquisition""" """Arm detector for acquisition called fron on stage """
pass
"""
self.parent.start_all.put(1) self.parent.start_all.put(1)
signal_conditions = [ signal_conditions = [
( (
@ -207,6 +217,7 @@ class XMAPSetup(CustomDetectorMixin):
raise XMAPTimeoutError( raise XMAPTimeoutError(
f"Failed to arm the acquisition. Detector state {signal_conditions[0][0]}" f"Failed to arm the acquisition. Detector state {signal_conditions[0][0]}"
) )
"""
def on_unstage(self) -> None: def on_unstage(self) -> None:
"""Unstage detector and backend""" """Unstage detector and backend"""
@ -222,11 +233,11 @@ class XMAPSetup(CustomDetectorMixin):
def on_stop(self) -> None: def on_stop(self) -> None:
"""Stop detector and backend""" """Stop detector and backend"""
self.stop_detector() self.stop_detector()
# self.stop_detector_backend() # self.stop_detector_backend()
def stop_detector(self) -> None: def stop_detector(self) -> None:
"""Stops detector""" """Stops detector called from on _sttop"""
self.parent.stop_all.put(1) self.parent.stop_all.put(1)
self.parent.erase_all.put(1) self.parent.erase_all.put(1)
@ -244,11 +255,11 @@ class XMAPSetup(CustomDetectorMixin):
def stop_detector_backend(self) -> None: def stop_detector_backend(self) -> None:
"""Stop the detector backend""" """Stop the detector backend"""
# self.parent.hdf5.capture.put(0) self.parent.hdf5.capture.put(0)
w = 0
def finished(self, timeout: int = 5) -> None: def finished(self, timeout: int = 5) -> None:
"""Check if scan finished succesfully""" """Check if scan finished succesfully called fon on _complete """
with self._lock: with self._lock:
total_frames = int( total_frames = int(
self.parent.scaninfo.num_points * self.parent.scaninfo.frames_per_trigger self.parent.scaninfo.num_points * self.parent.scaninfo.frames_per_trigger
@ -269,26 +280,30 @@ class XMAPSetup(CustomDetectorMixin):
f" {total_frames}" f" {total_frames}"
) )
self.stop_detector() self.stop_detector()
self.stop_detector_backend() self.stop_detector_backend()
def set_trigger( def set_trigger(
self, mapping_mode: MappingSource, trigger_source: TriggerSource, ignore_gate: int = 0 self, mapping_mode: MappingSource, trigger_source: TriggerSource, ignore_gate: int = 0
) -> None: ) -> None:
""" """
Set triggering mode for detector Set triggering mode for finisheddetector
Args: Args:
mapping_mode (MappingSource): Mapping mode for the detector mapping_mode (MappingSource): Mapping mode for the detector
trigger_source (TriggerSource): Trigger source for the detector, pixel_advance_signal trigger_source (TriggerSource): Trigger source for the detector, pixel_advance_signal
ignore_gate (int): Ignore gate from TTL signal; defaults to 0 ignore_gate (int): Ignore gate from TTL signal; defaults to 0
"""
pass
""" """
mapping = int(mapping_mode) mapping = int(mapping_mode)
trigger = trigger_source trigger = trigger_source
self.parent.collect_mode.put(mapping) self.parent.collect_mode.put(mapping)
self.parent.pixel_advance_mode.put(trigger) self.parent.pixel_advance_mode.put(trigger)
self.parent.ignore_gate.put(ignore_gate) self.parent.ignore_gate.put(ignore_gate)
"""
class XMAPPhoenix(PSIDetectorBase, xMAP): class XMAPPhoenix(PSIDetectorBase, xMAP):
""" """
@ -336,3 +351,5 @@ class XMAPPhoenix(PSIDetectorBase, xMAP):
ph_preset_live = xMAP.preset_live_time ph_preset_live = xMAP.preset_live_time
ph_elapsed_real = xMAP.elapsed_real ph_elapsed_real = xMAP.elapsed_real
ph_elapsed_live = xMAP.elapsed_live ph_elapsed_live = xMAP.elapsed_live

View File

@ -0,0 +1,7 @@
import time
from phoenix_bec.scripts.phoenix import PhoenixBL
from ophyd import Component as Cpt
import phoenix_bec.devices.phoenix_trigger as pt
trig = pt.PhoenixTrigger(name="phoenixTrigger", prefix="X07MB-OP2:")

View File

@ -2,7 +2,7 @@
# creates newly # creates newly
ff = 0 ff = 0W
falcon = 0 falcon = 0
from ophyd import Component as Cpt from ophyd import Component as Cpt
@ -12,7 +12,7 @@ xmap = ff.XMAPPhoenix(name="xmap", prefix="X07MB-XMAP:")
# xmap = ff.FalconPhoenix(name="falcon_hdf5", prefix="X07MB-XMAP:") # xmap = ff.FalconPhoenix(name="falcon_hdf5", prefix="X07MB-XMAP:")
# make a 'get to read all epics channels # make a 'get to read all epics channels
# there will be an error message, if device contains a channel whcih does not exist # there will be an error message, if device contains a channel whcih does not exist
w = xmap.read() #w = xmap.read()
# phoenix_bec / local_scripts / Code_to_test_devices / test_falcon.py # phoenix_bec / local_scripts / Code_to_test_devices / test_falcon.py

View File

@ -34,6 +34,7 @@ import sys
# create PHOENIX base configuration # create PHOENIX base configuration
phoenix.create_base_config() phoenix.create_base_config()
phoenix.add_xmap()
dev.MA1_ScanX.enabled = True dev.MA1_ScanX.enabled = True
print("---------------------------------") print("---------------------------------")
@ -47,6 +48,7 @@ ti = tt.time_ns()
phoenix.run_shell("sh monitor.sh > monitor.out & ") phoenix.run_shell("sh monitor.sh > monitor.out & ")
dev.PP2_VO5.enabled = True dev.PP2_VO5.enabled = True
dev.MA1_ScanX.enabled = True dev.MA1_ScanX.enabled = True
#dev.xmap.enabled = True
""" """
s1 = scans.line_scan( s1 = scans.line_scan(