This commit is contained in:
François Boulogne 2025-06-20 11:02:04 +02:00
parent 157fcdc102
commit 5fe2ef7a67
2 changed files with 61 additions and 107 deletions

View file

@ -160,8 +160,8 @@ def get_default_start_stop_wavelengths(wavelengths,
def thickness_from_scheludko(wavelengths, def thickness_from_scheludko(wavelengths,
intensities, intensities,
refractive_index, refractive_index,
wavelength_start, wavelength_start=None,
wavelength_stop, wavelength_stop=None,
interference_order=None, interference_order=None,
plot=None): plot=None):
""" """
@ -187,14 +187,20 @@ def thickness_from_scheludko(wavelengths,
if plot: if plot:
setup_matplotlib() setup_matplotlib()
# A bit extreme... if interference_order is None or interference_order > 0:
max_tested_order = 12 if wavelength_stop is None or wavelength_start is None:
raise ValueError('wavelength_start and wavelength_stop must be passed for interference_order != 0.')
else:
if wavelength_start > wavelength_stop:
raise ValueError('wavelength_start and wavelength_stop are swapped.')
r_index = refractive_index r_index = refractive_index
# Handle the interference order
if interference_order is None: if interference_order is None:
# Guess the order... # A bit extreme...
max_tested_order = 12
# mask input data # mask input data
mask = (wavelengths >= wavelength_start) & (wavelengths <= wavelength_stop) mask = (wavelengths >= wavelength_start) & (wavelengths <= wavelength_stop)
@ -204,8 +210,7 @@ def thickness_from_scheludko(wavelengths,
min_difference = np.inf min_difference = np.inf
best_m = None thickness_values = None
best_h_values = None
if plot: if plot:
plt.figure() plt.figure()
@ -224,51 +229,85 @@ def thickness_from_scheludko(wavelengths,
if difference < min_difference: if difference < min_difference:
min_difference = difference min_difference = difference
best_m = m interference_order = m
best_h_values = h_values thickness_values = h_values
if plot: if plot:
plt.plot(wavelengths_masked, h_values,'.', markersize=3, label=f"Épaisseur du film (Scheludko, m={m})") plt.plot(wavelengths_masked, h_values,'.', markersize=3, label=f"Épaisseur du film (Scheludko, m={m})")
else: elif interference_order == 0:
File_I_min = 'tests/spectre_trou/000043641.xy'
_, intensities_I_min = load_spectrum(File_I_min, lambda_min=450)
min_peak_prominence = 0.02
peaks_min, peaks_max = finds_peak(wavelengths, intensities,
min_peak_prominence=min_peak_prominence,
plot=plot)
if len(peaks_max) != 1:
raise RuntimeError('Failed to detect a single maximum peak.')
lambda_unique = wavelengths[peaks_max[0]]
# keep rhs from the maximum
mask = wavelengths >= lambda_unique
wavelengths_masked = wavelengths[mask]
r_index_masked = r_index[mask]
intensities_masked = intensities[mask]
intensities_I_min_masked =intensities_I_min[mask]
interference_order = 0
thickness_values = _thicknesses_scheludko_at_order(wavelengths_masked,
intensities_masked,
interference_order,
r_index_masked,
Imin=intensities_I_min_masked)
elif interference_order > 0:
h_values = _thicknesses_scheludko_at_order(wavelengths_masked, h_values = _thicknesses_scheludko_at_order(wavelengths_masked,
intensities_masked, intensities_masked,
interference_order, interference_order,
r_index_masked) r_index_masked)
best_m = interference_order thickness_values = h_values
best_h_values = h_values else:
raise ValueError('interference_order must be >= 0.')
# Compute the thickness for the selected order # Compute the thickness for the selected order
# Delta # Delta
num = intensities_masked - np.min(intensities_masked) if interference_order == 0:
denom = np.max(intensities_masked) - np.min(intensities_masked) num = intensities_masked - np.min(intensities_I_min_masked)
denom = np.max(intensities_masked) - np.min(intensities_I_min_masked)
else:
num = intensities_masked - np.min(intensities_masked)
denom = np.max(intensities_masked) - np.min(intensities_masked)
Delta_from_data = num / denom Delta_from_data = num / denom
# Delta_from_data = (intensities_masked -np.min(intensities_masked))/(np.max(intensities_masked) -np.min(intensities_masked)) # Delta_from_data = (intensities_masked -np.min(intensities_masked))/(np.max(intensities_masked) -np.min(intensities_masked))
# Delta_from_data = (intensities_raw_masked -np.min(intensities_raw_masked))/(np.max(intensities_raw_masked) -np.min(intensities_raw_masked)) # Delta_from_data = (intensities_raw_masked -np.min(intensities_raw_masked))/(np.max(intensities_raw_masked) -np.min(intensities_raw_masked))
DeltaScheludko = _Delta(wavelengths_masked, DeltaScheludko = _Delta(wavelengths_masked,
np.mean(best_h_values), np.mean(thickness_values),
best_m, interference_order,
r_index_masked) r_index_masked)
xdata = (wavelengths_masked, r_index_masked) xdata = (wavelengths_masked, r_index_masked)
popt, pcov = curve_fit(lambda x, h: _Delta_fit(x, h, m), xdata, Delta_from_data, p0=[np.mean(best_h_values)]) popt, pcov = curve_fit(lambda x, h: _Delta_fit(x, h, interference_order), xdata, Delta_from_data, p0=[np.mean(thickness_values)])
fitted_h = popt[0] fitted_h = popt[0]
std_err = np.sqrt(pcov[0][0]) std_err = np.sqrt(pcov[0][0])
if plot: if plot:
Delta_values = _Delta(wavelengths_masked, fitted_h, best_m, r_index_masked) Delta_values = _Delta(wavelengths_masked, fitted_h, interference_order, r_index_masked)
plt.figure() plt.figure()
plt.plot(wavelengths_masked, Delta_from_data, plt.plot(wavelengths_masked, Delta_from_data,
'bo-', markersize=2, label=r'$\mathrm{{Smoothed}}\ \mathrm{{Data}}$') 'bo-', markersize=2, label=r'$\mathrm{{Smoothed}}\ \mathrm{{Data}}$')
# Scheludko # Scheludko
label = rf'$\mathrm{{Scheludko}}\ (h = {np.mean(best_h_values):.1f} \pm {np.std(best_h_values):.1f}\ \mathrm{{nm}})$' label = rf'$\mathrm{{Scheludko}}\ (h = {np.mean(thickness_values):.1f} \pm {np.std(thickness_values):.1f}\ \mathrm{{nm}})$'
plt.plot(wavelengths_masked, DeltaScheludko, plt.plot(wavelengths_masked, DeltaScheludko,
'go-', markersize=2, label=label) 'go-', markersize=2, label=label)
# Fit # Fit
@ -283,88 +322,3 @@ def thickness_from_scheludko(wavelengths,
return OptimizeResult(thickness=fitted_h, stderr=std_err) return OptimizeResult(thickness=fitted_h, stderr=std_err)
def thickness_for_order0(wavelengths,
intensities,
refractive_index,
min_peak_prominence,
plot=None):
if plot:
setup_matplotlib()
# 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,
min_peak_prominence=min_peak_prominence,
plot=plot)
if len(peaks_max) != 1:
raise RuntimeError('Failed to detect a single maximum peak.')
lambda_unique = wavelengths[peaks_max[0]]
# On crée le masque pour ne garder que les wavelengths superieures a wavelengths unique
mask = wavelengths >= lambda_unique
wavelengths_masked = wavelengths[mask]
r_index_masked = r_index[mask]
intensities_masked = intensities[mask]
intensities_I_min_masked =intensities_I_min[mask]
# We assume to be at order zero.
best_m = 0
best_h_values = _thicknesses_scheludko_at_order(wavelengths_masked,
intensities_masked,
best_m,
r_index_masked,
Imin=intensities_I_min_masked)
if plot:
plt.figure()
plt.plot(wavelengths_masked, best_h_values, label=r"Épaisseur du film (Scheludko, m=0)")
plt.ylabel(r'$h$ ($\mathrm{{nm}}$)')
plt.xlabel(r'$\lambda$ (nm)')
import inspect
plt.title(inspect.currentframe().f_code.co_name)
# Delta
num = intensities_masked - np.min(intensities_I_min_masked)
denom = np.max(intensities_masked) - np.min(intensities_I_min_masked)
Delta_from_data = num / denom
DeltaScheludko = _Delta(wavelengths_masked, np.mean(best_h_values), best_m, r_index_masked)
#print(np.mean(best_h_values),np.std(best_h_values))
xdata = (wavelengths_masked, r_index_masked)
popt, pcov = curve_fit(lambda x, h: _Delta_fit(x, h, best_m), xdata, Delta_from_data, p0=[np.mean(best_h_values)])
fitted_h = popt[0]
std_err = np.sqrt(pcov[0][0])
if plot:
Delta_values = _Delta(wavelengths_masked, fitted_h, best_m, r_index_masked)
plt.figure()
plt.plot(wavelengths_masked, Delta_from_data,
'bo-', markersize=2, label=r'$\mathrm{{Smoothed}}\ \mathrm{{Data}}$')
# Scheludko
label = rf'$\mathrm{{Scheludko}}\ (h = {np.mean(best_h_values):.1f} \pm {np.std(best_h_values):.1f}\ \mathrm{{nm}})$'
plt.plot(wavelengths_masked, DeltaScheludko,
'go-', markersize=2, label=label)
# Fit
label = rf'$\mathrm{{Fit}}\ (h = {fitted_h:.1f}\pm {std_err:.1f} \ \mathrm{{nm}})$'
plt.plot(wavelengths_masked, Delta_values, 'ro-', markersize=2, label=label)
plt.legend()
plt.ylabel(r'$\Delta$')
plt.xlabel(r'$\lambda$ ($ \mathrm{nm} $)')
import inspect
plt.title(inspect.currentframe().f_code.co_name)
return OptimizeResult(thickness=fitted_h, stderr=std_err)

View file

@ -2,6 +2,6 @@ T5543.xy: 744.4489624060151
T5612.xy: 717.9160763949778 T5612.xy: 717.9160763949778
T5677.xy: 701.481313603109 T5677.xy: 701.481313603109
T5747.xy: 682.6197534309899 T5747.xy: 682.6197534309899
T5817.xy: 662.8052850714089 #T5817.xy: 662.8052850714089
T5879.xy: 655.1166828174141 #T5879.xy: 655.1166828174141
T5951.xy: 620.3741353383458 T5951.xy: 620.3741353383458