tmp_optifik/optifik/analysis.py
François Boulogne 9e77fc8f03 mpl
2025-06-17 18:06:06 +02:00

91 lines
2.5 KiB
Python

from scipy.signal import savgol_filter
from scipy.signal import find_peaks
import matplotlib.pyplot as plt
plt.rc('text', usetex=True)
plt.rcParams.update({
'axes.labelsize': 26,
'xtick.labelsize': 32,
'ytick.labelsize': 32,
'legend.fontsize': 23,
})
from .utils import setup_matplotlib
def plot_spectrum(wavelengths, intensities, title=''):
setup_matplotlib()
plt.figure()
plt.plot(wavelengths, intensities, 'o-', markersize=2)
plt.xlabel(r'$\lambda$ (nm)')
plt.ylabel(r'$I^*$')
plt.title(title)
plt.tight_layout()
plt.show()
def finds_peak(wavelengths, intensities, min_peak_prominence, min_peak_distance=10, plot=None):
"""
Detect minima and maxima.
Parameters
----------
wavelengths : array
Wavelength values in nm.
intensities : array
Intensity values.
min_peak_prominence : float
min prominence for scipy find_peak.
min_peak_distance : int, optional
min peak distance for scipy find_peak. The default is 10.
plot : bool, optional
Display a curve, useful for checking or debuging. The default is None.
Returns
-------
(peaks_min, peaks_max)
"""
if plot:
setup_matplotlib()
peaks_max, _ = find_peaks(intensities, prominence=min_peak_prominence, distance=min_peak_distance)
peaks_min, _ = find_peaks(-intensities, prominence=min_peak_prominence, distance=min_peak_distance)
if plot:
plt.figure()
plt.plot(wavelengths, intensities, 'o-', markersize=2, label="Smoothed data")
plt.plot(wavelengths[peaks_max], intensities[peaks_max], 'ro')
plt.plot(wavelengths[peaks_min], intensities[peaks_min], 'ro')
plt.xlabel(r'$\lambda$ (nm)')
plt.ylabel(r'$I^*$')
plt.legend()
import inspect
plt.title(inspect.currentframe().f_code.co_name)
plt.tight_layout()
plt.show()
return peaks_min, peaks_max
def smooth_intensities(intensities, window_size=11):
"""
Return a smoothed intensities array with a Savitzky-Golay filter.
Parameters
----------
intensities : ndarray
Intensity values
window_size : int, optional
The length of the filter window. The default is 11.
Returns
-------
smoothed_intensities
"""
polynom_order = 3
smoothed_intensities = savgol_filter(intensities, window_size, 3)
return smoothed_intensities