Source code for exosim.utils.focal_plane_locations

import logging
from typing import Tuple

import numpy as np
from scipy.interpolate import interp1d

from exosim.models.signal import Signal

[docs]logger = logging.getLogger(__name__)
[docs]def locate_wavelength_windows( psf: np.array, focal_plane: Signal, parameters: dict ) -> Tuple[np.array, np.array]: focal_plane_shape = ( focal_plane.data.shape if not focal_plane.cached else focal_plane.shape ) if psf.ndim == 4: logger.debug("PSF is 4D, will use spectral and spatial dimensions") return _locate_spectral_and_spatial( psf, focal_plane, parameters, focal_plane_shape ) if psf.ndim == 3: logger.debug("PSF is 3D, will use spectral dimension only") if parameters["type"].lower() == "spectrometer": j0_ = np.round( np.arange(focal_plane_shape[2]) - psf.shape[2] // 2 ).astype(int) if parameters["type"].lower() == "photometer": j0_ = np.repeat( focal_plane_shape[2] // 2 - psf.shape[2] // 2 - 1, focal_plane.spectral.size, ) return None, j0_
def _locate_spectral_and_spatial( psf: np.array, focal_plane: Signal, parameters: dict, focal_plane_shape: tuple, ) -> Tuple[np.array, np.array]: if parameters["type"].lower() == "spectrometer": j0_ = np.round( np.arange(focal_plane_shape[2]) - psf.shape[3] // 2 ).astype(int) if focal_plane.spatial.data == np.zeros_like(focal_plane.spatial): # crop PSF no spatial direction of too big if psf.shape[2] > focal_plane_shape[1]: center = psf.shape[2] // 2 size = focal_plane_shape[1] // 2 psf = psf[:, :, center - size : center + size, :] i0_ = np.repeat( focal_plane_shape[1] // 2 - psf.shape[2] // 2, focal_plane.spectral.size, ) else: spatial_wl_sol = interp1d( focal_plane.spatial, np.arange(0, focal_plane_shape[1]), fill_value="extrapolate", ) i0_ = np.round( spatial_wl_sol(focal_plane.spectral) - psf.shape[2] // 2 ).astype(int) if parameters["type"].lower() == "photometer": j0_ = np.repeat( focal_plane_shape[2] // 2 - psf.shape[3] // 2 - 1, focal_plane.spectral.size, ) i0_ = np.repeat( focal_plane_shape[1] // 2 - psf.shape[2] // 2 - 1, focal_plane.spectral.size, ) return i0_, j0_