def test_all_slit_shapes( FWHM=0.4, verbose=True, plot=True, close_plots=True, *args, **kwargs ): """ Test all slit generation functions and make sure we get the expected FWHM""" if plot: plt.ion() # dont get stuck with Matplotlib if executing through pytest if close_plots: plt.close("all") # get spectrum from radis.spectrum.spectrum import Spectrum from radis.test.utils import getTestFile s = Spectrum.from_txt( getTestFile("calc_N2C_spectrum_Trot1200_Tvib3000.txt"), quantity="radiance_noslit", waveunit="nm", unit="mW/cm2/sr/µm", ) wstep = np.diff(s.get_wavelength())[0] # Plot all slits # ... gaussian s.apply_slit(FWHM, unit="nm", shape="gaussian", plot_slit=plot) assert np.isclose(get_FWHM(*s.get_slit()), FWHM, atol=2 * wstep) # ... triangular s.apply_slit(FWHM, unit="nm", shape="triangular", plot_slit=plot) assert np.isclose(get_FWHM(*s.get_slit()), FWHM, atol=2 * wstep) # ... trapezoidal s.apply_slit( (FWHM * 0.9, FWHM * 1.1), unit="nm", shape="trapezoidal", plot_slit=plot ) assert np.isclose(get_FWHM(*s.get_slit()), FWHM, atol=2 * wstep) # # ... trapezoidal # s.apply_slit(FWHM, unit='nm', shape='trapezoidal', plot_slit=plot, norm='max') # assert np.isclose(get_FWHM(*s.get_slit()), FWHM, atol=1.1*wstep) # ... experimental s.apply_slit(getTestFile("slitfunction.txt"), unit="nm", plot_slit=plot) assert np.isclose(get_effective_FWHM(*s.get_slit()), FWHM, atol=0.01) # note that we're applying a slit function measured at 632.5 nm to a Spectrum # at 4.7 µm. It's just good for testing the functions # # ... experimental, convolve with max # s.apply_slit(getTestFile('slitfunction.txt'), unit='nm', norm_by='max', plot_slit=plot) # assert np.isclose(get_FWHM(*s.get_slit()), FWHM, atol=1.1*wstep) if verbose: print("\n>>> _test_all_slits yield correct FWHM (+- wstep) : OK\n") return True # nothing defined yet
def test_slit_unit_conversions_spectrum_in_cm(verbose=True, plot=True, close_plots=True, *args, **kwargs): """ Test that slit is consistently applied for different units Assert that: - calculated FWHM is the one that was applied """ from radis.test.utils import getTestFile from radis.tools.database import load_spec if plot: # dont get stuck with Matplotlib if executing through pytest plt.ion() if close_plots: plt.close("all") # %% Get a Spectrum (stored in cm-1) s_cm = load_spec(getTestFile("CO_Tgas1500K_mole_fraction0.01.spec"), binary=True) s_cm.rescale_mole_fraction(1) # just because it makes better units s_cm.update() wstep = s_cm.conditions["wstep"] assert s_cm.get_waveunit() == "cm-1" # ensures it's stored in cm-1 for shape in ["gaussian", "triangular"]: # Apply slit in cm-1 slit_cm = 2 s_cm.name = "Spec in cm-1, slit {0:.2f} cm-1".format(slit_cm) s_cm.apply_slit(slit_cm, unit="cm-1", shape=shape, mode="same") # ... mode=same to keep same output length. It helps compare both Spectra afterwards # in cm-1 as that's s.get_waveunit() fwhm = get_FWHM(*s_cm.get_slit()) assert np.isclose(slit_cm, fwhm, atol=2 * wstep) # Apply slit in nm this time s_nm = s_cm.copy() w_cm = s_nm.get_wavenumber(which="non_convoluted") slit_nm = dcm2dnm(slit_cm, w_cm[len(w_cm) // 2]) s_nm.name = "Spec in cm-1, slit {0:.2f} nm".format(slit_nm) s_nm.apply_slit(slit_nm, unit="nm", shape=shape, mode="same") plotargs = {} if plot: plotargs[ "title"] = "test_slit_unit_conversions: {0} ({1} cm-1)".format( shape, slit_cm) s_cm.compare_with(s_nm, spectra_only="radiance", rtol=1e-3, verbose=verbose, plot=plot, **plotargs)
def test_spectrum_get_methods(verbose=True, plot=True, close_plots=True, *args, **kwargs): ''' Test all spectrum methods on a Spectrum generated in Specair ''' from radis.test.utils import getTestFile from radis.tools.database import load_spec from radis.tools.slit import get_FWHM if plot and close_plots: import matplotlib.pyplot as plt plt.close('all') s = load_spec(getTestFile('N2C_specair_380nm.spec')) # general methods if verbose: print(s) dir(s) # access properties assert s.get_name() == 'N2C_specair_380nm' assert all( s.get_radiance_noslit(Iunit='W/m2/sr/nm') == s.get( 'radiance_noslit', Iunit='W/m2/sr/nm')[1]) assert all(nm2cm(s.get_wavelength(medium='vacuum')) == s.get_wavenumber()) assert s.get_power(unit='W/cm2/sr') == 2631.6288408588148 assert s.get_waveunit() == 'nm' assert s.get_power(unit='W/cm2/sr') == s.get_integral('radiance_noslit', Iunit='W/cm2/sr/nm') assert s.get_conditions()['Tgas'] == 1500 assert s.get_medium() == 'air' assert len(s.get_vars()) == 2 assert s.is_at_equilibrium() == False assert s.is_optically_thin() == False # Check applied slit has the correct width s.apply_slit(0.5) wslit, Islit = s.get_slit() wstep = np.diff(wslit)[0] assert np.isclose(get_FWHM(*s.get_slit()), 0.5, atol=1.1 * wstep) if plot: s.plot_slit() if verbose: print('Tested Spectrum methods:') print('...print(Spectrum)') print('.. get_name()') print('.. get_radiance_noslit() vs get()') print('.. get_wavelength() vs get_wavenumber') print('.. get_power()') print('.. get_waveunit()') print('.. get_power() vs get_integral()') print('.. get_conditions()') print('.. get_vars()') print('.. is_at_equilibrium()') print('.. is_optically_thin()') print('.. get_slit()')
def test_slit_unit_conversions_spectrum_in_nm(verbose=True, plot=True, close_plots=True, *args, **kwargs): ''' Test that slit is consistently applied for different units Assert that: - calculated FWHM is the one that was applied ''' from radis.test.utils import getTestFile from radis.spectrum.spectrum import Spectrum if plot: # dont get stuck with Matplotlib if executing through pytest plt.ion() if close_plots: plt.close('all') # %% Get a Spectrum (stored in nm) s_nm = Spectrum.from_txt(getTestFile('calc_N2C_spectrum_Trot1200_Tvib3000.txt'), quantity='radiance_noslit', waveunit='nm', unit='mW/cm2/sr/µm', conditions={'self_absorption': False}) with catch_warnings(): filterwarnings( 'ignore', 'Condition missing to know if spectrum is at equilibrium:') # just because it makes better units s_nm.rescale_path_length(1, 0.001) wstep = np.diff(s_nm.get_wavelength())[0] assert s_nm.get_waveunit() == 'nm' # ensures it's stored in cm-1 for shape in ['gaussian', 'triangular']: # Apply slit in nm slit_nm = 0.5 s_nm.name = 'Spec in nm, slit {0:.2f} nm'.format(slit_nm) s_nm.apply_slit(slit_nm, unit='nm', shape=shape, mode='same') # ... mode=same to keep same output length. It helps compare both Spectra afterwards # in cm-1 as that's s.get_waveunit() fwhm = get_FWHM(*s_nm.get_slit()) assert np.isclose(slit_nm, fwhm, atol=2*wstep) # Apply slit in nm this time s_cm = s_nm.copy() w_nm = s_nm.get_wavelength(which='non_convoluted') slit_cm = dnm2dcm(slit_nm, w_nm[len(w_nm)//2]) s_cm.name = 'Spec in nm, slit {0:.2f} cm-1'.format(slit_cm) s_cm.apply_slit(slit_cm, unit='cm-1', shape=shape, mode='same') plotargs = {} if plot: plotargs['title'] = 'test_slit_unit_conversions: {0} ({1} nm)'.format( shape, slit_nm) s_nm.compare_with(s_cm, spectra_only='radiance', rtol=1e-3, verbose=verbose, plot=plot, **plotargs)
def test_spectrum_get_methods(verbose=True, plot=True, close_plots=True, *args, **kwargs): """ Test all spectrum methods on a Spectrum generated in Specair """ from radis.test.utils import getTestFile from radis.tools.database import load_spec from radis.tools.slit import get_FWHM if plot and close_plots: import matplotlib.pyplot as plt plt.close("all") s = load_spec(getTestFile("N2C_specair_380nm.spec"), binary=False) # general methods if verbose: print(s) dir(s) # access properties assert s.get_name() == "N2C_specair_380nm" assert all( s.get_radiance_noslit(Iunit="W/m2/sr/nm") == s.get( "radiance_noslit", Iunit="W/m2/sr/nm")[1]) assert all(nm2cm(s.get_wavelength(medium="vacuum")) == s.get_wavenumber()) assert np.isclose(s.get_power(unit="W/cm2/sr"), 2631.6288408588148) assert s.get_waveunit() == "nm" assert np.isclose( s.get_power(unit="W/cm2/sr"), s.get_integral("radiance_noslit", Iunit="W/cm2/sr/nm"), ) assert s.get_conditions()["Tgas"] == 1500 assert len(s.get_vars()) == 2 assert s.is_at_equilibrium() == False assert s.is_optically_thin() == False # Check applied slit has the correct width s.apply_slit(0.5) wslit, Islit = s.get_slit() wstep = np.diff(wslit)[0] assert np.isclose(get_FWHM(*s.get_slit()), 0.5, atol=1.1 * wstep) if plot: s.plot_slit() if verbose: print("Tested Spectrum methods:") print("...print(Spectrum)") print(".. get_name()") print(".. get_radiance_noslit() vs get()") print(".. get_wavelength() vs get_wavenumber") print(".. get_power()") print(".. get_waveunit()") print(".. get_power() vs get_integral()") print(".. get_conditions()") print(".. get_vars()") print(".. is_at_equilibrium()") print(".. is_optically_thin()") print(".. get_slit()")
def test_slit_unit_conversions_spectrum_in_nm( verbose=True, plot=True, close_plots=True, *args, **kwargs ): """Test that slit is consistently applied for different units Assert that: - calculated FWHM is the one that was applied """ from radis.spectrum.spectrum import Spectrum from radis.test.utils import getTestFile if plot: # dont get stuck with Matplotlib if executing through pytest plt.ion() if close_plots: plt.close("all") # %% Get a Spectrum (stored in nm) s_nm = Spectrum.from_txt( getTestFile("calc_N2C_spectrum_Trot1200_Tvib3000.txt"), quantity="radiance_noslit", waveunit="nm", unit="mW/cm2/sr/µm", conditions={"self_absorption": False}, ) with catch_warnings(): filterwarnings( "ignore", "Condition missing to know if spectrum is at equilibrium:" ) # just because it makes better units s_nm.rescale_path_length(1, 0.001) wstep = np.diff(s_nm.get_wavelength())[0] assert s_nm.get_waveunit() == "nm" # ensures it's stored in cm-1 for shape in ["gaussian", "triangular"]: # Apply slit in nm slit_nm = 0.5 s_nm.name = "Spec in nm, slit {0:.2f} nm".format(slit_nm) s_nm.apply_slit(slit_nm, unit="nm", shape=shape, mode="same") # ... mode=same to keep same output length. It helps compare both Spectra afterwards # in cm-1 as that's s.get_waveunit() fwhm = get_FWHM(*s_nm.get_slit()) assert np.isclose(slit_nm, fwhm, atol=2 * wstep) # Apply slit in nm this time s_cm = s_nm.copy() w_nm = s_nm.get_wavelength(which="non_convoluted") slit_cm = dnm2dcm(slit_nm, w_nm[len(w_nm) // 2]) s_cm.name = "Spec in nm, slit {0:.2f} cm-1".format(slit_cm) s_cm.apply_slit(slit_cm, unit="cm-1", shape=shape, mode="same") plotargs = {} if plot: plotargs["title"] = "test_slit_unit_conversions: {0} ({1} nm)".format( shape, slit_nm ) s_nm.compare_with( s_cm, spectra_only="radiance", rtol=1e-3, verbose=verbose, plot=plot, **plotargs )