Source code for xypattern.auto_background
from __future__ import annotations
from abc import abstractmethod
from typing import TYPE_CHECKING
import numpy as np
if TYPE_CHECKING:
from .pattern import Pattern
try:
from .util.smooth_bruckner import smooth_bruckner
except ImportError as e:
print(e)
print("Could not import the Cython version of smooth_bruckner. Using python implementation instead.")
from .util.smooth_bruckner_py import smooth_bruckner
[docs]
class AutoBackground:
"""
Abstract base class for automatic background extraction algorithms.
This class defines the interface for background extraction algorithms.
Concrete implementations should override the extract_background method
to provide specific background extraction functionality.
"""
[docs]
@abstractmethod
def extract_background(self, pattern: Pattern):
"""
Extracts the background from a pattern.
This method should be implemented by subclasses to provide specific
background extraction functionality.
:param pattern: Pattern object from which to extract the background
:return: numpy array of y values representing the extracted background
"""
raise NotImplementedError
[docs]
@staticmethod
def transform_x(self, fcn: callable):
"""
Transforms the variables dependent on x.
This method should be implemented by subclasses to handle
transformation of x-dependent parameters when the x-axis is transformed.
:param fcn: Function to transform the x-variable
"""
raise NotImplementedError
[docs]
class SmoothBrucknerBackground(AutoBackground):
"""
Background extraction using Bruckner smoothing and Chebyshev polynomial fitting.
This algorithm performs background extraction in two steps:
1. Applies Bruckner smoothing to the input pattern
2. Fits a Chebyshev polynomial to the smoothed data
The Bruckner smoothing algorithm is particularly effective for extracting
backgrounds from patterns with sharp peaks, such as X-ray diffraction data.
Standard parameters are optimized for synchrotron XRD data but can be
adjusted for other types of data.
:param smooth_width: Width of the window in x-units used for Bruckner smoothing.
Larger values result in smoother backgrounds.
:param iterations: Number of iterations for the Bruckner smoothing algorithm.
More iterations typically result in better background fitting.
:param cheb_order: Order of the fitted Chebyshev polynomial.
Higher orders can fit more complex background shapes.
"""
[docs]
def __init__(self, smooth_width=0.1, iterations=50, cheb_order=50):
self.smooth_width = smooth_width
self.iterations = iterations
self.cheb_order = cheb_order
[docs]
def extract_background(self, pattern: Pattern):
"""
Extract background from a pattern using Bruckner smoothing and Chebyshev polynomial fitting.
The method first applies Bruckner smoothing to the pattern data, then fits
a Chebyshev polynomial to the smoothed data to create a continuous background.
:param pattern: Pattern object from which to extract the background
:return: numpy array of y values representing the extracted background
"""
x, y = pattern.data
smooth_points = int((float(self.smooth_width) / (x[1] - x[0])))
y_smooth = smooth_bruckner(y, abs(smooth_points), self.iterations)
# get cheb input parameters
x_cheb = 2. * (x - x[0]) / (x[-1] - x[0]) - 1.
cheb_parameters = np.polynomial.chebyshev.chebfit(x_cheb, y_smooth, self.cheb_order)
return np.polynomial.chebyshev.chebval(x_cheb, cheb_parameters)
[docs]
def transform_x(self, fcn: callable):
"""
Transform x-dependent parameters when the x-axis is transformed.
This method adjusts the smooth_width parameter when the x-axis is transformed,
ensuring that the background extraction behaves consistently after transformation.
:param fcn: Function to transform the x-variable
"""
self.smooth_width = fcn(self.smooth_width)