import logging
from mumott import DataContainer
from mumott.methods.projectors import SAXSProjector, SAXSProjectorCUDA
from .fbp_utilities import get_filtered_projections
logger = logging.getLogger(__name__)
[docs]def run_fbp(data_container: DataContainer,
            use_gpu: bool = False,
            fbp_axis: str = 'inner',
            filter_type: str = 'Ram-Lak',
            **kwargs) -> dict:
    """
    This pipeline is used to compute the filtered back projection of the
    absorbances calculated from the diode. This allows for a quick, one-step
    solution to the problem of scalar tomography.
    Parameters
    ----------
    data_container
        The :class:`DataContainer <mumott.data_handling.DataContainer>`
        holding the data set of interest.
    use_gpu
        Whether to use GPU resources in computing the projections.
        Default is ``False``. If set to ``True``, the method will use
        :class:`SAXSProjectorCUDA <mumott.methods.projectors.SAXSProjectorCUDA>`.
    fbp_axis
        Default is ``'inner'``, the value depends on how the sample is mounted to the holder. Typically,
        the inner axis is the rotation axis while the ``'outer'`` axis refers to the tilt axis.
    filter_type
        Default is ``'Ram-Lak'``, a high-pass filter. Other options are ``'Hamming'``, ``'Hann'``,
        ``'Shepp-Logan'`` and ``'cosine'``.
    kwargs
        Miscellaneous keyword arguments. See notes for details.
    Notes
    -----
    Three possible :attr:`kwargs` can be provided:
        Projector
            The :ref:`projector class <projectors>` to use.
        normalization_percentile
            The normalization percentile to use for the transmittivity calculation. See
            :func:`get_transmittivities <mumott.data_handling.utilities.get_transmittivities>` for details.
        transmittivity_cutoff
            The cutoffs to use for the transmittivity calculation. See
            :func:`get_transmittivities <mumott.data_handling.utilities.get_transmittivities>` for details.
    Returns
    -------
        A dictionary with the entry ``'result'``, with an entry ``'x'``, containing
        a filtered back projection reconstruction of the absorptivity calculated
        from the ``diode``.
    """
    if 'Projector' in kwargs:
        Projector = kwargs.pop('Projector')
    else:
        if use_gpu:
            Projector = SAXSProjectorCUDA
        else:
            Projector = SAXSProjector
    projector = Projector(data_container.geometry)
    filtered_projections, indices = get_filtered_projections(data_container.projections,
                                                             axis_string=fbp_axis,
                                                             filter_type=filter_type,
                                                             **kwargs)
    filtered_projections = filtered_projections.astype(projector.dtype)
    fbp_reconstruction = projector.adjoint(filtered_projections, indices)
    return dict(result=dict(x=fbp_reconstruction), projector=projector, fbp_indices=indices)