tmp_optifik/optifik/analysis.py
François Boulogne 30a9eef102 init
2025-05-21 13:32:32 +02:00

133 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 dextremums
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