Exemple #1
0
    def test__1x2_image__1x2_visibilities__simple_fourier_transform(self):
        # The image plane image generated by the galaxy is [1.0, 1.0]

        # Thus the chi squared is 4.0**2.0 + 3.0**2.0 = 25.0

        uv_wavelengths = np.array([[0.0, 0.0]])

        real_space_mask = al.Mask2D.manual(
            mask=np.array([
                [True, True, True, True],
                [True, False, False, True],
                [True, True, True, True],
            ]),
            pixel_scales=1.0,
        )

        interferometer = al.Interferometer(
            visibilities=al.Visibilities.full(fill_value=5.0,
                                              shape_slim=(1, )),
            noise_map=al.Visibilities.ones(shape_slim=(1, )),
            uv_wavelengths=uv_wavelengths,
            real_space_mask=real_space_mask,
            settings=al.SettingsInterferometer(
                sub_size=1, transformer_class=al.TransformerDFT),
        )

        interferometer.visibilities[0] = 5.0 + 4.0j

        # Setup as a ray trace instance, using a light profile for the lens

        g0 = al.Galaxy(redshift=0.5,
                       light_profile=MockLightProfile(value=1.0, size=2))
        tracer = al.Tracer.from_galaxies(galaxies=[g0])

        fit = al.FitInterferometer(interferometer=interferometer,
                                   tracer=tracer)

        assert (fit.visibilities.slim == np.array([5.0 + 4.0j])).all()
        assert (fit.noise_map.slim == np.array([1.0 + 1.0j])).all()
        assert (fit.model_visibilities.slim == np.array([2.0 + 0.0j])).all()
        assert (fit.residual_map.slim == np.array([3.0 + 4.0j])).all()
        assert (fit.normalized_residual_map.slim == np.array([3.0 + 4.0j
                                                              ])).all()
        assert (fit.chi_squared_map.slim == np.array([9.0 + 16.0j])).all()

        assert fit.chi_squared == 25.0
        assert fit.noise_normalization == (2.0 * np.log(2 * np.pi * 1.0**2.0))
        assert fit.log_likelihood == -0.5 * (
            25.0 + 2.0 * np.log(2 * np.pi * 1.0**2.0))
Exemple #2
0
def test__simulate_interferometer_data_and_fit__known_likelihood():

    mask = al.Mask2D.circular(radius=3.0,
                              shape_native=(31, 31),
                              pixel_scales=0.2,
                              sub_size=1)

    grid = al.Grid2D.from_mask(mask=mask)

    lens_galaxy = al.Galaxy(
        redshift=0.5,
        light=al.lp.EllSersic(centre=(0.1, 0.1), intensity=0.1),
        mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.8),
    )
    source_galaxy_0 = al.Galaxy(
        redshift=1.0,
        pixelization=al.pix.Rectangular(shape=(16, 16)),
        regularization=al.reg.Constant(coefficient=(1.0)),
    )
    source_galaxy_1 = al.Galaxy(
        redshift=2.0,
        pixelization=al.pix.Rectangular(shape=(16, 16)),
        regularization=al.reg.Constant(coefficient=(1.0)),
    )
    tracer = al.Tracer.from_galaxies(
        galaxies=[lens_galaxy, source_galaxy_0, source_galaxy_1])

    simulator = al.SimulatorInterferometer(
        uv_wavelengths=np.ones(shape=(7, 2)),
        transformer_class=al.TransformerDFT,
        exposure_time=300.0,
        noise_seed=1,
    )

    interferometer = simulator.via_tracer_from(tracer=tracer, grid=grid)

    interferometer = interferometer.apply_settings(
        settings=al.SettingsInterferometer(
            transformer_class=al.TransformerDFT))

    fit = al.FitInterferometer(
        dataset=interferometer,
        tracer=tracer,
        settings_inversion=al.SettingsInversion(use_w_tilde=False),
    )

    assert fit.figure_of_merit == pytest.approx(-5.433894158056919, 1.0e-2)
Exemple #3
0
    def test__hyper_background_changes_background_sky__reflected_in_likelihood(
        self, ):

        uv_wavelengths = np.array([[1.0, 0.0], [1.0, 1.0], [2.0, 2.0]])

        real_space_mask = al.Mask2D.manual(
            mask=np.array([
                [True, True, True, True, True],
                [True, False, False, False, True],
                [True, True, True, True, True],
            ]),
            pixel_scales=1.0,
        )

        interferometer = al.Interferometer(
            visibilities=al.Visibilities.full(fill_value=5.0,
                                              shape_slim=(3, )),
            noise_map=al.Visibilities.full(fill_value=2.0, shape_slim=(3, )),
            uv_wavelengths=uv_wavelengths,
            real_space_mask=real_space_mask,
            settings=al.SettingsInterferometer(sub_size=1),
        )

        # Setup as a ray trace instance, using a light profile for the lens

        g0 = al.Galaxy(redshift=0.5,
                       light_profile=MockLightProfile(value=1.0, size=2))
        tracer = al.Tracer.from_galaxies(galaxies=[g0])

        hyper_background_noise = al.hyper_data.HyperBackgroundNoise(
            noise_scale=1.0)

        fit = al.FitInterferometer(
            interferometer=interferometer,
            tracer=tracer,
            hyper_background_noise=hyper_background_noise,
        )

        assert (fit.visibilities.slim == (1.0 + 1.0j) *
                np.full(fill_value=5.0, shape=(3, ))).all()

        assert (fit.noise_map.slim == (1.0 + 1.0j) *
                np.full(fill_value=3.0, shape=(3, ))).all()
def print_fit_time_from(interferometer,
                        transformer_class,
                        use_w_tilde,
                        use_linear_operators,
                        repeats=1):

    settings_interferometer = al.SettingsInterferometer(
        transformer_class=transformer_class)
    interferometer = interferometer.apply_settings(
        settings=settings_interferometer)
    """
    __Numba Caching__

    Call FitImaging once to get all numba functions initialized.
    """
    fit = al.FitInterferometer(
        dataset=interferometer,
        tracer=tracer,
        settings_inversion=al.SettingsInversion(
            use_w_tilde=use_w_tilde,
            use_linear_operators=use_linear_operators),
    )
    print(fit.figure_of_merit)
    """
    __Fit Time__

    Time FitImaging by itself, to compare to profiling dict call.
    """
    start = time.time()
    for i in range(repeats):
        fit = al.FitInterferometer(
            dataset=interferometer,
            tracer=tracer,
            settings_inversion=al.SettingsInversion(
                use_w_tilde=use_w_tilde,
                use_linear_operators=use_linear_operators),
        )
        fit.figure_of_merit

    fit_time = (time.time() - start) / repeats
    print(f"Fit Time = {fit_time} \n")
Exemple #5
0
"""
real_space_mask = al.Mask2D.circular(
    shape_native=(151, 151), pixel_scales=0.05, radius=3.0
)

dataset_name = "mass_sie__source_sersic_x2"
dataset_path = path.join("dataset", "interferometer", dataset_name)

interferometer = al.Interferometer.from_fits(
    visibilities_path=path.join(dataset_path, "visibilities.fits"),
    noise_map_path=path.join(dataset_path, "noise_map.fits"),
    uv_wavelengths_path=path.join(dataset_path, "uv_wavelengths.fits"),
    real_space_mask=real_space_mask,
)
interferometer = interferometer.apply_settings(
    settings=al.SettingsInterferometer(transformer_class=al.TransformerDFT)
)

"""
__Inversion Settings (Run Times)__

The run times of an interferometer `Inversion` depend significantly on the following settings:

 - `transformer_class`: whether a discrete Fourier transform (`TransformerDFT`) or non-uniform fast Fourier Transform
 (`TransformerNUFFT) is used to map the inversion's image from real-space to Fourier space.

 - `use_linear_operators`: whether the linear operator formalism or matrix formalism is used for the linear algebra.

The optimal settings depend on the number of visibilities in the dataset:

 - For N_visibilities < 1000: `transformer_class=TransformerDFT` and `use_linear_operators=False` gives the fastest
"""
real_space_mask = al.Mask2D.circular(shape_native=(151, 151),
                                     pixel_scales=0.05,
                                     radius=3.0)

dataset_name = "mass_sie__subhalo_nfw__source_sersic_x2"
dataset_path = path.join("dataset", "interferometer", dataset_name)

interferometer = al.Interferometer.from_fits(
    visibilities_path=path.join(dataset_path, "visibilities.fits"),
    noise_map_path=path.join(dataset_path, "noise_map.fits"),
    uv_wavelengths_path=path.join(dataset_path, "uv_wavelengths.fits"),
    real_space_mask=real_space_mask,
)
interferometer = interferometer.apply_settings(
    settings=al.SettingsInterferometer(transformer_class=al.TransformerNUFFT))

interferometer_plotter = aplt.InterferometerPlotter(
    interferometer=interferometer)
interferometer_plotter.subplot_interferometer()
interferometer_plotter.subplot_dirty_images()
"""
__Paths__

The path the results of all chained searches are output:
"""
path_prefix = path.join("interferometer", "slam")
"""
__Redshifts__

The redshifts of the lens and source galaxies, which are used to perform unit converions of the model and data (e.g. 
Exemple #7
0
def test__simulate_interferometer_data_and_fit__chi_squared_is_0__noise_normalization_correct(
):

    grid = al.Grid2D.uniform(shape_native=(51, 51),
                             pixel_scales=0.1,
                             sub_size=1)

    lens_galaxy = al.Galaxy(
        redshift=0.5,
        light=al.lp.EllSersic(centre=(0.1, 0.1), intensity=0.1),
        mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.0),
    )

    source_galaxy = al.Galaxy(redshift=1.0,
                              light=al.lp.EllExponential(centre=(0.1, 0.1),
                                                         intensity=0.5))

    tracer = al.Tracer.from_galaxies(galaxies=[lens_galaxy, source_galaxy])

    simulator = al.SimulatorInterferometer(
        uv_wavelengths=np.ones(shape=(7, 2)),
        transformer_class=al.TransformerDFT,
        exposure_time=300.0,
        noise_if_add_noise_false=1.0,
        noise_sigma=None,
    )

    interferometer = simulator.from_tracer_and_grid(tracer=tracer, grid=grid)

    file_path = path.join(
        "{}".format(path.dirname(path.realpath(__file__))),
        "data_temp",
        "simulate_and_fit",
    )

    try:
        shutil.rmtree(file_path)
    except FileNotFoundError:
        pass

    if path.exists(file_path) is False:
        os.makedirs(file_path)

    interferometer.output_to_fits(
        visibilities_path=path.join(file_path, "visibilities.fits"),
        noise_map_path=path.join(file_path, "noise_map.fits"),
        uv_wavelengths_path=path.join(file_path, "uv_wavelengths.fits"),
    )

    real_space_mask = al.Mask2D.unmasked(shape_native=(51, 51),
                                         pixel_scales=0.1,
                                         sub_size=2)

    interferometer = al.Interferometer.from_fits(
        visibilities_path=path.join(file_path, "visibilities.fits"),
        noise_map_path=path.join(file_path, "noise_map.fits"),
        uv_wavelengths_path=path.join(file_path, "uv_wavelengths.fits"),
        real_space_mask=real_space_mask,
    )
    interferometer = interferometer.apply_settings(
        settings=al.SettingsInterferometer(
            transformer_class=al.TransformerDFT))

    tracer = al.Tracer.from_galaxies(galaxies=[lens_galaxy, source_galaxy])

    fit = al.FitInterferometer(
        interferometer=interferometer,
        tracer=tracer,
        settings_pixelization=al.SettingsPixelization(use_border=False),
    )

    assert fit.chi_squared == pytest.approx(0.0)

    pix = al.pix.Rectangular(shape=(7, 7))

    reg = al.reg.Constant(coefficient=0.0001)

    lens_galaxy = al.Galaxy(
        redshift=0.5,
        light=al.lp.EllSersic(centre=(0.1, 0.1), intensity=0.1),
        mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.0),
    )

    source_galaxy = al.Galaxy(redshift=1.0,
                              pixelization=pix,
                              regularization=reg)

    tracer = al.Tracer.from_galaxies(galaxies=[lens_galaxy, source_galaxy])

    fit = al.FitInterferometer(
        interferometer=interferometer,
        tracer=tracer,
        settings_pixelization=al.SettingsPixelization(use_border=False),
    )
    assert abs(fit.chi_squared) < 1.0e-4

    file_path = path.join("{}".format(path.dirname(path.realpath(__file__))),
                          "data_temp")

    if path.exists(file_path) is True:
        shutil.rmtree(file_path)
Exemple #8
0
def test__simulate_interferometer_data_and_fit__linear_light_profiles_and_pixelization(
):

    grid = al.Grid2D.uniform(shape_native=(51, 51),
                             pixel_scales=0.1,
                             sub_size=1)

    lens_galaxy = al.Galaxy(
        redshift=0.5,
        light=al.lp.EllSersic(centre=(0.1, 0.1), intensity=100.0),
        mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.0),
    )

    source_galaxy = al.Galaxy(
        redshift=1.0,
        bulge=al.lp.EllSersic(intensity=0.1, sersic_index=1.0),
        disk=al.lp.EllSersic(intensity=0.2, sersic_index=4.0),
    )

    tracer = al.Tracer.from_galaxies(galaxies=[lens_galaxy, source_galaxy])

    simulator = al.SimulatorInterferometer(
        uv_wavelengths=np.array([
            [0.04, 200.0, 0.3, 400000.0, 60000000.0],
            [0.00003, 500.0, 600000.0, 0.1, 75555555],
        ]),
        transformer_class=al.TransformerDFT,
        exposure_time=300.0,
        noise_if_add_noise_false=1.0,
        noise_sigma=None,
    )

    interferometer = simulator.via_tracer_from(tracer=tracer, grid=grid)

    interferometer = interferometer.apply_settings(
        settings=al.SettingsInterferometer(grid_class=al.Grid2D,
                                           transformer_class=al.TransformerDFT,
                                           sub_size=1))

    lens_galaxy_linear = al.Galaxy(
        redshift=0.5,
        light=al.lp_linear.EllSersic(centre=(0.1, 0.1)),
        mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.0),
    )

    source_galaxy_pix = al.Galaxy(
        redshift=1.0,
        pixelization=al.pix.Rectangular(shape=(3, 3)),
        regularization=al.reg.Constant(coefficient=0.01),
    )

    tracer_linear = al.Tracer.from_galaxies(
        galaxies=[lens_galaxy_linear, source_galaxy_pix])

    fit_linear = al.FitInterferometer(
        dataset=interferometer,
        tracer=tracer_linear,
        settings_pixelization=al.SettingsPixelization(use_border=False),
        settings_inversion=al.SettingsInversion(use_w_tilde=False),
    )

    assert fit_linear.inversion.reconstruction == pytest.approx(
        np.array([
            1.00338472e02,
            9.55074606e-02,
            9.24767167e-02,
            9.45392540e-02,
            1.41969109e-01,
            1.41828976e-01,
            1.41521130e-01,
            1.84257307e-01,
            1.85507562e-01,
            1.83726575e-01,
        ]),
        1.0e-2,
    )
    assert fit_linear.figure_of_merit == pytest.approx(-29.20551989, 1.0e-4)

    lens_galaxy_image = lens_galaxy.image_2d_from(grid=interferometer.grid)

    assert fit_linear.galaxy_model_image_dict[
        lens_galaxy_linear] == pytest.approx(lens_galaxy_image, 1.0e-2)

    traced_grid_2d_list = tracer.traced_grid_2d_list_from(
        grid=interferometer.grid)

    source_galaxy_image = source_galaxy.image_2d_from(
        grid=traced_grid_2d_list[1])
Exemple #9
0
def test__simulate_interferometer_data_and_fit__linear_light_profiles_agree_with_standard_light_profiles(
):

    grid = al.Grid2D.uniform(shape_native=(51, 51),
                             pixel_scales=0.1,
                             sub_size=1)

    lens_galaxy = al.Galaxy(
        redshift=0.5,
        light=al.lp.EllSersic(centre=(0.1, 0.1), intensity=0.1),
        mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.0),
    )

    source_galaxy = al.Galaxy(
        redshift=1.0,
        bulge=al.lp.EllSersic(intensity=0.1, sersic_index=1.0),
        disk=al.lp.EllSersic(intensity=0.2, sersic_index=4.0),
    )

    tracer = al.Tracer.from_galaxies(galaxies=[lens_galaxy, source_galaxy])

    simulator = al.SimulatorInterferometer(
        uv_wavelengths=np.array([
            [0.04, 200.0, 0.3, 400000.0, 60000000.0],
            [0.00003, 500.0, 600000.0, 0.1, 75555555],
        ]),
        transformer_class=al.TransformerDFT,
        exposure_time=300.0,
        noise_if_add_noise_false=1.0,
        noise_sigma=None,
    )

    interferometer = simulator.via_tracer_from(tracer=tracer, grid=grid)

    interferometer = interferometer.apply_settings(
        settings=al.SettingsInterferometer(grid_class=al.Grid2D,
                                           transformer_class=al.TransformerDFT,
                                           sub_size=1))

    fit = al.FitInterferometer(
        dataset=interferometer,
        tracer=tracer,
        settings_pixelization=al.SettingsPixelization(use_border=False),
        settings_inversion=al.SettingsInversion(use_w_tilde=False),
    )

    lens_galaxy_linear = al.Galaxy(
        redshift=0.5,
        light=al.lp_linear.EllSersic(centre=(0.1, 0.1)),
        mass=al.mp.EllIsothermal(centre=(0.1, 0.1), einstein_radius=1.0),
    )

    source_galaxy_linear = al.Galaxy(
        redshift=1.0,
        bulge=al.lp_linear.EllSersic(sersic_index=1.0),
        disk=al.lp_linear.EllSersic(sersic_index=4.0),
    )

    tracer_linear = al.Tracer.from_galaxies(
        galaxies=[lens_galaxy_linear, source_galaxy_linear])

    fit_linear = al.FitInterferometer(
        dataset=interferometer,
        tracer=tracer_linear,
        settings_pixelization=al.SettingsPixelization(use_border=False),
        settings_inversion=al.SettingsInversion(use_w_tilde=False),
    )

    assert fit_linear.inversion.reconstruction == pytest.approx(
        np.array([0.1, 0.1, 0.2]), 1.0e-4)
    assert fit_linear.linear_light_profile_intensity_dict[
        lens_galaxy_linear.light] == pytest.approx(0.1, 1.0e-2)
    assert fit_linear.linear_light_profile_intensity_dict[
        source_galaxy_linear.bulge] == pytest.approx(0.1, 1.0e-2)
    assert fit_linear.linear_light_profile_intensity_dict[
        source_galaxy_linear.disk] == pytest.approx(0.2, 1.0e-2)
    assert fit.log_likelihood == fit_linear.log_likelihood

    lens_galaxy_image = lens_galaxy.image_2d_from(grid=interferometer.grid)

    assert fit_linear.galaxy_model_image_dict[
        lens_galaxy_linear] == pytest.approx(lens_galaxy_image, 1.0e-4)

    traced_grid_2d_list = tracer.traced_grid_2d_list_from(
        grid=interferometer.grid)

    source_galaxy_image = source_galaxy.image_2d_from(
        grid=traced_grid_2d_list[1])

    assert fit_linear.galaxy_model_image_dict[
        source_galaxy_linear] == pytest.approx(source_galaxy_image, 1.0e-4)

    lens_galaxy_visibilities = lens_galaxy.visibilities_via_transformer_from(
        grid=interferometer.grid, transformer=interferometer.transformer)

    assert fit_linear.galaxy_model_visibilities_dict[
        lens_galaxy_linear] == pytest.approx(lens_galaxy_visibilities, 1.0e-4)

    source_galaxy_visibilities = source_galaxy.visibilities_via_transformer_from(
        grid=traced_grid_2d_list[1], transformer=interferometer.transformer)

    assert fit_linear.galaxy_model_visibilities_dict[
        source_galaxy_linear] == pytest.approx(source_galaxy_visibilities,
                                               1.0e-4)
transformer_class = al.TransformerDFT
"""
However, the direct Fourier transform is inefficient. For ~10 million visibilities, it requires **thousands of seconds**
to perform a single transform. To model a lens, we'll perform tens of thousands of transforms, making this approach
unfeasible for high quality ALMA and radio datasets.

For this reason, **PyAutoLens** supports the non-uniform fast fourier transform algorithm
**PyNUFFT** (https://github.com/jyhmiinlin/pynufft), which is significantly faster, being able too perform a Fourier
transform of ~10 million in less than a second!
"""
transformer_class = al.TransformerNUFFT
"""
The use this transformer in a fit, we use the `apply_settings` method.
"""
interferometer = interferometer.apply_settings(
    settings=al.SettingsInterferometer(transformer_class=transformer_class))
"""
__Fitting__

The interferometer can now be used with a `FitInterferometer` object to fit it to a data-set:
"""
fit = al.FitInterferometer(dataset=interferometer, tracer=tracer)

fit_interferometer_plotter = aplt.FitInterferometerPlotter(fit=fit)
fit_interferometer_plotter.subplot_fit_interferometer()
"""
Interferometer data can also be modeled using pixelized source's, which again perform the source reconstruction by
directly fitting the visibilities in the uv-plane. The source reconstruction is visualized in real space:

Computing this source recontruction would be extremely inefficient if **PyAutoLens** used a traditional approach to
linear algebra which explicitly stored in memory the values required to solve for the source fluxes. In fact, for an
Exemple #11
0
    def test__3x2_image__2x2_visibilities__use_transformer_for_likelihood(
            self):

        uv_wavelengths = np.array([[1.0, 0.0], [1.0, 1.0], [2.0, 2.0]])

        real_space_mask = al.Mask2D.unmasked(shape_native=(1, 3),
                                             pixel_scales=1.0)

        transformer = al.TransformerDFT(uv_wavelengths=uv_wavelengths,
                                        real_space_mask=real_space_mask)

        real_space_mask = al.Mask2D.manual(
            mask=np.array([
                [True, True, True, True, True],
                [True, False, False, False, True],
                [True, True, True, True, True],
            ]),
            pixel_scales=1.0,
        )

        interferometer = al.Interferometer(
            visibilities=al.Visibilities.full(fill_value=5.0,
                                              shape_slim=(3, )),
            noise_map=al.Visibilities.full(fill_value=2.0, shape_slim=(3, )),
            uv_wavelengths=uv_wavelengths,
            real_space_mask=real_space_mask,
            settings=al.SettingsInterferometer(
                sub_size=1, transformer_class=al.TransformerDFT),
        )

        # Setup as a ray trace instance, using a light profile for the lens

        g0 = al.Galaxy(redshift=0.5,
                       light_profile=al.lp.EllSersic(intensity=0.001))

        image = g0.image_2d_from_grid(grid=interferometer.grid)

        model_visibilities_manual = transformer.visibilities_from_image(
            image=image)

        tracer = al.Tracer.from_galaxies(galaxies=[g0])

        fit = al.FitInterferometer(interferometer=interferometer,
                                   tracer=tracer)

        assert (fit.visibilities.slim == np.array(
            [5.0 + 5.0j, 5.0 + 5.0j, 5.0 + 5.0j])).all()
        assert (fit.noise_map.slim == np.array(
            [2.0 + 2.0j, 2.0 + 2.0j, 2.0 + 2.0j])).all()

        assert fit.model_visibilities.slim == pytest.approx(
            model_visibilities_manual, 1.0e-4)

        # moddel visibilities are all [1.94805, 0.0]

        assert fit.residual_map.slim == pytest.approx(
            np.array([3.0519 + 5.0j, 3.0519 + 5.0j, 3.0519 + 5.0j]), 1.0e-4)

        assert fit.normalized_residual_map.slim == pytest.approx(
            np.array([
                3.0519 / 2.0 + (5.0 / 2.0) * 1.0j,
                3.0519 / 2.0 + (5.0 / 2.0) * 1.0j,
                3.0519 / 2.0 + (5.0 / 2.0) * 1.0j,
            ]),
            1.0e-4,
        )

        assert fit.chi_squared_map.slim == pytest.approx(
            np.array([
                (3.0519 / 2.0)**2.0 + ((5.0 / 2.0)**2.0) * 1.0j,
                (3.0519 / 2.0)**2.0 + ((5.0 / 2.0)**2.0) * 1.0j,
                (3.0519 / 2.0)**2.0 + ((5.0 / 2.0)**2.0) * 1.0j,
            ]),
            1.0e-4,
        )

        assert fit.chi_squared == pytest.approx(25.73579, 1.0e-4)
        assert fit.noise_normalization == pytest.approx(
            (6.0 * np.log(2 * np.pi * 2.0**2.0)), 1.0e-4)
        assert fit.log_likelihood == pytest.approx(
            -0.5 * (25.73579 + 6.0 * np.log(2 * np.pi * 2.0**2.0)), 1.0e-4)