Source code for autolens.point.fit_point.positions_image

from functools import partial
from typing import Optional

import autoarray as aa
import autogalaxy as ag

from autolens.point.point_dataset import PointDict
from autolens.point.point_dataset import PointDataset
from autolens.point.point_solver import PointSolver
from autolens.lens.tracer import Tracer

from autolens import exc


[docs]class FitPositionsImage(aa.FitDataset): def __init__( self, name: str, positions: aa.Grid2DIrregular, noise_map: aa.ArrayIrregular, tracer: Tracer, point_solver: PointSolver, point_profile: Optional[ag.ps.Point] = None, ): """ A lens position fitter, which takes a set of positions (e.g. from a plane in the tracer) and computes \ their maximum separation, such that points which tracer closer to one another have a higher log_likelihood. Parameters ---------- positions : Grid2DIrregular The (y,x) arc-second coordinates of positions which the maximum distance and log_likelihood is computed using. noise_value The noise-value assumed when computing the log likelihood. """ super().__init__(dataset=positions) self.name = name self._noise_map = noise_map self.tracer = tracer self.point_profile = ( tracer.extract_profile(profile_name=name) if point_profile is None else point_profile ) self.point_solver = point_solver if self.point_profile is None: raise exc.PointExtractionException( f"For the point-source named {name} there was no matching point source profile " f"in the tracer (make sure your tracer's point source name is the same the dataset name." ) self.source_plane_coordinate = self.point_profile.centre @property def mask(self): return None @property def noise_map(self): return self._noise_map @property def positions(self) -> aa.Grid2DIrregular: return self.dataset @property def model_data(self) -> aa.Grid2DIrregular: """ Returns the model positions, which are computed via the point solver. It if common for many more image-plane positions to be computed than actual positions in the dataset. In this case, each data point is paired with its closest model position. """ if len(self.tracer.planes) > 2: upper_plane_index = self.tracer.extract_plane_index_of_profile( profile_name=self.name ) else: upper_plane_index = None model_positions = self.point_solver.solve( lensing_obj=self.tracer, source_plane_coordinate=self.source_plane_coordinate, upper_plane_index=upper_plane_index, ) return model_positions.grid_of_closest_from(grid_pair=self.positions) @property def model_positions(self) -> aa.Grid2DIrregular: return self.model_data @property def residual_map(self) -> aa.ArrayIrregular: residual_positions = self.positions - self.model_positions return residual_positions.distances_to_coordinate_from(coordinate=(0.0, 0.0)) @property def chi_squared(self) -> float: """ Returns the chi-squared terms of the model data's fit to an dataset, by summing the chi-squared-map. """ return ag.util.fit.chi_squared_from( chi_squared_map=self.chi_squared_map, )