Source code for exosim.tasks.instrument.foregroundsToFocalPlane
import astropy.units as u
import numpy as np
import scipy
from exosim.tasks.task import Task
[docs]class ForegroundsToFocalPlane(Task):
"""
It adds the foreground contribution to the focal plane
Returns
-------
:class:`~exosim.models.signal.Signal`
focal plane array
"""
def __init__(self):
"""
Parameters
__________
parameters: dict
channel parameter dictionary. This is usually parsed from :class:`~exosim.tasks.load.loadOptions.LoadOptions`
focal_plane: :class:`~exosim.models.signal.Signal`
focal plane array (with time evolution)
paths: dict
dictionary containing :class:`~exosim.models.signal.Radiance`
"""
self.add_task_param("parameters", "channel parameters dict")
self.add_task_param("focal_plane", "focal plane")
self.add_task_param("path", "path")
[docs] def execute(self):
self.info("adding foreground to focal plane")
parameters = self.get_task_param("parameters")
focal_plane = self.get_task_param("focal_plane")
path = self.get_task_param("path")
# if check focal plane units
if focal_plane.data_units == "":
focal_plane.data_units = u.ct / u.s
# check if sub focal planes are needed
if self._look_for_isolate(path):
self.debug("found isolated contributions")
sub_focal_plane = focal_plane.copy()
else:
sub_focal_plane = None
sub_focal_planes = {}
# populate the focal plane with path
for rad in [k for k in path.keys() if "radiance" in k]:
if sub_focal_plane:
tmp_focal_plane = sub_focal_plane.copy()
tmp_focal_plane.dataset_name = "sub_focal_planes/{}".format(
rad
)
if "slit_width" in path[rad].metadata.keys():
# TODO need to perform the convolution on a cube to make it faster
for t in range(path[rad].time.size):
npix = (
path[rad].metadata["slit_width"].to(u.um)
/ parameters["detector"]["delta_pix"]
* focal_plane.metadata["oversampling"]
)
conv = scipy.signal.convolve(
path[rad].data[t, 0], np.ones(int(npix)), "same"
)
focal_plane.data[t, :] += conv
if sub_focal_plane:
tmp_focal_plane.data[t, :] += conv
else:
focal_plane.data[:] += np.nansum(path[rad].data[:, 0])
if sub_focal_plane:
tmp_focal_plane.data[:] += np.nansum(path[rad].data[:, 0])
if sub_focal_plane:
sub_focal_planes[rad] = tmp_focal_plane
self.set_output([focal_plane, sub_focal_planes])
@staticmethod
def _look_for_isolate(path):
rad_list = [rad for rad in path if "radiance" in rad]
for rad in rad_list:
if not rad.split("_")[-1].isdigit():
return True
return False