DAQ: now use config/redis to save smart_params and better choose when to use smart_params. filename connected for automation

This commit is contained in:
2025-11-18 16:29:53 +01:00
parent b0b48638ff
commit af8a715f70
+56 -47
View File
@@ -63,10 +63,6 @@ class AareDAQ:
self.__bl = bl.value.upper()
self.__aare = AareWrapper(bl)
self.__saved_box = None
self.crystal_size = CrystalSize(x=0,y=0,z=0)
self.last_best_b_factor = None
self.last_best_res = None
self.auto_params = SimpleScanParameters()
@property
def state(self) -> BeamlineStateEnum:
@@ -91,22 +87,23 @@ class AareDAQ:
self.last_time = end - start
@property
def smart_params(self) -> SimpleScanParameters:
return self.auto_params
def spreadsheet_params(self) -> tuple[Optional[SimpleScanParameters], None]:
file_prefix = None
@smart_params.setter
def smart_params(self, params: SimpleScanParameters):
self.auto_params = params
def spreadsheet_params(self) -> Optional[SimpleScanParameters]:
if self.status.sample is None:
return None
logger.debug(f"generate params for sample: {self.status.sample}")
aaredb_params = self.status.sample.aaredb_params if hasattr(self.status.sample, "aaredb_params") else None
if aaredb_params is None:
return None
return None, file_prefix
logger.debug(f"generate params for sample: {self.status.sample}")
aaredb_params = self.status.sample.aaredb_params if hasattr(self.status.sample, "aaredb_params") else None
if aaredb_params is None:
return None, file_prefix
if aaredb_params.directory:
file_prefix = aaredb_params.directory
logger.debug(f"aaredb_params.directory: {aaredb_params.directory}, file_prefix: {file_prefix}")
if (
getattr(aaredb_params, 'exposure', None) is None
and getattr(aaredb_params, 'transmission', None) is None
@@ -114,7 +111,7 @@ class AareDAQ:
and getattr(aaredb_params, 'totalrange', None) is None
and getattr(aaredb_params, 'targetresolution', None) is None
):
return None
return None, file_prefix
params = SimpleScanParameters()
@@ -133,8 +130,6 @@ class AareDAQ:
osc = getattr(aaredb_params, 'oscillation', None)
total = getattr(aaredb_params, 'totalrange', None)
default_osc = SimpleScanParameters().incr_omega_deg
if osc is not None:
osc = abs(osc)
if osc > 0:
@@ -144,10 +139,14 @@ class AareDAQ:
else:
params.steps = round(360.0 / osc)
elif total is not None and abs(total) > 0:
default_osc = SimpleScanParameters().incr_omega_deg
params.incr_omega_deg = default_osc
params.steps = round(abs(total) / default_osc)
return params
if file_prefix:
params.file_prefix = file_prefix
return params, file_prefix
@property
@@ -393,9 +392,9 @@ class AareDAQ:
curr_sample_is_manual = False
logger.info(f"current sample: {curr_sample}")
logger.info(f"new target is: {target}")
self.crystal_size = CrystalSize(x=0, y=0, z=0)
self.last_best_b_factor = None
self.last_best_res = None
self.__cfg.crystal_size = CrystalSize(x=0, y=0, z=0)
self.__cfg.last_best_b_factor = None
self.__cfg.last_best_res = None
self.__cfg.xrf = None
if curr_sample is not None and curr_sample.location is None:
@@ -535,8 +534,11 @@ class AareDAQ:
self.__devs.abr_pos = self.__cfg.abr_meas_pos
result = self.__jfjoch.wait_till_done(60)
#if self.sample is not None and self.sample.db_id is not None:
# self.__aare.ingest_gridscan(self.sample, result, r)
if self.sample is not None and self.sample.db_id is not None and result is not None:
try:
self.__aare.ingest_gridscan(self.sample, result, r)
except Exception as e:
logger.error(f"Error ingesting grid scan to database: {e}")
images = result.images
output_data = {
@@ -544,6 +546,7 @@ class AareDAQ:
'scan_results': [image.model_dump() for image in images],
'total_results': len([image for image in images])
}
if self.sample is not None and self.sample.db_id is not None:
if r.n_x == 1:
filename=f'{self.sample.db_id}_scan_results_vertical.json'
@@ -557,7 +560,7 @@ class AareDAQ:
result_array = create_quality_filtered_array(images, 'spots_low_res', min_spots=None,
min_efficiency=1.0, min_background=None, min_low_res_spots=10.0)
self.crystal_size = get_xtal_size(self.crystal_size, result_array, r)
self.__cfg.crystal_size = get_xtal_size(self.__cfg.crystal_size, result_array, r)
grid_mm_x, grid_mm_y, com = raster_centre_of_mass(result_array, r)
if grid_mm_x is None or grid_mm_y is None:
@@ -572,22 +575,22 @@ class AareDAQ:
else:
result_list = get_result_list_from_com(images, com)
print(result_list)
self.last_best_b_factor = get_best_b_factor(result_list)
self.last_best_res = get_best_res(result_list)
print("b_factor: ", self.last_best_b_factor, " best_res: ", self.last_best_res)
self.__cfg.last_best_b_factor = get_best_b_factor(result_list)
self.__cfg.last_best_res = get_best_res(result_list)
logger.debug("b_factor: ", self.__cfg.last_best_b_factor, " best_res: ", self.__cfg.last_best_res)
new_delta_mm = self.sample_geometry.smargon_nudge(Coordinate(x=grid_mm_x, y=grid_mm_y))
else:
new_delta_mm = None
print('after centre_of_mass')
logger.debug('after centre_of_mass')
if new_delta_mm is not None:
print(f'{time.ctime()}, moving SMARGON to target new delta mm {r.smargon.sh_mm + new_delta_mm} mm')
logger.debug(f'{time.ctime()}, moving SMARGON to target new delta mm {r.smargon.sh_mm + new_delta_mm} mm')
self.__devs.smargon.target = SmargonCoordinate(sh_mm=r.smargon.sh_mm + new_delta_mm,
phi_deg=r.smargon.phi_deg,
chi_deg=r.smargon.chi_deg)
else:
print("Auto finding optimal image failed due to no images found. Using previous position.")
logger.debug("Auto finding optimal image failed due to no images found. Using previous position.")
self.__devs.smargon.target = save_smargon_position
return CompletedRasterGridElem(request=copy.deepcopy(r), result=result)
@@ -601,6 +604,8 @@ class AareDAQ:
raster_result = self.__raster(r)
result = CompletedRasterGrid(r=[raster_result])
self.__set_state(BeamlineStateEnum.SampleAlignment)
if self.sample is not None and self.sample.db_id is not None:
self.save_screenshot_db(self.sample.db_id, f"after_raster_{r.omega_deg}deg")
self.__cfg.state_busy = False
return result
except Exception as e:
@@ -612,7 +617,8 @@ class AareDAQ:
if request.dtz is not None:
logger.info(f'requesting dtz to move to {request.dtz}')
self.__cfg.dtz = request.dtz
self.save_screenshot_db(self.sample.db_id, f"pre_rotation{self.sample.db_id}_{self.__devs.zoom}")
if self.sample is not None and self.sample.db_id is not None:
self.save_screenshot_db(self.sample.db_id, f"pre_rotation{self.sample.db_id}_{self.__devs.zoom}")
self.__set_state(BeamlineStateEnum.DataCollection)
if request.transmission is not None:
@@ -1260,22 +1266,25 @@ class AareDAQ:
return params
def get_collection_params(self, prefer_smart: bool = False) -> tuple[SimpleScanParameters, str]:
spreadsheet_params = self.spreadsheet_params()
spreadsheet_params, file_prefix = self.spreadsheet_params()
logger.debug(f"spreadsheet_params: {spreadsheet_params}")
smart_params = self.__cfg.auto_params
#self.__aare.send_msg_to_db(self.sample,event_type=SampleEventType(''), comment=f'smart_params: {smart_params}')
if prefer_smart:
# Smart params priority
if self.smart_params:
return self.smart_params, "smart_params"
if smart_params:
if file_prefix:
smart_params.file_prefix = file_prefix
return smart_params, "smart_params"
if spreadsheet_params:
return spreadsheet_params, "spreadsheet_params"
else:
# Spreadsheet params priority (current default)
if spreadsheet_params:
return spreadsheet_params, "spreadsheet_params"
if self.smart_params:
return self.smart_params, "smart_params"
if smart_params:
if file_prefix:
smart_params.file_prefix = file_prefix
return smart_params, "smart_params"
# Fallback to defaults
return SimpleScanParameters(exp_time_s=0.04, dtz=110, incr_omega_deg=0.2), "defaults"
def measure(self, sample: SampleShortInfo) -> float:
@@ -1313,7 +1322,7 @@ class AareDAQ:
hex_string = secrets.token_hex(3) # 3 bytes = 6 hex characters
print(hex_string.upper())
#self.__ml_bounding_box(sample.db_id, f"ml_{geom.omega_deg:.2f}deg")
raster_params = self.get_auto_raster_params()
if self.__auto_center(RasterGridRequest(
exp_time_s=raster_params.exp_time_s,
@@ -1330,7 +1339,7 @@ class AareDAQ:
params, source = self.get_collection_params(prefer_smart=False)
logger.info(f"Using {source} for data collection: {params}")
self.__cfg.zoom_mode = ZoomModeEnum.User
#self.__cfg.zoom_mode = ZoomModeEnum.User
self.__devs.samcam_settings = self.__cfg.zoom_settings.get_camera_settings(self.zoom)
self.__devs.dtz.move(params.dtz, wait=True)
if self.omega + 180 < 720:
@@ -1508,9 +1517,9 @@ class AareDAQ:
session=SessionStatus(),
diffraction=self.diffraction_geometry,
box=self.__saved_box,
last_best_res = self.last_best_res,
last_best_b_factor = self.last_best_b_factor,
crystal_size = self.crystal_size
last_best_res = self.__cfg.last_best_res,
last_best_b_factor = self.__cfg.last_best_b_factor,
crystal_size = self.__cfg.crystal_size
)
def cancel(self):