Source code for scopesim.detector.detector_array
import logging
from astropy.io import fits
from .detector import Detector
from ..effects.effects_utils import get_all_effects
from .. import effects as efs
from .. import utils
[docs]
class DetectorArray:
def __init__(self, detector_list=None, **kwargs):
self.meta = {}
self.meta.update(kwargs)
self.detector_list = detector_list
self.array_effects = []
self.dtcr_effects = []
self.detectors = []
self.latest_exposure = None
[docs]
def readout(self, image_planes, array_effects=None, dtcr_effects=None, **kwargs):
"""
Read out the detector array into a FITS file
Parameters
----------
image_planes : list of ImagePlane objects
The correct image plane is automatically chosen from the list
array_effects : list of Effect objects
A list of effects related to the detector array
dtcr_effects : list of Effect objects
A list of effects related to the detectors
Returns
-------
self.latest_exposure : fits.HDUList
"""
# .. note:: Detector is what used to be called Chip
# DetectorArray is the old Detector
# 0. Select the relevant image plane to extract images from
# 1. make a series of Detectors for each row in a DetectorList object
# 2. iterate through all Detectors, extract image from image_plane
# 3. apply all effects (to all Detectors)
# 4. add necessary header keywords
# 5. Generate a HDUList with the ImageHDUs and any extras:
# - add PrimaryHDU with meta data regarding observation in header
# - add ImageHDUs
# - add ASCIITableHDU with Effects meta data in final table extension
self.array_effects = array_effects or []
self.dtcr_effects = dtcr_effects or []
self.meta.update(kwargs)
# 0. Get the image plane that corresponds to this detector array
image_plane_id = self.detector_list.meta["image_plane_id"]
image_plane = [implane for implane in image_planes if
implane.id == image_plane_id][0]
# 0a. Apply detector array effects (apply to the entire image plane)
for effect in self.array_effects:
image_plane = effect.apply_to(image_plane, **self.meta)
# 1. make a series of Detectors for each row in a DetectorList object
self.detectors = [Detector(hdr, **self.meta)
for hdr in self.detector_list.detector_headers()]
# 2. iterate through all Detectors, extract image from image_plane
for detector in self.detectors:
detector.extract_from(image_plane)
# 3. apply all effects (to all Detectors)
for effect in self.dtcr_effects:
detector = effect.apply_to(detector)
# 4. add necessary header keywords
# .. todo: add keywords
# 5. Generate a HDUList with the ImageHDUs and any extras:
pri_hdu = make_primary_hdu(self.meta)
# ..todo: effects_hdu unnecessary as long as make_effects_hdu does not do anything
# effects_hdu = make_effects_hdu(self.array_effects + self.dtcr_effects)
hdu_list = fits.HDUList([pri_hdu]
+ [dtcr.hdu for dtcr in self.detectors])
# + [effects_hdu])
for effect in self.array_effects:
image_plane = effect.apply_to(image_plane, **self.meta)
self.latest_exposure = hdu_list
return self.latest_exposure
def __repr__(self):
msg = (f"{self.__class__.__name__}"
f"({self.detector_list!r}, **{self.meta!r})")
return msg
def __str__(self):
return f"{self.__class__.__name__} with {self.detector_list!s}"
def _repr_pretty_(self, p, cycle):
"""For ipython"""
if cycle:
p.text(f"{self.__class__.__name__}(...)")
else:
p.text(str(self))
[docs]
def make_primary_hdu(meta):
"""Create the primary header from meta data"""
new_meta = utils.stringify_dict(meta)
prihdu = fits.PrimaryHDU()
prihdu.header.update(new_meta)
return prihdu
[docs]
def make_effects_hdu(effects):
# .. todo:: decide what goes into the effects table of meta data
return fits.TableHDU()
# def get_detector_list(effects):
# detector_lists = get_all_effects(effects, efs.DetectorList)
#
# if len(detector_lists) != 1:
# logging.warning("None or more than one DetectorList found. Using the"
# " first instance.{}".format(detector_lists))
#
# return detector_lists[0]