# -*- coding: utf-8 -*-
"""Corrections for azimuthal integrated curves."""
__author__ = "Matteo Levantino"
__contact__ = "matteo.levantino@esrf.fr"
__licence__ = "MIT"
__copyright__ = "ESRF - The European Synchrotron, Grenoble, France"
__date__ = "01/09/2021"
import numpy as np
import xraydb
# create list of xraydb materials (materials name + materials formula)
_xraydb_materials = xraydb.materials._read_materials_db()
materials_names = list(_xraydb_materials.keys())
materials_formula = [m.formula for m in _xraydb_materials.values()]
[docs]
def get_sensor_info(detector_name):
    """Get sensor material, thickness and density of known detectors."""
    detector_name = detector_name.lower()
    if detector_name in ['rayonix mx170-hs', 'rayonix']:
        sensor_material = 'Gd2O2S'
        sensor_thickness = 40e-6
        sensor_density = 4.3*1e3
    elif detector_name in ['maxipix 5x1', 'maxipix 2x2', 'maxipix']:
        sensor_material = 'Si'
        sensor_thickness = 500e-6
        sensor_density = get_density('Si')
    else:
        sensor_material = None
        sensor_thickness = None
        sensor_density = None
    return (sensor_material, sensor_thickness, sensor_density) 
[docs]
def sensor_absorption(tth, material, energy, thickness, density=None):
    """
    Calculate the angular dependent absorption of a sensor.
    Parameters
    ----------
    tth : float or array-like
        Scattering angle (deg).
    material : str
        Chemical formula or material from materials list ('xraydb').
    energy : float
        Photon energy (eV).
    thickness : float
        Sensor thickness (m).
    density : float
        Sensor density (kg/m3).
    Returns
    -------
    A : ndarray
        Sensor absorption.
    """
    mu = get_mu(material, energy, density=density)
    cos = np.cos(np.deg2rad(tth))
    t = np.exp(-mu*thickness/cos)
    A = (1-t)
    return A 
[docs]
def sample_transmission(tth, material, energy, thickness, density=None):
    """
    Calculate the angular dependent transmission of a sample.
    The sample is assumed to be a homogenous sheet with given thickness.
    Parameters
    ----------
    tth : float or array-like
        Scattering angle (deg).
    material : str
        Chemical formula or material from materials list ('xraydb').
    energy : float
        Photon energy (eV).
    thickness : float
        Sample thickness (m).
    density : float
        Sample density (kg/m3).
    Returns
    -------
    t : ndarray
        Sample transmission.
    """
    mu = get_mu(material, energy, density=density)
    cos = np.cos(np.deg2rad(tth))
    t1 = np.exp(-mu*thickness)
    t2 = np.exp(-mu*thickness/cos)
    t = 1/(mu*thickness) * cos/(1-cos) * (t1-t2)
    return t 
[docs]
def get_density(material):
    """
    Return the density of a material in kg/m3.
    """
    check_material(material)
    density = xraydb.get_material(material)[1]
    density *= 1e3
    return density 
[docs]
def get_mu(material, energy, density=None):
    """
    Return the absorption coefficient of a material in 1/m.
    """
    check_material(material)
    if density is not None:
        density /= 1e3
    mu = xraydb.material_mu(material, energy, density=density)*1e2
    return mu 
[docs]
def material_in_xraydb(material):
    """Check if material is in xraydb."""
    global materials_names, materials_formula
    cond1 = material.lower() in materials_names
    cond2 = material in materials_formula
    return (cond1 or cond2) 
[docs]
def check_material(material):
    """Check material and raise error if not in xraydb."""
    if not material_in_xraydb(material):
        raise ValueError("Material '%s' is not available in xraydb."
                         % material)