133 lines
3.8 KiB
Python
133 lines
3.8 KiB
Python
|
||
import pandas as pd
|
||
|
||
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 .io import load_spectrum
|
||
from .fft import *
|
||
from .scheludko import *
|
||
from .minmax import *
|
||
|
||
|
||
|
||
|
||
|
||
|
||
def plot_xy(file_path, plot=True):
|
||
try:
|
||
# Lecture du fichier .xy en utilisant pandas
|
||
data = pd.read_csv(file_path, delimiter=',', header=None, names=["x", "y"])
|
||
|
||
# Extraction des colonnes
|
||
x = data["x"]
|
||
y = data["y"]
|
||
|
||
# Tracer la deuxième colonne en fonction de la première
|
||
plt.figure(figsize=(10, 6),dpi = 600)
|
||
plt.plot(x, y, 'o-', markersize=2, label="Raw data")
|
||
|
||
# Ajout des labels et du titre
|
||
plt.xlabel(r'$\lambda$ (nm)')
|
||
plt.ylabel(r'$I^*$')
|
||
plt.legend()
|
||
|
||
except FileNotFoundError:
|
||
print(f"Erreur : le fichier '{file_path}' est introuvable.")
|
||
except Exception as e:
|
||
print(f"Une erreur est survenue : {e}")
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
def finds_peak(filename, min_peak_prominence, min_peak_distance=10, plot=None):
|
||
"""
|
||
Charge un fichier .xy et affiche les données avec les extrema détectés (minima et maxima).
|
||
|
||
Parameters
|
||
----------
|
||
filename : str
|
||
Chemin vers le fichier .xy (2 colonnes : lambda et intensité).
|
||
min_peak_prominence : float
|
||
Importance minimale des pics.
|
||
min_peak_distance : float
|
||
Distance minimale entre les pics.
|
||
"""
|
||
# Charger et lisser les données
|
||
lambdas, intensities = load_spectrum(filename, lambda_min=450)
|
||
WIN_SIZE = 11
|
||
smoothed_intensities = savgol_filter(intensities, WIN_SIZE, 3)
|
||
# Trouver les maxima et minima sur le signal lissé
|
||
peaks_max, _ = find_peaks(smoothed_intensities, prominence=min_peak_prominence, distance=min_peak_distance)
|
||
peaks_min, _ = find_peaks(-smoothed_intensities, prominence=min_peak_prominence, distance=min_peak_distance)
|
||
|
||
if plot:
|
||
plt.figure(figsize=(10, 6),dpi =600)
|
||
plt.plot(lambdas, smoothed_intensities, 'o-', markersize=2, label="Smoothed data")
|
||
plt.plot(lambdas[peaks_max], smoothed_intensities[peaks_max], 'ro')
|
||
plt.plot(lambdas[peaks_min], smoothed_intensities[peaks_min], 'ro')
|
||
plt.xlabel(r'$\lambda$ (nm)')
|
||
plt.ylabel(r'$I^*$')
|
||
plt.legend()
|
||
plt.tight_layout()
|
||
plt.show()
|
||
|
||
# Nombre total d’extremums
|
||
total_extrema = len(peaks_max) + len(peaks_min)
|
||
if total_extrema >=15:
|
||
print('Number of extrema', total_extrema,'.')
|
||
print('FFT method')
|
||
|
||
if total_extrema <=15 and total_extrema >4:
|
||
print('Number of extrema', total_extrema,'.')
|
||
print('OOSpectro method')
|
||
|
||
if total_extrema <=4:
|
||
print('Number of extrema', total_extrema,'.')
|
||
print('Scheludko method')
|
||
|
||
return total_extrema, smoothed_intensities, intensities, lambdas, peaks_min, peaks_max
|
||
|
||
|
||
|
||
|
||
|
||
def Data_Smoothed(filename):
|
||
"""
|
||
Charge un fichier .xy et affiche les données avec les extrema détectés (minima et maxima).
|
||
|
||
Parameters
|
||
----------
|
||
filename : str
|
||
Chemin vers le fichier .xy (2 colonnes : lambda et intensité).
|
||
min_peak_prominence : float
|
||
Importance minimale des pics.
|
||
min_peak_distance : float
|
||
Distance minimale entre les pics.
|
||
"""
|
||
# Charger et lisser les données
|
||
lambdas, intensities = load_spectrum(filename, lambda_min=450)
|
||
WIN_SIZE = 11
|
||
smoothed_intensities = savgol_filter(intensities, WIN_SIZE, 3)
|
||
|
||
return smoothed_intensities, intensities, lambdas
|
||
|
||
|
||
|
||
|
||
|