Source code for scippneutron.beamline_components
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2023 Scipp contributors (https://github.com/scipp)
# @author Jan-Lukas Wynen
import scipp as sc
from .conversion import graph
def _derived_coord(
da: sc.DataArray | sc.Dataset, name: str, scatter: bool = True
) -> sc.Variable:
tmp = da.transform_coords(
name,
graph=graph.beamline.beamline(scatter=scatter),
rename_dims=False,
keep_aliases=False,
keep_inputs=False,
keep_intermediate=False,
)
return tmp.coords[name]
[docs]
def position(da: sc.DataArray | sc.Dataset) -> sc.Variable:
"""Extract the detector pixel positions from a data array or dataset.
Parameters
----------
da:
Get or compute the positions from coords and attrs of this.
Returns
-------
:
The detector pixel positions.
"""
return _derived_coord(da, 'position')
[docs]
def source_position(da: sc.DataArray | sc.Dataset) -> sc.Variable:
"""Extract the position of the neutron source from a data array or dataset.
Parameters
----------
da:
Get or compute the source position from coords and attrs of this.
Returns
-------
:
The source position.
"""
return _derived_coord(da, 'source_position')
[docs]
def sample_position(da: sc.DataArray | sc.Dataset) -> sc.Variable:
"""Extract the position of the sample from a data array or dataset.
Parameters
----------
da:
Get or compute the sample position from coords and attrs of this.
Returns
-------
:
The sample position.
"""
return _derived_coord(da, 'sample_position')
[docs]
def incident_beam(da: sc.DataArray | sc.Dataset) -> sc.Variable:
"""Extract the incident beam vector from a data array or dataset.
This is the direction and length of the primary flight path,
i.e. from source to sample.
Parameters
----------
da:
Get or compute the incident beam from coords and attrs of this.
Returns
-------
:
The incident beam.
"""
return _derived_coord(da, 'incident_beam')
[docs]
def scattered_beam(da: sc.DataArray | sc.Dataset) -> sc.Variable:
"""Extract the scattered beam vector from a data array or dataset.
This is the direction and length of the secondary flight path,
i.e. from sample to detector.
Parameters
----------
da:
Get or compute the scattered beam from coords and attrs of this.
Returns
-------
:
The scattered beam.
"""
return _derived_coord(da, 'scattered_beam')
[docs]
def Ltotal(da: sc.DataArray | sc.Dataset, scatter: bool) -> sc.Variable:
"""Extract the length of the total flight path from a data array or dataset.
Parameters
----------
da:
Get or compute the total flight path length from coords and attrs of this.
scatter:
If ``True``, assume a beam that scattered off a sample and return the
sum of L1 and L2.
If ``False``, return the straight distance between source and detector.
Returns
-------
:
The length of the total flight path.
"""
return _derived_coord(da, 'Ltotal', scatter=scatter)
[docs]
def L1(da: sc.DataArray | sc.Dataset) -> sc.Variable:
"""Extract the length of the primary flight path from a data array or dataset.
This is the distance between neutron source and sample.
Parameters
----------
da:
Get or compute the primary flight path length from coords and attrs of this.
Returns
-------
:
The length of the primary flight path.
"""
return _derived_coord(da, 'L1')
[docs]
def L2(da: sc.DataArray | sc.Dataset) -> sc.Variable:
"""Extract the length of the secondary flight path from a data array or dataset.
This is the distance between sample and detector.
Parameters
----------
da:
Get or compute the secondary flight path length from coords and attrs of this.
Returns
-------
:
The length of the secondary flight path.
"""
return _derived_coord(da, 'L2')
[docs]
def two_theta(da: sc.DataArray | sc.Dataset) -> sc.Variable:
"""Extract the scattering angle from a data array or dataset.
The angle is defined as in Bragg's law.
See the beamline `documentation <../modules/scippneutron.conversion.beamline.rst>`_
for a full definition.
Parameters
----------
da:
Get or compute the scattering angle from coords and attrs of this.
Returns
-------
:
Twice the scattering angle.
"""
return _derived_coord(da, 'two_theta')