diff --git a/check.py b/check.py index f55e107..1709a7c 100644 --- a/check.py +++ b/check.py @@ -18,9 +18,10 @@ plt.rcParams.update({ }) -def play_oder1(): +def minmax(): ##### Chemin du dossier contenant le spectre ##### from optifik.scheludko import thickness_from_scheludko + from optifik.scheludko import get_default_start_stop_wavelengths DATA_FOLDER = os.path.abspath(os.path.join(os.path.curdir, 'tests', 'basic')) @@ -35,7 +36,7 @@ def play_oder1(): FILE_NAME = '000004310.xy' #TEST# spectrum_file = os.path.join(DATA_FOLDER, FILE_NAME) - + lambdas, intensities = io.load_spectrum(spectrum_file) plot_spectrum(lambdas, intensities, title='Raw') @@ -51,12 +52,13 @@ def play_oder1(): peaks_min, peaks_max = finds_peak(lambdas, smoothed_intensities, min_peak_prominence=prominence, plot=True) - + def play_order1(): ##### Chemin du dossier contenant le spectre ##### from optifik.scheludko import thickness_from_scheludko + from optifik.scheludko import get_default_start_stop_wavelengths DATA_FOLDER = os.path.abspath(os.path.join(os.path.curdir, 'tests', 'basic')) @@ -89,9 +91,19 @@ def play_order1(): min_peak_prominence=prominence, plot=True) - result = thickness_from_scheludko(lambdas, smoothed_intensities, + w_start, w_stop = get_default_start_stop_wavelengths(lambdas, + smoothed_intensities, + refractive_index, + min_peak_prominence=prominence, + plot=True) + + + result = thickness_from_scheludko(lambdas, + smoothed_intensities, refractive_index=refractive_index, - min_peak_prominence=prominence, + wavelength_start=w_start, + wavelength_stop=w_stop, + interference_order=None, plot=True) def play_order0(): @@ -135,7 +147,7 @@ def play_order0(): min_peak_prominence=prominence, plot=True) - + def check_basic(): @@ -219,4 +231,4 @@ if __name__ == '__main__': #check_SV1() #play() play_order1() - + diff --git a/optifik/scheludko.py b/optifik/scheludko.py index d6df6c4..6c8832e 100644 --- a/optifik/scheludko.py +++ b/optifik/scheludko.py @@ -126,12 +126,43 @@ def _Delta_fit(xdata, thickness, interference_order): return _Delta(lambdas, thickness, interference_order, r_index) +def get_default_start_stop_wavelengths(wavelengths, + intensities, + refractive_index, + min_peak_prominence, + plot=None): + # idx_min idx max + peaks_min, peaks_max = finds_peak(wavelengths, intensities, + min_peak_prominence=min_peak_prominence, + plot=plot) + + failure, message = False, '' + if len(peaks_min) == 0: + message += 'Failed to detect at least one minimum. ' + failure = True + if len(peaks_max) == 0: + message += 'Failed to detect at least one maximum. ' + failure = True + if failure: + raise RuntimeError(message) + + # Get the last oscillation peaks + lambda_min = wavelengths[peaks_min[-1]] + lambda_max = wavelengths[peaks_max[-1]] + + # Order them + wavelength_start = min(lambda_min, lambda_max) + wavelength_stop = max(lambda_min, lambda_max) + + return wavelength_start, wavelength_stop def thickness_from_scheludko(wavelengths, intensities, refractive_index, - min_peak_prominence, + wavelength_start, + wavelength_stop, + interference_order=None, plot=None): """ @@ -160,69 +191,53 @@ def thickness_from_scheludko(wavelengths, max_tested_order = 12 r_index = refractive_index - # idx_min idx max - peaks_min, peaks_max = finds_peak(wavelengths, intensities, - min_peak_prominence=min_peak_prominence, - plot=plot) - - failure, message = False, '' - if len(peaks_min) == 0: - message += 'Failed to detect at least one minimum. ' - failure = True - if len(peaks_max) == 0: - message += 'Failed to detect at least one maximum. ' - failure = True - if failure: - raise RuntimeError(message) - - # Get the last oscillation peaks - lambda_min = wavelengths[peaks_min[-1]] - lambda_max = wavelengths[peaks_max[-1]] - - # Order them - lambda_start = min(lambda_min, lambda_max) - lambda_stop = max(lambda_min, lambda_max) - # Guess the order... + if interference_order is None: + # Guess the order... - # mask input data - mask = (wavelengths >= lambda_start) & (wavelengths <= lambda_stop) - wavelengths_masked = wavelengths[mask] - r_index_masked = r_index[mask] - intensities_masked = intensities[mask] + # mask input data + mask = (wavelengths >= wavelength_start) & (wavelengths <= wavelength_stop) + wavelengths_masked = wavelengths[mask] + r_index_masked = r_index[mask] + intensities_masked = intensities[mask] - - - min_difference = np.inf - best_m = None - best_h_values = None - - if plot: - plt.figure() - plt.ylabel(r'$h$ ($\mathrm{{nm}}$)') - plt.xlabel(r'$\lambda$ ($ \mathrm{nm} $)') - - for m in range(0, max_tested_order+1): - h_values = _thicknesses_scheludko_at_order(wavelengths_masked, - intensities_masked, - m, r_index_masked) - - difference = np.max(h_values) - np.min(h_values) - - print(f"h-difference for m={m}: {difference:.1f} nm") - - if difference < min_difference: - min_difference = difference - best_m = m - best_h_values = h_values + min_difference = np.inf + best_m = None + best_h_values = None if plot: - plt.plot(wavelengths_masked, h_values,'.', markersize=3, label=f"Épaisseur du film (Scheludko, m={m})") + plt.figure() + plt.ylabel(r'$h$ ($\mathrm{{nm}}$)') + plt.xlabel(r'$\lambda$ ($ \mathrm{nm} $)') + + for m in range(0, max_tested_order+1): + h_values = _thicknesses_scheludko_at_order(wavelengths_masked, + intensities_masked, + m, + r_index_masked) + + difference = np.max(h_values) - np.min(h_values) + + print(f"h-difference for m={m}: {difference:.1f} nm") + + if difference < min_difference: + min_difference = difference + best_m = m + best_h_values = h_values + + if plot: + plt.plot(wavelengths_masked, h_values,'.', markersize=3, label=f"Épaisseur du film (Scheludko, m={m})") + else: + h_values = _thicknesses_scheludko_at_order(wavelengths_masked, + intensities_masked, + interference_order, + r_index_masked) + best_m = interference_order + best_h_values = h_values - print(f"Optimized: m={best_m}") # Compute the thickness for the selected order diff --git a/tests/test_SV2o1.py b/tests/test_SV2o1.py index c099e44..1db4762 100644 --- a/tests/test_SV2o1.py +++ b/tests/test_SV2o1.py @@ -4,6 +4,7 @@ from numpy.testing import assert_allclose import pytest from optifik.scheludko import thickness_from_scheludko +from optifik.scheludko import get_default_start_stop_wavelengths from optifik.io import load_spectrum from optifik.analysis import smooth_intensities @@ -26,13 +27,21 @@ def test_SV2o1(spectrum_path, expected): lambdas, raw_intensities = load_spectrum(spectrum_path, lambda_min=450) smoothed_intensities = smooth_intensities(raw_intensities) - refractive_index = 1.324188 + 3102.060378 / (lambdas**2) + r_index = 1.324188 + 3102.060378 / (lambdas**2) prominence = 0.020 + w_start, w_stop = get_default_start_stop_wavelengths(lambdas, + smoothed_intensities, + refractive_index=r_index, + min_peak_prominence=prominence, + plot=False) - result = thickness_from_scheludko(lambdas, smoothed_intensities, - refractive_index=refractive_index, - min_peak_prominence=prominence, + result = thickness_from_scheludko(lambdas, + smoothed_intensities, + refractive_index=r_index, + wavelength_start=w_start, + wavelength_stop=w_stop, + interference_order=None, plot=False) assert_allclose(result.thickness, expected, rtol=1e-1) diff --git a/tests/test_SV2o2.py b/tests/test_SV2o2.py index 18e804d..01d7ff3 100644 --- a/tests/test_SV2o2.py +++ b/tests/test_SV2o2.py @@ -4,6 +4,7 @@ from numpy.testing import assert_allclose import pytest from optifik.scheludko import thickness_from_scheludko +from optifik.scheludko import get_default_start_stop_wavelengths from optifik.io import load_spectrum from optifik.analysis import smooth_intensities @@ -25,14 +26,23 @@ def test_SV2o2(spectrum_path, expected): lambdas, raw_intensities = load_spectrum(spectrum_path, lambda_min=450) smoothed_intensities = smooth_intensities(raw_intensities) - refractive_index = 1.324188 + 3102.060378 / (lambdas**2) + r_index = 1.324188 + 3102.060378 / (lambdas**2) prominence = 0.01 + w_start, w_stop = get_default_start_stop_wavelengths(lambdas, + smoothed_intensities, + refractive_index=r_index, + min_peak_prominence=prominence, + plot=False) + + thickness_scheludko = thickness_from_scheludko(lambdas, + smoothed_intensities, + refractive_index=r_index, + wavelength_start=w_start, + wavelength_stop=w_stop, + interference_order=None, + plot=False) - thickness_scheludko = thickness_from_scheludko(lambdas, smoothed_intensities, - refractive_index=refractive_index, - min_peak_prominence=prominence, - plot=False) result = thickness_scheludko.thickness assert_allclose(result, expected, rtol=1e-1) diff --git a/tests/test_SV2o3.py b/tests/test_SV2o3.py index 478b22d..2e50472 100644 --- a/tests/test_SV2o3.py +++ b/tests/test_SV2o3.py @@ -4,6 +4,7 @@ from numpy.testing import assert_allclose import pytest from optifik.scheludko import thickness_from_scheludko +from optifik.scheludko import get_default_start_stop_wavelengths from optifik.io import load_spectrum from optifik.analysis import smooth_intensities @@ -25,14 +26,23 @@ def test_SV2o3(spectrum_path, expected): lambdas, raw_intensities = load_spectrum(spectrum_path, lambda_min=450) smoothed_intensities = smooth_intensities(raw_intensities) - refractive_index = 1.324188 + 3102.060378 / (lambdas**2) + r_index = 1.324188 + 3102.060378 / (lambdas**2) prominence = 0.02 + w_start, w_stop = get_default_start_stop_wavelengths(lambdas, + smoothed_intensities, + refractive_index=r_index, + min_peak_prominence=prominence, + plot=False) + + thickness_scheludko = thickness_from_scheludko(lambdas, + smoothed_intensities, + refractive_index=r_index, + wavelength_start=w_start, + wavelength_stop=w_stop, + interference_order=None, + plot=False) - thickness_scheludko = thickness_from_scheludko(lambdas, smoothed_intensities, - refractive_index=refractive_index, - min_peak_prominence=prominence, - plot=False) result = thickness_scheludko.thickness assert_allclose(result, expected, rtol=1e-1) diff --git a/tests/test_SV2o4.py b/tests/test_SV2o4.py index caac1bc..78dd49e 100644 --- a/tests/test_SV2o4.py +++ b/tests/test_SV2o4.py @@ -4,6 +4,7 @@ from numpy.testing import assert_allclose import pytest from optifik.scheludko import thickness_from_scheludko +from optifik.scheludko import get_default_start_stop_wavelengths from optifik.io import load_spectrum from optifik.analysis import smooth_intensities @@ -25,14 +26,23 @@ def test_SV2o4(spectrum_path, expected): lambdas, raw_intensities = load_spectrum(spectrum_path, lambda_min=450) smoothed_intensities = smooth_intensities(raw_intensities) - refractive_index = 1.324188 + 3102.060378 / (lambdas**2) + r_index = 1.324188 + 3102.060378 / (lambdas**2) prominence = 0.02 + w_start, w_stop = get_default_start_stop_wavelengths(lambdas, + smoothed_intensities, + refractive_index=r_index, + min_peak_prominence=prominence, + plot=False) + + thickness_scheludko = thickness_from_scheludko(lambdas, + smoothed_intensities, + refractive_index=r_index, + wavelength_start=w_start, + wavelength_stop=w_stop, + interference_order=None, + plot=False) - thickness_scheludko = thickness_from_scheludko(lambdas, smoothed_intensities, - refractive_index=refractive_index, - min_peak_prominence=prominence, - plot=False) result = thickness_scheludko.thickness assert_allclose(result, expected, rtol=1e-1) diff --git a/tests/test_SV2o5.py b/tests/test_SV2o5.py index 32ba9af..d85f1d1 100644 --- a/tests/test_SV2o5.py +++ b/tests/test_SV2o5.py @@ -4,6 +4,7 @@ from numpy.testing import assert_allclose import pytest from optifik.scheludko import thickness_from_scheludko +from optifik.scheludko import get_default_start_stop_wavelengths from optifik.io import load_spectrum from optifik.analysis import smooth_intensities @@ -25,14 +26,24 @@ def test_SV2o5(spectrum_path, expected): lambdas, raw_intensities = load_spectrum(spectrum_path, lambda_min=450) smoothed_intensities = smooth_intensities(raw_intensities) - refractive_index = 1.324188 + 3102.060378 / (lambdas**2) + r_index = 1.324188 + 3102.060378 / (lambdas**2) prominence = 0.02 + w_start, w_stop = get_default_start_stop_wavelengths(lambdas, + smoothed_intensities, + refractive_index=r_index, + min_peak_prominence=prominence, + plot=False) + + + thickness_scheludko = thickness_from_scheludko(lambdas, + smoothed_intensities, + refractive_index=r_index, + wavelength_start=w_start, + wavelength_stop=w_stop, + interference_order=None, + plot=False) - thickness_scheludko = thickness_from_scheludko(lambdas, smoothed_intensities, - refractive_index=refractive_index, - min_peak_prominence=prominence, - plot=False) result = thickness_scheludko.thickness assert_allclose(result, expected, rtol=1e-1) diff --git a/tests/test_basic.py b/tests/test_basic.py index 35b0b06..e8b3cd2 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -6,6 +6,7 @@ import pytest from optifik.fft import thickness_from_fft from optifik.minmax import thickness_from_minmax from optifik.scheludko import thickness_from_scheludko +from optifik.scheludko import get_default_start_stop_wavelengths from optifik.scheludko import thickness_for_order0 from optifik.analysis import smooth_intensities from optifik.io import load_spectrum @@ -19,15 +20,16 @@ def test_FFT(): spectrum_path = os.path.join(FOLDER, FILE_NAME) lambdas, raw_intensities = load_spectrum(spectrum_path, lambda_min=450) smoothed_intensities = smooth_intensities(raw_intensities) - indice = 1.324188 + 3102.060378 / (lambdas**2) + r_index = 1.324188 + 3102.060378 / (lambdas**2) thickness_FFT = thickness_from_fft(lambdas, smoothed_intensities, - refractive_index=indice) + refractive_index=r_index) result = thickness_FFT.thickness assert_allclose(result, expected, rtol=1e-1) + def test_minmax_ransac(): FOLDER = os.path.join('tests', 'basic') FILE_NAME = '000004310.xy' @@ -36,13 +38,13 @@ def test_minmax_ransac(): spectrum_path = os.path.join(FOLDER, FILE_NAME) lambdas, raw_intensities = load_spectrum(spectrum_path, lambda_min=450) smoothed_intensities = smooth_intensities(raw_intensities) - indice = 1.324188 + 3102.060378 / (lambdas**2) + r_index = 1.324188 + 3102.060378 / (lambdas**2) prominence = 0.02 result = thickness_from_minmax(lambdas, smoothed_intensities, - refractive_index=indice, + refractive_index=r_index, min_peak_prominence=prominence, method='ransac', plot=False) @@ -58,19 +60,29 @@ def test_scheludko_4peaks(): spectrum_path = os.path.join(FOLDER, FILE_NAME) lambdas, raw_intensities = load_spectrum(spectrum_path, lambda_min=450) smoothed_intensities = smooth_intensities(raw_intensities) - indice = 1.324188 + 3102.060378 / (lambdas**2) + r_index = 1.324188 + 3102.060378 / (lambdas**2) prominence = 0.02 - result = thickness_from_scheludko(lambdas, smoothed_intensities, - refractive_index=indice, - min_peak_prominence=prominence, - plot=False) + + w_start, w_stop = get_default_start_stop_wavelengths(lambdas, + smoothed_intensities, + refractive_index=r_index, + min_peak_prominence=prominence, + plot=False) + + + result = thickness_from_scheludko(lambdas, + smoothed_intensities, + refractive_index=r_index, + wavelength_start=w_start, + wavelength_stop=w_stop, + interference_order=None, + plot=False) assert_allclose(result.thickness, expected, rtol=1e-1) - def test_scheludko_2peaks(): FOLDER = os.path.join('tests', 'basic') FILE_NAME = '000006544.xy' @@ -79,21 +91,28 @@ def test_scheludko_2peaks(): spectrum_path = os.path.join(FOLDER, FILE_NAME) lambdas, raw_intensities = load_spectrum(spectrum_path, lambda_min=450) smoothed_intensities = smooth_intensities(raw_intensities) - indice = 1.324188 + 3102.060378 / (lambdas**2) + r_index = 1.324188 + 3102.060378 / (lambdas**2) prominence = 0.03 - result = thickness_from_scheludko(lambdas, smoothed_intensities, - refractive_index=indice, - min_peak_prominence=prominence, - plot=False) + + w_start, w_stop = get_default_start_stop_wavelengths(lambdas, + smoothed_intensities, + refractive_index=r_index, + min_peak_prominence=prominence, + plot=False) + + result = thickness_from_scheludko(lambdas, + smoothed_intensities, + refractive_index=r_index, + wavelength_start=w_start, + wavelength_stop=w_stop, + interference_order=None, + plot=False) assert_allclose(result.thickness, expected, rtol=1e-1) - - - def test_order0(): FOLDER = os.path.join('tests', 'basic') FILE_NAME = '000018918.xy' @@ -102,13 +121,13 @@ def test_order0(): spectrum_path = os.path.join(FOLDER, FILE_NAME) lambdas, raw_intensities = load_spectrum(spectrum_path, lambda_min=450) smoothed_intensities = smooth_intensities(raw_intensities) - indice = 1.324188 + 3102.060378 / (lambdas**2) + r_index = 1.324188 + 3102.060378 / (lambdas**2) prominence = 0.03 result = thickness_for_order0(lambdas, smoothed_intensities, - refractive_index=indice, + refractive_index=r_index, min_peak_prominence=prominence, plot=False)