diff --git a/check.py b/check.py index fff81c5..ef6afa8 100644 --- a/check.py +++ b/check.py @@ -36,10 +36,10 @@ def play(): FILE_NAME = '000004310.xy' #TEST# spectrum_file = os.path.join(DATA_FOLDER, FILE_NAME) - - + + spectrum_file = 'tests/spectraVictor1/T5469.xy' #TEST# - + lambdas, intensities = io.load_spectrum(spectrum_file) plot_spectrum(lambdas, intensities, title='Raw') diff --git a/optifik/auto.py b/old/auto.py similarity index 100% rename from optifik/auto.py rename to old/auto.py diff --git a/optifik/analysis.py b/optifik/analysis.py index 1512662..35ff5fb 100644 --- a/optifik/analysis.py +++ b/optifik/analysis.py @@ -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 ---------- diff --git a/optifik/fft.py b/optifik/fft.py index 45a2229..5a81290 100644 --- a/optifik/fft.py +++ b/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 +# diff --git a/optifik/scheludko.py b/optifik/scheludko.py index 6e611fa..369c0c3 100644 --- a/optifik/scheludko.py +++ b/optifik/scheludko.py @@ -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$')