88 lines
2.4 KiB
Python
88 lines
2.4 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,
|
|
})
|
|
|
|
|
|
|
|
def plot_spectrum(wavelengths, intensities, title=''):
|
|
|
|
plt.figure(figsize=(10, 6), dpi=300)
|
|
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)
|
|
|
|
"""
|
|
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(figsize=(10, 6), dpi=300)
|
|
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
|
|
|