Source code for dodal.devices.detector.det_dist_to_beam_converter

from enum import Enum

from numpy import interp, loadtxt


[docs] class Axis(Enum): X_AXIS = 1 Y_AXIS = 2
[docs] class DetectorDistanceToBeamXYConverter: def __init__(self, lookup_file: str): self.lookup_file: str = lookup_file self.lookup_table_values: list = self.parse_table() def get_beam_xy_from_det_dist(self, det_dist_mm: float, beam_axis: Axis) -> float: beam_axis_values = self.lookup_table_values[beam_axis.value] det_dist_array = self.lookup_table_values[0] return float(interp(det_dist_mm, det_dist_array, beam_axis_values)) def get_beam_axis_pixels( self, det_distance: float, image_size_pixels: int, det_dim: float, beam_axis: Axis, ) -> float: beam_mm = self.get_beam_xy_from_det_dist(det_distance, beam_axis) return beam_mm * image_size_pixels / det_dim def get_beam_y_pixels( self, det_distance: float, image_size_pixels: int, det_dim: float ) -> float: return self.get_beam_axis_pixels( det_distance, image_size_pixels, det_dim, Axis.Y_AXIS ) def get_beam_x_pixels( self, det_distance: float, image_size_pixels: int, det_dim: float ) -> float: return self.get_beam_axis_pixels( det_distance, image_size_pixels, det_dim, Axis.X_AXIS ) def reload_lookup_table(self): self.lookup_table_values = self.parse_table() def parse_table(self) -> list: rows = loadtxt(self.lookup_file, delimiter=" ", comments=["#", "Units"]) columns = list(zip(*rows, strict=False)) return columns def __eq__(self, other): if not isinstance(other, DetectorDistanceToBeamXYConverter): return NotImplemented if self.lookup_file != other.lookup_file: return False if self.lookup_table_values != other.lookup_table_values: return False return True