Source code for autowisp.data_reduction.source_extracted_psf_map
"""Define callable class representing PSF maps from source extraction."""
import pandas
import numpy
from autowisp.fit_expression import Interface as FitTermsInterface
# Instances are intended to work as functions, so no methods other than __call__
# pylint: disable=too-few-public-methods
[docs]
class SourceExtractedPSFMap:
"""Evaluate smoothed PSF maps based on sorce extraction."""
[docs]
def __init__(self, psf_parameters, terms_expression, coefficients):
"""
Create the map for the given parameters per the given coefficients.
Args:
psf_parameters([str]): The names of the mapped PSF parameters.
terms_expression(str): An expression that expands to the fitting
terms the map depends on.
coefficients(2-D numpy.array): The coefficients defining the map.
The outer (0-th) index should select the PSF parameter.
Returns:
None
"""
self._psf_parameters = psf_parameters
self._get_predictors = FitTermsInterface(terms_expression)
self._coefficients = coefficients
[docs]
def __call__(self, source_data):
"""
Evaluate the map for the given sources.
Args:
source_data(numpy structured array or pandas DataFrame): The
x, y and catalogue information for the sources for which to
evaluate the map. The names of the fields should exactly match
the names used when creating the map.
Returns:
numpy structured array:
The PSF parameters predicted by the map for the input sources.
The fields will have the names of the PSF parameters.
"""
print("Source data: " + repr(source_data))
assert (
isinstance(source_data, pandas.DataFrame)
or len(source_data.shape) == 1
)
result = numpy.empty(
len(source_data),
dtype=[
(param_name, numpy.float64)
for param_name in self._psf_parameters
],
)
predictors = self._get_predictors(source_data)
for coefficients, param_name in zip(
self._coefficients, self._psf_parameters
):
result[param_name] = numpy.dot(coefficients, predictors)
return result
# pylint: enable=too-few-public-methods