Source code for reflectorch.utils

# -*- coding: utf-8 -*-
#
#
# This source code is licensed under the GPL license found in the
# LICENSE file in the root directory of this source tree.

import numpy as np
from numpy import ndarray

from torch import Tensor, tensor

__all__ = [
    'to_np',
    'to_t',
    'angle_to_q',
    'q_to_angle',
    'energy_to_wavelength',
    'wavelength_to_energy',
]


[docs] def to_np(arr): """Converts Pytorch tensor or Python list to Numpy array Args: arr (torch.Tensor or list): Input Pytorch tensor or Python list Returns: numpy.ndarray: Converted Numpy array """ if isinstance(arr, Tensor): return arr.detach().cpu().numpy() return np.asarray(arr)
[docs] def to_t(arr, device=None, dtype=None): """Converts Numpy array or Python list to Pytorch tensor Args: arr (numpy.ndarray or list): Input device (torch.device or str, optional): device for the tensor ('cpu', 'cuda') dtype (torch.dtype, optional): data type of the tensor (e.g. torch.float32) Returns: torch.Tensor: converted Pytorch tensor """ if not isinstance(arr, Tensor): return tensor(arr, device=device, dtype=dtype) return arr
# taken from mlreflect package # mlreflect/xrrloader/dataloader/transform.py
[docs] def angle_to_q(scattering_angle: ndarray or float, wavelength: float): """Conversion from full scattering angle (degrees) to scattering vector (inverse angstroms)""" return 4 * np.pi / wavelength * np.sin(scattering_angle / 2 * np.pi / 180)
[docs] def q_to_angle(q: ndarray or float, wavelength: float): """Conversion from scattering vector (inverse angstroms) to full scattering angle (degrees)""" return 2 * np.arcsin(q * wavelength / (4 * np.pi)) / np.pi * 180
[docs] def energy_to_wavelength(energy: float): """Conversion from photon energy (eV) to photon wavelength (angstroms)""" return 1.2398 / energy * 1e4
[docs] def wavelength_to_energy(wavelength: float): """Conversion from photon wavelength (angstroms) to photon energy (eV)""" return 1.2398 / wavelength * 1e4