Source code for lenstronomy.PointSource.Types.base_ps
from lenstronomy.LensModel.Solver.lens_equation_solver import LensEquationSolver
import numpy as np
__all__ = ["PSBase", "_expand_to_array", "_shrink_array"]
[docs]
class PSBase(object):
"""Base point source type class."""
[docs]
def __init__(
self,
lens_model=None,
fixed_magnification=False,
additional_images=False,
index_lens_model_list=None,
point_source_frame_list=None,
):
"""
:param lens_model: instance of the LensModel() class
:param fixed_magnification: bool. If True, magnification
ratio of point sources is fixed to the one given by the lens model
:param additional_images: bool. If True, search for additional images of the same source is conducted.
:param index_lens_model_list: list (length of different patches/bands) of integer lists, e.g., [[0, 1], [2, 3]];
evaluating a subset of the lens models per individual bands. If this keyword is set, the image positions need
to have a specified band/frame assigned to it
:param point_source_frame_list: list of lists mirroring the structure of the image positions.
Integers correspond to the i'th list entry of index_lens_model_list indicating in which frame/band the image is
appearing
"""
self._lens_model = lens_model
if index_lens_model_list is not None:
k_list = []
for point_source_frame in point_source_frame_list:
k_list.append(index_lens_model_list[point_source_frame])
self.k_list = k_list
else:
self.k_list = None
if self._lens_model is None:
self._solver = None
else:
self._solver = LensEquationSolver(lens_model)
self._fixed_magnification = fixed_magnification
self.additional_images = additional_images
if fixed_magnification is True and additional_images is True:
Warning(
"The combination of fixed_magnification=True and additional_image=True is not optimal for the "
"current computation. If you see this warning, please approach the developers."
)
[docs]
def image_position(self, kwargs_ps, **kwargs):
"""On-sky position.
:param kwargs_ps: keyword argument of point source model
:return: numpy array of x, y image positions
"""
raise ValueError(
"image_position definition is not defined in the profile you want to execute."
)
[docs]
def source_position(self, kwargs_ps, **kwargs):
"""Original unlensed position.
:param kwargs_ps: keyword argument of point source model
:return: numpy array of x, y source positions
"""
raise ValueError(
"source_position definition is not defined in the profile you want to execute."
)
[docs]
def image_amplitude(self, kwargs_ps, *args, **kwargs):
"""Amplitudes as observed on the sky.
:param kwargs_ps: keyword argument of point source model
:param kwargs: keyword arguments of function call
:return: numpy array of amplitudes
"""
raise ValueError(
"source_position definition is not defined in the profile you want to execute."
)
[docs]
def source_amplitude(self, kwargs_ps, **kwargs):
"""Intrinsic source amplitudes (without lensing magnification, but still
apparent)
:param kwargs_ps: keyword argument of point source model
:param kwargs: keyword arguments of function call (which are not used for this
object
:return: numpy array of amplitudes
"""
raise ValueError(
"source_position definition is not defined in the profile you want to execute."
)
[docs]
def update_lens_model(self, lens_model_class):
"""Update LensModel() and LensEquationSolver() instance.
:param lens_model_class: LensModel() class instance
:return: internal `LensModel` class updated
"""
self._lens_model = lens_model_class
if lens_model_class is None:
self._solver = None
else:
self._solver = LensEquationSolver(lens_model_class)
def _expand_to_array(array, num):
"""
:param array: float/int or numpy array
:param num: number of array entries expected in array
:return: array of size num
"""
if np.isscalar(array):
return np.ones(num) * array
elif len(array) < num:
out = np.zeros(num)
out[0 : len(array)] = array
return out
else:
return array
def _shrink_array(array, num):
"""
:param array: float/int or numpy array
:param num: number of array entries expected in array
:return: array of size num, or scalar if array is a scalar
"""
if np.isscalar(array):
return array
elif len(array) > num:
array_return = array[:num]
return array_return
elif len(array) < num:
raise ValueError(
"the length of the array (%s) needs to be larger or equal than the designated length %s "
% (len(array), num)
)
else:
return array