Fixed file_path, added file_prefix

This commit is contained in:
gac-x05la
2025-02-04 17:58:39 +01:00
parent a78077139a
commit 3b599dc062
3 changed files with 60 additions and 30 deletions

View File

@@ -10,6 +10,7 @@ import json
from time import sleep from time import sleep
from threading import Thread from threading import Thread
import requests import requests
import os
from ophyd import Device, Signal, Component, Kind, Staged from ophyd import Device, Signal, Component, Kind, Staged
from ophyd.status import SubscriptionStatus from ophyd.status import SubscriptionStatus
@@ -20,6 +21,7 @@ from websockets.exceptions import ConnectionClosedOK, ConnectionClosedError
from ophyd_devices.interfaces.base_classes.psi_detector_base import PSIDetectorBase as PSIDeviceBase from ophyd_devices.interfaces.base_classes.psi_detector_base import PSIDetectorBase as PSIDeviceBase
from ophyd_devices.interfaces.base_classes.psi_detector_base import CustomDetectorMixin as CustomDeviceMixin from ophyd_devices.interfaces.base_classes.psi_detector_base import CustomDetectorMixin as CustomDeviceMixin
from bec_lib import bec_logger from bec_lib import bec_logger
from bec_lib.file_utils import FileWriter
logger = bec_logger.logger logger = bec_logger.logger
@@ -47,7 +49,21 @@ class StdDaqMixin(CustomDeviceMixin):
if 'nr_writers' in scanargs and scanargs['nr_writers'] != None: if 'nr_writers' in scanargs and scanargs['nr_writers'] != None:
d['nr_writers'] = scanargs['nr_writers'] d['nr_writers'] = scanargs['nr_writers']
if 'file_path' in scanargs and scanargs['file_path']!=None: if 'file_path' in scanargs and scanargs['file_path']!=None:
self.parent.file_path.set(scanargs['file_path']).wait() self.parent.file_path.set(scanargs['file_path'].replace('data','gpfs')).wait()
print(scanargs['file_path'])
if os.path.isdir(scanargs['file_path']):
print("isdir")
pass
else:
print("creating")
try:
os.makedirs(scanargs['file_path'], 0o777)
os.system('chmod -R 777 ' + scanargs['base_path'])
except:
print('Problem with creating folder')
if 'file_prefix' in scanargs and scanargs['file_prefix']!=None:
print(scanargs['file_prefix'])
self.parent.file_prefix.set(scanargs['file_prefix']).wait()
if "daq_num_points" in scanargs: if "daq_num_points" in scanargs:
d["num_points_total"] = scanargs["daq_num_points"] d["num_points_total"] = scanargs["daq_num_points"]
@@ -138,7 +154,8 @@ class StdDaqClient(PSIDeviceBase):
runstatus = Component(Signal, value="unknown", kind=Kind.normal, metadata={'write_access': False}) runstatus = Component(Signal, value="unknown", kind=Kind.normal, metadata={'write_access': False})
num_images = Component(Signal, value=10000, kind=Kind.config) num_images = Component(Signal, value=10000, kind=Kind.config)
file_path = Component(Signal, value="/gpfs/test/test-beamline", kind=Kind.config) file_path = Component(Signal, value="/gpfs/test/test-beamline", kind=Kind.config)
# Configuration attributes file_prefix = Component(Signal, value="file", kind=Kind.config)
# Configuration attributes
rest_url = Component(Signal, kind=Kind.config, metadata={'write_access': False}) rest_url = Component(Signal, kind=Kind.config, metadata={'write_access': False})
cfg_detector_name = Component(Signal, kind=Kind.config) cfg_detector_name = Component(Signal, kind=Kind.config)
cfg_detector_type = Component(Signal, kind=Kind.config) cfg_detector_type = Component(Signal, kind=Kind.config)
@@ -245,6 +262,7 @@ class StdDaqClient(PSIDeviceBase):
nr_writers: int, optional nr_writers: int, optional
Number of writers [int]. Number of writers [int].
""" """
# Configuration parameters # Configuration parameters
if 'image_width' in d and d['image_width']!=None: if 'image_width' in d and d['image_width']!=None:
self.cfg_pixel_width.set(d['image_width']).wait() self.cfg_pixel_width.set(d['image_width']).wait()
@@ -257,8 +275,6 @@ class StdDaqClient(PSIDeviceBase):
# Run parameters # Run parameters
if 'num_points_total' in d: if 'num_points_total' in d:
self.num_images.set(d['num_points_total']).wait() self.num_images.set(d['num_points_total']).wait()
if 'file_path' in d and d['file_path']!=None:
self.file_path.set(d['file_path']).wait()
# Restart the DAQ if resolution changed # Restart the DAQ if resolution changed
cfg = self.get_daq_config() cfg = self.get_daq_config()
@@ -288,10 +304,8 @@ class StdDaqClient(PSIDeviceBase):
it for obvious failures. it for obvious failures.
""" """
# Can't stage into a running exposure # Can't stage into a running exposure
print('Before')
if self.state() != 'idle': if self.state() != 'idle':
raise RuntimeError(f"[{self.name}] stdDAQ can't stage from state: {self.state()}") raise RuntimeError(f"[{self.name}] stdDAQ can't stage from state: {self.state()}")
print('After')
# Must make sure that image size matches the data source # Must make sure that image size matches the data source
if self.data_source_name is not None: if self.data_source_name is not None:
@@ -308,10 +322,12 @@ class StdDaqClient(PSIDeviceBase):
file_path = self.file_path.get() file_path = self.file_path.get()
num_images = self.num_images.get() num_images = self.num_images.get()
file_prefix = self.file_prefix.get()
print(file_prefix)
# New connection # New connection
self._wsclient = self.connect() self._wsclient = self.connect()
message = {"command": "start", "path": file_path, "n_image": num_images, } message = {"command": "start", "path": file_path, "file_prefix": file_prefix, "n_image": num_images, }
reply = self.message(message) reply = self.message(message)
if reply is not None: if reply is not None:
@@ -413,7 +429,7 @@ class StdDaqClient(PSIDeviceBase):
if r.status_code != 200: if r.status_code != 200:
raise ConnectionError(f"[{self.name}] Error {r.status_code}:\t{r.text}") raise ConnectionError(f"[{self.name}] Error {r.status_code}:\t{r.text}")
# Wait for service to restart (and connect to make sure) # Wait for service to restart (and connect to make sure)
sleep(settle_time) #sleep(settle_time)
self.connect() self.connect()
return r.json() return r.json()
@@ -423,16 +439,15 @@ class StdDaqClient(PSIDeviceBase):
""" """
url = self.rest_url.get() + '/api/h5/create_interleaved_vds' url = self.rest_url.get() + '/api/h5/create_interleaved_vds'
file_path = self.file_path.get() file_path = self.file_path.get()
file_prefix = self.file_prefix.get()
r = requests.post( r = requests.post(
url, url,
params = {'user': 'ioc'}, params = {'user': 'ioc'},
data = {'base_path': file_path, 'output_file': 'fede_virtual_test'}, json = {'base_path': file_path, 'file_prefix': file_prefix, 'output_file': file_prefix.rstrip('_') + '.h5'},
timeout = 2, timeout = 2,
headers = {'Content-type': 'application/json'} headers = {'Content-type': 'application/json'}
) )
print(r)
print(file_path)
def nuke(self, restarttime=5): def nuke(self, restarttime=5):
""" Reconfigures the stdDAQ to restart the services. This causes """ Reconfigures the stdDAQ to restart the services. This causes

View File

@@ -4,7 +4,6 @@ import numpy as np
from bec_lib.device import DeviceBase from bec_lib.device import DeviceBase
from bec_server.scan_server.scans import Acquire, AsyncFlyScanBase from bec_server.scan_server.scans import Acquire, AsyncFlyScanBase
class AcquireDark(Acquire): class AcquireDark(Acquire):
scan_name = "acquire_dark" scan_name = "acquire_dark"
required_kwargs = ["exp_burst"] required_kwargs = ["exp_burst"]

View File

@@ -26,13 +26,10 @@ class Measurement:
""" """
Build and set filename for bec and stddaq Build and set filename for bec and stddaq
""" """
bec.system_config.file_suffix = self.sample_name #bec.system_config.file_suffix = self.sample_name
bec.system_config.file_directory = os.path.join(self.data_path,self.sample_name) self.scan_sample_name = 'S' + str(bec.queue.next_scan_number) + '_' + self.sample_name
self.file_path = '/data/test/test-beamline/test_fede' print(self.scan_sample_name)
if os.path.isdir(self.file_path): bec.system_config.file_directory = os.path.join(self.data_path,self.sample_name,self.scan_sample_name)
pass
else:
os.mkdir(self.file_path)
def configure(self,sample_name=None, data_path=None, exposure_time=None, def configure(self,sample_name=None, data_path=None, exposure_time=None,
exposure_period=None, roix=None, roiy=None,nimages=None, exposure_period=None, roix=None, roiy=None,nimages=None,
@@ -84,9 +81,27 @@ class Measurement:
self.roiy = roiy self.roiy = roiy
self.build_filename() self.build_filename()
def show_all(self):
"""
Show configuration
TODO: check active devices, write the config for each device and if none read from device
"""
print("Sample name: " + self.sample_name)
print("Data path: " + self.data_path)
print("Number of images: " + str(self.nimages))
print("Number of darks: " + str(self.nimages_dark))
print("Number of flats: " + str(self.nimages_white))
print("Exposure time: " + str(self.exposure_time))
print("Exposure period: " + str(self.exposure_period))
print("Roix: " + str(self.roix))
print("Roiy: " + str(self.roiy))
def acquire_darks(self,nimages_dark, exposure_time=None, exposure_period=None, def acquire_darks(self,nimages_dark, exposure_time=None, exposure_period=None,
roix=None, roiy=None, acq_mode=None, file_path=None): roix=None, roiy=None, acq_mode=None):
""" """
Acquire a set of dark images with shutters closed. Acquire a set of dark images with shutters closed.
@@ -104,8 +119,6 @@ class Measurement:
ROI size in the y-direction [pixels] ROI size in the y-direction [pixels]
acq_mode : str, optional acq_mode : str, optional
Predefined acquisition mode (default=None) Predefined acquisition mode (default=None)
file_path : str, optional
File path for standard daq (default=None)
Example: Example:
-------- --------
@@ -150,14 +163,17 @@ class Measurement:
self.roix = roix self.roix = roix
if roiy != None: if roiy != None:
self.roiy = roiy self.roiy = roiy
if file_path!=None: # To add folder with device name
if os.path.isdir(file_path): file_path = os.path.join('/data/test/test-beamline',bec.system_config.file_directory, '_device_dat') # _device_dat does not work for now.
pass print(file_path)
else: # A hack for now
os.mkdir(file_path) base_path = os.path.join('/data/test/test-beamline',self.data_path)
print(base_path)
file_prefix = self.scan_sample_name + '_data_dark_' # to add device name
print(file_prefix)
### TODO: camera reset ### TODO: camera reset
print("Handing over to 'scans.acquire_dark") print("Handing over to 'scans.acquire_dark")
scans.acquire_dark(exp_burst=nimages_dark, exp_time=self.exposure_time, exp_period=self.exposure_period, image_width=self.roix, scans.acquire_dark(exp_burst=nimages_dark, exp_time=self.exposure_time, exp_period=self.exposure_period, image_width=self.roix,
image_height=self.roiy, acq_mode=acq_mode, file_path=file_path, nr_writers=2) image_height=self.roiy, acq_mode=acq_mode, file_path=file_path, nr_writers=2, base_path=base_path,
file_prefix=file_prefix)