def test_total_flux(self): deltapix = 0.1 x_grid, y_grid = util.make_grid(numPix=400, deltapix=deltapix) r_eff = 1 I_eff = 1. n_sersic = 2 flux_analytic = self.sersic.total_flux(amp=I_eff, R_sersic=r_eff, n_sersic=n_sersic, e1=0, e2=0) flux_grid = self.sersic.function(x_grid, y_grid, R_sersic=r_eff, n_sersic=n_sersic, amp=I_eff) flux_numeric = np.sum(flux_grid) * deltapix**2 npt.assert_almost_equal(flux_numeric / flux_analytic, 1, decimal=2) # and here we check with ellipticity e1, e2 = 0.1, 0 sersic_elliptic_major = SersicElliptic(smoothing=0.02, sersic_major_axis=True) flux_analytic_ell = sersic_elliptic_major.total_flux(amp=I_eff, R_sersic=r_eff, n_sersic=n_sersic, e1=e1, e2=e2) flux_grid = sersic_elliptic_major.function(x_grid, y_grid, R_sersic=r_eff, n_sersic=n_sersic, amp=I_eff, e1=e1, e2=e2) flux_numeric_ell = np.sum(flux_grid) * deltapix**2 npt.assert_almost_equal(flux_numeric_ell / flux_analytic_ell, 1, decimal=2) e1, e2 = 0.1, 0 sersic_elliptic_product = SersicElliptic(smoothing=0.02, sersic_major_axis=False) flux_analytic_ell = sersic_elliptic_product.total_flux( amp=I_eff, R_sersic=r_eff, n_sersic=n_sersic, e1=e1, e2=e2) flux_grid = sersic_elliptic_product.function(x_grid, y_grid, R_sersic=r_eff, n_sersic=n_sersic, amp=I_eff, e1=e1, e2=e2) flux_numeric_ell = np.sum(flux_grid) * deltapix**2 npt.assert_almost_equal(flux_numeric_ell / flux_analytic_ell, 1, decimal=2)
def __init__(self, light_model_list, smoothing=0.001): """ :param light_model_list: list of light models :param smoothing: smoothing factor for certain models (deprecated) """ self.profile_type_list = light_model_list self.func_list = [] for profile_type in light_model_list: if profile_type == 'GAUSSIAN': from lenstronomy.LightModel.Profiles.gaussian import Gaussian self.func_list.append(Gaussian()) elif profile_type == 'GAUSSIAN_ELLIPSE': from lenstronomy.LightModel.Profiles.gaussian import GaussianEllipse self.func_list.append(GaussianEllipse()) elif profile_type == 'ELLIPSOID': from lenstronomy.LightModel.Profiles.ellipsoid import Ellipsoid self.func_list.append(Ellipsoid()) elif profile_type == 'MULTI_GAUSSIAN': from lenstronomy.LightModel.Profiles.gaussian import MultiGaussian self.func_list.append(MultiGaussian()) elif profile_type == 'MULTI_GAUSSIAN_ELLIPSE': from lenstronomy.LightModel.Profiles.gaussian import MultiGaussianEllipse self.func_list.append(MultiGaussianEllipse()) elif profile_type == 'SERSIC': from lenstronomy.LightModel.Profiles.sersic import Sersic self.func_list.append(Sersic(smoothing=smoothing)) elif profile_type == 'SERSIC_ELLIPSE': from lenstronomy.LightModel.Profiles.sersic import SersicElliptic self.func_list.append( SersicElliptic(smoothing=smoothing, sersic_major_axis=sersic_major_axis_conf)) elif profile_type == 'CORE_SERSIC': from lenstronomy.LightModel.Profiles.sersic import CoreSersic self.func_list.append(CoreSersic(smoothing=smoothing)) elif profile_type == 'SHAPELETS': from lenstronomy.LightModel.Profiles.shapelets import ShapeletSet self.func_list.append(ShapeletSet()) elif profile_type == 'SHAPELETS_POLAR': from lenstronomy.LightModel.Profiles.shapelets_polar import ShapeletSetPolar self.func_list.append(ShapeletSetPolar(exponential=False)) elif profile_type == 'SHAPELETS_POLAR_EXP': from lenstronomy.LightModel.Profiles.shapelets_polar import ShapeletSetPolar self.func_list.append(ShapeletSetPolar(exponential=True)) elif profile_type == 'HERNQUIST': from lenstronomy.LightModel.Profiles.hernquist import Hernquist self.func_list.append(Hernquist()) elif profile_type == 'HERNQUIST_ELLIPSE': from lenstronomy.LightModel.Profiles.hernquist import HernquistEllipse self.func_list.append(HernquistEllipse()) elif profile_type == 'PJAFFE': from lenstronomy.LightModel.Profiles.p_jaffe import PJaffe self.func_list.append(PJaffe()) elif profile_type == 'PJAFFE_ELLIPSE': from lenstronomy.LightModel.Profiles.p_jaffe import PJaffe_Ellipse self.func_list.append(PJaffe_Ellipse()) elif profile_type == 'UNIFORM': from lenstronomy.LightModel.Profiles.uniform import Uniform self.func_list.append(Uniform()) elif profile_type == 'POWER_LAW': from lenstronomy.LightModel.Profiles.power_law import PowerLaw self.func_list.append(PowerLaw()) elif profile_type == 'NIE': from lenstronomy.LightModel.Profiles.nie import NIE self.func_list.append(NIE()) elif profile_type == 'CHAMELEON': from lenstronomy.LightModel.Profiles.chameleon import Chameleon self.func_list.append(Chameleon()) elif profile_type == 'DOUBLE_CHAMELEON': from lenstronomy.LightModel.Profiles.chameleon import DoubleChameleon self.func_list.append(DoubleChameleon()) elif profile_type == 'TRIPLE_CHAMELEON': from lenstronomy.LightModel.Profiles.chameleon import TripleChameleon self.func_list.append(TripleChameleon()) elif profile_type == 'INTERPOL': from lenstronomy.LightModel.Profiles.interpolation import Interpol self.func_list.append(Interpol()) elif profile_type == 'SLIT_STARLETS': from lenstronomy.LightModel.Profiles.starlets import SLIT_Starlets self.func_list.append( SLIT_Starlets(fast_inverse=True, second_gen=False)) elif profile_type == 'SLIT_STARLETS_GEN2': from lenstronomy.LightModel.Profiles.starlets import SLIT_Starlets self.func_list.append(SLIT_Starlets(second_gen=True)) else: raise ValueError( 'No light model of type %s found! Supported are the following models: %s' % (profile_type, _MODELS_SUPPORTED)) self._num_func = len(self.func_list)
def setup(self): self.sersic_gauss = SersicEllipseGaussDec() self.sersic_light = SersicElliptic() self.sersic_sphere = Sersic()
class TestSersicEllipseGaussDec(object): """ This class tests the methods for Gauss-decomposed elliptic Sersic convergence. """ def setup(self): self.sersic_gauss = SersicEllipseGaussDec() self.sersic_light = SersicElliptic() self.sersic_sphere = Sersic() def test_function(self): """ Test the potential function of Gauss-decomposed elliptical Sersic by asserting that the numerical derivative of the computed potential matches with the analytical derivative values. :return: :rtype: """ k_eff = 1. R_sersic = 1. n_sersic = 1. e1 = 0.2 e2 = 0.2 center_x = 0. center_y = 0. diff = 1.e-6 n = 5 xs = np.linspace(0.5 * R_sersic, 2. * R_sersic, n) ys = np.linspace(0.5 * R_sersic, 2. * R_sersic, n) for x, y in zip(xs, ys): func = self.sersic_gauss.function(x, y, e1=e1, e2=e2, center_x=center_x, center_y=center_y, n_sersic=n_sersic, R_sersic=R_sersic, k_eff=k_eff ) func_dx = self.sersic_gauss.function(x+diff, y, e1=e1, e2=e2, center_x=center_x, center_y=center_y, n_sersic=n_sersic, R_sersic=R_sersic, k_eff=k_eff ) func_dy = self.sersic_gauss.function(x, y+diff, e1=e1, e2=e2, center_x=center_x, center_y=center_y, n_sersic=n_sersic, R_sersic=R_sersic, k_eff=k_eff ) f_x_num = (func_dx - func) / diff f_y_num = (func_dy - func) / diff f_x, f_y = self.sersic_gauss.derivatives(x, y, e1=e1, e2=e2, center_x=center_x, center_y=center_y, n_sersic=n_sersic, R_sersic=R_sersic, k_eff=k_eff ) npt.assert_almost_equal(f_x_num, f_x, decimal=4) npt.assert_almost_equal(f_y_num, f_y, decimal=4) def test_derivatives(self): """ Test the derivative function of Gauss-decomposed elliptical Sersic by matching with the spherical case. :return: :rtype: """ k_eff = 1. R_sersic = 1. n_sersic = 1. e1 = 5.e-5 e2 = 0. center_x = 0. center_y = 0. n = 10 x = np.linspace(0.5*R_sersic, 2.*R_sersic, n) y = np.linspace(0.5*R_sersic, 2.*R_sersic, n) X, Y = np.meshgrid(x, y) f_x_s, f_y_s = self.sersic_sphere.derivatives(X, Y, center_x=center_x, center_y=center_y, n_sersic=n_sersic, R_sersic=R_sersic, k_eff=k_eff ) f_x, f_y = self.sersic_gauss.derivatives(X, Y, e1=e1, e2=e2, center_x=center_x, center_y=center_y, n_sersic=n_sersic, R_sersic=R_sersic, k_eff=k_eff ) npt.assert_allclose(f_x, f_x_s, rtol=1e-3, atol=0.) npt.assert_allclose(f_y, f_y_s, rtol=1e-3, atol=0.) npt.assert_almost_equal(f_x, f_x_s, decimal=3) npt.assert_almost_equal(f_y, f_y_s, decimal=3) def test_hessian(self): """ Test the Hessian function of Gauss-decomposed elliptical Sersic by matching with the spherical case. :return: :rtype: """ k_eff = 1. R_sersic = 1. n_sersic = 1. e1 = 5e-5 e2 = 0. center_x = 0. center_y = 0. n = 10 x = np.linspace(0.5 * R_sersic, 2. * R_sersic, n) y = np.linspace(0.5 * R_sersic, 2. * R_sersic, n) X, Y = np.meshgrid(x, y) f_xx_s, f_yy_s, f_xy_s = self.sersic_sphere.hessian(X, Y, center_x=center_x, center_y=center_y, n_sersic=n_sersic, R_sersic=R_sersic, k_eff=k_eff) f_xx, f_yy, f_xy = self.sersic_gauss.hessian(X, Y, e1=e1, e2=e2, center_x=center_x, center_y=center_y, n_sersic=n_sersic, R_sersic=R_sersic, k_eff=k_eff) npt.assert_almost_equal(f_xx_s, f_xx, decimal=3) npt.assert_almost_equal(f_yy_s, f_yy, decimal=3) npt.assert_almost_equal(f_xy_s, f_xy, decimal=3) def test_density_2d(self): """ Test the density function of Gauss-decomposed elliptical Sersic by checking with the spherical case. :return: :rtype: """ k_eff = 1. R_sersic = 1. n_sersic = 1. e1 = 0.2 e2 = 0.2 center_x = 0. center_y = 0. n = 100 x = np.logspace(-1., 1., n) y = np.logspace(-1., 1., n) X, Y = np.meshgrid(x, y) sersic_analytic = self.sersic_light.function(X, Y, e1=e1, e2=e2, center_x=center_x, center_y=center_y, n_sersic=n_sersic, R_sersic=R_sersic, amp=k_eff) sersic_gauss = self.sersic_gauss.density_2d(X, Y, e1=e1, e2=e2, center_x=center_x, center_y=center_y, n_sersic=n_sersic, R_sersic=R_sersic, k_eff=k_eff) assert np.all( np.abs(sersic_analytic - sersic_gauss) / np.sqrt(sersic_analytic) * 100. < 1.) def test_gauss_decompose_sersic(self): """ Test that `gauss_decompose_sersic()` decomposes the Sersic profile within 1% Poission noise at R_sersic. :return: :rtype: """ y = np.logspace(-1., 1., 100) k_eff = 1. R_sersic = 1. n_sersic = 1. amps, sigmas = self.sersic_gauss.gauss_decompose(n_sersic=n_sersic, R_sersic=R_sersic, k_eff=k_eff) sersic = self.sersic_gauss.get_kappa_1d(y, n_sersic=n_sersic, R_sersic=R_sersic, k_eff=k_eff) back_sersic = np.zeros_like(y) for a, s in zip(amps, sigmas): back_sersic += a * np.exp(-y ** 2 / 2. / s ** 2) assert np.all(np.abs(sersic-back_sersic)/np.sqrt(sersic)*100. < 1.)
class TestSersic(object): """ tests the Gaussian methods """ def setup(self): self.sersic = Sersic(smoothing=0.02) self.sersic_elliptic = SersicElliptic(smoothing=0.02) self.core_sersic = CoreSersic(smoothing=0.02) def test_sersic(self): x = np.array([1]) y = np.array([2]) I0_sersic = 1 R_sersic = 1 n_sersic = 1 center_x = 0 center_y = 0 values = self.sersic.function(x, y, I0_sersic, R_sersic, n_sersic, center_x, center_y) npt.assert_almost_equal(values[0], 0.12658651833626802, decimal=6) x = np.array([0]) y = np.array([0]) values = self.sersic.function(x, y, I0_sersic, R_sersic, n_sersic, center_x, center_y) npt.assert_almost_equal(values[0], 5.1482559148107292, decimal=2) x = np.array([2, 3, 4]) y = np.array([1, 1, 1]) values = self.sersic.function(x, y, I0_sersic, R_sersic, n_sersic, center_x, center_y) npt.assert_almost_equal(values[0], 0.12658651833626802, decimal=6) npt.assert_almost_equal(values[1], 0.026902273598180083, decimal=6) npt.assert_almost_equal(values[2], 0.0053957432862338055, decimal=6) value = self.sersic.function(1000, 0, I0_sersic, R_sersic, n_sersic, center_x, center_y) npt.assert_almost_equal(value, 0, decimal=8) def test_symmetry_r_sersic(self): x = np.array([2, 3, 4]) y = np.array([1, 1, 1]) I0_sersic = 1 R_sersic1 = 1 R_sersic2 = 0.1 n_sersic = 1 center_x = 0 center_y = 0 values1 = self.sersic.function(x * R_sersic1, y * R_sersic1, I0_sersic, R_sersic1, n_sersic, center_x, center_y) values2 = self.sersic.function(x * R_sersic2, y * R_sersic2, I0_sersic, R_sersic2, n_sersic, center_x, center_y) npt.assert_almost_equal(values1[0], values2[0], decimal=6) npt.assert_almost_equal(values1[1], values2[1], decimal=6) npt.assert_almost_equal(values1[2], values2[2], decimal=6) def test_sersic_center(self): x = 0.01 y = 0. I0_sersic = 1 R_sersic = 0.1 n_sersic = 4. center_x = 0 center_y = 0 values = self.sersic.function(x, y, I0_sersic, R_sersic, n_sersic, center_x, center_y) npt.assert_almost_equal(values, 12.688073819377406, decimal=6) def test_sersic_elliptic(self): x = np.array([1]) y = np.array([2]) I0_sersic = 1 R_sersic = 1 n_sersic = 1 phi_G = 1 q = 0.9 e1, e2 = param_util.phi_q2_ellipticity(phi_G, q) center_x = 0 center_y = 0 values = self.sersic_elliptic.function(x, y, I0_sersic, R_sersic, n_sersic, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 0.12595366113005077, decimal=6) x = np.array([0]) y = np.array([0]) values = self.sersic_elliptic.function(x, y, I0_sersic, R_sersic, n_sersic, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 5.1482553482055664, decimal=2) x = np.array([2, 3, 4]) y = np.array([1, 1, 1]) values = self.sersic_elliptic.function(x, y, I0_sersic, R_sersic, n_sersic, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 0.11308277793465012, decimal=6) npt.assert_almost_equal(values[1], 0.021188620675507107, decimal=6) npt.assert_almost_equal(values[2], 0.0037276744362724477, decimal=6) def test_core_sersic(self): x = np.array([1]) y = np.array([2]) I0 = 1 Rb = 1 Re = 2 gamma = 3 n = 1 phi_G = 1 q = 0.9 e1, e2 = param_util.phi_q2_ellipticity(phi_G, q) center_x = 0 center_y = 0 values = self.core_sersic.function(x, y, I0, Rb, Re, n, gamma, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 0.84489101, decimal=8) x = np.array([0]) y = np.array([0]) values = self.core_sersic.function(x, y, I0, Rb, Re, n, gamma, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 288406.09, decimal=0) x = np.array([2, 3, 4]) y = np.array([1, 1, 1]) values = self.core_sersic.function(x, y, I0, Rb, Re, n, gamma, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 0.79749529635325933, decimal=6) npt.assert_almost_equal(values[1], 0.33653478121594838, decimal=6) npt.assert_almost_equal(values[2], 0.14050402887681532, decimal=6) def test_total_flux(self): r_eff = 0.2 I_eff = 1. n_sersic = 4 flux = self.sersic._total_flux(r_eff, I_eff, n_sersic) npt.assert_almost_equal(flux, 0.9065917451904356, decimal=5)
def setup(self): self.sersic = Sersic(smoothing=0.02) self.sersic_elliptic = SersicElliptic(smoothing=0.02) self.core_sersic = CoreSersic(smoothing=0.02)
def __init__(self, light_model_list, deflection_scaling_list=None, source_redshift_list=None, smoothing=0.0000001): """ :param light_model_list: list of light models :param deflection_scaling_list: list of floats, rescales the original reduced deflection angles from the lens model to enable different models to be placed at different optical (redshift) distances. None means they are all :param source_redshift_list: list of redshifts of the model components :param smoothing: smoothing factor for certain models (deprecated) """ self.profile_type_list = light_model_list self.deflection_scaling_list = deflection_scaling_list self.redshift_list = source_redshift_list self.func_list = [] for profile_type in light_model_list: if profile_type == 'GAUSSIAN': from lenstronomy.LightModel.Profiles.gaussian import Gaussian self.func_list.append(Gaussian()) elif profile_type == 'GAUSSIAN_ELLIPSE': from lenstronomy.LightModel.Profiles.gaussian import GaussianEllipse self.func_list.append(GaussianEllipse()) elif profile_type == 'MULTI_GAUSSIAN': from lenstronomy.LightModel.Profiles.gaussian import MultiGaussian self.func_list.append(MultiGaussian()) elif profile_type == 'MULTI_GAUSSIAN_ELLIPSE': from lenstronomy.LightModel.Profiles.gaussian import MultiGaussianEllipse self.func_list.append(MultiGaussianEllipse()) elif profile_type == 'SERSIC': from lenstronomy.LightModel.Profiles.sersic import Sersic self.func_list.append(Sersic(smoothing=smoothing)) elif profile_type == 'SERSIC_ELLIPSE': from lenstronomy.LightModel.Profiles.sersic import SersicElliptic self.func_list.append(SersicElliptic(smoothing=smoothing)) elif profile_type == 'CORE_SERSIC': from lenstronomy.LightModel.Profiles.sersic import CoreSersic self.func_list.append(CoreSersic(smoothing=smoothing)) elif profile_type == 'SHAPELETS': from lenstronomy.LightModel.Profiles.shapelets import ShapeletSet self.func_list.append(ShapeletSet()) elif profile_type == 'HERNQUIST': from lenstronomy.LightModel.Profiles.hernquist import Hernquist self.func_list.append(Hernquist()) elif profile_type == 'HERNQUIST_ELLIPSE': from lenstronomy.LightModel.Profiles.hernquist import HernquistEllipse self.func_list.append(HernquistEllipse()) elif profile_type == 'PJAFFE': from lenstronomy.LightModel.Profiles.p_jaffe import PJaffe self.func_list.append(PJaffe()) elif profile_type == 'PJAFFE_ELLIPSE': from lenstronomy.LightModel.Profiles.p_jaffe import PJaffe_Ellipse self.func_list.append(PJaffe_Ellipse()) elif profile_type == 'UNIFORM': from lenstronomy.LightModel.Profiles.uniform import Uniform self.func_list.append(Uniform()) elif profile_type == 'POWER_LAW': from lenstronomy.LightModel.Profiles.power_law import PowerLaw self.func_list.append(PowerLaw()) elif profile_type == 'NIE': from lenstronomy.LightModel.Profiles.nie import NIE self.func_list.append(NIE()) elif profile_type == 'CHAMELEON': from lenstronomy.LightModel.Profiles.chameleon import Chameleon self.func_list.append(Chameleon()) elif profile_type == 'DOUBLE_CHAMELEON': from lenstronomy.LightModel.Profiles.chameleon import DoubleChameleon self.func_list.append(DoubleChameleon()) elif profile_type == 'INTERPOL': from lenstronomy.LightModel.Profiles.interpolation import Interpol self.func_list.append(Interpol()) else: raise ValueError('Warning! No light model of type', profile_type, ' found!')
class TestSersic(object): """ tests the Gaussian methods """ def setup(self): self.sersic = Sersic(smoothing=0.02) self.sersic_elliptic = SersicElliptic(smoothing=0.02) self.core_sersic = CoreSersic(smoothing=0.02) def test_sersic(self): x = np.array([1]) y = np.array([2]) I0_sersic = 1 R_sersic = 1 n_sersic = 1 center_x = 0 center_y = 0 values = self.sersic.function(x, y, I0_sersic, R_sersic, n_sersic, center_x, center_y) npt.assert_almost_equal(values[0], 0.12658651833626802, decimal=6) x = np.array([0]) y = np.array([0]) values = self.sersic.function( x, y, I0_sersic, R_sersic, n_sersic, center_x, center_y) npt.assert_almost_equal(values[0], 5.1482559148107292, decimal=2) x = np.array([2,3,4]) y = np.array([1,1,1]) values = self.sersic.function( x, y, I0_sersic, R_sersic, n_sersic, center_x, center_y) npt.assert_almost_equal(values[0], 0.12658651833626802, decimal=6) npt.assert_almost_equal(values[1], 0.026902273598180083, decimal=6) npt.assert_almost_equal(values[2], 0.0053957432862338055, decimal=6) value = self.sersic.function(1000, 0, I0_sersic, R_sersic, n_sersic, center_x, center_y) npt.assert_almost_equal(value, 0, decimal=8) def test_symmetry_r_sersic(self): x = np.array([2,3,4]) y = np.array([1,1,1]) I0_sersic = 1 R_sersic1 = 1 R_sersic2 = 0.1 n_sersic = 1 center_x = 0 center_y = 0 values1 = self.sersic.function(x*R_sersic1, y*R_sersic1, I0_sersic, R_sersic1, n_sersic, center_x, center_y) values2 = self.sersic.function(x*R_sersic2, y*R_sersic2, I0_sersic, R_sersic2, n_sersic, center_x, center_y) npt.assert_almost_equal(values1[0], values2[0], decimal=6) npt.assert_almost_equal(values1[1], values2[1], decimal=6) npt.assert_almost_equal(values1[2], values2[2], decimal=6) def test_sersic_center(self): x = 0.01 y = 0. I0_sersic = 1 R_sersic = 0.1 n_sersic = 4. center_x = 0 center_y = 0 values = self.sersic.function(x, y, I0_sersic, R_sersic, n_sersic, center_x, center_y) npt.assert_almost_equal(values, 12.688073819377406, decimal=6) def test_sersic_elliptic(self): x = np.array([1]) y = np.array([2]) I0_sersic = 1 R_sersic = 1 n_sersic = 1 phi_G = 1 q = 0.9 e1, e2 = param_util.phi_q2_ellipticity(phi_G, q) center_x = 0 center_y = 0 values = self.sersic_elliptic.function(x, y, I0_sersic, R_sersic, n_sersic, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 0.12595366113005077, decimal=6) x = np.array([0]) y = np.array([0]) values = self.sersic_elliptic.function(x, y, I0_sersic, R_sersic, n_sersic, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 5.1482553482055664, decimal=2) x = np.array([2,3,4]) y = np.array([1,1,1]) values = self.sersic_elliptic.function(x, y, I0_sersic, R_sersic, n_sersic, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 0.11308277793465012, decimal=6) npt.assert_almost_equal(values[1], 0.021188620675507107, decimal=6) npt.assert_almost_equal(values[2], 0.0037276744362724477, decimal=6) def test_core_sersic(self): x = np.array([1]) y = np.array([2]) I0 = 1 Rb = 1 Re = 2 gamma = 3 n = 1 phi_G = 1 q = 0.9 e1, e2 = param_util.phi_q2_ellipticity(phi_G, q) center_x = 0 center_y = 0 values = self.core_sersic.function(x, y, I0, Rb, Re, n, gamma, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 0.10338957116342086, decimal=8) x = np.array([0]) y = np.array([0]) values = self.core_sersic.function(x, y, I0, Rb, Re, n, gamma, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 187852.14004235074, decimal=0) x = np.array([2,3,4]) y = np.array([1,1,1]) values = self.core_sersic.function(x, y, I0, Rb, Re, n, gamma, e1, e2, center_x, center_y) npt.assert_almost_equal(values[0], 0.09255079955772508, decimal=6) npt.assert_almost_equal(values[1], 0.01767817014938002, decimal=6) npt.assert_almost_equal(values[2], 0.0032541063777438853, decimal=6) def test_total_flux(self): deltapix = 0.1 x_grid, y_grid = util.make_grid(numPix=400, deltapix=deltapix) r_eff = 1 I_eff = 1. n_sersic = 2 flux_analytic = self.sersic.total_flux(amp=I_eff, R_sersic=r_eff, n_sersic=n_sersic, e1=0, e2=0) flux_grid = self.sersic.function(x_grid, y_grid, R_sersic=r_eff, n_sersic=n_sersic, amp=I_eff) flux_numeric = np.sum(flux_grid) * deltapix**2 npt.assert_almost_equal(flux_numeric/flux_analytic, 1, decimal=2) # and here we check with ellipticity e1, e2 = 0.1, 0 flux_analytic_ell = self.sersic.total_flux(amp=I_eff, R_sersic=r_eff, n_sersic=n_sersic, e1=e1, e2=e2) flux_grid = self.sersic_elliptic.function(x_grid, y_grid, R_sersic=r_eff, n_sersic=n_sersic, amp=I_eff, e1=e1, e2=e2) flux_numeric_ell = np.sum(flux_grid) * deltapix ** 2 print(flux_analytic, flux_analytic_ell, flux_numeric_ell) npt.assert_almost_equal(flux_numeric_ell / flux_analytic_ell, 1, decimal=2)
def setup(self): self.sersic_gauss = SersicEllipseGaussDec() self.sersic_light = SersicElliptic(sersic_major_axis=False) self.sersic_sphere = Sersic(sersic_major_axis=False)
def setup(self): self.sersic = Sersic(smoothing=0.02) self.sersic_elliptic = SersicElliptic(smoothing=0.02, sersic_major_axis=True) self.core_sersic = CoreSersic(smoothing=0.02, sersic_major_axis=True)