Source code for adcorr.corrections.solid_angle

from typing import Tuple, cast

from numpy import cos, dtype, floating, number, power

from ..utils.geometry import scattering_angles
from ..utils.typing import FrameHeight, Frames, FrameWidth, NumFrames


[docs]def correct_solid_angle( frames: Frames[NumFrames, FrameWidth, FrameHeight, dtype[number]], beam_center: Tuple[float, float], pixel_sizes: Tuple[float, float], distance: float, ) -> Frames[NumFrames, FrameWidth, FrameHeight, dtype[floating]]: """Corrects for the solid angle by scaling by the inverse of area subtended by a pixel. Corrects for the solid angle by scaling by the inverse of area subtended by each pixel, as detailed in section 3.4.6 of 'Everything SAXS: small-angle scattering pattern collection and correction' [https://doi.org/10.1088/0953-8984/25/38/383201]. Args: frames: A stack of frames to be corrected. beam_center: The center position of the beam in pixels. pixel_sizes: The real space size of a detector pixel. distance: The distance between the detector and the sample head. Returns: The corrected stack of frames. """ correction = power( cos( scattering_angles( cast(Tuple[int, int], frames.shape[-2:]), beam_center, pixel_sizes, distance, ) ), 3, ) return frames / correction