added preliminary support for sending ScanInfo to sf_daq, as well as setting detectors/PVs

This commit is contained in:
2020-09-13 18:39:12 +02:00
parent 9b392820ab
commit 71f4a1bb6e
3 changed files with 34 additions and 10 deletions
+15 -4
View File
@@ -12,7 +12,7 @@ from .broker_client import BrokerClient
class SFAcquisition(BaseAcquisition):
def __init__(self, instrument, pgroup, default_channels=None, api_address="http://sf-daq-1:10002", rate_multiplicator=1):
def __init__(self, instrument, pgroup, default_detectors=None, default_channels=None, default_pvs=None, api_address="http://sf-daq-1:10002", rate_multiplicator=1):
self.instrument = instrument
self.pgroup = pgroup
@@ -22,27 +22,38 @@ class SFAcquisition(BaseAcquisition):
default_channel_list = self.paths.default_channel_list
default_channels = Channels(default_channel_list)
self.default_detectors = default_detectors
self.default_channels = default_channels
self.default_pvs = default_pvs
self.api_address = api_address
self.client = BrokerClient(pgroup, address=api_address, rate_multiplicator=rate_multiplicator, client_name="slic")
self.current_task = None
def acquire(self, filename, channels=None, n_pulses=100, wait=True):
def acquire(self, filename, detectors=None, channels=None, pvs=None, scan_info=None, n_pulses=100, wait=True):
if not filename or filename == "/dev/null":
print("Skipping retrieval since no filename was given.")
return
if not detectors:
print("No detectors specified, using default detector list.")
detectors = self.default_detectors
if not channels:
print("No channels specified, using default channel list.")
channels = self.default_channels
if not pvs:
print("No PVs specified, using default PV list.")
pvs = self.default_pvs
client = self.client
client.set_config(n_pulses, filename, channels=channels)
client.set_config(n_pulses, filename, detectors=detectors, channels=channels, pvs=pvs, scan_info=scan_info)
def _acquire():
run_number = self.client.start()
run_number = client.start()
printable_run_number = str(run_number).zfill(6)
filename_pattern = self.paths.raw / filename / f"run_{printable_run_number}.*.h5"
filename_pattern = str(filename_pattern) # json cannot serialize pathlib paths
+14 -3
View File
@@ -9,16 +9,21 @@ from .scaninfo import ScanInfo
class ScanBackend:
def __init__(self, adjustables, values, acquisitions, filename, channels, n_pulses, data_base_dir, scan_info_dir, make_scan_sub_dir, condition):
def __init__(self, adjustables, values, acquisitions, filename, detectors, channels, pvs, n_pulses, data_base_dir, scan_info_dir, make_scan_sub_dir, condition):
self.adjustables = adjustables
self.values = values
self.acquisitions = acquisitions
self.filename = filename
self.detectors = detectors #TODO: only for sf_daq (see also in arguments)
self.channels = channels
self.pvs = pvs #TODO: only for sf_daq (see also in arguments)
self.n_pulses_per_step = n_pulses #TODO: to rename or not to rename?
self.data_base_dir = data_base_dir
self.scan_info = ScanInfo(filename, scan_info_dir, adjustables, values)
self.scan_info = ScanInfo(filename, scan_info_dir, adjustables, values)
self.scan_info_sfdaq = ScanInfo(filename, scan_info_dir, adjustables, values)
self.make_scan_sub_dir = make_scan_sub_dir
self.condition = condition
@@ -72,6 +77,9 @@ class ScanBackend:
step_readbacks = get_all_current_values(self.adjustables)
print("Moved adjustables, starting acquisition")
#TODO: sf_daq needs scan info in advance, filenames are not needed
self.scan_info_sfdaq.append(step_values, step_readbacks, None, step_info)
fn = self.get_filename(n_step)
step_filenames = self.acquire_all(fn)
print("Acquisition done")
@@ -112,7 +120,10 @@ class ScanBackend:
def acquire_all(self, filename):
tasks = []
for acq in self.acquisitions:
t = acq.acquire(filename=filename, channels=self.channels, n_pulses=self.n_pulses_per_step, wait=False)
#TODO: sf_daq expects scan info in advance, and detectors/bs-channels/PVs separated
scan_info = self.scan_info_sfdaq.to_sfdaq_dict()
t = acq.acquire(filename, detectors=self.detectors, channels=self.channels, pvs=self.pvs, scan_info=scan_info, n_pulses=self.n_pulses_per_step, wait=False)
# t = acq.acquire(filename=filename, channels=self.channels, n_pulses=self.n_pulses_per_step, wait=False)
tasks.append(t)
self.current_tasks = tasks
+5 -3
View File
@@ -38,7 +38,8 @@ class Scanner:
self.current_scan = None
def make_scan(self, adjustables, positions, n_pulses, filename, channels=None, acquisitions=(), start_immediately=True, step_info=None):
#TODO: detectors and pvs only for sf_daq
def make_scan(self, adjustables, positions, n_pulses, filename, detectors=None, channels=None, pvs=None, acquisitions=(), start_immediately=True, step_info=None):
"""N-dimensional scan
Parameters:
@@ -53,13 +54,14 @@ class Scanner:
Returns:
ScanBackend: Scan instance.
"""
#TODO: sf_daq counts runs
#TODO: sf_daq counts runs
# filename = self.filename_generator.get_next_run_filename(filename)
if not acquisitions:
acquisitions = self.default_acquisitions
scan = ScanBackend(adjustables, positions, acquisitions, filename, channels, n_pulses=n_pulses, data_base_dir=self.data_base_dir, scan_info_dir=self.scan_info_dir, make_scan_sub_dir=self.make_scan_sub_dir, condition=self.condition)
#TODO: detectors and pvs only for sf_daq
scan = ScanBackend(adjustables, positions, acquisitions, filename, detectors, channels, pvs, n_pulses=n_pulses, data_base_dir=self.data_base_dir, scan_info_dir=self.scan_info_dir, make_scan_sub_dir=self.make_scan_sub_dir, condition=self.condition)
if start_immediately:
scan.run(step_info=step_info)