Source code for abinslib.util

"""Utility functions, not specific to one calculation type."""

from euphonic import Quantity
import numpy as np


[docs] def calculate_indirect_q2( energy_transfer: Quantity, angle: float, final_energy: Quantity ) -> Quantity: """Calculate Q^2 value for given energy transfer in indirect geometry. By the cosine law Q^2 = k_f^2 + k_i^2 - 2 k_f k_i cos(theta) Args: energy_transfer: neutron energy change. (Positive values correspond to transfer to sample.) angle: scattering angle in radians final_energy: energy of detected neutrons (i.e. after monochromator) Returns: array of scalar Q^2 corresponding to input energy_transfer """ # Get rid of ambiguous cm-1 units before manipulating energies energy_transfer = energy_transfer.to("meV", "spectroscopy") final_energy = final_energy.to("meV", "spectroscopy") # E = hbar^2 k^2 / 2m momentum2_to_energy = Quantity(0.5, "hbar^2 / neutron_mass").to("meV Å^2") k2_i = (energy_transfer + final_energy) / momentum2_to_energy k2_f = final_energy / momentum2_to_energy return k2_i + k2_f - 2 * np.sqrt(k2_i * k2_f) * np.cos(angle)