Source code for mantidimaging.core.utility.unit_conversion
# Copyright (C) 2024 ISIS Rutherford Appleton Laboratory UKRI
# SPDX - License - Identifier: GPL-3.0-or-later
from __future__ import annotations
import numpy as np
[docs]
class UnitConversion:
# target_to_camera_dist = 56 m taken from https://scripts.iucr.org/cgi-bin/paper?S1600576719001730
neutron_mass: float = 1.674927211e-27 # [kg]
planck_h: float = 6.62606896e-34 # [JHz-1]
angstrom: float = 1e-10 # [m]
mega_electro_volt: float = 1.60217662e-19 / 1e6
target_to_camera_dist: float = 56 # [m]
data_offset: float = 0 # [s]
tof_data_to_convert: np.ndarray
velocity: np.ndarray
def __init__(self, data_to_convert: np.ndarray | None = None) -> None:
if data_to_convert is not None:
self.set_data_to_convert(data_to_convert)
self.check_data()
[docs]
def tof_seconds_to_wavelength_in_angstroms(self) -> np.ndarray:
self.check_data()
wavelength = self.planck_h / (self.neutron_mass * self.velocity)
wavelength_angstroms = wavelength / self.angstrom
return wavelength_angstroms
[docs]
def tof_seconds_to_energy(self) -> np.ndarray:
self.check_data()
energy = self.neutron_mass * self.velocity / 2
energy_evs = energy / self.mega_electro_volt
return energy_evs
[docs]
def tof_seconds_to_us(self) -> np.ndarray:
self.check_data()
return (self.tof_data_to_convert + self.data_offset) * 1e6
[docs]
def set_data_to_convert(self, data_to_convert: np.ndarray) -> None:
self.tof_data_to_convert = data_to_convert
[docs]
def check_data(self) -> None:
try:
self.velocity = self.target_to_camera_dist / (self.tof_data_to_convert + self.data_offset)
except AttributeError as exc:
raise TypeError("No data to convert") from exc
[docs]
def set_data_offset(self, data_offset: float) -> None:
self.data_offset = data_offset * 1e-6