Source code for pynpoint.util.attributes
"""
Functions for adding attributes to a dataset in the central database.
"""
import warnings
import numpy as np
from astropy.io import fits
from typeguard import typechecked
from pynpoint.core.attributes import get_attributes
from pynpoint.core.dataio import ConfigPort, OutputPort
[docs]
@typechecked
def set_static_attr(
fits_file: str,
header: fits.header.Header,
config_port: ConfigPort,
image_out_port: OutputPort,
check: bool = True,
) -> None:
"""
Function which adds the static attributes to the central database.
Parameters
----------
fits_file : str
Name of the FITS file.
header : astropy.io.fits.header.Header
Header information from the FITS file that is read.
config_port : pynpoint.core.dataio.ConfigPort
Configuration port.
image_out_port : pynpoint.core.dataio.OutputPort
Output port of the images to which the static attributes are stored.
check : bool
Print a warning if certain attributes from the configuration file are not present in
the FITS header. If set to `False`, attributes are still written to the dataset but
there will be no warning if a keyword is not found in the FITS header.
Returns
-------
NoneType
None
"""
attributes = get_attributes()
static = []
for key, value in attributes.items():
if value["config"] == "header" and value["attribute"] == "static":
static.append(key)
for attr in static:
fitskey = config_port.get_attribute(attr)
if isinstance(fitskey, np.bytes_):
fitskey = str(fitskey.decode("utf-8"))
if fitskey != "None":
if fitskey in header:
status = image_out_port.check_static_attribute(attr, header[fitskey])
if status == 1:
image_out_port.add_attribute(attr, header[fitskey], static=True)
elif status == 0:
pass
elif status == -1:
warnings.warn(
f"Static attribute {fitskey} has changed. Possibly the "
f"current file {fits_file} does not belong to the data set "
f"'{image_out_port.tag}'. Attribute value is updated."
)
elif check:
warnings.warn(
f"Static attribute {attr} (={fitskey}) not found in the FITS "
"header."
)
[docs]
@typechecked
def set_nonstatic_attr(
header: fits.header.Header,
config_port: ConfigPort,
image_out_port: OutputPort,
check: bool = True,
) -> None:
"""
Function which adds the non-static attributes to the central database.
Parameters
----------
header : astropy.io.fits.header.Header
Header information from the FITS file that is read.
config_port : pynpoint.core.dataio.ConfigPort
Configuration port.
image_out_port : pynpoint.core.dataio.OutputPort
Output port of the images to which the non-static attributes are stored.
Returns
-------
NoneType
None
"""
attributes = get_attributes()
nonstatic = []
for key, value in attributes.items():
if value["attribute"] == "non-static":
nonstatic.append(key)
for attr in nonstatic:
if attributes[attr]["config"] == "header":
fitskey = config_port.get_attribute(attr)
# if type(fitskey) == np.bytes_:
# fitskey = str(fitskey.decode('utf-8'))
if fitskey != "None":
if fitskey in header:
image_out_port.append_attribute_data(attr, header[fitskey])
elif header["NAXIS"] == 2 and attr == "NFRAMES":
image_out_port.append_attribute_data(attr, 1)
elif check:
warnings.warn(
"Non-static attribute %s (=%s) not found in the "
"FITS header." % (attr, fitskey)
)
image_out_port.append_attribute_data(attr, -1)