clean up
This commit is contained in:
parent
157fcdc102
commit
5fe2ef7a67
2 changed files with 61 additions and 107 deletions
|
@ -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)
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue