Source code for pynpoint.readwrite.attr_reading

"""
Modules for reading attributes from a FITS or ASCII file.
"""

import os
import warnings

from typing import Optional

import numpy as np

from astropy.io import fits
from typeguard import typechecked

from pynpoint.core.attributes import get_attributes
from pynpoint.core.processing import ReadingModule


[docs] class AttributeReadingModule(ReadingModule): """ Module for reading a list of values from a FITS or ASCII file and appending them as a non-static attributes to a dataset. """ __author__ = "Tomas Stolker" @typechecked def __init__( self, name_in: str, data_tag: str, file_name: str, attribute: str, input_dir: Optional[str] = None, overwrite: bool = False, ) -> None: """ Parameters ---------- name_in : str Unique name of the module instance. data_tag : str Tag of the database entry to which the attribute is written. file_name : str Name of the input file with the attribute value. Should be equal in size to the number of images in ``data_tag``. In case the ``file_name`` is ending with ``.fits``, then a FITS file is read. Otherwise, a single column of values is expected in an ASCII file. file_name : str Name of the input file with a list of values. attribute : str Name of the attribute as to be written in the database. input_dir : str, None Input directory where the input file is located. If not specified the Pypeline default directory is used. overwrite : bool Overwrite if the attribute is already exists. Returns ------- NoneType None """ super().__init__(name_in, input_dir=input_dir) self.m_data_port = self.add_output_port(data_tag) self.m_file_name = file_name self.m_attribute = attribute self.m_overwrite = overwrite
[docs] @typechecked def run(self) -> None: """ Run method of the module. Reads a list of values from a FITS or ASCII file and writes them as non-static attribute to a dataset. Returns ------- NoneType None """ print("Reading attribute data...", end="") attributes = get_attributes() if self.m_attribute not in attributes: raise ValueError(f"'{self.m_attribute}' is not a valid attribute.") if self.m_file_name.endswith("fits"): values = fits.getdata(os.path.join(self.m_input_location, self.m_file_name)) else: values = np.loadtxt( os.path.join(self.m_input_location, self.m_file_name), dtype=attributes[self.m_attribute]["type"], ) if values.ndim != 1: raise ValueError( f"The input file {self.m_file_name} should contain a 1D list with " f"attributes." ) status = self.m_data_port.check_non_static_attribute(self.m_attribute, values) if status == 1: self.m_data_port.add_attribute(self.m_attribute, values, static=False) elif status == -1 and self.m_overwrite: self.m_data_port.add_attribute(self.m_attribute, values, static=False) elif status == -1 and not self.m_overwrite: warnings.warn( f"The attribute '{self.m_attribute}' is already present. Set the " f"'overwrite' parameter to True in order to overwrite the values with " f"{self.m_file_name}." ) elif status == 0: warnings.warn( f"The '{self.m_attribute}' attribute is already present and " f"contains the same values as are present in {self.m_file_name}." ) print(" [DONE]") self.m_data_port.close_port()
[docs] class ParangReadingModule(ReadingModule): """ Module for reading a list of parallactic angles from a FITS or ASCII file. """ __author__ = "Tomas Stolker" @typechecked def __init__( self, name_in: str, data_tag: str, file_name: str, input_dir: Optional[str] = None, overwrite: bool = False, ) -> None: """ Parameters ---------- name_in : str Unique name of the module instance. data_tag : str Tag of the database entry to which the ``PARANG`` attribute is written. file_name : str Name of the input file with the parallactic angles (deg). Should be equal in size to the number of images in ``data_tag``. In case the ``file_name`` is ending with ``.fits``, then a FITS file is read. Otherwise, a single column of values is expected in an ASCII file. input_dir : str, None Input directory where the input file is located. If not specified the Pypeline default directory is used. overwrite : bool Overwrite if the ``PARANG`` attribute already exists. Returns ------- NoneType None """ super().__init__(name_in, input_dir=input_dir) self.m_data_port = self.add_output_port(data_tag) self.m_file_name = file_name self.m_overwrite = overwrite
[docs] @typechecked def run(self) -> None: """ Run method of the module. Reads the parallactic angles from a FITS or ASCII file and writes the values as non-static attribute (``PARANG``) to the database tag. Returns ------- NoneType None """ print("Reading parallactic angles...", end="") if self.m_file_name.endswith("fits"): parang = fits.getdata(os.path.join(self.m_input_location, self.m_file_name)) else: parang = np.loadtxt(os.path.join(self.m_input_location, self.m_file_name)) print(" [DONE]") if parang.ndim != 1: raise ValueError( f"The input file {self.m_file_name} should contain a 1D data set with " f"the parallactic angles." ) print(f"Number of angles: {parang.size}") print(f"Rotation range: {parang[0]:.2f} -> {parang[-1]:.2f} deg") status = self.m_data_port.check_non_static_attribute("PARANG", parang) if status == 1: self.m_data_port.add_attribute("PARANG", parang, static=False) elif status == -1 and self.m_overwrite: self.m_data_port.add_attribute("PARANG", parang, static=False) elif status == -1 and not self.m_overwrite: warnings.warn( f"The PARANG attribute is already present. Set the 'overwrite' " f"parameter to True in order to overwrite the values with " f"{self.m_file_name}." ) elif status == 0: warnings.warn( f"The PARANG attribute is already present and contains the same values " f"as are present in {self.m_file_name}." ) self.m_data_port.close_port()
[docs] class WavelengthReadingModule(ReadingModule): """ Module for reading a list of wavelengths from a FITS or ASCII file. """ __author__ = "Tomas Stolker" @typechecked def __init__( self, name_in: str, data_tag: str, file_name: str, input_dir: Optional[str] = None, overwrite: bool = False, ) -> None: """ Parameters ---------- name_in : str Unique name of the module instance. data_tag : str Tag of the database entry to which the ``WAVELENGTH`` attribute is written. file_name : str Name of the input file with the wavelengths (a.u.). Should be equal in size to the number of images in ``data_tag``. In case the ``file_name`` is ending with ``.fits``, then a FITS file is read. Otherwise, a single column of values is expected in an ASCII file. input_dir : str, None Input directory where the input file is located. If not specified the Pypeline default directory is used. overwrite : bool Overwrite if the ``WAVELENGTH`` attribute already exists. Returns ------- NoneType None """ super().__init__(name_in, input_dir=input_dir) self.m_data_port = self.add_output_port(data_tag) self.m_file_name = file_name self.m_overwrite = overwrite
[docs] @typechecked def run(self) -> None: """ Run method of the module. Reads the parallactic angles from a FITS or ASCII file and writes the values as non-static attribute (``WAVELENGTH``) to the database tag. Returns ------- NoneType None """ print("Reading wavelengths...", end="") if self.m_file_name.endswith("fits"): wavelength = fits.getdata( os.path.join(self.m_input_location, self.m_file_name) ) else: wavelength = np.loadtxt( os.path.join(self.m_input_location, self.m_file_name) ) print(" [DONE]") if wavelength.ndim != 1: raise ValueError( f"The input file {self.m_file_name} should contain a 1D data set with " f"the wavelengths." ) print(f"Number of wavelengths: {wavelength.size}") print(f"Wavelength range: {wavelength[0]:.2f} - {wavelength[-1]:.2f}") status = self.m_data_port.check_non_static_attribute("WAVELENGTH", wavelength) if status == 1: self.m_data_port.add_attribute("WAVELENGTH", wavelength, static=False) elif status == -1 and self.m_overwrite: self.m_data_port.add_attribute("WAVELENGTH", wavelength, static=False) elif status == -1 and not self.m_overwrite: warnings.warn( f"The WAVELENGTH attribute is already present. Set the 'overwrite' " f"parameter to True in order to overwrite the values with " f"{self.m_file_name}." ) elif status == 0: warnings.warn( f"The WAVELENGTH attribute is already present and contains the same " f"values as are present in {self.m_file_name}." ) self.m_data_port.close_port()