Skip to content

Commit 023fffe

Browse files
authored
Merge pull request #257 from Jammy2211/feature/sky_refactor
Sky Background Modeling
2 parents 52fa895 + 4be3d52 commit 023fffe

File tree

9 files changed

+95
-15
lines changed

9 files changed

+95
-15
lines changed

autolens/imaging/fit_imaging.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ def __init__(
2121
self,
2222
dataset: aa.Imaging,
2323
tracer: Tracer,
24+
sky: Optional[ag.LightProfile] = None,
2425
adapt_images: Optional[ag.AdaptImages] = None,
2526
settings_inversion: aa.SettingsInversion = aa.SettingsInversion(),
2627
preloads: Preloads = Preloads(),
@@ -56,6 +57,8 @@ def __init__(
5657
The imaging dataset which is fitted by the galaxies in the tracer.
5758
tracer
5859
The tracer of galaxies whose light profile images are used to fit the imaging data.
60+
sky
61+
Model component used to represent the background sky emission in an image (e.g. a `Sky` light profile).
5962
adapt_images
6063
Contains the adapt-images which are used to make a pixelization's mesh and regularization adapt to the
6164
reconstructed galaxy's morphology.
@@ -71,9 +74,10 @@ def __init__(
7174

7275
super().__init__(dataset=dataset, run_time_dict=run_time_dict)
7376
AbstractFitInversion.__init__(
74-
self=self, model_obj=tracer, settings_inversion=settings_inversion
77+
self=self, model_obj=tracer, sky=sky, settings_inversion=settings_inversion
7578
)
7679

80+
self.sky = sky
7781
self.tracer = tracer
7882

7983
self.adapt_images = adapt_images
@@ -92,11 +96,17 @@ def blurred_image(self) -> aa.Array2D:
9296

9397
if self.preloads.blurred_image is None:
9498

99+
if isinstance(self.sky, ag.lp.Sky):
100+
image = self.sky.image_2d_from(grid=self.dataset.grid)
101+
else:
102+
image = np.zeros(self.dataset.shape_slim)
103+
95104
return self.tracer.blurred_image_2d_from(
96105
grid=self.dataset.grid,
97106
convolver=self.dataset.convolver,
98107
blurring_grid=self.dataset.blurring_grid,
99-
)
108+
) + image
109+
100110
return self.preloads.blurred_image
101111

102112
@property
@@ -111,6 +121,7 @@ def tracer_to_inversion(self) -> TracerToInversion:
111121

112122
return TracerToInversion(
113123
tracer=self.tracer,
124+
sky=self.sky,
114125
dataset=self.dataset,
115126
data=self.profile_subtracted_image,
116127
noise_map=self.noise_map,

autolens/imaging/model/analysis.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,16 @@ def fit_from(
156156
instance=instance, run_time_dict=run_time_dict
157157
)
158158

159+
sky = self.sky_via_instance_from(instance=instance)
160+
159161
adapt_images = self.adapt_images_via_instance_from(instance=instance)
160162

161163
preloads = preload_overwrite or self.preloads
162164

163165
return FitImaging(
164166
dataset=self.dataset,
165167
tracer=tracer,
168+
sky=sky,
166169
adapt_images=adapt_images,
167170
settings_inversion=self.settings_inversion,
168171
preloads=preloads,

autolens/imaging/plot/fit_imaging_plotters.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,11 @@ def subplot_fit_log10(self):
467467

468468
self.set_title(label=None)
469469

470-
self.figures_2d(signal_to_noise_map=True)
470+
try:
471+
self.figures_2d(signal_to_noise_map=True)
472+
except ValueError:
473+
pass
474+
471475
self.figures_2d(model_image=True)
472476

473477
self.set_title(label="Lens Light Model Image")

autolens/interferometer/fit_interferometer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def __init__(
8484

8585
super().__init__(dataset=dataset, run_time_dict=run_time_dict)
8686
AbstractFitInversion.__init__(
87-
self=self, model_obj=tracer, settings_inversion=settings_inversion
87+
self=self, model_obj=tracer, sky=None, settings_inversion=settings_inversion
8888
)
8989

9090
@property

autolens/interferometer/model/analysis.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -328,11 +328,7 @@ def visualize(self, paths: af.DirectoryPaths, instance, during_analysis):
328328
except IndexError:
329329
pass
330330

331-
def make_result(
332-
self,
333-
samples: af.SamplesPDF,
334-
search_internal = None
335-
):
331+
def make_result(self, samples: af.SamplesPDF, search_internal=None):
336332
"""
337333
After the non-linear search is complete create its `Result`, which includes:
338334
@@ -358,7 +354,9 @@ def make_result(
358354
ResultImaging
359355
The result of fitting the model to the imaging dataset, via a non-linear search.
360356
"""
361-
return ResultInterferometer(samples=samples, analysis=self, search_internal=search_internal)
357+
return ResultInterferometer(
358+
samples=samples, analysis=self, search_internal=search_internal
359+
)
362360

363361
def save_attributes(self, paths: af.DirectoryPaths):
364362
"""

autolens/lens/to_inversion.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import autogalaxy as ag
77

88
from autoarray.inversion.inversion.factory import inversion_unpacked_from
9-
9+
from autogalaxy.profiles.light.basis import Basis
1010
from autolens.analysis.preloads import Preloads
1111

1212

@@ -18,6 +18,7 @@ def __init__(
1818
data: Optional[Union[aa.Array2D, aa.Visibilities]] = None,
1919
noise_map: Optional[Union[aa.Array2D, aa.VisibilitiesNoiseMap]] = None,
2020
w_tilde: Optional[Union[aa.WTildeImaging, aa.WTildeInterferometer]] = None,
21+
sky: Optional[Basis] = None,
2122
adapt_images: Optional[ag.AdaptImages] = None,
2223
settings_inversion: aa.SettingsInversion = aa.SettingsInversion(),
2324
preloads=Preloads(),
@@ -30,6 +31,7 @@ def __init__(
3031
data=data,
3132
noise_map=noise_map,
3233
w_tilde=w_tilde,
34+
sky=sky,
3335
adapt_images=adapt_images,
3436
settings_inversion=settings_inversion,
3537
preloads=preloads,
@@ -70,6 +72,7 @@ def lp_linear_func_list_galaxy_dict(
7072
for plane_index, galaxies in enumerate(self.planes):
7173
plane_to_inversion = ag.GalaxiesToInversion(
7274
galaxies=galaxies,
75+
sky=self.sky,
7376
dataset=self.dataset,
7477
grid=traced_grids_of_planes_list[plane_index],
7578
blurring_grid=traced_blurring_grids_of_planes_list[plane_index],
@@ -133,6 +136,7 @@ def image_plane_mesh_grid_pg_list(self) -> List[List]:
133136
for galaxies in self.planes:
134137
to_inversion = ag.GalaxiesToInversion(
135138
galaxies=galaxies,
139+
sky=self.sky,
136140
grid_pixelization=self.dataset.grid,
137141
noise_map=self.noise_map,
138142
adapt_images=self.adapt_images,
@@ -206,6 +210,7 @@ def mapper_galaxy_dict(self) -> Dict[aa.AbstractMapper, ag.Galaxy]:
206210
if galaxies.has(cls=aa.Pixelization):
207211
to_inversion = ag.GalaxiesToInversion(
208212
galaxies=galaxies,
213+
sky=self.sky,
209214
grid_pixelization=traced_grids_of_planes_list[plane_index],
210215
preloads=self.preloads,
211216
noise_map=self.noise_map,

autolens/point/model/analysis.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,11 @@ def visualize(self, paths, instance, during_analysis):
101101
def make_result(
102102
self,
103103
samples: af.SamplesPDF,
104-
search_internal = None,
104+
search_internal=None,
105105
):
106-
return ResultPoint(samples=samples, analysis=self, search_internal=search_internal)
106+
return ResultPoint(
107+
samples=samples, analysis=self, search_internal=search_internal
108+
)
107109

108110
def save_attributes(self, paths: af.DirectoryPaths):
109111
self.point_dict.output_to_json(

autolens/quantity/model/analysis.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def visualize(
127127
def make_result(
128128
self,
129129
samples: af.SamplesPDF,
130-
search_internal = None,
130+
search_internal=None,
131131
) -> ResultQuantity:
132132
"""
133133
After the non-linear search is complete create its `ResultQuantity`, which includes:
@@ -156,4 +156,6 @@ def make_result(
156156
ResultQuantity
157157
The result of fitting the model to the imaging dataset, via a non-linear search.
158158
"""
159-
return ResultQuantity(samples=samples, analysis=self, search_internal=search_internal)
159+
return ResultQuantity(
160+
samples=samples, analysis=self, search_internal=search_internal
161+
)

test_autolens/imaging/test_fit_imaging.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import copy
12
import numpy as np
23
import pytest
34

@@ -231,6 +232,60 @@ def test__fit_figure_of_merit(masked_imaging_7x7, masked_imaging_covariance_7x7)
231232
assert fit.figure_of_merit == pytest.approx(-341415.8258823, 1.0e-4)
232233

233234

235+
def test__fit__sky___handles_special_behaviour(masked_imaging_7x7):
236+
masked_imaging_7x7 = copy.copy(masked_imaging_7x7)
237+
238+
masked_imaging_7x7.data -= 100.0
239+
240+
g0 = al.Galaxy(
241+
redshift=0.5,
242+
bulge=al.lp.Sersic(intensity=1.0),
243+
disk=al.lp.Sersic(intensity=2.0),
244+
mass_profile=al.mp.IsothermalSph(einstein_radius=1.0),
245+
)
246+
247+
g1 = al.Galaxy(redshift=1.0, bulge=al.lp.Sersic(intensity=1.0))
248+
249+
tracer = al.Tracer(galaxies=[g0, g1])
250+
251+
fit = al.FitImaging(
252+
dataset=masked_imaging_7x7,
253+
tracer=tracer,
254+
sky=al.lp_linear.Sky(),
255+
settings_inversion=al.SettingsInversion(use_positive_only_solver=False),
256+
)
257+
258+
assert fit.perform_inversion is True
259+
assert fit.figure_of_merit == pytest.approx(-733125.35694344, 1.0e-4)
260+
261+
sky = fit.sky_linear_light_profiles_to_light_profiles
262+
263+
assert sky.light_profile_list[0].intensity == pytest.approx(-737.44550397, 1.0e-4)
264+
assert sky.light_profile_list[1].intensity == pytest.approx(737.44550397, 1.0e-4)
265+
266+
fit = al.FitImaging(
267+
dataset=masked_imaging_7x7,
268+
tracer=tracer,
269+
sky=al.lp_linear.Sky(),
270+
settings_inversion=al.SettingsInversion(use_positive_only_solver=True),
271+
)
272+
273+
assert fit.perform_inversion is True
274+
assert fit.figure_of_merit == pytest.approx(-733125.3569434, 1.0e-4)
275+
276+
sky = fit.sky_linear_light_profiles_to_light_profiles
277+
278+
assert sky.light_profile_list[0].intensity == pytest.approx(0.0, 1.0e-4)
279+
assert sky.light_profile_list[1].intensity == pytest.approx(1474.891048, 1.0e-4)
280+
281+
fit = al.FitImaging(
282+
dataset=masked_imaging_7x7, tracer=tracer, sky=al.lp.Sky(intensity=-99.0)
283+
)
284+
285+
assert fit.perform_inversion is False
286+
assert fit.figure_of_merit == pytest.approx(-2862836.077500, 1.0e-4)
287+
288+
234289
def test__galaxy_model_image_dict(masked_imaging_7x7):
235290

236291
# Normal Light Profiles Only

0 commit comments

Comments
 (0)