Source code for ewoksfluo.xrffit.fit.types
from typing import List
from typing import NamedTuple
from typing import Optional
from typing import Union
import numpy
[docs]
class NotAvailable:
"""Use when the selected fit method does not provide a certain results."""
pass
UNITS = {
"Time": "s",
"Flux": "Hz",
"DetectorDistance": "cm",
"DetectorArea": "cm^2",
"SolidAngle": "sr",
"energies": "keV",
"raw_energy": "keV",
}
[docs]
class QuantificationParameters(NamedTuple):
I0: float # incident photon count
Time: float # sec
Flux: float # I0/Time (ph/sec)
DetectorDistance: float # cm
DetectorArea: float # cm^2
SolidAngle: float # steradian
ReferenceElement: Optional[str]
ReferenceTransitions: Optional[str]
[docs]
class XRFBatchFitResult(NamedTuple):
# Nparameters: number of fit parameters
# Narea_parameters: number of peak area parameters
# Nlayers: number of layers in a multilayer matrix
# Nspectra: number of XRF spectra
# Nchan: original number of MCA channels
# Nfit: fit number of MCA channels
parameters: numpy.ndarray # (Nparameters, Nspectra)
uncertainties: numpy.ndarray # (Nparameters, Nspectra)
derivatives: Optional[numpy.ndarray] # (Nparameters, Nchan)
parameter_names: List[str] # (Nparameters,)
channels: numpy.ndarray # (Nfit,)
energies: numpy.ndarray # (Nfit,)
raw_channels: numpy.ndarray # (Nchan,)
raw_energies: numpy.ndarray # (Nchan,)
spectra: Union[numpy.ndarray, None, NotAvailable] # (Nspectra, Nchan)
model: Union[numpy.ndarray, None, NotAvailable] # (Nspectra, Nchan)
residuals: Union[numpy.ndarray, None, NotAvailable] # (Nspectra, Nchan)
mass_fractions: Optional[
numpy.ndarray
] # (Narea_parameters, Nspectra); None when no quantification
mass_fractions_per_layer: Optional[
List[numpy.ndarray]
] # (Nlayers, Narea_parameters, Nspectra); None when no quantification
mass_fraction_names: Optional[
List[str]
] # (Narea_parameters,); None when no quantification
quantification_parameters: Union[QuantificationParameters, NotAvailable]
@property
def has_diagnostics(self) -> bool:
return all(self.has_data(value) for value in ["spectra", "model", "residuals"])
@property
def num_spectra(self) -> int:
if self.parameters.ndim == 2:
return self.parameters.shape[1]
return 0
[docs]
def has_data(self, name) -> bool:
value = getattr(self, name)
return value is not None and not isinstance(value, NotAvailable)