'''
KPF Level 1 Data Model
'''
# Standard dependencies
from collections import OrderedDict
import os
import copy
# External dependencies
import astropy
from astropy.io import fits
from astropy.time import Time
from astropy.table import Table
import numpy as np
import pandas as pd
from kpfpipe.models.base_model import KPFDataModel
from kpfpipe.models.metadata import KPF_definitions
from kpfpipe.models.level0 import KPF0
[docs]
class KPF1(KPF0):
'''
The level 1 KPF data. Initialize with empty fields.
Attributes inherited from KPF0
'''
[docs]
@classmethod
def from_l0(self, l0):
"""Create a level1 object from a level0 object in order to inherit headers."""
l1 = KPF1()
l1.header['PRIMARY'] = l0.header['PRIMARY']
if 'TELEMETRY' in l0.header:
l1.header['TELEMETRY'] = l0.header['TELEMETRY']
l1['TELEMETRY'] = l0['TELEMETRY']
if 'RECEIPT' in l0.header:
l1.header['RECEIPT'] = l0.header['RECEIPT']
l1['RECEIPT'] = l0['RECEIPT']
l1.add_default_headers()
# self.receipt_add_entry('KPF1.from_l0', self.__module__, f'abc', 'PASS', chip='all',
# comment=f'Copy TELEMETRY and RECEIPT from L0/2D to L1')
#
return l1
def __init__(self):
'''
Constructor
'''
super().__init__()
self.level = 1
self.extensions = copy.copy(KPF_definitions.LEVEL1_EXTENSIONS)
self.header_definitions = pd.read_csv(KPF_definitions.LEVEL1_HEADER_FILE)
python_types = copy.copy(KPF_definitions.FITS_TYPE_MAP)
for key, value in self.extensions.items():
if key not in ['PRIMARY', 'RECEIPT', 'CONFIG', 'TELEMETRY']:
atr = python_types[value]([])
self.header[key] = fits.Header()
else:
continue
self.create_extension(key, python_types[value])
setattr(self, key, atr)
header_keys = self.header.keys()
del_keys = []
for key in header_keys:
if key not in self.extensions.keys():
del_keys.append(key)
for key in del_keys:
del self.header[key]
self.add_default_headers()
self.read_methods: dict = {
'KPF': self._read_from_KPF,
'NEID': self._read_from_NEID
}
self.receipt_add_entry('KPF1.__init__', self.__module__, f' ', 'PASS',
comment=f'Create L1 object')