Source code for scopesim.optics.OLD_fov_manager
# 1. Find the Wavelength range
# Build from edges of throughput curve
# 2. Find the wavelength bins
# If TraceList and Aperture list, then Spectroscopy
# TraceList
# for each trace dlam along the trace centre in increments
# of SIM_SUB_PIXEL_FRACTION
# Must be accompanied by an ApertureList
# If not, then imaging
# PSF core increase (atmo, ncpas)
# If from a files, what is the bin size?
# If analytic, dlam between a FWHM or SIM_SUB_PIXEL_FRACTION
# ADC + AD shifts
# dlam between shift of SIM_SUB_PIXEL_FRACTION
# 3. Find the spatial range
# If Spectroscopy
# ApertureList
# For each Trace set the sky header to the aperture footprint
# plus any shifts from AtmosphericDispersion
# Set the Image plane footprint centred on the image plane
# position
# If Imaging
# DetectorList, or ApertureMask, plus any shift from
# AtmosphericDispersion
from . import fov_manager_utils as fmu
from ..effects.effects_utils import is_spectroscope
from ..utils import from_currsys
[docs]
class FOVManager:
"""
A class to manage the (monochromatic) image windows covering the target
Parameters
----------
effects : list of Effect objects
Passed from optics_manager.fov_setup_effects
kwargs
------
All observation parameters as passed from UserCommands
"""
def __init__(self, effects=[], **kwargs):
self.meta = {"area": "!TEL.area",
"pixel_scale": "!INST.pixel_scale",
"plate_scale": "!INST.plate_scale",
"wave_min": "!SIM.spectral.wave_min",
"wave_mid": "!SIM.spectral.wave_mid",
"wave_max": "!SIM.spectral.wave_max",
"chunk_size": "!SIM.computing.chunk_size",
"max_segment_size": "!SIM.computing.max_segment_size",
"sub_pixel": "!SIM.sub_pixel.flag",
"sub_pixel_fraction": "!SIM.sub_pixel.fraction",
"preload_fovs": "!SIM.computing.preload_field_of_views"}
self.meta.update(kwargs)
self.effects = effects
if from_currsys(self.meta["preload_fovs"]) is True:
self._fovs_list = self.generate_fovs_list()
else:
self._fovs_list = []
[docs]
def generate_fovs_list(self):
"""
Generates a series of FieldOfViews objects based self.effects
Returns
-------
fovs : list of FieldOfView objects
"""
self.meta = from_currsys(self.meta)
fov_meta_keys = ["area", "sub_pixel"]
fov_meta = {key: self.meta[key] for key in fov_meta_keys}
if is_spectroscope(self.effects):
headers = fmu.get_spectroscopy_headers(self.effects, **self.meta)
shifts = fmu.get_3d_shifts(self.effects, **self.meta)
fovs = fmu.get_spectroscopy_fovs(headers, shifts, self.effects,
**fov_meta)
else:
headers = fmu.get_imaging_headers(self.effects, **self.meta)
waveset = fmu.get_imaging_waveset(self.effects, **self.meta)
shifts = fmu.get_3d_shifts(self.effects, **self.meta)
fovs = fmu.get_imaging_fovs(headers, waveset, shifts, **fov_meta)
return fovs
@property
def fovs(self):
if from_currsys(self.meta["preload_fovs"]) is False:
self._fovs_list = self.generate_fovs_list()
return self._fovs_list
@property
def fov_footprints(self, which="both"):
return None
# Spectroscopy FOV setup
# ======================
#
# self.effects --> fov_setup_effects [ApertureList, TraceList, DetectorList]
#
# generate a set of sky headers for each aperture in the list
#
# for each trace in tracelist,
# note the aperture_id
# note the image_plane_id
#
# get the pixel_size [from DetectorList.table["pixsize"]]
# crawl along trace
# find the red/blue extreme pixel edge wavelengths
# get the wavelength of the nearest full pixel jump (x or y)
#
# interpolate the image plane positions of the trace table for the new
# wavelength array
# for each new wavelength
# get the rotation angle of the fov
# get the shear of the fov wrt the next fov
#
# generate an image-plane header for each wavelength
#
# get the combined 3d-shifts
# for each trace
# interpolate the 3d-shifts for all wavelengths
# apply the required fov-shift to each fov header