Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
mass_profile=al.mass_profiles.SphericalIsothermal,
)
redshift_prior = af.GaussianPrior(1, 1)
einstein_radius_prior = af.GaussianPrior(4, 1)
intensity_prior = af.GaussianPrior(7, 1)
arguments = {
galaxy_model.redshift.redshift: redshift_prior,
galaxy_model.mass_profile.mask_centre.centre_0: af.GaussianPrior(2, 1),
galaxy_model.mass_profile.mask_centre.centre_1: af.GaussianPrior(3, 1),
galaxy_model.mass_profile.einstein_radius.value: einstein_radius_prior,
galaxy_model.light_profile.axis_ratio: af.GaussianPrior(5, 1),
galaxy_model.light_profile.phi: af.GaussianPrior(6, 1),
galaxy_model.light_profile.intensity.value: intensity_prior,
galaxy_model.light_profile.effective_radius.value: af.GaussianPrior(8, 1),
galaxy_model.light_profile.sersic_index: af.GaussianPrior(9, 1),
}
gaussian_galaxy_model_model = galaxy_model.gaussian_prior_model_for_arguments(
arguments
)
assert gaussian_galaxy_model_model.redshift.redshift == redshift_prior
assert (
gaussian_galaxy_model_model.mass_profile.einstein_radius.value
== einstein_radius_prior
)
assert (
gaussian_galaxy_model_model.light_profile.intensity.value == intensity_prior
)
def test_gaussian_prior_model_for_arguments(self):
galaxy_model = al.GalaxyModel(
redshift=al.Redshift,
align_centres=True,
light_profile=al.light_profiles.EllipticalSersic,
mass_profile=al.mass_profiles.SphericalIsothermal,
)
redshift_prior = af.GaussianPrior(1, 1)
einstein_radius_prior = af.GaussianPrior(4, 1)
intensity_prior = af.GaussianPrior(7, 1)
arguments = {
galaxy_model.redshift.redshift: redshift_prior,
galaxy_model.mass_profile.mask_centre.centre_0: af.GaussianPrior(2, 1),
galaxy_model.mass_profile.mask_centre.centre_1: af.GaussianPrior(3, 1),
galaxy_model.mass_profile.einstein_radius.value: einstein_radius_prior,
galaxy_model.light_profile.axis_ratio: af.GaussianPrior(5, 1),
galaxy_model.light_profile.phi: af.GaussianPrior(6, 1),
galaxy_model.light_profile.intensity.value: intensity_prior,
galaxy_model.light_profile.effective_radius.value: af.GaussianPrior(8, 1),
galaxy_model.light_profile.sersic_index: af.GaussianPrior(9, 1),
}
gaussian_galaxy_model_model = galaxy_model.gaussian_prior_model_for_arguments(
arguments
)
def test_gaussian_prior_model_for_arguments(self):
galaxy_model = al.GalaxyModel(
redshift=al.Redshift,
align_centres=True,
light_profile=al.light_profiles.EllipticalSersic,
mass_profile=al.mass_profiles.SphericalIsothermal,
)
redshift_prior = af.GaussianPrior(1, 1)
einstein_radius_prior = af.GaussianPrior(4, 1)
intensity_prior = af.GaussianPrior(7, 1)
arguments = {
galaxy_model.redshift.redshift: redshift_prior,
galaxy_model.mass_profile.mask_centre.centre_0: af.GaussianPrior(2, 1),
galaxy_model.mass_profile.mask_centre.centre_1: af.GaussianPrior(3, 1),
galaxy_model.mass_profile.einstein_radius.value: einstein_radius_prior,
galaxy_model.light_profile.axis_ratio: af.GaussianPrior(5, 1),
galaxy_model.light_profile.phi: af.GaussianPrior(6, 1),
galaxy_model.light_profile.intensity.value: intensity_prior,
galaxy_model.light_profile.effective_radius.value: af.GaussianPrior(8, 1),
galaxy_model.light_profile.sersic_index: af.GaussianPrior(9, 1),
}
gaussian_galaxy_model_model = galaxy_model.gaussian_prior_model_for_arguments(
redshift=al.Redshift,
align_centres=True,
light_profile=al.light_profiles.EllipticalSersic,
mass_profile=al.mass_profiles.SphericalIsothermal,
)
redshift_prior = af.GaussianPrior(1, 1)
einstein_radius_prior = af.GaussianPrior(4, 1)
intensity_prior = af.GaussianPrior(7, 1)
arguments = {
galaxy_model.redshift.redshift: redshift_prior,
galaxy_model.mass_profile.mask_centre.centre_0: af.GaussianPrior(2, 1),
galaxy_model.mass_profile.mask_centre.centre_1: af.GaussianPrior(3, 1),
galaxy_model.mass_profile.einstein_radius.value: einstein_radius_prior,
galaxy_model.light_profile.axis_ratio: af.GaussianPrior(5, 1),
galaxy_model.light_profile.phi: af.GaussianPrior(6, 1),
galaxy_model.light_profile.intensity.value: intensity_prior,
galaxy_model.light_profile.effective_radius.value: af.GaussianPrior(8, 1),
galaxy_model.light_profile.sersic_index: af.GaussianPrior(9, 1),
}
gaussian_galaxy_model_model = galaxy_model.gaussian_prior_model_for_arguments(
arguments
)
assert gaussian_galaxy_model_model.redshift.redshift == redshift_prior
assert (
gaussian_galaxy_model_model.mass_profile.einstein_radius.value
== einstein_radius_prior
)
assert (
align_centres=True,
light_profile=al.light_profiles.EllipticalSersic,
mass_profile=al.mass_profiles.SphericalIsothermal,
)
redshift_prior = af.GaussianPrior(1, 1)
einstein_radius_prior = af.GaussianPrior(4, 1)
intensity_prior = af.GaussianPrior(7, 1)
arguments = {
galaxy_model.redshift.redshift: redshift_prior,
galaxy_model.mass_profile.mask_centre.centre_0: af.GaussianPrior(2, 1),
galaxy_model.mass_profile.mask_centre.centre_1: af.GaussianPrior(3, 1),
galaxy_model.mass_profile.einstein_radius.value: einstein_radius_prior,
galaxy_model.light_profile.axis_ratio: af.GaussianPrior(5, 1),
galaxy_model.light_profile.phi: af.GaussianPrior(6, 1),
galaxy_model.light_profile.intensity.value: intensity_prior,
galaxy_model.light_profile.effective_radius.value: af.GaussianPrior(8, 1),
galaxy_model.light_profile.sersic_index: af.GaussianPrior(9, 1),
}
gaussian_galaxy_model_model = galaxy_model.gaussian_prior_model_for_arguments(
arguments
)
assert gaussian_galaxy_model_model.redshift.redshift == redshift_prior
assert (
gaussian_galaxy_model_model.mass_profile.einstein_radius.value
== einstein_radius_prior
)
assert (
gaussian_galaxy_model_model.light_profile.intensity.value == intensity_prior
The word 'mass' corresponds to the word we used when setting up the _GalaxyModel_ above.
"""
# %%
lens.mass.centre_0 = af.UniformPrior(lower_limit=-0.1, upper_limit=0.1)
lens.mass.centre_1 = af.UniformPrior(lower_limit=-0.1, upper_limit=0.1)
# %%
"""
Lets also change the prior on the lens galaxy's einstein radius to a GaussianPrior centred on 1.4". For real lens
modeling, this might be done by visually estimating the radius the lens's arcs / ring appear.
"""
# %%
lens.mass.einstein_radius = af.GaussianPrior(mean=1.4, sigma=0.2)
# %%
"""
We can also customize the source galaxy - lets say we believe it is compact and limit its effective radius.
"""
# %%
source.light.effective_radius = af.UniformPrior(lower_limit=0.0, upper_limit=0.3)
# %%
"""
Like in the previous tutorial, we use a_PhaseSettingsImaging_ object to specify our model-fitting procedure uses a
regular _Grid_.
"""
# %%
def align_centre_of_mass_to_light(self, mass, light_centre):
"""Align the centre of a mass profile to the centre of a light profile, if the align_light_mass_centre
SLaM setting is True.
Parameters
----------
mass : ag.mp.MassProfile
The mass profile whose centre may be aligned with the lens_light_centre attribute.
light : (float, float)
The centre of the light profile the mass profile is aligned with.
"""
if self.align_light_mass_centre:
mass.centre = light_centre
else:
mass.centre.centre_0 = af.GaussianPrior(mean=light_centre[0], sigma=0.1)
mass.centre.centre_1 = af.GaussianPrior(mean=light_centre[1], sigma=0.1)
return mass
"""LENS LIGHT PRIORS"""
lens.light.centre.centre_0 = af.GaussianPrior(
mean=0.0, sigma=0.1, lower_limit=-np.inf, upper_limit=np.inf
)
lens.light.centre.centre_1 = af.GaussianPrior(
mean=0.0, sigma=0.1, lower_limit=-np.inf, upper_limit=np.inf
)
lens.light.elliptical_comps.elliptical_comps_0 = af.GaussianPrior(
mean=0.33333, sigma=0.15, lower_limit=-1.0, upper_limit=1.0
)
lens.light.elliptical_comps.elliptical_comps_1 = af.GaussianPrior(
mean=0.0, sigma=0.2, lower_limit=-1.0, upper_limit=1.0
)
lens.light.intensity = af.GaussianPrior(
mean=0.02, sigma=0.01, lower_limit=0.0, upper_limit=np.inf
)
lens.light.effective_radius = af.GaussianPrior(
mean=0.62, sigma=0.2, lower_limit=0.0, upper_limit=np.inf
)
lens.light.sersic_index = af.GaussianPrior(
mean=4.0, sigma=2.0, lower_limit=0.0, upper_limit=np.inf
)
"""LENS MASS PRIORS"""
lens.mass.centre.centre_0 = af.GaussianPrior(
mean=0.0, sigma=0.1, lower_limit=-np.inf, upper_limit=np.inf
)
lens.mass.centre.centre_1 = af.GaussianPrior(
mean=0.0, sigma=0.1, lower_limit=-np.inf, upper_limit=np.inf
def unfix_lens_mass_centre(self, mass):
"""If the centre of a mass model was previously fixed to an input value (e.g. lens_mass_centre), unaligned it
by making its centre GaussianPriors.
"""
if self.lens_mass_centre is not None:
mass.centre.centre_0 = af.GaussianPrior(
mean=self.lens_mass_centre[0], sigma=0.05
)
mass.centre.centre_1 = af.GaussianPrior(
mean=self.lens_mass_centre[1], sigma=0.05
)
return mass
# %%
lens.light.elliptical_comps.elliptical_comps_0 = af.GaussianPrior(
mean=0.333333, sigma=0.1, lower_limit=-1.0, upper_limit=1.0
)
lens.light.elliptical_comps.elliptical_comps_1 = af.GaussianPrior(
mean=0.0, sigma=0.1, lower_limit=-1.0, upper_limit=1.0
)
# %%
"""
Lets additionally assume that the _LightProfile_'s ellipticity informs us of the _MassProfile_'s ellipticity. Because
this may not strictly be true (e.g. because of dark matter) we'll use a wider prior.
"""
# %%
lens.mass.elliptical_comps.elliptical_comps_0 = af.GaussianPrior(
mean=0.333333, sigma=0.3, lower_limit=-1.0, upper_limit=1.0
)
lens.mass.elliptical_comps.elliptical_comps_1 = af.GaussianPrior(
mean=0.0, sigma=0.3, lower_limit=-1.0, upper_limit=1.0
)
# %%
"""
The effective radius of a _LightProfile_ is its 'half-light' radius, the radius at which 50% of its total luminosity
is internal to a circle defined within that radius. __PyAutoLens__ assumes a UniformPrior on this quantity between 0.0" and
4.0", but inspection of the image (again, using a colormap scaling) shows the lens's light doesn't extend anywhere near
4.0", so lets reduce it.
"""
# %%
lens.light.effective_radius = af.GaussianPrior(