fixes
This commit is contained in:
parent
d5fae56eb4
commit
1800675fd3
5 changed files with 107 additions and 109 deletions
|
@ -26,7 +26,7 @@ def plot_spectrum(wavelengths, intensities, title=''):
|
|||
|
||||
def finds_peak(wavelengths, intensities, min_peak_prominence, min_peak_distance=10, plot=None):
|
||||
"""
|
||||
Detect minima and maxima
|
||||
Detect minima and maxima.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
|
|
|
@ -1,88 +0,0 @@
|
|||
import os.path
|
||||
|
||||
from .analysis import *
|
||||
from .io import load_spectrum
|
||||
|
||||
def auto(spectrum_file, plot=None):
|
||||
|
||||
|
||||
spectre_file = spectrum_file
|
||||
|
||||
##### Affichage du spectre brut et récupération des Intesités brutes#####
|
||||
|
||||
lambdas, raw_intensities = load_spectrum(spectre_file, lambda_min=450)
|
||||
|
||||
##### Affichage du spectre lissé #####
|
||||
|
||||
#smoothed_intensities, intensities, lambdas = Data_Smoothed(spectre_file)
|
||||
|
||||
smoothed_intensities = smooth_intensities(raw_intensities)
|
||||
|
||||
##### Indice Optique en fonction de Lambda #####
|
||||
|
||||
indice = 1.324188 + 3102.060378 / (lambdas**2)
|
||||
|
||||
##### Determination de la prominence associé #####
|
||||
|
||||
prominence, signal, wavelength = Prominence_from_fft(lambdas,
|
||||
smoothed_intensities,
|
||||
refractive_index=indice,
|
||||
plot=plot)
|
||||
|
||||
prominence = 0.03
|
||||
##### Find Peak #####
|
||||
|
||||
peaks_min, peaks_max = finds_peak(lambdas, smoothed_intensities,
|
||||
min_peak_prominence=prominence,
|
||||
plot=False)
|
||||
|
||||
##### Epaisseur selon la methode #####
|
||||
|
||||
#thickness_FFT = thickness_from_fft(lambdas,smoothed_intensities,refractive_index=1.33)
|
||||
|
||||
|
||||
total_extrema = len(peaks_max) + len(peaks_min)
|
||||
|
||||
if total_extrema > 15 and total_extrema > 4:
|
||||
print('Apply method FFT')
|
||||
result = thickness_from_fft(lambdas, smoothed_intensities,
|
||||
refractive_index=indice,
|
||||
plot=plot)
|
||||
|
||||
print(f'thickness: {result.thickness:.2f} nm')
|
||||
|
||||
|
||||
if total_extrema <= 15 and total_extrema > 4:
|
||||
print('Apply method minmax')
|
||||
result = thickness_from_minmax(lambdas, smoothed_intensities,
|
||||
refractive_index=indice,
|
||||
min_peak_prominence=prominence,
|
||||
plot=plot)
|
||||
|
||||
print(f'thickness: {result.thickness:.2f} nm')
|
||||
|
||||
if total_extrema <= 4 and total_extrema >= 2: #& 2peak minimum:
|
||||
print('Apply method Scheludko')
|
||||
result = thickness_from_scheludko(lambdas, smoothed_intensities,
|
||||
refractive_index=indice,
|
||||
min_peak_prominence=prominence,
|
||||
plot=plot)
|
||||
|
||||
print(f'thickness: {result.thickness:.2f} nm')
|
||||
|
||||
if total_extrema <= 4 and len(peaks_max) == 1 and len(peaks_min) == 0 : #dans l'ordre zéro !
|
||||
print('Apply method ordre0')
|
||||
|
||||
result = thickness_for_order0(lambdas, smoothed_intensities,
|
||||
refractive_index=indice,
|
||||
min_peak_prominence=prominence,
|
||||
plot=plot)
|
||||
|
||||
print(f'thickness: {result.thickness:.2f} nm')
|
||||
|
||||
if total_extrema <= 4 and len(peaks_max) == 0 and (len(peaks_min) == 1 or len(peaks_min) == 0):
|
||||
#& 1peak min ou zéro:
|
||||
thickness = None
|
||||
print('Zone Ombre')
|
||||
|
||||
|
178
optifik/fft.py
178
optifik/fft.py
|
@ -71,12 +71,10 @@ def thickness_from_fft(wavelengths, intensities,
|
|||
idx_max_fft = np.argmax(abs(intensities_fft))
|
||||
freq_max = inverse_wavelengths_fft[idx_max_fft]
|
||||
|
||||
|
||||
thickness_fft = freq_max / 2.
|
||||
|
||||
|
||||
plt.figure(figsize=(10, 6),dpi =600)
|
||||
if plot:
|
||||
plt.figure(figsize=(10, 6),dpi =600)
|
||||
plt.loglog(inverse_wavelengths_fft, np.abs(intensities_fft))
|
||||
plt.loglog(freq_max, np.abs(intensities_fft[idx_max_fft]), 'o')
|
||||
plt.xlabel('Frequency')
|
||||
|
@ -86,90 +84,90 @@ def thickness_from_fft(wavelengths, intensities,
|
|||
return OptimizeResult(thickness=thickness_fft,)
|
||||
|
||||
|
||||
def Prominence_from_fft(wavelengths, intensities, refractive_index,
|
||||
num_half_space=None, plot=None):
|
||||
if num_half_space is None:
|
||||
num_half_space = len(wavelengths)
|
||||
|
||||
# # # 1. Spectre original
|
||||
# if plot:
|
||||
# plt.figure(figsize=(10, 6), dpi=150)
|
||||
# plt.plot(1/wavelengths, intensities, label='Spectre original')
|
||||
# plt.xlabel('1/Longueur d\'onde (nm-1)')
|
||||
# plt.ylabel('Intensité')
|
||||
# plt.legend()
|
||||
# plt.show()
|
||||
|
||||
|
||||
# 2. Conversion lambda → k = n(λ) / λ
|
||||
k_vals = refractive_index / wavelengths
|
||||
f_interp = interp1d(k_vals, intensities, kind='linear', fill_value="extrapolate")
|
||||
|
||||
# 3. Axe k uniforme + interpolation
|
||||
k_linspace = np.linspace(k_vals[0], k_vals[-1], 2 * num_half_space)
|
||||
intensities_k = f_interp(k_linspace)
|
||||
|
||||
# 4. FFT
|
||||
delta_k = (k_vals[-1] - k_vals[0]) / (2 * num_half_space)
|
||||
fft_vals = fft(intensities_k)
|
||||
freqs = fftfreq(2 * num_half_space, delta_k)
|
||||
|
||||
# 5. Pic FFT
|
||||
freqs_pos = freqs[freqs > 0]
|
||||
abs_fft_pos = np.abs(fft_vals[freqs > 0])
|
||||
idx_max = np.argmax(abs_fft_pos)
|
||||
F_max = freqs_pos[idx_max]
|
||||
|
||||
if plot:
|
||||
plt.figure(figsize=(10, 6), dpi=150)
|
||||
plt.plot(freqs_pos, abs_fft_pos, label='|FFT|')
|
||||
plt.axvline(F_max, color='r', linestyle='--', label='Pic principal')
|
||||
plt.xlabel('Distance optique [nm]')
|
||||
plt.ylabel(r'FFT($I^*$)')
|
||||
plt.xscale('log')
|
||||
plt.yscale('log')
|
||||
plt.legend()
|
||||
plt.show()
|
||||
|
||||
# 6. Filtrage (garde hautes fréquences)
|
||||
cutoff_HF = 2 * F_max
|
||||
|
||||
mask_HF = np.abs(freqs) >= cutoff_HF
|
||||
fft_filtered_HF = np.zeros_like(fft_vals, dtype=complex)
|
||||
fft_filtered_HF[mask_HF] = fft_vals[mask_HF]
|
||||
|
||||
# 7. Filtrage (garde basses fréquences)
|
||||
cutoff_BF = 10 * F_max
|
||||
mask_BF = np.abs(freqs) <= cutoff_BF
|
||||
fft_filtered_BF = np.zeros_like(fft_vals, dtype=complex)
|
||||
fft_filtered_BF[mask_BF] = fft_vals[mask_BF]
|
||||
|
||||
|
||||
# 8. Reconstruction
|
||||
signal_filtered_HF = np.real(ifft(fft_filtered_HF))
|
||||
signal_filtered_BF = np.real(ifft(fft_filtered_BF))
|
||||
lambda_reconstructed = np.interp(k_linspace, k_vals[::-1], wavelengths[::-1])
|
||||
|
||||
# Masque dans la plage [550, 700] nm
|
||||
mask_Cam_Sensitivity = (lambda_reconstructed >= 550) & (lambda_reconstructed <= 700)
|
||||
|
||||
# 9. Affichage reconstruction
|
||||
if plot:
|
||||
plt.figure(figsize=(10, 6), dpi=150)
|
||||
plt.plot(lambda_reconstructed, intensities_k, '--', label='Original interpolé')
|
||||
plt.plot(lambda_reconstructed, signal_filtered_HF,'--', color='gray')
|
||||
|
||||
plt.plot(lambda_reconstructed[mask_Cam_Sensitivity], signal_filtered_HF[mask_Cam_Sensitivity],
|
||||
color='orange', label='Spectre filtré HF')
|
||||
plt.plot(lambda_reconstructed, signal_filtered_BF,
|
||||
color='red', label='Spectre filtré BF')
|
||||
|
||||
plt.xlabel('Wavelength (nm)')
|
||||
plt.ylabel('Intensity')
|
||||
plt.legend()
|
||||
plt.show()
|
||||
|
||||
max_amplitude = np.max(np.abs(signal_filtered_HF[mask_Cam_Sensitivity]))
|
||||
|
||||
return max_amplitude, signal_filtered_BF, lambda_reconstructed
|
||||
|
||||
#def Prominence_from_fft(wavelengths, intensities, refractive_index,
|
||||
# num_half_space=None, plot=None):
|
||||
# if num_half_space is None:
|
||||
# num_half_space = len(wavelengths)
|
||||
#
|
||||
# # # # 1. Spectre original
|
||||
# # if plot:
|
||||
# # plt.figure(figsize=(10, 6), dpi=150)
|
||||
# # plt.plot(1/wavelengths, intensities, label='Spectre original')
|
||||
# # plt.xlabel('1/Longueur d\'onde (nm-1)')
|
||||
# # plt.ylabel('Intensité')
|
||||
# # plt.legend()
|
||||
# # plt.show()
|
||||
#
|
||||
#
|
||||
# # 2. Conversion lambda → k = n(λ) / λ
|
||||
# k_vals = refractive_index / wavelengths
|
||||
# f_interp = interp1d(k_vals, intensities, kind='linear', fill_value="extrapolate")
|
||||
#
|
||||
# # 3. Axe k uniforme + interpolation
|
||||
# k_linspace = np.linspace(k_vals[0], k_vals[-1], 2 * num_half_space)
|
||||
# intensities_k = f_interp(k_linspace)
|
||||
#
|
||||
# # 4. FFT
|
||||
# delta_k = (k_vals[-1] - k_vals[0]) / (2 * num_half_space)
|
||||
# fft_vals = fft(intensities_k)
|
||||
# freqs = fftfreq(2 * num_half_space, delta_k)
|
||||
#
|
||||
# # 5. Pic FFT
|
||||
# freqs_pos = freqs[freqs > 0]
|
||||
# abs_fft_pos = np.abs(fft_vals[freqs > 0])
|
||||
# idx_max = np.argmax(abs_fft_pos)
|
||||
# F_max = freqs_pos[idx_max]
|
||||
#
|
||||
# if plot:
|
||||
# plt.figure(figsize=(10, 6), dpi=150)
|
||||
# plt.plot(freqs_pos, abs_fft_pos, label='|FFT|')
|
||||
# plt.axvline(F_max, color='r', linestyle='--', label='Pic principal')
|
||||
# plt.xlabel('Distance optique [nm]')
|
||||
# plt.ylabel(r'FFT($I^*$)')
|
||||
# plt.xscale('log')
|
||||
# plt.yscale('log')
|
||||
# plt.legend()
|
||||
# plt.show()
|
||||
#
|
||||
# # 6. Filtrage (garde hautes fréquences)
|
||||
# cutoff_HF = 2 * F_max
|
||||
#
|
||||
# mask_HF = np.abs(freqs) >= cutoff_HF
|
||||
# fft_filtered_HF = np.zeros_like(fft_vals, dtype=complex)
|
||||
# fft_filtered_HF[mask_HF] = fft_vals[mask_HF]
|
||||
#
|
||||
# # 7. Filtrage (garde basses fréquences)
|
||||
# cutoff_BF = 10 * F_max
|
||||
# mask_BF = np.abs(freqs) <= cutoff_BF
|
||||
# fft_filtered_BF = np.zeros_like(fft_vals, dtype=complex)
|
||||
# fft_filtered_BF[mask_BF] = fft_vals[mask_BF]
|
||||
#
|
||||
#
|
||||
# # 8. Reconstruction
|
||||
# signal_filtered_HF = np.real(ifft(fft_filtered_HF))
|
||||
# signal_filtered_BF = np.real(ifft(fft_filtered_BF))
|
||||
# lambda_reconstructed = np.interp(k_linspace, k_vals[::-1], wavelengths[::-1])
|
||||
#
|
||||
# # Masque dans la plage [550, 700] nm
|
||||
# mask_Cam_Sensitivity = (lambda_reconstructed >= 550) & (lambda_reconstructed <= 700)
|
||||
#
|
||||
# # 9. Affichage reconstruction
|
||||
# if plot:
|
||||
# plt.figure(figsize=(10, 6), dpi=150)
|
||||
# plt.plot(lambda_reconstructed, intensities_k, '--', label='Original interpolé')
|
||||
# plt.plot(lambda_reconstructed, signal_filtered_HF,'--', color='gray')
|
||||
#
|
||||
# plt.plot(lambda_reconstructed[mask_Cam_Sensitivity], signal_filtered_HF[mask_Cam_Sensitivity],
|
||||
# color='orange', label='Spectre filtré HF')
|
||||
# plt.plot(lambda_reconstructed, signal_filtered_BF,
|
||||
# color='red', label='Spectre filtré BF')
|
||||
#
|
||||
# plt.xlabel('Wavelength (nm)')
|
||||
# plt.ylabel('Intensity')
|
||||
# plt.legend()
|
||||
# plt.show()
|
||||
#
|
||||
# max_amplitude = np.max(np.abs(signal_filtered_HF[mask_Cam_Sensitivity]))
|
||||
#
|
||||
# return max_amplitude, signal_filtered_BF, lambda_reconstructed
|
||||
#
|
||||
|
|
|
@ -29,10 +29,10 @@ def thickness_scheludko_at_order(wavelengths,
|
|||
Wavelength values in nm.
|
||||
intensities : array
|
||||
Intensity values.
|
||||
interference_order: TYPE
|
||||
DESCRIPTION.
|
||||
refractive_index : TYPE
|
||||
DESCRIPTION.
|
||||
interference_order : int
|
||||
Interference order.
|
||||
refractive_index : array_like (or float)
|
||||
Refractive index.
|
||||
Imin : TYPE, optional
|
||||
DESCRIPTION. The default is None.
|
||||
|
||||
|
@ -203,7 +203,7 @@ def thickness_from_scheludko(wavelengths,
|
|||
min_ecart = ecart
|
||||
best_m = m
|
||||
best_h = h_values
|
||||
|
||||
|
||||
if plot:
|
||||
plt.plot(wavelengths_masked, h_values,'.', markersize=3, label=f"Épaisseur du film (Scheludko, m={m})")
|
||||
|
||||
|
@ -216,9 +216,9 @@ def thickness_from_scheludko(wavelengths,
|
|||
# DeltaVrai = (intensities_masked -np.min(intensities_masked))/(np.max(intensities_masked) -np.min(intensities_masked))
|
||||
# DeltaVrai = (intensities_raw_masked -np.min(intensities_raw_masked))/(np.max(intensities_raw_masked) -np.min(intensities_raw_masked))
|
||||
|
||||
DeltaScheludko = Delta(wavelengths_masked,
|
||||
np.mean(best_h),
|
||||
best_m,
|
||||
DeltaScheludko = Delta(wavelengths_masked,
|
||||
np.mean(best_h),
|
||||
best_m,
|
||||
r_index_masked)
|
||||
|
||||
|
||||
|
@ -228,7 +228,7 @@ def thickness_from_scheludko(wavelengths,
|
|||
|
||||
if plot:
|
||||
Delta_values = Delta(wavelengths_masked, fitted_h, best_m, r_index_masked)
|
||||
|
||||
|
||||
plt.figure(figsize=(10, 6), dpi=300)
|
||||
plt.plot(wavelengths_masked, DeltaVrai,
|
||||
'bo-', markersize=2, label=r'$\mathrm{{Smoothed}}\ \mathrm{{Data}}$')
|
||||
|
@ -240,7 +240,7 @@ def thickness_from_scheludko(wavelengths,
|
|||
plt.xlabel(r'$\lambda$ ($ \mathrm{nm} $)')
|
||||
|
||||
|
||||
return OptimizeResult(thickness=fitted_h ,)
|
||||
return OptimizeResult(thickness=fitted_h,)
|
||||
|
||||
|
||||
def thickness_for_order0(wavelengths,
|
||||
|
@ -249,11 +249,11 @@ def thickness_for_order0(wavelengths,
|
|||
min_peak_prominence,
|
||||
plot=None):
|
||||
|
||||
# TODO :
|
||||
# TODO :
|
||||
# Load "trou"
|
||||
File_I_min = 'tests/spectre_trou/000043641.xy'
|
||||
wavelengths_I_min, intensities_I_min = load_spectrum(File_I_min, lambda_min=450)
|
||||
|
||||
|
||||
r_index = refractive_index
|
||||
|
||||
peaks_min, peaks_max = finds_peak(wavelengths, intensities,
|
||||
|
@ -287,7 +287,7 @@ def thickness_for_order0(wavelengths,
|
|||
plt.figure(figsize=(10, 6), dpi=300)
|
||||
plt.plot(wavelengths_masked, h_values, label=r"Épaisseur du film (Scheludko, m=0)")
|
||||
|
||||
|
||||
|
||||
best_m = m
|
||||
best_h = h_values
|
||||
|
||||
|
@ -311,8 +311,8 @@ def thickness_for_order0(wavelengths,
|
|||
|
||||
if plot:
|
||||
Delta_values = Delta(wavelengths_masked, fitted_h, best_m, r_index_masked)
|
||||
plt.plot(wavelengths_masked, Delta_values,
|
||||
'go-', markersize=2,
|
||||
plt.plot(wavelengths_masked, Delta_values,
|
||||
'go-', markersize=2,
|
||||
label=rf'$\mathrm{{Fit}}\ (h = {fitted_h:.1f}\pm {np.sqrt(pcov[0][0]):.1f} \ \mathrm{{nm}})$')
|
||||
plt.legend()
|
||||
plt.ylabel(r'$\Delta$')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue