diff --git a/daq/src/aaredaq/daq.py b/daq/src/aaredaq/daq.py index e2e16fe7..03c3b6b7 100644 --- a/daq/src/aaredaq/daq.py +++ b/daq/src/aaredaq/daq.py @@ -288,6 +288,34 @@ class AareDAQ: def list_loaded_pucks(self) -> List[PuckLoadedInfo]: return self.__devs.tell.get_detected_pucks() + def identify_crystal_raster(self, result, r: RasterGridRequest): + if result.images: + indexed_images = [(i, img) for i, img in enumerate(result.images) if img.index] + if indexed_images: + max_image = max(indexed_images, key=lambda x: x[1].spots_low_res) + max_index, max_image = max_image + print(f"Image with maximum spots_low_res: {max_image}") + print(f"Maximum spots_low_res value: {max_image.spots_low_res}") + else: + images = [(i, img) for i, img in enumerate(result.images)] + print("No indexed images found.") + max_image = max(images, key=lambda x: x[1].spots_low_res) + max_index, max_image = max_image + print(f"Image with maximum spots_low_res: {max_image}") + print(f"Maximum spots_low_res value: {max_image.spots_low_res}") + + grid_x = max_index % r.n_x + grid_y = max_index // r.n_x + print(f"Grid coordinates: ({grid_x}, {grid_y})") + grid_mm_x = grid_x * r.grid_size_mm.x + r.grid_size_mm.x/2 + grid_mm_y = grid_y * r.grid_size_mm.y + r.grid_size_mm.y/2 + print(f"Grid coordinates in mm: ({grid_mm_x}, {grid_mm_y})") + delta_mm = self.sample_geometry.smargon_nudge(Coordinate(x=grid_mm_x, y=grid_mm_y)) + return delta_mm + + else: + return None + def __raster(self, r: RasterGridRequest) -> CompletedRasterGrid: max_time = r.exp_time_s * r.n_y * r.n_x + 60 self.__cfg.dtz = r.dtz @@ -322,8 +350,15 @@ class AareDAQ: self.__devs.aerotech.wait_scan_done(max_time) self.__devs.aerotech.reset() self.__devs.abr_pos = self.__cfg.abr_meas_pos - self.__devs.smargon.target = save_smargon_position result = self.__jfjoch.wait_till_done(60) + new_delta_mm = self.identify_crystal_raster(result, r) + if new_delta_mm is not None: + 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.") + self.__devs.smargon.target = save_smargon_position return CompletedRasterGrid(request=copy.deepcopy(r), result=result) def measure_raster(self, r: RasterGridRequest) -> CompletedRasterGrid: diff --git a/gui/src/aaregui/scan_logic/raster_grid_manager.py b/gui/src/aaregui/scan_logic/raster_grid_manager.py index 9187bf9d..5c734fe8 100644 --- a/gui/src/aaregui/scan_logic/raster_grid_manager.py +++ b/gui/src/aaregui/scan_logic/raster_grid_manager.py @@ -346,7 +346,7 @@ class RasterGridManager(QObject): for x in range(grid.n_x): for y in range(grid.n_y): pxl = x + y * grid.n_x - if values is None or len(values) <= pxl or math.isnan(values[pxl]) or values[pxl] < 0: + if values is None or len(values) <= pxl or values[pxl] is None or math.isnan(values[pxl]) or values[pxl] < 0: painter.setBrush(Qt.BrushStyle.NoBrush) else: painter.setBrush(QBrush(float_to_viridis_brush((values[pxl] - min_value) / diff, alpha=alpha)))