From a0208ad42ddb6853943a2209d0a3b28d44e99b12 Mon Sep 17 00:00:00 2001 From: teald Date: Mon, 16 Dec 2024 13:11:34 -0800 Subject: [PATCH 01/11] chore(tox): Remove astrodata references --- astrodata/.notempty | 0 astrodata/.readthedocs.yaml | 30 - astrodata/__init__.py | 29 - astrodata/_version.py | 31 - astrodata/core.py | 1302 ----------------- astrodata/doc/.readthedocs.yaml | 32 - astrodata/doc/Makefile | 206 --- astrodata/doc/_static/rtd_theme_overrides.css | 20 - .../rtd_theme_overrides_references.css | 16 - astrodata/doc/_static/todo-styles.css | 7 - astrodata/doc/api.rst | 11 - astrodata/doc/appendix_descriptors.rst | 248 ---- astrodata/doc/cheatsheet.rst | 463 ------ astrodata/doc/conf.py | 465 ------ astrodata/doc/images/GeminiLogo_new_2014.jpg | Bin 1710871 -> 0 bytes astrodata/doc/index.rst | 53 - astrodata/doc/make.bat | 281 ---- astrodata/doc/progmanual/adclass.rst | 397 ----- astrodata/doc/progmanual/containers.rst | 96 -- astrodata/doc/progmanual/descriptors.rst | 65 - astrodata/doc/progmanual/design.rst | 82 -- astrodata/doc/progmanual/index.rst | 22 - astrodata/doc/progmanual/intro.rst | 45 - astrodata/doc/progmanual/tags.rst | 160 -- astrodata/doc/usermanual/data.rst | 903 ------------ astrodata/doc/usermanual/headers.rst | 302 ---- astrodata/doc/usermanual/index.rst | 23 - astrodata/doc/usermanual/intro.rst | 138 -- astrodata/doc/usermanual/iomef.rst | 546 ------- astrodata/doc/usermanual/structure.rst | 190 --- astrodata/doc/usermanual/tables.rst | 228 --- astrodata/doc/usermanual/tags.rst | 172 --- astrodata/factory.py | 144 -- astrodata/fits.py | 860 ----------- astrodata/nddata.py | 513 ------- astrodata/provenance.py | 303 ---- astrodata/testing.py | 562 ------- astrodata/tests/__init__.py | 0 astrodata/tests/test_core.py | 273 ---- astrodata/tests/test_fits.py | 989 ------------- astrodata/tests/test_nddata.py | 166 --- astrodata/tests/test_object_construction.py | 430 ------ astrodata/tests/test_provenance.py | 172 --- astrodata/tests/test_tags.py | 162 -- astrodata/tests/test_testing.py | 84 -- astrodata/tests/test_utils.py | 81 - astrodata/tests/test_wcs.py | 267 ---- astrodata/utils.py | 332 ----- astrodata/wcs.py | 1033 ------------- tox.ini | 27 +- 50 files changed, 14 insertions(+), 12947 deletions(-) delete mode 100644 astrodata/.notempty delete mode 100644 astrodata/.readthedocs.yaml delete mode 100644 astrodata/__init__.py delete mode 100644 astrodata/_version.py delete mode 100644 astrodata/core.py delete mode 100644 astrodata/doc/.readthedocs.yaml delete mode 100644 astrodata/doc/Makefile delete mode 100644 astrodata/doc/_static/rtd_theme_overrides.css delete mode 100644 astrodata/doc/_static/rtd_theme_overrides_references.css delete mode 100644 astrodata/doc/_static/todo-styles.css delete mode 100644 astrodata/doc/api.rst delete mode 100644 astrodata/doc/appendix_descriptors.rst delete mode 100644 astrodata/doc/cheatsheet.rst delete mode 100644 astrodata/doc/conf.py delete mode 100644 astrodata/doc/images/GeminiLogo_new_2014.jpg delete mode 100644 astrodata/doc/index.rst delete mode 100644 astrodata/doc/make.bat delete mode 100644 astrodata/doc/progmanual/adclass.rst delete mode 100644 astrodata/doc/progmanual/containers.rst delete mode 100644 astrodata/doc/progmanual/descriptors.rst delete mode 100644 astrodata/doc/progmanual/design.rst delete mode 100644 astrodata/doc/progmanual/index.rst delete mode 100644 astrodata/doc/progmanual/intro.rst delete mode 100644 astrodata/doc/progmanual/tags.rst delete mode 100644 astrodata/doc/usermanual/data.rst delete mode 100644 astrodata/doc/usermanual/headers.rst delete mode 100644 astrodata/doc/usermanual/index.rst delete mode 100644 astrodata/doc/usermanual/intro.rst delete mode 100644 astrodata/doc/usermanual/iomef.rst delete mode 100644 astrodata/doc/usermanual/structure.rst delete mode 100644 astrodata/doc/usermanual/tables.rst delete mode 100644 astrodata/doc/usermanual/tags.rst delete mode 100644 astrodata/factory.py delete mode 100644 astrodata/fits.py delete mode 100644 astrodata/nddata.py delete mode 100644 astrodata/provenance.py delete mode 100644 astrodata/testing.py delete mode 100644 astrodata/tests/__init__.py delete mode 100644 astrodata/tests/test_core.py delete mode 100644 astrodata/tests/test_fits.py delete mode 100644 astrodata/tests/test_nddata.py delete mode 100644 astrodata/tests/test_object_construction.py delete mode 100644 astrodata/tests/test_provenance.py delete mode 100644 astrodata/tests/test_tags.py delete mode 100644 astrodata/tests/test_testing.py delete mode 100644 astrodata/tests/test_utils.py delete mode 100644 astrodata/tests/test_wcs.py delete mode 100644 astrodata/utils.py delete mode 100644 astrodata/wcs.py diff --git a/astrodata/.notempty b/astrodata/.notempty deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/astrodata/.readthedocs.yaml b/astrodata/.readthedocs.yaml deleted file mode 100644 index e80232f0c8..0000000000 --- a/astrodata/.readthedocs.yaml +++ /dev/null @@ -1,30 +0,0 @@ -# .readthedocs.yaml -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required -version: 2 - -# Set the version of Python and other tools you might need -build: - os: ubuntu-22.04 - tools: - python: "3.10" - # You can also specify other tool versions: - # nodejs: "19" - # rust: "1.64" - # golang: "1.19" - -# Build documentation in the docs/ directory with Sphinx -sphinx: - configuration: astrodata/doc/conf.py - -# If using Sphinx, optionally build your docs in additional formats such as PDF -# formats: -# - pdf - -# Optionally declare the Python requirements required to build your docs -python: - install: - - requirements: requirements.txt -# - requirements: docs/requirements.txt \ No newline at end of file diff --git a/astrodata/__init__.py b/astrodata/__init__.py deleted file mode 100644 index ec914d9b9f..0000000000 --- a/astrodata/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -This package add another abstraction layer to astronomical data by parsing -the information contained in the headers as attributes. To do so, -one must subclass :class:`astrodata.AstroData` and add parse methods -accordingly to the :class:`~astrodata.TagSet` received. -""" - -__all__ = ['AstroData', 'AstroDataError', 'TagSet', 'NDAstroData', - 'AstroDataMixin', 'astro_data_descriptor', 'astro_data_tag', - 'open', 'create', '__version__', 'version', 'add_header_to_table', - 'Section'] - - -from .core import AstroData -from .fits import add_header_to_table -from .factory import AstroDataFactory, AstroDataError -from .nddata import NDAstroData, AstroDataMixin -from .utils import * -from ._version import version - -__version__ = version() - -factory = AstroDataFactory() -# Let's make sure that there's at least one class that matches the data -# (if we're dealing with a FITS file) -factory.addClass(AstroData) - -open = factory.getAstroData -create = factory.createFromScratch diff --git a/astrodata/_version.py b/astrodata/_version.py deleted file mode 100644 index 2fd60394bd..0000000000 --- a/astrodata/_version.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python -""" -Holds the DRAGONS version to be propagated throught all the DRAGONS package -and to be used in the documentation. -""" - -# --- Setup Version Here --- -API = 4 -FEATURE = 0 -BUG = 0 -TAG = 'dev' - - -def version(short=False, tag=TAG): - """ - Returns DRAGONS's version based on the api, - feature and bug numbers. - - Returns - ------- - str : formatted version - """ - - if short: - _version = "{:d}.{:d}".format(API, FEATURE) - - else: - _tag = '_{:s}'.format(tag) if tag else '' - _version = "{:d}.{:d}.{:d}".format(API, FEATURE, BUG) + _tag - - return _version diff --git a/astrodata/core.py b/astrodata/core.py deleted file mode 100644 index b24654056f..0000000000 --- a/astrodata/core.py +++ /dev/null @@ -1,1302 +0,0 @@ -import inspect -import logging -import os -import re -import textwrap -import warnings -from collections import OrderedDict -from contextlib import suppress -from copy import copy, deepcopy -from functools import partial - -import numpy as np - -from astropy.io import fits -from astropy.nddata import NDData -from astropy.table import Table -from astropy.utils import format_doc - -from .fits import (DEFAULT_EXTENSION, FitsHeaderCollection, _process_table, - read_fits, write_fits) -from .nddata import ADVarianceUncertainty -from .nddata import NDAstroData as NDDataObject -from .utils import (assign_only_single_slice, astro_data_descriptor, - deprecated, normalize_indices, returns_list) - -NO_DEFAULT = object() - - -_arit_doc = """ - Performs {name} by evaluating ``self {op} operand``. - - Parameters - ---------- - oper : number or object - The operand to perform the operation ``self {op} operand``. - - Returns - -------- - `AstroData` instance -""" - - -class AstroData: - """ - Base class for the AstroData software package. It provides an interface - to manipulate astronomical data sets. - - Parameters - ---------- - nddata : `astrodata.NDAstroData` or list of `astrodata.NDAstroData` - List of NDAstroData objects. - tables : dict[name, `astropy.table.Table`] - Dict of table objects. - phu : `astropy.io.fits.Header` - Primary header. - indices : list of int - List of indices mapping the `astrodata.NDAstroData` objects that this - object will access to. This is used when slicing an object, then the - sliced AstroData will have the ``.nddata`` list from its parent and - access the sliced NDAstroData through this list of indices. - - """ - - # Derived classes may provide their own __keyword_dict. Being a private - # variable, each class will preserve its own, and there's no risk of - # overriding the whole thing - __keyword_dict = { - 'instrument': 'INSTRUME', - 'object': 'OBJECT', - 'telescope': 'TELESCOP', - 'ut_date': 'DATE-OBS' - } - - def __init__(self, nddata=None, tables=None, phu=None, indices=None, - is_single=False): - if nddata is None: - nddata = [] - elif not isinstance(nddata, (list, tuple)): - nddata = [nddata] - - # _all_nddatas contains all the extensions from the original file or - # object. And _indices is used to map extensions for sliced objects. - self._all_nddatas = nddata - self._indices = indices - - self.is_single = is_single - """ If this data provider represents a single slice out of a whole - dataset, return True. Otherwise, return False. """ - - if tables is not None and not isinstance(tables, dict): - raise ValueError('tables must be a dict') - self._tables = tables or {} - - self._phu = phu or fits.Header() - self._fixed_settable = {'data', 'uncertainty', 'mask', 'variance', - 'wcs', 'path', 'filename'} - self._logger = logging.getLogger(__name__) - self._orig_filename = None - self._path = None - - def __copy__(self): - """ - Returns a shallow copy of this instance. - """ - obj = self.__class__() - - for attr in ('_phu', '_path', '_orig_filename', '_tables'): - obj.__dict__[attr] = self.__dict__[attr] - - # A new list containing references (rather than a reference to the list) - obj.__dict__['_all_nddatas'] = [nd for nd in self._nddata] - - # If we're copying a single-slice AD, then make its NDAstroData a copy - # so attributes can be modified without affecting the original - if self.is_single: - obj.__dict__['_all_nddatas'][self._indices[0]] = copy(self.nddata) - - return obj - - def __deepcopy__(self, memo): - """ - Returns a new instance of this class. - - Parameters - ---------- - memo : dict - See the documentation on `deepcopy` for an explanation on how - this works. - - """ - obj = self.__class__() - - for attr in ('_phu', '_path', '_orig_filename', '_tables'): - obj.__dict__[attr] = deepcopy(self.__dict__[attr]) - - obj.__dict__['_all_nddatas'] = [deepcopy(nd) for nd in self._nddata] - return obj - - def _keyword_for(self, name): - """ - Returns the FITS keyword name associated to ``name``. - - Parameters - ---------- - name : str - The common "key" name for which we want to know the associated - FITS keyword. - - Returns - ------- - str - The desired keyword name. - - Raises - ------ - AttributeError - If there is no keyword for the specified ``name``. - - """ - for cls in self.__class__.mro(): - with suppress(AttributeError, KeyError): - # __keyword_dict is a mangled variable - return getattr(self, f'_{cls.__name__}__keyword_dict')[name] - else: - raise AttributeError(f"No match for '{name}'") - - def _process_tags(self): - """Return the tag set (as a set of str) for the current instance.""" - results = [] - # Calling inspect.getmembers on `self` would trigger all the - # properties (tags, phu, hdr, etc.), and that's undesirable. To - # prevent that, we'll inspect the *class*. - filt = lambda x: hasattr(x, 'tag_method') - for _, method in inspect.getmembers(self.__class__, filt): - ts = method(self) - if ts.add or ts.remove or ts.blocks: - results.append(ts) - - # Sort by the length of substractions... those that substract - # from others go first - results = sorted(results, key=lambda x: len(x.remove) + len(x.blocks), - reverse=True) - - # Sort by length of blocked_by, those that are never disabled go first - results = sorted(results, key=lambda x: len(x.blocked_by)) - - # Sort by length of if_present... those that need other tags to - # be present go last - results = sorted(results, key=lambda x: len(x.if_present)) - - tags = set() - removals = set() - blocked = set() - for plus, minus, blocked_by, blocks, is_present in results: - if is_present: - # If this TagSet requires other tags to be present, make - # sure that all of them are. Otherwise, skip... - if len(tags & is_present) != len(is_present): - continue - allowed = (len(tags & blocked_by) + len(plus & blocked)) == 0 - if allowed: - # This set is not being blocked by others... - removals.update(minus) - tags.update(plus - removals) - blocked.update(blocks) - - return tags - - @staticmethod - def _matches_data(source): - # This one is trivial. Will be more specific for subclasses. - return True - - @property - def path(self): - """Return the file path.""" - return self._path - - @path.setter - def path(self, value): - if self._path is None and value is not None: - self._orig_filename = os.path.basename(value) - self._path = value - - @property - def filename(self): - """Return the file name.""" - if self.path is not None: - return os.path.basename(self.path) - - @filename.setter - def filename(self, value): - if os.path.isabs(value): - raise ValueError("Cannot set the filename to an absolute path!") - elif self.path is None: - self.path = os.path.abspath(value) - else: - dirname = os.path.dirname(self.path) - self.path = os.path.join(dirname, value) - - @property - def orig_filename(self): - """Return the original file name (before it was modified).""" - return self._orig_filename - - @orig_filename.setter - def orig_filename(self, value): - self._orig_filename = value - - @property - def phu(self): - """Return the primary header.""" - return self._phu - - @phu.setter - def phu(self, phu): - self._phu = phu - - @property - def hdr(self): - """Return all headers, as a `astrodata.fits.FitsHeaderCollection`.""" - if not self.nddata: - return None - headers = [nd.meta['header'] for nd in self._nddata] - return headers[0] if self.is_single else FitsHeaderCollection(headers) - - @property - @deprecated("Access to headers through this property is deprecated and " - "will be removed in the future. Use '.hdr' instead.") - def header(self): - return [self.phu] + [ndd.meta['header'] for ndd in self._nddata] - - @property - def tags(self): - """A set of strings that represent the tags defining this instance.""" - return self._process_tags() - - @property - def descriptors(self): - """ - Returns a sequence of names for the methods that have been - decorated as descriptors. - - Returns - -------- - tuple of str - """ - members = inspect.getmembers(self.__class__, - lambda x: hasattr(x, 'descriptor_method')) - return tuple(mname for (mname, method) in members) - - @property - def id(self): - """Returns the extension identifier (1-based extension number) - for sliced objects. - """ - if self.is_single: - return self._indices[0] + 1 - else: - raise ValueError("Cannot return id for an AstroData object " - "that is not a single slice") - - @property - def indices(self): - """Returns the extensions indices for sliced objects.""" - return self._indices if self._indices else list(range(len(self))) - - @property - def is_sliced(self): - """ - If this data provider instance represents the whole dataset, return - False. If it represents a slice out of the whole, return True. - """ - return self._indices is not None - - def is_settable(self, attr): - """Return True if the attribute is meant to be modified.""" - if self.is_sliced and attr in {'path', 'filename'}: - return False - return attr in self._fixed_settable or attr.isupper() - - @property - def _nddata(self): - """Return the list of `astrodata.NDAstroData` objects. Contrary to - ``self.nddata`` this always returns a list. - """ - if self._indices is not None: - return [self._all_nddatas[i] for i in self._indices] - else: - return self._all_nddatas - - @property - def nddata(self): - """Return the list of `astrodata.NDAstroData` objects. - - If the `AstroData` object is sliced, this returns only the NDData - objects of the sliced extensions. And if this is a single extension - object, the NDData object is returned directly (i.e. not a list). - - """ - return self._nddata[0] if self.is_single else self._nddata - - def table(self): - # FIXME: do we need this in addition to .tables ? - return self._tables.copy() - - @property - def tables(self): - """Return the names of the `astropy.table.Table` objects associated to - the top-level object. - """ - return set(self._tables) - - @property - def ext_tables(self): - """Return the names of the `astropy.table.Table` objects associated to - an extension. - """ - if not self.is_single: - raise AttributeError('this is only available for extensions') - return set(key for key, obj in self.nddata.meta['other'].items() - if isinstance(obj, Table)) - - @property - @returns_list - def shape(self): - return [nd.shape for nd in self._nddata] - - @property - @returns_list - def data(self): - """ - A list of the arrays (or single array, if this is a single slice) - corresponding to the science data attached to each extension. - """ - return [nd.data for nd in self._nddata] - - @data.setter - @assign_only_single_slice - def data(self, value): - # Setting the ._data in the NDData is a bit kludgy, but we're all - # grown adults and know what we're doing, isn't it? - if hasattr(value, 'shape'): - self.nddata._data = value - else: - raise AttributeError("Trying to assign data to be something " - "with no shape") - - @property - @returns_list - def uncertainty(self): - """ - A list of the uncertainty objects (or a single object, if this is - a single slice) attached to the science data, for each extension. - - The objects are instances of AstroPy's `astropy.nddata.NDUncertainty`, - or `None` where no information is available. - - See also - -------- - variance : The actual array supporting the uncertainty object. - - """ - return [nd.uncertainty for nd in self._nddata] - - @uncertainty.setter - @assign_only_single_slice - def uncertainty(self, value): - self.nddata.uncertainty = value - - @property - @returns_list - def mask(self): - """ - A list of the mask arrays (or a single array, if this is a single - slice) attached to the science data, for each extension. - - For objects that miss a mask, `None` will be provided instead. - """ - return [nd.mask for nd in self._nddata] - - @mask.setter - @assign_only_single_slice - def mask(self, value): - self.nddata.mask = value - - @property - @returns_list - def variance(self): - """ - A list of the variance arrays (or a single array, if this is a single - slice) attached to the science data, for each extension. - - For objects that miss uncertainty information, `None` will be provided - instead. - - See also - --------- - uncertainty : The uncertainty objects used under the hood. - - """ - return [nd.variance for nd in self._nddata] - - @variance.setter - @assign_only_single_slice - def variance(self, value): - if value is None: - self.nddata.uncertainty = None - else: - self.nddata.uncertainty = ADVarianceUncertainty(value) - - @property - def wcs(self): - """Returns the list of WCS objects for each extension.""" - if self.is_single: - return self.nddata.wcs - else: - raise ValueError("Cannot return WCS for an AstroData object " - "that is not a single slice") - - @wcs.setter - @assign_only_single_slice - def wcs(self, value): - self.nddata.wcs = value - - def __iter__(self): - if self.is_single: - yield self - else: - for n in range(len(self)): - yield self[n] - - def __getitem__(self, idx): - """ - Returns a sliced view of the instance. It supports the standard - Python indexing syntax. - - Parameters - ---------- - slice : int, `slice` - An integer or an instance of a Python standard `slice` object - - Raises - ------- - TypeError - If trying to slice an object when it doesn't make sense (e.g. - slicing a single slice) - ValueError - If `slice` does not belong to one of the recognized types - IndexError - If an index is out of range - - """ - if self.is_single: - raise TypeError("Can't slice a single slice!") - - indices, multiple = normalize_indices(idx, nitems=len(self)) - if self._indices: - indices = [self._indices[i] for i in indices] - - is_single = not isinstance(idx, (tuple, slice)) - obj = self.__class__(self._all_nddatas, - tables=self._tables, - phu=self.phu, - indices=indices, - is_single=is_single) - obj._path = self.path - obj._orig_filename = self.orig_filename - return obj - - def __delitem__(self, idx): - """ - Called to implement deletion of ``self[idx]``. Supports standard - Python syntax (including negative indices). - - Parameters - ---------- - idx : int - This index represents the order of the element that you want - to remove. - - Raises - ------- - IndexError - If `idx` is out of range. - - """ - if self.is_sliced: - raise TypeError("Can't remove items from a sliced object") - del self._all_nddatas[idx] - - def __getattr__(self, attribute): - """ - Called when an attribute lookup has not found the attribute in the - usual places (not an instance attribute, and not in the class tree - for ``self``). - - Parameters - ---------- - attribute : str - The attribute's name. - - Raises - ------- - AttributeError - If the attribute could not be found/computed. - - """ - # I we're working with single slices, let's look some things up - # in the ND object - if self.is_single and attribute.isupper(): - with suppress(KeyError): - return self.nddata.meta['other'][attribute] - - if attribute in self._tables: - return self._tables[attribute] - - raise AttributeError(f"{self.__class__.__name__!r} object has no " - f"attribute {attribute!r}") - - def __setattr__(self, attribute, value): - """ - Called when an attribute assignment is attempted, instead of the - normal mechanism. - - Parameters - ---------- - attribute : str - The attribute's name. - value : object - The value to be assigned to the attribute. - - """ - - def _my_attribute(attr): - return attr in self.__dict__ or attr in self.__class__.__dict__ - - if (attribute.isupper() and self.is_settable(attribute) and - not _my_attribute(attribute)): - # This method is meant to let the user set certain attributes of - # the NDData objects. First we check if the attribute belongs to - # this object's dictionary. Otherwise, see if we can pass it down. - # - if self.is_sliced and not self.is_single: - raise TypeError("This attribute can only be " - "assigned to a single-slice object") - - if attribute == DEFAULT_EXTENSION: - raise AttributeError(f"{attribute} extensions should be " - "appended with .append") - elif attribute in {'DQ', 'VAR'}: - raise AttributeError(f"{attribute} should be set on the " - "nddata object") - - add_to = self.nddata if self.is_single else None - self._append(value, name=attribute, add_to=add_to) - return - - super().__setattr__(attribute, value) - - def __delattr__(self, attribute): - """Implements attribute removal.""" - if not attribute.isupper(): - super().__delattr__(attribute) - return - - if self.is_sliced: - if not self.is_single: - raise TypeError("Can't delete attributes on non-single slices") - - other = self.nddata.meta['other'] - if attribute in other: - del other[attribute] - else: - raise AttributeError(f"{self.__class__.__name__!r} sliced " - "object has no attribute {attribute!r}") - else: - if attribute in self._tables: - del self._tables[attribute] - else: - raise AttributeError(f"'{attribute}' is not a global table " - "for this instance") - - def __contains__(self, attribute): - """ - Implements the ability to use the ``in`` operator with an - `AstroData` object. - - Parameters - ---------- - attribute : str - An attribute name. - - Returns - -------- - bool - """ - return attribute in self.exposed - - def __len__(self): - """Return the number of independent extensions stored by the object. - """ - if self._indices is not None: - return len(self._indices) - else: - return len(self._all_nddatas) - - @property - def exposed(self): - """ - A collection of strings with the names of objects that can be accessed - directly by name as attributes of this instance, and that are not part - of its standard interface (i.e. data objects that have been added - dynamically). - - Examples - --------- - >>> ad[0].exposed # doctest: +SKIP - set(['OBJMASK', 'OBJCAT']) - - """ - exposed = set(self._tables) - if self.is_single: - exposed |= set(self.nddata.meta['other']) - return exposed - - def _pixel_info(self): - for idx, nd in enumerate(self._nddata): - other_objects = [] - uncer = nd.uncertainty - fixed = (('variance', None if uncer is None else uncer), - ('mask', nd.mask)) - for name, other in fixed + tuple(sorted(nd.meta['other'].items())): - if other is None: - continue - if isinstance(other, Table): - other_objects.append(dict( - attr=name, - type='Table', - dim=str((len(other), len(other.columns))), - data_type='n/a' - )) - else: - dim = '' - if hasattr(other, 'dtype'): - dt = other.dtype.name - dim = str(other.shape) - elif hasattr(other, 'data'): - dt = other.data.dtype.name - dim = str(other.data.shape) - elif hasattr(other, 'array'): - dt = other.array.dtype.name - dim = str(other.array.shape) - else: - dt = 'unknown' - other_objects.append(dict( - attr=name, - type=type(other).__name__, - dim=dim, - data_type=dt - )) - - yield dict( - idx='[{:2}]'.format(idx), - main=dict( - content='science', - type=type(nd).__name__, - dim=str(nd.data.shape), - data_type=nd.data.dtype.name - ), - other=other_objects - ) - - def info(self): - """Prints out information about the contents of this instance.""" - - print("Filename: {}".format(self.path if self.path else "Unknown")) - # This is fixed. We don't support opening for update - # print("Mode: readonly") - - text = 'Tags: ' + ' '.join(sorted(self.tags)) - textwrapper = textwrap.TextWrapper(width=80, subsequent_indent=' ') - for line in textwrapper.wrap(text): - print(line) - - if len(self) > 0: - main_fmt = "{:6} {:24} {:17} {:14} {}" - other_fmt = " .{:20} {:17} {:14} {}" - print("\nPixels Extensions") - print(main_fmt.format("Index", "Content", "Type", "Dimensions", - "Format")) - for pi in self._pixel_info(): - main_obj = pi['main'] - print(main_fmt.format( - pi['idx'], main_obj['content'][:24], main_obj['type'][:17], - main_obj['dim'], main_obj['data_type'])) - for other in pi['other']: - print(other_fmt.format( - other['attr'][:20], other['type'][:17], other['dim'], - other['data_type'])) - - # NOTE: This covers tables, only. Study other cases before - # implementing a more general solution - if self._tables: - print("\nOther Extensions") - print(" Type Dimensions") - for name, table in sorted(self._tables.items()): - if type(table) is list: - # This is not a free floating table - continue - print(".{:13} {:11} {}".format( - name[:13], 'Table', (len(table), len(table.columns)))) - - def _oper(self, operator, operand): - ind = self.indices - ndd = self._all_nddatas - if isinstance(operand, AstroData): - if len(operand) != len(self): - raise ValueError("Operands are not the same size") - for n in range(len(self)): - try: - data = (operand.nddata if operand.is_single - else operand.nddata[n]) - ndd[ind[n]] = operator(ndd[ind[n]], data) - except TypeError: - # This may happen if operand is a sliced, single - # AstroData object - ndd[ind[n]] = operator(ndd[ind[n]], operand.nddata) - op_table = operand.table() - ltab, rtab = set(self._tables), set(op_table) - for tab in (rtab - ltab): - self._tables[tab] = op_table[tab] - else: - for n in range(len(self)): - ndd[ind[n]] = operator(ndd[ind[n]], operand) - - def _standard_nddata_op(self, fn, operand): - return self._oper(partial(fn, handle_mask=np.bitwise_or, - handle_meta='first_found'), operand) - - @format_doc(_arit_doc, name='addition', op='+') - def __add__(self, oper): - copy = deepcopy(self) - copy += oper - return copy - - @format_doc(_arit_doc, name='subtraction', op='-') - def __sub__(self, oper): - copy = deepcopy(self) - copy -= oper - return copy - - @format_doc(_arit_doc, name='multiplication', op='*') - def __mul__(self, oper): - copy = deepcopy(self) - copy *= oper - return copy - - @format_doc(_arit_doc, name='division', op='/') - def __truediv__(self, oper): - copy = deepcopy(self) - copy /= oper - return copy - - @format_doc(_arit_doc, name='inplace addition', op='+=') - def __iadd__(self, oper): - self._standard_nddata_op(NDDataObject.add, oper) - return self - - @format_doc(_arit_doc, name='inplace subtraction', op='-=') - def __isub__(self, oper): - self._standard_nddata_op(NDDataObject.subtract, oper) - return self - - @format_doc(_arit_doc, name='inplace multiplication', op='*=') - def __imul__(self, oper): - self._standard_nddata_op(NDDataObject.multiply, oper) - return self - - @format_doc(_arit_doc, name='inplace division', op='/=') - def __itruediv__(self, oper): - self._standard_nddata_op(NDDataObject.divide, oper) - return self - - add = __iadd__ - subtract = __isub__ - multiply = __imul__ - divide = __itruediv__ - - __radd__ = __add__ - __rmul__ = __mul__ - - def __rsub__(self, oper): - copy = (deepcopy(self) - oper) * -1 - return copy - - def _rdiv(self, ndd, operand): - # Divide method works with the operand first - return NDDataObject.divide(operand, ndd) - - def __rtruediv__(self, oper): - obj = deepcopy(self) - obj._oper(obj._rdiv, oper) - return obj - - def _process_pixel_plane(self, pixim, name=None, top_level=False, - custom_header=None): - # Assume that we get an ImageHDU or something that can be - # turned into one - if isinstance(pixim, fits.ImageHDU): - nd = NDDataObject(pixim.data, meta={'header': pixim.header}) - elif isinstance(pixim, NDDataObject): - nd = pixim - else: - nd = NDDataObject(pixim) - - if custom_header is not None: - nd.meta['header'] = custom_header - - header = nd.meta.setdefault('header', fits.Header()) - currname = header.get('EXTNAME') - - if currname is None: - header['EXTNAME'] = name if name is not None else DEFAULT_EXTENSION - - if top_level: - nd.meta.setdefault('other', OrderedDict()) - - return nd - - def _append_array(self, data, name=None, header=None, add_to=None): - if name in {'DQ', 'VAR'}: - raise ValueError(f"'{name}' need to be associated to a " - f"'{DEFAULT_EXTENSION}' one") - - if add_to is None: - # Top level extension - if name is not None: - hname = name - elif header is not None: - hname = header.get('EXTNAME', DEFAULT_EXTENSION) - else: - hname = DEFAULT_EXTENSION - - hdu = fits.ImageHDU(data, header=header) - hdu.header['EXTNAME'] = hname - ret = self._append_imagehdu(hdu, name=hname, header=None, - add_to=None) - else: - ret = add_to.meta['other'][name] = data - - return ret - - def _append_imagehdu(self, hdu, name, header, add_to): - if name in {'DQ', 'VAR'} or add_to is not None: - return self._append_array(hdu.data, name=name, add_to=add_to) - else: - nd = self._process_pixel_plane(hdu, name=name, top_level=True, - custom_header=header) - return self._append_nddata(nd, name, add_to=None) - - def _append_raw_nddata(self, raw_nddata, name, header, add_to): - # We want to make sure that the instance we add is whatever we specify - # as NDDataObject, instead of the random one that the user may pass - top_level = add_to is None - if not isinstance(raw_nddata, NDDataObject): - raw_nddata = NDDataObject(raw_nddata) - processed_nddata = self._process_pixel_plane(raw_nddata, - top_level=top_level, - custom_header=header) - return self._append_nddata(processed_nddata, name=name, add_to=add_to) - - def _append_nddata(self, new_nddata, name, add_to): - # NOTE: This method is only used by others that have constructed NDData - # according to our internal format. We don't accept new headers at this - # point, and that's why it's missing from the signature. 'name' is - # ignored. It's there just to comply with the _append_XXX signature. - if add_to is not None: - raise TypeError("You can only append NDData derived instances " - "at the top level") - - hd = new_nddata.meta['header'] - hname = hd.get('EXTNAME', DEFAULT_EXTENSION) - if hname == DEFAULT_EXTENSION: - self._all_nddatas.append(new_nddata) - else: - raise ValueError("Arbitrary image extensions can only be added " - f"in association to a '{DEFAULT_EXTENSION}'") - - return new_nddata - - def _append_table(self, new_table, name, header, add_to): - tb = _process_table(new_table, name, header) - hname = tb.meta['header'].get('EXTNAME') - - def find_next_num(tables): - table_num = 1 - while f'TABLE{table_num}' in tables: - table_num += 1 - return f'TABLE{table_num}' - - if add_to is None: - # Find table names for all extensions - ext_tables = set() - for nd in self._nddata: - ext_tables |= set(key for key, obj in nd.meta['other'].items() - if isinstance(obj, Table)) - - if hname is None: - hname = find_next_num(set(self._tables) | ext_tables) - elif hname in ext_tables: - raise ValueError(f"Cannot append table '{hname}' because it " - "would hide an extension table") - - self._tables[hname] = tb - else: - if hname in self._tables: - raise ValueError(f"Cannot append table '{hname}' because it " - "would hide a top-level table") - - add_to.meta['other'][hname] = tb - return tb - - def _append_astrodata(self, ad, name, header, add_to): - if not ad.is_single: - raise ValueError("Cannot append AstroData instances that are " - "not single slices") - elif add_to is not None: - raise ValueError("Cannot append an AstroData slice to " - "another slice") - - new_nddata = deepcopy(ad.nddata) - if header is not None: - new_nddata.meta['header'] = deepcopy(header) - - return self._append_nddata(new_nddata, name=None, add_to=None) - - def _append(self, ext, name=None, header=None, add_to=None): - """ - Internal method to dispatch to the type specific methods. This is - called either by ``.append`` to append on top-level objects only or - by ``__setattr__``. In the second case ``name`` cannot be None, so - this is always the case when appending to extensions (add_to != None). - """ - dispatcher = ( - (NDData, self._append_raw_nddata), - ((Table, fits.TableHDU, fits.BinTableHDU), self._append_table), - (fits.ImageHDU, self._append_imagehdu), - (AstroData, self._append_astrodata), - ) - - for bases, method in dispatcher: - if isinstance(ext, bases): - return method(ext, name=name, header=header, add_to=add_to) - - # Assume that this is an array for a pixel plane - return self._append_array(ext, name=name, header=header, add_to=add_to) - - def append(self, ext, name=None, header=None): - """ - Adds a new top-level extension. - - Parameters - ---------- - ext : array, `astropy.nddata.NDData`, `astropy.table.Table`, other - The contents for the new extension. The exact accepted types depend - on the class implementing this interface. Implementations specific - to certain data formats may accept specialized types (eg. a FITS - provider will accept an `astropy.io.fits.ImageHDU` and extract the - array out of it). - name : str, optional - A name that may be used to access the new object, as an attribute - of the provider. The name is typically ignored for top-level - (global) objects, and required for the others. If the name cannot - be derived from the metadata associated to ``ext``, you will - have to provider one. - It can consist in a combination of numbers and letters, with the - restriction that the letters have to be all capital, and the first - character cannot be a number ("[A-Z][A-Z0-9]*"). - - Returns - -------- - The same object, or a new one, if it was necessary to convert it to - a more suitable format for internal use. - - Raises - ------- - TypeError - If adding the object in an invalid situation (eg. ``name`` is - `None` when adding to a single slice). - ValueError - Raised if the extension is of a proper type, but its value is - illegal somehow. - - """ - if self.is_sliced: - raise TypeError("Can't append objects to slices, use " - "'ext.NAME = obj' instead") - - # NOTE: Most probably, if we want to copy the input argument, we - # should do it here... - if isinstance(ext, fits.PrimaryHDU): - raise ValueError("Only one Primary HDU allowed. " - "Use .phu if you really need to set one") - elif isinstance(ext, Table): - raise ValueError("Tables should be set directly as attribute, " - "i.e. 'ad.MYTABLE = table'") - - if name is not None and not name.isupper(): - warnings.warn(f"extension name '{name}' should be uppercase", - UserWarning) - name = name.upper() - - return self._append(ext, name=name, header=header) - - @classmethod - def read(cls, source, extname_parser=None): - """Read from a file, file object, HDUList, etc.""" - return read_fits(cls, source, extname_parser=extname_parser) - - load = read # for backward compatibility - - def write(self, filename=None, overwrite=False): - """ - Write the object to disk. - - Parameters - ---------- - filename : str, optional - If the filename is not given, ``self.path`` is used. - overwrite : bool - If True, overwrites existing file. - - """ - if filename is None: - if self.path is None: - raise ValueError("A filename needs to be specified") - filename = self.path - - write_fits(self, filename, overwrite=overwrite) - - def operate(self, operator, *args, **kwargs): - """ - Applies a function to the main data array on each extension, replacing - the data with the result. The data will be passed as the first argument - to the function. - - It will be applied to the mask and variance of each extension, too, if - they exist. - - This is a convenience method, which is equivalent to:: - - for ext in ad: - ext.data = operator(ext.data, *args, **kwargs) - if ext.mask is not None: - ext.mask = operator(ext.mask, *args, **kwargs) - if ext.variance is not None: - ext.variance = operator(ext.variance, *args, **kwargs) - - with the additional advantage that it will work on single slices, too. - - Parameters - ---------- - operator : callable - A function that takes an array (and, maybe, other arguments) - and returns an array. - args, kwargs : optional - Additional arguments to be passed to the ``operator``. - - Examples - --------- - >>> import numpy as np - >>> ad.operate(np.squeeze) # doctest: +SKIP - - """ - # Ensure we can iterate, even on a single slice - for ext in [self] if self.is_single else self: - ext.data = operator(ext.data, *args, **kwargs) - if ext.mask is not None: - ext.mask = operator(ext.mask, *args, **kwargs) - if ext.variance is not None: - ext.variance = operator(ext.variance, *args, **kwargs) - - def reset(self, data, mask=NO_DEFAULT, variance=NO_DEFAULT, check=True): - """ - Sets the ``.data``, and optionally ``.mask`` and ``.variance`` - attributes of a single-extension AstroData slice. This function will - optionally check whether these attributes have the same shape. - - Parameters - ---------- - data : ndarray - The array to assign to the ``.data`` attribute ("SCI"). - mask : ndarray, optional - The array to assign to the ``.mask`` attribute ("DQ"). - variance: ndarray, optional - The array to assign to the ``.variance`` attribute ("VAR"). - check: bool - If set, then the function will check that the mask and variance - arrays have the same shape as the data array. - - Raises - ------- - TypeError - if an attempt is made to set the .mask or .variance attributes - with something other than an array - ValueError - if the .mask or .variance attributes don't have the same shape as - .data, OR if this is called on an AD instance that isn't a single - extension slice - - """ - if not self.is_single: - raise ValueError("Trying to reset a non-sliced AstroData object") - - # In case data is an NDData object - try: - self.data = data.data - except AttributeError: - self.data = data - # Set mask, with checking if required - try: - if mask.shape != self.data.shape and check: - raise ValueError("Mask shape incompatible with data shape") - except AttributeError: - if mask is None: - self.mask = mask - elif mask == NO_DEFAULT: - if hasattr(data, 'mask'): - self.mask = data.mask - else: - raise TypeError("Attempt to set mask inappropriately") - else: - self.mask = mask - # Set variance, with checking if required - try: - if variance.shape != self.data.shape and check: - raise ValueError("Variance shape incompatible with data shape") - except AttributeError: - if variance is None: - self.uncertainty = None - elif variance == NO_DEFAULT: - if hasattr(data, 'uncertainty'): - self.uncertainty = data.uncertainty - else: - raise TypeError("Attempt to set variance inappropriately") - else: - self.variance = variance - - if hasattr(data, 'wcs'): - self.wcs = data.wcs - - def update_filename(self, prefix=None, suffix=None, strip=False): - """ - Update the "filename" attribute of the AstroData object. - - A prefix and/or suffix can be specified. If ``strip=True``, these will - replace the existing prefix/suffix; if ``strip=False``, they will - simply be prepended/appended. - - The current filename is broken down into its existing prefix, root, - and suffix using the ``ORIGNAME`` phu keyword, if it exists and is - contained within the current filename. Otherwise, the filename is - split at the last underscore and the part before is assigned as the - root and the underscore and part after the suffix. No prefix is - assigned. - - Note that, if ``strip=True``, a prefix or suffix will only be stripped - if '' is specified. - - Parameters - ---------- - prefix: str, optional - New prefix (None => leave alone) - suffix: str, optional - New suffix (None => leave alone) - strip: bool, optional - Strip existing prefixes and suffixes if new ones are given? - - """ - if self.filename is None: - if 'ORIGNAME' in self.phu: - self.filename = self.phu['ORIGNAME'] - else: - raise ValueError("A filename needs to be set before it " - "can be updated") - - # Set the ORIGNAME keyword if it's not there - if 'ORIGNAME' not in self.phu: - self.phu.set('ORIGNAME', self.orig_filename, - 'Original filename prior to processing') - - if strip: - root, filetype = os.path.splitext(self.phu['ORIGNAME']) - filename, filetype = os.path.splitext(self.filename) - m = re.match('(.*){}(.*)'.format(re.escape(root)), filename) - # Do not strip a prefix/suffix unless a new one is provided - if m: - if prefix is None: - prefix = m.groups()[0] - existing_suffix = m.groups()[1] - if '_' in existing_suffix: - last_underscore = existing_suffix.rfind("_") - root += existing_suffix[:last_underscore] - existing_suffix = existing_suffix[last_underscore:] - else: - try: - root, existing_suffix = filename.rsplit("_", 1) - existing_suffix = "_" + existing_suffix - except ValueError: - root, existing_suffix = filename, '' - if suffix is None: - suffix = existing_suffix - else: - root, filetype = os.path.splitext(self.filename) - - # Cope with prefix or suffix as None - self.filename = (prefix or '') + root + (suffix or '') + filetype - - def _crop_nd(self, nd, x1, y1, x2, y2): - nd.data = nd.data[y1:y2+1, x1:x2+1] - if nd.uncertainty is not None: - nd.uncertainty = nd.uncertainty[y1:y2+1, x1:x2+1] - if nd.mask is not None: - nd.mask = nd.mask[y1:y2+1, x1:x2+1] - - def crop(self, x1, y1, x2, y2): - """Crop the NDData objects given indices. - - Parameters - ---------- - x1, y1, x2, y2 : int - Minimum and maximum indices for the x and y axis. - - """ - # TODO: Consider cropping of objects in the meta section - for nd in self._nddata: - orig_shape = nd.data.shape - self._crop_nd(nd, x1, y1, x2, y2) - for o in nd.meta['other'].values(): - try: - if o.shape == orig_shape: - self._crop_nd(o, x1, y1, x2, y2) - except AttributeError: - # No 'shape' attribute in the object. It's probably - # not array-like - pass - - @astro_data_descriptor - def instrument(self): - """Returns the name of the instrument making the observation.""" - return self.phu.get(self._keyword_for('instrument')) - - @astro_data_descriptor - def object(self): - """Returns the name of the object being observed.""" - return self.phu.get(self._keyword_for('object')) - - @astro_data_descriptor - def telescope(self): - """Returns the name of the telescope.""" - return self.phu.get(self._keyword_for('telescope')) diff --git a/astrodata/doc/.readthedocs.yaml b/astrodata/doc/.readthedocs.yaml deleted file mode 100644 index 02f76b790d..0000000000 --- a/astrodata/doc/.readthedocs.yaml +++ /dev/null @@ -1,32 +0,0 @@ -# .readthedocs.yaml -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required -version: 2 - -# Set the version of Python and other tools you might need -build: - os: ubuntu-22.04 - tools: - python: "3.10" - # You can also specify other tool versions: - # nodejs: "19" - # rust: "1.64" - # golang: "1.19" - -# Build documentation in the docs/ directory with Sphinx -sphinx: - configuration: astrodata/doc/conf.py - -# If using Sphinx, optionally build your docs in additional formats such as PDF -# formats: -# - pdf - -# Optionally declare the Python requirements required to build your docs -python: - install: - - requirements: requirements.txt - - requirements: doc/requirements.txt - - method: pip - path: . \ No newline at end of file diff --git a/astrodata/doc/Makefile b/astrodata/doc/Makefile deleted file mode 100644 index 241432216c..0000000000 --- a/astrodata/doc/Makefile +++ /dev/null @@ -1,206 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# User-friendly check for sphinx-build -ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) -$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) -endif - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - @echo " dummy to check syntax errors of document sources" - -.PHONY: clean -clean: - rm -rf $(BUILDDIR)/ api/ - -.PHONY: html -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -.PHONY: dirhtml -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -.PHONY: singlehtml -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -.PHONY: pickle -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -.PHONY: json -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -.PHONY: htmlhelp -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -.PHONY: qthelp -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/AstrodataProgrammersManual.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/AstrodataProgrammersManual.qhc" - -.PHONY: devhelp -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/AstrodataProgrammersManual" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/AstrodataProgrammersManual" - @echo "# devhelp" - -.PHONY: epub -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -.PHONY: latex -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -.PHONY: latexpdf -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: latexpdfja -latexpdfja: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: text -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -.PHONY: man -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -.PHONY: texinfo -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -.PHONY: info -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -.PHONY: gettext -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -.PHONY: changes -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -.PHONY: linkcheck -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -.PHONY: doctest -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -.PHONY: xml -xml: - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." - -.PHONY: pseudoxml -pseudoxml: - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." - -.PHONY: dummy -dummy: - $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy - @echo - @echo "Build finished. Dummy builder generates no files." diff --git a/astrodata/doc/_static/rtd_theme_overrides.css b/astrodata/doc/_static/rtd_theme_overrides.css deleted file mode 100644 index 62910a0bb7..0000000000 --- a/astrodata/doc/_static/rtd_theme_overrides.css +++ /dev/null @@ -1,20 +0,0 @@ -/* override RTD table width restrictions */ - -@media screen and (min-width: 767px) { - - .wy-table-responsive table td, .wy-table-responsive table th { - /* !important prevents the common CSS stylesheets from - overriding this as on RTD the are loaded after this stylesheet */ - white-space: normal !important; - } - - .wy-table-responsive { - /* margin-bottom: 24px; */ - /* max-width: 100%; */ - overflow: visible !important; - } - - .wy-nav-content { - max-width: 1200px !important; - } -} diff --git a/astrodata/doc/_static/rtd_theme_overrides_references.css b/astrodata/doc/_static/rtd_theme_overrides_references.css deleted file mode 100644 index 785c691ebf..0000000000 --- a/astrodata/doc/_static/rtd_theme_overrides_references.css +++ /dev/null @@ -1,16 +0,0 @@ - -/* , a .rst-content tt, a .rst-content code */ - -.rst-content code.xref { - background-color: transparent; - border: solid 1px transparent; - color: #2980B9; - padding: 0px 0px; - font-size: 80%; - } - -.rst-content code.xref:hover { - /* border: solid 1px #e1e4e5; */ - text-decoration: underline; - } - diff --git a/astrodata/doc/_static/todo-styles.css b/astrodata/doc/_static/todo-styles.css deleted file mode 100644 index 09f3659575..0000000000 --- a/astrodata/doc/_static/todo-styles.css +++ /dev/null @@ -1,7 +0,0 @@ -div.admonition-todo { -border-top: 2px solid red; -border-bottom: 2px solid red; -border-left: 2px solid red; -border-right: 2px solid red; -background-color: #ff6347 -} diff --git a/astrodata/doc/api.rst b/astrodata/doc/api.rst deleted file mode 100644 index 66212bf1a8..0000000000 --- a/astrodata/doc/api.rst +++ /dev/null @@ -1,11 +0,0 @@ -.. _api: - -************* -Reference API -************* - -.. toctree:: - :maxdepth: 1 - - api/astrodata - api/gemini_instruments diff --git a/astrodata/doc/appendix_descriptors.rst b/astrodata/doc/appendix_descriptors.rst deleted file mode 100644 index 42917f76ee..0000000000 --- a/astrodata/doc/appendix_descriptors.rst +++ /dev/null @@ -1,248 +0,0 @@ -.. descriptors.rst - -.. _descriptors: - -*********************************** -List of Gemini Standard Descriptors -*********************************** - -To run and re-use Gemini primitives and functions this list of Standard -Descriptors must be defined for input data. This also applies to data -that is to be served by the Gemini Observatory Archive (GOA). - -For any ``AstroData`` objects, to get the list of the descriptors that are -defined use the ``AstroData.descriptors`` attribute:: - - >>> import astrodata - >>> import gemini_instruments - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - - >>> ad.descriptors - ('airmass', 'amp_read_area', 'ao_seeing', ..., 'well_depth_setting') - -To get the values:: - - >>> ad.airmass() - - >>> for descriptor in ad.descriptors: - ... print(descriptor, getattr(ad, descriptor)()) - -Note that not all of the descriptors below are defined for all of the -instruments. For example, ``shuffle_pixels`` is defined only for GMOS data -since only GMOS offers a Nod & Shuffle mode. - - -.. tabularcolumns:: |l|p{3.0in}|l| - - -+--------------------------------+----------------------------------------------------------------+-----------------+ -| **Descriptor** | **Short Definition** | **Python type** | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| | | ad[0].desc() | -| | +-----------------+ -| | | ad.desc() | -+================================+================================================================+=================+ -| airmass | Airmass of the observation. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| amp_read_area | Combination of amplifier name and 1-indexed section relative | str | -| | to the detector. +-----------------+ -| | | list of str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| ao_seeing | Estimate of the natural seeing as calculated from the | float | -| | adaptive optics systems. | | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| array_name | Name assigned to the array generated by a given amplifier, | str | -| | one array per amplifier. +-----------------+ -| | | list of str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| array_section | Section covered by the array(s), in 0-indexed pixels, relative | Section | -| | to the detector frame (e.g. position of multiple amps read +-----------------+ -| | within a CCD). Uses ``namedtuple`` "Section" defined in | list of Section | -| | ``gemini_instruments.common``. | | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| azimuth | Pointing position in azimuth, in degrees. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| calibration_key | Key used in the database that the ``getProcessed*`` primitives | str | -| | use to store previous calibration association information. | | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| camera | Name of the camera. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| cass_rotator_pa | Position angle of the Cassegrain rotator, in degrees. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| central_wavelength | Central wavelength, in meters. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| coadds | Number of co-adds. | int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| data_label | Gemini data label. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| data_section | Section where the sky-exposed data falls, in 0-indexed pixels. | Section | -| | Uses ``namedtuple`` "Section" defined in +-----------------+ -| | ``gemini_instruments.common`` | list of Section | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| dec | Declination of the center of the field, in degrees. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| decker | Name of the decker. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| detector_name | Name assigned to the detector. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| detector_roi_setting | Human readable Region of Interest (ROI) setting | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| detector_rois_requested | Section defining the Regions of Interest, in 0-indexed pixels. | list of Section | -| | Uses ``namedtuple`` "Section" defined in | | -| | ``gemini_instruments.common``. | | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| detector_section | Section covered by the detector(s), in 0-indexed pixels, | list | -| | relative to the whole mosaic of detectors. +-----------------+ -| | Uses ``namedtuple`` "Section" defined in | list of Section | -| | ``gemini_instruments.common``. | | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| detector_x_bin | X-axis binning. | int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| detector_x_offset | Telescope offset along the detector X-axis, in pixels. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| detector_y_bin | Y-axis binning. | int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| detector_y_offset | Telescope offset along the detector Y-axis, in pixels. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| disperser | Name of the disperser. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| dispersion | Value for the dispersion, in meters per pixel. | float | -| | +-----------------+ -| | | list of float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| dispersion_axis | Dispersion axis. | int | -| | +-----------------+ -| | | list of int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| effective_wavelength | Wavelength representing the bandpass or the spectrum coverage. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| elevation | Pointing position in elevation, in degrees. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| exposure_time | Exposure time, in seconds. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| filter_name | Name of the filter combination. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| focal_plane_mask | Name of the mask in the focal plane. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| gain | Gain in electrons per ADU | float | -| | +-----------------+ -| | | list of float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| gain_setting | Human readable gain setting (eg. low, high) | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| gcal_lamp | Returns the name of the GCAL lamp being used, or "Off" if no | str | -| | lamp is in use. | | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| group_id | Gemini observation group ID that identifies compatible data. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| instrument | Name of the instrument | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| is_ao | Whether or not the adaptive optics system was used. | bool | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| is_coadds_summed | Whether co-adds are summed or averaged. | bool | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| local_time | Local time. | datetime | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| lyot_stop | Name of the lyot stop. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| mdf_row_id | Mask Definition File row ID of a cut MOS or XD spectrum. | int ?? | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| nod_count | Number of nods to A and B positions. | tuple of int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| nod_offsets | Nod offsets to A and B positions, in arcseconds | tuple of float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| nominal_atmospheric_extinction | Nomimal atmospheric extinction, from model. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| nominal_photometric_zeropoint | Nominal photometric zeropoint. | float | -| | +-----------------+ -| | | list of float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| non_linear_level | Lower boundary of the non-linear regime. | float | -| | +-----------------+ -| | | list of int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| object | Name of the target (as entered by the user). | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| observation_class | Gemini class name for the observation | str | -| | (eg. 'science', 'acq', 'dayCal'). | | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| observation_epoch | Observation epoch. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| observation_id | Gemini observation ID. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| observation_type | Gemini observation type (eg. 'OBJECT', 'FLAT', 'ARC'). | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| overscan_section | Section where the overscan data falls, in 0-indexed pixels. | Section | -| | Uses namedtuple "Section" defined in +-----------------+ -| | ``gemini_instruments.common``. | list of Section | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| pixel_scale | Pixel scale in arcsec per pixel. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| program_id | Gemini program ID. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| pupil_mask | Name of the pupil mask. | str ?? | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| qa_state | Gemini quality assessment state (eg. pass, usable, fail). | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| ra | Right ascension, in degrees. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| raw_bg | Gemini sky background band. | int ?? | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| raw_cc | Gemini cloud coverage band. | int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| raw_iq | Gemini image quality band. | int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| raw_wv | Gemini water vapor band. | int ?? | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| read_mode | Gemini name for combination for gain setting and read setting. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| read_noise | Read noise in electrons. | float | -| | +-----------------+ -| | | list of float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| read_speed_setting | human readable read mode setting (eg. slow, fast). | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| requested_bg | PI requested Gemini sky background band. | int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| requested_cc | PI requested Gemini cloud coverage band. | int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| requested_iq | PI requested Gemini image quality band. | int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| requested_wv | PI requested Gemini water vapor band. | int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| saturation_level | Saturation level. | int | -| | +-----------------+ -| | | list of int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| shuffle_pixels | Charge shuffle, in pixels. (nod and shuffle mode) | int | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| slit | Name of the slit. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| target_dec | Declination of the target, in degrees. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| target_ra | Right Ascension of the target, in degrees. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| telescope | Name of the telescope. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| telescope_x_offset | Offset along the telescope's x-axis. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| telescope_y_offset | Offset along the telescope's y-axis. | float | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| ut_date | UT date of the observation. | datetime.date | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| ut_datetime | UT date and time of the observation. | datetime | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| ut_time | UT time of the observation. | datetime.time | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| wavefront_sensor | Wavefront sensor used for the observation. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| wavelength_band | Band associated with the filter or the central wavelength. | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| wcs_dec | Declination of the center of field from the WCS keywords. | float | -| | In degrees. | | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| wcs_ra | Right Ascension of the center of field from the WCS keywords. | float | -| | In degrees. | | -+--------------------------------+----------------------------------------------------------------+-----------------+ -| well_depth_setting | Human readable well depth setting (eg. shallow, deep) | str | -+--------------------------------+----------------------------------------------------------------+-----------------+ diff --git a/astrodata/doc/cheatsheet.rst b/astrodata/doc/cheatsheet.rst deleted file mode 100644 index 98c351c159..0000000000 --- a/astrodata/doc/cheatsheet.rst +++ /dev/null @@ -1,463 +0,0 @@ -.. cheatsheet - -.. _cheatsheet: - -*********** -Cheat Sheet -*********** - -.. admonition:: Document ID - - PIPE-USER-105_AstrodataCheatSheet - -A data package is available for download if you wish to run the examples -included in this cheat sheet. Download it at: - - ``_ - -To unpack:: - - $ cd - $ tar xvf ad_usermanual_datapkg-v1.tar - $ bunzip2 ad_usermanual/playdata/*.bz2 - -Then go to the ``ad_usermanual/playground`` directory to run the examples. - -Imports -======= - -Import :mod:`astrodata` and :mod:`gemini_instruments`:: - - >>> import astrodata - >>> import gemini_instruments - -Basic read and write operations -=============================== - -Open a file:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - -Get path and filename:: - - >>> ad.path - '../playdata/N20170609S0154.fits' - >>> ad.filename - 'N20170609S0154.fits' - -Write to a new file:: - - >>> ad.write(filename='new154.fits') - >>> ad.filename - N20170609S0154.fits - -Overwrite the file:: - - >>> adnew = astrodata.open('new154.fits') - >>> adnew.filename - new154.fits - >>> adnew.write(overwrite=True) - -Object structure -================ - -Description ------------ -The |AstroData| object is assigned by "tags" that describe the -type of data it contains. The tags are drawn from rules defined in -|gemini_instruments| and are based on header information. - -When mapping a FITS file, each science pixel extension is loaded as a -|NDAstroData| object. The list is zero-indexed. So FITS -extension 1 becomes element 0 of the |AstroData| object. If a ``VAR`` -extension is present, it is loaded to the variance attribute of the -|NDAstroData|. If a ``DQ`` extension is present, it is loaded to the ``.mask`` -attribute of the |NDAstroData|. ``SCI``, ``VAR`` and ``DQ`` are associated -through the ``EXTVER`` keyword value. - -In the file below, each |AstroData| "extension" contains the pixel data, -then an error plane (``.variance``) and a bad pixel mask plane (``.mask``). -|Table| can be attached to an extension, like OBJCAT, or to the -|AstroData| object globally, like REFCAT. (In this case, OBJCAT is a -catalogue of the sources detected in the image, REFCAT is a reference catalog -for the area covered by the whole file.) If other 2D data needs to be -associated with an extension this can also be done, like here with OBJMASK, -a 2D mask matching the sources in the image. - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - >>> ad.info() - Filename: ../playdata/N20170609S0154_varAdded.fits - Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED - PREPARED SIDEREAL - Pixels Extensions - Index Content Type Dimensions Format - [ 0] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) int16 - .OBJCAT Table (6, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - [ 1] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) int16 - .OBJCAT Table (8, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - [ 2] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) int16 - .OBJCAT Table (7, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - [ 3] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) int16 - .OBJCAT Table (5, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - Other Extensions - Type Dimensions - .REFCAT Table (245, 16) - - - -Modifying the structure ------------------------ - -Let's first get our play data loaded. You are encouraged to do a -:meth:`~astrodata.AstroData.info` before and after each structure-modification -step, to see how things change. - -:: - - >>> from copy import deepcopy - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> adcopy = deepcopy(ad) - >>> advar = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - -Append an extension:: - - >>> adcopy.append(advar[3]) - >>> adcopy.append(advar[3].data) - - -Delete an extension:: - - >>> del adcopy[5] - -Delete and add variance and mask planes:: - - >>> var = adcopy[4].variance - >>> adcopy[4].variance = None - >>> adcopy[4].variance = var - -Attach a table to an extension:: - - >>> adcopy[3].SMAUG = advar[0].OBJCAT.copy() - - -Attach a table to the |AstroData| object:: - - >>> adcopy.DROGON = advar.REFCAT.copy() - -Delete a table:: - - >>> del adcopy[3].SMAUG - >>> del adcopy.DROGON - - - -Astrodata tags -============== - -:: - - >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') - >>> ad.tags - {'GMOS', 'OVERSCAN_SUBTRACTED', 'SIDEREAL', 'NORTH', 'OVERSCAN_TRIMMED', - 'PREPARED', 'IMAGE', 'GEMINI'} - - >>> type(ad.tags) - - - >>> {'IMAGE', 'PREPARED'}.issubset(ad.tags) - True - >>> 'PREPARED' in ad.tags - True - - -Headers -======= - -The use of descriptors is favored over direct header access when retrieving -values already represented by descriptors, and when writing instrument agnostic -routines. - -Descriptors ------------ - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> ad.filter_name() - 'open1-6&g_G0301' - >>> ad.filter_name(pretty=True) - 'g' - >>> ad.gain() # uses a look-up table to get the correct values - [2.03, 1.97, 1.96, 2.01] - >>> ad.hdr['GAIN'] - [1.0, 1.0, 1.0, 1.0] # the wrong values contained in the raw data. - >>> ad[0].gain() - 2.03 - >>> ad.gain()[0] - 2.03 - - >>> ad.descriptors - ('airmass', 'amp_read_area', 'ao_seeing', ... - ...) - - -Direct access to header keywords --------------------------------- - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - -Primary Header Unit -******************* - -To see a print out of the full PHU: - - >>> ad.phu - -Get value from PHU:: - - >>> ad.phu['EXPTIME'] - 1.0 - - >>> default = 5. - >>> ad.phu.get('BOGUSKEY', default) - 5.0 - -Set PHU keyword, with and without comment:: - - >>> ad.phu['NEWKEY'] = 50. - >>> ad.phu['ANOTHER'] = (30., 'Some comment') - -Delete PHU keyword:: - - >>> del ad.phu['NEWKEY'] - - - -Pixel extension header -********************** -To see a print out of the full header for an extension or all the extensions: - - >>> ad[0].hdr - >>> list(ad.hdr) - -Get value from an extension header:: - - >>> ad[0].hdr['OVERSCAN'] - 469.7444308769482 - >>> ad[0].hdr.get('OVERSCAN', default) - -Get keyword value for all extensions:: - - >>> ad.hdr['OVERSCAN'] - [469.7444308769482, 469.656175780001, 464.9815279808291, 467.5701178951787] - >>> ad.hdr.get('BOGUSKEY', 5.) - [5.0, 5.0, 5.0, 5.0] - -Set extension header keyword, with and without comment:: - - >>> ad[0].hdr['NEWKEY'] = 50. - >>> ad[0].hdr['ANOTHER'] = (30., 'Some comment') - -Delete an extension keyword:: - - >>> del ad[0].hdr['NEWKEY'] - -Table header -************ -See the :ref:`cheatsheet_tables` section. - - -Pixel data -========== - -Arithmetics ------------ -Arithmetics with variance and mask propagation is offered for -``+``, ``-``, ``*``, ``/``, and ``**``. - -:: - - >>> ad_hcont = astrodata.open('../playdata/N20170521S0925_forStack.fits') - >>> ad_halpha = astrodata.open('../playdata/N20170521S0926_forStack.fits') - - >>> adsub = ad_halpha - ad_hcont - - >>> ad_halpha[0].data.mean() - 646.11896 - >>> ad_hcont[0].data.mean() - 581.81342 - >>> adsub[0].data.mean() - 64.305862 - - >>> ad_halpha[0].variance.mean() - 669.80664 - >>> ad_hcont[0].variance.mean() - 598.46667 - >>> adsub[0].variance.mean() - 1268.274 - - - # In place multiplication - >>> ad_mult = deepcopy(ad) - >>> ad_mult.multiply(ad) - >>> ad_mult.multiply(5.) - - - # Using descriptors to operate in-place on extensions. - >>> from copy import deepcopy - >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - >>> ad_gain = deepcopy(ad) - >>> for (ext, gain) in zip(ad_gain, ad_gain.gain()): - ... ext.multiply(gain) - >>> ad_gain[0].data.mean() - 366.39545 - >>> ad[0].data.mean() - 180.4904 - >>> ad[0].gain() - 2.03 - - -Other pixel data operations ---------------------------- - -:: - - >>> import numpy as np - >>> ad_halpha[0].mask[300:350,300:350] = 1 - >>> np.mean(ad_halpha[0].data[ad_halpha[0].mask==0]) - 657.1994 - >>> np.mean(ad_halpha[0].data) - 646.11896 - - -.. _cheatsheet_tables: - -Tables -====== - -Tables are stored as :class:`astropy.table.Table` class. FITS tables are -represented in :mod:`astrodata` as |Table| and FITS headers are stored in the -|NDAstroData| ``meta`` attribute. Most table -access should be done through the |Table| interface. The best reference is the -|astropy| documentation itself. Below are just a few examples. - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - -Get column names:: - - >>> ad.REFCAT.colnames - -Get column content:: - - >>> ad.REFCAT['zmag'] - >>> ad.REFCAT['zmag', 'zmag_err'] - -Get content of row:: - - >>> ad.REFCAT[4] # 5th row - >>> ad.REFCAT[4:6] # 5th and 6th rows - - -Get content from specific row and column:: - - >>> ad.REFCAT['zmag'][4] - -Add a column:: - - >>> new_column = [0] * len(ad.REFCAT) - >>> ad.REFCAT['new_column'] = new_column - -Add a row:: - - >>> new_row = [0] * len(ad.REFCAT.colnames) - >>> new_row[1] = '' # Cat_Id column is of "str" type. - >>> ad.REFCAT.add_row(new_row) - -Selecting value from criterion:: - - >>> ad.REFCAT['zmag'][ad.REFCAT['Cat_Id'] == '1237662500002005475'] - >>> ad.REFCAT['zmag'][ad.REFCAT['zmag'] < 18.] - -Rejecting :class:`numpy.nan` before doing something with the values:: - - >>> t = ad.REFCAT # to save typing. - >>> t['zmag'][np.where(np.isnan(t['zmag']), 99, t['zmag']) < 18.] - - >>> t['zmag'].mean() - nan - >>> t['zmag'][np.where(~np.isnan(t['zmag']))].mean() - 20.377306 - -If for some reason you need to access the FITS table headers, here is how to do it. - -To see the FITS headers:: - - >>> ad.REFCAT.meta - >>> ad[0].OBJCAT.meta - -To retrieve a specific FITS table header:: - - >>> ad.REFCAT.meta['header']['TTYPE3'] - 'RAJ2000' - >>> ad[0].OBJCAT.meta['header']['TTYPE3'] - 'Y_IMAGE' - -To retrieve all the keyword names matching a selection:: - - >>> keynames = [key for key in ad.REFCAT.meta['header'] if key.startswith('TTYPE')] - - -Create new AstroData object -=========================== - -Basic header and data array set to zeros:: - - >>> from astropy.io import fits - - >>> phu = fits.PrimaryHDU() - >>> pixel_data = np.zeros((100,100)) - - >>> hdu = fits.ImageHDU() - >>> hdu.data = pixel_data - >>> ad = astrodata.create(phu) - >>> ad.append(hdu, name='SCI') - -or another way:: - - >>> hdu = fits.ImageHDU(data=pixel_data, name='SCI') - >>> ad = astrodata.create(phu, [hdu]) - -A |Table| as an |AstroData| object:: - - >>> from astropy.table import Table - - >>> my_astropy_table = Table(list(np.random.rand(2,100)), names=['col1', 'col2']) - >>> phu = fits.PrimaryHDU() - - >>> ad = astrodata.create(phu) - >>> ad.SMAUG = my_astropy_table - - >>> phu = fits.PrimaryHDU() - >>> ad = astrodata.create(phu) - >>> ad.SMAUG = my_fits_table - -WARNING: This last line will not run like the others as we have not defined -``my_fits_table``. This is nonetheless how it is done if you had a FITS table. diff --git a/astrodata/doc/conf.py b/astrodata/doc/conf.py deleted file mode 100644 index cb3999fee2..0000000000 --- a/astrodata/doc/conf.py +++ /dev/null @@ -1,465 +0,0 @@ -# Astrodata build configuration file - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys -# sys.path.insert(0, os.path.abspath('.')) -sys.path.insert(0, os.path.abspath('../')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.coverage', - 'sphinx.ext.doctest', - 'sphinx.ext.graphviz', - 'sphinx.ext.ifconfig', - 'sphinx.ext.imgmath', - 'sphinx.ext.intersphinx', - 'sphinx.ext.napoleon', - 'sphinx.ext.todo', - 'sphinx.ext.viewcode', -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The encoding of source files. -# -# source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = 'Astrodata Manual' -copyright = '2025, Association of Universities for Research in Astronomy' -author = 'DRAGONS Team' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '4.0-dev' -# The full version, including alpha/beta/rc tags. -#release = '3.2.x' -#rtdurl = 'release-'+release -#release = '3.2.2' -#rtdurl = 'v'+release -rtdurl = 'latest' - - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = "en" - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -# -today = 'January 2025' -# -# Else, today_fmt is used as the format for a strftime call. -# -# today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -default_role = 'obj' - -# If true, '()' will be appended to :func: etc. cross-reference text. -# -# add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -# -# add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -# -# show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -# modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -# keep_warnings = False - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = { - 'astropy': ('https://docs.astropy.org/en/stable/', None), - #'gemini_instruments': ('https://dragons-recipe-system-programmers-manual.readthedocs.io/en/latest/', None), - #'geminidr': ('https://dragons-recipe-system-programmers-manual.readthedocs.io/en/latest/', None), - 'matplotlib': ('https://matplotlib.org/', None), - 'numpy': ('https://numpy.org/doc/stable/', None), - 'python': ('https://docs.python.org/3', None), -} - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -# html_theme_path = [] - -# The name for this set of Sphinx documents. -# " v documentation" by default. -# -# html_title = '' - -# A shorter title for the navigation bar. Default is the same as html_title. -# -# html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -# -# html_logo = None - -# The name of an image file (relative to this directory) to use as a favicon of -# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -# -# html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -# -# html_extra_path = [] - -# If not None, a 'Last updated on:' timestamp is inserted at every page -# bottom, using the given strftime format. -# The empty string is equivalent to '%b %d, %Y'. -# -# html_last_updated_fmt = None - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -# -# html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -# -# html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -# -# html_additional_pages = {} - -# If false, no module index is generated. -# -# html_domain_indices = True - -# If false, no index is generated. -# -# html_use_index = True - -# If true, the index is split into individual pages for each letter. -# -# html_split_index = False - -# If true, links to the reST sources are added to the pages. -# -# html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -# -# html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -# -# html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -# -# html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -# html_file_suffix = None - -# Language to be used for generating the HTML full-text search index. -# Sphinx supports the following languages: -# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' -# -# html_search_language = 'en' - -# A dictionary with options for the search language support, empty by default. -# 'ja' uses this config value. -# 'zh' user can custom change `jieba` dictionary path. -# -# html_search_options = {'type': 'default'} - -# The name of a javascript file (relative to the configuration directory) that -# implements a search results scorer. If empty, the default will be used. -# -# html_search_scorer = 'scorer.js' - -# Output file base name for HTML help builder. -htmlhelp_basename = 'AstrodataManual' - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # This will remove blank pages. - 'classoptions': ',openany,oneside', - 'babel': '\\usepackage[english]{babel}', - - # The paper size ('letterpaper' or 'a4paper'). - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # 'preamble': '', - 'preamble': '\\usepackage{appendix} \\setcounter{tocdepth}{0}', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ('index', 'AstrodataManual.tex', 'Astrodata Manual', - 'DRAGONS Team', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -# -latex_logo = 'images/GeminiLogo_new_2014.jpg' - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -# -# latex_use_parts = False - -# If true, show page references after internal links. -# -# latex_show_pagerefs = False - -# If true, show URL addresses after external links. -# -# latex_show_urls = False - -# Documents to append as an appendix to all manuals. -# -# latex_appendices = [] - -# It false, will not define \strong, \code, itleref, \crossref ... but only -# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added -# packages. -# -# latex_keep_old_macro_names = True - -# If false, no module index is generated. -# -# latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'astrodatamanual', 'Astrodata Manual', - ['DRAGONS Team'], 1) -] - -# If true, show URL addresses after external links. -# -# man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'AstrodataManual', 'Astrodata Manual', - 'DRAGONS Team', 'AstrodataManual', - 'Manual for the astrodata package', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -# -# texinfo_appendices = [] - -# If false, no module index is generated. -# -# texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -# -# texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -# -# texinfo_no_detailmenu = False - - -# -- Automatically generate API documentation -------------------------------- -# -- Enable autoapi ---------------------------------------------------------- - - -def run_api_doc(_): - """ - Automatic API generator - - This method is used to generate API automatically by importing all the - modules and sub-modules inside a package. - - It is equivalent to run: - >>> sphinx-apidoc --force --no-toc --separate --module --output-dir api/ ../../ ../../cal_service - - It is useful because it creates .rst files on the file. - - NOTE - ---- - This does not work with PyCharm default build. If you want to trigger - this function, use the standard `$ make html` in the command line. - The .rst files will be generated. After that, you can use PyCharm's - build helper. - """ - build_packages = [ - 'astrodata', - 'gemini_instruments' - ] - - current_path = os.path.abspath(os.path.dirname(__file__)) - root_path = os.path.abspath(os.path.join(current_path, '..', '..')) - - print(("Current Path:", current_path)) - - for p in build_packages: - - build_path = os.path.join(root_path, p) - - ignore_paths = ['doc', 'test*', '**/test*'] - ignore_paths = [os.path.join(build_path, i, '*') for i in ignore_paths] - - argv = [ - # "--force", - "--no-toc", - # "--separate", - "--module", - "--output-dir", "api/", - build_path - ] + ignore_paths - - sys.path.insert(0, root_path) - - try: - # Sphinx 1.7+ - from sphinx.ext import apidoc - apidoc.main(argv) - - except ImportError: - # Sphinx 1.6 (and earlier) - from sphinx import apidoc - argv.insert(0, apidoc.__file__) - apidoc.main(argv) - - -# -- Finishing with a setup that will run always ----------------------------- -def setup(app): - - # Adding style in order to have the todos show up in a red box. - app.add_css_file('todo-styles.css') - app.add_css_file('rtd_theme_overrides.css') - app.add_css_file('rtd_theme_overrides_references.css') - - # Automatic API generation - app.connect('builder-inited', run_api_doc) - -# This is added to the end of RST files - a good place to put substitutions to -# be used globally. -rst_epilog = """ -.. _`Anaconda`: https://www.anaconda.com/ -.. _`Astropy`: http://docs.astropy.org/en/stable/ -.. _`Conda`: https://conda.io/docs/ -.. _`Numpy`: https://numpy.org/doc/stable/ -.. |numpy| replace:: `Numpy`_ -.. |astropy| replace:: `Astropy`_ - -.. |AstroData| replace:: :class:`~astrodata.AstroData` -.. |astrodata| replace:: :mod:`~astrodata` -.. |geminidr| replace:: :mod:`~geminidr` -.. |gemini_instruments| replace:: :mod:`gemini_instruments` -.. |gemini| replace:: ``gemini`` -.. |Mapper| replace:: :class:`~recipe_system.mappers.baseMapper.Mapper` -.. |mappers| replace:: :mod:`recipe_system.mappers` -.. |NDAstroData| replace:: :class:`~astrodata.nddata.NDAstroData` -.. |NDData| replace:: :class:`~astropy.nddata.NDData` -.. |PrimitiveMapper| replace:: :class:`~recipe_system.mappers.primitiveMapper.PrimitiveMapper` -.. |RecipeMapper| replace:: :class:`~recipe_system.mappers.recipeMapper.RecipeMapper` -.. |recipe_system| replace:: :mod:`recipe_system` -.. |Reduce| replace:: :class:`~recipe_system.reduction.coreReduce.Reduce` -.. |reduce| replace:: ``reduce`` -.. |Table| replace:: :class:`~astropy.table.Table` -.. |TagSet| replace:: :class:`~astrodata.TagSet` - -.. role:: raw-html(raw) - :format: html - -.. |DRAGONS| replace:: :raw-html:`DRAGONS` -.. |RSProgManual| replace:: :raw-html:`Recipe System Programmer Manual` -.. |RSUserManual| replace:: :raw-html:`Recipe System User Manual` - -.. |RSUserInstall| replace:: :raw-html:`Installation Guide` - - -""".format(v = rtdurl) - diff --git a/astrodata/doc/images/GeminiLogo_new_2014.jpg b/astrodata/doc/images/GeminiLogo_new_2014.jpg deleted file mode 100644 index 295c4e1a3374190bf07111466bebca5ca3b2c6be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1710871 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

d@EPhRq=TbE#NOAhgn?XdVA)c116s1;8g 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∨kM=(GdQt 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 bKcb==3|F=Lopm?q-9RDZI>>z+6ux>9>VVZB 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⩔Pw9KN%BB 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%0D}Zjg42V?R%5mwkKORQWiha^D)|`1Dj__ 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%0D^^6~iHjZ_W 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 z

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

GJdj1W8M1QLpw=%Oi3?FYZc{0b| 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

F+>@V)1^7MhYLvcK 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

lo-e#@F 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

5B|_ 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

iIpy{O300w`ru)J}8G{mP~^+rm_?66XuFhWdMg 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 diff --git a/astrodata/doc/index.rst b/astrodata/doc/index.rst deleted file mode 100644 index 13968e7959..0000000000 --- a/astrodata/doc/index.rst +++ /dev/null @@ -1,53 +0,0 @@ -.. Astrodata Master Manual - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - Manually edited by SC December 2020 - -################ -Astrodata Manual -################ - -.. admonition:: Document ID - - PIPE-USER-120_AstrodataMasterManual - -.. toctree:: - :hidden: - :numbered: - - cheatsheet - usermanual/index - progmanual/index - -This documentation provides different levels of information: - -- :doc:`cheatsheet` - A refresher on common astrodata operations -- :doc:`usermanual/index` - How to code with astrodata -- :doc:`progmanual/index` - How to code for astrodata - - -.. raw:: latex - - % Set up the appendix mode and modify the LaTeX toc behavior - \appendix - \noappendicestocpagenum - \addappheadtotoc - - -.. rubric:: Appendix - -.. toctree:: - :maxdepth: 1 - - appendix_descriptors - api - -.. ****************** -.. Indices and tables -.. ****************** - -.. * :ref:`genindex` -.. * :ref:`modindex` -.. * :ref:`search` - -.. todolist:: diff --git a/astrodata/doc/make.bat b/astrodata/doc/make.bat deleted file mode 100644 index 53564a8019..0000000000 --- a/astrodata/doc/make.bat +++ /dev/null @@ -1,281 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. epub3 to make an epub3 - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - echo. coverage to run coverage check of the documentation if enabled - echo. dummy to check syntax errors of document sources - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -REM Check if sphinx-build is available and fallback to Python version if any -%SPHINXBUILD% 1>NUL 2>NUL -if errorlevel 9009 goto sphinx_python -goto sphinx_ok - -:sphinx_python - -set SPHINXBUILD=python -m sphinx.__init__ -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -:sphinx_ok - - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\AstrodataProgrammersManual.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\AstrodataProgrammersManual.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "epub3" ( - %SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3 - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub3 file is in %BUILDDIR%/epub3. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "coverage" ( - %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage - if errorlevel 1 exit /b 1 - echo. - echo.Testing of coverage in the sources finished, look at the ^ -results in %BUILDDIR%/coverage/python.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -if "%1" == "dummy" ( - %SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. Dummy builder generates no files. - goto end -) - -:end diff --git a/astrodata/doc/progmanual/adclass.rst b/astrodata/doc/progmanual/adclass.rst deleted file mode 100644 index 5fb36f653b..0000000000 --- a/astrodata/doc/progmanual/adclass.rst +++ /dev/null @@ -1,397 +0,0 @@ -.. astrodata.rst - -.. _astrodata: - -************************* -AstroData and Derivatives -************************* - -The |AstroData| class is the main interface to the package. When opening files -or creating new objects, a derivative of this class is returned, as the -|AstroData| class is not intended to be used directly. It provides the logic to -calculate the :ref:`tag set ` for an image, which is common to all -data products. Aside from that, it lacks any kind of specialized knowledge -about the different instruments that produce the FITS files. More importantly, -it defines two methods (``info`` and ``load``) as abstract, meaning that the -class cannot be instantiated directly: a derivative must implement those -methods in order to be useful. Such derivatives can also implement descriptors, -which provide processed metadata in a way that abstracts the user from the raw -information (e.g., the keywords in FITS headers). - -|AstroData| does define a common interface, though. Much of it consists on -implementing semantic behavior (access to components through indices, like a -list; arithmetic using standard operators; etc), mostly by implementing -standard Python methods: - -* Defines a common ``__init__`` function. - -* Implements ``__deepcopy__``. - -* Implements ``__iter__`` to allow sequential iteration over the main set of - components (e.g., FITS science HDUs). - -* Implements ``__getitem__`` to allow data slicing (e.g., ``ad[2:4]`` returns - a new |AstroData| instance that contains only the third and fourth main - components). - -* Implements ``__delitem__`` to allow for data removal based on index. It does - not define ``__setitem__``, though. The basic AstroData series of classes - only allows to append new data blocks, not to replace them in one sweeping - move. - -* Implements ``__iadd__``, ``__isub__``, ``__imul__``, ``__itruediv__``, and - their not-in-place versions, based on them. - -There are a few other methods. For a detailed discussion, please refer to the -:ref:`api`. - -.. _tags_prop_entry: - -The ``tags`` Property -===================== - -Additionally, and crucial to the package, AstroData offers a ``tags`` property, -that under the hood calculates textual tags that describe the object -represented by an instance, and returns a set of strings. Returning a set (as -opposed to a list, or other similar structure) is intentional, because it is -fast to compare sets, e.g., testing for membership; or calculating intersection, -etc., to figure out if a certain dataset belongs to an arbitrary category. - -The implementation for the tags property is just a call to -``AstroData._process_tags()``. This function implements the actual logic behind -calculating the tag set (described :ref:`below `). A derivative class -could redefine the algorithm, or build upon it. - - -Writing an ``AstroData`` Derivative -=================================== - -The first step when creating new |AstroData| derivative hierarchy would be to -create a new class that knows how to deal with some kind of specific data in a -broad sense. - -|AstroData| implements both ``.info()`` and ``.load()`` in ways that are -specific to FITS files. It also introduces a number of FITS-specific methods -and properties, e.g.: - -* The properties ``phu`` and ``hdr``, which return the primary header and - a list of headers for the science HDUs, respectively. - -* A ``write`` method, which will write the data back to a FITS file. - -* A ``_matches_data`` **static** method, which is very important, involved in - guiding for the automatic class choice algorithm during data loading. We'll - talk more about this when dealing with :ref:`registering our classes - `. - -It also defines the first few descriptors, which are common to all Gemini data: -``instrument``, ``object``, and ``telescope``, which are good examples of simple -descriptors that just map a PHU keyword without applying any conversion. - -A typical AstroData programmer will extend this class (|AstroData|). Any of -the classes under the ``gemini_instruments`` package can be used as examples, -but we'll describe the important bits here. - - -Create a package for it ------------------------ - -This is not strictly necessary, but simplifies many things, as we'll see when -talking about *registration*. The package layout is up to the designer, so you -can decide how to do it. For DRAGONS we've settled on the following -recommendation for our internal process (just to keep things familiar):: - - gemini_instruments - __init__.py - instrument_name - __init__.py - adclass.py - lookup.py - -Where ``instrument_name`` would be the package name (for Gemini we group all -our derivative packages under ``gemini_instruments``, and we would import -``gemini_instruments.gmos``, for example). ``__init__.py`` and ``adclass.py`` -would be the only required modules under our recommended layout, with -``lookup.py`` being there just to hold hard-coded values in a module separate -from the main logic. - -``adclass.py`` would contain the declaration of the derivative class, and -``__init__.py`` will contain any code needed to register our class with the -|AstroData| system upon import. - - -Create your derivative class ----------------------------- - -This is an excerpt of a typical derivative module:: - - from astrodata import astro_data_tag, astro_data_descriptor, TagSet - from astrodata import AstroData - - from . import lookup - - class AstroDataInstrument(AstroData): - __keyword_dict = dict( - array_name = 'AMPNAME', - array_section = 'CCDSECT' - ) - - @staticmethod - def _matches_data(source): - return source[0].header.get('INSTRUME', '').upper() == 'MYINSTRUMENT' - - @astro_data_tag - def _tag_instrument(self): - return TagSet(['MYINSTRUMENT']) - - @astro_data_tag - def _tag_image(self): - if self.phu.get('GRATING') == 'MIRROR': - return TagSet(['IMAGE']) - - @astro_data_tag - def _tag_dark(self): - if self.phu.get('OBSTYPE') == 'DARK': - return TagSet(['DARK'], blocks=['IMAGE', 'SPECT']) - - @astro_data_descriptor - def array_name(self): - return self.phu.get(self._keyword_for('array_name')) - - @astro_data_descriptor - def amp_read_area(self): - ampname = self.array_name() - detector_section = self.detector_section() - return "'{}':{}".format(ampname, detector_section) - -.. note:: - An actual Gemini Facility Instrument class will derive from - ``gemini_instruments.AstroDataGemini``, but this is irrelevant - for the example. - -The class typically relies on functionality declared elsewhere, in some -ancestor, e.g., the tag set computation and the ``_keyword_for`` method are -defined at |AstroData|. - -Some highlights: - -* ``__keyword_dict``\ [#keywdict]_ defines one-to-one mappings, assigning a more - readable moniker for an HDU header keyword. The idea here is to prevent - hard-coding the names of the keywords, in the actual code. While these are - typically quite stable and not prone to change, it's better to be safe than - sorry, and this can come in useful during instrument development, which is - the more likely source of instability. The actual value can be extracted by - calling ``self._keyword_for('moniker')``. - -* ``_matches_data`` is a static method. It does not have any knowledge about - the class itself, and it does not work on an *instance* of the class: it's - a member of the class just to make it easier for the AstroData registry to - find it. This method is passed some object containing cues of the internal - structure and contents of the data. This could be, for example, an instance - of ``HDUList``. Using these data, ``_matches_data`` must return a boolean, - with ``True`` meaning "I know how to handle this data". - - Note that ``True`` **does not mean "I have full knowledge of the data"**. It - is acceptable for more than one class to claim compatibility. For a GMOS FITS - file, the classes that will return ``True`` are: |AstroData| (because it is - a FITS file that comply with certain minimum requirements), - `~gemini_instruments.gemini.AstroDataGemini` (the data contains Gemini - Facility common metadata), and `~gemini_instruments.gmos.AstroDataGmos` (the - actual handler!). - - But this does not mean that multiple classes can be valid "final" candidates. - If AstroData's automatic class discovery finds more than one class claiming - matching with the data, it will start discarding them on the basis of - inheritance: any class that appears in the inheritance tree of another one is - dropped, because the more specialized one is preferred. If at some point the - algorithm cannot find more classes to drop, and there is more than one left - in the list, an exception will occur, as AstroData will have no way to choose - one over the other. - -* A number of "tag methods" have been declared. Their naming is a convention, - at the end of the day (the "``_tag_``" prefix, and the related "``_status_``" - one, are *just hints* for the programmer): each team should establish - a convention that works for them. What is important here is to **decorate** - them using `~astrodata.astro_data_tag`, which earmarks the method so that it - can be discovered later, and ensures that it returns an appropriate value. - - A tag method will return either a `~astrodata.TagSet` instance (which can be - empty), or ``None``, which is the same as returning an empty - `~astrodata.TagSet`\ [#tagset1]_. - - **All** these methods will be executed when looking up for tags, and it's up - to the tag set construction algorithm (see :ref:`ad_tags`) to figure out the final - result. In theory, one **could** provide *just one* big method, but this is - feasible only when the logic behind deciding the tag set is simple. The - moment that there are a few competing alternatives, with some conditions - precluding other branches, one may end up with a rather complicated dozens of - lines of logic. Let the algorithm do the heavy work for you: split the tags - as needed to keep things simple, with an easy to understand logic. - - Also, keeping the individual (or related) tags in separate methods lets you - exploit the inheritance, keeping common ones at a higher level, and - redefining them as needed later on, at derived classes. - - Please, refer to `~gemini_instruments.gemini.AstroDataGemini`, - `~gemini_instruments.gmos.AstroDataGmos`, and - `~gemini_instruments.gnirs.AstroDataGnirs` for examples using most of the - features. - -* The `astrodata.AstroData.read` method calls the `astrodata.fits.read_fits` - function, which uses metadata in the FITS headers to determine how the data - should be stored in the |AstroData| object. In particular, the ``EXTNAME`` - and ``EXTVER`` keywords are used to assign individual FITS HDUs, using the - same names (``SCI``, ``DQ``, and ``VAR``) as Gemini-IRAF for the ``data``, - ``mask``, and ``variance`` planes. A ``SCI`` HDU *must* exist if there is - another HDU with the same ``EXTVER``, or else an error will occur. - - If the raw data do not conform to this format, the `astrodata.AstroData.read` - method can be overridden by your class, by having it call the - `astrodata.fits.read_fits` function with an additional parameter, - ``extname_parser``, that provides a function to modify the header. This - function will be called on each HDU before further processing. As an example, - the SOAR Adaptive Module Imager (SAMI) instrument writes raw data as - a 4-extension MEF file, with the extensions having ``EXTNAME`` values - ``im1``, ``im2``, etc. These need to be modified to ``SCI``, and an - appropriate ``EXTVER`` keyword added` [#extver]_\. This can be done by - writing a suitable ``read`` method for the ``AstroDataSami`` class:: - - @classmethod - def read(cls, source, extname_parser=None): - def sami_parser(hdu): - m = re.match('im(\d)', hdu.header.get('EXTNAME', '')) - if m: - hdu.header['EXTNAME'] = ('SCI', 'Added by AstroData') - hdu.header['EXTVER'] = (int(m.group(1)), 'Added by AstroData') - - return super().read(source, extname_parser=extname_parser) - - -* *Descriptors* will make the bulk of the class: again, the name is arbitrary, - and it should be descriptive. What *may* be important here is to use - `~astrodata.astro_data_descriptor` to decorate them. This is *not required*, - because unlike tag methods, descriptors are meant to be called explicitly by - the programmer, but they can still be marked (using this decorator) to be - listed when calling the ``descriptors`` property. The decorator does not - alter the descriptor input or output in any way, so it is always safe to use - it, and you probably should, unless there's a good reason against it (e.g., - if a descriptor is deprecated and you don't want it to show up in lookups). - - More detailed information can be found in :ref:`ad_descriptors`. - - -.. _class_registration: - -Register your class -------------------- - -Finally, you need to include your class in the **AstroData Registry**. This is -an internal structure with a list of all the |AstroData|\-derived classes that -we want to make available for our programs. Including the classes in this -registry is an important step, because a file should be opened using -`astrodata.open` or `astrodata.create`, which uses the registry to identify -the appropriate class (via the ``_matches_data`` methods), instead of having -the user specify it explicitly. - -The version of AstroData prior to DRAGONS had an auto-discovery mechanism, that -explored the source tree looking for the relevant classes and other related -information. This forced a fixed directory structure (because the code needed -to know where to look for files), and gave the names of files and classes -semantic meaning (to know *which* files to look into, for example). Aside from -the rigidness of the scheme, this introduced all sort of inefficiencies, -including an unacceptably high overhead when importing the AstroData package -for the first time during execution. - -In this new version of AstroData we've introduced a more manageable scheme, -that places the discovery responsibility on the programmer. A typical -``__init__.py`` file on an instrument package will look like this:: - - __all__ = ['AstroDataMyInstrument'] - - from astrodata import factory - from .adclass import AstroDataMyInstrument - - factory.addClass(AstroDataMyInstrument) - -The call to ``factory.addClass`` is the one registering the class. This step -**needs** to be done **before** the class can be used effectively in the -AstroData system. Placing the registration step in the ``__init__.py`` file is -convenient, because importing the package will be enough! - -Thus, a script making use of DRAGONS' AstroData to manipulate GMOS data -could start like this:: - - import astrodata - from gemini_instruments import gmos - - ... - - ad = astrodata.open(some_file) - -The first import line is not needed, technically, because the ``gmos`` package -will import it too, anyway, but we'll probably need the ``astrodata`` package -in the namespace anyway, and it's always better to be explicit. Our -typical DRAGONS scripts and modules start like this, instead:: - - import astrodata - import gemini_instruments - -``gemini_instruments`` imports all the packages under it, making knowledge -about all Gemini instruments available for the script, which is perfect for a -multi-instrument pipeline, for example. Loading all the instrument classes is -not typically a burden on memory, though, so it's easier for everyone to take -the more general approach. It also makes things easier on the end user, because -they won't need to know internal details of our packages (like their naming -scheme). We suggest this "*cascade import*" scheme for all new source trees, -letting the user decide which level of detail they need. - -As an additional step, the ``__init__.py`` file in a package may do extra -initialization. For example, for the Gemini modules, one piece of functionality -that is shared across instruments is a descriptor that translates a filter's -name (say "u" or "FeII") to its central wavelength (e.g., -0.35µm, 1.644µm). As it is a rather common function for us, it is implemented -by `~gemini_instruments.gemini.AstroDataGemini`. This class **does not know** -about its daughter classes, though, meaning that it **cannot know** about the -filters offered by their instruments. Instead, we offer a function that can -be used to update the filter → wavelength mapping in -`gemini_instruments.gemini.lookup` so that it is accessible by the -`~gemini_instruments.gemini.AstroDataGemini`\-level descriptor. So our -``gmos/__init__.py`` looks like this:: - - __all__ = ['AstroDataGmos'] - - from astrodata import factory - from ..gemini import addInstrumentFilterWavelengths - from .adclass import AstroDataGmos - from .lookup import filter_wavelengths - - factory.addClass(AstroDataGmos) - # Use the generic GMOS name for both GMOS-N and GMOS-S - addInstrumentFilterWavelengths('GMOS', filter_wavelengths) - -where `~gemini_instruments.gemini.addInstrumentFilterWavelengths` is provided -by the ``gemini`` package to perform the update in a controlled way. - -We encourage package maintainers and creators to follow such explicit -initialization methods, driven by the modules that add functionality -themselves, as opposed to active discovery methods on the core code. This -favors decoupling between modules, which is generally a good idea. - -.. rubric:: Footnotes - -.. [#keywdict] Note that the keyword dictionary is a "private" property of the - class (due to the double-underscore prefix). Each class can define its own - set, which will not be replaced by derivative classes. ``_keyword_for`` is - aware of this and will look up each class up the inheritance chain, in turn, - when looking up for keywords. - -.. [#tagset1] Notice that the example functions will return only - a `~astrodata.TagSet`, if appropriate. This is OK, remember that *every - function* in Python returns a value, which will be ``None``, implicitly, if - you don't specify otherwise. - -.. [#extver] An ``EXTVER`` keyword is not formally required as the - `astrodata.fits.read_fits` method will assign the lowest available integer - to a ``SCI`` header with no ``EXTVER`` keyword (or if its value is -1). But - we wish to be able to identify the original ``im1`` header by assigning it - an ``EXTVER`` of 1, etc. diff --git a/astrodata/doc/progmanual/containers.rst b/astrodata/doc/progmanual/containers.rst deleted file mode 100644 index fe2a1a26a7..0000000000 --- a/astrodata/doc/progmanual/containers.rst +++ /dev/null @@ -1,96 +0,0 @@ -.. containers.rst - -.. _containers: - -*************** -Data Containers -*************** - -A third, and very important part of the AstroData core package is the data -container. We have chosen to extend Astropy's |NDData| with our own -requirements, particularly lazy-loading of data using by opening the FITS files -in read-only, memory-mapping mode, and exploiting the windowing capability of -`astropy.io.fits` (using ``section``) to reduce our memory requirements, which -becomes important when reducing data (e.g., stacking). - -We'll describe here how we depart from |NDData|, and how do we integrate the -data containers with the rest of the package. Please refer to |NDData| for the -full interface. - -Our main data container is `astrodata.NDAstroData`. Fundamentally, it is -a derivative of `astropy.nddata.NDData`, plus a number of mixins to add -functionality:: - - class NDAstroData(AstroDataMixin, NDArithmeticMixin, NDSlicingMixin, NDData): - ... - -This allows us out of the box to have proper arithmetic with error -propagation, and slicing the data with the array syntax. - -Our first customization is ``NDAstroData.__init__``. It relies mostly on the -upstream initialization, but customizes it because our class is initialized -with lazy-loaded data wrapped around a custom class -(`astrodata.fits.FitsLazyLoadable`) that mimics a `astropy.io.fits` HDU -instance just enough to play along with |NDData|'s initialization code. - -``FitsLazyLoadable`` is an integral part of our memory-mapping scheme, and -among other things it will scale data on the fly, as memory-mapped FITS data -can only be read unscaled. Our NDAstroData redefines the properties ``data``, -``uncertainty``, and ``mask``, in two ways: - -* To deal with the fact that our class is storing ``FitsLazyLoadable`` - instances, not arrays, as |NDData| would expect. This is to keep data out - of memory as long as possible. - -* To replace lazy-loaded data with a real in-memory array, under certain - conditions (e.g., if the data is modified, as we won't apply the changes to the - original file!) - -Our obsession with lazy-loading and discarding data is directed to reduce -memory fragmentation as much as possible. This is a real problem that can hit -applications dealing with large arrays, particularly when using Python. Given -the choice to optimize for speed or for memory consumption, we've chosen the -latter, which is the more pressing issue. - -We've added another new property, ``window``, that can be used to -explicitly exploit the `astropy.io.fits`'s ``section`` property, to (again) -avoid loading unneeded data to memory. This property returns an instance of -``NDWindowing`` which, when sliced, in turn produces an instance of -``NDWindowingAstroData``, itself a proxy of ``NDAstroData``. This scheme may -seem complex, but it was deemed the easiest and cleanest way to achieve the -result that we were looking for. - -The base ``NDAstroData`` class provides the memory-mapping functionality, -with other important behaviors added by the ``AstroDataMixin``, which can -be used with other |NDData|-like classes (such as ``Spectrum1D``) to add -additional convenience. - -One addition is the ``variance`` property, which allows direct access and -setting of the data's uncertainty, without the user needing to explicitly wrap -it as an ``NDUncertainty`` object. Internally, the variance is stored as an -``ADVarianceUncertainty`` object, which is subclassed from Astropy's standard -``VarianceUncertainty`` class with the addition of a check for negative values -whenever the array is accessed. - -``NDAstroDataMixin`` also changes the default method of combining the ``mask`` -attributes during arithmetic operations from ``logical_or`` to ``bitwise_or``, -since the individual bits in the mask have separate meanings. - -The way slicing affects the ``wcs`` is also changed since DRAGONS regularly -uses the callable nature of ``gWCS`` objects and this is broken by the standard -slicing method. - -Finally, the additional image planes and tables stored in the ``meta`` dict -are exposed as attributes of the ``NDAstroData`` object, and any image planes -that have the same shape as the parent ``NDAstroData`` object will be handled -by ``NDWindowingAstroData``. Sections will be ignored when accessing image -planes with a different shape, as well as tables. - - -.. note:: - - We expect to make changes to ``NDAstroData`` in future releases. In particular, - we plan to make use of the ``unit`` attribute provided by the - |NDData| class and increase the use of memory-mapping by default. These - changes mostly represent increased functionality and we anticipate a high - (and possibly full) degree of backward compatibility. diff --git a/astrodata/doc/progmanual/descriptors.rst b/astrodata/doc/progmanual/descriptors.rst deleted file mode 100644 index e9ae03a28b..0000000000 --- a/astrodata/doc/progmanual/descriptors.rst +++ /dev/null @@ -1,65 +0,0 @@ -.. descriptors.rst - -.. _ad_descriptors: - -*********** -Descriptors -*********** - -Descriptors are just regular methods that translate metadata from the raw -storage (e.g., cards from FITS headers) to values useful for the user, -potentially doing some processing in between. They exist to: - -* Abstract the actual organization of the metadata; e.g. - `~gemini_instruments.gemini.AstroDataGemini` takes the detector gain from - a keyword in the FITS PHU, where `~gemini_instruments.niri.AstroDataNiri` - overrides this to provide a hard-coded value. - - More complex implementations also exist. In order to determine the gain of - a GMOS observation, `~gemini_instruments.gmos.AstroDataGmos` uses the - observation date (provided by a descriptor) to select a particular lookup - table, and then uses the values of other descriptors to select the correct - entry in the table. - -* Provide a common interface to a set of instruments. This simplifies user - training (no need to learn a different API for each instrument), and - facilitates the reuse of code for pipelines, etc. - -* Also, since FITS header keywords are limited to 8 characters, for simple - keyword → value mappings, they provide a more meaningful and readable name. - -Descriptors **should** be decorated using `~astrodata.astro_data_descriptor`. -The only function of this decorator is to ensure that the descriptor is marked -as such: it does not alter its input or output in any way. This lets the user -explore the API of an |AstroData| object via the -`~astrodata.AstroData.descriptors` property. - -Descriptors **can** be decorated with `~astrodata.core.returns_list` to -eliminate the need to code some logic. Some descriptors return single values, -while some return lists, one per extension. Typically, the former are -descriptors that refer to the entire observation (and, for MEF files, are -usually extracted from metadata in the PHU, such as ``airmass``), while the -latter are descriptors where different extensions might return different values -(and typically come from metadata in the individual HDUs, such as ``gain``). -A list is returned even if there is only one extension in the |AstroData| -object, as this allows code to be written generically to iterate over the -|AstroData| object and the descriptor return, without needing to know how many -extensions there are. The `~astrodata.core.returns_list` decorator ensures that -the descriptor returns an appropriate object (value or list), using the -following rules: - -* If the |AstroData| object is not a single slice: - - * If the undecorated descriptor returns a list, an exception is raised - if the list is not the same length as the number of extensions. - * If the undecorated descriptor returns a single value, the decorator - will turn it into a list of the correct length by copying this value. - -* If the |AstroData| object is a single slice and the undecorated - descriptor returns a list, only the first element is returned. - -An example of the use of this decorator is the NIRI -`~gemini_instruments.niri.AstroDataNiri.gain` descriptor, which reads the -value from a lookup table and simply returns it. A single value is only -appropriate if the |AstroData| object is singly-sliced and the decorator ensures -that a list is returned otherwise. diff --git a/astrodata/doc/progmanual/design.rst b/astrodata/doc/progmanual/design.rst deleted file mode 100644 index bab79e65f6..0000000000 --- a/astrodata/doc/progmanual/design.rst +++ /dev/null @@ -1,82 +0,0 @@ -.. design.rst - -.. _design: - -************** -General Design -************** - -As astronomical instruments have become more complex, there -has been an increasing need for bespoke reduction packages and pipelines to -deal with the specific needs of each instrument. Despite this -complexity, many of the reduction steps can be very similar and the overall -effort could be reduced significantly by sharing code. In practice, however, -there are often issues regarding the manner in which the data are stored -internally. The purpose of AstroData is to provide a uniform interface to the data -and metadata, in a manner that is independent both of the specific instrument -and the way the data are stored on disk, thereby facilitating this code-sharing. -It is *not* a new astronomical data format. - -One of the main features of AstroData is the use of *descriptors*, which -provide a level of abstraction between the metadata and the code accessing it. -Somebody using the AstroData interface who wishes to know the exposure time -of a particular astronomical observation represented by the ``AstroData`` object -``ad`` can simply write ``ad.exposure_time()`` without needing to concern -themselves about how that value is stored internally, for example, the name -of the FITS header keyword. These are discussed further in :ref:`ad_descriptors`. - -AstroData also provides a clearer representation of the relationships -between different parts of the data produced from a single astronomical -observation. Modern astronomical instruments often contain multiple -detectors that are read out separately and the multi-extension FITS (MEF) -format used by many institutions, including Gemini Observatory, handles -the raw data well. In this format, each detector's data and metadata is -assigned to its own extension, -while there is also a separate extension (the Primary Header Unit, -or PHU) containing additional metadata that applies to the entire -observation. However, as the data are processed, more data and/or -metadata may be added whose relationship is obscured by the limitations -of the MEF format. One example is the creation and propagation of information -describing the quality and uncertainty of the scientific data: while -this was a feature of -Gemini IRAF\ [#iraf]_, the coding required to implement it was cumbersome -and AstroData uses the `astropy.nddata.NDData` class, -as discussed in :ref:`containers`. This makes the relationship between these -data much clearer, and AstroData creates a syntax that makes readily apparent the -roles of other data and metadata that may be created during the reduction -process. - -An ``AstroData`` object therefore consists of one or more self-contained -"extensions" (data and metadata) plus additional data and metadata that is -relevant to all the extensions. In many data reduction processes, the same -operation will be performed on each extension (e.g., subtracting an overscan -region from a CCD frame) and an axiom of AstroData is that iterating over -the extensions produces AstroData "slices" which retain knowledge of the -top-level data and metadata. Since a slice has one (or more) extensions -plus this top-level (meta)data, it too is an ``AstroData`` object and, -specifically, an instance of the same subclass as its parent. - - -A final feature of AstroData is the implementation of very high-level metadata. -These data, called ``tags``, facilitate a key part of the Gemini data reduction -system, DRAGONS, by linking the astronomical data to the recipes -required to process them. They are explained in detail in :ref:`ad_tags` and the -Recipe System Programmers Manual\ [#rsprogman]_. - -.. note:: - - AstroData and DRAGONS have been developed for the reduction of data from - Gemini Observatory, which produces data in the FITS format that is still the - most widely-used format for astronomical data. In light of this, and the - limited resources in the Science User Support Department, we have only - *developed* support for FITS, even though the AstroData format is designed - to be independent of the file format. In some cases, this has led to - uncertainty and internal disagreement over where precisely to engage in - abstraction and, should AstroData support a different file format, we - may find alternative solutions that result in small, but possibly - significant, changes to the API. - - -.. [#iraf] ``_ - -.. [#rsprogman] |RSProgManual| diff --git a/astrodata/doc/progmanual/index.rst b/astrodata/doc/progmanual/index.rst deleted file mode 100644 index 751abd29a1..0000000000 --- a/astrodata/doc/progmanual/index.rst +++ /dev/null @@ -1,22 +0,0 @@ -.. Astrodata Programmer's Manual documentation master file, created by - sphinx-quickstart on Fri Jun 1 11:08:23 2018. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -=================== -Programmer's Manual -=================== - -.. admonition:: Document ID - - PIPE-USER-104_AstrodataProgManual - -.. toctree:: - :maxdepth: 2 - - intro - design - adclass - containers - tags - descriptors diff --git a/astrodata/doc/progmanual/intro.rst b/astrodata/doc/progmanual/intro.rst deleted file mode 100644 index d2b9a93975..0000000000 --- a/astrodata/doc/progmanual/intro.rst +++ /dev/null @@ -1,45 +0,0 @@ -.. intro.rst - -.. _intro_progmanual: - -************************* -Precedents and Motivation -************************* - - -The Gemini Observatory has produced a number of tools for data processing. -Historically this has translated into a number of IRAF\ [#IRAF]_ packages but -the lack of long-term support for IRAF, coupled with the well-known -difficulty in creating robust reduction pipelines within the IRAF -environment, led to a decision -to adopt Python as a programming tool and a new -package was born: Gemini Python. Gemini Python provided tools to load and -manipulate Gemini-produced multi-extension FITS\ [#FITS]_ (MEF) files, -along with a pipeline that -allowed the construction of reduction recipes. At the center of this package -was the AstroData subpackage, which supported the abstraction of the FITS -files. - -Gemini Python reached version 1.0.1, released during November 2014. In 2015 -the Science User Support Department (SUSD) was created at Gemini, which took on the -responsibility of maintaining the software reduction tools, and started -planning future steps. With improved oversight and time and thought, it became -evident that the design of Gemini Python and, specially, of AstroData, made -further development a daunting task. - -In 2016 a decision was reached to overhaul Gemini Python. While the -principles behind AstroData were sound, the coding involved unnecessary -layers of abstraction and eschewed features of the Python language in favor -of its own implementation. Thus, -|DRAGONS| was born, with a new, simplified (and backward *incompatible*) -AstroData v2.0 (which we will refer to simply as AstroData) - -This manual documents both the high level design and some implementation -details of AstroData, together with an explanation of how to extend the -package to work for new environments. - -.. rubric:: Footnotes - -.. [#IRAF] http://iraf.net -.. [#FITS] The `Flexible Image Transport System `_ -.. [#DRAGONS] The `Data Reduction for Astronomy from Gemini Observatory North and South `_ package diff --git a/astrodata/doc/progmanual/tags.rst b/astrodata/doc/progmanual/tags.rst deleted file mode 100644 index 01a2c82b5d..0000000000 --- a/astrodata/doc/progmanual/tags.rst +++ /dev/null @@ -1,160 +0,0 @@ -.. tags.rst - -.. _ad_tags: - -**** -Tags -**** - -We described :ref:`in previous section ` how to generate tags for an -AstroData derivative. In this section we'll describe the algorithm that -generates the complete tag set out of the individual ``TagSet`` instances. The -algorithm collects all the tags in a list and then decides whether to apply -them or not following certain rules, but let's talk about ``TagSet`` first. - -``TagSet`` is actually a standard named tuple customized to generate default -values (``None``) for its missing members. Its signature is:: - - TagSet(add=None, remove=None, blocked_by=None, blocks=None, - if_present=None) - -The most common ``TagSet`` is an **additive** one: ``TagSet(['FOO', 'BAR'])``. -If all you need is to add tags, then you're done here. But the real power of -our tag generating system is that you can specify some conditions to apply a -certain ``TagSet``, or put restrictions on others. The different arguments to -``TagSet`` all expect a list (or some others work in the following way): - -* ``add``: if this ``TagSet`` is selected, then add all these members to the tag - set. -* ``remove``: if this ``TagSet`` is selected, then prevent all these members - from joining the tag set. -* ``blocked_by``: if any of the tags listed in here exist in the tag set, then - discard this ``TagSet`` altogether. -* ``blocks``: discard from the list of unprocessed ones any ``TagSet`` that - would add any of the tags listed here. -* ``if_present``: process this tag only if all the tags listed in here exist in - the tag set at this point. - -Note that ``blocked_by`` and ``blocks`` look like two sides of the same coin. -This is intentional: which one to use is up to the programmer, depending on -what will reduce the amount of typing and/or make the logic easier (sometimes one -wants to block a bunch of other tags from a single one; sometimes one wants a -tag to be blocked by a bunch of others). Furthermore, while ``blocks`` and -``blocked_by`` prevent the entire ``TagSet`` from being added if it contains a -tag affected by these, ``remove`` only affects the specific tag. - -Now, the algorithm works like this: - -#. Collect all the ``TagSet`` generated by methods in the instance that are - decorated using ``astro_data_tag``. -#. Then we sort them out: - - #. Those that subtract tags from the tag set go first (the ones with - non-empty ``remove`` or ``blocks``), allowing them to act early on - #. Those with non-empty ``blocked_by`` are moved to the end of the list, to - ensure that other tags can be generated before them. - #. Those with non-empty ``if_present`` are moved behind those with - ``blocked_by``. - -#. Now that we've sorted the tags, process them sequentially and for each one: - - #. If they require other tags to be present, make sure that this is the case. - If the requirements are not met, drop the tagset. If not... - #. Figure out if any other tag is blocking the tagset. This will be the - case if *any* of the tags to be added is in the "blocked" list, or if - any of the tags added by previous tag sets are in the ``blocked_by`` - list of the one being processed. Then... - #. If all the previous hurdles have been passed, apply the changes declared - by this tag (add, remove, and/or block others). - -Note that Python's sort algorithm is stable. This means, that if two elements -are indistinguishable from the point of view of the sorting algorithm, they are -guaranteed to stay in the same relative position. To better understand how this -affects our tags, and the algorithm itself, let's follow up with an example taken -from real code (the Gemini-generic and GMOS modules):: - - # Simple tagset, with only a constant, additive content - @astro_data_tag - def _tag_instrument(self): - return TagSet(['GMOS']) - - # Simple tagset, also with additive content. This one will - # check if the frame fits the requirements to be classified - # as "GMOS imaging". It returns a value conditionally: - # if this is not imaging, then it will return None, which - # means the algorithm will ignore the value - @astro_data_tag - def _tag_image(self): - if self.phu.get('GRATING') == 'MIRROR': - return TagSet(['IMAGE']) - - # This is a slightly more complex TagSet (but fairly simple, anyway), - # inherited by all Gemini instruments. - @astro_data_tag - def _type_gcal_lamp(self): - if self.phu.get('GCALLAMP') == 'IRhigh': - shut = self.phu.get('GCALSHUT') - if shut == 'OPEN': - return TagSet(['GCAL_IR_ON', 'LAMPON'], - blocked_by=['PROCESSED']) - elif shut == 'CLOSED': - return TagSet(['GCAL_IR_OFF', 'LAMPOFF'], - blocked_by=['PROCESSED']) - - # This tagset is only active when we detect that the frame is - # a bias. In that case we want to prevent the frame from being - # classified as "imaging" or "spectroscopy", which depend on the - # configuration of the instrument - @astro_data_tag - def _tag_bias(self): - if self.phu.get('OBSTYPE') == 'BIAS': - return TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT']) - -These four simple tag methods will serve to illustrate the algorithm. Let's pretend -that the requirements for all four of them are somehow met, meaning that we get four -``TagSet`` instances in our list, in some random order. After step 1 in the algorithm, -then, we may have collected the following list:: - - [ TagSet(['GMOS']), - TagSet(['GCAL_IR_OFF', 'LAMPOFF'], blocked_by=['PROCESSED']), - TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT']), - TagSet(['IMAGE']) ] - -The algorithm then proceeds to sort them. First, it will promote the ``TagSet`` -with non-empty ``blocks`` or ``remove``:: - - [ TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT']), - TagSet(['GMOS']), - TagSet(['GCAL_IR_OFF', 'LAMPOFF'], blocked_by=['PROCESSED']), - TagSet(['IMAGE']) ] - -Note that the other three ``TagSet`` stay in exactly the same order. Now the -algorithm will sort the list again, moving the ones with non-empty -``blocked_by`` to the end:: - - [ TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT']), - TagSet(['GMOS']), TagSet(['IMAGE']), - TagSet(['GCAL_IR_OFF', 'LAMPOFF'], blocked_by=['PROCESSED']) ] - -Note that at each step, all the instances (except the ones "being moved") have -kept the same position relative to each other -here's where the "stability" of -the sorting comes into play,- ensuring that each step does not affect the previous -one. Finally, there are no ``if_present`` in our example, so no more instances are -moved around. - -Now the algorithm prepares three empty sets (``tags``, ``removals``, and ``blocked``), -and starts iterating over the ``TagSet`` list. - - 1. For the first ``TagSet`` there are no blocks or removals, so we just add its - contents to the current sets: ``tags = {'BIAS', 'CAL'}``, - ``blocked = {'IMAGE', 'SPECT'}``. - 2. Then comes ``TagSet(['GMOS'])``. Again, there are no removals in place, and - ``GMOS`` is not in the list of blocked tags. Thus, we just add it to the current - tag set: ``tags = {'BIAS', 'CAL', 'GMOS'}``. - 3. When processing ``TagSet(['IMAGE'])``, the algorithm observes that this ``IMAGE`` - is in the ``blocked`` set, and stops processing this tag set. - 4. Finally, neither ``GCAL_IR_OFF`` nor ``LAMPOFF`` are in ``blocked``, and - ``PROCESSED`` is not in ``tags``, meaning that we can add this tag set to - the final one. - -Our result will look something like: ``{'BIAS', 'CAL', 'GMOS', 'GCAL_IR_OFF', 'LAMPOFF'}`` diff --git a/astrodata/doc/usermanual/data.rst b/astrodata/doc/usermanual/data.rst deleted file mode 100644 index b7d54a700d..0000000000 --- a/astrodata/doc/usermanual/data.rst +++ /dev/null @@ -1,903 +0,0 @@ -.. data.rst - -.. _pixel-data: - -********** -Pixel Data -********** - -**Try it yourself** - -Download the data package (:ref:`datapkg`) if you wish to follow along and run the -examples. Then :: - - $ cd /ad_usermanual/playground - $ python - -Then import core astrodata and the Gemini astrodata configurations. :: - - >>> import astrodata - >>> import gemini_instruments - - -Operate on Pixel Data -===================== -The pixel data are stored in the ``AstroData`` object as a list of -``NDAstroData`` objects. The ``NDAstroData`` is a subclass of Astropy's -``NDData`` class which combines in one "package" the pixel values, the -variance, and the data quality plane or mask (as well as associated meta-data). -The data can be retrieved as a standard NumPy ``ndarray``. - -In the sections below, we will present several typical examples of data -manipulation. But first let's start with a quick example on how to access -the pixel data. :: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - - >>> the_data = ad[1].data - >>> type(the_data) - - - >>> # Loop through the extensions - >>> for ext in ad: - ... the_data = ext.data - ... print(the_data.sum()) - 333071030 - 335104458 - 333170484 - 333055206 - -In this example, we first access the pixels for the second extensions. -Remember that in Python, list are zero-indexed, hence we access the second -extension as ``ad[1]``. The ``.data`` attribute contains a NumPy ``ndarray``. -In the for-loop, for each extension, we get the data and use the NumPy -``.sum()`` method to sum the pixel values. Anything that can be done -with a ``ndarray`` can be done on ``AstroData`` pixel data. - - -Arithmetic on AstroData Objects -=============================== -``AstroData`` objects support basic in-place arithmetics with these methods: - -+----------------+-------------+ -| addition | .add() | -+----------------+-------------+ -| subtraction | .subtract() | -+----------------+-------------+ -| multiplication | .multiply() | -+----------------+-------------+ -| division | .divide() | -+----------------+-------------+ - -Normal, not in-place, arithmetics is also possible using the standard -operators, ``+``, ``-``, ``*``, and ``/``. - -The big advantage of using ``AstroData`` to do arithmetics is that the -variance and mask, if present, will be propagated through to the output -``AstroData`` object. We will explore the variance propagation in the next -section and mask usage later in this chapter. - -Simple operations ------------------ -Here are a few examples of arithmetics on ``AstroData`` objects.:: - - >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') - - >>> # Addition - >>> ad.add(50.) - >>> ad = ad + 50. - >>> ad += 50. - - >>> # Subtraction - >>> ad.subtract(50.) - >>> ad = ad - 50. - >>> ad -= 50. - - >>> # Multiplication (Using a descriptor) - >>> ad.multiply(ad.exposure_time()) - >>> ad = ad * ad.exposure_time() - >>> ad *= ad.exposure_time() - - >>> # Division (Using a descriptor) - >>> ad.divide(ad.exposure_time()) - >>> ad = ad / ad.exposure_time() - >>> ad /= ad.exposure_time() - -When the syntax ``adout = adin + 1`` is used, the output variable is a copy -of the original. In the examples above we reassign the result back onto the -original. The two other forms, ``ad.add()`` and ``ad +=`` are in-place -operations. - -When a descriptor returns a list because the value changes for each -extension, a for-loop is needed:: - - >>> for (ext, gain) in zip(ad, ad.gain()): - ... ext.multiply(gain) - -If you want to do the above but on a new object, leaving the original unchanged, -use ``deepcopy`` first. :: - - >>> from copy import deepcopy - >>> adcopy = deepcopy(ad) - >>> for (ext, gain) in zip(adcopy, adcopy.gain()): - ... ext.multiply(gain) - - -Operator Precedence -------------------- -The ``AstroData`` arithmetics methods can be stringed together but beware that -there is no operator precedence when that is done. For arithmetics that -involve more than one operation, it is probably safer to use the normal -Python operator syntax. Here is a little example to illustrate the difference. - -:: - - >>> ad.add(5).multiply(10).subtract(5) - - >>> # means: ad = ((ad + 5) * 10) - 5 - >>> # NOT: ad = ad + (5 * 10) - 5 - -This is because the methods modify the object in-place, one operation after -the other from left to right. This also means that the original is modified. - -This example applies the expected operator precedence:: - - >>> ad = ad + ad * 3 - 40. - >>> # means: ad = ad + (ad * 3) - 40. - -If you need a copy, leaving the original untouched, which is sometimes useful -you can use ``deepcopy`` or just use the normal operator and assign to a new -variable.:: - - >>> adnew = ad + ad * 3 - 40. - - -Variance -======== -When doing arithmetic on an ``AstroData`` object, if a variance is present -it will be propagated appropriately to the output no matter which syntax -you use (the methods or the Python operators). - -Adding a Variance Plane ------------------------ -In this example, we will add the poisson noise to an ``AstroData`` dataset. -The data is still in ADU, therefore the poisson noise as variance is -``signal / gain``. We want to set the variance for each of the pixel -extensions. - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - - >>> for (extension, gain) in zip(ad, ad.gain()): - ... extension.variance = extension.data / gain - -Check ``ad.info()``, you will see a variance plane for each of the four -extensions. - -Automatic Variance Propagation ------------------------------- -As mentioned before, if present, the variance plane will be propagated to the -resulting ``AstroData`` object when doing arithmetics. The variance -calculation assumes that the data are not correlated. - -Let's look into an example. - -:: - - >>> # output = x * x - >>> # var_output = var * x^2 + var * x^2 - >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - - >>> ad[1].data[50,50] - 56.160931 - >>> ad[1].variance[50,50] - 96.356529 - >>> adout = ad * ad - >>> adout[1].data[50,50] - 3154.05 - >>> adout[1].variance[50,50] - 607826.62 - -Data Quality Plane -================== -The NDData ``mask`` stores the data quality plane. The simplest form is a -True/False array of the same size at the pixel array. In Astrodata we favor -a bit array that allows for additional information about why the pixel is being -masked. For example at Gemini here is our bit mapping for bad pixels. - -+---------------+-------+ -| Meaning | Value | -+===============+=======+ -| Bad pixel | 1 | -+---------------+-------+ -| Non Linear | 2 | -+---------------+-------+ -| Saturated | 4 | -+---------------+-------+ -| Cosmic Ray | 8 | -+---------------+-------+ -| No Data | 16 | -+---------------+-------+ -| Overlap | 32 | -+---------------+-------+ -| Unilluminated | 64 | -+---------------+-------+ - -(These definitions are located in ``geminidr.gemini.lookups.DQ_definitions``.) - -So a pixel marked 10 in the mask, would be a "non-linear" "cosmic ray". The -``AstroData`` masks are propagated with bitwise-OR operation. For example, -let's say that we are stacking frames. A pixel is set as bad (value 1) -in one frame, saturated in another (value 4), and fine in all the other -the frames (value 0). The mask of the resulting stack will be assigned -a value of 5 for that pixel. - -These bitmasks will work like any other NumPy True/False mask. There is a -usage example below using the mask. - -The mask can be accessed as follow:: - - >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - >>> ad.info() - - >>> ad[2].mask - - -Display -======= -Since the data is stored in the ``AstroData`` object as a NumPy ``ndarray`` -any tool that works on ``ndarray`` can be used. To display to DS9 there -is the ``imexam`` package. The ``numdisplay`` package is still available for -now but it is no longer supported by STScI. We will show -how to use ``imexam`` to display and read the cursor position. Read the -documentation on that tool to learn more about what else it has -to offer. - -Displaying with imexam ----------------------- - -Here is an example how to display pixel data to DS9 with ``imexam``. You must -start ``ds9`` before running this example. - -:: - - >>> import imexam - >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') - - # Connect to the DS9 window (should already be opened.) - >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) - - >>> ds9.view(ad[0].data) - - # To scale "a la IRAF" - >>> ds9.view(ad[0].data) - >>> ds9.scale('zscale') - - # To set the mininum and maximum scale values - >>> ds9.view(ad[0].data) - >>> ds9.scale('limits 0 2000') - - -Retrieving cursor position with imexam --------------------------------------- - -The function ``readcursor()`` can be used to retrieve cursor -position in pixel coordinates. Note that it will **not** respond to -mouse clicks, **only** keyboard entries are acknowledged. - -When invoked, ``readcursor()`` will stop the flow of the program and wait -for the user to put the cursor on top of the image and type a key. A -tuple with three values will be returned: the x and -y coordinates **in 0-based system**, and the value of the key the user -hit. - -:: - - >>> import imexam - >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') - - # Connect to the DS9 window (should already be opened.) - # and display - >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) - >>> ds9.view(ad[0].data) - >>> ds9.scale('zscale') - - - >>> cursor_coo = ds9.readcursor() - >>> print(cursor_coo) - - # To extract only the x,y coordinates - >>> (xcoo, ycoo) = cursor_coo[:2] - >>> print(xcoo, ycoo) - - # If you are also interested in the keystroke - >>> keystroke = cursor_coo[2] - >>> print('You pressed this key: %s' % keystroke) - - -Useful tools from the NumPy, SciPy, and Astropy Packages -======================================================== -Like for the Display section, this section is not really specific to -Astrodata but is rather a quick show-and-tell of a few things that can -be done on the pixels with the big scientific packages NumPy, SciPy, -and Astropy. - -Those three packages are very large and rich. They have their own -extensive documentation and it is highly recommend for the users to learn about what -they have to offer. It might save you from re-inventing the wheel. - -The pixels, the variance, and the mask are stored as NumPy ``ndarray``'s. -Let us go through some basic examples, just to get a feel for how the -data in an ``AstroData`` object can be manipulated. - -ndarray -------- -The data are contained in NumPy ``ndarray`` objects. Any tools that works -on an ``ndarray`` can be used with Astrodata. - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - - >>> data = ad[0].data - - >>> # Shape of the array. (equivalent to NAXIS2, NAXIS1) - >>> data.shape - (2112, 288) - - >>> # Value of a pixel at "IRAF" or DS9 coordinates (100, 50) - >>> data[49,99] - 455 - - >>> # Data type - >>> data.dtype - dtype('uint16') - -The two most important thing to remember for users coming from the IRAF -world or the Fortran world are that the array has the y-axis in the first -index, the x-axis in the second, and that the array indices are zero-indexed, -not one-indexed. The examples above illustrate those two critical -differences. - -It is sometimes useful to know the data type of the values stored in the -array. Here, the file is a raw dataset, fresh off the telescope. No -operations has been done on the pixels yet. The data type of Gemini raw -datasets is always "Unsigned integer (0 to 65535)", ``uint16``. - -.. warning:: - Beware that doing arithmetic on ``uint16`` can lead to unexpected - results. This is a NumPy behavior. If the result of an operation - is higher than the range allowed by ``uint16``, the output value will - be "wrong". The data type will not be modified to accommodate the large - value. A workaround, and a safety net, is to multiply the array by - ``1.0`` to force the conversion to a ``float64``. :: - - >>> a = np.array([65535], dtype='uint16') - >>> a + a - array([65534], dtype=uint16) - >>> 1.0*a + a - array([ 131070.]) - - - -Simple Numpy Statistics ------------------------ -A lot of functions and methods are available in NumPy to probe the array, -too many to cover here, but here are a couple examples. - -:: - - >>> import numpy as np - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> data = ad[0].data - - >>> data.mean() - >>> np.average(data) - >>> np.median(data) - -Note how ``mean()`` is called differently from the other two. ``mean()`` -is a ``ndarray`` method, the others are NumPy functions. The implementation -details are clearly well beyond the scope of this manual, but when looking -for the tool you need, keep in mind that there are two sets of functions to -look into. Duplications like ``.mean()`` and ``np.average()`` can happen, -but they are not the norm. The readers are strongly encouraged to refer to -the NumPy documentation to find the tool they need. - - -Clipped Statistics ------------------- -It is common in astronomy to apply clipping to the statistics, a clipped -average, for example. The NumPy ``ma`` module can be used to create masks -of the values to reject. In the examples below, we calculated the clipped -average of the first pixel extension with a rejection threshold set to -+/- 3 times the standard deviation. - -Before Astropy, it was possible to do something like that with only -NumPy tools, like in this example:: - - >>> import numpy as np - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> data = ad[0].data - - >>> stddev = data.std() - >>> mean = data.mean() - - >>> clipped_mean = np.ma.masked_outside(data, mean-3*stddev, mean+3*stddev).mean() - -There is no iteration in that example. It is a straight one-time clipping. - -For something more robust, there is an Astropy function that can help, in -particular by adding an iterative process to the calculation. Here is -how it is done:: - - >>> import numpy as np - >>> from astropy.stats import sigma_clip - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> data = ad[0].data - - >>> clipped_mean = np.ma.mean(sigma_clip(data, sigma=3)) - - -Filters with SciPy ------------------- -Another common operation is the filtering of an image, for example convolving -with a gaussian filter. The SciPy module ``ndimage.filters`` offers -several functions for image processing. See the SciPy documentation for -more information. - -The example below applies a gaussian filter to the pixel array. - -:: - - >>> from scipy.ndimage import filters - >>> import imexam - - >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') - >>> data = ad[0].data - - >>> # We need to prepare an array of the same size and shape as - >>> # the data array. The result will be put in there. - >>> convolved_data = np.zeros(data.size).reshape(data.shape) - - >>> # We now apply the convolution filter. - >>> sigma = 10. - >>> filters.gaussian_filter(data, sigma, output=convolved_data) - - >>> # Let's visually compare the convolved image with the original - >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) - >>> ds9.view(data) - >>> ds9.scale('zscale') - >>> ds9.frame(2) - >>> ds9.view(convolved_data) - >>> ds9.scale('zscale') - >>> ds9.blink() - >>> # When you are convinced it's been convolved, stop the blinking. - >>> ds9.blink(blink=False) - -Note that there is an Astropy way to do this convolution, with tools in -``astropy.convolution`` package. Beware that for this particular kernel -we have found that the Astropy ``convolve`` function is extremely slow -compared to the SciPy solution. -This is because the SciPy function is optimized for a Gaussian convolution -while the generic ``convolve`` function in Astropy can take in any kernel. -Being able to take in any kernel is a very powerful feature, but the cost -is time. The lesson here is do your research, and find the best tool for -your needs. - - -Many other tools ----------------- -There are many, many other tools available out there. Here are the links to -the three big projects we have featured in this section. - -* NumPy: `www.numpy.org `_ -* SciPy: `www.scipy.org `_ -* Astropy: `www.astropy.org `_ - -Using the Astrodata Data Quality Plane -====================================== -Let us look at an example where the use of the Astrodata mask is -necessary to get correct statistics. A GMOS imaging frame has large sections -of unilluminated pixels; the edges are not illuminated and there are two -bands between the three CCDs that represent the physical gap between the -CCDs. Let us have a look at the pixels to have a better sense of the -data:: - - >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') - >>> import imexam - >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) - - >>> ds9.view(ad[0].data) - >>> ds9.scale('zscale') - -See how the right and left portions of the frame are not exposed to the sky, -and the 45 degree angle cuts of the four corners. The chip gaps too. -If we wanted to do statistics on the whole frames, we certainly would not want -to include those unilluminated areas. We would want to mask them out. - -Let us have a look at the mask associated with that image:: - - >>> ds9.view(ad[0].mask) - >>> ds9.scale('zscale') - -The bad sections are all white (pixel value > 0). There are even some -illuminated pixels that have been marked as bad for a reason or another. - -Let us use that mask to reject the pixels with no or bad information and -do calculations only on the good pixels. For the sake of simplicity we will -just do an average. This is just illustrative. We show various ways to -accomplish the task; choose the one that best suits your need or that you -find most readable. - -:: - - >>> import numpy as np - - >>> # For clarity... - >>> data = ad[0].data - >>> mask = ad[0].mask - - >>> # Reject all flagged pixels and calculate the mean - >>> np.mean(data[mask == 0]) - >>> np.ma.masked_array(data, mask).mean() - - >>> # Reject only the pixels flagged "no_data" (bit 16) - >>> np.mean(data[(mask & 16) == 0]) - >>> np.ma.masked_array(data, mask & 16).mean() - >>> np.ma.masked_where(mask & 16, data).mean() - -The "long" form with ``np.ma.masked_*`` is useful if you are planning to do -more than one operation on the masked array. For example:: - - >>> clean_data = np.ma.masked_array(data, mask) - >>> clean_data.mean() - >>> np.ma.median(clean_data) - >>> clean_data.max() - - -Manipulate Data Sections -======================== -So far we have shown examples using the entire data array. It is possible -to work on sections of that array. If you are already familiar with -Python, you probably already know how to do most if not all of what is in -this section. For readers new to Python, and especially those coming -from IRAF, there are a few things that are worth explaining. - -When indexing a NumPy ``ndarray``, the left most number refers to the -highest dimension's axis. For example, in a 2D array, the IRAF section -are in (x-axis, y-axis) format, while in Python they are in -(y-axis, x-axis) format. Also important to remember is that the ``ndarray`` -is 0-indexed, rather than 1-indexed like in Fortran or IRAF. - -Putting it all together, a pixel position (x,y) = (50,75) in IRAF or from -the cursor on a DS9 frame, is accessed in Python as ``data[74,49]``. -Similarly, the IRAF section [10:20, 30:40] translate in Python to -[9:20, 29:40]. Also remember that when slicing in Python, the upper limit -of the slice is not included in the slice. This is why here we request -20 and 40 rather 19 and 39. - -Let's put it in action. - -Basic Statistics on Section ---------------------------- -In this example, we do simple statistics on a section of the image. - -:: - - >>> import numpy as np - - >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') - >>> data = ad[0].data - - >>> # Get statistics for a 25x25 pixel-wide box centered on pixel - >>> # (50,75) (DS9 frame coordinate) - >>> xc = 49 - >>> yc = 74 - >>> buffer = 25 - >>> (xlow, xhigh) = (xc - buffer//2, xc + buffer//2 + 1) - >>> (ylow, yhigh) = (yc - buffer//2, yc + buffer//2 + 1) - >>> # The section is [62:87, 37:62] - >>> stamp = data[ylow:yhigh, xlow:xhigh] - >>> mean = stamp.mean() - >>> median = np.median(stamp) - >>> stddev = stamp.std() - >>> minimum = stamp.min() - >>> maximum = stamp.max() - - >>> print(' Mean Median Stddev Min Max\n \ - ... %.2f %.2f %.2f %.2f %.2f' % \ - ... (mean, median, stddev, minimum, maximum)) - -Have you noticed that the median is calculated with a function rather -than a method? This is simply because the ``ndarray`` object does not -have a method to calculate the median. - -Example - Overscan Subtraction with Trimming --------------------------------------------- -Several concepts from previous sections and chapters are used in this -example. The Descriptors are used to retrieve the overscan section and -the data section information from the headers. Statistics are done on the -NumPy ``ndarray`` representing the pixel data. Astrodata arithmetics is -used to subtract the overscan level. Finally, the overscan section is -trimmed off and the modified ``AstroData`` object is written to a new file -on disk. - -To make the example more complete, and to show that when the pixel data -array is trimmed, the variance (and mask) arrays are also trimmed, let us -add a variance plane to our raw data frame. - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - - >>> for (extension, gain) in zip(ad, ad.gain()): - ... extension.variance = extension.data / gain - ... - - >>> # Here is how the data structure looks like before the trimming. - >>> ad.info() - Filename: ../playdata/N20170609S0154.fits - Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED - - Pixels Extensions - Index Content Type Dimensions Format - [ 0] science NDAstroData (2112, 288) uint16 - .variance ndarray (2112, 288) float64 - [ 1] science NDAstroData (2112, 288) uint16 - .variance ndarray (2112, 288) float64 - [ 2] science NDAstroData (2112, 288) uint16 - .variance ndarray (2112, 288) float64 - [ 3] science NDAstroData (2112, 288) uint16 - .variance ndarray (2112, 288) float64 - - >>> # Let's operate on the first extension. - >>> # - >>> # The section descriptors return the section in a Python format - >>> # ready to use, 0-indexed. - >>> oversec = ad[0].overscan_section() - >>> datasec = ad[0].data_section() - - >>> # Measure the overscan level - >>> mean_overscan = ad[0].data[oversec.y1: oversec.y2, oversec.x1: oversec.x2].mean() - - >>> # Subtract the overscan level. The variance will be propagated. - >>> ad[0].subtract(mean_overscan) - - >>> # Trim the data to remove the overscan section and keep only - >>> # the data section. Note that the WCS will be automatically - >>> # adjusted when the trimming is done. - >>> # - >>> # Here we work on the NDAstroData object to have the variance - >>> # trimmed automatically to the same size as the science array. - >>> # To reassign the cropped NDAstroData, we use the reset() method. - >>> ad[0].reset(ad[0].nddata[datasec.y1:datasec.y2, datasec.x1:datasec.x2]) - - >>> # Now look at the dimensions of the first extension, science - >>> # and variance. That extension is smaller than the others. - >>> ad.info() - Filename: ../playdata/N20170609S0154.fits - Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED - - Pixels Extensions - Index Content Type Dimensions Format - [ 0] science NDAstroData (2112, 256) float64 - .variance ndarray (2112, 256) float64 - [ 1] science NDAstroData (2112, 288) uint16 - .variance ndarray (2112, 288) float64 - [ 2] science NDAstroData (2112, 288) uint16 - .variance ndarray (2112, 288) float64 - [ 3] science NDAstroData (2112, 288) uint16 - .variance ndarray (2112, 288) float64 - - >>> # We can write this to a new file - >>> ad.write('partly_overscan_corrected.fits') - -A new feature presented in this example is the ability to work on the -``NDAstroData`` object directly. This is particularly useful when cropping -the science pixel array as one will want the variance and the mask arrays -cropped exactly the same way. Taking a section of the ``NDAstroData`` -object (ad[0].nddata[y1:y2, x1:x2]), instead of just the ``.data`` array, -does all that for us. - -To reassign the cropped ``NDAstroData`` to the extension one uses the -``.reset()`` method as shown in the example. - -Of course to do the overscan correction correctly and completely, one would -loop over all four extensions. But that's the only difference. - -Data Cubes -========== -Reduced Integral Field Unit (IFU) data is commonly represented as a cube, -a three-dimensional array. The ``data`` component of an ``AstroData`` -object extension can be such a cube, and it can be manipulated and explored -with NumPy, AstroPy, SciPy, imexam, like we did already in this section -with 2D arrays. We can use matplotlib to plot the 1D spectra represented -in the third dimension. - -In Gemini IFU cubes, the first axis is the X-axis, the second, the Y-axis, -and the wavelength is in the third axis. Remember that in a ``ndarray`` -that order is reversed (wlen, y, x). - -In the example below we "collapse" the cube along the wavelenth axis to -create a "white light" image and display it. Then we plot a 1D spectrum -from a given (x,y) position. - -:: - - >>> import imexam - >>> import matplotlib.pyplot as plt - - >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) - - >>> adcube = astrodata.open('../playdata/gmosifu_cube.fits') - >>> adcube.info() - - >>> # Sum along the wavelength axis to create a "white light" image - >>> summed_image = adcube[0].data.sum(axis=0) - >>> ds9.view(summed_image) - >>> ds9.scale('minmax') - - >>> # Plot a 1-D spectrum from the spatial position (14,25). - >>> plt.plot(adcube[0].data[:,24,13]) - >>> plt.show() # might be needed, depends on matplotlibrc interactive setting - - -Now that is nice but it would be nicer if we could plot the x-axis in units -of Angstroms instead of pixels. We use the AstroData's WCS handler, which is -based on ``gwcs.wcs.WCS`` to get the necessary information. A particularity -of ``gwcs.wcs.WCS`` is that it refers to the axes in the "natural" way, -(x, y, wlen) contrary to Python's (wlen, y, x). It truly requires you to pay -attention. - -:: - - >>> import matplotlib.pyplot as plt - - >>> adcube = astrodata.open('../playdata/gmosifu_cube.fits') - - # We get the wavelength axis in Angstroms at the position we want to - # extract, x=13, y=24. - # The wcs call returns a 3-element list, the third element ([2]) contains - # the wavelength values for each pixel along the wavelength axis. - - >>> length_wlen_axis = adcube[0].shape[0] # (wlen, y, x) - >>> wavelengths = adcube[0].wcs(13, 24, range(length_wlen_axis))[2] # (x, y, wlen) - - # We get the intensity along that axis - >>> intensity = adcube[0].data[:, 24, 13] # (wlen, y, x) - - # We plot - >>> plt.clf() - >>> plt.plot(wavelengths, intensity) - >>> plt.show() - - -Plot Data -========= -The main plotting package in Python is ``matplotlib``. We have used it in the -previous section on data cubes to plot a spectrum. There is also the project -called ``imexam`` which provides astronomy-specific tools for the -exploration and measurement of data. We have also used that package above to -display images to DS9. - -In this section we absolutely do not aim at covering all the features of -either package but rather to give a few examples that can get the readers -started in their exploration of the data and of the visualization packages. - -Refer to the projects web pages for full documentation. - -* Matplotlib: `https://matplotlib.org `_ -* imexam: `https://github.com/spacetelescope/imexam `_ - -Matplotlib ----------- -With Matplotlib you have full control on your plot. You do have to do a bit -for work to get it perfect though. However it can produce publication -quality plots. Here we just scratch the surface of Matplotlib. - -:: - - >>> import numpy as np - >>> import matplotlib.pyplot as plt - >>> from astropy import wcs - - >>> ad_image = astrodata.open('../playdata/N20170521S0925_forStack.fits') - >>> ad_spectrum = astrodata.open('../playdata/estgsS20080220S0078.fits') - - >>> # Line plot from image. Row #1044 (y-coordinate) - >>> line_index = 1043 - >>> line = ad_image[0].data[line_index, :] - >>> plt.clf() - >>> plt.plot(line) - >>> plt.show() - - >>> # Column plot from image, averaging across 11 pixels around colum #327 - >>> col_index = 326 - >>> width = 5 - >>> xlow = col_index - width - >>> xhigh = col_index + width + 1 - >>> thick_column = ad_image[0].data[:, xlow:xhigh] - >>> plt.clf() - >>> plt.plot(thick_column.mean(axis=1)) # mean along the width. - >>> plt.show() - >>> plt.ylim(0, 50) # Set the y-axis range - >>> plt.plot(thick_column.mean(axis=1)) - >>> plt.show() - - >>> # Contour plot for a section of an image. - >>> center = (1646, 2355) - >>> width = 15 - >>> xrange = (center[1]-width//2, center[1] + width//2 + 1) - >>> yrange = (center[0]-width//2, center[0] + width//2 + 1) - >>> blob = ad_image[0].data[yrange[0]:yrange[1], xrange[0]:xrange[1]] - >>> plt.clf() - >>> plt.imshow(blob, cmap='gray', origin='lower') - >>> plt.contour(blob) - >>> plt.show() - - >>> # Spectrum in pixels - >>> plt.clf() - >>> plt.plot(ad_spectrum[0].data) - >>> plt.show() - - >>> # Spectrum in Angstroms - >>> spec_wcs = wcs.WCS(ad_spectrum[0].hdr) - >>> pixcoords = np.array(range(ad_spectrum[0].data.shape[0])) - >>> wlen = spec_wcs.wcs_pix2world(pixcoords, 0)[0] - >>> plt.clf() - >>> plt.plot(wlen, ad_spectrum[0].data) - >>> plt.show() - - -imexam ------- -For those who have used IRAF, ``imexam`` is a well-known tool. The Python -``imexam`` reproduces many of of the features of its IRAF predecesor, the interactive mode of -course, but it also offers programmatic tools. One can even control DS9 -from Python. As for Matplotlib, here we really just scratch the surface of -what ``imexam`` has to offer. - -:: - - >>> import imexam - >>> from imexam.imexamine import Imexamine - - >>> ad_image = astrodata.open('../playdata/N20170521S0925_forStack.fits') - - # Display the image - >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) - >>> ds9.view(ad_image[0].data) - >>> ds9.scale('zscale') - - # Run in interactive mode. Try the various commands. - >>> ds9.imexam() - - # Use the programmatic interface - # First initialize an Imexamine object. - >>> plot = Imexamine() - - # Line plot from image. Row #1044 (y-coordinate) - >>> line_index = 1043 - >>> plot.plot_line(0, line_index, ad_image[0].data) - - # Column plot from image, averaging across 11 pixels around colum #327 - # There is no setting for this, so we have to do something similar - # to what we did with matplotlib. - >>> col_index = 326 - >>> width = 5 - >>> xlow = col_index - width - >>> xhigh = col_index + width + 1 - >>> thick_column = ad_image[0].data[:, xlow:xhigh] - >>> mean_column = thick_column.mean(axis=1) - >>> plot.plot_column(0, 0, np.expand_dims(mean_column, 1)) - - >>> # Contour plot for a section of an image. - >>> center = (1646, 2355) # in python coordinates - >>> width = 15 - >>> plot.contour_pars['ncolumns'][0] = width - >>> plot.contour_pars['nlines'][0] = width - >>> plot.contour(center[1], center[0], ad_image[0].data) diff --git a/astrodata/doc/usermanual/headers.rst b/astrodata/doc/usermanual/headers.rst deleted file mode 100644 index fec6cdee9c..0000000000 --- a/astrodata/doc/usermanual/headers.rst +++ /dev/null @@ -1,302 +0,0 @@ -.. headers.rst - -.. _headers: - -******************** -Metadata and Headers -******************** - -**Try it yourself** - -Download the data package (:ref:`datapkg`) if you wish to follow along and run the -examples. Then :: - - $ cd /ad_usermanual/playground - $ python - -You need to import Astrodata and the Gemini instrument configuration package. - -:: - - >>> import astrodata - >>> import gemini_instruments - -Astrodata Descriptors -===================== - -We show in this chapter how to use the Astrodata Descriptors. But first -let's explain what they are. - -Astrodata Descriptors provide a "header-to-concept" mapping that allows the -user to access header information from a unique interface, regardless of -which instrument the dataset is from. Like for the Astrodata Tags, the -mapping is coded in a configuration package separate from core Astrodata. -For Gemini instruments, that package is named ``gemini_instruments``. - -For example, if the user is interested to know the effective filter used -for an observation, normally one needs to know which specific keyword or -set of keywords to look at for that instrument. However, once the concept -of "filter" is coded as a Descriptor, the user only needs to call the -``filter_name()`` descriptor to retrieve the information. - -The Descriptors are closely associated with the Astrodata Tags. In fact, -they are implemented in the same ``AstroData`` class as the tags. Once -the specific ``AstroData`` class is selected (upon opening the file), all -the tags and descriptors for that class are defined. For example, all the -descriptor functions of GMOS data, ie. the functions that map a descriptor -concept to the actual header content, are defined in the ``AstroDataGmos`` -class. - -This is all completely transparent to the user. One simply opens the data -file and all the descriptors are ready to be used. - -.. note:: - Of course if the Descriptors have not been implemented for that specific - data, they will not work. They should all be defined for Gemini data. - For other sources, the headers can be accessed directly, one keyword at - a time. This type of access is discussed below. This is also useful - when the information needed is not associated with one of the standard - descriptors. - -To get the list of descriptors available for an ``AstroData`` object:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> ad.descriptors - ('airmass', 'amp_read_area', 'ao_seeing', ... - ...) - -Most Descriptor names are readily understood, but one can get a short -description of what the Descriptor refers to by calling the Python help -function. For example:: - - >>> help(ad.airmass) - >>> help(ad.filter_name) - -The full list of standard descriptors is available in the Appendix -:ref:`descriptors`. - -Accessing Metadata -================== - -Accessing Metadata with Descriptors ------------------------------------ -Whenever possible the Descriptors should be used to get information from -headers. This allows for maximum re-usability of the code as it will then -work on any datasets with an ``AstroData`` class. - -Here are a few examples using Descriptors:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - - >>> #--- print a value - >>> print('The airmass is : ', ad.airmass()) - The airmass is : 1.089 - - >>> #--- use a value to control the flow - >>> if ad.exposure_time() < 240.: - ... print('This is a short exposure.') - ... else: - ... print('This is a long exposure.') - This is a short exposure. - - >>> #--- multiply all extensions by their respective gain - >>> for ext, gain in zip(ad, ad.gain()): - ... ext *= gain - - >>> #--- do arithmetics - >>> fwhm_pixel = 3.5 - >>> fwhm_arcsec = fwhm_pixel * ad.pixel_scale() - -The return values for Descriptors depend on the nature of the information -being requested and the number of extensions in the ``AstroData`` object. -When the value has words, it will be string, if it is a number -it will be a float or an integer. -The dataset used in this section has 4 extensions. When the descriptor -value can be different for each extension, the descriptor will return a -Python list. - -:: - - >>> ad.airmass() - 1.089 - >>> ad.gain() - [2.03, 1.97, 1.96, 2.01] - >>> ad.filter_name() - 'open1-6&g_G0301' - -Some descriptors accept arguments. For example:: - - >>> ad.filter_name(pretty=True) - 'g' - -A full list of standard descriptors is available in the Appendix -:ref:`descriptors`. - - -Accessing Metadata Directly ---------------------------- -Not all header content is mapped to Descriptors, nor should it. Direct access -is available for header content falling outside the scope of the descriptors. - -One important thing to keep in mind is that the PHU (Primary Header Unit) and -the extension headers are accessed slightly differently. The attribute -``phu`` needs to be used for the PHU, and ``hdr`` for the extension headers. - -Here are some examples of direct header access:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - - >>> #--- Get keyword value from the PHU - >>> ad.phu['AOFOLD'] - 'park-pos.' - - >>> #--- Get keyword value from a specific extension - >>> ad[0].hdr['CRPIX1'] - 511.862999160781 - - >>> #--- Get keyword value from all the extensions in one call. - >>> ad.hdr['CRPIX1'] - [511.862999160781, 287.862999160781, -0.137000839218696, -224.137000839219] - - - -Whole Headers -------------- -Entire headers can be retrieved as ``fits`` ``Header`` objects:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> type(ad.phu) - - >>> type(ad[0].hdr) - - -In interactive mode, it is possible to print the headers on the screen as -follows:: - - >>> ad.phu - SIMPLE = T / file does conform to FITS standard - BITPIX = 16 / number of bits per data pixel - NAXIS = 0 / number of data axes - .... - - >>> ad[0].hdr - XTENSION= 'IMAGE ' / IMAGE extension - BITPIX = 16 / number of bits per data pixel - NAXIS = 2 / number of data axes - .... - - - -Updating, Adding and Deleting Metadata -====================================== -Header cards can be updated, added to, or deleted from the headers. The PHU -and the extensions headers are again accessed in a mostly identical way -with ``phu`` and ``hdr``, respectively. - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - -Add and update a keyword, without and with comment:: - - >>> ad.phu['NEWKEY'] = 50. - >>> ad.phu['NEWKEY'] = (30., 'Updated PHU keyword') - - >>> ad[0].hdr['NEWKEY'] = 50. - >>> ad[0].hdr['NEWKEY'] = (30., 'Updated extension keyword') - -Delete a keyword:: - - >>> del ad.phu['NEWKEY'] - >>> del ad[0].hdr['NEWKEY'] - - -World Co-ordinate System attribute -================================== - -The ``wcs`` of an extension's ``nddata`` attribute (eg. ``ad[0].nddata.wcs``; -see :ref:`pixel-data`) is stored as an instance of ``astropy.wcs.WCS`` (a -standard FITS WCS object) or ``gwcs.WCS`` (a `"Generalized WCS" or gWCS -`_ object). This defines a transformation -between array indices and some other co-ordinate system such as "World" -co-ordinates (see `APE 14 -`_). GWCS allows -multiple, almost arbitrary co-ordinate mappings from different calibration -steps (eg. CCD mosaicking, distortion correction & wavelength calibration) to -be combined in a single, reversible transformation chain --- but this -information cannot always be represented as a FITS standard WCS. If a gWCS -object is too complex to be defined by the basic FITS keywords, it gets stored -as a table extension named 'WCS' when the ``AstroData`` instance is saved to a -file (with the same EXTVER as the corresponding 'SCI' array) and the FITS -header keywords are updated to provide an approximation to the true WCS and an -additional keyword ``FITS-WCS`` is added with the value 'APPROXIMATE'. -The representation in the table is produced using -`ASDF `_, with one line of text per row. Likewise, -when the file is re-opened, the gWCS object gets recreated in ``wcs`` from the -table. If the transformation defined by the gWCS object can be accurately -described by standard FITS keywords, then no WCS extension is created as the -gWCS object can be created from these keywords when the file is re-opened. - -In future, it is intended to improve the quality of the FITS approximation -using the Simple Imaging Polynomial convention -(`SIP `_) or -a discrete sampling of the World co-ordinate -values will be stored as part of the FITS WCS, following `Greisen et al. (2006) -`_, S6 (in addition to the -definitive 'WCS' table), allowing standard FITS readers to report accurate -World co-ordinates for each pixel. - - -Adding Descriptors [Advanced Topic] -=================================== -For proper and complete instructions on how to create Astrodata Descriptors, -the reader is invited to refer to the Astrodata Programmer Manual. Here we -provide a simple introduction that might help some readers better understand -Astrodata Descriptors, or serve as a quick reference for those who have -written Astrodata Descriptors in the past but need a little refresher. - -The Astrodata Descriptors are defined in an ``AstroData`` class. The -``AstroData`` class specific to an instrument is located in a separate -package, not in ``astrodata``. For example, for Gemini instruments, all the -various ``AstroData`` classes are contained in the ``gemini_instruments`` -package. - -An Astrodata Descriptor is a function within the instrument's ``AstroData`` -class. The descriptor function is distinguished from normal functions by -applying the ``@astro_data_descriptor`` decorator to it. The descriptor -function returns the value(s) using a Python type, ``int``, ``float``, -``string``, ``list``; it depends on the value being returned. There is no -special "descriptor" type. - -Here is an example of code defining a descriptor:: - - class AstroDataGmos(AstroDataGemini): - ... - @astro_data_descriptor - def detector_x_bin(self): - def _get_xbin(b): - try: - return int(b.split()[0]) - except (AttributeError, ValueError): - return None - - binning = self.hdr.get('CCDSUM') - if self.is_single: - return _get_xbin(binning) - else: - xbin_list = [_get_xbin(b) for b in binning] - # Check list is single-valued - return xbin_list[0] if xbin_list == xbin_list[::-1] else None - -This descriptor returns the X-axis binning as a integer when called on a -single extension, or an object with only one extension, for example after the -GMOS CCDs have been mosaiced. If there are more than one extensions, it -will return a Python list or an integer if the binning is the same for all -the extensions. - -Gemini has defined a standard list of descriptors that should be defined -one way or another for each instrument to ensure the re-usability of our -algorithms. That list is provided in the Appendix :ref:`descriptors`. - -For more information on adding to Astrodata, see the Astrodata Programmer -Manual. diff --git a/astrodata/doc/usermanual/index.rst b/astrodata/doc/usermanual/index.rst deleted file mode 100644 index 9c5dff7a8e..0000000000 --- a/astrodata/doc/usermanual/index.rst +++ /dev/null @@ -1,23 +0,0 @@ -.. Astrodata User Manual master file, created from team template - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - Manually edited by KL Wed Jan 18 2017 - -=========== -User Manual -=========== - -.. admonition:: Document ID - - PIPE-USER-106_AstrodataUserManual - -.. toctree:: - :maxdepth: 2 - - intro - structure - iomef - tags - headers - data - tables diff --git a/astrodata/doc/usermanual/intro.rst b/astrodata/doc/usermanual/intro.rst deleted file mode 100644 index ebd615e9e8..0000000000 --- a/astrodata/doc/usermanual/intro.rst +++ /dev/null @@ -1,138 +0,0 @@ -.. intro.rst - -.. _intro_usermanual: - -************ -Introduction -************ - -This is the AstroData User's Manual. AstroData is a DRAGONS package. -The current chapter covers basic concepts -like what is the |astrodata| package and how to install it (together with the -other DRAGONS' packages). :ref:`Chapter 2 ` -explains with more details what is |AstroData| and how the data is represented -using it. :ref:`Chapter 3 ` describes input and output operations and -how multi-extension (MEF) FITS files are represented. :ref:`Chapter 4 ` -provides information regarding the |TagSet| class, its usage and a few advanced -topics. In :ref:`Chapter 5 ` you will find information about the FITS -headers and how to access/modify the metadata. The last two chapters, -:ref:`Chapter 6 ` and :ref:`Chapter 7 ` cover more details -about how to read, manipulate and write pixel data and tables, respectively. - - -If you are looking for a quick reference, please, have a look on the -:doc:`../cheatsheet`. - -Reference Documents -=================== - - - |DRAGONS| - - :doc:`../cheatsheet` - - |RSUserManual| - - |RSProgManual| - -What is |astrodata|? -==================== - -|astrodata| is a package that wraps together tools to represent internally -astronomical datasets stored on disks and to properly parse their metadata -using the |AstroData| and the |TagSet| classes. |astrodata| provides uniform -interfaces for working on datasets from different -instruments. Once a dataset has been opened with |astrodata|, the object -"knows about itself". Information like instrument, observation mode, and how -to access headers, is readily available through the uniform interface. All -the details are coded inside the class associated with the instrument, that -class then provides the interface. The appropriate class is selected -automatically when the file is opened and inspected by |astrodata|. - -Currently |astrodata| implements a representation for Multi-Extension FITS -(MEF) files. (Other representations can be implemented.) - - -.. _install: - -Installing Astrodata -==================== - -The |astrodata| package has a few dependencies, |astropy|, |numpy| and others. -The best way to get everything you need is to install Miniconda, and the -|dragons| stack from conda-forge and Gemini's public conda channel. - -|astrodata| itself is part of |DRAGONS|. It is available from the -repository, as a tar file, or as a conda package. The bare |astrodata| package -does not do much by itself, it needs a companion instrument definitions -package. For Gemini, this is ``gemini_instruments``, also included in -|DRAGONS|. - -.. note:: We are in the process of making ``astrodata`` an Astropy affiliated - package. For now, |DRAGONS| uses the ``astrodata`` integrated with - DRAGONS not the affiliated package. - -Installing Miniforge and the DRAGONS stack ------------------------------------------- -This is required whether you are installing |DRAGONS| from the -repository, the tar file or the conda package. - -To avoid duplication, please follow the installation guide provided in the -Recipe System User Manual: - - |RSUserInstall| - - -Smoke test the Astrodata installation -------------------------------------- -From the configured bash shell:: - - $ type python - python is hashed (/anaconda3/envs/dragons/python) - - Make sure that python is indeed pointing to the Anaconda environment you - have just set up. - -:: - - $ python - >>> import astrodata - >>> import gemini_instruments - - Expected result: Just a python prompt and no error messages. - -Source code availability ------------------------- -The source code is available on Github: - - ``_ - -.. _datapkg: - -Try it yourself -=============== - -**Try it yourself** - -Download the data package if you wish to follow along and run the -examples presented in this manual. It is available at: - - ``_ - -Unpack it:: - - $ cd - $ tar xvf ad_usermanual_datapkg-v1.tar - $ bunzip2 ad_usermanual/playdata/*.bz2 - -Then :: - - $ cd ad_usermanual/playground - $ python - - -Astrodata Support -================= - -Astrodata is developed and supported by staff at the Gemini Observatory. -Questions about the reduction of Gemini data should be directed to the -Gemini Helpdesk system at -``_ -The github issue tracker can be used to report software bugs in DRAGONS -(``_). diff --git a/astrodata/doc/usermanual/iomef.rst b/astrodata/doc/usermanual/iomef.rst deleted file mode 100644 index 8bb228da24..0000000000 --- a/astrodata/doc/usermanual/iomef.rst +++ /dev/null @@ -1,546 +0,0 @@ -.. iomef.rst - -.. _iomef: - -************************************************************ -Input and Output Operations and Extension Manipulation - MEF -************************************************************ - -|AstroData| is not intended to be Multi-Extension FITS (MEF) centric. The core -is independent of the file format. At Gemini, our data model uses MEF. -Therefore we have implemented a FITS handler that maps a MEF to the -internal |AstroData| representation. A different handler can be implemented -for a different file format. - -In this chapter, we present examples that will help the reader understand how -to access the information stored in a MEF with the |AstroData| object and -understand that mapping. - -**Try it yourself** - -Download the data package (:ref:`datapkg`) if you wish to follow along and run the -examples. Then :: - - $ cd /ad_usermanual/playground - $ python - - -Imports -======= - -Before doing anything, you need to import |AstroData| and the Gemini instrument -configuration package |gemini_instruments|. - -:: - - >>> import astrodata - >>> import gemini_instruments - - -Open and access existing dataset -================================ - -Read in the dataset -------------------- - -The file on disk is loaded into the |AstroData| class associated with the -instrument the data is from. This association is done automatically based on -header content. - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> type(ad) - - -From now on, ``ad`` knows it is GMOS data. It knows how to access its headers -and when using the Recipe System (|recipe_system|), it will trigger the -selection of the GMOS primitives and recipes. - -The original path and filename are stored in the object. If you were to write -the |AstroData| object to disk without specifying anything, those path and -filename would be used. :: - - >>> ad.path - '../playdata/N20170609S0154.fits' - >>> ad.filename - 'N20170609S0154.fits' - - -Accessing the content of a MEF file ------------------------------------ - -Accessing pixel data, headers, and tables will be covered in detail in the -following chapters. Here we just introduce the basic content interface. - -For details on the |AstroData| structure, please refer to the -:ref:`previous chapter `. - -|AstroData| uses |NDData| as the core of its structure. Each FITS extension -becomes a |NDAstroData| object, subclassed from |NDData|, and is added to -a list. - -Pixel data -^^^^^^^^^^ - -To access pixel data, the list index and the ``.data`` attribute are used. That -returns a :class:`numpy.ndarray`. The list of |NDAstroData| is zero-indexed. -*Extension number 1 in a MEF is index 0 in an |AstroData| object*. :: - - >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - >>> data = ad[0].data - >>> type(data) - - >>> data.shape - (2112, 256) - -Remember that in a :class:`~numpy.ndarray` the y-axis is the first number. - -The variance and data quality planes, the VAR and DQ planes in Gemini MEF -files, are represented by the ``.variance`` and ``.mask`` attributes, -respectively. They are not their own "extension", they don't have their -own index in the list, unlike in a MEF. They are attached to the pixel data, -packaged together by the |NDAstroData| object. They are represented as -:class:`numpy.ndarray` just like the pixel data :: - - >>> var = ad[0].variance - >>> dq = ad[0].mask - -Tables -^^^^^^ -Tables in the MEF file will also be loaded into the |AstroData| object. If a table -is associated with a specific science extension through the EXTVER header keyword, that -table will be packaged within the same AstroData extension as the pixel data. -The |AstroData| "extension" is the |NDAstroData| object plus any table or other pixel -array. If the table is not associated with a specific extension and applies -globally, it will be added to the AstroData object as a global addition. No -indexing will be required to access it. In the example below, one ``OBJCAT`` is -associated with each extension, while the ``REFCAT`` has a global scope :: - - >>> ad.info() - Filename: ../playdata/N20170609S0154_varAdded.fits - Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED - PREPARED SIDEREAL - - Pixels Extensions - Index Content Type Dimensions Format - [ 0] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) uint16 - .OBJCAT Table (6, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - [ 1] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) uint16 - .OBJCAT Table (8, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - [ 2] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) uint16 - .OBJCAT Table (7, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - [ 3] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) uint16 - .OBJCAT Table (5, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - - Other Extensions - Type Dimensions - .REFCAT Table (245, 16) - - -The tables are stored internally as :class:`astropy.table.Table` objects. :: - - >>> ad[0].OBJCAT - - NUMBER X_IMAGE Y_IMAGE ... REF_MAG_ERR PROFILE_FWHM PROFILE_EE50 - int32 float32 float32 ... float32 float32 float32 - ------ ------- ------- ... ----------- ------------ ------------ - 1 283.461 55.4393 ... 0.16895 -999.0 -999.0 - ... - >>> type(ad[0].OBJCAT) - - - >>> refcat = ad.REFCAT - >>> type(refcat) - - - -Headers -^^^^^^^ -Headers are stored in the |NDAstroData| ``.meta`` attribute as :class:`astropy.io.fits.Header` objects, -which is a form of Python ordered dictionaries. Headers associated with extensions -are stored with the corresponding |NDAstroData| object. The MEF Primary Header -Unit (PHU) is stored "globally" in the |AstroData| object. Note that when slicing an |AstroData| object, -for example copying over just the first extension, the PHU will follow. The -slice of an |AstroData| object is an |AstroData| object. -Headers can be accessed directly, or for some predefined concepts, the use of -Descriptors is preferred. See the chapters on headers for details. - -Using Descriptors:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> ad.filter_name() - 'open1-6&g_G0301' - >>> ad.filter_name(pretty=True) - 'g' - -Using direct header access:: - - >>> ad.phu['FILTER1'] - 'open1-6' - >>> ad.phu['FILTER2'] - 'g_G0301' - -Accessing the extension headers:: - - >>> ad.hdr['CCDSEC'] - ['[1:512,1:4224]', '[513:1024,1:4224]', '[1025:1536,1:4224]', '[1537:2048,1:4224]'] - >>> ad[0].hdr['CCDSEC'] - '[1:512,1:4224]' - - With descriptors: - >>> ad.array_section(pretty=True) - ['[1:512,1:4224]', '[513:1024,1:4224]', '[1025:1536,1:4224]', '[1537:2048,1:4224]'] - - -Modify Existing MEF Files -========================= -Before you start modify the structure of an |AstroData| object, you should be -familiar with it. Please make sure that you have read the previous chapter -on :ref:`the structure of the AstroData object `. - -Appending an extension ----------------------- -In this section, we take an extension from one |AstroData| object and append it -to another. - -Here is an example appending a whole AstroData extension, with pixel data, -variance, mask and tables. - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> advar = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - - >>> ad.info() - Filename: ../playdata/N20170609S0154.fits - Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED - Pixels Extensions - Index Content Type Dimensions Format - [ 0] science NDAstroData (2112, 288) uint16 - [ 1] science NDAstroData (2112, 288) uint16 - [ 2] science NDAstroData (2112, 288) uint16 - [ 3] science NDAstroData (2112, 288) uint16 - - >>> ad.append(advar[3]) - >>> ad.info() - Filename: ../playdata/N20170609S0154.fits - Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED - Pixels Extensions - Index Content Type Dimensions Format - [ 0] science NDAstroData (2112, 288) uint16 - [ 1] science NDAstroData (2112, 288) uint16 - [ 2] science NDAstroData (2112, 288) uint16 - [ 3] science NDAstroData (2112, 288) uint16 - [ 4] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) int16 - .OBJCAT Table (5, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - - >>> ad[4].hdr['EXTVER'] - 4 - >>> advar[3].hdr['EXTVER'] - 4 - -As you can see above, the fourth extension of ``advar``, along with everything -it contains was appended at the end of the first |AstroData| object. However, -note that, because the EXTVER of the extension in ``advar`` was 4, there are -now two extensions in ``ad`` with this EXTVER. This is not a problem because -EXTVER is not used by |AstroData| (it uses the index instead) and it is handled -only when the file is written to disk. - -In this next example, we are appending only the pixel data, leaving behind the other -associated data. One can attach the headers too, like we do here. - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> advar = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - - >>> ad.append(advar[3].data, header=advar[3].hdr) - >>> ad.info() - Filename: ../playdata/N20170609S0154.fits - Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED - Pixels Extensions - Index Content Type Dimensions Format - [ 0] science NDAstroData (2112, 288) uint16 - [ 1] science NDAstroData (2112, 288) uint16 - [ 2] science NDAstroData (2112, 288) uint16 - [ 3] science NDAstroData (2112, 288) uint16 - [ 4] science NDAstroData (2112, 256) float32 - -Notice how a new extension was created but ``variance``, ``mask``, the OBJCAT -table and OBJMASK image were not copied over. Only the science pixel data was -copied over. - -Please note, there is no implementation for the "insertion" of an extension. - -Removing an extension or part of one ------------------------------------- -Removing an extension or a part of an extension is straightforward. The -Python command :func:`del` is used on the item to remove. Below are a few -examples, but first let us load a file :: - - >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - >>> ad.info() - -As you go through these examples, check the new structure with :func:`ad.info()` -after every removal to see how the structure has changed. - -Deleting a whole |AstroData| extension, the fourth one :: - - >>> del ad[3] - -Deleting only the variance array from the second extension :: - - >>> ad[1].variance = None - -Deleting a table associated with the first extension :: - - >>> del ad[0].OBJCAT - -Deleting a global table, not attached to a specific extension :: - - >>> del ad.REFCAT - - - -Writing back to disk -==================== -The :class:`~astrodata.AstroData` layer takes care of converting -the |AstroData| object back to a MEF file on disk. When writing to disk, -one should be aware of the path and filename information associated -with the |AstroData| object. - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> ad.path - '../playdata/N20170609S0154.fits' - >>> ad.filename - 'N20170609S0154.fits' - -Writing to a new file ---------------------- -There are various ways to define the destination for the new FITS file. -The most common and natural way is :: - - >>> ad.write('new154.fits') - - >>> ad.write('new154.fits', overwrite=True) - -This will write a FITS file named 'new154.fits' in the current directory. -With ``overwrite=True``, it will overwrite the file if it already exists. -A path can be prepended to the filename if the current directory is not -the destination. -Note that ``ad.filename`` and ``ad.path`` have not changed, we have just -written to the new file, the |AstroData| object is in no way associated -with that new file. :: - - >>> ad.path - '../playdata/N20170609S0154.fits' - >>> ad.filename - 'N20170609S0154.fits' - -If you want to create that association, the ``ad.filename`` and ``ad.path`` -needs to be modified first. For example:: - - >>> ad.filename = 'new154.fits' - >>> ad.write(overwrite=True) - - >>> ad.path - '../playdata/new154.fits' - >>> ad.filename - 'new154.fits' - -Changing ``ad.filename`` also changes the filename in the ``ad.path``. The -sequence above will write 'new154.fits' not in the current directory but -rather to the directory that is specified in ``ad.path``. - -WARNING: :func:`ad.write` has an argument named ``filename``. Setting ``filename`` -in the call to :func:`ad.write`, as in ``ad.write(filename='new154.fits')`` will NOT -modify ``ad.filename`` or ``ad.path``. The two "filenames", one a method argument -the other a class attribute have no association to each other. - - -Updating an existing file on disk ----------------------------------- -Updating an existing file on disk requires explicitly allowing overwrite. - -If you have not written 'new154.fits' to disk yet (from previous section) :: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> ad.write('new154.fits', overwrite=True) - -Now let's open 'new154.fits', and write to it :: - - >>> adnew = astrodata.open('new154.fits') - >>> adnew.write(overwrite=True) - - -A note on FITS header keywords ------------------------------- - -.. _fitskeys: - -When writing an |AstroData| object to disk as a FITS file, it is necessary to add or -update header keywords to represent some of the internally-stored information. Any -extensions that did not originally belong to this |AstroData| will be assigned new -EXTVER keywords to avoid conflicts with existing extensions, and the internal WCS is -converted to the appropriate FITS keywords. Note that in some cases it may not be -possible for standard FITS keywords to accurately represent the true WCS. In such -cases, the FITS keywords are written as an approximation to the true WCS, together -with an additional keyword :: - - FITS-WCS= 'APPROXIMATE' / FITS WCS is approximate - -to indicate this. The accurate WCS is written as an additional FITS extension with -``EXTNAME='WCS'`` that AstroData will recognize when the file is read back in. The -``WCS`` extension will not be written to disk if there is an accurate FITS -representation of the WCS (e.g., for a simple image). - - -Create New MEF Files -==================== - -A new MEF file can be created from an existing, maybe modified, file or it -can be created from scratch. We discuss both cases here. - -Create New Copy of MEF Files ----------------------------- -To create a new copy of a MEF file, modified or not, the user has already -been given most of the tools in the sections above. Yet, let's throw a -couple examples for completeness. - -Basic example -^^^^^^^^^^^^^ -As seen above, a MEF file can be opened with |astrodata|, the |AstroData| -object can be modified (or not), and then written back to disk under a -new name. :: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - ... optional modifications here ... - >>> ad.write('newcopy.fits') - - -Needing true copies in memory -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Sometimes it is a true copy in memory that is needed. This is not specific -to MEF. In Python, doing something like ``adnew = ad`` does not create a -new copy of the AstrodData object; it just gives it a new name. If you -modify ``adnew`` you will be modifying ``ad`` too. They point to the same -block of memory. - -To create a true independent copy, the ``deepcopy`` utility needs to be used. :: - - >>> from copy import deepcopy - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> adcopy = deepcopy(ad) - -Be careful using ``deepcopy``, your memory could balloon really fast. Use it -only when truly needed. - - -Create New MEF Files from Scratch ---------------------------------- -Before one creates a new MEF file on disk, one has to create the AstroData -object that will be eventually written to disk. The |AstroData| object -created also needs to know that it will have to be written using the MEF -format. This is fortunately handled fairly transparently by |astrodata|. - -The key to associating the FITS data to the |AstroData| object is simply to -create the |AstroData| object from :mod:`astropy.io.fits` header objects. Those -will be recognized by |astrodata| as FITS and the constructor for FITS will be -used. The user does not need to do anything else special. Here is how it is -done. - -Create a MEF with basic header and data array set to zeros -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -:: - - >>> import numpy as np - >>> from astropy.io import fits - - >>> phu = fits.PrimaryHDU() - - >>> pixel_data = np.zeros((100,100)) - - >>> hdu = fits.ImageHDU() - >>> hdu.data = pixel_data - - >>> ad = astrodata.create(phu) - >>> ad.append(hdu, name='SCI') - - or another way to do the last two blocs: - >>> hdu = fits.ImageHDU(data=pixel_data, name='SCI') - >>> ad = astrodata.create(phu, [hdu]) - -Then it is just a matter of calling ``ad.write('somename.fits')`` on that -new ``Astrodata`` object. - -Associate a pixel array with a science pixel array -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Only main science ("SCI") pixel arrays are added as slices to an astrodata -object. It not uncommon to have pixels information associated with those -main science pixels, for example an object mask where marked pixels in the mask -are directly associated with sources in the science array. - -Such pixel arrays are added to specific slice of the astrodata object they are -associated with. - -Building on the astrodata object we created in the previous subsection, one -would add a pixel array to the first slice of the astrodata object as -follows: - - >>> extra_data = np.ones((100, 100)) - >>> ad[0].EXTRADATA = extra_data - -When the file is written to disk as a MEF, an extension will be created with -``EXTNAME = EXTRADATA`` and an ``EXTVER`` that matches the slice's ``EXTVER``, -in this case is would be ``1``. - -Represent a table as a FITS binary table in an ``AstroData`` object -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -One first needs to create a table, either an :class:`astropy.table.Table` -or a :class:`~astropy.io.fits.BinTableHDU`. See the |astropy| documentation -on tables and this manual's :ref:`section ` dedicated to tables for -more information. - -In the first example, we assume that ``my_astropy_table`` is -a :class:`~astropy.table.Table` ready to be attached to an |AstroData| -object. (Warning: we have not created ``my_astropy_table`` therefore the -example below will not run, though this is how it would be done.) - -:: - - >>> phu = fits.PrimaryHDU() - >>> ad = astrodata.create(phu) - - >>> astrodata.add_header_to_table(my_astropy_table) - >>> ad.append(my_astropy_table, name='SMAUG') - - -In the second example, we start with a FITS :class:`~astropy.io.fits.BinTableHDU` -and attach it to a new |AstroData| object. (Again, we have not created -``my_fits_table`` so the example will not run.) :: - - >>> phu = fits.PrimaryHDU() - >>> ad = astrodata.create(phu) - >>> ad.append(my_fits_table, name='DROGON') - -As before, once the |AstroData| object is constructed, the ``ad.write()`` -method can be used to write it to disk as a MEF file. diff --git a/astrodata/doc/usermanual/structure.rst b/astrodata/doc/usermanual/structure.rst deleted file mode 100644 index 591edd0369..0000000000 --- a/astrodata/doc/usermanual/structure.rst +++ /dev/null @@ -1,190 +0,0 @@ -.. structure.rst - -.. _structure: - -******************** -The AstroData Object -******************** - -The |AstroData| object is an internal representation of a file on disk. -As of this version, only a FITS layer has been written, but |AstroData| itself -is not limited to FITS. - -The internal structure of the |AstroData| object makes uses of -:class:`astropy.nddata.NDData`, :mod:`astropy.table`, and -:class:`astropy.io.fits.Header`, the latter simply because it is a -convenient ordered dictionary. - -**Try it yourself** - -Download the data package (:ref:`datapkg`) if you wish to follow along and run the -examples. Then :: - - $ cd /ad_usermanual/playground - $ python - - -Global vs Extension-specific -============================ -At the very top level, the structure is divided in two types of information. -In the first category, there is the information that applies to the data -globally, for example the information that would be stored in a FITS Primary -Header Unit, a table from a catalog that matches the RA and DEC of the field, -etc. In the second category, there is the information specific to individual -science pixel extensions, for example the gain of the amplifier, the data -themselves, the error on those data, etc. - -Let us look at an example. The :meth:`~astrodata.AstroData.info` method shows -the content of the |AstroData| object and its organization, from the user's -perspective.:: - - >>> import astrodata - >>> import gemini_instruments - - >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - >>> ad.info() - Filename: N20170609S0154_varAdded.fits - Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED - PREPARED SIDEREAL - - Pixels Extensions - Index Content Type Dimensions Format - [ 0] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) uint16 - .OBJCAT Table (6, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - [ 1] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) uint16 - .OBJCAT Table (8, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - [ 2] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) uint16 - .OBJCAT Table (7, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - [ 3] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) uint16 - .OBJCAT Table (5, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - - Other Extensions - Type Dimensions - .REFCAT Table (245, 16) - - -The "Pixel Extensions" contain the pixel data. Each extension is represented -individually in a list (0-indexed like all Python lists). The science pixel -data, its associated metadata (extension header), and any other pixel or table -extensions directly associated with that science pixel data are stored in -a |NDAstroData| object which is a subclass of astropy |NDData|. We will -return to this structure later. An |AstroData| extension is accessed like -any list: ``ad[0]``. To access the science pixels, one uses ``ad[0].data``; for -the object mask of the first extension, ``ad[0].OBJMASK``. - -In the example above, the "Other Extensions" at the bottom of the -:meth:`~astrodata.AstroData.info` display contains a ``REFCAT`` table which in -this case is a list of stars from a catalog that overlaps the field of view -covered by the pixel data. The "Other Extensions" are global extensions. They -are not attached to any pixel extension in particular. To access a global -extension one simply uses the name of that extension: ``ad.REFCAT``. - - -Organization of the Global Information -====================================== -All the global information is stored in attributes of the |AstroData| object. -The global headers, or Primary Header Unit (PHU), is stored in the ``phu`` -attribute as an :class:`astropy.io.fits.Header`. - -Any global tables, like ``REFCAT`` above, are stored in the private attribute -``_tables`` as a Python dictionary with the name (eg. "REFCAT") as the key. -All tables are stored as :class:`astropy.table.Table`. Access to those table -is done using the key directly as if it were a normal attribute, eg. -``ad.REFCAT``. Header information for the table, if read in from a FITS table, -is stored in the ``meta`` attribute of the :class:`astropy.table.Table`, eg. -``ad.REFCAT.meta['header']``. It is for information only, it is not used. - - -Organization of the Extension-specific Information -================================================== -The pixel data are stored in the |AstroData| attribute ``nddata`` as a list -of |NDAstroData| object. The |NDAstroData| object is a subclass of astropy -|NDData| and it is fully compatible with any function expecting an |NDData| as -input. The pixel extensions are accessible through slicing, eg. ``ad[0]`` or -even ``ad[0:2]``. A slice of an AstroData object is an AstroData object, and -all the global attributes are kept. For example:: - - >>> ad[0].info() - Filename: N20170609S0154_varAdded.fits - Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED - PREPARED SIDEREAL - - Pixels Extensions - Index Content Type Dimensions Format - [ 0] science NDAstroData (2112, 256) float32 - .variance ndarray (2112, 256) float32 - .mask ndarray (2112, 256) uint16 - .OBJCAT Table (6, 43) n/a - .OBJMASK ndarray (2112, 256) uint8 - - Other Extensions - Type Dimensions - .REFCAT Table (245, 16) - -Note how ``REFCAT`` is still present. - -The science data is accessed as ``ad[0].data``, the variance as ``ad[0].variance``, -and the data quality plane as ``ad[0].mask``. Those familiar with astropy -|NDData| will recognize the structure "data, error, mask", and will notice -some differences. First |AstroData| uses the variance for the error plane, not -the standard deviation. Another difference will be evident only when one looks -at the content of the mask. |NDData| masks contain booleans, |AstroData| masks -are ``uint16`` bit mask that contains information about the type of bad pixels -rather than just flagging them a bad or not. Since ``0`` is equivalent to -``False`` (good pixel), the |AstroData| mask is fully compatible with the -|NDData| mask. - -Header information for the extension is stored in the |NDAstroData| ``meta`` -attribute. All table and pixel extensions directly associated with the -science extension are also stored in the ``meta`` attribute. - -Technically, an extension header is located in ``ad.nddata[0].meta['header']``. -However, for obviously needed convenience, the normal way to access that header -is ``ad[0].hdr``. - -Tables and pixel arrays associated with a science extension are -stored in ``ad.nddata[0].meta['other']`` as a dictionary keyed on the array -name, eg. ``OBJCAT``, ``OBJMASK``. As it is for global tables, astropy tables -are used for extension tables. The extension tables and extra pixel arrays are -accessed, like the global tables, by using the table name rather than the long -format, for example ``ad[0].OBJCAT`` and ``ad[0].OBJMASK``. - -When reading a FITS Table, the header information is stored in the -``meta['header']`` of the table, eg. ``ad[0].OBJCAT.meta['header']``. That -information is not used, it is simply a place to store what was read from disk. - -The header of a pixel extension directly associated with the science extension -should match that of the science extension. Therefore such headers are not -stored in |AstroData|. For example, the header of ``ad[0].OBJMASK`` is the -same as that of the science, ``ad[0].hdr``. - -The world coordinate system (WCS) is stored internally in the ``wcs`` attribute -of the |NDAstroData| object. It is constructed from the header keywords when -the FITS file is read from disk, or directly from the ``WCS`` extension if -present (see :ref:`the next chapter `). If the WCS is modified (for -example, by refining the pointing or attaching a more accurate wavelength -calibration), the FITS header keywords are not updated and therefore they should -never be used to determine the world coordinates of any pixel. These keywords are -only updated when the object is written to disk as a FITS file. The WCS is -retrieved as follows: ``ad[0].wcs``. - - -A Note on Memory Usage -====================== -When an file is opened, the headers are loaded into memory, but the pixels -are not. The pixel data are loaded into memory only when they are first -needed. This is not real "memory mapping", more of a delayed loading. This -is useful when someone is only interested in the metadata, especially when -the files are very large. diff --git a/astrodata/doc/usermanual/tables.rst b/astrodata/doc/usermanual/tables.rst deleted file mode 100644 index 20316d3874..0000000000 --- a/astrodata/doc/usermanual/tables.rst +++ /dev/null @@ -1,228 +0,0 @@ -.. tables.rst - -.. _tables: - -********** -Table Data -********** -**Try it yourself** - -Download the data package (:ref:`datapkg`) if you wish to follow along and run the -examples. Then :: - - $ cd /ad_usermanual/playground - $ python - -Then import core astrodata and the Gemini astrodata configurations. :: - - >>> import astrodata - >>> import gemini_instruments - -Tables and Astrodata -==================== -Tables are stored as ``astropy.table`` ``Table`` class. FITS tables too -are represented in Astrodata as ``Table`` and FITS headers are stored in -the NDAstroData `.meta` attribute. Most table access should be done -through the ``Table`` interface. The best reference on ``Table`` is the -Astropy documentation itself. In this chapter we covers some common -examples to get the reader started. - -The ``astropy.table`` documentation can be found at: ``_ - - -Operate on a Table -================== - -Let us open a file with tables. Some tables are associated with specific -extensions, and there is one table that is global to the `AstroData` object. - -:: - - >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') - >>> ad.info() - -To access the global table named ``REFCAT``:: - - >>> ad.REFCAT - -To access the ``OBJCAT`` table in the first extension :: - - >>> ad[0].OBJCAT - - -Column and Row Operations -------------------------- -Columns are named. Those names are used to access the data as columns. -Rows are not names and are simply represented as a sequential list. - -Read columns and rows -+++++++++++++++++++++ -To get the names of the columns present in the table:: - - >>> ad.REFCAT.colnames - ['Id', 'Cat_Id', 'RAJ2000', 'DEJ2000', 'umag', 'umag_err', 'gmag', - 'gmag_err', 'rmag', 'rmag_err', 'imag', 'imag_err', 'zmag', 'zmag_err', - 'filtermag', 'filtermag_err'] - -Then it is easy to request the values for specific columns:: - - >>> ad.REFCAT['zmag'] - >>> ad.REFCAT['zmag', 'zmag_err'] - -To get the content of a specific row, row 10 in this case:: - - >>> ad.REFCAT[9] - -To get the content of a specific row(s) from a specific column(s):: - - >>> ad.REFCAT['zmag'][4] - >>> ad.REFCAT['zmag'][4:10] - >>> ad.REFCAT['zmag', 'zmag_err'][4:10] - -Change values -+++++++++++++ -Assigning new values works in a similar way. When working on multiple elements -it is important to feed a list that matches in size with the number of elements -to replace. - -:: - - >>> ad.REFCAT['imag'][4] = 20.999 - >>> ad.REFCAT['imag'][4:10] = [5, 6, 7, 8, 9, 10] - - >>> overwrite_col = [0] * len(ad.REFCAT) # a list of zeros, size = nb of rows - >>> ad.REFCAT['imag_err'] = overwrite_col - -Add a row -+++++++++ -To append a row, there is the ``add_row()`` method. The length of the row -should match the number of columns:: - - >>> new_row = [0] * len(ad.REFCAT.colnames) - >>> new_row[1] = '' # Cat_Id column is of "str" type. - >>> ad.REFCAT.add_row(new_row) - -Add a column -++++++++++++ -Adding a new column can be more involved. If you need full control, please -see the AstroPy Table documentation. For a quick addition, which might be -sufficient for your use case, we simply use the "dictionary" technique. Please -note that when adding a column, it is important to ensure that all the -elements are of the same type. Also, if you are planning to use that table -in IRAF/PyRAF, we recommend not using 64-bit types. - -:: - - >>> import numpy as np - - >>> new_column = [0] * len(ad.REFCAT) - >>> # Ensure that the type is int32, otherwise it will default to int64 - >>> # which generally not necessary. Also, IRAF 32-bit does not like it. - >>> new_column = np.array(new_column).astype(np.int32) - >>> ad.REFCAT['my_column'] = new_column - -If you are going to write that table back to disk as a FITS Bintable, then -some additional headers need to be set. Astrodata will take care of that -under the hood when the `write` method is invoked. - -:: - - >>> ad.write('myfile_with_modified_table.fits') - - -Selection and Rejection Operations ----------------------------------- -Normally, one does not know exactly where the information needed is located -in a table. Rather some sort of selection needs to be done. This can also -be combined with various calculations. We show two such examples here. - -Select a table element from criterion -+++++++++++++++++++++++++++++++++++++ - -:: - - >>> # Get the magnitude of a star selected by ID number - >>> ad.REFCAT['zmag'][ad.REFCAT['Cat_Id'] == '1237662500002005475'] - - >>> # Get the ID and magnitude of all the stars brighter than zmag 18. - >>> ad.REFCAT['Cat_Id', 'zmag'][ad.REFCAT['zmag'] < 18.] - - -Rejection and selection before statistics -+++++++++++++++++++++++++++++++++++++++++ - -:: - - >>> t = ad.REFCAT # to save typing - - >>> # The table has "NaN" values. ("Not a number") We need to ignore them. - >>> t['zmag'].mean() - nan - >>> # applying rejection of NaN values: - >>> t['zmag'][np.where(~np.isnan(t['zmag']))].mean() - 20.377306 - - - -Accessing FITS table headers directly -------------------------------------- -If for some reason you need to access the FITS table headers directly, here -is how to do it. It is very unlikely that you will need this. - -To see the FITS headers:: - - >>> ad.REFCAT.meta['header'] - >>> ad[0].OBJCAT.meta['header'] - -To retrieve a specific FITS table header:: - - >>> ad.REFCAT.meta['header']['TTYPE3'] - 'RAJ2000' - >>> ad[0].OBJCAT.meta['header']['TTYPE3'] - 'Y_IMAGE' - -To retrieve all the keyword names matching a selection:: - - >>> keynames = [key for key in ad.REFCAT.meta['header'] if key.startswith('TTYPE')] - - - -Create a Table -============== - -To create a table that can be added to an ``AstroData`` object and eventually -written to disk as a FITS file, the first step is to create an Astropy -``Table``. - -Let us first add our data to NumPy arrays, one array per column:: - - >>> import numpy as np - - >>> snr_id = np.array(['S001', 'S002', 'S003']) - >>> feii = np.array([780., 78., 179.]) - >>> pabeta = np.array([740., 307., 220.]) - >>> ratio = pabeta / feii - -Then build the table from that data:: - - >>> from astropy.table import Table - - >>> my_astropy_table = Table([snr_id, feii, pabeta, ratio], - ... names=('SNR_ID', 'FeII', 'PaBeta', 'ratio')) - - -Now we append this Astropy ``Table`` to a new ``AstroData`` object. - -:: - - >>> # Since we are going to write a FITS, we build the AstroData object - >>> # from FITS objects. - >>> from astropy.io import fits - - >>> phu = fits.PrimaryHDU() - >>> ad = astrodata.create(phu) - >>> ad.MYTABLE = my_astropy_table - >>> ad.info() - >>> ad.MYTABLE - - >>> ad.write('new_table.fits') diff --git a/astrodata/doc/usermanual/tags.rst b/astrodata/doc/usermanual/tags.rst deleted file mode 100644 index 6caaf387bd..0000000000 --- a/astrodata/doc/usermanual/tags.rst +++ /dev/null @@ -1,172 +0,0 @@ -.. tags.rst - -.. _tags: - -************** -Astrodata Tags -************** - -What are the Astrodata Tags? -============================ -The Astrodata Tags identify the data represented in the |AstroData| object. -When a file on disk is opened with |astrodata|, the headers are inspected to -identify which specific |AstroData| class needs to be loaded, -:class:`~gemini_instruments.gmos.AstroDataGmos`, -:class:`~gemini_instruments.niri.AstroDataNiri`, etc. Based on the class the data is -associated with, a list of "tags" will be defined. The tags will tell whether the -file is a flatfield or a dark, if it is a raw dataset, or if it has been processed by the -recipe system, if it is imaging or spectroscopy. The tags will tell the -users and the system what that data is and also give some information about -the processing status. - -As a side note, the tags are used by DRAGONS Recipe System to match recipes -and primitives to the data. - -Using the Astrodata Tags -======================== -**Try it yourself** - -Download the data package (:ref:`datapkg`) if you wish to follow along and run the -examples. Then :: - - $ cd /ad_usermanual/playground - $ python - -Before doing anything, you need to import |astrodata| and the Gemini instrument -configuration package (|gemini_instruments|). - -:: - - >>> import astrodata - >>> import gemini_instruments - -Let us open a Gemini dataset and see what tags we get:: - - >>> ad = astrodata.open('../playdata/N20170609S0154.fits') - >>> ad.tags - {'RAW', 'GMOS', 'GEMINI', 'NORTH', 'SIDEREAL', 'UNPREPARED', 'IMAGE', 'ACQUISITION'} - -The file we loaded is raw, GMOS North data. It is a 2D image and it is an -acquisition image, not a science observation. The "UNPREPARED" tag indicates -that the file has never been touched by the Recipe System which runs a -"prepare" primitive as the first step of each recipe. - -Let's try another :: - - >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') - >>> ad.tags - {'GMOS', 'GEMINI', 'NORTH', 'SIDEREAL', 'OVERSCAN_TRIMMED', 'IMAGE', - 'OVERSCAN_SUBTRACTED', 'PREPARED'} - -This file is a science GMOS North image. It has been processed by the -Recipe System. The overscan level has been subtracted and the overscan section -has been trimmed away. The tags do NOT include all the processing steps. Rather, -at least from the time being, it focuses on steps that matter when associating -calibrations. - -The tags can be used when coding. For example:: - - >>> if 'GMOS' in ad.tags: - ... print('I am GMOS') - ... else: - ... print('I am these instead:', ad.tags) - ... - -And:: - - >>> if {'IMAGE', 'GMOS'}.issubset(ad.tags): - ... print('I am a GMOS Image.') - ... - -Using typewalk -============== -In DRAGONS, there is a convenience tool that will list the Astrodata tags -for all the FITS file in a directory. - -To try it, from the shell, not Python, go to the "playdata" directory and -run typewalk:: - - % cd /ad_usermanual/playdata - % typewalk - - directory: /data/workspace/ad_usermanual/playdata - N20170521S0925_forStack.fits ...... (GEMINI) (GMOS) (IMAGE) (NORTH) (OVERSCAN_SUBTRACTED) (OVERSCAN_TRIMMED) (PREPARED) (SIDEREAL) - N20170521S0926_forStack.fits ...... (GEMINI) (GMOS) (IMAGE) (NORTH) (OVERSCAN_SUBTRACTED) (OVERSCAN_TRIMMED) (PREPARED) (PROCESSED) (PROCESSED_SCIENCE) (SIDEREAL) - N20170609S0154.fits ............... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED) - N20170609S0154_varAdded.fits ...... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (OVERSCAN_SUBTRACTED) (OVERSCAN_TRIMMED) (PREPARED) (SIDEREAL) - estgsS20080220S0078.fits .......... (GEMINI) (GMOS) (LONGSLIT) (LS) (PREPARED) (PROCESSED) (PROCESSED_SCIENCE) (SIDEREAL) (SOUTH) (SPECT) - gmosifu_cube.fits ................. (GEMINI) (GMOS) (IFU) (NORTH) (ONESLIT_RED) (PREPARED) (PROCESSED) (PROCESSED_SCIENCE) (SIDEREAL) (SPECT) - new154.fits ....................... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED) - Done DataSpider.typewalk(..) - -``typewalk`` can be used to select specific data based on tags, and even create -lists:: - - % typewalk --tags RAW - directory: /data/workspace/ad_usermanual/playdata - N20170609S0154.fits ............... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED) - new154.fits ....................... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED) - Done DataSpider.typewalk(..) - -:: - - % typewalk --tags RAW -o rawfiles.lis - % cat rawfiles.lis - # Auto-generated by typewalk, vv2.0 (beta) - # Written: Tue Mar 6 13:06:06 2018 - # Qualifying types: RAW - # Qualifying logic: AND - # ----------------------- - /Users/klabrie/data/tutorials/ad_usermanual/playdata/N20170609S0154.fits - /Users/klabrie/data/tutorials/ad_usermanual/playdata/new154.fits - - - -Creating New Astrodata Tags [Advanced Topic] -============================================ -For proper and complete instructions on how to create Astrodata Tags and -the |AstroData| class that hosts the tags, the reader is invited to refer to the -Astrodata Programmer Manual. Here we provide a simple introduction that -might help some readers better understand Astrodata Tags, or serve as a -quick reference for those who have written Astrodata Tags in the past but need -a little refresher. - -The Astrodata Tags are defined in an |AstroData| class. The |AstroData| -class specific to an instrument is located in a separate package, not in -|astrodata|. For example, for Gemini instruments, all the various |AstroData| -classes are contained in the |gemini_instruments| package. - -An Astrodata Tag is a function within the instrument's |AstroData| class. -The tag function is distinguished from normal functions by applying the -:func:`~astrodata.astro_data_tag` decorator to it. -The tag function returns a :class:`astrodata.TagSet`. - -For example:: - - class AstroDataGmos(AstroDataGemini): - ... - @astro_data_tag - def _tag_arc(self): - if self.phu.get('OBSTYPE) == 'ARC': - return TagSet(['ARC', 'CAL']) - -The tag function looks at the headers and if the keyword "OBSTYPE" is set -to "ARC", the tags "ARC" and "CAL" (for calibration) will be assigned to the -|AstroData| object. - -A whole suite of such tag functions is needed to fully characterize all -types of data an instrument can produce. - -Tags are about what the dataset is, not it's flavor. The Astrodata -"descriptors" (see the section on :ref:`headers`) will describe the flavor. -For example, tags will say that the data is an image, but the descriptor -will say whether it is B-band or R-band. Tags are used for recipe and -primitive selection. A way to understand the difference between a tag and -a descriptor is in terms of the recipe that will be selected: A GMOS image -will use the same recipe whether it's a B-band or R-band image. However, -a GMOS longslit spectrum will need a very different recipe. A bias is -reduced differently from a science image, there should be a tag differentiating -a bias from a science image. (There is for GMOS.) - -For more information on adding to Astrodata, see the Astrodata Programmer -Manual. diff --git a/astrodata/factory.py b/astrodata/factory.py deleted file mode 100644 index 8f1b5a62c9..0000000000 --- a/astrodata/factory.py +++ /dev/null @@ -1,144 +0,0 @@ -import logging -import os -from contextlib import contextmanager -from copy import deepcopy - -from astropy.io import fits - -LOGGER = logging.getLogger(__name__) - - -class AstroDataError(Exception): - pass - - -class AstroDataFactory: - - _file_openers = ( - fits.open, - ) - - def __init__(self): - self._registry = set() - - @staticmethod - @contextmanager - def _openFile(source): - """ - Internal static method that takes a ``source``, assuming that it is a - string pointing to a file to be opened. - - If this is the case, it will try to open the file and return an - instance of the appropriate native class to be able to manipulate it - (eg. ``HDUList``). - - If ``source`` is not a string, it will be returned verbatim, assuming - that it represents an already opened file. - - """ - if isinstance(source, (str, os.PathLike)): - stats = os.stat(source) - if stats.st_size == 0: - LOGGER.warning(f"File {source} is zero size") - - # try vs all handlers - for func in AstroDataFactory._file_openers: - try: - fp = func(source) - yield fp - except Exception: - # Just ignore the error. Assume that it is a not supported - # format and go for the next opener - pass - else: - if hasattr(fp, 'close'): - fp.close() - return - raise AstroDataError("No access, or not supported format for: {}" - .format(source)) - else: - yield source - - def addClass(self, cls): - """ - Add a new class to the AstroDataFactory registry. It will be used when - instantiating an AstroData class for a FITS file. - """ - if not hasattr(cls, '_matches_data'): - raise AttributeError("Class '{}' has no '_matches_data' method" - .format(cls.__name__)) - self._registry.add(cls) - - def getAstroData(self, source): - """ - Takes either a string (with the path to a file) or an HDUList as input, - and tries to return an AstroData instance. - - It will raise exceptions if the file is not found, or if there is no - match for the HDUList, among the registered AstroData classes. - - Returns an instantiated object, or raises AstroDataError if it was - not possible to find a match - - Parameters - ---------- - source : `str` or `pathlib.Path` or `fits.HDUList` - The file path or HDUList to read. - - """ - candidates = [] - with self._openFile(source) as opened: - for adclass in self._registry: - try: - if adclass._matches_data(opened): - candidates.append(adclass) - except Exception: # Some problem opening this - pass - - # For every candidate in the list, remove the ones that are base - # classes for other candidates. That way we keep only the more - # specific ones. - final_candidates = [] - for cnd in candidates: - if any(cnd in x.mro() for x in candidates if x != cnd): - continue - final_candidates.append(cnd) - - if len(final_candidates) > 1: - raise AstroDataError("More than one class is candidate for this dataset") - elif not final_candidates: - raise AstroDataError("No class matches this dataset") - - return final_candidates[0].read(source) - - def createFromScratch(self, phu, extensions=None): - """Creates an AstroData object from a collection of objects. - - Parameters - ---------- - phu : `fits.PrimaryHDU` or `fits.Header` or `dict` or `list` - FITS primary HDU or header, or something that can be used to create - a fits.Header (a dict, a list of "cards"). - extensions : list of HDUs - List of HDU objects. - - """ - lst = fits.HDUList() - if phu is not None: - if isinstance(phu, fits.PrimaryHDU): - lst.append(deepcopy(phu)) - elif isinstance(phu, fits.Header): - lst.append(fits.PrimaryHDU(header=deepcopy(phu))) - elif isinstance(phu, (dict, list, tuple)): - p = fits.PrimaryHDU() - p.header.update(phu) - lst.append(p) - else: - raise ValueError("phu must be a PrimaryHDU or a valid header object") - - # TODO: Verify the contents of extensions... - if extensions is not None: - for ext in extensions: - lst.append(ext) - - return self.getAstroData(lst) diff --git a/astrodata/fits.py b/astrodata/fits.py deleted file mode 100644 index 281ec0d6ca..0000000000 --- a/astrodata/fits.py +++ /dev/null @@ -1,860 +0,0 @@ -import gc -import logging -import os -import traceback -import warnings -from collections import OrderedDict -from copy import deepcopy -from io import BytesIO -from itertools import product as cart_product, zip_longest - -import asdf -import astropy -import jsonschema -import numpy as np -from astropy import units as u -from astropy.io import fits -from astropy.io.fits import (DELAYED, BinTableHDU, Column, HDUList, - ImageHDU, PrimaryHDU, TableHDU) -from astropy.nddata import NDData -# NDDataRef is still not in the stable astropy, but this should be the one -# we use in the future... -# from astropy.nddata import NDData, NDDataRef as NDDataObject -from astropy.table import Table -from gwcs.wcs import WCS as gWCS - -from .nddata import ADVarianceUncertainty, NDAstroData as NDDataObject -from .wcs import fitswcs_to_gwcs, gwcs_to_fits - -DEFAULT_EXTENSION = 'SCI' -NO_DEFAULT = object() -LOGGER = logging.getLogger(__name__) - - -class FitsHeaderCollection: - """Group access to a list of FITS Header-like objects. - - It exposes a number of methods (``set``, ``get``, etc.) that operate over - all the headers at the same time. It can also be iterated. - - Parameters - ---------- - headers : list of `astropy.io.fits.Header` - List of Header objects. - - """ - def __init__(self, headers): - self._headers = list(headers) - - def _insert(self, idx, header): - self._headers.insert(idx, header) - - def __iter__(self): - yield from self._headers - - def __setitem__(self, key, value): - if isinstance(value, tuple): - self.set(key, value=value[0], comment=value[1]) - else: - self.set(key, value=value) - - def set(self, key, value=None, comment=None): - for header in self._headers: - header.set(key, value=value, comment=comment) - - def __getitem__(self, key): - missing_at = [] - ret = [] - for n, header in enumerate(self._headers): - try: - ret.append(header[key]) - except KeyError: - missing_at.append(n) - ret.append(None) - if missing_at: - error = KeyError("The keyword couldn't be found at headers: {}" - .format(tuple(missing_at))) - error.missing_at = missing_at - error.values = ret - raise error - return ret - - def get(self, key, default=None): - try: - return self[key] - except KeyError as err: - vals = err.values - for n in err.missing_at: - vals[n] = default - return vals - - def __delitem__(self, key): - self.remove(key) - - def remove(self, key): - deleted = 0 - for header in self._headers: - try: - del header[key] - deleted = deleted + 1 - except KeyError: - pass - if not deleted: - raise KeyError(f"'{key}' is not on any of the extensions") - - def get_comment(self, key): - return [header.comments[key] for header in self._headers] - - def set_comment(self, key, comment): - def _inner_set_comment(header): - if key not in header: - raise KeyError(f"Keyword {key!r} not available") - - header.set(key, comment=comment) - - for n, header in enumerate(self._headers): - try: - _inner_set_comment(header) - except KeyError as err: - raise KeyError(err.args[0] + f" at header {n}") - - def __contains__(self, key): - return any(tuple(key in h for h in self._headers)) - - -def new_imagehdu(data, header, name=None): - # Assigning data in a delayed way, won't reset BZERO/BSCALE in the header, - # for some reason. Need to investigated. Maybe astropy.io.fits bug. Figure - # out WHY were we delaying in the first place. - # i = ImageHDU(data=DELAYED, header=header.copy(), name=name) - # i.data = data - return ImageHDU(data=data, header=header.copy(), name=name) - - -def table_to_bintablehdu(table, extname=None): - """ - Convert an astropy Table object to a BinTableHDU before writing to disk. - - Parameters - ---------- - table: astropy.table.Table instance - the table to be converted to a BinTableHDU - extname: str - name to go in the EXTNAME field of the FITS header - - Returns - ------- - BinTableHDU - - """ - # remove header to avoid warning from table_to_hdu - table_header = table.meta.pop('header', None) - - # table_to_hdu sets units only if the unit conforms to the FITS standard, - # otherwise it issues a warning, which we catch here. - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - hdu = fits.table_to_hdu(table) - - # And now we try to set the units that do not conform to the standard, - # using unit.to_string() without the format='fits' argument. - for col in table.itercols(): - if col.unit and not hdu.columns[col.name].unit: - hdu.columns[col.name].unit = col.unit.to_string() - - if table_header is not None: - # Update with cards from table.meta, but skip structural FITS - # keywords since those have been set by table_to_hdu - exclude = ('SIMPLE', 'XTENSION', 'BITPIX', 'NAXIS', 'EXTEND', 'PCOUNT', - 'GCOUNT', 'TFIELDS', 'TFORM', 'TSCAL', 'TZERO', 'TNULL', - 'TTYPE', 'TUNIT', 'TDISP', 'TDIM', 'THEAP', 'TBCOL') - hdr = fits.Header([card for card in table_header.cards - if not card.keyword.startswith(exclude)]) - update_header(hdu.header, hdr) - # reset table's header - table.meta['header'] = table_header - if extname: - hdu.header['EXTNAME'] = (extname, 'added by AstroData') - return hdu - - -def header_for_table(table): - table_header = table.meta.pop('header', None) - fits_header = fits.table_to_hdu(table).header - if table_header: - table.meta['header'] = table_header # restore original meta - fits_header = update_header(table_header, fits_header) - return fits_header - - -def add_header_to_table(table): - header = header_for_table(table) - table.meta['header'] = header - return header - - -def _process_table(table, name=None, header=None): - if isinstance(table, (BinTableHDU, TableHDU)): - obj = Table(table.data, meta={'header': header or table.header}) - for i, col in enumerate(obj.columns, start=1): - try: - obj[col].unit = u.Unit(obj.meta['header'][f'TUNIT{i}']) - except (KeyError, TypeError, ValueError): - pass - elif isinstance(table, Table): - obj = Table(table) - if header is not None: - obj.meta['header'] = deepcopy(header) - elif 'header' not in obj.meta: - obj.meta['header'] = header_for_table(obj) - else: - raise ValueError(f"{table.__class__} is not a recognized table type") - - if name is not None: - obj.meta['header']['EXTNAME'] = name - - return obj - - -def card_filter(cards, include=None, exclude=None): - for card in cards: - if include is not None and card[0] not in include: - continue - elif exclude is not None and card[0] in exclude: - continue - yield card - - -def update_header(headera, headerb): - cardsa = tuple(tuple(cr) for cr in headera.cards) - cardsb = tuple(tuple(cr) for cr in headerb.cards) - - if cardsa == cardsb: - return headera - - # Ok, headerb differs somehow. Let's try to bring the changes to headera - # Updated keywords that should be unique - difference = set(cardsb) - set(cardsa) - headera.update(card_filter(difference, exclude={'HISTORY', 'COMMENT', ''})) - # Check the HISTORY and COMMENT cards, just in case - for key in ('HISTORY', 'COMMENT'): - fltcardsa = card_filter(cardsa, include={key}) - fltcardsb = card_filter(cardsb, include={key}) - # assume we start with two headers that are mostly the same and - # that will have added comments/history at the end (in headerb) - for (ca, cb) in zip_longest(fltcardsa, fltcardsb): - if ca is None: - headera.update((cb,)) - - return headera - - -def fits_ext_comp_key(ext): - """Returns a pair (int, str) that will be used to sort extensions.""" - if isinstance(ext, PrimaryHDU): - # This will guarantee that the primary HDU goes first - ret = (-1, "") - else: - # When two extensions share version number, we'll use their names - # to sort them out. Choose a suitable key so that: - # - # - SCI extensions come first - # - unnamed extensions come last - # - # We'll resort to add 'z' in front of the usual name to force - # SCI to be the "smallest" - name = ext.name - if name == '': - name = "zzzz" - elif name != DEFAULT_EXTENSION: - name = "z" + name - - ver = ext.header.get('EXTVER') - if ver in (-1, None): - # In practice, this number should be larger than any EXTVER found - # in real life HDUs, pushing unnumbered HDUs to the end. - ver = 2**32-1 - - # For the general case, just return version and name, to let them - # be sorted naturally - ret = (ver, name) - - return ret - - -class FitsLazyLoadable: - - def __init__(self, obj): - self._obj = obj - self.lazy = True - - def _create_result(self, shape): - return np.empty(shape, dtype=self.dtype) - - def _scale(self, data): - bscale = self._obj._orig_bscale - bzero = self._obj._orig_bzero - if bscale == 1 and bzero == 0: - return data - return (bscale * data + bzero).astype(self.dtype) - - def __getitem__(self, sl): - # TODO: We may want (read: should) create an empty result array before scaling - return self._scale(self._obj.section[sl]) - - @property - def header(self): - return self._obj.header - - @property - def data(self): - res = self._create_result(self.shape) - res[:] = self._scale(self._obj.data) - return res - - @property - def shape(self): - return self._obj.shape - - @property - def dtype(self): - """ - Need to to some overriding of astropy.io.fits since it doesn't - know about BITPIX=8 - """ - bitpix = self._obj._orig_bitpix - if self._obj._orig_bscale == 1 and self._obj._orig_bzero == 0: - dtype = fits.BITPIX2DTYPE[bitpix] - else: - # this method from astropy will return the dtype if the data - # needs to be converted to unsigned int or scaled to float - dtype = self._obj._dtype_for_bitpix() - - if dtype is None: - if bitpix < 0: - dtype = np.dtype('float{}'.format(abs(bitpix))) - if (self._obj.header['EXTNAME'] == 'DQ' or self._obj._uint and - self._obj._orig_bscale == 1 and bitpix == 8): - dtype = np.uint16 - return dtype - - -def _prepare_hdulist(hdulist, default_extension='SCI', extname_parser=None): - new_list = [] - highest_ver = 0 - recognized = set() - - if len(hdulist) > 1 or (len(hdulist) == 1 and hdulist[0].data is None): - # MEF file - # First get HDUs for which EXTVER is defined - for n, hdu in enumerate(hdulist): - if extname_parser: - extname_parser(hdu) - ver = hdu.header.get('EXTVER') - if ver not in (-1, None) and hdu.name: - highest_ver = max(highest_ver, ver) - elif not isinstance(hdu, PrimaryHDU): - continue - - new_list.append(hdu) - recognized.add(hdu) - - # Then HDUs that miss EXTVER - for hdu in hdulist: - if hdu in recognized: - continue - elif isinstance(hdu, ImageHDU): - highest_ver += 1 - if 'EXTNAME' not in hdu.header: - hdu.header['EXTNAME'] = (default_extension, - 'Added by AstroData') - if hdu.header.get('EXTVER') in (-1, None): - hdu.header['EXTVER'] = (highest_ver, 'Added by AstroData') - - new_list.append(hdu) - recognized.add(hdu) - else: - # Uh-oh, a single image FITS file - new_list.append(PrimaryHDU(header=hdulist[0].header)) - image = ImageHDU(header=hdulist[0].header, data=hdulist[0].data) - # Fudge due to apparent issues with assigning ImageHDU from data - image._orig_bscale = hdulist[0]._orig_bscale - image._orig_bzero = hdulist[0]._orig_bzero - - for keyw in ('SIMPLE', 'EXTEND'): - if keyw in image.header: - del image.header[keyw] - image.header['EXTNAME'] = (default_extension, 'Added by AstroData') - image.header['EXTVER'] = (1, 'Added by AstroData') - new_list.append(image) - - return HDUList(sorted(new_list, key=fits_ext_comp_key)) - - -def read_fits(cls, source, extname_parser=None): - """ - Takes either a string (with the path to a file) or an HDUList as input, and - tries to return a populated AstroData (or descendant) instance. - - It will raise exceptions if the file is not found, or if there is no match - for the HDUList, among the registered AstroData classes. - """ - - ad = cls() - - if isinstance(source, (str, os.PathLike)): - hdulist = fits.open(source, memmap=True, - do_not_scale_image_data=True, mode='readonly') - ad.path = source - else: - hdulist = source - try: - ad.path = source[0].header.get('ORIGNAME') - except AttributeError: - ad.path = None - - _file = hdulist._file - hdulist = _prepare_hdulist(hdulist, default_extension=DEFAULT_EXTENSION, - extname_parser=extname_parser) - if _file is not None: - hdulist._file = _file - - # Initialize the object containers to a bare minimum - if 'ORIGNAME' not in hdulist[0].header and ad.orig_filename is not None: - hdulist[0].header.set('ORIGNAME', ad.orig_filename, - 'Original filename prior to processing') - - ad.phu = hdulist[0].header - seen = {hdulist[0]} - skip_names = {DEFAULT_EXTENSION, 'REFCAT', 'MDF'} - - def associated_extensions(ver): - for hdu in hdulist: - if hdu.header.get('EXTVER') == ver and hdu.name not in skip_names: - yield hdu - - # Only SCI HDUs - sci_units = [hdu for hdu in hdulist[1:] if hdu.name == DEFAULT_EXTENSION] - - seen_vers = [] - for idx, hdu in enumerate(sci_units): - seen.add(hdu) - ver = hdu.header.get('EXTVER', -1) - if ver > -1 and seen_vers.count(ver) == 1: - LOGGER.warning(f"Multiple SCI extension with EXTVER {ver}") - seen_vers.append(ver) - parts = { - 'data': hdu, - 'uncertainty': None, - 'mask': None, - 'wcs': None, - 'other': [], - } - - # For each SCI HDU find if it has an associated variance, mask, wcs - for extra_unit in associated_extensions(ver): - seen.add(extra_unit) - name = extra_unit.name - if name == 'DQ': - parts['mask'] = extra_unit - elif name == 'VAR': - parts['uncertainty'] = extra_unit - elif name == 'WCS': - parts['wcs'] = extra_unit - else: - parts['other'].append(extra_unit) - - header = parts['data'].header - lazy = hdulist._file is not None and hdulist._file.memmap - - for part_name in ('data', 'mask', 'uncertainty'): - if parts[part_name] is not None: - if lazy: - # Use FitsLazyLoadable to delay loading of the data - parts[part_name] = FitsLazyLoadable(parts[part_name]) - else: - # Otherwise use the data array - #parts[part_name] = parts[part_name].data - # TODO: we open the file with do_not_scale_data=True, so - # the data array does not have the correct data values. - # AstroData handles scaling internally, and we can ensure - # it does that by making the data a FitsLazyLoadable; the - # side-effect of this is that the is_lazy() function will - # return True, but this has minimal knock-on effects. - # Hopefully astropy will handle this better in future. - if hdulist._file is not None: # probably compressed - parts[part_name] = FitsLazyLoadable(parts[part_name]) - else: # for astrodata.create() files - parts[part_name] = parts[part_name].data - - # handle the variance if not lazy - if (parts['uncertainty'] is not None and - not isinstance(parts['uncertainty'], FitsLazyLoadable)): - parts['uncertainty'] = ADVarianceUncertainty(parts['uncertainty']) - - # Create the NDData object - nd = NDDataObject( - data=parts['data'], - uncertainty=parts['uncertainty'], - mask=parts['mask'], - meta={'header': header}, - ) - - ad.append(nd, name=DEFAULT_EXTENSION) - - # This is used in the writer to keep track of the extensions that - # were read from the current object. - nd.meta['parent_ad'] = id(ad) - - for other in parts['other']: - if not other.name: - warnings.warn(f"Skip HDU {other} because it has no EXTNAME") - else: - setattr(ad[-1], other.name, other) - - if parts['wcs'] is not None: - # Load the gWCS object from the ASDF extension - nd.wcs = asdftablehdu_to_wcs(parts['wcs']) - if nd.wcs is None: - # Fallback to the data header - nd.wcs = fitswcs_to_gwcs(nd) - if nd.wcs is None: - # In case WCS info is in the PHU - nd.wcs = fitswcs_to_gwcs(hdulist[0].header) - - for other in hdulist: - if other in seen: - continue - name = other.header.get('EXTNAME') - try: - ad.append(other, name=name) - except ValueError as e: - warnings.warn(f"Discarding {name} :\n {e}") - - return ad - - -def ad_to_hdulist(ad): - """Creates an HDUList from an AstroData object.""" - hdul = HDUList() - hdul.append(PrimaryHDU(header=ad.phu, data=DELAYED)) - - # Find the maximum EXTVER for extensions that belonged with this - # object if it was read from a FITS file - maxver = max((nd.meta['header'].get('EXTVER', 0) for nd in ad._nddata - if nd.meta.get('parent_ad') == id(ad)), - default=0) - - for ext in ad._nddata: - header = ext.meta['header'].copy() - - if not isinstance(header, fits.Header): - header = fits.Header(header) - - if ext.meta.get('parent_ad') == id(ad): - # If the extension belonged with this object, use its - # original EXTVER - ver = header['EXTVER'] - else: - # Otherwise renumber the extension - ver = header['EXTVER'] = maxver + 1 - maxver += 1 - - wcs = ext.wcs - - if isinstance(wcs, gWCS): - # We don't have access to the AD tags so see if it's an image - # Catch ValueError as any sort of failure - try: - wcs_dict = gwcs_to_fits(ext, ad.phu) - except (ValueError, NotImplementedError) as e: - LOGGER.warning(e) - else: - # Must delete keywords if image WCS has been downscaled - # from a higher number of dimensions - for i in range(1, 5): - for kw in (f'CDELT{i}', f'CRVAL{i}', f'CUNIT{i}', - f'CTYPE{i}', f'NAXIS{i}'): - if kw in header: - del header[kw] - for j in range(1, 5): - for kw in (f'CD{i}_{j}', f'PC{i}_{j}', f'CRPIX{j}'): - if kw in header: - del header[kw] - # Delete this if it's left over from a previous save - if 'FITS-WCS' in header: - del header['FITS-WCS'] - try: - extensions = wcs_dict.pop('extensions') - except KeyError: - pass - else: - for k, v in extensions.items(): - ext.meta['other'][k] = v - header.update(wcs_dict) - # Use "in" here as the dict entry may be (value, comment) - if 'APPROXIMATE' not in wcs_dict.get('FITS-WCS', ''): - wcs = None # There's no need to create a WCS extension - - hdul.append(new_imagehdu(ext.data, header, 'SCI')) - if ext.uncertainty is not None: - hdul.append(new_imagehdu(ext.uncertainty.array, header, 'VAR')) - if ext.mask is not None: - hdul.append(new_imagehdu(ext.mask, header, 'DQ')) - - if isinstance(wcs, gWCS): - hdul.append(wcs_to_asdftablehdu(ext.wcs, extver=ver)) - - for name, other in ext.meta.get('other', {}).items(): - if isinstance(other, Table): - hdu = table_to_bintablehdu(other, extname=name) - elif isinstance(other, np.ndarray): - hdu = new_imagehdu(other, header, name=name) - elif isinstance(other, NDDataObject): - hdu = new_imagehdu(other.data, ext.meta['header']) - else: - raise ValueError("I don't know how to write back an object " - f"of type {type(other)}") - - hdu.ver = ver - hdul.append(hdu) - - if ad._tables is not None: - for name, table in sorted(ad._tables.items()): - hdul.append(table_to_bintablehdu(table, extname=name)) - - # Additional FITS compatibility, add to PHU - hdul[0].header['NEXTEND'] = len(hdul) - 1 - - return hdul - - -def write_fits(ad, filename, overwrite=False): - """Writes the AstroData object to a FITS file.""" - hdul = ad_to_hdulist(ad) - hdul.writeto(filename, overwrite=overwrite) - - -def windowedOp(func, sequence, kernel, shape=None, dtype=None, - with_uncertainty=False, with_mask=False, **kwargs): - """Apply function on a NDData obbjects, splitting the data in chunks to - limit memory usage. - - Parameters - ---------- - func : callable - The function to apply. - sequence : list of NDData - List of NDData objects. - kernel : tuple of int - Shape of the blocks. - shape : tuple of int - Shape of inputs. Defaults to ``sequence[0].shape``. - dtype : str or dtype - Type of the output array. Defaults to ``sequence[0].dtype``. - with_uncertainty : bool - Compute uncertainty? - with_mask : bool - Compute mask? - **kwargs - Additional args are passed to ``func``. - - """ - - def generate_boxes(shape, kernel): - if len(shape) != len(kernel): - raise AssertionError("Incompatible shape ({}) and kernel ({})" - .format(shape, kernel)) - ticks = [[(x, x+step) for x in range(0, axis, step)] - for axis, step in zip(shape, kernel)] - return list(cart_product(*ticks)) - - if shape is None: - if len({x.shape for x in sequence}) > 1: - raise ValueError("Can't calculate final shape: sequence elements " - "disagree on shape, and none was provided") - shape = sequence[0].shape - - if dtype is None: - dtype = sequence[0].window[:1, :1].data.dtype - - result = NDDataObject( - np.empty(shape, dtype=dtype), - variance=np.zeros(shape, dtype=dtype) if with_uncertainty else None, - mask=np.empty(shape, dtype=np.uint16) if with_mask else None, - meta=sequence[0].meta, - wcs=sequence[0].wcs, - ) - # Delete other extensions because we don't know what to do with them - result.meta['other'] = OrderedDict() - - # The Astropy logger's "INFO" messages aren't warnings, so have to fudge - log_level = astropy.logger.conf.log_level - astropy.log.setLevel(astropy.logger.WARNING) - - boxes = generate_boxes(shape, kernel) - - try: - for coords in boxes: - section = tuple([slice(start, end) for (start, end) in coords]) - out = func([element.window[section] for element in sequence], - **kwargs) - result.set_section(section, out) - - # propagate additional attributes - if out.meta.get('other'): - for k, v in out.meta['other'].items(): - if len(boxes) > 1: - result.meta['other'][k, coords] = v - else: - result.meta['other'][k] = v - - gc.collect() - finally: - astropy.log.setLevel(log_level) # and reset - - # Now if the input arrays where splitted in chunks, we need to gather - # the data arrays for the additional attributes. - other = result.meta['other'] - if other: - if len(boxes) > 1: - for (name, coords), obj in list(other.items()): - if not isinstance(obj, NDData): - raise ValueError('only NDData objects are handled here') - if name not in other: - other[name] = NDDataObject(np.empty(shape, - dtype=obj.data.dtype)) - section = tuple([slice(start, end) for (start, end) in coords]) - other[name].set_section(section, obj) - del other[name, coords] - - for name in other: - # To set the name of our object we need to save it as an ndarray, - # otherwise for a NDData one AstroData would use the name of the - # AstroData object. - other[name] = other[name].data - - return result - - -# --------------------------------------------------------------------------- -# gWCS <-> FITS WCS helper functions go here -# --------------------------------------------------------------------------- -# Could parametrize some naming conventions in the following two functions if -# done elsewhere for hard-coded names like 'SCI' in future, but they only have -# to be self-consistent with one another anyway. - -def wcs_to_asdftablehdu(wcs, extver=None): - """ - Serialize a gWCS object as a FITS TableHDU (ASCII) extension. - - The ASCII table is actually a mini ASDF file. The constituent AstroPy - models must have associated ASDF "tags" that specify how to serialize them. - - In the event that serialization as pure ASCII fails (this should not - happen), a binary table representation will be used as a fallback. - """ - - # Create a small ASDF file in memory containing the WCS object - # representation because there's no public API for generating only the - # relevant YAML subsection and an ASDF file handles the "tags" properly. - try: - af = asdf.AsdfFile({"wcs": wcs}) - except jsonschema.exceptions.ValidationError: - # (The original traceback also gets printed here) - raise TypeError("Cannot serialize model(s) for 'WCS' extension {}" - .format(extver or '')) - - # ASDF can only dump YAML to a binary file object, so do that and read - # the contents back from it for storage in a FITS extension: - with BytesIO() as fd: - with af: - # Generate the YAML, dumping any binary arrays as text: - af.write_to(fd, all_array_storage='inline') - fd.seek(0) - wcsbuf = fd.read() - - # Convert the bytes to readable lines of text for storage (falling back to - # saving as binary in the unexpected event that this is not possible): - try: - wcsbuf = wcsbuf.decode('ascii').splitlines() - except UnicodeDecodeError: - # This should not happen, but if the ASDF contains binary data in - # spite of the 'inline' option above, we have to dump the bytes to - # a non-human-readable binary table rather than an ASCII one: - LOGGER.warning("Could not convert WCS {} ASDF to ASCII; saving table " - "as binary".format(extver or '')) - hduclass = BinTableHDU - fmt = 'B' - wcsbuf = np.frombuffer(wcsbuf, dtype=np.uint8) - else: - hduclass = TableHDU - fmt = 'A{}'.format(max(len(line) for line in wcsbuf)) - - # Construct the FITS table extension: - col = Column(name='gWCS', format=fmt, array=wcsbuf, - ascii=hduclass is TableHDU) - return hduclass.from_columns([col], name='WCS', ver=extver) - - -def asdftablehdu_to_wcs(hdu): - """ - Recreate a gWCS object from its serialization in a FITS table extension. - - Returns None (issuing a warning) if the extension cannot be parsed, so - the rest of the file can still be read. - """ - - ver = hdu.header.get('EXTVER', -1) - - if isinstance(hdu, (TableHDU, BinTableHDU)): - try: - colarr = hdu.data['gWCS'] - except KeyError: - LOGGER.warning("Ignoring 'WCS' extension {} with no 'gWCS' table " - "column".format(ver)) - return - - # If this table column contains text strings as expected, join the rows - # as separate lines of a string buffer and encode the resulting YAML as - # bytes that ASDF can parse. If AstroData has produced another format, - # it will be a binary dump due to the unexpected presence of non-ASCII - # data, in which case we just extract unmodified bytes from the table. - if colarr.dtype.kind in ('U', 'S'): - sep = os.linesep - # Just in case io.fits ever produces 'S' on Py 3 (not the default): - # join lines as str & avoid a TypeError with unicode linesep; could - # also use astype('U') but it assumes an encoding implicitly. - if colarr.dtype.kind == 'S' and not isinstance(sep, bytes): - colarr = np.char.decode(np.char.rstrip(colarr), - encoding='ascii') - wcsbuf = sep.join(colarr).encode('ascii') - else: - wcsbuf = colarr.tobytes() - - # Convert the stored text to a Bytes file object that ASDF can open: - with BytesIO(wcsbuf) as fd: - - # Try to extract a 'wcs' entry from the YAML: - try: - af = asdf.open(fd) - except Exception: - LOGGER.warning("Ignoring 'WCS' extension {}: failed to parse " - "ASDF.\nError was as follows:\n{}" - .format(ver, traceback.format_exc())) - return - else: - with af: - try: - wcs = af.tree['wcs'] - except KeyError: - LOGGER.warning("Ignoring 'WCS' extension {}: missing " - "'wcs' dict entry.".format(ver)) - return - - else: - LOGGER.warning("Ignoring non-FITS-table 'WCS' extension {}" - .format(ver)) - return - - return wcs diff --git a/astrodata/nddata.py b/astrodata/nddata.py deleted file mode 100644 index ce15ab930b..0000000000 --- a/astrodata/nddata.py +++ /dev/null @@ -1,513 +0,0 @@ -""" -This module implements a derivative class based on NDData with some Mixins, -implementing windowing and on-the-fly data scaling. -""" - - -import warnings -from copy import deepcopy -from functools import reduce - -import numpy as np - -from astropy.io.fits import ImageHDU -from astropy.modeling import Model, models -from astropy.nddata import (NDArithmeticMixin, NDData, NDSlicingMixin, - VarianceUncertainty) -from gwcs.wcs import WCS as gWCS -from .wcs import remove_axis_from_frame - -INTEGER_TYPES = (int, np.integer) - -__all__ = ['NDAstroData'] - - -class ADVarianceUncertainty(VarianceUncertainty): - """ - Subclass VarianceUncertainty to check for negative values. - """ - @VarianceUncertainty.array.setter - def array(self, value): - if value is not None and np.any(value < 0): - warnings.warn("Negative variance values found. Setting to zero.", - RuntimeWarning) - value = np.where(value >= 0., value, 0.) - VarianceUncertainty.array.fset(self, value) - - -class AstroDataMixin: - """ - A Mixin for ``NDData``-like classes (such as ``Spectrum1D``) to enable - them to behave similarly to ``AstroData`` objects. - - These behaviors are: - 1. ``mask`` attributes are combined with bitwise, not logical, or, - since the individual bits are important. - 2. The WCS must be a ``gwcs.WCS`` object and slicing results in - the model being modified. - 3. There is a settable ``variance`` attribute. - 4. Additional attributes such as OBJMASK can be extracted from - the .meta['other'] dict - """ - def __getattr__(self, attribute): - """ - Allow access to attributes stored in self.meta['other'], as we do - with AstroData objects. - """ - if attribute.isupper(): - try: - return self.meta['other'][attribute] - except KeyError: - pass - raise AttributeError(f"{self.__class__.__name__!r} object has no " - f"attribute {attribute!r}") - - def _arithmetic(self, operation, operand, propagate_uncertainties=True, - handle_mask=np.bitwise_or, handle_meta=None, - uncertainty_correlation=0, compare_wcs='first_found', - **kwds): - """ - Override the NDData method so that "bitwise_or" becomes the default - operation to combine masks, rather than "logical_or" - """ - return super()._arithmetic( - operation, operand, propagate_uncertainties=propagate_uncertainties, - handle_mask=handle_mask, handle_meta=handle_meta, - uncertainty_correlation=uncertainty_correlation, - compare_wcs=compare_wcs, **kwds) - - def _slice_wcs(self, slices): - """ - The ``__call__()`` method of gWCS doesn't appear to conform to the - APE 14 interface for WCS implementations, and doesn't react to - slicing properly. We override NDSlicing's method to do what we want. - """ - if not isinstance(self.wcs, gWCS): - return self.wcs - - # Sanitize the slices, catching some errors early - if not isinstance(slices, (tuple, list)): - slices = (slices,) - slices = list(slices) - ndim = len(self.shape) - if len(slices) > ndim: - raise ValueError(f"Too many dimensions specified in slice {slices}") - - if Ellipsis in slices: - if slices.count(Ellipsis) > 1: - raise IndexError("Only one ellipsis can be specified in a slice") - ell_index = slices.index(Ellipsis) - slices[ell_index:ell_index+1] = [slice(None)] * (ndim - len(slices) + 1) - slices.extend([slice(None)] * (ndim-len(slices))) - - mods = [] - mapped_axes = [] - for i, (slice_, length) in enumerate(zip(slices[::-1], self.shape[::-1])): - model = [] - if isinstance(slice_, slice): - if slice_.step and slice_.step > 1: - raise IndexError("Cannot slice with a step") - if slice_.start: - start = (length + slice_.start) if slice_.start < 0 else slice_.start - if start > 0: - model.append(models.Shift(start)) - mapped_axes.append(max(mapped_axes) + 1 if mapped_axes else 0) - elif isinstance(slice_, INTEGER_TYPES): - model.append(models.Const1D((length + slice_) if slice_ < 0 else slice_)) - mapped_axes.append(-1) - elif slice_ is None: # equivalent to slice(None, None, None) - mapped_axes.append(max(mapped_axes) + 1 if mapped_axes else 0) - else: - raise IndexError("Slice not an integer or range") - if model: - mods.append(reduce(Model.__or__, model)) - else: - # If the previous model was an Identity, we can hang this - # one onto that without needing to append a new Identity - if i > 0 and isinstance(mods[-1], models.Identity): - mods[-1] = models.Identity(mods[-1].n_inputs + 1) - else: - mods.append(models.Identity(1)) - - slicing_model = reduce(Model.__and__, mods) - if mapped_axes != list(np.arange(ndim)): - slicing_model = models.Mapping( - tuple(max(ax, 0) for ax in mapped_axes)) | slicing_model - slicing_model.inverse = models.Mapping( - tuple(ax for ax in mapped_axes if ax != -1), n_inputs=ndim) - - if isinstance(slicing_model, models.Identity) and slicing_model.n_inputs == ndim: - return self.wcs # Unchanged! - new_wcs = deepcopy(self.wcs) - input_frame = new_wcs.input_frame - for axis, mapped_axis in reversed(list(enumerate(mapped_axes))): - if mapped_axis == -1: - input_frame = remove_axis_from_frame(input_frame, axis) - new_wcs.pipeline[0].frame = input_frame - new_wcs.insert_transform(new_wcs.input_frame, slicing_model, after=True) - return new_wcs - - @property - def variance(self): - """ - A convenience property to access the contents of ``uncertainty``. - """ - arr = self.uncertainty - if arr is not None: - return arr.array - - @variance.setter - def variance(self, value): - self.uncertainty = (ADVarianceUncertainty(value) if value is not None - else None) - - @property - def wcs(self): - return super().wcs - - @wcs.setter - def wcs(self, value): - if value is not None and not isinstance(value, gWCS): - raise TypeError("wcs value must be None or a gWCS object") - self._wcs = value - - @property - def shape(self): - return self._data.shape - - @property - def size(self): - return self._data.size - - -class FakeArray: - - def __init__(self, very_faked): - self.data = very_faked - self.shape = (100, 100) # Won't matter. This is just to fool NDData - self.dtype = np.float32 # Same here - - def __getitem__(self, index): - # FAKE NEWS! - return None - - def __array__(self): - return self.data - - -class NDWindowing: - - def __init__(self, target): - self._target = target - - def __getitem__(self, slice): - return NDWindowingAstroData(self._target, window=slice) - - -class NDWindowingAstroData(AstroDataMixin, NDArithmeticMixin, NDSlicingMixin, NDData): - """ - Allows "windowed" access to some properties of an ``NDAstroData`` instance. - In particular, ``data``, ``uncertainty``, ``variance``, and ``mask`` return - clipped data. - """ - def __init__(self, target, window): - self._target = target - self._window = window - - def __getattr__(self, attribute): - """ - Allow access to attributes stored in self.meta['other'], as we do - with AstroData objects. - """ - if attribute.isupper(): - try: - return self._target._get_simple(attribute, section=self._window) - except KeyError: - pass - raise AttributeError(f"{self.__class__.__name__!r} object has no " - f"attribute {attribute!r}") - - @property - def unit(self): - return self._target.unit - - @property - def wcs(self): - return self._target._slice_wcs(self._window) - - @property - def data(self): - return self._target._get_simple('_data', section=self._window) - - @property - def uncertainty(self): - return self._target._get_uncertainty(section=self._window) - - @property - def variance(self): - if self.uncertainty is not None: - return self.uncertainty.array - - @property - def mask(self): - return self._target._get_simple('_mask', section=self._window) - - -def is_lazy(item): - return isinstance(item, ImageHDU) or (hasattr(item, 'lazy') and item.lazy) - - -class NDAstroData(AstroDataMixin, NDArithmeticMixin, NDSlicingMixin, NDData): - """ - Implements ``NDData`` with all Mixins, plus some ``AstroData`` specifics. - - This class implements an ``NDData``-like container that supports reading - and writing as implemented in the ``astropy.io.registry`` and also slicing - (indexing) and simple arithmetics (add, subtract, divide and multiply). - - A very important difference between ``NDAstroData`` and ``NDData`` is that - the former attempts to load all its data lazily. There are also some - important differences in the interface (eg. ``.data`` lets you reset its - contents after initialization). - - Documentation is provided where our class differs. - - See also - -------- - NDData - NDArithmeticMixin - NDSlicingMixin - - Examples - -------- - - The mixins allow operation that are not possible with ``NDData`` or - ``NDDataBase``, i.e. simple arithmetics:: - - >>> from astropy.nddata import StdDevUncertainty - >>> import numpy as np - >>> data = np.ones((3,3), dtype=np.float) - >>> ndd1 = NDAstroData(data, uncertainty=StdDevUncertainty(data)) - >>> ndd2 = NDAstroData(data, uncertainty=StdDevUncertainty(data)) - >>> ndd3 = ndd1.add(ndd2) - >>> ndd3.data - array([[2., 2., 2.], - [2., 2., 2.], - [2., 2., 2.]]) - >>> ndd3.uncertainty.array - array([[1.41421356, 1.41421356, 1.41421356], - [1.41421356, 1.41421356, 1.41421356], - [1.41421356, 1.41421356, 1.41421356]]) - - see ``NDArithmeticMixin`` for a complete list of all supported arithmetic - operations. - - But also slicing (indexing) is possible:: - - >>> ndd4 = ndd3[1,:] - >>> ndd4.data - array([2., 2., 2.]) - >>> ndd4.uncertainty.array - array([1.41421356, 1.41421356, 1.41421356]) - - See ``NDSlicingMixin`` for a description how slicing works (which - attributes) are sliced. - - """ - def __init__(self, data, uncertainty=None, mask=None, wcs=None, - meta=None, unit=None, copy=False, window=None, variance=None): - - if variance is not None: - if uncertainty is not None: - raise ValueError() - uncertainty = ADVarianceUncertainty(variance) - - super().__init__(FakeArray(data) if is_lazy(data) else data, - None if is_lazy(uncertainty) else uncertainty, - mask, wcs, meta, unit, copy) - - if is_lazy(data): - self.data = data - if is_lazy(uncertainty): - self.uncertainty = uncertainty - - def __deepcopy__(self, memo): - new = self.__class__( - self._data if is_lazy(self._data) else deepcopy(self.data, memo), - self._uncertainty if is_lazy(self._uncertainty) else None, - self._mask if is_lazy(self._mask) else deepcopy(self.mask, memo), - deepcopy(self.wcs, memo), None, self.unit - ) - new.meta = deepcopy(self.meta, memo) - # Needed to avoid recursion because of uncertainty's weakref to self - if not is_lazy(self._uncertainty): - new.variance = deepcopy(self.variance) - return new - - @property - def window(self): - """ - Interface to access a section of the data, using lazy access whenever - possible. - - Returns - -------- - An instance of ``NDWindowing``, which provides ``__getitem__``, - to allow the use of square brackets when specifying the window. - Ultimately, an ``NDWindowingAstrodata`` instance is returned. - - Examples - --------- - - >>> ad[0].nddata.window[100:200, 100:200] # doctest: +SKIP - - - """ - return NDWindowing(self) - - def _get_uncertainty(self, section=None): - """Return the ADVarianceUncertainty object, or a slice of it.""" - if self._uncertainty is not None: - if is_lazy(self._uncertainty): - if section is None: - self.uncertainty = ADVarianceUncertainty(self._uncertainty.data) - return self.uncertainty - else: - return ADVarianceUncertainty(self._uncertainty[section]) - elif section is not None: - return self._uncertainty[section] - else: - return self._uncertainty - - def _get_simple(self, target, section=None): - """Only use 'section' for image-like objects that have the same shape - as the NDAstroData object; otherwise, return the whole object""" - source = getattr(self, target) - if source is not None: - if is_lazy(source): - if section is None: - ret = np.empty(source.shape, dtype=source.dtype) - ret[:] = source.data - setattr(self, target, ret) - else: - ret = source[section] - return ret - elif hasattr(source, 'shape'): - if section is None or source.shape != self.shape: - return np.array(source, copy=False) - else: - return np.array(source, copy=False)[section] - else: - return source - - @property - def data(self): - """ - An array representing the raw data stored in this instance. - It implements a setter. - """ - return self._get_simple('_data') - - @data.setter - def data(self, value): - if value is None: - raise ValueError("Cannot have None as the data value for an NDData object") - - if is_lazy(value): - self.meta['header'] = value.header - self._data = value - - @property - def uncertainty(self): - return self._get_uncertainty() - - @uncertainty.setter - def uncertainty(self, value): - if value is not None and not is_lazy(value): - if value._parent_nddata is not None: - value = value.__class__(value, copy=False) - value.parent_nddata = self - self._uncertainty = value - - @property - def mask(self): - return self._get_simple('_mask') - - @mask.setter - def mask(self, value): - self._mask = value - - @property - def variance(self): - """ - A convenience property to access the contents of ``uncertainty``, - squared (as the uncertainty data is stored as standard deviation). - """ - arr = self._get_uncertainty() - if arr is not None: - return arr.array - - @variance.setter - def variance(self, value): - self.uncertainty = (ADVarianceUncertainty(value) if value is not None - else None) - - def set_section(self, section, input): - """ - Sets only a section of the data. This method is meant to prevent - fragmentation in the Python heap, by reusing the internal structures - instead of replacing them with new ones. - - Args - ----- - section : ``slice`` - The area that will be replaced - input : ``NDData``-like instance - This object needs to implement at least ``data``, ``uncertainty``, - and ``mask``. Their entire contents will replace the data in the - area defined by ``section``. - - Examples - --------- - - >>> sec = NDData(np.zeros((100,100))) # doctest: +SKIP - >>> ad[0].nddata.set_section((slice(None,100),slice(None,100)), sec) # doctest: +SKIP - - """ - self.data[section] = input.data - if self.uncertainty is not None: - self.uncertainty.array[section] = input.uncertainty.array - if self.mask is not None: - self.mask[section] = input.mask - - def __repr__(self): - if is_lazy(self._data): - return self.__class__.__name__ + '(Memmapped)' - else: - return super().__repr__() - - @property - def T(self): - return self.transpose() - - def transpose(self): - unc = self.uncertainty - new_wcs = deepcopy(self.wcs) - inframe = new_wcs.input_frame - new_wcs.insert_transform(inframe, models.Mapping(tuple(reversed(range(inframe.naxes)))), after=True) - return self.__class__( - self.data.T, - uncertainty=None if unc is None else unc.__class__(unc.array.T), - mask=None if self.mask is None else self.mask.T, wcs=new_wcs, - meta=self.meta, copy=False - ) - - def _slice(self, item): - """Additionally slice things like OBJMASK""" - kwargs = super()._slice(item) - if 'other' in kwargs['meta']: - kwargs['meta'] = deepcopy(self.meta) - for k, v in kwargs['meta']['other'].items(): - if isinstance(v, np.ndarray) and v.shape == self.shape: - kwargs['meta']['other'][k] = v[item] - return kwargs diff --git a/astrodata/provenance.py b/astrodata/provenance.py deleted file mode 100644 index be24a5ed29..0000000000 --- a/astrodata/provenance.py +++ /dev/null @@ -1,303 +0,0 @@ -import json - -from astropy.table import Table -from datetime import datetime, timezone - - -def add_provenance(ad, filename, md5, primitive, timestamp=None): - """ - Add the given provenance entry to the full set of provenance records on - this object. - - Provenance is added even if the incoming md5 is None or ''. This indicates - source data for the provenance that are not on disk. - - Parameters - ---------- - ad : `astrodata.AstroData` - filename : str - md5 : str - primitive : str - timestamp : `datetime.datetime` - - """ - # Handle data where the md5 is None. It will need to be a string type to - # store in the FITS table. - md5 = '' if md5 is None else md5 - - if timestamp is None: - timestamp = datetime.now(timezone.utc).replace(tzinfo=None).isoformat() - - if hasattr(ad, 'PROVENANCE'): - existing_provenance = ad.PROVENANCE - for row in existing_provenance: - if row[1] == filename and \ - row[2] == md5 and \ - row[3] == primitive: - # nothing needed, we already have it - return - - if not hasattr(ad, 'PROVENANCE'): - timestamp_data = [timestamp] - filename_data = [filename] - md5_data = [md5] - provenance_added_by_data = [primitive] - ad.PROVENANCE = Table( - [timestamp_data, filename_data, md5_data, provenance_added_by_data], - names=('timestamp', 'filename', 'md5', 'provenance_added_by'), - dtype=('S28', 'S128', 'S128', 'S128')) - else: - provenance = ad.PROVENANCE - provenance.add_row((timestamp, filename, md5, primitive)) - - -def add_history(ad, timestamp_start, timestamp_stop, primitive, args): - """ - Add the given History entry to the full set of history records on this - object. - - Parameters - ---------- - ad : `astrodata.AstroData` - AstroData object to add history record to. - timestamp_start : `datetime.datetime` - Date of the start of this operation. - timestamp_stop : `datetime.datetime` - Date of the end of this operation. - primitive : str - Name of the primitive performed. - args : str - Arguments used for the primitive call. - - """ - # If the ad instance has the old 'PROVHISTORY' extenstion name, rename it - # now to 'HISTORY' - if hasattr(ad, 'PROVHISTORY'): - ad.HISTORY = ad.PROVHISTORY - del ad.PROVHISTORY - - # I modified these indices, so making this method adaptive to existing - # histories with the old ordering. This also makes modifying the order - # in future easier - primitive_col_idx, args_col_idx, timestamp_start_col_idx, \ - timestamp_stop_col_idx = find_history_column_indices(ad) - - if hasattr(ad, 'HISTORY') and None not in (primitive_col_idx, args_col_idx, - timestamp_stop_col_idx, - timestamp_start_col_idx): - for row in ad.HISTORY: - if timestamp_start == row[timestamp_start_col_idx] and \ - timestamp_stop == row[timestamp_stop_col_idx] and \ - primitive == row[primitive_col_idx] and \ - args == row[args_col_idx]: - # already in the history, skip - return - - colsize = len(args)+1 - if hasattr(ad, 'HISTORY'): - colsize = max(colsize, (max(len(ph[args_col_idx]) - for ph in ad.HISTORY) + 1) - if args_col_idx is not None else 16) - - timestamp_start_arr = [ph[timestamp_start_col_idx] - if timestamp_start_col_idx is not None else '' - for ph in ad.HISTORY] - timestamp_stop_arr = [ph[timestamp_stop_col_idx] - if timestamp_stop_col_idx is not None else '' - for ph in ad.HISTORY] - primitive_arr = [ph[primitive_col_idx] - if primitive_col_idx is not None else '' - for ph in ad.HISTORY] - args_arr = [ph[args_col_idx] if args_col_idx is not None else '' - for ph in ad.HISTORY] - else: - timestamp_start_arr = [] - timestamp_stop_arr = [] - primitive_arr = [] - args_arr = [] - - timestamp_start_arr.append(timestamp_start) - timestamp_stop_arr.append(timestamp_stop) - primitive_arr.append(primitive) - args_arr.append(args) - - dtype = ("S128", "S%d" % colsize, "S28", "S28") - ad.HISTORY = Table([primitive_arr, args_arr, timestamp_start_arr, - timestamp_stop_arr], - names=('primitive', 'args', 'timestamp_start', - 'timestamp_stop'), - dtype=dtype) - - -def clone_provenance(provenance_data, ad): - """ - For a single input's provenance, copy it into the output - `AstroData` object as appropriate. - - This takes a dictionary with a source filename, md5 and both its - original provenance and history information. It duplicates - the provenance data into the outgoing `AstroData` ad object. - - Parameters - ---------- - provenance_data : - Pointer to the `~astrodata.AstroData` table with the provenance - information. *Note* this may be the output `~astrodata.AstroData` - as well, so we need to handle that. - ad : `astrodata.AstroData` - Outgoing `~astrodata.AstroData` object to add provenance data to. - - - """ - pd = [(prov[1], prov[2], prov[3], prov[0]) for prov in provenance_data] - for p in pd: - add_provenance(ad, p[0], p[1], p[2], timestamp=p[3]) - - -def clone_history(history_data, ad): - """ - For a single input's history, copy it into the output - `AstroData` object as appropriate. - - This takes a dictionary with a source filename, md5 and both its - original provenance and history information. It duplicates - the history data into the outgoing `AstroData` ad object. - - Parameters - ---------- - history_data : - pointer to the `AstroData` table with the history information. - *Note* this may be the output `~astrodata.AstroData` as well, so we - need to handle that. - ad : `astrodata.AstroData` - Outgoing `~astrodata.AstroData` object to add history data - to. - - """ - primitive_col_idx, args_col_idx, timestamp_start_col_idx, \ - timestamp_stop_col_idx = find_history_column_indices(ad) - hd = [(hist[timestamp_start_col_idx], hist[timestamp_stop_col_idx], - hist[primitive_col_idx], hist[args_col_idx]) - for hist in history_data] - for h in hd: - add_history(ad, h[0], h[1], h[2], h[3]) - - -def find_history_column_indices(ad): - if hasattr(ad, 'HISTORY'): - primitive_col_idx = None - args_col_idx = None - timestamp_start_col_idx = None - timestamp_stop_col_idx = None - for idx, colname in enumerate(ad.HISTORY.colnames): - if colname == 'primitive': - primitive_col_idx = idx - elif colname == 'args': - args_col_idx = idx - elif colname == 'timestamp_start': - timestamp_start_col_idx = idx - elif colname == 'timestamp_stop': - timestamp_stop_col_idx = idx - else: - # defaults - primitive_col_idx = 0 - args_col_idx = 1 - timestamp_start_col_idx = 2 - timestamp_stop_col_idx = 3 - - return primitive_col_idx, args_col_idx, timestamp_start_col_idx, \ - timestamp_stop_col_idx - - -def provenance_summary(ad, provenance=True, history=True): - """ - Generate a pretty text display of the provenance information for an - `~astrodata.core.AstroData`. - - This pulls the provenance and history information from a - `~astrodata.core.AstroData` object and formats it for readability. The - primitive arguments in the history are wrapped across multiple lines to - keep the overall width manageable. - - Parameters - ---------- - ad : :class:`~astrodata.core.AstroData` - Input data to read provenance from - provenance : bool - True to show provenance - history : bool - True to show the history with associated parameters and timestamps - - Returns - ------- - str representation of the provenance and history - """ - retval = "" - if provenance: - if hasattr(ad, 'PROVENANCE'): - retval = f"Provenance\n----------\n{ad.PROVENANCE}\n" - else: - retval = "No Provenance found\n" - if history: - if provenance: - retval += "\n" # extra blank line between - if hasattr(ad, 'PROVHISTORY'): - retval += "Warning: File uses old PROVHISTORY extname." - ad.HISTORY = ad.PROVHISTORY - if hasattr(ad, 'HISTORY'): - retval += "History\n-------\n" - - primitive_col_idx, args_col_idx, timestamp_start_col_idx, \ - timestamp_stop_col_idx = find_history_column_indices(ad) - - primitive_col_size = 9 - timestamp_start_col_size = 28 - timestamp_stop_col_size = 28 - args_col_size = 16 - - # infer args size by finding the max for the folded json values - for row in ad.HISTORY: - argsstr = row[args_col_idx] - args = json.loads(argsstr) - argspp = json.dumps(args, indent=4) - for line in argspp.split('\n'): - args_col_size = max(args_col_size, len(line)) - primitive_col_size = max(primitive_col_size, - len(row[primitive_col_idx])) - - # Titles - retval += f'{"Primitive":<{primitive_col_size}} ' \ - f'{"Args":<{args_col_size}} ' \ - f'{"Start":<{timestamp_start_col_size}} {"Stop"}\n' - # now the lines - retval += f'{"":{"-"}<{primitive_col_size}} ' \ - f'{"":{"-"}<{args_col_size}} ' \ - f'{"":{"-"}<{timestamp_start_col_size}} ' \ - f'{"":{"-"}<{timestamp_stop_col_size}}\n' - - # Rows, looping over args lines - for row in ad.HISTORY: - primitive = row[primitive_col_idx] - args = row[args_col_idx] - start = row[timestamp_start_col_idx] - stop = row[timestamp_stop_col_idx] - first = True - try: - parseargs = json.loads(args) - args = json.dumps(parseargs, indent=4) - except Exception: - pass # ok, just use whatever non-json was in there - for argrow in args.split('\n'): - if first: - retval += f'{primitive:<{primitive_col_size}} ' \ - f'{argrow:<{args_col_size}} ' \ - f'{start:<{timestamp_start_col_size}} ' \ - f'{stop}\n' - else: - retval += f'{"":<{primitive_col_size}} {argrow}\n' - # prep for additional arg rows without duplicating the - # other values - first = False - else: - retval += "No Provenance History found.\n" - return retval diff --git a/astrodata/testing.py b/astrodata/testing.py deleted file mode 100644 index b8b96925f1..0000000000 --- a/astrodata/testing.py +++ /dev/null @@ -1,562 +0,0 @@ -""" -Fixtures to be used in tests in DRAGONS -""" - -import os -import shutil -import urllib -import xml.etree.ElementTree as et - -import numpy as np -import pytest -from astropy.table import Table -from astropy.utils.data import download_file - -from geminidr.gemini.lookups.timestamp_keywords import timestamp_keys -from gempy.library import astrotools as at - -URL = 'https://archive.gemini.edu/file/' - - -def assert_most_close(actual, desired, max_miss, rtol=1e-7, atol=0, - equal_nan=True, verbose=True): - """ - Raises an AssertionError if the number of elements in two objects that are - not equal up to desired tolerance is greater than expected. - - See Also - -------- - :func:`~numpy.testing.assert_allclose` - - Parameters - ---------- - actual : array_like - Array obtained. - desired : array_like - Array desired. - max_miss : iny - Maximum number of mismatched elements. - rtol : float, optional - Relative tolerance. - atol : float, optional - Absolute tolerance. - equal_nan : bool, optional. - If True, NaNs will compare equal. - verbose : bool, optional - If True, the conflicting values are appended to the error message. - Raises - ------ - AssertionError - If actual and desired are not equal up to specified precision. - """ - from numpy.testing import assert_allclose - - try: - assert_allclose(actual, desired, atol=atol, equal_nan=equal_nan, - err_msg='', rtol=rtol, verbose=verbose) - - except AssertionError as e: - n_miss = e.args[0].split('\n')[3].split(':')[-1].split('(')[0].split('/')[0] - n_miss = int(n_miss.strip()) - - if n_miss > max_miss: - error_message = ( - "%g mismatching elements are more than the " % n_miss + - "expected %g." % max_miss + - '\n'.join(e.args[0].split('\n')[3:])) - - raise AssertionError(error_message) - - -def assert_most_equal(actual, desired, max_miss, verbose=True): - """ - Raises an AssertionError if more than `n` elements in two objects are not - equal. For more information, check :func:`numpy.testing.assert_equal`. - - Parameters - ---------- - actual : array_like - The object to check. - desired : array_like - The expected object. - max_miss : int - Maximum number of mismatched elements. - verbose : bool, optional - If True, the conflicting values are appended to the error message. - - Raises - ------ - AssertionError - If actual and desired are not equal. - """ - from numpy.testing import assert_equal - - try: - assert_equal(actual, desired, err_msg='', verbose=verbose) - except AssertionError as e: - - n_miss = e.args[0].split('\n')[3].split(':')[-1].split('(')[0].split('/')[0] - n_miss = int(n_miss.strip()) - - if n_miss > max_miss: - error_message = ( - "%g mismatching elements are more than the " % n_miss + - "expected %g." % max_miss + - '\n'.join(e.args[0].split('\n')[3:])) - - raise AssertionError(error_message) - - -def assert_same_class(ad, ad_ref): - """ - Compare if two :class:`~astrodata.AstroData` (or any subclass) have the - same class. - - Parameters - ---------- - ad : :class:`astrodata.AstroData` or any subclass - AstroData object to be checked. - ad_ref : :class:`astrodata.AstroData` or any subclass - AstroData object used as reference - """ - from astrodata import AstroData - - assert isinstance(ad, AstroData) - assert isinstance(ad_ref, AstroData) - assert isinstance(ad, type(ad_ref)) - - -def compare_models(model1, model2, rtol=1e-7, atol=0., check_inverse=True): - """ - Check that any two models are the same, within some tolerance on parameters - (using the same defaults as numpy.assert_allclose()). - - This is constructed like a test, rather than returning True/False, in order - to provide more useful information as to how the models differ when a test - fails (and with more concise syntax). - - If `check_inverse` is True (the default), only first-level inverses are - compared, to avoid unending recursion, since the inverse of an inverse - should be the supplied input model, if defined. The types of any inverses - (and their inverses in turn) are required to match whether or not their - parameters etc. are compared. - - This function might not completely guarantee that model1 & model2 are - identical for some models whose evaluation depends on class-specific - parameters controlling how the array of model `parameters` is interpreted - (eg. the orders in SIP?), but it does cover our common use of compound - models involving orthonormal polynomials etc. - """ - - from astropy.modeling import Model - from numpy.testing import assert_allclose - - if not (isinstance(model1, Model) and isinstance(model2, Model)): - raise TypeError('Inputs must be Model instances') - - if model1 is model2: - return - - # Require each model to be composed of same number of constituent models: - assert model1.n_submodels == model2.n_submodels - - # Treat everything like an iterable compound model: - if model1.n_submodels == 1: - model1 = [model1] - model2 = [model2] - - # Compare the constituent model definitions: - for m1, m2 in zip(model1, model2): - assert type(m1) == type(m2) - assert len(m1.parameters) == len(m2.parameters) - # NB. For 1D models the degrees match if the numbers of parameters do - if hasattr(m1, 'x_degree'): - assert m1.x_degree == m2.x_degree - if hasattr(m1, 'y_degree'): - assert m1.y_degree == m2.y_degree - if hasattr(m1, 'domain'): - assert m1.domain == m2.domain - if hasattr(m1, 'x_domain'): - assert m1.x_domain == m2.x_domain - if hasattr(m1, 'y_domain'): - assert m1.y_domain == m2.y_domain - - # Compare the model parameters (coefficients): - assert_allclose(model1.parameters, model2.parameters, rtol=rtol, atol=atol) - - # Now check for any inverse models and require them both to have the same - # type or be undefined: - try: - inverse1 = model1.inverse - except NotImplementedError: - inverse1 = None - try: - inverse2 = model2.inverse - except NotImplementedError: - inverse2 = None - - assert type(inverse1) == type(inverse2) - - # Compare inverses only if they exist and are not the forward model itself: - if inverse1 is None or (inverse1 is model1 and inverse2 is model2): - check_inverse = False - - # Recurse over the inverse models (but not their inverses in turn): - if check_inverse: - compare_models(inverse1, inverse2, rtol=rtol, atol=atol, - check_inverse=False) - - -def download_from_archive(filename, sub_path='raw_files', env_var='DRAGONS_TEST', url=None): - """ - Download file from the archive (or an alternative URL) and store it in the - local cache. - - Parameters - ---------- - filename : str - The filename, e.g. N20160524S0119.fits - sub_path : str - By default the file is stored at the root of the cache directory, but - using ``path`` allows to specify a sub-directory. - env_var: str - Environment variable containing the path to the cache directory. - url : str, optional - Alternative URL of the file to be fetched, if not using the Gemini - archive (a full path is required, since the last part of the path - component may differ from the nominal `filename` for some services, - such as Google Drive). - - Returns - ------- - str - Name of the cached file with the path added to it. - """ - # Find cache path and make sure it exists - root_cache_path = os.getenv(env_var) - - if root_cache_path is None: - raise ValueError(f'Environment variable not set: {env_var}') - - root_cache_path = os.path.expanduser(root_cache_path) - - if sub_path is not None: - cache_path = os.path.join(root_cache_path, sub_path) - - if not os.path.exists(cache_path): - os.makedirs(cache_path) - - if url is None: - url = URL + filename - - # Now check if the local file exists and download if not - local_path = os.path.join(cache_path, filename) - if not os.path.exists(local_path): - tmp_path = download_file(url, cache=False) - shutil.move(tmp_path, local_path) - - # `download_file` ignores Access Control List - fixing it - os.chmod(local_path, 0o664) - - return local_path - - -def get_associated_calibrations(filename, nbias=5): - """ - Queries Gemini Observatory Archive for associated calibrations to reduce - the data that will be used for testing. - - Parameters - ---------- - filename : str - Input file name - """ - url = f"https://archive.gemini.edu/calmgr/{filename}" - tree = et.parse(urllib.request.urlopen(url)) - root = tree.getroot() - prefix = root.tag[:root.tag.rfind('}') + 1] - - rows = [] - for node in tree.iter(prefix + 'calibration'): - cal_type = node.find(prefix + 'caltype').text - cal_filename = node.find(prefix + 'filename').text - if not ('processed_' in cal_filename or 'specphot' in cal_filename): - rows.append((cal_filename, cal_type)) - - tbl = Table(rows=rows, names=['filename', 'caltype']) - tbl.sort('filename') - tbl.remove_rows(np.where(tbl['caltype'] == 'bias')[0][nbias:]) - return tbl - - -class ADCompare: - """ - Compare two AstroData instances to determine whether they are basically - the same. Various properties (both data and metadata) can be compared - """ - # These are the keywords relating to a FITS WCS that we won't check - # because we check the gWCS objects instead and to the DRAGONS PROCxxxx - # headers, because that would mean updating every reference file every time - # the version changes (for PROCSVER) - fits_keys = {'WCSAXES', 'WCSDIM', 'RADESYS', 'BITPIX', 'PROCSOFT', - 'PROCSVER', 'PROCMODE'} - for i in range(1, 6): - fits_keys.update([f'CUNIT{i}', f'CTYPE{i}', f'CDELT{i}', f'CRVAL{i}', - f'CRPIX{i}']) - fits_keys.update([f'CD{i}_{j}' for i in range(1, 6) for j in range(1, 6)]) - - def __init__(self, ad1, ad2): - self.ad1 = ad1 - self.ad2 = ad2 - - def run_comparison(self, max_miss=0, rtol=1e-7, atol=0, compare=None, - ignore=None, ignore_fits_wcs=True, ignore_kw=None, - raise_exception=True): - """ - Perform a comparison between the two AD objects in this instance. - - Parameters - ---------- - max_miss: int - maximum number of elements in each array that can disagree - rtol: float - relative tolerance allowed between array elements - atol: float - absolute tolerance allowed between array elements - compare: list/None - list of comparisons to perform - ignore: list/None - list of comparisons to ignore - ignore_fits_wcs: bool - ignore FITS keywords relating to WCS (to allow a comparison - between an in-memory AD and one on disk if you're not interested - in these, without needed to save to disk) - ignore_kw: sequence/None - additional keywords to ignore in headers - raise_exception: bool - raise an AssertionError if the comparison fails? If False, - the errordict is returned, which may be useful if a very - specific mismatch is permitted - - Raises - ------- - AssertionError if the AD objects do not agree. - """ - self.max_miss = max_miss - self.rtol = rtol - self.atol = atol - self.ignore_kw = self.fits_keys if ignore_fits_wcs else set([]) - self.ignore_kw.add('') - if ignore_kw: - self.ignore_kw.update(ignore_kw) - if compare is None: - compare = ('filename', 'tags', 'numext', 'refcat', 'phu', - 'hdr', 'attributes', 'wcs') - if ignore is not None: - compare = [c for c in compare if c not in ignore] - - errordict = {} - for func_name in compare: - errorlist = getattr(self, func_name)() - if errorlist: - errordict[func_name] = errorlist - if errordict and raise_exception: - raise AssertionError(self.format_errordict(errordict)) - return errordict - - def numext(self): - """Check the number of extensions is equal""" - numext1, numext2 = len(self.ad1), len(self.ad2) - if numext1 != numext2: - return [f'{numext1} v {numext2}'] - - def filename(self): - """Check the filenames are equal""" - fname1, fname2 = self.ad1.filename, self.ad2.filename - if fname1 != fname2: - return [f'{fname1} v {fname2}'] - - def tags(self): - """Check the tags are equal""" - tags1, tags2 = self.ad1.tags, self.ad2.tags - if tags1 != tags2: - return [f'{tags1}\n v {tags2}'] - - def phu(self): - """Check the PHUs agree""" - # Ignore NEXTEND as only recently added and len(ad) handles it - errorlist = self._header(self.ad1.phu, self.ad2.phu, - ignore=self.ignore_kw.union({'NEXTEND'})) - if errorlist: - return errorlist - - def hdr(self): - """Check the extension headers agree""" - errorlist = [] - for i, (hdr1, hdr2) in enumerate(zip(self.ad1.hdr, self.ad2.hdr)): - elist = self._header(hdr1, hdr2, ignore=self.ignore_kw) - if elist: - errorlist.extend([f'Slice {i} HDR mismatch'] + elist) - return errorlist - - def _header(self, hdr1, hdr2, ignore=None): - """General method for comparing headers, ignoring some keywords - - Parameters - ---------- - hdr1, hdr2: dict - The headers to compare. - ignore : `list` of `str` - A list of strings corresponding to header keywords which should be - excluded from matching between both headers. - - """ - errorlist = [] - s1 = set(hdr1.keys()) - {'HISTORY', 'COMMENT'} - s2 = set(hdr2.keys()) - {'HISTORY', 'COMMENT'} - if ignore: - s1 -= set(ignore) - s2 -= set(ignore) - if s1 != s2: - if s1 - s2: - errorlist.append(f'Header 1 contains keywords {s1 - s2}') - if s2 - s1: - errorlist.append(f'Header 2 contains keywords {s2 - s1}') - - ignore_list = ['GEM-TLM', 'HISTORY', 'COMMENT', ''] - # Include keywords from `ignore` parameter. - if ignore: - ignore_list.extend(ignore) - - for kw in hdr1: - # GEM-TLM is "time last modified" - if (kw not in timestamp_keys.values() and kw not in ignore_list and - kw not in self.ignore_kw): - try: - v1, v2 = hdr1[kw], hdr2[kw] - except KeyError: # Missing keyword in AD2 - continue - try: - if abs(v1 - v2) >= 0.01: - errorlist.append(f'{kw} value mismatch: {v1} v {v2}') - except TypeError: - if v1 != v2: - errorlist.append(f'{kw} value inequality: {v1} v {v2}') - return errorlist - - def refcat(self): - """Check both ADs have REFCATs (or not) and that the lengths agree""" - refcat1 = getattr(self.ad1, 'REFCAT', None) - refcat2 = getattr(self.ad2, 'REFCAT', None) - if (refcat1 is None) ^ (refcat2 is None): - return [f'presence: {refcat1 is not None} v {refcat2 is not None}'] - elif refcat1 is not None: # and refcat2 must also exist - len1, len2 = len(refcat1), len(refcat2) - if len1 != len2: - return [f'lengths: {len1} v {len2}'] - - def attributes(self): - """Check extension-level attributes""" - errorlist = [] - for i, (ext1, ext2) in enumerate(zip(self.ad1, self.ad2)): - elist = self._attributes(ext1, ext2) - if elist: - errorlist.extend([f'Slice {i} attribute mismatch'] + elist) - return errorlist - - def _attributes(self, ext1, ext2): - """Helper method for checking attributes""" - errorlist = [] - for attr in ['data', 'mask', 'variance', 'OBJMASK', 'OBJCAT']: - attr1 = getattr(ext1, attr, None) - attr2 = getattr(ext2, attr, None) - if (attr1 is None) ^ (attr2 is None): - errorlist.append(f'Attribute error for {attr}: ' - f'{attr1 is not None} v {attr2 is not None}') - elif attr1 is not None: - if isinstance(attr1, Table): - if len(attr1) != len(attr2): - errorlist.append(f'attr lengths differ: ' - f'{len(attr1)} v {len(attr2)}') - else: # everything else is pixel-like - if attr1.dtype.name != attr2.dtype.name: - errorlist.append(f'Datatype mismatch for {attr}: ' - f'{attr1.dtype} v {attr2.dtype}') - if attr1.shape != attr2.shape: - errorlist.append(f'Shape mismatch for {attr}: ' - f'{attr1.shape} v {attr2.shape}') - if 'int' in attr1.dtype.name: - try: - assert_most_equal(attr1, attr2, max_miss=self.max_miss) - except AssertionError as e: - errorlist.append(f'Inequality for {attr}: '+str(e)) - else: - try: - assert_most_close(attr1, attr2, max_miss=self.max_miss, - rtol=self.rtol, atol=self.atol) - except AssertionError as e: - errorlist.append(f'Mismatch for {attr}: '+str(e)) - return errorlist - - def wcs(self): - """Check WCS agrees""" - def compare_frames(frame1, frame2): - """Compare the important stuff of two CoordinateFrame instances""" - for attr in ("naxes", "axes_type", "axes_order", "unit", "axes_names"): - assert getattr(frame1, attr) == getattr(frame2, attr) - - errorlist = [] - for i, (ext1, ext2) in enumerate(zip(self.ad1, self.ad2)): - wcs1, wcs2 = ext1.wcs, ext2.wcs - if (wcs1 is None) != (wcs2 is None): - errorlist.append(f'Slice {i} WCS presence mismatch ' - f'{wcs1 is not None} {wcs2 is not None}') - continue - elif wcs1 is None: # and wcs2 is also None - continue - frames1, frames2 = wcs1.available_frames, wcs2.available_frames - if frames1 != frames2: - errorlist.append(f'Slice {i} frames differ: {frames1} v {frames2}') - return errorlist - for frame in frames1: - frame1, frame2 = getattr(wcs1, frame), getattr(wcs2, frame) - try: - compare_frames(frame1, frame2) - except AssertionError: - errorlist.compare(f'Slice {i} {frame} differs: ' - f'{frame1} v {frame2}') - corners = at.get_corners(ext1.shape) - world1, world2 = wcs1(*zip(*corners)), wcs2(*zip(*corners)) - try: - np.testing.assert_allclose(world1, world2) - except AssertionError: - errorlist.append(f'Slice {i} world coords differ: {world1} v {world2}') - return errorlist - - def format_errordict(self, errordict): - """Format the errordict into a str for reporting""" - errormsg = f'Comparison between {self.ad1.filename} and {self.ad2.filename}' - for k, v in errordict.items(): - errormsg += f'\nComparison failure in {k}' - errormsg += '\n' + ('-' * (22 + len(k))) + '\n' - errormsg += '\n '.join(v) - return errormsg - -def ad_compare(ad1, ad2, **kwargs): - """ - Compares the tags, headers, and pixel values of two images. This is simply - a wrapper for ADCompare.run_comparison() for backward-compatibility. - - Parameters - ---------- - ad1: AstroData - first AD objects - ad2: AstroData - second AD object - - Returns - ------- - bool: are the two AD instances basically the same? - """ - compare = ADCompare(ad1, ad2).run_comparison(**kwargs) - return compare == {} diff --git a/astrodata/tests/__init__.py b/astrodata/tests/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/astrodata/tests/test_core.py b/astrodata/tests/test_core.py deleted file mode 100644 index ab80e42fcd..0000000000 --- a/astrodata/tests/test_core.py +++ /dev/null @@ -1,273 +0,0 @@ -import operator -from copy import deepcopy - -import numpy as np -import pytest -from numpy.testing import assert_array_equal - -import astrodata -from astropy.io import fits -from astropy.nddata import NDData, VarianceUncertainty -from astropy.table import Table - -SHAPE = (4, 5) - - -@pytest.fixture -def ad1(): - hdr = fits.Header({'INSTRUME': 'darkimager', 'OBJECT': 'M42'}) - phu = fits.PrimaryHDU(header=hdr) - hdu = fits.ImageHDU(data=np.ones(SHAPE), name='SCI') - return astrodata.create(phu, [hdu]) - - -@pytest.fixture -def ad2(): - phu = fits.PrimaryHDU() - hdu = fits.ImageHDU(data=np.ones(SHAPE) * 2, name='SCI') - return astrodata.create(phu, [hdu]) - - -def test_attributes(ad1): - assert ad1[0].shape == SHAPE - - data = ad1[0].data - assert_array_equal(data, 1) - assert data.mean() == 1 - assert np.median(data) == 1 - - assert ad1.phu['INSTRUME'] == 'darkimager' - assert ad1.instrument() == 'darkimager' - assert ad1.object() == 'M42' - - -@pytest.mark.parametrize('op, res, res2', [ - (operator.add, 3, 3), - (operator.sub, -1, 1), - (operator.mul, 2, 2), - (operator.truediv, 0.5, 2) -]) -def test_arithmetic(op, res, res2, ad1, ad2): - for data in (ad2, ad2.data): - result = op(ad1, data) - assert_array_equal(result.data, res) - assert isinstance(result, astrodata.AstroData) - assert len(result) == 1 - assert isinstance(result[0].data, np.ndarray) - assert isinstance(result[0].hdr, fits.Header) - - result = op(data, ad1) - assert_array_equal(result.data, res2) - - for data in (ad2[0], ad2[0].data): - result = op(ad1[0], data) - assert_array_equal(result.data, res) - assert isinstance(result, astrodata.AstroData) - assert len(result) == 1 - assert isinstance(result[0].data, np.ndarray) - assert isinstance(result[0].hdr, fits.Header) - - # FIXME: should work also with ad2[0].data, but crashes - result = op(ad2[0], ad1[0]) - assert_array_equal(result.data, res2) - - -@pytest.mark.parametrize('op, res, res2', [ - (operator.iadd, 3, 3), - (operator.isub, -1, 1), - (operator.imul, 2, 2), - (operator.itruediv, 0.5, 2) -]) -def test_arithmetic_inplace(op, res, res2, ad1, ad2): - for data in (ad2, ad2.data): - ad = deepcopy(ad1) - op(ad, data) - assert_array_equal(ad.data, res) - assert isinstance(ad, astrodata.AstroData) - assert len(ad) == 1 - assert isinstance(ad[0].data, np.ndarray) - assert isinstance(ad[0].hdr, fits.Header) - - # data2 = deepcopy(ad2[0]) - # op(data2, ad1) - # assert_array_equal(data2, res2) - - for data in (ad2[0], ad2[0].data): - ad = deepcopy(ad1) - op(ad[0], data) - assert_array_equal(ad.data, res) - assert isinstance(ad, astrodata.AstroData) - assert len(ad) == 1 - assert isinstance(ad[0].data, np.ndarray) - assert isinstance(ad[0].hdr, fits.Header) - - -@pytest.mark.parametrize('op, res', [ - (operator.add, (3, 7)), - (operator.sub, (-1, 3)), - (operator.mul, (2, 10)), - (operator.truediv, (0.5, 2.5)) -]) -def test_arithmetic_multiple_ext(op, res, ad1): - ad1.append(np.ones(SHAPE, dtype=np.uint16) + 4) - - result = op(ad1, 2) - assert len(result) == 2 - assert_array_equal(result[0].data, res[0]) - assert_array_equal(result[1].data, res[1]) - - for i, ext in enumerate(ad1): - result = op(ext, 2) - assert len(result) == 1 - assert_array_equal(result[0].data, res[i]) - - -@pytest.mark.parametrize('op, res', [ - (operator.iadd, (3, 7)), - (operator.isub, (-1, 3)), - (operator.imul, (2, 10)), - (operator.itruediv, (0.5, 2.5)) -]) -def test_arithmetic_inplace_multiple_ext(op, res, ad1): - ad1.append(np.ones(SHAPE, dtype=np.uint16) + 4) - - ad = deepcopy(ad1) - result = op(ad, 2) - assert len(result) == 2 - assert_array_equal(result[0].data, res[0]) - assert_array_equal(result[1].data, res[1]) - - # Making a deepcopy will create a single nddata object but not sliced - # as it is now independant from its parent - for i, ext in enumerate(ad1): - ext = deepcopy(ext) - result = op(ext, 2) - assert len(result) == 1 - assert_array_equal(result[0].data, res[i]) - - # Now work directly on the input object, will creates single ad objects - for i, ext in enumerate(ad1): - result = op(ext, 2) - assert len(result) == 1 - assert_array_equal(result.data, res[i]) - - -@pytest.mark.parametrize('op, arg, res', [('add', 100, 101), - ('subtract', 100, -99), - ('multiply', 3, 3), - ('divide', 2, 0.5)]) -def test_operations(ad1, op, arg, res): - result = getattr(ad1, op)(arg) - assert_array_equal(result.data, res) - assert isinstance(result, astrodata.AstroData) - assert isinstance(result[0].data, np.ndarray) - assert isinstance(result[0].hdr, fits.Header) - assert len(result) == 1 - - -def test_operate(): - ad = astrodata.create({}) - nd = NDData(data=[[1, 2], [3, 4]], - uncertainty=VarianceUncertainty(np.ones((2, 2))), - mask=np.identity(2), - meta={'header': fits.Header()}) - ad.append(nd) - - ad.operate(np.sum, axis=1) - assert_array_equal(ad[0].data, [3, 7]) - assert_array_equal(ad[0].variance, [2, 2]) - assert_array_equal(ad[0].mask, [1, 1]) - - -def test_write_and_read(tmpdir, capsys): - ad = astrodata.create({}) - nd = NDData(data=[[1, 2], [3, 4]], - uncertainty=VarianceUncertainty(np.ones((2, 2))), - mask=np.identity(2), - meta={'header': fits.Header()}) - ad.append(nd) - - tbl = Table([np.zeros(10), np.ones(10)], names=('a', 'b')) - - with pytest.raises(ValueError, - match='Tables should be set directly as attribute'): - ad.append(tbl, name='BOB') - - ad.BOB = tbl - - tbl = Table([np.zeros(5) + 2, np.zeros(5) + 3], names=('c', 'd')) - - match = "Cannot append table 'BOB' because it would hide a top-level table" - with pytest.raises(ValueError, match=match): - ad[0].BOB = tbl - - ad[0].BOB2 = tbl - ad[0].MYVAL_WITH_A_VERY_LONG_NAME = np.arange(10) - - match = "You can only append NDData derived instances at the top level" - with pytest.raises(TypeError, match=match): - ad[0].MYNDD = NDData(data=np.ones(10), meta={'header': fits.Header()}) - - testfile = str(tmpdir.join('testfile.fits')) - ad.write(testfile) - - ad = astrodata.open(testfile) - ad.info() - captured = capsys.readouterr() - assert captured.out.splitlines()[3:] == [ - 'Pixels Extensions', - 'Index Content Type Dimensions Format', - '[ 0] science NDAstroData (2, 2) int64', - ' .variance ADVarianceUncerta (2, 2) float64', - ' .mask ndarray (2, 2) uint16', - ' .BOB2 Table (5, 2) n/a', - ' .MYVAL_WITH_A_VERY_LO ndarray (10,) int64', - '', - 'Other Extensions', - ' Type Dimensions', - '.BOB Table (10, 2)' - ] - assert_array_equal(ad[0].nddata.data[0], nd.data[0]) - assert_array_equal(ad[0].nddata.variance[0], nd.uncertainty.array[0]) - assert_array_equal(ad[0].nddata.mask[0], nd.mask[0]) - - -def test_reset(ad1): - data = np.ones(SHAPE) + 3 - with pytest.raises(ValueError): - ad1.reset(data) - - ext = ad1[0] - - with pytest.raises(ValueError): - ext.reset(data, mask=np.ones((2, 2)), check=True) - - with pytest.raises(ValueError): - ext.reset(data, variance=np.ones((2, 2)), check=True) - - ext.reset(data, mask=np.ones(SHAPE), variance=np.ones(SHAPE)) - assert_array_equal(ext.data, 4) - assert_array_equal(ext.variance, 1) - assert_array_equal(ext.mask, 1) - - ext.reset(data, mask=None, variance=None) - assert ext.mask is None - assert ext.uncertainty is None - - ext.reset(np.ma.array(data, mask=np.ones(SHAPE))) - assert_array_equal(ext.data, 4) - assert_array_equal(ext.mask, 1) - - with pytest.raises(TypeError): - ext.reset(data, mask=1) - - with pytest.raises(TypeError): - ext.reset(data, variance=1) - - nd = NDData(data=data, - uncertainty=VarianceUncertainty(np.ones((2, 2)) * 3), - mask=np.ones((2, 2)) * 2, meta={'header': {}}) - ext.reset(nd) - assert_array_equal(ext.data, 4) - assert_array_equal(ext.variance, 3) - assert_array_equal(ext.mask, 2) diff --git a/astrodata/tests/test_fits.py b/astrodata/tests/test_fits.py deleted file mode 100644 index 8812713e05..0000000000 --- a/astrodata/tests/test_fits.py +++ /dev/null @@ -1,989 +0,0 @@ -import copy -import os -import warnings - -import numpy as np -import pytest -from numpy.testing import assert_allclose, assert_array_equal - -import astrodata -from astrodata.utils import AstroDataDeprecationWarning -from astrodata.nddata import ADVarianceUncertainty, NDAstroData -from astrodata.testing import download_from_archive, compare_models -import astropy -from astropy import units as u -from astropy.io import fits -from astropy.table import Table -from astropy.modeling import models - -# test_files = [ -# "N20160727S0077.fits", # NIFS DARK -# "N20170529S0168.fits", # GMOS-N SPECT -# "N20190116G0054i.fits", # GRACES SPECT -# "N20190120S0287.fits", # NIRI IMAGE -# "N20190206S0279.fits", # GNIRS SPECT XD -# "S20150609S0023.fits", # GSAOI DARK -# "S20170103S0032.fits", # F2 IMAGE -# "S20170505S0031.fits", # GSAOI FLAT -# "S20170505S0095.fits", # GSAOI IMAGE -# "S20171116S0078.fits", # GMOS-S MOS NS -# "S20180223S0229.fits", # GMOS IFU ACQUISITION -# "S20190213S0084.fits", # F2 IMAGE -# ] - - -@pytest.fixture(scope='module') -def NIFS_DARK(): - """ - No. Name Ver Type Cards Dimensions Format - 0 PRIMARY 1 PrimaryHDU 144 () - 1 1 ImageHDU 108 (2048, 2048) float32 - """ - return download_from_archive("N20160727S0077.fits") - - -@pytest.fixture(scope='module') -def GMOSN_SPECT(): - """ - No. Name Ver Type Cards Dimensions Format - 0 PRIMARY 1 PrimaryHDU 180 () - 1 -1 ImageHDU 108 (288, 512) int16 (rescales to uint16) - 2 -1 ImageHDU 108 (288, 512) int16 (rescales to uint16) - 3 -1 ImageHDU 108 (288, 512) int16 (rescales to uint16) - 4 -1 ImageHDU 108 (288, 512) int16 (rescales to uint16) - 5 -1 ImageHDU 72 (288, 512) int16 (rescales to uint16) - 6 -1 ImageHDU 72 (288, 512) int16 (rescales to uint16) - 7 -1 ImageHDU 72 (288, 512) int16 (rescales to uint16) - 8 -1 ImageHDU 72 (288, 512) int16 (rescales to uint16) - 9 -1 ImageHDU 38 (288, 512) int16 (rescales to uint16) - 10 -1 ImageHDU 38 (288, 512) int16 (rescales to uint16) - 11 -1 ImageHDU 38 (288, 512) int16 (rescales to uint16) - 12 -1 ImageHDU 38 (288, 512) int16 (rescales to uint16) - """ - return download_from_archive("N20170529S0168.fits") - - -@pytest.fixture(scope='module') -def GSAOI_DARK(): - """ - No. Name Ver Type Cards Dimensions Format - 0 PRIMARY 1 PrimaryHDU 289 () - 1 1 ImageHDU 144 (2048, 2048) float32 - 2 2 ImageHDU 144 (2048, 2048) float32 - 3 3 ImageHDU 144 (2048, 2048) float32 - 4 4 ImageHDU 144 (2048, 2048) float32 - """ - return download_from_archive("S20150609S0023.fits") - - -@pytest.fixture(scope='module') -def GRACES_SPECT(): - """ - No. Name Ver Type Cards Dimensions Format - 0 PRIMARY 1 PrimaryHDU 183 (190747, 28) float32 - """ - return download_from_archive("N20190116G0054i.fits") - - -def test_extver(tmp_path): - """Test that EXTVER is written sequentially for new extensions, - and preserved with slicing. - """ - testfile = tmp_path / 'test.fits' - - ad = astrodata.create({}) - for _ in range(10): - ad.append(np.zeros((4, 5))) - ad.write(testfile) - - ad = astrodata.open(testfile) - ext = ad[2] - assert ext.hdr['EXTNAME'] == 'SCI' - assert ext.hdr['EXTVER'] == 3 - - ext = ad[4] - assert ext.hdr['EXTNAME'] == 'SCI' - assert ext.hdr['EXTVER'] == 5 - - ext = ad[:8][4] - assert ext.hdr['EXTNAME'] == 'SCI' - assert ext.hdr['EXTVER'] == 5 - - -def test_extver2(tmp_path): - """Test renumbering of EXTVER.""" - testfile = tmp_path / 'test.fits' - - ad = astrodata.create(fits.PrimaryHDU()) - data = np.arange(5) - ad.append(fits.ImageHDU(data=data, header=fits.Header({'EXTVER': 2}))) - ad.append(fits.ImageHDU(data=data + 2, header=fits.Header({'EXTVER': 5}))) - ad.append(fits.ImageHDU(data=data + 5)) - ad.append(fits.ImageHDU(data=data + 7, header=fits.Header({'EXTVER': 3}))) - ad.write(testfile) - - ad = astrodata.open(testfile) - assert [hdr['EXTVER'] for hdr in ad.hdr] == [1, 2, 3, 4] - - -def test_extver3(tmp_path, GSAOI_DARK): - """Test that original EXTVER are preserved and extensions added - from another object are renumbered. - """ - testfile = tmp_path / 'test.fits' - - ad1 = astrodata.open(GSAOI_DARK) - ad2 = astrodata.open(GSAOI_DARK) - - del ad1[2] - ad1.append(ad2[2]) - ad1.append(np.zeros(10)) - - ad1.write(testfile) - - ad = astrodata.open(testfile) - assert [hdr['EXTVER'] for hdr in ad.hdr] == [1, 2, 4, 5, 6] - - -@pytest.mark.dragons_remote_data -def test_can_add_and_del_extension(GMOSN_SPECT): - ad = astrodata.open(GMOSN_SPECT) - original_size = len(ad) - - ourarray = np.array([(1, 2, 3), (11, 12, 13), (21, 22, 23)]) - ad.append(ourarray) - assert len(ad) == original_size + 1 - - del ad[original_size] - assert len(ad) == original_size - - -@pytest.mark.dragons_remote_data -def test_slice(GMOSN_SPECT): - ad = astrodata.open(GMOSN_SPECT) - assert ad.is_sliced is False - - n_ext = len(ad) - with pytest.raises(IndexError, match="Index out of range"): - ad[n_ext + 1] - - with pytest.raises(ValueError, match='Invalid index: FOO'): - ad['FOO'] - - # single - metadata = ('SCI', 2) - ext = ad[1] - assert ext.id == 2 - assert ext.is_single is True - assert ext.is_sliced is True - assert ext.hdr['EXTNAME'] == metadata[0] - assert ext.hdr['EXTVER'] == metadata[1] - assert not ext.is_settable('filename') - assert ext.data[0, 0] == 387 - - # when astrofaker is imported this will be recognized as AstroFakerGmos - # instead of AstroData - match = r"'Astro.*' object has no attribute 'FOO'" - with pytest.raises(AttributeError, match=match): - ext.FOO - - # setting uppercase attr adds to the extension: - ext.FOO = 1 - assert ext.FOO == 1 - assert ext.exposed == {'FOO'} - assert ext.nddata.meta['other']['FOO'] == 1 - del ext.FOO - - with pytest.raises(AttributeError): - del ext.BAR - - match = "Can't append objects to slices, use 'ext.NAME = obj' instead" - with pytest.raises(TypeError, match=match): - ext.append(np.zeros(5)) - - # but lowercase just adds a normal attribute to the object - ext.bar = 1 - assert ext.bar == 1 - assert 'bar' not in ext.nddata.meta['other'] - del ext.bar - - with pytest.raises(TypeError, match="Can't slice a single slice!"): - ext[1] - - -@pytest.mark.dragons_remote_data -def test_slice_single_element(GMOSN_SPECT): - ad = astrodata.open(GMOSN_SPECT) - assert ad.is_sliced is False - - metadata = ('SCI', 2) - - ext = ad[1:2] - assert ext.is_single is False - assert ext.is_sliced is True - assert ext.indices == [1] - assert isinstance(ext.data, list) and len(ext.data) == 1 - - ext = ext[0] - assert ext.id == 2 - assert ext.is_single is True - assert ext.is_sliced is True - assert ext.hdr['EXTNAME'] == metadata[0] - assert ext.hdr['EXTVER'] == metadata[1] - - -@pytest.mark.dragons_remote_data -def test_slice_multiple(GMOSN_SPECT): - ad = astrodata.open(GMOSN_SPECT) - - metadata = ('SCI', 2), ('SCI', 3) - slc = ad[1, 2] - assert len(slc) == 2 - assert slc.is_sliced is True - assert len(slc.data) == 2 - assert slc.data[0][0, 0] == 387 - assert slc.data[1][0, 0] == 383 - assert slc.shape == [(512, 288), (512, 288)] - - for ext, md in zip(slc, metadata): - assert (ext.hdr['EXTNAME'], ext.hdr['EXTVER']) == md - - with pytest.raises(ValueError, match="Cannot return id"): - slc.id - - assert slc[0].id == 2 - assert slc[1].id == 3 - - match = "Can't remove items from a sliced object" - with pytest.raises(TypeError, match=match): - del slc[0] - - match = "Can't append objects to slices, use 'ext.NAME = obj' instead" - with pytest.raises(TypeError, match=match): - slc.append(np.zeros(5), name='ARR') - - match = "This attribute can only be assigned to a single-slice object" - with pytest.raises(TypeError, match=match): - slc.ARR = np.zeros(5) - - # iterate over single slice - metadata = ('SCI', 1) - for ext in ad[0]: - assert (ext.hdr['EXTNAME'], ext.hdr['EXTVER']) == metadata - - # slice negative - assert ad.data[-1] is ad[-1].data - - match = "This attribute can only be assigned to a single-slice object" - with pytest.raises(TypeError, match=match): - slc.FOO = 1 - - with pytest.raises(TypeError, - match="Can't delete attributes on non-single slices"): - del slc.FOO - - ext.bar = 1 - assert ext.bar == 1 - del ext.bar - - -@pytest.mark.dragons_remote_data -def test_slice_data(GMOSN_SPECT): - ad = astrodata.open(GMOSN_SPECT) - - slc = ad[1, 2] - match = "Trying to assign to an AstroData object that is not a single slice" - with pytest.raises(ValueError, match=match): - slc.data = 1 - with pytest.raises(ValueError, match=match): - slc.uncertainty = 1 - with pytest.raises(ValueError, match=match): - slc.mask = 1 - with pytest.raises(ValueError, match=match): - slc.variance = 1 - - assert slc.uncertainty == [None, None] - assert slc.mask == [None, None] - - ext = ad[1] - match = "Trying to assign data to be something with no shape" - with pytest.raises(AttributeError, match=match): - ext.data = 1 - - # set/get on single slice - ext.data = np.ones(10) - assert_array_equal(ext.data, 1) - - ext.variance = np.ones(10) - assert_array_equal(ext.variance, 1) - ext.variance = None - assert ext.variance is None - - ext.uncertainty = ADVarianceUncertainty(np.ones(10)) - assert_array_equal(ext.variance, 1) - assert_array_equal(slc.variance[0], 1) - - ext.mask = np.zeros(10) - assert_array_equal(ext.mask, 0) - assert_array_equal(slc.mask[0], 0) - - assert slc.nddata[0].data is ext.data - assert slc.nddata[0].uncertainty is ext.uncertainty - assert slc.nddata[0].mask is ext.mask - - -@pytest.mark.dragons_remote_data -def test_phu(NIFS_DARK): - ad = astrodata.open(NIFS_DARK) - - # The result of this depends if gemini_instruments was imported or not - # assert ad.descriptors == ('instrument', 'object', 'telescope') - # assert ad.tags == set() - - assert ad.instrument() == 'NIFS' - assert ad.object() == 'Dark' - assert ad.telescope() == 'Gemini-North' - - ad.phu['DETECTOR'] = 'FooBar' - ad.phu['ARBTRARY'] = 'BarBaz' - - assert ad.phu['DETECTOR'] == 'FooBar' - assert ad.phu['ARBTRARY'] == 'BarBaz' - - if ad.instrument().upper() not in ['GNIRS', 'NIRI', 'F2']: - del ad.phu['DETECTOR'] - assert 'DETECTOR' not in ad.phu - - -@pytest.mark.dragons_remote_data -def test_paths(tmpdir, NIFS_DARK): - ad = astrodata.open(NIFS_DARK) - assert ad.orig_filename == 'N20160727S0077.fits' - - srcdir = os.path.dirname(NIFS_DARK) - assert ad.filename == 'N20160727S0077.fits' - assert ad.path == os.path.join(srcdir, 'N20160727S0077.fits') - - ad.filename = 'newfile.fits' - assert ad.filename == 'newfile.fits' - assert ad.path == os.path.join(srcdir, 'newfile.fits') - - testfile = os.path.join(str(tmpdir), 'temp.fits') - ad.path = testfile - assert ad.filename == 'temp.fits' - assert ad.path == testfile - assert ad.orig_filename == 'N20160727S0077.fits' - ad.write() - assert os.path.exists(testfile) - os.remove(testfile) - - testfile = os.path.join(str(tmpdir), 'temp2.fits') - ad.write(testfile) - assert os.path.exists(testfile) - - # overwriting is forbidden by default - with pytest.raises(OSError): - ad.write(testfile) - - ad.write(testfile, overwrite=True) - assert os.path.exists(testfile) - os.remove(testfile) - - ad.path = None - assert ad.filename is None - with pytest.raises(ValueError): - ad.write() - - -@pytest.mark.dragons_remote_data -def test_from_hdulist(NIFS_DARK): - with fits.open(NIFS_DARK) as hdul: - assert 'ORIGNAME' not in hdul[0].header - ad = astrodata.open(hdul) - assert ad.path is None - assert ad.instrument() == 'NIFS' - assert ad.object() == 'Dark' - assert ad.telescope() == 'Gemini-North' - assert len(ad) == 1 - assert ad[0].shape == (2048, 2048) - - with fits.open(NIFS_DARK) as hdul: - # Make sure that when ORIGNAME is set, astrodata use it - hdul[0].header['ORIGNAME'] = 'N20160727S0077.fits' - ad = astrodata.open(hdul) - assert ad.path == 'N20160727S0077.fits' - - -def test_from_hdulist2(): - tablehdu = fits.table_to_hdu(Table([[1]])) - tablehdu.name = 'REFCAT' - - hdul = fits.HDUList([ - fits.PrimaryHDU(header=fits.Header({'INSTRUME': 'FISH'})), - fits.ImageHDU(data=np.zeros(10), name='SCI', ver=1), - fits.ImageHDU(data=np.ones(10), name='VAR', ver=1), - fits.ImageHDU(data=np.zeros(10, dtype='uint16'), name='DQ', ver=1), - tablehdu, - fits.BinTableHDU.from_columns( - [fits.Column(array=['a', 'b'], format='A', name='col')], ver=1, - ), # This HDU will be skipped because it has no EXTNAME - ]) - - with pytest.warns(UserWarning, - match='Skip HDU .* because it has no EXTNAME'): - ad = astrodata.open(hdul) - - assert len(ad) == 1 - assert ad.phu['INSTRUME'] == 'FISH' - assert_array_equal(ad[0].data, 0) - assert_array_equal(ad[0].variance, 1) - assert_array_equal(ad[0].mask, 0) - assert len(ad.REFCAT) == 1 - assert ad.exposed == {'REFCAT'} - assert ad[0].exposed == {'REFCAT'} - - -def test_from_hdulist3(): - hdul = fits.HDUList([ - fits.PrimaryHDU(), - fits.ImageHDU(data=np.zeros(10), name='SCI', ver=1), - fits.TableHDU.from_columns( - [fits.Column(array=['a', 'b'], format='A', name='col')], - name='ASCIITAB', - ), - ]) - - ad = astrodata.open(hdul) - - assert hasattr(ad, 'ASCIITAB') - assert len(ad.ASCIITAB) == 2 - - -def test_can_make_and_write_ad_object(tmpdir): - # Creates data and ad object - phu = fits.PrimaryHDU() - hdu = fits.ImageHDU(data=np.arange(10)) - ad = astrodata.create(phu) - ad.append(hdu, name='SCI') - - hdr = fits.Header({'EXTNAME': 'SCI', 'EXTVER': 1, 'FOO': 'BAR'}) - ad.append(hdu, header=hdr) - assert ad[1].hdr['FOO'] == 'BAR' - - # Write file and test it exists properly - testfile = str(tmpdir.join('created_fits_file.fits')) - ad.write(testfile) - - # Opens file again and tests data is same as above - adnew = astrodata.open(testfile) - assert np.array_equal(adnew[0].data, np.arange(10)) - - -def test_can_append_table_and_access_data(capsys, tmpdir): - tbl = Table([np.zeros(10), np.ones(10)], names=['col1', 'col2']) - phu = fits.PrimaryHDU() - ad = astrodata.create(phu) - - with pytest.raises(ValueError, - match='Tables should be set directly as attribute'): - ad.append(tbl, name='BOB') - - ad.BOB = tbl - assert ad.exposed == {'BOB'} - - assert ad.tables == {'BOB'} - assert np.all(ad.table()['BOB'] == tbl) - - ad.info() - captured = capsys.readouterr() - assert '.BOB Table (10, 2)' in captured.out - - # Write file and test it exists properly - testfile = str(tmpdir.join('created_fits_file.fits')) - ad.write(testfile) - adnew = astrodata.open(testfile) - assert adnew.exposed == {'BOB'} - assert len(adnew.BOB) == 10 - - del ad.BOB - assert ad.tables == set() - with pytest.raises(AttributeError): - del ad.BOB - - -@pytest.mark.dragons_remote_data -def test_attributes(GSAOI_DARK): - ad = astrodata.open(GSAOI_DARK) - assert ad.shape == [(2048, 2048)] * 4 - assert [arr.shape for arr in ad.data] == [(2048, 2048)] * 4 - assert [arr.dtype for arr in ad.data] == ['f'] * 4 - assert ad.uncertainty == [None] * 4 - assert ad.variance == [None] * 4 - assert ad.mask == [None] * 4 - - ad[0].variance = np.ones(ad[0].shape) - assert isinstance(ad[0].uncertainty, ADVarianceUncertainty) - assert_array_equal(ad[0].uncertainty.array, 1) - assert_array_equal(ad[0].variance, 1) - assert_array_equal(ad.variance[0], 1) - - assert all(isinstance(nd, NDAstroData) for nd in ad.nddata) - assert [nd.shape for nd in ad.nddata] == [(2048, 2048)] * 4 - - match = "Trying to assign to an AstroData object that is not a single slice" - with pytest.raises(ValueError, match=match): - ad.data = 1 - with pytest.raises(ValueError, match=match): - ad.variance = 1 - with pytest.raises(ValueError, match=match): - ad.uncertainty = 1 - with pytest.raises(ValueError, match=match): - ad.mask = 1 - - -@pytest.mark.dragons_remote_data -def test_set_a_keyword_on_phu_deprecated(NIFS_DARK): - ad = astrodata.open(NIFS_DARK) - # Test that setting DETECTOR as an attribute doesn't modify the header - ad.phu.DETECTOR = 'FooBar' - assert ad.phu.DETECTOR == 'FooBar' - assert ad.phu['DETECTOR'] == 'NIFS' - - -# Regression: -# Make sure that references to associated -# extension objects are copied across -@pytest.mark.dragons_remote_data -def test_do_arith_and_retain_features(NIFS_DARK): - ad = astrodata.open(NIFS_DARK) - ad[0].NEW_FEATURE = np.array([1, 2, 3, 4, 5]) - ad2 = ad * 5 - assert_array_equal(ad[0].NEW_FEATURE, ad2[0].NEW_FEATURE) - - -def test_update_filename(): - phu = fits.PrimaryHDU() - ad = astrodata.create(phu) - - ad.filename = 'myfile.fits' - - # This will also set ORIGNAME='myfile.fits' - ad.update_filename(suffix='_suffix1') - assert ad.filename == 'myfile_suffix1.fits' - - ad.update_filename(suffix='_suffix2', strip=True) - assert ad.filename == 'myfile_suffix2.fits' - - ad.update_filename(suffix='_suffix1', strip=False) - assert ad.filename == 'myfile_suffix2_suffix1.fits' - - ad.filename = 'myfile.fits' - ad.update_filename(prefix='prefix_', strip=True) - assert ad.filename == 'prefix_myfile.fits' - - ad.update_filename(suffix='_suffix', strip=True) - assert ad.filename == 'prefix_myfile_suffix.fits' - - ad.update_filename(prefix='', suffix='_suffix2', strip=True) - assert ad.filename == 'myfile_suffix2.fits' - - # Now check that updates are based on existing filename - # (so "myfile" shouldn't appear) - ad.filename = 'file_suffix1.fits' - ad.update_filename(suffix='_suffix2') - assert ad.filename == 'file_suffix1_suffix2.fits' - - # A suffix shouldn't have an underscore, so should assume that - # "file_suffix1" is the root - ad.update_filename(suffix='_suffix3', strip=True) - assert ad.filename == 'file_suffix1_suffix3.fits' - - -def test_update_filename2(): - phu = fits.PrimaryHDU() - ad = astrodata.create(phu) - - with pytest.raises(ValueError): - # Not possible when ad.filename is None - ad.update_filename(suffix='_suffix1') - - # filename is taken from ORIGNAME by default - ad.phu['ORIGNAME'] = 'origfile.fits' - ad.update_filename(suffix='_suffix') - assert ad.filename == 'origfile_suffix.fits' - - ad.phu['ORIGNAME'] = 'temp.fits' - ad.filename = 'origfile.fits' - ad.update_filename(suffix='_bar', strip=True) - assert ad.filename == 'origfile_bar.fits' - - -@pytest.mark.dragons_remote_data -def test_read_a_keyword_from_phu_deprecated(): - """Test deprecated methods to access headers""" - ad = astrodata.open(download_from_archive('N20110826S0336.fits')) - - with pytest.raises(AttributeError): - assert ad.phu.DETECTOR == 'GMOS + Red1' - - with pytest.raises(AttributeError): - assert ad.hdr.CCDNAME == [ - 'EEV 9273-16-03', 'EEV 9273-20-04', 'EEV 9273-20-03' - ] - - # and when accessing missing extension - with pytest.raises(AttributeError): - ad.ABC - - -def test_read_invalid_file(tmpdir, caplog): - testfile = str(tmpdir.join('test.fits')) - with open(testfile, 'w'): - # create empty file - pass - - with pytest.raises(astrodata.AstroDataError): - astrodata.open(testfile) - - assert caplog.records[0].message.endswith('is zero size') - - -def test_read_empty_file(tmpdir): - testfile = str(tmpdir.join('test.fits')) - hdr = fits.Header({'INSTRUME': 'darkimager', 'OBJECT': 'M42'}) - fits.PrimaryHDU(header=hdr).writeto(testfile) - ad = astrodata.open(testfile) - assert len(ad) == 0 - assert ad.object() == 'M42' - assert ad.instrument() == 'darkimager' - - -def test_read_file(tmpdir): - testfile = str(tmpdir.join('test.fits')) - hdr = fits.Header({'INSTRUME': 'darkimager', 'OBJECT': 'M42'}) - fits.PrimaryHDU(header=hdr).writeto(testfile) - ad = astrodata.open(testfile) - assert len(ad) == 0 - assert ad.object() == 'M42' - assert ad.instrument() == 'darkimager' - - -@pytest.mark.dragons_remote_data -def test_header_collection(GMOSN_SPECT): - ad = astrodata.create({}) - assert ad.hdr is None - - ad = astrodata.open(GMOSN_SPECT) - assert len(ad) == 12 - assert len([hdr for hdr in ad.hdr]) == 12 - - # get - assert 'FRAMEID' in ad.hdr - assert 'FOO' not in ad.hdr - assert ad.hdr.get('FRAMEID') == [ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11' - ] - with pytest.raises(KeyError): - ad.hdr['FOO'] - assert ad.hdr.get('FOO') == [None] * 12 - assert ad.hdr.get('FOO', default='BAR') == ['BAR'] * 12 - - # del/remove - assert ad.hdr['GAIN'] == [1.0] * 12 - del ad.hdr['GAIN'] - with pytest.raises(KeyError): - ad.hdr['GAIN'] - with pytest.raises(KeyError): - del ad.hdr['GAIN'] - - # set - assert ad.hdr['RDNOISE'] == [1.0] * 12 - ad.hdr['RDNOISE'] = 2.0 - assert ad.hdr['RDNOISE'] == [2.0] * 12 - - # comment - assert ad.hdr.get_comment('DATATYPE') == ['Type of Data'] * 12 - ad.hdr.set_comment('DATATYPE', 'Hello!') - assert ad.hdr.get_comment('DATATYPE') == ['Hello!'] * 12 - ad.hdr['RDNOISE'] = (2.0, 'New comment') - assert ad.hdr.get_comment('RDNOISE') == ['New comment'] * 12 - with pytest.raises(KeyError, - match="Keyword 'FOO' not available at header 0"): - ad.hdr.set_comment('FOO', 'A comment') - - ad = astrodata.open(GMOSN_SPECT) - hdr = ad.hdr - assert len(list(hdr)) == 12 - hdr._insert(1, fits.Header({'INSTRUME': 'darkimager', 'OBJECT': 'M42'})) - assert len(list(hdr)) == 13 - - -@pytest.mark.dragons_remote_data -def test_header_deprecated(GMOSN_SPECT): - ad = astrodata.open(GMOSN_SPECT) - with pytest.warns(AstroDataDeprecationWarning): - warnings.simplefilter('always', AstroDataDeprecationWarning) - header = ad.header - assert header[0]['ORIGNAME'] == 'N20170529S0168.fits' - assert header[1]['EXTNAME'] == 'SCI' - assert header[1]['EXTVER'] == 1 - - with pytest.warns(AstroDataDeprecationWarning): - warnings.simplefilter('always', AstroDataDeprecationWarning) - header = ad[0].header - assert header[0]['ORIGNAME'] == 'N20170529S0168.fits' - - -@pytest.mark.dragons_remote_data -def test_read_no_extensions(GRACES_SPECT): - ad = astrodata.open(GRACES_SPECT) - assert len(ad) == 1 - # header is duplicated for .phu and extension's header - assert len(ad.phu) == 181 - assert len(ad[0].hdr) == 185 - assert ad[0].hdr['EXTNAME'] == 'SCI' - assert ad[0].hdr['EXTVER'] == 1 - - -def test_add_var_and_dq(): - shape = (3, 4) - fakedata = np.arange(np.prod(shape)).reshape(shape) - - ad = astrodata.create({'OBJECT': 'M42'}) - ad.append(fakedata) - assert ad[0].hdr['EXTNAME'] == 'SCI' # default value for EXTNAME - - with pytest.raises(ValueError, match="Only one Primary HDU allowed"): - ad.append(fits.PrimaryHDU(data=fakedata), name='FOO') - - with pytest.raises(ValueError, - match="Arbitrary image extensions can " - "only be added in association to a 'SCI'"): - ad.append(np.zeros(shape), name='FOO') - - with pytest.raises(ValueError, - match="'VAR' need to be associated to a 'SCI' one"): - ad.append(np.ones(shape), name='VAR') - - with pytest.raises(AttributeError, - match="SCI extensions should be appended with .append"): - ad[0].SCI = np.ones(shape) - - -def test_add_table(): - shape = (3, 4) - fakedata = np.arange(np.prod(shape)).reshape(shape) - - ad = astrodata.create({'OBJECT': 'M42'}) - ad.append(fakedata) - - ad.TABLE1 = Table([['a', 'b', 'c'], [1, 2, 3]]) - assert ad.tables == {'TABLE1'} - - ad.TABLE2 = Table([['a', 'b', 'c'], [1, 2, 3]]) - assert ad.tables == {'TABLE1', 'TABLE2'} - - ad.MYTABLE = Table([['a', 'b', 'c'], [1, 2, 3]]) - assert ad.tables == {'TABLE1', 'TABLE2', 'MYTABLE'} - - ad[0].TABLE3 = Table([['aa', 'bb', 'cc'], [1, 2, 3]]) - ad[0].TABLE4 = Table([['aa', 'bb', 'cc'], [1, 2, 3]]) - ad[0].OTHERTABLE = Table([['aa', 'bb', 'cc'], [1, 2, 3]]) - - assert list(ad[0].OTHERTABLE['col0']) == ['aa', 'bb', 'cc'] - - assert ad.tables == {'TABLE1', 'TABLE2', 'MYTABLE'} - assert ad[0].tables == {'TABLE1', 'TABLE2', 'MYTABLE'} - assert ad[0].ext_tables == {'OTHERTABLE', 'TABLE3', 'TABLE4'} - assert ad[0].exposed == {'MYTABLE', 'OTHERTABLE', 'TABLE1', 'TABLE2', - 'TABLE3', 'TABLE4'} - - with pytest.raises(AttributeError): - ad.ext_tables - - assert set(ad[0].nddata.meta['other'].keys()) == {'OTHERTABLE', - 'TABLE3', 'TABLE4'} - assert_array_equal(ad[0].TABLE3['col0'], ['aa', 'bb', 'cc']) - assert_array_equal(ad[0].TABLE4['col0'], ['aa', 'bb', 'cc']) - assert_array_equal(ad[0].OTHERTABLE['col0'], ['aa', 'bb', 'cc']) - - -@pytest.mark.dragons_remote_data -def test_copy(GSAOI_DARK, capsys): - ad = astrodata.open(GSAOI_DARK) - ad.TABLE = Table([['a', 'b', 'c'], [1, 2, 3]]) - ad[0].MYTABLE = Table([['aa', 'bb', 'cc'], [1, 2, 3]]) - - ad.info() - captured = capsys.readouterr() - - ad2 = copy.deepcopy(ad) - ad2.info() - captured2 = capsys.readouterr() - - # Compare that objects have the same attributes etc. with their - # .info representation - assert captured.out == captured2.out - - ext = ad[0] - ext.info() - captured = capsys.readouterr() - - ext2 = copy.deepcopy(ext) - ext2.info() - captured2 = capsys.readouterr() - - # Same for extension, except that first line is different (no - # filename in the copied ext) - assert captured.out.splitlines()[1:] == captured2.out.splitlines()[1:] - - -@pytest.mark.dragons_remote_data -def test_crop(GSAOI_DARK): - ad = astrodata.open(GSAOI_DARK) - assert set(ad.shape) == {(2048, 2048)} - - ad.crop(0, 0, 5, 10) - assert len(ad.nddata) == 4 - assert set(ad.shape) == {(11, 6)} - - -@pytest.mark.dragons_remote_data -def test_crop_ext(GSAOI_DARK): - ad = astrodata.open(GSAOI_DARK) - ext = ad[0] - ext.uncertainty = ADVarianceUncertainty(np.ones(ext.shape)) - ext.mask = np.ones(ext.shape, dtype=np.uint8) - - # FIXME: cannot test cropping attached array because that does not work - # with numpy arrays, and can only attach NDData instance at the top level - # ext.append(np.zeros(ext.shape, dtype=int), name='FOO') - - ext.BAR = 1 - - ext.crop(0, 0, 5, 10) - assert ext.shape == (11, 6) - assert_allclose(ext.data[0], [-1.75, -0.75, -4.75, 2.375, -0.25, 1.375]) - assert_array_equal(ext.uncertainty.array, 1) - assert_array_equal(ext.mask, 1) - - # assert ext.FOO.shape == (11, 6) - # assert_array_equal(ext.FOO, 0) - assert ext.BAR == 1 - - -@pytest.mark.xfail(not astropy.utils.minversion(astropy, '4.0.1'), - reason='requires astropy >=4.0.1 for correct serialization') -def test_round_trip_gwcs(tmpdir): - """ - Add a 2-step gWCS instance to NDAstroData, save to disk, reload & compare. - """ - - from gwcs import coordinate_frames as cf - from gwcs import WCS - - arr = np.zeros((10, 10), dtype=np.float32) - ad1 = astrodata.create(fits.PrimaryHDU(), [fits.ImageHDU(arr, name='SCI')]) - - # Transformation from detector pixels to pixels in some reference row, - # removing relative distortions in wavelength: - det_frame = cf.Frame2D(name='det_mosaic', axes_names=('x', 'y'), - unit=(u.pix, u.pix)) - dref_frame = cf.Frame2D(name='dist_ref_row', axes_names=('xref', 'y'), - unit=(u.pix, u.pix)) - - # A made-up example model that looks vaguely like some real distortions: - fdist = models.Chebyshev2D(2, 2, - c0_0=4.81125, c1_0=5.43375, c0_1=-0.135, - c1_1=-0.405, c0_2=0.30375, c1_2=0.91125, - x_domain=[0., 9.], y_domain=[0., 9.]) - - # This is not an accurate inverse, but will do for this test: - idist = models.Chebyshev2D(2, 2, - c0_0=4.89062675, c1_0=5.68581232, - c2_0=-0.00590263, c0_1=0.11755526, - c1_1=0.35652358, c2_1=-0.01193828, - c0_2=-0.29996306, c1_2=-0.91823397, - c2_2=0.02390594, - x_domain=[-1.5, 12.], y_domain=[0., 9.]) - - # The resulting 2D co-ordinate mapping from detector to ref row pixels: - distrans = models.Mapping((0, 1, 1)) | (fdist & models.Identity(1)) - distrans.inverse = models.Mapping((0, 1, 1)) | (idist & models.Identity(1)) - - # Transformation from reference row pixels to linear, row-stacked spectra: - spec_frame = cf.SpectralFrame(axes_order=(0,), unit=u.nm, - axes_names='lambda', name='wavelength') - row_frame = cf.CoordinateFrame(1, 'SPATIAL', axes_order=(1,), unit=u.pix, - axes_names='y', name='row') - rss_frame = cf.CompositeFrame([spec_frame, row_frame]) - - # Toy wavelength model & approximate inverse: - fwcal = models.Chebyshev1D(2, c0=500.075, c1=0.05, c2=0.001, domain=[0, 9]) - iwcal = models.Chebyshev1D(2, c0=4.59006292, c1=4.49601817, c2=-0.08989608, - domain=[500.026, 500.126]) - - # The resulting 2D co-ordinate mapping from ref pixels to wavelength: - wavtrans = fwcal & models.Identity(1) - wavtrans.inverse = iwcal & models.Identity(1) - - # The complete WCS chain for these 2 transformation steps: - ad1[0].nddata.wcs = WCS([(det_frame, distrans), - (dref_frame, wavtrans), - (rss_frame, None) - ]) - - # Save & re-load the AstroData instance with its new WCS attribute: - testfile = str(tmpdir.join('round_trip_gwcs.fits')) - ad1.write(testfile) - ad2 = astrodata.open(testfile) - - wcs1 = ad1[0].nddata.wcs - wcs2 = ad2[0].nddata.wcs - - # # Temporary workaround for issue #9809, to ensure the test is correct: - # wcs2.forward_transform[1].x_domain = (0, 9) - # wcs2.forward_transform[1].y_domain = (0, 9) - # wcs2.forward_transform[3].domain = (0, 9) - # wcs2.backward_transform[0].domain = (500.026, 500.126) - # wcs2.backward_transform[3].x_domain = (-1.5, 12.) - # wcs2.backward_transform[3].y_domain = (0, 9) - - # Did we actually get a gWCS instance back? - assert isinstance(wcs2, WCS) - - # Do the transforms have the same number of submodels, with the same types, - # degrees, domains & parameters? Here the inverse gets checked redundantly - # as both backward_transform and forward_transform.inverse, but it would be - # convoluted to ensure that both are correct otherwise (since the transforms - # get regenerated as new compound models each time they are accessed). - compare_models(wcs1.forward_transform, wcs2.forward_transform) - compare_models(wcs1.backward_transform, wcs2.backward_transform) - - # Do the instances have matching co-ordinate frames? - for f in wcs1.available_frames: - assert repr(getattr(wcs1, f)) == repr(getattr(wcs2, f)) - - # Also compare a few transformed values, as the "proof of the pudding": - y, x = np.mgrid[0:9:2, 0:9:2] - np.testing.assert_allclose(wcs1(x, y), wcs2(x, y), rtol=1e-7, atol=0.) - - y, w = np.mgrid[0:9:2, 500.025:500.12:0.0225] - np.testing.assert_allclose(wcs1.invert(w, y), wcs2.invert(w, y), - rtol=1e-7, atol=0.) - - -@pytest.mark.parametrize('dtype', ['int8', 'uint8', 'int16', 'uint16', - 'int32', 'uint32', 'int64', 'uint64']) -def test_uint_data(dtype, tmp_path): - testfile = tmp_path / 'test.fits' - data = np.arange(10, dtype=np.int16) - fits.writeto(testfile, data) - - ad = astrodata.open(str(testfile)) - assert ad[0].data.dtype == data.dtype - assert_array_equal(ad[0].data, data) - - -if __name__ == '__main__': - pytest.main() diff --git a/astrodata/tests/test_nddata.py b/astrodata/tests/test_nddata.py deleted file mode 100644 index 3562b3dfcf..0000000000 --- a/astrodata/tests/test_nddata.py +++ /dev/null @@ -1,166 +0,0 @@ -import warnings - -import numpy as np -import pytest -from numpy.testing import assert_array_almost_equal, assert_array_equal - -from astrodata.fits import windowedOp -from astrodata import wcs as adwcs -from astrodata.nddata import ADVarianceUncertainty, NDAstroData -from astropy.io import fits -from astropy.nddata import NDData, VarianceUncertainty -from astropy.modeling import models -from astropy.table import Table -from gwcs.wcs import WCS as gWCS -from gwcs.coordinate_frames import Frame2D - - -@pytest.fixture -def testnd(): - shape = (5, 5) - hdr = fits.Header({'CRPIX1': 1, 'CRPIX2': 2}) - nd = NDAstroData(data=np.arange(np.prod(shape)).reshape(shape), - variance=np.ones(shape) + 0.5, - mask=np.zeros(shape, dtype=bool), - wcs=gWCS(models.Shift(1) & models.Shift(2), - input_frame=adwcs.pixel_frame(2), - output_frame=adwcs.pixel_frame(2, name='world')), - unit='ct') - nd.meta['other'] = {'OBJMASK': np.arange(np.prod(shape)).reshape(shape), - 'OBJCAT': Table([[1,2,3]], names=[['number']])} - nd.mask[3, 4] = True - return nd - - -def test_var(testnd): - data = np.zeros(5) - var = np.array([1.2, 2, 1.5, 1, 1.3]) - nd1 = NDAstroData(data=data, uncertainty=ADVarianceUncertainty(var)) - nd2 = NDAstroData(data=data, variance=var) - assert_array_equal(nd1.variance, nd2.variance) - - -def test_window(testnd): - win = testnd.window[2:4, 3:5] - assert win.unit == 'ct' - #assert_array_equal(win.wcs.wcs.crpix, [1, 2]) - assert_array_equal(win.data, [[13, 14], [18, 19]]) - assert_array_equal(win.mask, [[False, False], [False, True]]) - assert_array_almost_equal(win.uncertainty.array, 1.5) - assert_array_almost_equal(win.variance, 1.5) - - -def test_windowedOp(testnd): - - def stack(arrays): - arrays = [x for x in arrays] - data = np.array([arr.data for arr in arrays]).sum(axis=0) - unc = np.array([arr.uncertainty.array for arr in arrays]).sum(axis=0) - mask = np.array([arr.mask for arr in arrays]).sum(axis=0) - return NDAstroData(data=data, variance=unc, mask=mask) - - result = windowedOp(stack, [testnd, testnd], - kernel=(3, 3), - with_uncertainty=True, - with_mask=True) - assert_array_equal(result.data, testnd.data * 2) - assert_array_equal(result.uncertainty.array, testnd.uncertainty.array * 2) - assert result.mask[3, 4] == 2 - - nd2 = NDAstroData(data=np.zeros((4, 4))) - with pytest.raises(ValueError, match=r"Can't calculate final shape.*"): - result = windowedOp(stack, [testnd, nd2], kernel=(3, 3)) - - with pytest.raises(AssertionError, match=r"Incompatible shape.*"): - result = windowedOp(stack, [testnd, testnd], kernel=[3], shape=(5, 5)) - - -def test_transpose(testnd): - testnd.variance[0, -1] = 10 - ndt = testnd.T - assert_array_equal(ndt.data[0], [0, 5, 10, 15, 20]) - assert ndt.variance[-1, 0] == 10 - assert ndt.wcs(1, 2) == testnd.wcs(2, 1) - - -def test_set_section(testnd): - sec = NDData(np.zeros((2, 2)), - uncertainty=VarianceUncertainty(np.ones((2, 2)))) - testnd.set_section((slice(0, 2), slice(1, 3)), sec) - assert_array_equal(testnd[:2, 1:3].data, 0) - assert_array_equal(testnd[:2, 1:3].variance, 1) - - -def test_uncertainty_negative_numbers(): - arr = np.zeros(5) - - # No warning if all 0 - with warnings.catch_warnings(record=True) as w: - ADVarianceUncertainty(arr) - assert len(w) == 0 - - arr[2] = -0.001 - - with pytest.warns(RuntimeWarning, match='Negative variance values found.'): - result = ADVarianceUncertainty(arr) - - assert not np.all(arr >= 0) - assert isinstance(result, ADVarianceUncertainty) - assert result.array[2] == 0 - - # check that it always works with a VarianceUncertainty instance - result.array[2] = -0.001 - - with pytest.warns(RuntimeWarning, match='Negative variance values found.'): - result2 = ADVarianceUncertainty(result) - - assert not np.all(arr >= 0) - assert not np.all(result.array >= 0) - assert isinstance(result2, ADVarianceUncertainty) - assert result2.array[2] == 0 - - -def test_wcs_slicing(): - nd = NDAstroData(np.zeros((50, 50))) - in_frame = Frame2D(name="in_frame") - out_frame = Frame2D(name="out_frame") - nd.wcs = gWCS([(in_frame, models.Identity(2)), - (out_frame, None)]) - assert nd.wcs(10, 10) == (10, 10) - assert nd[10:].wcs(10, 10) == (10, 20) - assert nd[..., 10:].wcs(10, 10) == (20, 10) - assert nd[:, 5].wcs(10) == (5, 10) - assert nd[20, -10:].wcs(0) == (40, 20) - - -def test_access_to_other_planes(testnd): - assert hasattr(testnd, 'OBJMASK') - assert testnd.OBJMASK.shape == testnd.data.shape - assert hasattr(testnd, 'OBJCAT') - assert isinstance(testnd.OBJCAT, Table) - assert len(testnd.OBJCAT) == 3 - - -def test_access_to_other_planes_when_windowed(testnd): - ndwindow = testnd.window[1:, 1:] - assert ndwindow.data.shape == (4, 4) - assert ndwindow.data[0, 0] == testnd.shape[1] + 1 - assert ndwindow.OBJMASK.shape == (4, 4) - assert ndwindow.OBJMASK[0, 0] == testnd.shape[1] + 1 - assert isinstance(ndwindow.OBJCAT, Table) - assert len(ndwindow.OBJCAT) == 3 - - -# Basically the same test as above but using slicing. -def test_access_to_other_planes_when_sliced(testnd): - ndwindow = testnd[1:, 1:] - assert ndwindow.data.shape == (4, 4) - assert ndwindow.data[0, 0] == testnd.shape[1] + 1 - assert ndwindow.OBJMASK.shape == (4, 4) - assert ndwindow.OBJMASK[0, 0] == testnd.shape[1] + 1 - assert isinstance(ndwindow.OBJCAT, Table) - assert len(ndwindow.OBJCAT) == 3 - - -if __name__ == '__main__': - pytest.main() diff --git a/astrodata/tests/test_object_construction.py b/astrodata/tests/test_object_construction.py deleted file mode 100644 index ed9630686b..0000000000 --- a/astrodata/tests/test_object_construction.py +++ /dev/null @@ -1,430 +0,0 @@ -import warnings - -import astrodata -import astropy.units as u -import numpy as np -import pytest -from astrodata import AstroData, factory -from astrodata.testing import download_from_archive -from astropy.io import fits -from astropy.nddata import NDData, VarianceUncertainty -from astropy.table import Table -from numpy.testing import assert_array_equal - - -@pytest.fixture() -def testfile1(): - """ - Pixels Extensions - Index Content Type Dimensions Format - [ 0] science NDAstroData (2304, 1056) uint16 - [ 1] science NDAstroData (2304, 1056) uint16 - [ 2] science NDAstroData (2304, 1056) uint16 - """ - return download_from_archive("N20110826S0336.fits") - - -@pytest.fixture -def testfile2(): - """ - Pixels Extensions - Index Content Type Dimensions Format - [ 0] science NDAstroData (4608, 1056) uint16 - [ 1] science NDAstroData (4608, 1056) uint16 - [ 2] science NDAstroData (4608, 1056) uint16 - [ 3] science NDAstroData (4608, 1056) uint16 - [ 4] science NDAstroData (4608, 1056) uint16 - [ 5] science NDAstroData (4608, 1056) uint16 - """ - return download_from_archive("N20160524S0119.fits") - - -class AstroDataMyInstrument(AstroData): - __keyword_dict = dict( - array_name='AMPNAME', - array_section='CCDSECT' - ) - - @staticmethod - def _matches_data(source): - return source[0].header.get('INSTRUME', '').upper() == 'MYINSTRUMENT' - - -def setup_module(): - factory.addClass(AstroDataMyInstrument) - - -def teardown_module(): - factory._registry.remove(AstroDataMyInstrument) - - -def test_create_with_no_data(): - for phu in (fits.PrimaryHDU(), fits.Header(), {}): - ad = astrodata.create(phu) - assert isinstance(ad, astrodata.AstroData) - assert len(ad) == 0 - assert ad.instrument() is None - assert ad.object() is None - - -def test_create_with_header(): - hdr = fits.Header({'INSTRUME': 'darkimager', 'OBJECT': 'M42'}) - for phu in (hdr, fits.PrimaryHDU(header=hdr), dict(hdr), list(hdr.cards)): - ad = astrodata.create(phu) - assert isinstance(ad, astrodata.AstroData) - assert len(ad) == 0 - assert ad.instrument() == 'darkimager' - assert ad.object() == 'M42' - - -def test_create_from_hdu(): - phu = fits.PrimaryHDU() - hdu = fits.ImageHDU(data=np.zeros((4, 5)), name='SCI') - ad = astrodata.create(phu, [hdu]) - - assert isinstance(ad, astrodata.AstroData) - assert len(ad) == 1 - assert isinstance(ad[0].data, np.ndarray) - assert ad[0].data is hdu.data - - -def test_create_invalid(): - with pytest.raises(ValueError): - astrodata.create('FOOBAR') - with pytest.raises(ValueError): - astrodata.create(42) - - -def test_append_image_hdu(): - ad = astrodata.create(fits.PrimaryHDU()) - ad.append(fits.ImageHDU(data=np.zeros((4, 5)))) - ad.append(fits.ImageHDU(data=np.zeros((4, 5))), name='SCI') - - with pytest.raises(ValueError, - match="Arbitrary image extensions can only be added " - "in association to a 'SCI'"): - ad.append(fits.ImageHDU(data=np.zeros((4, 5))), name='SCI2') - - assert len(ad) == 2 - - -def test_append_lowercase_name(): - ad = astrodata.create({}) - with pytest.warns(UserWarning, - match="extension name 'sci' should be uppercase"): - ad.append(NDData(np.zeros((4, 5))), name='sci') - - -def test_append_arrays(tmp_path): - testfile = tmp_path / 'test.fits' - - ad = astrodata.create({}) - ad.append(np.zeros(10)) - ad[0].ARR = np.arange(5) - - with pytest.raises(AttributeError): - ad[0].SCI = np.arange(5) - with pytest.raises(AttributeError): - ad[0].VAR = np.arange(5) - with pytest.raises(AttributeError): - ad[0].DQ = np.arange(5) - - match = ("Arbitrary image extensions can only be added in association " - "to a 'SCI'") - with pytest.raises(ValueError, match=match): - ad.append(np.zeros(10), name='FOO') - - with pytest.raises(ValueError, match=match): - ad.append(np.zeros(10), header=fits.Header({'EXTNAME': 'FOO'})) - - ad.write(testfile) - - ad = astrodata.open(testfile) - assert len(ad) == 1 - assert ad[0].nddata.meta['header']['EXTNAME'] == 'SCI' - assert_array_equal(ad[0].ARR, np.arange(5)) - - -@pytest.mark.dragons_remote_data -def test_can_read_data(testfile1): - ad = astrodata.open(testfile1) - assert len(ad) == 3 - assert ad.shape == [(2304, 1056), (2304, 1056), (2304, 1056)] - - -def test_can_read_write_pathlib(tmp_path): - testfile = tmp_path / 'test.fits' - - ad = astrodata.create({'INSTRUME': 'MYINSTRUMENT'}) - ad.append(np.zeros((4, 5))) - ad.write(testfile) - - ad = astrodata.open(testfile) - assert isinstance(ad, AstroDataMyInstrument) - assert len(ad) == 1 - assert ad.shape == [(4, 5)] - - -@pytest.mark.dragons_remote_data -def test_append_array_to_root_no_name(testfile2): - ad = astrodata.open(testfile2) - - lbefore = len(ad) - ones = np.ones((10, 10)) - ad.append(ones) - assert len(ad) == (lbefore + 1) - assert ad[-1].data is ones - assert ad[-1].hdr['EXTNAME'] == 'SCI' - - -@pytest.mark.dragons_remote_data -def test_append_array_to_root_with_name_sci(testfile2): - ad = astrodata.open(testfile2) - - lbefore = len(ad) - ones = np.ones((10, 10)) - ad.append(ones, name='SCI') - assert len(ad) == (lbefore + 1) - assert ad[-1].data is ones - assert ad[-1].hdr['EXTNAME'] == 'SCI' - - -@pytest.mark.dragons_remote_data -def test_append_array_to_root_with_arbitrary_name(testfile2): - ad = astrodata.open(testfile2) - assert len(ad) == 6 - - ones = np.ones((10, 10)) - with pytest.raises(ValueError): - ad.append(ones, name='ARBITRARY') - - -@pytest.mark.dragons_remote_data -def test_append_array_to_extension_with_name_sci(testfile2): - ad = astrodata.open(testfile2) - assert len(ad) == 6 - - ones = np.ones((10, 10)) - with pytest.raises(TypeError): - ad[0].append(ones, name='SCI') - - -@pytest.mark.dragons_remote_data -def test_append_array_to_extension_with_arbitrary_name(testfile2): - ad = astrodata.open(testfile2) - - lbefore = len(ad) - ones = np.ones((10, 10)) - ad[0].ARBITRARY = ones - - assert len(ad) == lbefore - assert ad[0].ARBITRARY is ones - - -@pytest.mark.dragons_remote_data -def test_append_nddata_to_root_no_name(testfile2): - ad = astrodata.open(testfile2) - - lbefore = len(ad) - ones = np.ones((10, 10)) - hdu = fits.ImageHDU(ones) - nd = NDData(hdu.data) - nd.meta['header'] = hdu.header - ad.append(nd) - assert len(ad) == (lbefore + 1) - - -@pytest.mark.dragons_remote_data -def test_append_nddata_to_root_with_arbitrary_name(testfile2): - ad = astrodata.open(testfile2) - assert len(ad) == 6 - - ones = np.ones((10, 10)) - hdu = fits.ImageHDU(ones) - nd = NDData(hdu.data) - nd.meta['header'] = hdu.header - hdu.header['EXTNAME'] = 'ARBITRARY' - with pytest.raises(ValueError): - ad.append(nd) - - -def test_append_table_to_extensions(tmp_path): - testfile = tmp_path / 'test.fits' - ad = astrodata.create({}) - ad.append(NDData(np.zeros((4, 5)))) - ad.append(NDData(np.zeros((4, 5)))) - ad.append(NDData(np.zeros((4, 5)), meta={'header': {'FOO': 'BAR'}})) - ad[0].TABLE1 = Table([[1]]) - ad[0].TABLE2 = Table([[22]]) - ad[1].TABLE2 = Table([[2]]) # extensions can have the same table name - ad[2].TABLE3 = Table([[3]]) - ad.write(testfile) - - ad = astrodata.open(testfile) - - # Check that slices do not report extension tables - assert ad.exposed == set() - assert ad[0].exposed == {'TABLE1', 'TABLE2'} - assert ad[1].exposed == {'TABLE2'} - assert ad[2].exposed == {'TABLE3'} - assert ad[1:].exposed == set() - - assert ad[2].hdr['FOO'] == 'BAR' - - match = ("Cannot append table 'TABLE1' because it would hide an " - "extension table") - with pytest.raises(ValueError, match=match): - ad.TABLE1 = Table([[1]]) - - -def test_append_table_and_write(tmp_path): - testfile = tmp_path / 'test.fits' - ad = astrodata.create({}) - ad.append(NDData(np.zeros((4, 5)))) - ad[0].TABLE1 = Table([[1]]) - ad.write(testfile) - ad.write(testfile, overwrite=True) - - ad = astrodata.open(testfile) - assert ad[0].exposed == {'TABLE1'} - - -def test_table_with_units(tmp_path): - testfile = tmp_path / 'test.fits' - ad = astrodata.create({}) - ad.append(NDData(np.zeros((4, 5)))) - ad[0].TABLE1 = Table([[1]]) - ad[0].TABLE1['col0'].unit = 'mag(cm2 electron / erg)' - - with warnings.catch_warnings(record=True) as w: - ad.write(testfile) - - assert len(w) == 0 - ad = astrodata.open(testfile) - assert ad[0].TABLE1['col0'].unit == u.Unit('mag(cm2 electron / erg)') - - -# Append / assign Gemini specific - -@pytest.mark.dragons_remote_data -def test_append_dq_var(testfile2): - ad = astrodata.open(testfile2) - - dq = np.zeros(ad[0].data.shape) - with pytest.raises(ValueError): - ad.append(dq, name='DQ') - with pytest.raises(AttributeError): - ad.DQ = dq - with pytest.raises(AttributeError): - ad[0].DQ = dq - - var = np.ones(ad[0].data.shape) - with pytest.raises(ValueError): - ad.append(var, name='VAR') - with pytest.raises(AttributeError): - ad.VAR = var - with pytest.raises(AttributeError): - ad[0].VAR = var - - -# Append AstroData slices - -@pytest.mark.dragons_remote_data -def test_append_single_slice(testfile1, testfile2): - ad = astrodata.open(testfile2) - ad2 = astrodata.open(testfile1) - - lbefore = len(ad2) - ad2.append(ad[1]) - - assert len(ad2) == (lbefore + 1) - assert np.all(ad2[-1].data == ad[1].data) - - # With a custom header - ad2.append(ad[1], header=fits.Header({'FOO': 'BAR'})) - assert ad2[-1].nddata.meta['header']['FOO'] == 'BAR' - - -@pytest.mark.dragons_remote_data -def test_append_non_single_slice(testfile1, testfile2): - ad = astrodata.open(testfile2) - ad2 = astrodata.open(testfile1) - - with pytest.raises(ValueError): - ad2.append(ad[1:]) - - -@pytest.mark.dragons_remote_data -def test_append_whole_instance(testfile1, testfile2): - ad = astrodata.open(testfile2) - ad2 = astrodata.open(testfile1) - - with pytest.raises(ValueError): - ad2.append(ad) - - -@pytest.mark.dragons_remote_data -def test_append_slice_to_extension(testfile1, testfile2): - ad = astrodata.open(testfile2) - ad2 = astrodata.open(testfile1) - - with pytest.raises(TypeError): - ad2[0].append(ad[0], name="FOOBAR") - - match = "Cannot append an AstroData slice to another slice" - with pytest.raises(ValueError, match=match): - ad[2].FOO = ad2[1] - - -@pytest.mark.dragons_remote_data -def test_delete_named_associated_extension(testfile2): - ad = astrodata.open(testfile2) - ad[0].MYTABLE = Table(([1, 2, 3], [4, 5, 6], [7, 8, 9]), - names=('a', 'b', 'c')) - assert 'MYTABLE' in ad[0] - del ad[0].MYTABLE - assert 'MYTABLE' not in ad[0] - - -@pytest.mark.dragons_remote_data -def test_delete_arbitrary_attribute_from_ad(testfile2): - ad = astrodata.open(testfile2) - - with pytest.raises(AttributeError): - ad.arbitrary - - ad.arbitrary = 15 - - assert ad.arbitrary == 15 - - del ad.arbitrary - - with pytest.raises(AttributeError): - ad.arbitrary - - -def test_build_ad_multiple_extensions(tmp_path): - """Build an AD object with multiple extensions and check that we retrieve - everything in the correct order after writing. - """ - shape = (4, 5) - testfile = tmp_path / 'test.fits' - - ad = astrodata.create({}) - for i in range(1, 4): - nd = NDData(np.zeros(shape) + i, - uncertainty=VarianceUncertainty(np.ones(shape)), - mask=np.zeros(shape, dtype='uint16')) - ad.append(nd) - ad[-1].OBJCAT = Table([[i]]) - ad[-1].MYARR = np.zeros(10) + i - - ad.REFCAT = Table([['ref']]) - ad.write(testfile) - - ad2 = astrodata.open(testfile) - - for ext, ext2 in zip(ad, ad2): - assert_array_equal(ext.data, ext2.data) - assert_array_equal(ext.MYARR, ext2.MYARR) - assert_array_equal(ext.OBJCAT['col0'], ext2.OBJCAT['col0']) diff --git a/astrodata/tests/test_provenance.py b/astrodata/tests/test_provenance.py deleted file mode 100644 index 832f0c7774..0000000000 --- a/astrodata/tests/test_provenance.py +++ /dev/null @@ -1,172 +0,0 @@ -from datetime import datetime, timedelta, timezone -import os - -import numpy as np -import pytest - -import astrodata -from astrodata import fits -from astrodata.testing import download_from_archive -from astrodata.provenance import (add_provenance, add_history, clone_provenance, - clone_history) - - -@pytest.fixture -def ad(): - phu = fits.PrimaryHDU() - hdu = fits.ImageHDU(data=np.ones((10, 10)), name='SCI') - return astrodata.create(phu, [hdu]) - - -@pytest.fixture -def ad2(): - phu = fits.PrimaryHDU() - hdu = fits.ImageHDU(data=np.ones((10, 10)), name='SCI') - return astrodata.create(phu, [hdu]) - - -def test_add_get_provenance(ad): - timestamp = datetime.now(timezone.utc).replace(tzinfo=None).isoformat() - filename = "filename" - md5 = "md5" - primitive = "provenance_added_by" - - # if md5 is None, provenance is added with empty string as md5 - add_provenance(ad, filename, None, primitive) - assert len(ad.PROVENANCE) == 1 - assert tuple(ad.PROVENANCE[0])[1:] == (filename, '', primitive) - - add_provenance(ad, filename, md5, primitive, timestamp=timestamp) - assert len(ad.PROVENANCE) == 2 - assert tuple(ad.PROVENANCE[1]) == (timestamp, filename, md5, primitive) - - # entry is updated and a default timestamp is created - add_provenance(ad, filename, md5, primitive) - assert len(ad.PROVENANCE) == 2 - assert tuple(ad.PROVENANCE[1])[1:] == (filename, md5, primitive) - - # add new entry - add_provenance(ad, filename, 'md6', 'other primitive') - assert len(ad.PROVENANCE) == 3 - assert tuple(ad.PROVENANCE[1])[1:] == (filename, md5, primitive) - assert tuple(ad.PROVENANCE[2])[1:] == (filename, 'md6', 'other primitive') - - -def test_add_duplicate_provenance(ad): - timestamp = datetime.now(timezone.utc).replace(tzinfo=None).isoformat() - filename = "filename" - md5 = "md5" - primitive = "provenance_added_by" - - add_provenance(ad, filename, md5, primitive, timestamp=timestamp) - add_provenance(ad, filename, md5, primitive, timestamp=timestamp) - - # was a dupe, so should have been skipped - assert len(ad.PROVENANCE) == 1 - - -def test_add_get_history(ad): - timestamp_start = datetime.now(timezone.utc).replace(tzinfo=None) - timestamp_end = (timestamp_start + - timedelta(days=1)).isoformat() - timestamp_start = timestamp_start.isoformat() - primitive = "primitive" - args = "args" - - add_history(ad, timestamp_start, timestamp_end, primitive, args) - assert len(ad.HISTORY) == 1 - assert tuple(ad.HISTORY[0]) == (primitive, args, timestamp_start, - timestamp_end) - - add_history(ad, timestamp_start, timestamp_end, 'another primitive', args) - assert len(ad.HISTORY) == 2 - assert tuple(ad.HISTORY[0]) == (primitive, args, timestamp_start, - timestamp_end) - assert tuple(ad.HISTORY[1]) == ('another primitive', args, - timestamp_start, timestamp_end) - - -def test_add_dupe_history(ad): - timestamp_start = datetime.now(timezone.utc).replace(tzinfo=None) - timestamp_end = (timestamp_start + timedelta(days=1)).isoformat() - timestamp_start = timestamp_start.isoformat() - primitive = "primitive" - args = "args" - - add_history(ad, timestamp_start, timestamp_end, primitive, args) - add_history(ad, timestamp_start, timestamp_end, primitive, args) - - # was a dupe, should have skipped 2nd add - assert len(ad.HISTORY) == 1 - - -def test_clone_provenance(ad, ad2): - timestamp = datetime.now(timezone.utc).replace(tzinfo=None).isoformat() - filename = "filename" - md5 = "md5" - primitive = "provenance_added_by" - - add_provenance(ad, filename, md5, primitive, timestamp=timestamp) - - clone_provenance(ad.PROVENANCE, ad2) - - assert len(ad2.PROVENANCE) == 1 - assert tuple(ad2.PROVENANCE[0]) == (timestamp, filename, md5, primitive) - - -def test_clone_history(ad, ad2): - timestamp_start = datetime.now(timezone.utc).replace(tzinfo=None) - timestamp_end = (timestamp_start + timedelta(days=1)).isoformat() - timestamp_start = timestamp_start.isoformat() - primitive = "primitive" - args = "args" - - add_history(ad, timestamp_start, timestamp_end, primitive, args) - - clone_history(ad.HISTORY, ad2) - - assert len(ad2.HISTORY) == 1 - assert tuple(ad2.HISTORY[0]) == (primitive, args, timestamp_start, - timestamp_end) - - -@pytest.fixture(scope='module') -def BPM_PROVHISTORY(): - """ - BPM file with PROVHISTORY (old name for HISTORY) - """ - return download_from_archive("bpm_20220128_gmos-s_Ham_11_full_12amp.fits") - - -@pytest.mark.dragons_remote_data -def test_convert_provhistory(tmpdir, BPM_PROVHISTORY): - ad = astrodata.open(BPM_PROVHISTORY) - - # This file (should) use the old PROVHISTORY extname - assert hasattr(ad, 'PROVHISTORY') - - # When we add history, that should get converted to HISTORY - now = datetime.now(timezone.utc).replace(tzinfo=None).isoformat() - add_history(ad, now, now, "primitive", "args") - assert not hasattr(ad, 'PROVHISTORY') - assert hasattr(ad, 'HISTORY') - - # and if we write the file, it should have a HISTORY extname - # and not a PROVHISTORY extname - testfile = os.path.join(str(tmpdir), 'temp.fits') - ad.path = testfile - ad.write() - assert os.path.exists(testfile) - - ad2 = astrodata.open(testfile) - assert hasattr(ad2, 'HISTORY') - assert not hasattr(ad2, 'PROVHISTORY') - - # and should have that new history record we added - hist = ad.HISTORY[-1] - assert hist['timestamp_start'] == now - assert hist['timestamp_stop'] == now - assert hist['primitive'] == 'primitive' - assert hist['args'] == 'args' - - os.remove(testfile) diff --git a/astrodata/tests/test_tags.py b/astrodata/tests/test_tags.py deleted file mode 100644 index 6e51e83d23..0000000000 --- a/astrodata/tests/test_tags.py +++ /dev/null @@ -1,162 +0,0 @@ -import os -import numpy as np -import pytest -from astropy.io import fits -from astropy.table import Table - -import astrodata -from astrodata import (astro_data_tag, astro_data_descriptor, TagSet, - AstroData, factory, returns_list) - -SHAPE = (4, 5) - - -class AstroDataMyInstrument(AstroData): - __keyword_dict = dict( - array_name='AMPNAME', - array_section='CCDSECT' - ) - - @staticmethod - def _matches_data(source): - return source[0].header.get('INSTRUME', '').upper() == 'MYINSTRUMENT' - - @astro_data_tag - def _tag_instrument(self): - return TagSet(['MYINSTRUMENT']) - - @astro_data_tag - def _tag_image(self): - if self.phu.get('GRATING') == 'MIRROR': - return TagSet(['IMAGE']) - - @astro_data_tag - def _tag_dark(self): - if self.phu.get('OBSTYPE') == 'DARK': - return TagSet(['DARK'], blocks=['IMAGE', 'SPECT']) - - @astro_data_tag - def _tag_raise(self): - raise KeyError # I guess if some keyword is missing... - - @returns_list - @astro_data_descriptor - def dispersion_axis(self): - return 1 - - @returns_list - @astro_data_descriptor - def gain(self): - return [1, 1] - - @returns_list - @astro_data_descriptor - def badguy(self): - return [1, 2, 3] - - @astro_data_descriptor - def array_name(self): - return self.phu.get(self._keyword_for('array_name')) - - @astro_data_descriptor - def detector_section(self): - return self.phu.get(self._keyword_for('array_section')) - - @astro_data_descriptor - def amp_read_area(self): - ampname = self.array_name() - detector_section = self.detector_section() - return "'{}':{}".format(ampname, detector_section) - - -def setup_module(): - factory.addClass(AstroDataMyInstrument) - - -def teardown_module(): - factory._registry.remove(AstroDataMyInstrument) - - -@pytest.fixture(scope='function') -def testfile(tmpdir): - hdr = fits.Header({ - 'INSTRUME': 'MYINSTRUMENT', - 'GRATING': 'MIRROR', - 'OBSTYPE': 'DARK', - 'AMPNAME': 'FOO', - 'CCDSECT': '1:1024', - }) - phu = fits.PrimaryHDU(header=hdr) - hdu = fits.ImageHDU(data=np.ones(SHAPE)) - hdu2 = fits.ImageHDU(data=np.ones(SHAPE) + 1) - ad = astrodata.create(phu, [hdu, hdu2]) - tbl = Table([np.zeros(10), np.ones(10)], names=['col1', 'col2']) - ad.MYCAT = tbl - filename = str(tmpdir.join('fakebias.fits')) - ad.write(filename) - yield filename - os.remove(filename) - - -def test_tags(testfile): - ad = astrodata.open(testfile) - assert ad.descriptors == ('amp_read_area', 'array_name', 'badguy', - 'detector_section', 'dispersion_axis', 'gain', - 'instrument', 'object', 'telescope') - assert ad.tags == {'DARK', 'MYINSTRUMENT'} - assert ad.amp_read_area() == "'FOO':1:1024" - - -def test_keyword_for(testfile): - ad = astrodata.open(testfile) - assert ad._keyword_for('array_name') == 'AMPNAME' - with pytest.raises(AttributeError, match="No match for 'foobar'"): - ad._keyword_for('foobar') - - -def test_returns_list(testfile): - ad = astrodata.open(testfile) - assert ad.dispersion_axis() == [1, 1] - assert ad[0].dispersion_axis() == 1 - - assert ad.gain() == [1, 1] - assert ad[0].gain() == 1 - - with pytest.raises(IndexError): - ad.badguy() - - -def test_info(testfile, capsys): - ad = astrodata.open(testfile) - ad.info() - captured = capsys.readouterr() - out = captured.out.splitlines() - assert out[0].endswith('fakebias.fits') - assert out[1:] == [ - 'Tags: DARK MYINSTRUMENT', - '', - 'Pixels Extensions', - 'Index Content Type Dimensions Format', - '[ 0] science NDAstroData (4, 5) float64', - '[ 1] science NDAstroData (4, 5) float64', - '', - 'Other Extensions', - ' Type Dimensions', - '.MYCAT Table (10, 2)' - ] - - ad[1].info() - captured = capsys.readouterr() - out = captured.out.splitlines() - assert out[0].endswith('fakebias.fits') - assert out[1:] == [ - 'Tags: DARK MYINSTRUMENT', - '', - 'Pixels Extensions', - 'Index Content Type Dimensions Format', - '[ 0] science NDAstroData (4, 5) float64', - '', - 'Other Extensions', - ' Type Dimensions', - '.MYCAT Table (10, 2)' - ] diff --git a/astrodata/tests/test_testing.py b/astrodata/tests/test_testing.py deleted file mode 100644 index d191cb889f..0000000000 --- a/astrodata/tests/test_testing.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -Tests for the `astrodata.testing` module. -""" - -import os - -import astrodata -import numpy as np -import pytest -from astrodata.testing import assert_same_class, download_from_archive - - -def test_download_from_archive_raises_ValueError_if_envvar_does_not_exists(): - with pytest.raises(ValueError): - download_from_archive('N20180304S0126.fits', env_var='') - - -def test_download_from_archive_raises_IOError_if_path_is_not_accessible(): - env_var = 'MY_FAKE_ENV_VAR' - os.environ['MY_FAKE_ENV_VAR'] = "/not/accessible/path" - with pytest.raises(IOError): - download_from_archive('N20180304S0126.fits', env_var=env_var) - - -def test_download_from_archive(monkeypatch, tmpdir): - ncall = 0 - - def mock_download(remote_url, **kwargs): - nonlocal ncall - ncall += 1 - fname = remote_url.split('/')[-1] - tmpdir.join(fname).write('') # create fake file - return str(tmpdir.join(fname)) - - monkeypatch.setattr("astrodata.testing.download_file", mock_download) - monkeypatch.setenv("DRAGONS_TEST", str(tmpdir)) - - # first call will use our mock function above - fname = download_from_archive('N20170529S0168.fits') - assert os.path.exists(fname) - assert ncall == 1 - - # second call will use the cache so we check that our mock function is not - # called twice - fname = download_from_archive('N20170529S0168.fits') - assert os.path.exists(fname) - assert ncall == 1 - - -def test_assert_most_close(): - from astrodata.testing import assert_most_close - x = np.arange(10) - y = np.arange(10) - assert_most_close(x, y, 1) - - y[0] = -1 - assert_most_close(x, y, 1) - - with pytest.raises(AssertionError): - y[1] = -1 - assert_most_close(x, y, 1) - - -def test_assert_most_equal(): - from astrodata.testing import assert_most_equal - x = np.arange(10) - y = np.arange(10) - assert_most_equal(x, y, 1) - - y[0] = -1 - assert_most_equal(x, y, 1) - - with pytest.raises(AssertionError): - y[1] = -1 - assert_most_equal(x, y, 1) - - -def test_assert_same_class(): - ad = astrodata.create({}) - ad2 = astrodata.create({}) - assert_same_class(ad, ad2) - - with pytest.raises(AssertionError): - assert_same_class(ad, np.array([1])) diff --git a/astrodata/tests/test_utils.py b/astrodata/tests/test_utils.py deleted file mode 100644 index 585b2c0b71..0000000000 --- a/astrodata/tests/test_utils.py +++ /dev/null @@ -1,81 +0,0 @@ -import numpy as np -import pytest -import astropy.units as u -from astropy.io import fits -from astropy.table import Table -from astrodata.fits import header_for_table, card_filter, update_header -from astrodata import Section - - -def test_header_for_table(): - tbl = Table([np.arange(2 * 3 * 4).reshape(3, 2, 4), - [1.0, 2.0, 3.0], - ['aa', 'bb', 'cc'], - [[True, False], [True, False], [True, False]]], - names='abcd') - tbl['b'].unit = u.arcsec - hdr = header_for_table(tbl) - assert hdr['TFORM1'] == '8K' - assert hdr['TDIM1'] == '(4,2)' - assert hdr['TFORM4'] == '2L' - assert hdr['TUNIT2'] == 'arcsec' - - -def test_card_filter(): - hdr = fits.Header(dict(zip('ABCDE', range(5)))) - assert [c.keyword for c in card_filter(hdr.cards, include='ABC')] == \ - ['A', 'B', 'C'] - assert [c.keyword for c in card_filter(hdr.cards, exclude='AB')] == \ - ['C', 'D', 'E'] - - -def test_update_header(): - hdra = fits.Header({'INSTRUME': 'darkimager', 'OBJECT': 'M42'}) - hdra.add_comment('A super useful comment') - hdra.add_history('This is historic') - assert update_header(hdra, hdra) is hdra - - hdrb = fits.Header({'OBJECT': 'IO', 'EXPTIME': 42}) - hdrb.add_comment('A super useful comment') - hdrb.add_comment('Another comment') - hdrb.add_history('This is historic') - hdrb.add_history('And not so useful') - - hdr = update_header(hdra, hdrb) - # Check that comments have been merged - assert list(hdr['COMMENT']) == ['A super useful comment', 'Another comment'] - assert list(hdr['HISTORY']) == ['This is historic', 'And not so useful'] - - -def test_section_basics(): - s = Section.from_string("[1:1024,1:512") - assert tuple(s) == (0, 1024, 0, 512) - assert s.asIRAFsection() == "[1:1024,1:512]" - assert s.asslice() == (slice(0, 512), slice(0, 1024)) - assert (s.x1, s.x2, s.y1, s.y2) == (0, 1024, 0, 512) - assert (s[0], s[1], s[2], s[3]) == (0, 1024, 0, 512) - - s = Section.from_shape((8, 512, 1024)) - assert tuple(s) == (0, 1024, 0, 512, 0, 8) - assert s.z2 == 8 - - -def test_section_relations(): - s = Section.from_string("[1:1024,1:512") - s2 = Section.from_string("[1:1024,1:256]") - s3 = Section.from_string("[1:512,1:1024]") - s4 = Section.from_string("[513:1024,1:1024]") - - assert s.contains(s2) - assert not s.contains(s3) - - assert s.overlap(s2) == Section(0, 1024, 0, 256) - assert s.overlap(s3) == Section(0, 512, 0, 512) - assert s.overlap(s2) == s2.overlap(s) - assert s3.overlap(s4) is None - - assert s3.is_same_size(s4) - - ss = s2.shift(100, 200) - assert ss.is_same_size(s2) - assert ss == Section(100, 1124, 200, 456) diff --git a/astrodata/tests/test_wcs.py b/astrodata/tests/test_wcs.py deleted file mode 100644 index 33440f2f87..0000000000 --- a/astrodata/tests/test_wcs.py +++ /dev/null @@ -1,267 +0,0 @@ -import math -import os -import pytest -import numpy as np -from numpy.testing import assert_allclose - -from astropy.modeling import models -from astropy.wcs import WCS -from astropy.coordinates import SkyCoord -from astropy import units as u -from astropy.io.fits import Header -from gwcs import coordinate_frames as cf -from gwcs.wcs import WCS as gWCS - -import astrodata -from astrodata import wcs as adwcs -from astrodata.testing import download_from_archive -from gempy.library.transform import add_longslit_wcs - - -@pytest.fixture(scope='module') -def F2_IMAGE(): - """Any F2 image with CD3_3=1""" - return download_from_archive("S20130717S0365.fits") - - -@pytest.fixture(scope='module') -def NIRI_IMAGE(): - """Any NIRI image""" - return download_from_archive("N20180102S0392.fits") - - -@pytest.fixture(scope='module') -def GMOS_LONGSLIT(): - """Any GMOS longslit spectrum""" - return download_from_archive("N20180103S0332.fits") - - -@pytest.mark.parametrize("angle", [0, 20, 67, -35]) -@pytest.mark.parametrize("scale", [0.5, 1.0, 2.0]) -@pytest.mark.parametrize("xoffset,yoffset", [(0,0), (10,20)]) -def test_calculate_affine_matrices(angle, scale, xoffset, yoffset): - m = ((models.Scale(scale) & models.Scale(scale)) | - models.Rotation2D(angle) | - (models.Shift(xoffset) & models.Shift(yoffset))) - affine = adwcs.calculate_affine_matrices(m, (100, 100)) - assert_allclose(affine.offset, (yoffset, xoffset), atol=1e-10) - angle = math.radians(angle) - assert_allclose(affine.matrix, ((scale * math.cos(angle), scale * math.sin(angle)), - (-scale * math.sin(angle), scale * math.cos(angle))), - atol=1e-10) - - -@pytest.mark.dragons_remote_data -def test_reading_and_writing_sliced_image(F2_IMAGE): - ad = astrodata.open(F2_IMAGE) - result = ad[0].wcs(100, 100, 0) - ad[0].reset(ad[0].nddata[0]) - assert_allclose(ad[0].wcs(100, 100), result) - ad.write("test.fits", overwrite=True) - ad2 = astrodata.open("test.fits") - assert_allclose(ad2[0].wcs(100, 100), result) - ad2.write("test.fits", overwrite=True) - ad2 = astrodata.open("test.fits") - assert_allclose(ad2[0].wcs(100, 100), result) - - -def test_remove_axis_from_model(): - """A simple test that removes one of three &-linked models""" - model = models.Shift(0) & models.Shift(1) & models.Shift(2) - for axis in (0, 1, 2): - new_model, input_axis = adwcs.remove_axis_from_model(model, axis) - assert input_axis == axis - assert new_model.n_submodels == 2 - assert new_model.offset_0 + new_model.offset_1 == 3 - axis - - -def test_remove_axis_from_model_2(): - """A test with |-chained models""" - model = ((models.Shift(0) & models.Shift(1) & models.Shift(2)) | - (models.Scale(2) & models.Rotation2D(90))) - new_model, input_axis = adwcs.remove_axis_from_model(model, 0) - assert input_axis == 0 - assert new_model.n_submodels == 3 - assert new_model.offset_0 == 1 - assert new_model.offset_1 == 2 - assert new_model.angle_2 == 90 - - -def test_remove_axis_from_model_3(): - """A test with a Mapping""" - model1 = models.Mapping((1, 2, 0)) - model2 = models.Shift(0) & models.Shift(1) & models.Shift(2) - new_model, input_axis = adwcs.remove_axis_from_model(model1 | model2, 1) - assert input_axis == 2 - assert new_model.n_submodels == 3 - assert_allclose(new_model(0, 10), (10, 2)) - new_model, input_axis = adwcs.remove_axis_from_model(model2 | model1, 1) - assert input_axis == 2 - assert new_model.n_submodels == 3 - assert_allclose(new_model(0, 10), (11, 0)) - - -def test_remove_axis_from_model_4(): - """A test with a Mapping that creates a new axis""" - model1 = models.Shift(0) & models.Shift(1) & models.Shift(2) - model = models.Mapping((1, 0, 0)) | model1 - new_model, input_axis = adwcs.remove_axis_from_model(model, 1) - assert input_axis is None - assert new_model.n_submodels == 3 - assert_allclose(new_model(0, 10), (10, 2)) - - # Check that we can identify and remove the "Identity"-like residual Mapping - model = models.Mapping((0, 1, 0)) | model1 - new_model, input_axis = adwcs.remove_axis_from_model(model, 2) - assert input_axis is None - assert new_model.n_submodels == 2 - assert_allclose(new_model(0, 10), (0, 11)) - - -def test_remove_axis_from_model_5(): - """A test with fix_inputs""" - model1 = models.Shift(0) & models.Shift(1) & models.Shift(2) - model = models.fix_inputs(model1, {1: 6}) - new_model, input_axis = adwcs.remove_axis_from_model(model, 1) - assert input_axis is None - assert new_model.n_submodels == 2 - assert_allclose(new_model(0, 10), (0, 12)) - - new_model, input_axis = adwcs.remove_axis_from_model(model, 2) - assert input_axis == 2 - assert new_model.n_submodels == 3 - assert_allclose(new_model(0), (0, 7)) - - -@pytest.mark.dragons_remote_data -def test_remove_unused_world_axis(F2_IMAGE): - """A test with an intermediate frame""" - ad = astrodata.open(F2_IMAGE) - result = ad[0].wcs(1000, 1000, 0) - new_frame = cf.Frame2D(name="intermediate") - new_model = models.Shift(100) & models.Shift(200) & models.Identity(1) - ad[0].wcs.insert_frame(ad[0].wcs.input_frame, - new_model, new_frame) - ad[0].reset(ad[0].nddata[0]) - new_result = ad[0].wcs(900, 800) - assert_allclose(new_result, result) - adwcs.remove_unused_world_axis(ad[0]) - new_result = ad[0].wcs(900, 800) - assert_allclose(new_result, result[-2:]) - for frame in ad[0].wcs.available_frames: - assert getattr(ad[0].wcs, frame).naxes == 2 - - -@pytest.mark.dragons_remote_data -def test_gwcs_creation(NIRI_IMAGE): - """Test that the gWCS object for an image agrees with the FITS WCS""" - ad = astrodata.open(NIRI_IMAGE) - w = WCS(ad[0].hdr) - for y in range(0, 1024, 200): - for x in range(0, 1024, 200): - wcs_sky = w.pixel_to_world(x, y) - gwcs_sky = SkyCoord(*ad[0].wcs(x, y), unit=u.deg) - assert wcs_sky.separation(gwcs_sky) < 0.01 * u.arcsec - - -@pytest.mark.dragons_remote_data -def test_adding_longslit_wcs(GMOS_LONGSLIT): - """Test that adding the longslit WCS doesn't interfere with the sky - coordinates of the WCS""" - ad = astrodata.open(GMOS_LONGSLIT) - frame_name = ad[4].hdr.get("RADESYS", ad[4].hdr["RADECSYS"]).lower() - crpix1 = ad[4].hdr["CRPIX1"] - 1 - crpix2 = ad[4].hdr["CRPIX2"] - 1 - gwcs_sky = SkyCoord(*ad[4].wcs(crpix1, crpix2), unit=u.deg, frame=frame_name) - add_longslit_wcs(ad) - gwcs_coords = ad[4].wcs(crpix1, crpix2) - new_gwcs_sky = SkyCoord(*gwcs_coords[1:], unit=u.deg, frame=frame_name) - assert gwcs_sky.separation(new_gwcs_sky) < 0.01 * u.arcsec - # The sky coordinates should not depend on the x pixel value - gwcs_coords = ad[4].wcs(0, crpix2) - new_gwcs_sky = SkyCoord(*gwcs_coords[1:], unit=u.deg, frame=frame_name) - assert gwcs_sky.separation(new_gwcs_sky) < 0.01 * u.arcsec - - # The sky coordinates also should not depend on the extension - # there are shifts of order 1 pixel because of the rotations of CCDs 1 - # and 3, which are incorporated into their raw WCSs. Remember that the - # 12 WCSs are independent at this stage, they don't all map onto the - # WCS of the reference extension - for ext in ad: - gwcs_coords = ext.wcs(0, crpix2) - new_gwcs_sky = SkyCoord(*gwcs_coords[1:], unit=u.deg, frame=frame_name) - assert gwcs_sky.separation(new_gwcs_sky) < 0.1 * u.arcsec - - # This is equivalent to writing to disk and reading back in - wcs_dict = astrodata.wcs.gwcs_to_fits(ad[4].nddata, ad.phu) - new_gwcs = astrodata.wcs.fitswcs_to_gwcs(Header(wcs_dict)) - gwcs_coords = new_gwcs(crpix1, crpix2) - new_gwcs_sky = SkyCoord(*gwcs_coords[1:], unit=u.deg, frame=frame_name) - assert gwcs_sky.separation(new_gwcs_sky) < 0.01 * u.arcsec - gwcs_coords = new_gwcs(0, crpix2) - new_gwcs_sky = SkyCoord(*gwcs_coords[1:], unit=u.deg, frame=frame_name) - assert gwcs_sky.separation(new_gwcs_sky) < 0.01 * u.arcsec - -# Coordinates of projection center and new projection center -@pytest.mark.parametrize("coords", ([(0, 0), (0.1, -0.1)], - [(120, -50), (119.5, -49.5)], - [(270, 89.9), (0, 89)])) -@pytest.mark.parametrize("flip", (True, False)) -def test_create_new_image_projection(flip, coords): - shifts = (100, 200) - shifts = models.Shift(shifts[0]) & models.Shift(shifts[1]) - pixscale = 1.0 - angle = 0 - matrix = np.asarray(models.Rotation2D(angle)(*(np.identity(2) * pixscale / 3600))) - if not flip: - matrix[0] *= -1 - lon, lat = coords[0] - projection = (models.AffineTransformation2D(matrix=matrix) | - models.Pix2Sky_Gnomonic() | - models.RotateNative2Celestial(lon=lon, lat=lat, lon_pole=180)) - transform = shifts | projection - new_transform = adwcs.create_new_image_projection(transform, coords[1]) - for x in (0, 1000): - for y in (0, 1000): - c1 = SkyCoord(*transform(x, y), unit='deg') - c2 = SkyCoord(*new_transform(x, y), unit='deg') - assert c1.separation(c2).arcsec < 0.5 - - -@pytest.mark.dragons_remote_data -def test_loglinear_axis(NIRI_IMAGE): - """Test that we can add a log-linear axis and write and read it""" - ad = astrodata.open(NIRI_IMAGE) - coords = ad[0].wcs(200, 300) - ad[0].data = np.repeat(ad[0].data[:, :, np.newaxis], 5, axis=2) - new_input_frame = adwcs.pixel_frame(3) - loglinear_frame = cf.SpectralFrame(axes_order=(0,), unit=u.nm, - axes_names=("AWAV",), name="Wavelength in air") - celestial_frame = ad[0].wcs.output_frame - celestial_frame._axes_order = (1, 2) - new_output_frame = cf.CompositeFrame([loglinear_frame, celestial_frame], - name="world") - new_wcs = models.Exponential1D(amplitude=1, tau=2) & ad[0].wcs.forward_transform - ad[0].wcs = gWCS([(new_input_frame, new_wcs), - (new_output_frame, None)]) - new_coords = ad[0].wcs(2, 200, 300) - assert_allclose(coords, new_coords[1:]) - - #with change_working_dir(): - ad.write("test.fits", overwrite=True) - ad2 = astrodata.open("test.fits") - assert_allclose(ad2[0].wcs(2, 200, 300), new_coords) - - -@pytest.mark.preprocessed_data -def test_tabular1D_axis(path_to_inputs, change_working_dir): - """Check a FITS file with a tabular 1D axis is read correctly and - then rewritten to disk and read back in""" - ad = astrodata.open(os.path.join(path_to_inputs, "tab1dtest.fits")) - assert ad[0].wcs(0) == pytest.approx(3017.51065254) - assert ad[0].wcs(1021) == pytest.approx(4012.89510727) - with change_working_dir(): - ad.write("test.fits", overwrite=True) - ad2 = astrodata.open("test.fits") - assert ad2[0].wcs(0) == pytest.approx(3017.51065254) - assert ad2[0].wcs(1021) == pytest.approx(4012.89510727) diff --git a/astrodata/utils.py b/astrodata/utils.py deleted file mode 100644 index b35ae3247e..0000000000 --- a/astrodata/utils.py +++ /dev/null @@ -1,332 +0,0 @@ -import inspect -import warnings -from collections import namedtuple -from functools import wraps -from traceback import format_stack - -import numpy as np - -INTEGER_TYPES = (int, np.integer) - -__all__ = ('assign_only_single_slice', 'astro_data_descriptor', - 'AstroDataDeprecationWarning', 'astro_data_tag', 'deprecated', - 'normalize_indices', 'returns_list', 'TagSet', 'Section') - - -class AstroDataDeprecationWarning(DeprecationWarning): - pass - - -warnings.simplefilter("always", AstroDataDeprecationWarning) - - -def deprecated(reason): - def decorator_wrapper(fn): - @wraps(fn) - def wrapper(*args, **kw): - current_source = '|'.join(format_stack(inspect.currentframe())) - if current_source not in wrapper.seen: - wrapper.seen.add(current_source) - warnings.warn(reason, AstroDataDeprecationWarning) - return fn(*args, **kw) - wrapper.seen = set() - return wrapper - return decorator_wrapper - - -def normalize_indices(slc, nitems): - multiple = True - if isinstance(slc, slice): - start, stop, step = slc.indices(nitems) - indices = list(range(start, stop, step)) - elif (isinstance(slc, INTEGER_TYPES) or - (isinstance(slc, tuple) and - all(isinstance(i, INTEGER_TYPES) for i in slc))): - if isinstance(slc, INTEGER_TYPES): - slc = (int(slc),) # slc's type m - multiple = False - else: - multiple = True - # Normalize negative indices... - indices = [(x if x >= 0 else nitems + x) for x in slc] - else: - raise ValueError("Invalid index: {}".format(slc)) - - if any(i >= nitems for i in indices): - raise IndexError("Index out of range") - - return indices, multiple - - -class TagSet(namedtuple('TagSet', 'add remove blocked_by blocks if_present')): - """ - Named tuple that is used by tag methods to return which actions should be - performed on a tag set. All the attributes are optional, and any - combination of them can be used, allowing to create complex tag structures. - Read the documentation on the tag-generating algorithm if you want to - better understand the interactions. - - The simplest TagSet, though, tends to just add tags to the global set. - - It can be initialized by position, like any other tuple (the order of the - arguments is the one in which the attributes are listed below). It can - also be initialized by name. - - Attributes - ---------- - add : set of str, optional - Tags to be added to the global set - remove : set of str, optional - Tags to be removed from the global set - blocked_by : set of str, optional - Tags that will prevent this TagSet from being applied - blocks : set of str, optional - Other TagSets containing these won't be applied - if_present : set of str, optional - This TagSet will be applied only *all* of these tags are present - - Examples - --------- - >>> TagSet() - TagSet(add=set(), remove=set(), blocked_by=set(), blocks=set(), if_present=set()) - >>> TagSet({'BIAS', 'CAL'}) - TagSet(add={'BIAS', 'CAL'}, remove=set(), blocked_by=set(), blocks=set(), if_present=set()) - >>> TagSet(remove={'BIAS', 'CAL'}) - TagSet(add=set(), remove={'BIAS', 'CAL'}, blocked_by=set(), blocks=set(), if_present=set()) - - """ - def __new__(cls, add=None, remove=None, blocked_by=None, blocks=None, - if_present=None): - return super().__new__(cls, add or set(), - remove or set(), - blocked_by or set(), - blocks or set(), - if_present or set()) - - -def astro_data_descriptor(fn): - """ - Decorator that will mark a class method as an AstroData descriptor. - Useful to produce list of descriptors, for example. - - If used in combination with other decorators, this one *must* be the - one on the top (ie. the last one applying). It doesn't modify the - method in any other way. - - Args - ----- - fn : method - The method to be decorated - - Returns - -------- - The tagged method (not a wrapper) - """ - fn.descriptor_method = True - return fn - - -def returns_list(fn): - """ - Decorator to ensure that descriptors that should return a list (of one - value per extension) only returns single values when operating on - single slices; and vice versa. - - This is a common case, and you can use the decorator to simplify the - logic of your descriptors. - - Args - ----- - fn : method - The method to be decorated - - Returns - -------- - A function - """ - @wraps(fn) - def wrapper(self, *args, **kwargs): - ret = fn(self, *args, **kwargs) - if self.is_single: - if isinstance(ret, list): - # TODO: log a warning if the list is >1 element - if len(ret) > 1: - pass - return ret[0] - else: - return ret - else: - if isinstance(ret, list): - if len(ret) == len(self): - return ret - else: - raise IndexError( - "Incompatible numbers of extensions and elements in {}" - .format(fn.__name__)) - else: - return [ret] * len(self) - return wrapper - - -def assign_only_single_slice(fn): - """Raise `ValueError` if assigning to a non-single slice.""" - @wraps(fn) - def wrapper(self, *args, **kwargs): - if not self.is_single: - raise ValueError("Trying to assign to an AstroData object that " - "is not a single slice") - return fn(self, *args, **kwargs) - return wrapper - - -def astro_data_tag(fn): - """ - Decorator that marks methods of an `AstroData` derived class as part of the - tag-producing system. - - It wraps the method around a function that will ensure a consistent return - value: the wrapped method can return any sequence of sequences of strings, - and they will be converted to a TagSet. If the wrapped method - returns None, it will be turned into an empty TagSet. - - Args - ----- - fn : method - The method to be decorated - - Returns - -------- - A wrapper function - """ - @wraps(fn) - def wrapper(self): - try: - ret = fn(self) - if ret is not None: - if not isinstance(ret, TagSet): - raise TypeError("Tag function {} didn't return a TagSet" - .format(fn.__name__)) - - return TagSet(*tuple(set(s) for s in ret)) - except KeyError: - pass - - # Return empty TagSet for the "doesn't apply" case - return TagSet() - - wrapper.tag_method = True - return wrapper - - -class Section(tuple): - """A class to handle n-dimensional sections""" - - def __new__(cls, *args, **kwargs): - # Ensure that the order of keys is what we want - axis_names = [x for axis in "xyzuvw" - for x in (f"{axis}1", f"{axis}2")] - _dict = {k: v for k, v in zip(axis_names, args + - ('',) * len(kwargs))} - _dict.update(kwargs) - if list(_dict.values()).count('') or (len(_dict) % 2): - raise ValueError("Cannot initialize 'Section' object") - instance = tuple.__new__(cls, tuple(_dict.values())) - instance._axis_names = tuple(_dict.keys()) - if not all(np.diff(instance)[::2] > 0): - raise ValueError("Not all 'Section' end coordinates exceed the " - "start coordinates") - return instance - - @property - def __dict__(self): - return dict(zip(self._axis_names, self)) - - def __getnewargs__(self): - return tuple(self) - - def __getattr__(self, attr): - if attr in self._axis_names: - return self.__dict__[attr] - raise AttributeError(f"No such attribute '{attr}'") - - def __repr__(self): - return ("Section(" + - ", ".join([f"{k}={self.__dict__[k]}" - for k in self._axis_names]) + ")") - - @property - def ndim(self): - return len(self) // 2 - - @staticmethod - def from_shape(value): - """produce a Section object defining a given shape""" - return Section(*[y for x in reversed(value) for y in (0, x)]) - - @staticmethod - def from_string(value): - """The inverse of __str__, produce a Section object from a string""" - # if we were sent None, return None - if value is None: - return None - return Section(*[y for x in value.strip("[]").split(",") - for start, end in [x.split(":")] - for y in (None if start == '' else int(start)-1, - None if end == '' else int(end))]) - - def asIRAFsection(self, binning=None): - """Produce string of style '[x1:x2,y1:y2]' that is 1-indexed - and end-inclusive - - Parameters - ---------- - binning : iterable - A length-2 iterable of (x_binning, y_binning). Binning is assumed - to be 1 for all axes if not given. - """ - if binning is None: - binning = [1] * len(self._axis_names) - return ("[" + - ",".join([":".join([str(bin_*self.__dict__[axis]+1), - str(bin_*self.__dict__[axis.replace("1", "2")])]) - for axis, bin_ in zip(self._axis_names[::2], binning)]) - + "]") - - def asslice(self, add_dims=0): - """Return the Section object as a slice/list of slices. - Higher dimensionality can be achieved with the add_dims parameter.""" - return ((slice(None),) * add_dims + - tuple(slice(self.__dict__[axis], - self.__dict__[axis.replace("1", "2")]) - for axis in reversed(self._axis_names[::2]))) - - def contains(self, section): - """Return True if the supplied section is entirely within self""" - if self.ndim != section.ndim: - raise ValueError("Sections have different dimensionality") - return (all(s2 >= s1 for s1, s2 in zip(self[::2], section[::2])) and - all(s2 <= s1 for s1, s2 in zip(self[1::2], section[1::2]))) - - def is_same_size(self, section): - """Return True if the Sections are the same size""" - return np.array_equal(np.diff(self)[::2], np.diff(section)[::2]) - - def overlap(self, section): - """Determine whether the two sections overlap. If so, the Section - common to both is returned, otherwise None""" - if self.ndim != section.ndim: - raise ValueError("Sections have different dimensionality") - mins = [max(s1, s2) for s1, s2 in zip(self[::2], section[::2])] - maxs = [min(s1, s2) for s1, s2 in zip(self[1::2], section[1::2])] - try: - return self.__class__(*[v for pair in zip(mins, maxs) for v in pair]) - except ValueError: - return - - def shift(self, *shifts): - """Shift a section in each direction by the specified amount""" - if len(shifts) != self.ndim: - raise ValueError(f"Number of shifts {len(shifts)} incompatible " - f"with dimensionality {self.ndim}") - return self.__class__(*[x + s for x, s in - zip(self, [ss for s in shifts for ss in [s] * 2])]) diff --git a/astrodata/wcs.py b/astrodata/wcs.py deleted file mode 100644 index 898520eeff..0000000000 --- a/astrodata/wcs.py +++ /dev/null @@ -1,1033 +0,0 @@ -import functools -import re -from collections import namedtuple -from copy import deepcopy - -import numpy as np -from astropy import coordinates as coord -from astropy import units as u -from astropy.io import fits -from astropy.modeling import core, models, projections, CompoundModel -from astropy.table import Table -from gwcs import coordinate_frames as cf -from gwcs import utils as gwutils -from gwcs.utils import sky_pairs, specsystems -from gwcs.wcs import WCS as gWCS - -AffineMatrices = namedtuple("AffineMatrices", "matrix offset") - -FrameMapping = namedtuple("FrameMapping", "cls description") - -# Type of CoordinateFrame to construct for a FITS keyword and -# readable name so user knows what's going on -frame_mapping = {'WAVE': FrameMapping(cf.SpectralFrame, "Wavelength in vacuo"), - 'AWAV': FrameMapping(cf.SpectralFrame, "Wavelength in air")} - -re_ctype = re.compile("^CTYPE(\\d+)$", re.IGNORECASE) -re_cd = re.compile("^CD(\\d+)_\\d+$", re.IGNORECASE) - -#----------------------------------------------------------------------------- -# FITS-WCS -> gWCS -#----------------------------------------------------------------------------- -def pixel_frame(naxes, name="pixels"): - """ - Make a CoordinateFrame for pixels - - Parameters - ---------- - naxes: int - Number of axes - - Returns - ------- - CoordinateFrame - """ - axes_names = ('x', 'y', 'z', 'u', 'v', 'w')[:naxes] - return cf.CoordinateFrame(naxes=naxes, axes_type=['SPATIAL'] * naxes, - axes_order=tuple(range(naxes)), name=name, - axes_names=axes_names, unit=[u.pix] * naxes) - - -def fitswcs_to_gwcs(input): - """ - Create and return a gWCS object from a FITS header or NDData object. - If it can't construct one, it should quietly return None. - """ - # coordinate names for CelestialFrame - coordinate_outputs = {'alpha_C', 'delta_C'} - - # transform = gw.make_fitswcs_transform(hdr) - try: - transform = make_fitswcs_transform(input) - except Exception as e: - return - outputs = transform.outputs - try: - wcs_info = read_wcs_from_header(input.meta['header']) - except AttributeError: - wcs_info = read_wcs_from_header(input) - - in_frame = pixel_frame(transform.n_inputs) - out_frames = [] - for i, output in enumerate(outputs): - unit_name = wcs_info["CUNIT"][i] - try: - unit = u.Unit(unit_name) - except TypeError: - unit = None - try: - frame_type = output[:4].upper() - frame_info = frame_mapping[frame_type] - except KeyError: - if output in coordinate_outputs: - continue - frame = cf.CoordinateFrame(naxes=1, axes_type=("SPATIAL",), - axes_order=(i,), unit=unit, - axes_names=(output,), name=output) - else: - frame = frame_info.cls(axes_order=(i,), unit=unit, - axes_names=(frame_type,), - name=frame_info.description) - - out_frames.append(frame) - - if coordinate_outputs.issubset(outputs): - frame_name = wcs_info["RADESYS"] # FK5, etc. - axes_names = None - try: - ref_frame = getattr(coord, frame_name)() - # TODO? Work out how to stuff EQUINOX and OBS-TIME into the frame - except (AttributeError, TypeError): - # TODO: Replace quick fix as gWCS doesn't recognize GAPPT - if frame_name == "GAPPT": - ref_frame = coord.FK5() - else: - ref_frame = None - axes_names = ('lon', 'lat') - axes_order = (outputs.index('alpha_C'), outputs.index('delta_C')) - - # Call it 'world' if there are no other axes, otherwise 'sky' - name = 'SKY' if len(outputs) > 2 else 'world' - cel_frame = cf.CelestialFrame(reference_frame=ref_frame, name=name, - axes_names=axes_names, axes_order=axes_order) - out_frames.append(cel_frame) - - out_frame = (out_frames[0] if len(out_frames) == 1 - else cf.CompositeFrame(out_frames, name='world')) - return gWCS([(in_frame, transform), - (out_frame, None)]) - - -# ----------------------------------------------------------------------------- -# gWCS -> FITS-WCS -# ----------------------------------------------------------------------------- - -def gwcs_to_fits(ndd, hdr=None): - """ - Convert a gWCS object to a collection of FITS WCS keyword/value pairs, - if possible. If the FITS WCS is only approximate, this should be indicated - with a dict entry {'FITS-WCS': 'APPROXIMATE'}. If there is no suitable - FITS representation, then a ValueError or NotImplementedError can be - raised. - - Parameters - ---------- - ndd : `astropy.nddata.NDData` - The NDData whose wcs attribute we want converted - hdr : `astropy.io.fits.Header` - A Header object that may contain some useful keywords - - Returns - ------- - dict - values to insert into the FITS header to express this WCS - - """ - if hdr is None: - hdr = {} - - wcs = ndd.wcs - # Don't need to "copy" because any changes to transform use - # replace_submodel, which creates a new instance - transform = wcs.forward_transform - world_axes = list(wcs.output_frame.axes_names) - nworld_axes = len(world_axes) - tabular_axes = dict() - wcs_dict = {'NAXIS': len(ndd.shape), # in case it's not written to a file - 'WCSAXES': nworld_axes, - 'WCSDIM': nworld_axes} - wcs_dict.update({f'NAXIS{i}': length - for i, length in enumerate(ndd.shape[::-1], start=1)}) - wcs_dict.update({f'CD{i+1}_{j+1}': 0. for j in range(nworld_axes) - for i in range(nworld_axes)}) - pix_center = [0.5 * (length - 1) for length in ndd.shape[::-1]] - wcs_center = transform(*pix_center) - if nworld_axes == 1: - wcs_center = (wcs_center,) - - # Find and process the sky projection first - if {'lon', 'lat'}.issubset(world_axes): - if isinstance(wcs.output_frame, cf.CelestialFrame): - cel_frame = wcs.output_frame - elif isinstance(wcs.output_frame, cf.CompositeFrame): - for frame in wcs.output_frame.frames: - if isinstance(frame, cf.CelestialFrame): - cel_frame = frame - - # TODO: Non-ecliptic coordinate frames - cel_ref_frame = cel_frame.reference_frame - if not isinstance(cel_ref_frame, coord.builtin_frames.BaseRADecFrame): - raise NotImplementedError("Cannot write non-ecliptic frames yet") - wcs_dict['RADESYS'] = cel_ref_frame.name.upper() - - for m in transform: - if isinstance(m, models.RotateNative2Celestial): - nat2cel = m - if isinstance(m, models.Pix2SkyProjection): - m.name = 'pix2sky' - # Determine which sort of projection this is - for projcode in projections.projcodes: - if isinstance(m, getattr(models, f'Pix2Sky_{projcode}')): - break - else: - raise ValueError("Unknown projection class: {}". - format(m.__class__.__name__)) - - lon_axis = world_axes.index('lon') - lat_axis = world_axes.index('lat') - world_axes[lon_axis] = f'RA---{projcode}' - world_axes[lat_axis] = f'DEC--{projcode}' - wcs_dict[f'CRVAL{lon_axis+1}'] = nat2cel.lon.value - wcs_dict[f'CRVAL{lat_axis+1}'] = nat2cel.lat.value - - # Remove projection parts so we can calculate the CD matrix - if projcode: - nat2cel.name = 'nat2cel' - transform_inverse = transform.inverse - for m in transform_inverse: - if isinstance(m, models.RotateCelestial2Native): - m.name = 'cel2nat' - elif isinstance(m, models.Sky2PixProjection): - m.name = 'sky2pix' - transform_inverse = transform_inverse.replace_submodel('sky2pix', models.Identity(2)) - transform_inverse = transform_inverse.replace_submodel('cel2nat', models.Identity(2)) - transform = transform.replace_submodel('pix2sky', models.Identity(2)) - transform = transform.replace_submodel('nat2cel', models.Identity(2)) - transform.inverse = transform_inverse - - # Replace a log-linear axis with a linear axis representing the log - # and a Tabular axis with Identity to ensure the affinity check is passed - compound = isinstance(transform, CompoundModel) - if not compound: # just so we can iterate - transform = transform | models.Identity(nworld_axes) - for i in reversed(range(transform.n_submodels)): - m_this = transform[i] - if isinstance(m_this, models.Exponential1D): - if m_this.name is None: - m_this.name = "UNIQUE_NAME" - m_new = (models.Scale(1. / m_this.tau) | - models.Shift(np.log(m_this.amplitude))) - transform = transform.replace_submodel(m_this.name, m_new) - elif isinstance(m_this, (models.Tabular1D, models.Tabular2D)): - ndim = m_this.lookup_table.ndim - points = m_this.points - if not (ndim == 1 and np.allclose(points, np.arange(points[0].size)) or - ndim == 2 and np.allclose(points[0], np.arange(points[0].size)) - and np.allclose(points[1], np.arange(points[1].size))): - print("Tabular has different 'points' than expected") - continue - if m_this.name is None: - m_this.name = "UNIQUE_NAME" - tabular_axes[m_this.name] = m_this.lookup_table - # We need the model to produce CDij keywords that indicate which - # axes it depends on - if ndim == 1: - m_map = models.Identity(1) - else: - m_map = models.Mapping((0,), n_inputs=2) + models.Mapping((1,)) - m_map.inverse = models.Mapping((0, 0)) - transform = transform.replace_submodel(m_this.name, m_map) - if not compound: - transform = transform[:-1] - - # Deal with other axes - # TODO: AD should refactor to allow the descriptor to be used here - for i, axis_type in enumerate(wcs.output_frame.axes_type, start=1): - if f'CRVAL{i}' in wcs_dict: - continue - if axis_type == "SPECTRAL": - try: - wave_tab = tabular_axes["WAVE"] - except KeyError: - wcs_dict[f'CRVAL{i}'] = hdr.get('CENTWAVE', wcs_center[i-1]) - wcs_dict[f'CTYPE{i}'] = wcs.output_frame.axes_names[i-1] # AWAV/WAVE - else: - wcs_dict[f'CRVAL{i}'] = 0 - wcs_dict[f'CTYPE{i}'] = wcs.output_frame.axes_names[i-1][:4] + "-TAB" - if wave_tab.ndim == 1: # Greisen et al. (2006) - wcs_dict[f'PS{i}_0'] = wcs.output_frame.axes_names[i-1] - wcs_dict[f'PS{i}_1'] = ("WAVELENGTH", "Name of column") - wcs_dict[f'PS{i}_1'] = ("WAVELENGTH", "Name of column") - wcs_dict['extensions'] = {wcs.output_frame.axes_names[i-1]: - Table([wave_tab], names=('WAVELENGTH',))} - else: # make something up here - wcs_dict[f'PS{i}_0'] = wcs.output_frame.axes_names[i-1] - wcs_dict['extensions'] = {wcs.output_frame.axes_names[i-1]: wave_tab.T} - else: # Just something - wcs_dict[f'CRVAL{i}'] = wcs_center[i-1] - - # Flag if we can't construct a perfect CD matrix - if not model_is_affine(transform): - wcs_dict['FITS-WCS'] = ('APPROXIMATE', 'FITS WCS is approximate') - - affine = calculate_affine_matrices(transform, ndd.shape) - # Convert to x-first order - affine_matrix = np.flip(affine.matrix) - # Require an inverse to write out - wcs_dict.update({f'CD{i+1}_{j+1}': affine_matrix[i, j] - for j, _ in enumerate(ndd.shape) - for i, _ in enumerate(world_axes)}) - # Don't overwrite CTYPEi keywords we've already created - wcs_dict.update({f'CTYPE{i}': axis.upper()[:8] - for i, axis in enumerate(world_axes, start=1) - if f'CTYPE{i}' not in wcs_dict}) - - crval = [wcs_dict[f'CRVAL{i+1}'] for i, _ in enumerate(world_axes)] - try: - crval[lon_axis] = 0 - crval[lat_axis] = 0 - except NameError: - pass - - # Find any world axes that we previous logarithmed and fix the CDij - # matrix -- we follow FITS-III (Greisen et al. 2006; A&A 446, 747) - modified_wcs_center = transform(*pix_center) - if nworld_axes == 1: - modified_wcs_center = (modified_wcs_center,) - for world_axis, (wcs_val, modified_wcs_val) in enumerate( - zip(wcs_center, modified_wcs_center), start=1): - if wcs_val > 0 and np.isclose(modified_wcs_val, np.log(wcs_val)): - for j, _ in enumerate(ndd.shape, start=1): - wcs_dict[f'CD{world_axis}_{j}'] *= crval[world_axis-1] - wcs_dict[f'CTYPE{world_axis}'] = wcs_dict[f'CTYPE{world_axis}'][:4] + "-LOG" - crval[world_axis-1] = np.log(crval[world_axis-1]) - - # This (commented) line fails for un-invertable Tabular2D - #crpix = np.array(wcs.backward_transform(*crval)) + 1 - crpix = np.array(transform.inverse(*crval)) + 1 - - # Cope with a situation where the sky projection center is not in the slit - # We may be able to fix this in future, but FITS doesn't handle it well. - if len(ndd.shape) > 1: - crval2 = wcs(*(crpix - 1)) - try: - sky_center = coord.SkyCoord(nat2cel.lon.value, nat2cel.lat.value, unit=u.deg) - except NameError: - pass - else: - sky_center2 = coord.SkyCoord(crval2[lon_axis], crval2[lat_axis], unit=u.deg) - if sky_center.separation(sky_center2).arcsec > 0.01: - wcs_dict['FITS-WCS'] = ('APPROXIMATE', 'FITS WCS is approximate') - - if len(ndd.shape) == 1: - wcs_dict['CRPIX1'] = crpix - else: - # Comply with FITS standard, must define CRPIXj for "extra" axes - wcs_dict.update({f'CRPIX{j}': cpix for j, cpix in enumerate(np.concatenate([crpix, [1] * (nworld_axes-len(ndd.shape))]), start=1)}) - for i, unit in enumerate(wcs.output_frame.unit, start=1): - try: - wcs_dict[f'CUNIT{i}'] = unit.name - except AttributeError: - pass - - # To ensure an invertable CD matrix, we need to get nonexistent pixel axes - # "involved". - for j in range(len(ndd.shape), nworld_axes): - wcs_dict[f'CD{nworld_axes}_{j+1}'] = 1 - - return wcs_dict - -# ----------------------------------------------------------------------------- -# Helper functions -# ----------------------------------------------------------------------------- - -def model_is_affine(model): - """" - Test a Model for affinity. This is currently done by checking the - name of its class (or the class names of all its submodels) - - TODO: Is this the right thing to do? We could compute the affine - matrices *assuming* affinity, and then check that a number of random - points behave as expected. Is that better? - """ - if isinstance(model, dict): # handle fix_inputs() - return True - try: - return np.logical_and.reduce([model_is_affine(m) - for m in model]) - except TypeError: - # TODO: Delete "Const" one fix_inputs() broadcastingis fixed - return model.__class__.__name__[:5] in ('Affin', 'Rotat', 'Scale', - 'Shift', 'Ident', 'Mappi', - 'Const') - - -def calculate_affine_matrices(func, shape, origin=None): - """ - Compute the matrix and offset necessary of an affine transform that - represents the supplied function. This is done by computing the - linear matrix along all axes extending from the centre of the region, - and then calculating the offset such that the transformation is - accurate at the centre of the region. The matrix and offset are returned - in the standard python order (i.e., y-first for 2D). - - Parameters - ---------- - func : callable - function that maps input->output coordinates; these coordinates - are x-first, because "func" is usually an astropy.modeling.Model - shape : sequence - shape to use for fiducial points - origin : sequence/None - if a sequence, then use this as the opposite vertex (it must be - the same length as "shape") - - Returns - ------- - AffineMatrices(array, array) - affine matrix and offset - - """ - indim = len(shape) - try: - ndim = len(func(*shape)) # handle increase in number of axes - except TypeError: - ndim = 1 - if origin is None: - halfsize = [0.5 * length for length in shape] - else: - halfsize = [0.5 * (len1 + len2) - for len1, len2 in zip(origin, shape)] + [1.] - - points = np.array([halfsize] * (2 * indim + 1)).T - points[:, 1:indim + 1] += np.eye(indim) * points[:, 0] - points[:, indim + 1:] -= np.eye(indim) * points[:, 0] - if ndim > 1: - transformed = np.array(list(zip(*list(func(*point[indim-1::-1]) - for point in points.T)))).T - else: - transformed = np.array([func(*points)]).T - # Matrix of wcs derivatives wrt input coordinates in python order - matrix = np.array([[0.5 * (transformed[j + 1, i] - transformed[indim + j + 1, i]) / halfsize[j] - for j in range(indim-1, -1, -1)] for i in range(ndim)]) - offset = transformed[0] - np.dot(matrix, halfsize[::-1]) - - return AffineMatrices(matrix[::-1, ::-1], offset[::-1]) - - -# ------------------------------------------------------------------------- -# This stuff will hopefully all go into gwcs.utils -# ------------------------------------------------------------------------- -def read_wcs_from_header(header): - """ - Extract basic FITS WCS keywords from a FITS Header. - - Parameters - ---------- - header : `astropy.io.fits.Header` - FITS Header with WCS information. - - Returns - ------- - wcs_info : dict - A dictionary with WCS keywords. - """ - wcs_info = {} - - # NAXIS=0 if we're reading from a PHU - naxis = header.get('NAXIS') or max(int(k[5:]) for k in header['CRPIX*'].keys()) - wcs_info['NAXIS'] = naxis - try: - wcsaxes = header['WCSAXES'] - except KeyError: - wcsaxes = 0 - for kw in header["CTYPE*"]: - if re_ctype.match(kw): - wcsaxes = max(wcsaxes, int(re_ctype.match(kw).group(1)), naxis) - for kw in header["CD*_*"]: - if re_cd.match(kw): - wcsaxes = max(wcsaxes, int(re_cd.match(kw).group(1)), naxis) - wcs_info['WCSAXES'] = wcsaxes - # if not present call get_csystem - wcs_info['RADESYS'] = header.get('RADESYS', header.get('RADECSYS', 'FK5')) - wcs_info['VAFACTOR'] = header.get('VAFACTOR', 1) - # date keyword? - # wcs_info['DATEOBS'] = header.get('DATE-OBS', 'DATEOBS') - wcs_info['EQUINOX'] = header.get("EQUINOX", None) - wcs_info['EPOCH'] = header.get("EPOCH", None) - wcs_info['DATEOBS'] = header.get("MJD-OBS", header.get("DATE-OBS", None)) - - ctype = [] - cunit = [] - crpix = [] - crval = [] - cdelt = [] - # Handle more than 1 undefined (i.e., not CTYPEi) axis - untyped_axes = 0 - for i in range(1, wcsaxes + 1): - try: - this_ctype = header[f'CTYPE{i}'] - except KeyError: - this_ctype = f"LINEAR{untyped_axes+1 if untyped_axes else ''}" - untyped_axes += 1 - ctype.append(this_ctype) - cunit.append(header.get(f'CUNIT{i}', None)) - crpix.append(header.get(f'CRPIX{i}', 0.0)) - crval.append(header.get(f'CRVAL{i}', 0.0)) - cdelt.append(header.get(f'CDELT{i}', 1.0)) - - has_cd = len(header['CD?_?']) > 0 - cd = np.zeros((wcsaxes, naxis)) - for i in range(1, wcsaxes + 1): - for j in range(1, naxis + 1): - if has_cd: - cd[i - 1, j - 1] = header.get('CD{0}_{1}'.format(i, j), 0) - else: - cd[i - 1, j - 1] = cdelt[i - 1] * header.get('PC{0}_{1}'.format(i, j), - 1 if i == j else 0) - - # Hack to deal with non-FITS-compliant data where one axis is ignored - unspecified_pixel_axes = [axis for axis, unused in - enumerate(np.all(cd == 0, axis=0)) if unused] - if unspecified_pixel_axes: - unused_world_axes = [axis for axis, unused in - enumerate(np.all(cd == 0, axis=1)) if unused] - unused_world_axes += [wcsaxes - 1] * len(unspecified_pixel_axes) - for pixel_axis, world_axis in zip(unspecified_pixel_axes, unused_world_axes): - cd[world_axis, pixel_axis] = 1.0 - - wcs_info['CTYPE'] = ctype - wcs_info['CUNIT'] = cunit - wcs_info['CRPIX'] = crpix - wcs_info['CRVAL'] = crval - wcs_info['CD'] = cd - wcs_info.update({k: v for k, v in header.items() if k.startswith('PS')}) - return wcs_info - - -def get_axes(header): - """ - Matches input with spectral and sky coordinate axes. - - Parameters - ---------- - header : `astropy.io.fits.Header` or dict - FITS Header (or dict) with basic WCS information. - - Returns - ------- - sky_inmap, spectral_inmap, unknown : list - indices in the output representing sky and spectral coordinates. - - """ - if isinstance(header, fits.Header): - wcs_info = read_wcs_from_header(header) - elif isinstance(header, dict): - wcs_info = header - else: - raise TypeError("Expected a FITS Header or a dict.") - - # Split each CTYPE value at "-" and take the first part. - # This should represent the coordinate system. - ctype = [ax.split('-')[0].upper() for ax in wcs_info['CTYPE']] - sky_inmap = [] - spec_inmap = [] - unknown = [] - skysystems = np.array(list(sky_pairs.values())).flatten() - for ind, ax in enumerate(ctype): - if ax in specsystems: - spec_inmap.append(ind) - elif ax in skysystems: - sky_inmap.append(ind) - else: - unknown.append(ind) - - if len(sky_inmap) == 1: - unknown.append(sky_inmap.pop()) - - if sky_inmap: - _is_skysys_consistent(ctype, sky_inmap) - - return sky_inmap, spec_inmap, unknown - - -def _is_skysys_consistent(ctype, sky_inmap): - """ Determine if the sky axes in CTYPE match to form a standard celestial system.""" - if len(sky_inmap) != 2: - raise ValueError("{} sky coordinate axes found. " - "There must be exactly 2".format(len(sky_inmap))) - - for item in sky_pairs.values(): - if ctype[sky_inmap[0]] == item[0]: - if ctype[sky_inmap[1]] != item[1]: - raise ValueError( - "Inconsistent ctype for sky coordinates {0} and {1}".format(*ctype)) - break - elif ctype[sky_inmap[1]] == item[0]: - if ctype[sky_inmap[0]] != item[1]: - raise ValueError( - "Inconsistent ctype for sky coordinates {0} and {1}".format(*ctype)) - sky_inmap.reverse() - break - - -def _get_contributing_axes(wcs_info, world_axes): - """ - Returns a tuple indicating which axes in the pixel frame make a - contribution to an axis or axes in the output frame. - - Parameters - ---------- - wcs_info : dict - dict of WCS information - world_axes : int or iterable of int - axes in the world coordinate system - - Returns - ------- - axes : list - axes whose pixel coordinates affect the output axis/axes - """ - cd = wcs_info['CD'] - try: - return sorted(set(np.nonzero(cd[tuple(world_axes), :wcs_info['NAXIS']])[1])) - except TypeError: # world_axes is an int - return sorted(np.nonzero(cd[world_axes, :wcs_info['NAXIS']])[0]) - #return sorted(set(j for j in range(wcs_info['NAXIS']) - # for i in world_axes if cd[i, j] != 0)) - - -def make_fitswcs_transform(input): - """ - Create a basic FITS WCS transform. - It does not include distortions. - - Parameters - ---------- - header : `astropy.io.fits.Header` or dict - FITS Header (or dict) with basic WCS information - - """ - other = None - if isinstance(input, fits.Header): - wcs_info = read_wcs_from_header(input) - elif isinstance(input, dict): - wcs_info = input - else: - try: - wcs_info = read_wcs_from_header(input.meta['header']) - except AttributeError: - raise TypeError("Expected a FITS Header, dict, or NDData object") - else: - other = input.meta['other'] - - # If a pixel axis maps directly to an output axis, we want to have that - # model completely self-contained, so don't put all the CRPIXj shifts - # in a single CompoundModel at the beginning - transforms = [] - - # The tricky stuff! - sky_model = fitswcs_image(wcs_info) - other_models = fitswcs_other(wcs_info, other=other) - all_models = other_models - if sky_model: - i = -1 - for i, m in enumerate(all_models): - m.meta['output_axes'] = [i] - all_models.append(sky_model) - sky_model.meta['output_axes'] = [i+1, i+2] - - # Now arrange the models so the inputs and outputs are in the right places - all_models.sort(key=lambda m: m.meta['output_axes'][0]) - input_axes = [ax for m in all_models for ax in m.meta['input_axes']] - output_axes = [ax for m in all_models for ax in m.meta['output_axes']] - - if input_axes != list(range(len(input_axes))): - input_mapping = models.Mapping([max(x, 0) for x in input_axes]) - transforms.append(input_mapping) - - transforms.append(functools.reduce(core._model_oper('&'), all_models)) - - if output_axes != list(range(len(output_axes))): - output_mapping = models.Mapping(output_axes) - transforms.append(output_mapping) - - return functools.reduce(core._model_oper('|'), transforms) - - -def fitswcs_image(header): - """ - Make a complete transform from CRPIX-shifted pixels to - sky coordinates from FITS WCS keywords. A Mapping is inserted - at the beginning, which may be removed later - - Parameters - ---------- - header : `astropy.io.fits.Header` or dict - FITS Header or dict with basic FITS WCS keywords. - - """ - if isinstance(header, fits.Header): - wcs_info = read_wcs_from_header(header) - elif isinstance(header, dict): - wcs_info = header - else: - raise TypeError("Expected a FITS Header or a dict.") - - crpix = wcs_info['CRPIX'] - cd = wcs_info['CD'] - # get the part of the PC matrix corresponding to the imaging axes - sky_axes, spec_axes, unknown = get_axes(wcs_info) - if not sky_axes: - return - #if len(unknown) == 2: - # sky_axes = unknown - #else: # No sky here - # return - pixel_axes = _get_contributing_axes(wcs_info, sky_axes) - if len(pixel_axes) > 2: - raise ValueError("More than 2 pixel axes contribute to the sky coordinates") - - translation_models = [models.Shift(-(crpix[i] - 1), name='crpix' + str(i + 1)) - for i in pixel_axes] - translation = functools.reduce(lambda x, y: x & y, translation_models) - transforms = [translation] - - # If only one axis is contributing to the sky (e.g., slit spectrum) - # then it must be that there's an extra axis in the CD matrix, so we - # create a "ghost" orthogonal axis here so an inverse can be defined - # Modify the CD matrix in case we have to use a backup Matrix Model later - if len(pixel_axes) == 1: - sky_cd = np.array([[cd[sky_axes[0], pixel_axes[0]], -cd[sky_axes[1], pixel_axes[0]]], - [cd[sky_axes[1], pixel_axes[0]], cd[sky_axes[0], pixel_axes[0]]]]) - #cd[sky_axes[0], -1] = -cd[sky_axes[1], pixel_axes[0]] - #cd[sky_axes[1], -1] = cd[sky_axes[0], pixel_axes[0]] - #sky_cd = cd[np.ix_(sky_axes, pixel_axes + [-1])] - affine = models.AffineTransformation2D(matrix=sky_cd, name='cd_matrix') - # TODO: replace when PR#10362 is in astropy - #rotation = models.fix_inputs(affine, {'y': 0}) - rotation = models.Mapping((0, 0)) | models.Identity(1) & models.Const1D(0) | affine - rotation.inverse = affine.inverse | models.Mapping((0,), n_inputs=2) - else: - sky_cd = cd[np.ix_(sky_axes, pixel_axes)] - rotation = models.AffineTransformation2D(matrix=sky_cd, name='cd_matrix') - - # Do it this way so the whole CD matrix + projection is separable - projection = gwutils.fitswcs_nonlinear(wcs_info) - if projection: - rotation |= projection - transforms.append(rotation) - - sky_model = functools.reduce(lambda x, y: x | y, transforms) - sky_model.name = 'SKY' - sky_model.meta.update({'input_axes': pixel_axes, - 'output_axes': sky_axes}) - return sky_model - - -def fitswcs_other(header, other=None): - """ - Create WCS linear transforms for any axes not associated with - celestial coordinates. We require that each world axis aligns - precisely with only a single pixel axis. - - Parameters - ---------- - header : `astropy.io.fits.Header` or dict - FITS Header or dict with basic FITS WCS keywords. - - """ - # We *always* want the wavelength solution model to be called "WAVE" - # even if the CTYPE keyword is "AWAV" - model_name_mapping = {"AWAV": "WAVE"} - - if isinstance(header, fits.Header): - wcs_info = read_wcs_from_header(header) - elif isinstance(header, dict): - wcs_info = header - else: - raise TypeError("Expected a FITS Header or a dict.") - - cd = wcs_info['CD'] - crpix = wcs_info['CRPIX'] - crval = wcs_info['CRVAL'] - # get the part of the CD matrix corresponding to the imaging axes - sky_axes, spec_axes, unknown = get_axes(wcs_info) - #if not sky_axes and len(unknown) == 2: - # unknown = [] - - other_models = [] - for ax in spec_axes + unknown: - pixel_axes = _get_contributing_axes(wcs_info, ax) - ctype = wcs_info['CTYPE'][ax].upper() - if ctype.endswith("-TAB"): - table = None - if other is not None: - table_name = header.get(f'PS{ax + 1}_0') - table = other.get(table_name) - if table is None: - raise ValueError(f"Cannot read table for {ctype} for axis {ax}") - if isinstance(table, Table): - other_model = models.Tabular1D(lookup_table=table[header[f'PS{ax + 1}_1']]) - else: - other_model = models.Tabular2D(lookup_table=table.T) - other_model.name = model_name_mapping.get(ctype[:4], ctype[:4]) - del other[table_name] - elif len(pixel_axes) == 1: - pixel_axis = pixel_axes[0] - m1 = models.Shift(1 - crpix[pixel_axis], - name='crpix' + str(pixel_axis + 1)) - if ctype.endswith("-LOG"): - other_model = (m1 | models.Exponential1D( - amplitude=crval[ax], tau=crval[ax] / cd[ax, pixel_axis])) - ctype = ctype[:4] - else: - other_model = (m1 | models.Scale(cd[ax, pixel_axis]) | - models.Shift(crval[ax])) - other_model.name = model_name_mapping.get(ctype, ctype) - elif len(pixel_axes) == 0: - pixel_axes = [-1] - other_model = models.Const1D(crval[ax]) - other_model.inverse = models.Identity(1) - else: - raise ValueError(f"Axis {ax} depends on more than one input axis") - other_model.outputs = (ctype,) - other_model.meta.update({'input_axes': pixel_axes, - 'output_axes': [ax]}) - other_models.append(other_model) - - return other_models - - -def remove_axis_from_frame(frame, axis): - """ - Remove the numbered axis from a CoordinateFrame and return a modified - CoordinateFrame instance. - - Parameters - ---------- - frame: CoordinateFrame - The frame from which an axis is to be removed - axis: int - index of the axis to be removed - - Returns - ------- - CoordinateFrame: the modified frame - """ - if axis is None: - return frame - - if not isinstance(frame, cf.CompositeFrame): - if frame.name == "pixels" or frame.unit == (u.pix,) * frame.naxes: - return pixel_frame(frame.naxes - 1, name=frame.name) - else: - raise TypeError("Frame must be a CompositeFrame or pixel frame") - - new_frames = [] - for f in frame.frames: - if f.axes_order == (axis,): - continue - elif axis in f.axes_order: - new_frames.append(remove_axis_from_frame(f, axis)) - else: - nf = deepcopy(f) - nf._axes_order = tuple(x if x 1: - return cf.CompositeFrame(new_frames, name=frame.name) - raise ValueError("No frames left!") - - -def remove_axis_from_model(model, axis): - """ - Take a model where one output (axis) is no longer required and try to - construct a new model whether that output is removed. If the number of - inputs is reduced as a result, then report which input (axis) needs to - be removed. - - Parameters - ---------- - model: astropy.modeling.Model instance - model to modify - axis: int - Output axis number to be removed from the model - - Returns - ------- - tuple: Modified version of the model and input axis that is no longer - needed (input axis == None if completely removed) - """ - def is_identity(model): - """Determine whether a model does nothing and so can be removed""" - return (isinstance(model, models.Identity) or - isinstance(model, models.Mapping) and - tuple(model.mapping) == tuple(range(model.n_inputs))) - - if axis is None: - return model, None - - if isinstance(model, CompoundModel): - op = model.op - if op == "|": - new_right_model, input_axis = remove_axis_from_model(model.right, axis) - new_left_model, input_axis = remove_axis_from_model(model.left, input_axis) - if is_identity(new_left_model): - return new_right_model, input_axis - elif is_identity(new_right_model): - return new_left_model, input_axis - return (new_left_model | new_right_model), input_axis - elif op == "&": - nl_inputs = model.left.n_inputs - nr_inputs = model.right.n_inputs - if nl_inputs == 1 and axis == 0: - return model.right, 0 - elif nr_inputs == 1 and axis == nl_inputs: - return model.left, axis - elif axis < nl_inputs: - new_left_model, input_axis = remove_axis_from_model(model.left, axis) - return (new_left_model & model.right), input_axis - else: - new_right_model, input_axis = remove_axis_from_model(model.right, axis-nl_inputs) - return (model.left & new_right_model), (None if input_axis is None else input_axis+nl_inputs) - elif op in ("+", "-", "*", "/", "**"): - new_left_model, input_axis = remove_axis_from_model(model.left, axis) - new_right_model, input_axis2 = remove_axis_from_model(model.right, axis) - if input_axis != input_axis2: - raise ValueError("Different mappings on either side of an " - "arithmetic operator") - return functools.reduce(core._model_oper(op), - [new_left_model, new_right_model]), input_axis - elif op == "fix_inputs": - new_left_model, input_axis = remove_axis_from_model(model.left, axis) - fixed_inputs = model.right.copy() - if input_axis in fixed_inputs: - fixed_inputs.pop(input_axis) - input_axis = None - if fixed_inputs: - if input_axis is not None: - fixed_inputs = {(ax if ax < input_axis else ax-1): value - for ax, value in fixed_inputs.items()} - return core.fix_inputs(new_left_model, fixed_inputs), input_axis - else: - return new_left_model, input_axis - else: - raise ValueError(f"Cannot process operator {op}") - elif isinstance(model, models.Identity): - return models.Identity(model.n_inputs-1), axis - elif isinstance(model, models.Mapping): - mapping = model.mapping - input_axis = mapping[axis] - new_mapping = mapping[:axis] + mapping[axis+1:] - if input_axis not in new_mapping: - new_mapping = [ax if ax < input_axis else ax-1 for ax in new_mapping] - else: - input_axis = None - if new_mapping == list(range(len(new_mapping))): - return models.Identity(len(new_mapping)), input_axis - else: - return models.Mapping(tuple(new_mapping)), input_axis - - raise ValueError(f"Cannot process {model.__class__.__name__}") - - -def remove_unused_world_axis(ext): - """ - Remove a single axis from the output frame of the WCS if it has no - dependence on input pixel location. - - Parameters - ---------- - ext: single-slice AstroData object - """ - ndim = len(ext.shape) - if ext.wcs is None: - raise ValueError("The input has no WCS") - affine = calculate_affine_matrices(ext.wcs.forward_transform, ext.shape) - # Check whether there's a single output that isn't affected by the input - removable_axes = np.all(affine.matrix == 0, axis=1)[::-1] # xyz order - if removable_axes.sum() == 1: - output_axis = removable_axes.argmax() - else: - raise ValueError("No single degenerate output axis to remove") - - axis = output_axis - new_pipeline = [] - for step in reversed(ext.wcs.pipeline): - frame, transform = step.frame, step.transform - if transform is not None: - if axis < transform.n_outputs: - transform, axis = remove_axis_from_model(transform, axis) - if axis is not None and axis < frame.naxes: - frame = remove_axis_from_frame(frame, axis) - new_pipeline = [(frame, transform)] + new_pipeline - - if axis not in (ndim, None): - raise ValueError("Removed output axis does not trace back to removed" - " input axis") - - ext.wcs = gWCS(new_pipeline) - - -def create_new_image_projection(transform, new_center): - """ - Modifies a simple imaging transform - (Shift & Shift) | AffineTransformation2D | Pix2Sky | RotateNative2Celestial - so that the projection center is in a different sky location - - This works by rotating the AffineTransformation2D.matrix by the change in - angle (in Euclidean geometry) to the pole when moving from the original - projection center to the new one. The sign of this angle depends on whether - East is to the left or right when North is up. This works even when the - pole is on the image. - - This is accurate to <0.1 arcsec for shifts of up to 1 degree - - Parameters - ---------- - transform: Model - current forward imaging transform - new_center: tuple - (RA, DEC) coordinates of new projection center - - Returns - ------- - Model: a transform that is projected around the new center - """ - assert isinstance(transform[-1], models.RotateNative2Celestial) - assert isinstance(transform[-3], models.AffineTransformation2D) - current_center = transform[-1].lon.value, transform[-1].lat.value - xc, yc = transform.inverse(*current_center) - xcnew, ycnew = transform.inverse(*new_center) - xpole, ypole = transform.inverse(0, 90) - # astropy >=5.2 returns NaNs for a point not in the same hemisphere as - # the projection centre, so use the Celestial South Pole if required - if np.isnan(xpole) or np.isnan(ypole): - xpole, ypole = transform.inverse(0, -90) - angle1 = np.arctan2(xpole - xc, ypole - yc) - angle2 = np.arctan2(xpole - xcnew, ypole - ycnew) - rotation = (angle1 - angle2) * 180 / np.pi - matrix = transform[-3].matrix - # flipped means East is to the right when North is up - flipped = (matrix[0, 0] * matrix[1, 1] > 0 or - matrix[0, 1] * matrix[1, 0] < 0) - new_transform = deepcopy(transform[-3:]) - new_transform[0].matrix = models.Rotation2D(-rotation if flipped else rotation)(*matrix) - new_transform[-1].lon, new_transform[-1].lat = new_center - shifts = models.Shift(-xcnew, name='crpix1') & models.Shift(-ycnew, name='crpix2') - new_transform = shifts | new_transform - return new_transform diff --git a/tox.ini b/tox.ini index 574a3cce51..5d2bbc6f0c 100644 --- a/tox.ini +++ b/tox.ini @@ -64,6 +64,7 @@ extras = deps = git+https://github.com/GeminiDRSoftware/FitsStorage.git@v3.4.0b2 git+https://github.com/GeminiDRSoftware/pytest_dragons.git@v1.0.5#egg=pytest_dragons + astrodata changedir = .tmp commands = @@ -75,17 +76,17 @@ commands = pip install --no-use-pep517 git+https://github.com/GeminiDRSoftware/AstroFaker#egg=AstroFaker conda list noop: python -c "pass" # just install deps & ensure python runs - unit: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "not integration_test and not gmos and not gmosls and not gmosimage and not f2 and not f2ls and not f2image and not gsaoi and not niri and not nirils and not niriimage and not gnirs and not gnirsls and not gnirsimage and not gnirsxd and not wavecal and not regression and not slow and not ghost and not ghostbundle and not ghostslit and not ghostspect" {posargs:astrodata geminidr gemini_instruments gempy recipe_system} - gmos: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "(gmos or gmosimage) and not slow and not wavecal" {posargs:astrodata geminidr gemini_instruments gempy recipe_system} - gmosls: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "gmosls and not slow and not wavecal" {posargs:astrodata geminidr gemini_instruments gempy recipe_system} - wavecal: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "wavecal" {posargs:astrodata geminidr gemini_instruments gempy recipe_system} - f2: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "(f2 or f2ls or f2image) and not slow and not wavecal" {posargs:astrodata geminidr gemini_instruments gempy recipe_system} - gsaoi: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "gsaoi and not slow" {posargs:astrodata geminidr gemini_instruments gempy recipe_system} - niri: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "(niri or nirils or niriimage) and not slow and not wavecal" {posargs:astrodata geminidr gemini_instruments gempy recipe_system} - gnirs: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "(gnirs or gnirsls or gnirsimage or gnirsxd) and not slow and not wavecal" {posargs:astrodata geminidr gemini_instruments gempy recipe_system} - ghost: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "(ghost or ghostbundle or ghostslit or ghostspect) and not slow" {posargs:astrodata geminidr gemini_instruments gempy recipe_system} - reg: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "regression and not slow and not wavecal" {posargs:astrodata geminidr gemini_instruments gempy recipe_system} - slow: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "slow and not wavecal" {posargs:astrodata geminidr gemini_instruments gempy recipe_system} + unit: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "not integration_test and not gmos and not gmosls and not gmosimage and not f2 and not f2ls and not f2image and not gsaoi and not niri and not nirils and not niriimage and not gnirs and not gnirsls and not gnirsimage and not gnirsxd and not wavecal and not regression and not slow and not ghost and not ghostbundle and not ghostslit and not ghostspect" {posargs:geminidr gemini_instruments gempy recipe_system} + gmos: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "(gmos or gmosimage) and not slow and not wavecal" {posargs:geminidr gemini_instruments gempy recipe_system} + gmosls: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "gmosls and not slow and not wavecal" {posargs:geminidr gemini_instruments gempy recipe_system} + wavecal: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "wavecal" {posargs:geminidr gemini_instruments gempy recipe_system} + f2: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "(f2 or f2ls or f2image) and not slow and not wavecal" {posargs:geminidr gemini_instruments gempy recipe_system} + gsaoi: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "gsaoi and not slow" {posargs:geminidr gemini_instruments gempy recipe_system} + niri: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "(niri or nirils or niriimage) and not slow and not wavecal" {posargs:geminidr gemini_instruments gempy recipe_system} + gnirs: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "(gnirs or gnirsls or gnirsimage or gnirsxd) and not slow and not wavecal" {posargs:geminidr gemini_instruments gempy recipe_system} + ghost: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "(ghost or ghostbundle or ghostslit or ghostspect) and not slow" {posargs:geminidr gemini_instruments gempy recipe_system} + reg: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "regression and not slow and not wavecal" {posargs:geminidr gemini_instruments gempy recipe_system} + slow: python -m coverage run --rcfile={toxinidir}/.coveragerc -m pytest -v --dragons-remote-data --durations=20 -m "slow and not wavecal" {posargs:geminidr gemini_instruments gempy recipe_system} docs: sphinx-build {posargs} . _build/html [testenv:covreport] @@ -114,9 +115,9 @@ whitelist_externals = commands = mkdir -p reports bash -c \'pylint --exit-zero --rcfile=gempy/support_files/pylintrc \ - astrodata gemini_instruments gempy geminidr recipe_system \ + gemini_instruments gempy geminidr recipe_system \ > reports/pylint.log\' bash -c \'pydocstyle --add-ignore D400,D401,D205,D105,D105 \ --match="(?!test_|conf).*\.py" \ - astrodata gemini_instruments gempy geminidr recipe_system \ + gemini_instruments gempy geminidr recipe_system \ > reports/pydocstyle.log || exit 0\' From ad1c0681d987d187e9454be12f77caaa2ee260b6 Mon Sep 17 00:00:00 2001 From: teald Date: Mon, 16 Dec 2024 13:12:34 -0800 Subject: [PATCH 02/11] chore(jenkins): Remove astrodata references --- Jenkinsfile | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index aceac7b30c..c744fafc9f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -92,7 +92,7 @@ pipeline { environment { MPLBACKEND = "agg" DRAGONS_TEST_OUT = "unit_tests_outputs/" - TOX_ARGS = "astrodata geminidr gemini_instruments gempy recipe_system" + TOX_ARGS = "geminidr gemini_instruments gempy recipe_system" TMPDIR = "${env.WORKSPACE}/.tmp/unit/" } steps { @@ -134,7 +134,7 @@ pipeline { environment { MPLBACKEND = "agg" DRAGONS_TEST_OUT = "regression_tests_outputs" - TOX_ARGS = "astrodata geminidr gemini_instruments gempy recipe_system" + TOX_ARGS = "geminidr gemini_instruments gempy recipe_system" TMPDIR = "${env.WORKSPACE}/.tmp/regr/" } steps { @@ -176,7 +176,7 @@ pipeline { environment { MPLBACKEND = "agg" DRAGONS_TEST_OUT = "f2_tests_outputs" - TOX_ARGS = "astrodata geminidr gemini_instruments gempy recipe_system" + TOX_ARGS = "geminidr gemini_instruments gempy recipe_system" TMPDIR = "${env.WORKSPACE}/.tmp/f2/" } steps { @@ -213,7 +213,7 @@ pipeline { environment { MPLBACKEND = "agg" DRAGONS_TEST_OUT = "gsaoi_tests_outputs" - TOX_ARGS = "astrodata geminidr gemini_instruments gempy recipe_system" + TOX_ARGS = "geminidr gemini_instruments gempy recipe_system" TMPDIR = "${env.WORKSPACE}/.tmp/gsaoi/" } steps { @@ -250,7 +250,7 @@ pipeline { environment { MPLBACKEND = "agg" DRAGONS_TEST_OUT = "niri_tests_outputs" - TOX_ARGS = "astrodata geminidr gemini_instruments gempy recipe_system" + TOX_ARGS = "geminidr gemini_instruments gempy recipe_system" TMPDIR = "${env.WORKSPACE}/.tmp/niri/" } steps { @@ -287,7 +287,7 @@ pipeline { environment { MPLBACKEND = "agg" DRAGONS_TEST_OUT = "gnirs_tests_outputs" - TOX_ARGS = "astrodata geminidr gemini_instruments gempy recipe_system" + TOX_ARGS = "geminidr gemini_instruments gempy recipe_system" TMPDIR = "${env.WORKSPACE}/.tmp/gnirs/" } steps { @@ -324,7 +324,7 @@ pipeline { environment { MPLBACKEND = "agg" DRAGONS_TEST_OUT = "gmos_tests_outputs" - TOX_ARGS = "astrodata geminidr gemini_instruments gempy recipe_system" + TOX_ARGS = "geminidr gemini_instruments gempy recipe_system" TMPDIR = "${env.WORKSPACE}/.tmp/gmos/" } steps { @@ -364,7 +364,7 @@ pipeline { environment { MPLBACKEND = "agg" DRAGONS_TEST_OUT = "wavecal_tests_outputs" - TOX_ARGS = "astrodata geminidr gemini_instruments gempy recipe_system" + TOX_ARGS = "geminidr gemini_instruments gempy recipe_system" TMPDIR = "${env.WORKSPACE}/.tmp/wavecal/" } steps { @@ -404,7 +404,7 @@ pipeline { environment { MPLBACKEND = "agg" DRAGONS_TEST_OUT = "gmosls_tests_outputs" - TOX_ARGS = "astrodata geminidr gemini_instruments gempy recipe_system" + TOX_ARGS = "geminidr gemini_instruments gempy recipe_system" TMPDIR = "${env.WORKSPACE}/.tmp/gmosls/" } steps { @@ -442,7 +442,7 @@ pipeline { environment { MPLBACKEND = "agg" DRAGONS_TEST_OUT = "slow_tests_outputs" - TOX_ARGS = "astrodata geminidr gemini_instruments gempy recipe_system" + TOX_ARGS = "geminidr gemini_instruments gempy recipe_system" TMPDIR = "${env.WORKSPACE}/.tmp/slow/" } steps { @@ -480,7 +480,7 @@ pipeline { environment { MPLBACKEND = "agg" DRAGONS_TEST_OUT = "ghost_tests_outputs" - TOX_ARGS = "astrodata geminidr gemini_instruments gempy recipe_system" + TOX_ARGS = "geminidr gemini_instruments gempy recipe_system" TMPDIR = "${env.WORKSPACE}/.tmp/ghost/" } steps { From 383f6936ab83ff4e2293a0787f22b7792f8e5643 Mon Sep 17 00:00:00 2001 From: teald Date: Mon, 16 Dec 2024 13:13:17 -0800 Subject: [PATCH 03/11] chore(coverage): Remove astrodata source --- .coveragerc | 1 - 1 file changed, 1 deletion(-) diff --git a/.coveragerc b/.coveragerc index 56f1ae3b34..55ea46ef23 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,6 +1,5 @@ [run] source = - astrodata geminidr gemini_instruments gempy From 730e17bf079f7a73c37e4c4dae3dee659bcc3884 Mon Sep 17 00:00:00 2001 From: teald Date: Mon, 16 Dec 2024 13:15:59 -0800 Subject: [PATCH 04/11] build(setup): Remove astrodata references from setup files --- setup.cfg | 2 +- setup.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index f0df935b25..7009df2fc7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -42,7 +42,7 @@ convention=numpy [tool.isort] default_section = THIRDPARTY -known_first_party = astrodata,geminidr,gemini_instruments,gempy,recipe_system +known_first_party = geminidr,gemini_instruments,gempy,recipe_system multi_line_output = 0 balanced_wrapping = true include_trailing_comma = false diff --git a/setup.py b/setup.py index 864faf860a..f3b06583d7 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,6 @@ Setup script for gemini_python In this package: - astrodata gemini_instruments geminidr gempy From 2e098d2bfcad62d62eca3956ba596b8eb74ea303 Mon Sep 17 00:00:00 2001 From: teald Date: Mon, 16 Dec 2024 13:21:43 -0800 Subject: [PATCH 05/11] build(setup): Add astrodata to dependency list. --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index f3b06583d7..79517bc44f 100644 --- a/setup.py +++ b/setup.py @@ -79,6 +79,7 @@ 'Topic :: Scientific/Engineering :: Astronomy', ], install_requires=[ + 'astrodata', 'asdf>=2.7,!=2.10.0', 'astropy>=4.3,!=5.3.0,!=6.1.5,!=6.1.6', 'astroquery>=0.4', From b419fd5e4361444b67b05ab22a5a4539c1d4003d Mon Sep 17 00:00:00 2001 From: teald Date: Tue, 17 Dec 2024 17:07:04 -0800 Subject: [PATCH 06/11] test(tox): Use development release of astrodata for tests --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 5d2bbc6f0c..6a58029702 100644 --- a/tox.ini +++ b/tox.ini @@ -64,7 +64,7 @@ extras = deps = git+https://github.com/GeminiDRSoftware/FitsStorage.git@v3.4.0b2 git+https://github.com/GeminiDRSoftware/pytest_dragons.git@v1.0.5#egg=pytest_dragons - astrodata + astrodata==2.10.1.dev0 changedir = .tmp commands = From 12410f3933b403729ab1a3a90c3aecaa590e6013 Mon Sep 17 00:00:00 2001 From: teald Date: Wed, 18 Dec 2024 15:01:01 -0800 Subject: [PATCH 07/11] test(tox): Use latest development astrodata version. --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 6a58029702..f96e6419b3 100644 --- a/tox.ini +++ b/tox.ini @@ -64,7 +64,7 @@ extras = deps = git+https://github.com/GeminiDRSoftware/FitsStorage.git@v3.4.0b2 git+https://github.com/GeminiDRSoftware/pytest_dragons.git@v1.0.5#egg=pytest_dragons - astrodata==2.10.1.dev0 + astrodata==2.10.1.dev1 changedir = .tmp commands = From ce016c90b4525f758c962c307fce757ffd74e80d Mon Sep 17 00:00:00 2001 From: teald Date: Thu, 26 Dec 2024 14:18:17 -0800 Subject: [PATCH 08/11] test(tox): Use latest development astrodata (2.10.1.dev2) --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index f96e6419b3..01d3192d48 100644 --- a/tox.ini +++ b/tox.ini @@ -64,7 +64,7 @@ extras = deps = git+https://github.com/GeminiDRSoftware/FitsStorage.git@v3.4.0b2 git+https://github.com/GeminiDRSoftware/pytest_dragons.git@v1.0.5#egg=pytest_dragons - astrodata==2.10.1.dev1 + astrodata==2.10.1.dev2 changedir = .tmp commands = From a336ac8b5d608351ba82ea27930ab0c3d299f0bf Mon Sep 17 00:00:00 2001 From: teald Date: Wed, 5 Mar 2025 09:55:53 -0800 Subject: [PATCH 09/11] fix(astrodata): Remove astrodata references, use repo --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 01d3192d48..428412a6e5 100644 --- a/tox.ini +++ b/tox.ini @@ -64,7 +64,7 @@ extras = deps = git+https://github.com/GeminiDRSoftware/FitsStorage.git@v3.4.0b2 git+https://github.com/GeminiDRSoftware/pytest_dragons.git@v1.0.5#egg=pytest_dragons - astrodata==2.10.1.dev2 + git+https://github.com/GeminiDRSoftware/astrodata.git changedir = .tmp commands = From 0bc482cad1ebd44915dbc0be6258cedd9cc92a9a Mon Sep 17 00:00:00 2001 From: teald Date: Wed, 2 Apr 2025 11:43:20 -0700 Subject: [PATCH 10/11] fix(astrodata): Update deprecated calls windowedOp -> windowed_operation asIRAFsection -> as_iraf_section addClass -> add_class astrodata.open -> astrodata.from_file --- gemini_instruments/bhros/__init__.py | 2 +- gemini_instruments/cirpass/__init__.py | 2 +- gemini_instruments/f2/__init__.py | 2 +- gemini_instruments/f2/tests/test_f2.py | 2 +- gemini_instruments/flamingos/__init__.py | 2 +- gemini_instruments/gemini/__init__.py | 2 +- gemini_instruments/gemini/adclass.py | 2 +- .../gemini/tests/test_descriptors.py | 2 +- gemini_instruments/ghost/__init__.py | 2 +- gemini_instruments/ghost/tests/test_ghost.py | 18 +++--- gemini_instruments/gmos/__init__.py | 2 +- gemini_instruments/gmos/tests/test_gmos.py | 4 +- gemini_instruments/gnirs/__init__.py | 2 +- gemini_instruments/gnirs/tests/test_gnirs.py | 6 +- gemini_instruments/gpi/__init__.py | 2 +- gemini_instruments/graces/__init__.py | 2 +- .../graces/tests/test_graces.py | 2 +- gemini_instruments/gsaoi/__init__.py | 2 +- gemini_instruments/hokupaa_quirc/__init__.py | 2 +- gemini_instruments/hrwfs/__init__.py | 2 +- gemini_instruments/igrins/__init__.py | 2 +- gemini_instruments/michelle/__init__.py | 2 +- gemini_instruments/nici/__init__.py | 2 +- gemini_instruments/nifs/__init__.py | 2 +- gemini_instruments/nifs/tests/test_nifs.py | 2 +- gemini_instruments/niri/__init__.py | 2 +- gemini_instruments/niri/tests/test_niri.py | 2 +- gemini_instruments/oscir/__init__.py | 2 +- gemini_instruments/phoenix/__init__.py | 2 +- gemini_instruments/skycam/__init__.py | 2 +- .../test/test_astrodata_descriptors.py | 4 +- .../test/test_astrodata_tags.py | 4 +- gemini_instruments/texes/__init__.py | 2 +- gemini_instruments/trecs/__init__.py | 2 +- geminidr/core/primitives_bookkeeping.py | 4 +- geminidr/core/primitives_crossdispersed.py | 4 +- geminidr/core/primitives_image.py | 4 +- geminidr/core/primitives_preprocess.py | 4 +- geminidr/core/primitives_stack.py | 4 +- geminidr/core/tests/test_bookkeeping.py | 4 +- geminidr/core/tests/test_ccd.py | 2 +- geminidr/core/tests/test_image.py | 6 +- geminidr/core/tests/test_nearIR.py | 8 +-- geminidr/core/tests/test_preprocess.py | 22 ++++---- geminidr/core/tests/test_spect.py | 28 +++++----- geminidr/core/tests/test_standardize.py | 20 +++---- geminidr/core/tests/test_telluric.py | 6 +- geminidr/core/tests/test_visualize.py | 4 +- .../tests/test_wcs_creation_and_stability.py | 4 +- .../savefig/display_flamingos2_stack.py | 2 +- .../savefig/display_gmos_single.py | 2 +- .../savefig/display_gmos_stack.py | 2 +- .../scripts/show_discostu_output.py | 2 +- .../scripts/show_flat_corrected_image.py | 2 +- .../longslit/test_determine_distortion.py | 6 +- .../test_determine_wavelength_solution.py | 8 +-- .../f2/tests/longslit/test_f2_longslit.py | 2 +- .../f2/tests/longslit/test_flat_correct.py | 2 +- .../f2/tests/longslit/test_sky_stacking.py | 4 +- .../f2/tests/spect/test_trace_apertures.py | 2 +- .../f2/tests/test_determine_slit_edges.py | 2 +- geminidr/f2/tests/test_select_from_inputs.py | 2 +- geminidr/gemini/tests/test_gemini.py | 4 +- geminidr/gemini/tests/test_qa.py | 12 ++-- geminidr/ghost/polyfit/test/test_extract.py | 4 +- geminidr/ghost/polyfit/test/test_slitview.py | 6 +- geminidr/ghost/primitives_ghost_slit.py | 2 +- geminidr/ghost/primitives_ghost_spect.py | 56 +++++++++---------- .../ghost/recipes/sq/tests/test_reduce_arc.py | 6 +- .../recipes/sq/tests/test_reduce_bias.py | 6 +- .../recipes/sq/tests/test_reduce_flat.py | 6 +- .../ghost/recipes/sq/tests/test_reduce_sci.py | 10 ++-- .../recipes/sq/tests/test_reduce_slit.py | 24 ++++---- .../ghost/tests/bundle/test_split_bundle.py | 4 +- geminidr/ghost/tests/slit/__init__.py | 2 +- .../ghost/tests/spect/test_combine_orders.py | 10 ++-- .../ghost/tests/spect/test_extract_spectra.py | 2 +- .../ghost/tests/spect/test_flux_calibrate.py | 4 +- geminidr/ghost/utils/mkspatmod.py | 12 ++-- geminidr/gmos/lookups/bpmtab.py | 2 +- geminidr/gmos/primitives_gmos.py | 2 +- .../gmos/recipes/qa/tests/test_flat_image.py | 4 +- .../recipes/ql/tests/test_flat_ls_spect.py | 6 +- .../tests/test_make_processed_slit_illum.py | 4 +- .../sq/tests/test_separate_ccd_reduction.py | 2 +- .../gmos/tests/image/test_add_oiwfs_to_dq.py | 8 +-- .../tests/longslit/test_add_illum_mask.py | 4 +- .../gmos/tests/longslit/test_flat_correct.py | 2 +- .../tests/longslit/test_make_slit_illum.py | 8 +-- .../tests/longslit/test_slit_illum_correct.py | 10 ++-- .../test_wavelength_propagation_stability.py | 6 +- .../test_combine_nod_and_shuffle_beams.py | 2 +- .../test_dark_nod_and_shuffle.py | 2 +- .../tests/plots_gmos_spect_longslit_arcs.py | 4 +- .../spect/test_adjust_wcs_to_reference.py | 2 +- .../spect/test_attach_wavelength_solution.py | 8 +-- .../tests/spect/test_calculate_sensitivity.py | 4 +- geminidr/gmos/tests/spect/test_cosmics.py | 6 +- .../tests/spect/test_determine_distortion.py | 4 +- .../test_determine_wavelength_solution.py | 6 +- .../tests/spect/test_distortion_correct.py | 6 +- ...ortion_correct_with_wavelength_solution.py | 6 +- .../tests/spect/test_extract_1d_spectra.py | 4 +- .../tests/spect/test_find_source_apertures.py | 6 +- .../gmos/tests/spect/test_flux_calibration.py | 4 +- geminidr/gmos/tests/spect/test_qe_correct.py | 6 +- geminidr/gmos/tests/spect/test_resample.py | 4 +- geminidr/gmos/tests/spect/test_resample_2d.py | 12 ++-- .../tests/spect/test_sky_correct_from_slit.py | 6 +- .../gmos/tests/spect/test_trace_apertures.py | 4 +- .../gmos/tests/spect/test_write_1d_spectra.py | 2 +- .../tests/test_gmos_spect_longslit_arcs.py | 12 ++-- .../gnirs/recipes/sq/tests/test_ls_spect.py | 8 +-- .../gnirs/recipes/sq/tests/test_xd_spect.py | 8 +-- .../tests/crossdispersed/test_cut_slits.py | 2 +- .../test_determine_distortion.py | 2 +- .../crossdispersed/test_distortion_correct.py | 2 +- .../tests/crossdispersed/test_flat_correct.py | 2 +- .../tests/crossdispersed/test_resample_2d.py | 2 +- .../test_straight_slit_edges.py | 4 +- .../test_trace_pinhole_apertures.py | 2 +- .../crossdispersed/test_transfer_attribute.py | 2 +- .../gnirs/tests/image/test_add_illum_mask.py | 4 +- .../longslit/test_adjust_wcs_to_reference.py | 2 +- .../longslit/test_determine_distortion.py | 6 +- .../test_determine_wavelength_solution.py | 12 ++-- .../tests/longslit/test_distortion_correct.py | 4 +- .../gnirs/tests/longslit/test_flat_correct.py | 2 +- .../tests/longslit/test_gnirs_longslit.py | 2 +- geminidr/gnirs/tests/longslit/test_prepare.py | 4 +- .../gnirs/tests/longslit/test_resample_2d.py | 8 +-- .../longslit/test_sky_correct_from_slit.py | 2 +- .../gnirs/tests/longslit/test_sky_stacking.py | 4 +- .../gnirs/tests/test_determine_slit_edges.py | 2 +- geminidr/gsaoi/tests/test_gsaoi_image.py | 6 +- .../longslit/test_determine_distortion.py | 6 +- .../test_determine_wavelength_solution.py | 10 ++-- .../niri/tests/longslit/test_flat_correct.py | 2 +- .../niri/tests/longslit/test_niri_longslit.py | 2 +- .../niri/tests/longslit/test_sky_stacking.py | 8 +-- .../niri/tests/test_determine_slit_edges.py | 2 +- .../niri/tests/test_nonlinearity_correct.py | 4 +- geminidr/tests/test_geminidr.py | 2 +- gempy/adlibrary/dataselect.py | 2 +- gempy/gemini/eti/gemcombinefile.py | 2 +- gempy/gemini/eti/gmosaicfile.py | 2 +- gempy/gemini/eti/tests/test_gemcombine.py | 2 +- gempy/gemini/eti/tests/test_gmosaic.py | 2 +- gempy/gemini/gemini_tools.py | 8 +-- gempy/gemini/tests/test_gemini_tools.py | 8 +-- gempy/scripts/fwhm_histogram.py | 2 +- gempy/scripts/profile_all_obj.py | 2 +- gempy/scripts/psf_plot.py | 2 +- gempy/scripts/showpars.py | 2 +- gempy/scripts/typewalk.py | 2 +- gempy/scripts/zp_histogram.py | 2 +- gempy/utils/showrecipes.py | 4 +- gempy/utils/tests/test_decorators.py | 2 +- recipe_system/cal_service/tests/test_caldb.py | 2 +- .../cal_service/tests/test_calrequestlib.py | 2 +- recipe_system/mappers/primitiveMapper.py | 2 +- recipe_system/mappers/recipeMapper.py | 2 +- recipe_system/reduction/coreReduce.py | 4 +- recipe_system/scripts/provenance.py | 2 +- recipe_system/testing.py | 8 +-- recipe_system/utils/reduce_utils.py | 2 +- recipe_system/utils/tests/test_decorator.py | 2 +- tox.ini | 1 + 168 files changed, 397 insertions(+), 396 deletions(-) diff --git a/gemini_instruments/bhros/__init__.py b/gemini_instruments/bhros/__init__.py index 7cf58aa60f..2591f01db1 100644 --- a/gemini_instruments/bhros/__init__.py +++ b/gemini_instruments/bhros/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataBhros -factory.addClass(AstroDataBhros) +factory.add_class(AstroDataBhros) diff --git a/gemini_instruments/cirpass/__init__.py b/gemini_instruments/cirpass/__init__.py index bb49382ed5..558c221689 100644 --- a/gemini_instruments/cirpass/__init__.py +++ b/gemini_instruments/cirpass/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataCirpass -factory.addClass(AstroDataCirpass) +factory.add_class(AstroDataCirpass) diff --git a/gemini_instruments/f2/__init__.py b/gemini_instruments/f2/__init__.py index 6e1ad5b906..b752fbb7db 100644 --- a/gemini_instruments/f2/__init__.py +++ b/gemini_instruments/f2/__init__.py @@ -5,5 +5,5 @@ from .adclass import AstroDataF2 from .lookup import filter_wavelengths -factory.addClass(AstroDataF2) +factory.add_class(AstroDataF2) addInstrumentFilterWavelengths('F2', filter_wavelengths) diff --git a/gemini_instruments/f2/tests/test_f2.py b/gemini_instruments/f2/tests/test_f2.py index 62f2b3fc0c..bd87788a92 100644 --- a/gemini_instruments/f2/tests/test_f2.py +++ b/gemini_instruments/f2/tests/test_f2.py @@ -31,7 +31,7 @@ def ad(request): filename = request.param file_path = astrodata.testing.download_from_archive(filename) - return astrodata.open(file_path) + return astrodata.from_file(file_path) @pytest.mark.dragons_remote_data diff --git a/gemini_instruments/flamingos/__init__.py b/gemini_instruments/flamingos/__init__.py index 9487c05a35..10ed3942c3 100644 --- a/gemini_instruments/flamingos/__init__.py +++ b/gemini_instruments/flamingos/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataFlamingos -factory.addClass(AstroDataFlamingos) +factory.add_class(AstroDataFlamingos) diff --git a/gemini_instruments/gemini/__init__.py b/gemini_instruments/gemini/__init__.py index 178bf79872..209d0a5afc 100644 --- a/gemini_instruments/gemini/__init__.py +++ b/gemini_instruments/gemini/__init__.py @@ -13,4 +13,4 @@ def addInstrumentFilterWavelengths(instrument, wl): } filter_wavelengths.update(update_dict) -factory.addClass(AstroDataGemini) +factory.add_class(AstroDataGemini) diff --git a/gemini_instruments/gemini/adclass.py b/gemini_instruments/gemini/adclass.py index 712480873b..8710b130a4 100644 --- a/gemini_instruments/gemini/adclass.py +++ b/gemini_instruments/gemini/adclass.py @@ -398,7 +398,7 @@ def _dec(self): def _parse_section(self, keyword, pretty): try: - value_filter = lambda x: (x.asIRAFsection() if pretty else x) + value_filter = lambda x: (x.as_iraf_section() if pretty else x) process_fn = lambda x: (None if x is None else value_filter(x)) # Dummy keyword FULLFRAME returns shape of full data array if keyword == 'FULLFRAME': diff --git a/gemini_instruments/gemini/tests/test_descriptors.py b/gemini_instruments/gemini/tests/test_descriptors.py index c7a96d0cba..8cff221246 100644 --- a/gemini_instruments/gemini/tests/test_descriptors.py +++ b/gemini_instruments/gemini/tests/test_descriptors.py @@ -116,7 +116,7 @@ def ad(request): filename = request.param path = astrodata.testing.download_from_archive(filename) - return astrodata.open(path) + return astrodata.from_file(path) @pytest.mark.dragons_remote_data diff --git a/gemini_instruments/ghost/__init__.py b/gemini_instruments/ghost/__init__.py index dc3e0abb7f..dc94e208e9 100644 --- a/gemini_instruments/ghost/__init__.py +++ b/gemini_instruments/ghost/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataGhost -factory.addClass(AstroDataGhost) +factory.add_class(AstroDataGhost) diff --git a/gemini_instruments/ghost/tests/test_ghost.py b/gemini_instruments/ghost/tests/test_ghost.py index 6272f5bd39..374aeb3fda 100644 --- a/gemini_instruments/ghost/tests/test_ghost.py +++ b/gemini_instruments/ghost/tests/test_ghost.py @@ -24,7 +24,7 @@ def ad(request): filename = request.param path = astrodata.testing.download_from_archive(filename) - return astrodata.open(path) + return astrodata.from_file(path) @pytest.mark.dragons_remote_data @@ -40,7 +40,7 @@ def test_can_return_ad_length(ad): @pytest.mark.dragons_remote_data def test_instrument(): path = astrodata.testing.download_from_archive("S20221209S0007.fits") - ad = astrodata.open(path) + ad = astrodata.from_file(path) assert ad.phu['INSTRUME'] == 'GHOST' assert ad.instrument() == 'GHOST' @@ -48,7 +48,7 @@ def test_instrument(): @pytest.mark.dragons_remote_data def test_various_tags(): path = astrodata.testing.download_from_archive("S20221209S0007.fits") - ad = astrodata.open(path) + ad = astrodata.from_file(path) # assert 'STD' in ad.tags #STD is no longer a tag assert 'GHOST' in ad.tags assert 'BUNDLE' in ad.tags @@ -57,7 +57,7 @@ def test_various_tags(): @pytest.mark.dragons_remote_data def test_detector_x_bin(): path = astrodata.testing.download_from_archive("S20221209S0007.fits") - ad = astrodata.open(path) + ad = astrodata.from_file(path) xbin = ad.detector_x_bin() # should be a dict, since we are a bundle assert(isinstance(xbin, dict)) @@ -66,7 +66,7 @@ def test_detector_x_bin(): @pytest.mark.dragons_remote_data def test_ut_datetime(): path = astrodata.testing.download_from_archive("S20221209S0007.fits") - ad = astrodata.open(path) + ad = astrodata.from_file(path) udt = ad.ut_datetime() # Check against expected UT Datetime, this descriptor also exercises the nascent PHU logic assert(abs(udt - datetime(2022, 12, 8, 20, 52, 22)) < timedelta(seconds=1)) @@ -75,7 +75,7 @@ def test_ut_datetime(): @pytest.mark.dragons_remote_data def test_data_label(): path = astrodata.testing.download_from_archive("S20221209S0007.fits") - ad = astrodata.open(path) + ad = astrodata.from_file(path) dl = ad.data_label() # Check against expected UT Datetime, this descriptor also exercises the nascent PHU logic assert(dl == 'GS-ENG-GHOST-COM-3-123-001') @@ -84,21 +84,21 @@ def test_data_label(): @pytest.mark.dragons_remote_data def test_tab_bias(): path = astrodata.testing.download_from_archive("S20221208S0089.fits") - ad = astrodata.open(path) + ad = astrodata.from_file(path) assert('BIAS' in ad.tags) @pytest.mark.dragons_remote_data def test_tab_flat(): path = astrodata.testing.download_from_archive("S20221209S0026.fits") - ad = astrodata.open(path) + ad = astrodata.from_file(path) assert('FLAT' in ad.tags) @pytest.mark.dragons_remote_data def test_tab_arc(): path = astrodata.testing.download_from_archive("S20221208S0064.fits") - ad = astrodata.open(path) + ad = astrodata.from_file(path) assert('ARC' in ad.tags) diff --git a/gemini_instruments/gmos/__init__.py b/gemini_instruments/gmos/__init__.py index 15d6322108..f858804cde 100644 --- a/gemini_instruments/gmos/__init__.py +++ b/gemini_instruments/gmos/__init__.py @@ -5,6 +5,6 @@ from .adclass import AstroDataGmos from .lookup import filter_wavelengths -factory.addClass(AstroDataGmos) +factory.add_class(AstroDataGmos) # Use the generic GMOS name for both GMOS-N and GMOS-S addInstrumentFilterWavelengths('GMOS', filter_wavelengths) diff --git a/gemini_instruments/gmos/tests/test_gmos.py b/gemini_instruments/gmos/tests/test_gmos.py index ba1befcd6d..2dc0c441df 100644 --- a/gemini_instruments/gmos/tests/test_gmos.py +++ b/gemini_instruments/gmos/tests/test_gmos.py @@ -30,7 +30,7 @@ def ad(request): filename = request.param path = astrodata.testing.download_from_archive(filename) - return astrodata.open(path) + return astrodata.from_file(path) @pytest.mark.dragons_remote_data @@ -71,7 +71,7 @@ def test_tag_as_standard_fake(astrofaker): @pytest.mark.dragons_remote_data def test_tag_as_standard_real(): path = astrodata.testing.download_from_archive("S20190215S0188.fits") - ad = astrodata.open(path) + ad = astrodata.from_file(path) assert 'STANDARD' in ad.tags diff --git a/gemini_instruments/gnirs/__init__.py b/gemini_instruments/gnirs/__init__.py index da7fcd1c2b..2d904d21dc 100644 --- a/gemini_instruments/gnirs/__init__.py +++ b/gemini_instruments/gnirs/__init__.py @@ -5,5 +5,5 @@ from .adclass import AstroDataGnirs from .lookup import filter_wavelengths -factory.addClass(AstroDataGnirs) +factory.add_class(AstroDataGnirs) addInstrumentFilterWavelengths('GNIRS', filter_wavelengths) diff --git a/gemini_instruments/gnirs/tests/test_gnirs.py b/gemini_instruments/gnirs/tests/test_gnirs.py index 810f75acee..e747490809 100644 --- a/gemini_instruments/gnirs/tests/test_gnirs.py +++ b/gemini_instruments/gnirs/tests/test_gnirs.py @@ -44,7 +44,7 @@ def ad(request): """ filename = request.param path = astrodata.testing.download_from_archive(filename) - return astrodata.open(path) + return astrodata.from_file(path) @pytest.mark.xfail(reason="AstroFaker changes the AstroData factory") @@ -98,7 +98,7 @@ def test_slice_range(ad): # def test_read_a_keyword_from_phu(path_to_inputs): # -# ad = astrodata.open(os.path.join(path_to_inputs, filename)) +# ad = astrodata.from_file(os.path.join(path_to_inputs, filename)) # assert ad.phu['DETECTOR'] == 'GNIRS' @pytest.mark.dragons_remote_data @@ -182,7 +182,7 @@ def test_ra_dec_from_text(): @pytest.mark.parametrize("filename,expected_fpm", EXPECTED_FPMS) def test_ifu_fpm(filename, expected_fpm): path = astrodata.testing.download_from_archive(filename) - ad = astrodata.open(path) + ad = astrodata.from_file(path) assert("IFU" in ad.tags) assert(ad.focal_plane_mask(pretty=True) == expected_fpm) diff --git a/gemini_instruments/gpi/__init__.py b/gemini_instruments/gpi/__init__.py index eb32a258e5..b33664f49e 100644 --- a/gemini_instruments/gpi/__init__.py +++ b/gemini_instruments/gpi/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataGpi -factory.addClass(AstroDataGpi) +factory.add_class(AstroDataGpi) diff --git a/gemini_instruments/graces/__init__.py b/gemini_instruments/graces/__init__.py index c39a71804b..5599976f75 100644 --- a/gemini_instruments/graces/__init__.py +++ b/gemini_instruments/graces/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataGraces -factory.addClass(AstroDataGraces) +factory.add_class(AstroDataGraces) diff --git a/gemini_instruments/graces/tests/test_graces.py b/gemini_instruments/graces/tests/test_graces.py index f1c009c1bf..ce5c049507 100644 --- a/gemini_instruments/graces/tests/test_graces.py +++ b/gemini_instruments/graces/tests/test_graces.py @@ -10,7 +10,7 @@ @pytest.fixture def ad(): path = astrodata.testing.download_from_archive(filename) - return astrodata.open(path) + return astrodata.from_file(path) @pytest.mark.xfail(reason="AstroFaker changes the AstroData factory") diff --git a/gemini_instruments/gsaoi/__init__.py b/gemini_instruments/gsaoi/__init__.py index cd7014d400..247da99cf1 100644 --- a/gemini_instruments/gsaoi/__init__.py +++ b/gemini_instruments/gsaoi/__init__.py @@ -5,5 +5,5 @@ from .adclass import AstroDataGsaoi from .lookup import filter_wavelengths -factory.addClass(AstroDataGsaoi) +factory.add_class(AstroDataGsaoi) addInstrumentFilterWavelengths('GSAOI', filter_wavelengths) diff --git a/gemini_instruments/hokupaa_quirc/__init__.py b/gemini_instruments/hokupaa_quirc/__init__.py index f8dcbd523b..9821f08201 100644 --- a/gemini_instruments/hokupaa_quirc/__init__.py +++ b/gemini_instruments/hokupaa_quirc/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataHokupaaQUIRC -factory.addClass(AstroDataHokupaaQUIRC) +factory.add_class(AstroDataHokupaaQUIRC) diff --git a/gemini_instruments/hrwfs/__init__.py b/gemini_instruments/hrwfs/__init__.py index b2b7775900..3f23ad8217 100644 --- a/gemini_instruments/hrwfs/__init__.py +++ b/gemini_instruments/hrwfs/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataHrwfs -factory.addClass(AstroDataHrwfs) +factory.add_class(AstroDataHrwfs) diff --git a/gemini_instruments/igrins/__init__.py b/gemini_instruments/igrins/__init__.py index e827941abc..c43876316f 100644 --- a/gemini_instruments/igrins/__init__.py +++ b/gemini_instruments/igrins/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataIgrins -factory.addClass(AstroDataIgrins) +factory.add_class(AstroDataIgrins) diff --git a/gemini_instruments/michelle/__init__.py b/gemini_instruments/michelle/__init__.py index 848408e5c3..d102379627 100644 --- a/gemini_instruments/michelle/__init__.py +++ b/gemini_instruments/michelle/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataMichelle -factory.addClass(AstroDataMichelle) +factory.add_class(AstroDataMichelle) diff --git a/gemini_instruments/nici/__init__.py b/gemini_instruments/nici/__init__.py index 8ca39e4353..ba6b68d5cc 100644 --- a/gemini_instruments/nici/__init__.py +++ b/gemini_instruments/nici/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataNici -factory.addClass(AstroDataNici) +factory.add_class(AstroDataNici) diff --git a/gemini_instruments/nifs/__init__.py b/gemini_instruments/nifs/__init__.py index 0c2e67163a..54430e6595 100644 --- a/gemini_instruments/nifs/__init__.py +++ b/gemini_instruments/nifs/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataNifs -factory.addClass(AstroDataNifs) +factory.add_class(AstroDataNifs) diff --git a/gemini_instruments/nifs/tests/test_nifs.py b/gemini_instruments/nifs/tests/test_nifs.py index 3a7edf1080..10c720aa12 100644 --- a/gemini_instruments/nifs/tests/test_nifs.py +++ b/gemini_instruments/nifs/tests/test_nifs.py @@ -13,7 +13,7 @@ def ad(request): filename = request.param path = astrodata.testing.download_from_archive(filename) - return astrodata.open(path) + return astrodata.from_file(path) @pytest.mark.dragons_remote_data diff --git a/gemini_instruments/niri/__init__.py b/gemini_instruments/niri/__init__.py index 093a69140d..c81bf84052 100644 --- a/gemini_instruments/niri/__init__.py +++ b/gemini_instruments/niri/__init__.py @@ -5,5 +5,5 @@ from .adclass import AstroDataNiri from .lookup import filter_wavelengths -factory.addClass(AstroDataNiri) +factory.add_class(AstroDataNiri) addInstrumentFilterWavelengths('NIRI', filter_wavelengths) diff --git a/gemini_instruments/niri/tests/test_niri.py b/gemini_instruments/niri/tests/test_niri.py index 6eef03c991..2692a687c3 100644 --- a/gemini_instruments/niri/tests/test_niri.py +++ b/gemini_instruments/niri/tests/test_niri.py @@ -11,7 +11,7 @@ @pytest.fixture() def ad(): path = astrodata.testing.download_from_archive(filename) - return astrodata.open(path) + return astrodata.from_file(path) @pytest.mark.xfail(reason="AstroFaker changes the AstroData factory") diff --git a/gemini_instruments/oscir/__init__.py b/gemini_instruments/oscir/__init__.py index 23e0dbc7ce..c48695fd0f 100644 --- a/gemini_instruments/oscir/__init__.py +++ b/gemini_instruments/oscir/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataOscir -factory.addClass(AstroDataOscir) +factory.add_class(AstroDataOscir) diff --git a/gemini_instruments/phoenix/__init__.py b/gemini_instruments/phoenix/__init__.py index e4864d1b8b..fc890aa080 100644 --- a/gemini_instruments/phoenix/__init__.py +++ b/gemini_instruments/phoenix/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataPhoenix -factory.addClass(AstroDataPhoenix) +factory.add_class(AstroDataPhoenix) diff --git a/gemini_instruments/skycam/__init__.py b/gemini_instruments/skycam/__init__.py index d53c9d365e..95fce3c9c6 100644 --- a/gemini_instruments/skycam/__init__.py +++ b/gemini_instruments/skycam/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataSkyCam -factory.addClass(AstroDataSkyCam) +factory.add_class(AstroDataSkyCam) diff --git a/gemini_instruments/test/test_astrodata_descriptors.py b/gemini_instruments/test/test_astrodata_descriptors.py index 674b79f9f0..c0039a0b94 100644 --- a/gemini_instruments/test/test_astrodata_descriptors.py +++ b/gemini_instruments/test/test_astrodata_descriptors.py @@ -34,11 +34,11 @@ def test_descriptor(instr, filename, descriptor, value): if '_' in filename: filepath = os.path.join(path_to_test_data, filename) try: - ad = astrodata.open(filepath) + ad = astrodata.from_file(filepath) except FileNotFoundError: pytest.skip(f"{filename} not found") else: - ad = astrodata.open(astrodata.testing.download_from_archive(filename)) + ad = astrodata.from_file(astrodata.testing.download_from_archive(filename)) method = getattr(ad, descriptor) if value is None: diff --git a/gemini_instruments/test/test_astrodata_tags.py b/gemini_instruments/test/test_astrodata_tags.py index a337ab1c35..9db840976e 100644 --- a/gemini_instruments/test/test_astrodata_tags.py +++ b/gemini_instruments/test/test_astrodata_tags.py @@ -23,10 +23,10 @@ def test_descriptor(instr, filename, tag_set): if '_' in filename: filepath = os.path.join(path_to_test_data, filename) try: - ad = astrodata.open(filepath) + ad = astrodata.from_file(filepath) except FileNotFoundError: pytest.skip(f"{filename} not found") else: - ad = astrodata.open(astrodata.testing.download_from_archive(filename)) + ad = astrodata.from_file(astrodata.testing.download_from_archive(filename)) assert ad.tags == set(tag_set) diff --git a/gemini_instruments/texes/__init__.py b/gemini_instruments/texes/__init__.py index cad7685f80..55f9cb41f0 100644 --- a/gemini_instruments/texes/__init__.py +++ b/gemini_instruments/texes/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataTexes -factory.addClass(AstroDataTexes) +factory.add_class(AstroDataTexes) diff --git a/gemini_instruments/trecs/__init__.py b/gemini_instruments/trecs/__init__.py index 514af046d1..d7fcb9df35 100644 --- a/gemini_instruments/trecs/__init__.py +++ b/gemini_instruments/trecs/__init__.py @@ -3,4 +3,4 @@ from astrodata import factory from .adclass import AstroDataTrecs -factory.addClass(AstroDataTrecs) +factory.add_class(AstroDataTrecs) diff --git a/geminidr/core/primitives_bookkeeping.py b/geminidr/core/primitives_bookkeeping.py index 0daf952db0..91b4232c50 100644 --- a/geminidr/core/primitives_bookkeeping.py +++ b/geminidr/core/primitives_bookkeeping.py @@ -211,7 +211,7 @@ def is_lazy(ad): # the files to retain their orig_filename attributes, which # would otherwise change upon loading. orig_filename = ad.orig_filename - adinputs[i] = astrodata.open(ad.filename) + adinputs[i] = astrodata.from_file(ad.filename) adinputs[i].orig_filename = orig_filename return adinputs @@ -259,7 +259,7 @@ def getList(self, adinputs=None, **params): adinputs = [] for f in all_files: try: - adinputs.insert(0, astrodata.open(f)) + adinputs.insert(0, astrodata.from_file(f)) except astrodata.AstroDataError: log.stdinfo(" Cannot open {}".format(f)) if len(adinputs) >= max_frames: diff --git a/geminidr/core/primitives_crossdispersed.py b/geminidr/core/primitives_crossdispersed.py index 6825eb0555..6027abed47 100644 --- a/geminidr/core/primitives_crossdispersed.py +++ b/geminidr/core/primitives_crossdispersed.py @@ -220,7 +220,7 @@ def _cut_slits(self, ad, padding=0): else: cut_section = Section(x1=0, x2=ext.shape[1], y1=y1, y2=y2) log.stdinfo(f"Cutting slit {i+1} in extension {ext.id} " - f"from {cut_section.asIRAFsection()}") + f"from {cut_section.as_iraf_section()}") adout.append(deepcopy(ext.nddata[cut_section.asslice()])) adout[-1].SLITEDGE = slitedge[i*2:i*2+2] adout[-1].SLITEDGE["c0"] -= y1 @@ -280,7 +280,7 @@ def _cut_slits(self, ad, padding=0): # (e.g., MOS data from MOS), and will need to update # the array_section keyword then as well. adout[-1].hdr[detsec_kw] = ( - cut_section.asIRAFsection(binning=binnings), + cut_section.as_iraf_section(binning=binnings), self.keyword_comments.get(detsec_kw)) return adout diff --git a/geminidr/core/primitives_image.py b/geminidr/core/primitives_image.py index 86383f549a..03a3d216c9 100644 --- a/geminidr/core/primitives_image.py +++ b/geminidr/core/primitives_image.py @@ -412,7 +412,7 @@ def resampleToCommonFrame(self, adinputs=None, **params): raise OSError("All input images must have only one extension.") if isinstance(reference, str): - reference = astrodata.open(reference) + reference = astrodata.from_file(reference) elif reference is None and pixel_scale is None: # Reference image will be the first AD, so we need 2+ if len(adinputs) < 2: @@ -621,7 +621,7 @@ def transferObjectMask(self, adinputs=None, **params): source_stream = self.streams[source] except KeyError: try: - ad_source = astrodata.open(source) + ad_source = astrodata.from_file(source) except: log.warning(f"Cannot find stream or file named {source}. Continuing.") return adinputs diff --git a/geminidr/core/primitives_preprocess.py b/geminidr/core/primitives_preprocess.py index 46a42fba55..4f9391fb2a 100644 --- a/geminidr/core/primitives_preprocess.py +++ b/geminidr/core/primitives_preprocess.py @@ -269,7 +269,7 @@ def sky_coord(ad): # Produce a list of AD objects from the sky frame/list ad_skies = sky if isinstance(sky, list) else [sky] ad_skies = [ad if isinstance(ad, astrodata.AstroData) else - astrodata.open(ad) for ad in ad_skies] + astrodata.from_file(ad) for ad in ad_skies] else: # get from sky stream (put there by separateSky) ad_skies = self.streams.get('sky', []) @@ -1541,7 +1541,7 @@ def skyCorrect(self, adinputs=None, **params): break else: try: - sky = astrodata.open(filename) + sky = astrodata.from_file(filename) except astrodata.AstroDataError: log.warning(f"Cannot find a sky file named {filename}. " "Ignoring it.") diff --git a/geminidr/core/primitives_stack.py b/geminidr/core/primitives_stack.py index f77bbda928..edeeed0ddd 100644 --- a/geminidr/core/primitives_stack.py +++ b/geminidr/core/primitives_stack.py @@ -4,7 +4,7 @@ # primitives_stack.py # ------------------------------------------------------------------------------ import astrodata -from astrodata.fits import windowedOp +from astrodata.fits import windowed_operation import numpy as np from astropy import table @@ -332,7 +332,7 @@ def flatten(*args): with_uncertainty = True # Since all stacking methods return variance with_mask = apply_dq and not any(ad[index].nddata.window[:].mask is None for ad in adinputs) - result = windowedOp(stack_function, + result = windowed_operation(stack_function, [ad[index].nddata for ad in adinputs], scale=sfactors, zero=zfactors, diff --git a/geminidr/core/tests/test_bookkeeping.py b/geminidr/core/tests/test_bookkeeping.py index 7f6386758d..1fac7792e2 100644 --- a/geminidr/core/tests/test_bookkeeping.py +++ b/geminidr/core/tests/test_bookkeeping.py @@ -144,7 +144,7 @@ def test_addToList(self): filenames = ['N20070819S{:04d}_flatCorrected.fits'.format(i) for i in range(104, 109)] - adinputs = [astrodata.open(os.path.join(TESTDATAPATH, 'NIRI', f)) + adinputs = [astrodata.from_file(os.path.join(TESTDATAPATH, 'NIRI', f)) for f in filenames] # Add one image twice, just for laughs; it should appear only once @@ -180,7 +180,7 @@ def test_writeOutputs(self): filenames = ['N20070819S{:04d}_flatCorrected.fits'.format(i) for i in range(104, 106)] - adinputs = [astrodata.open(os.path.join(TESTDATAPATH, 'NIRI', f)) + adinputs = [astrodata.from_file(os.path.join(TESTDATAPATH, 'NIRI', f)) for f in filenames] p = NIRIImage(adinputs) diff --git a/geminidr/core/tests/test_ccd.py b/geminidr/core/tests/test_ccd.py index 8c5c42867e..6ab9611ea7 100644 --- a/geminidr/core/tests/test_ccd.py +++ b/geminidr/core/tests/test_ccd.py @@ -34,5 +34,5 @@ def test_saturation_level_modification_in_overscan_correct(raw_ad): @pytest.fixture(scope='function') def raw_ad(request): filename = request.param - raw_ad = astrodata.open(download_from_archive(filename)) + raw_ad = astrodata.from_file(download_from_archive(filename)) return raw_ad diff --git a/geminidr/core/tests/test_image.py b/geminidr/core/tests/test_image.py index e8b07b65e9..918906fe01 100644 --- a/geminidr/core/tests/test_image.py +++ b/geminidr/core/tests/test_image.py @@ -20,13 +20,13 @@ def test_transfer_object_mask(path_to_inputs, path_to_refs, dataset): """ Test the transferObjectMask primitive """ - ad_donor = astrodata.open(os.path.join(path_to_inputs, dataset)) - ad_target = astrodata.open(os.path.join(path_to_inputs, object_mask_datasets[dataset])) + ad_donor = astrodata.from_file(os.path.join(path_to_inputs, dataset)) + ad_target = astrodata.from_file(os.path.join(path_to_inputs, object_mask_datasets[dataset])) p = NIRIImage([ad_target]) p.streams['donor'] = [ad_donor] adout = p.transferObjectMask(source="donor", dq_threshold=0.01, dilation=1.5, interpolant="linear").pop() adout.write(overwrite=True) - adref = astrodata.open(os.path.join(path_to_refs, adout.filename)) + adref = astrodata.from_file(os.path.join(path_to_refs, adout.filename)) assert_array_equal(adout[0].OBJMASK, adref[0].OBJMASK) diff --git a/geminidr/core/tests/test_nearIR.py b/geminidr/core/tests/test_nearIR.py index 35b1b47130..df82daa1f3 100644 --- a/geminidr/core/tests/test_nearIR.py +++ b/geminidr/core/tests/test_nearIR.py @@ -113,7 +113,7 @@ def test_remove_first_frame_by_filename(): "S20070131S0105", # GNIRS XD spectrum ]) def test_clean_readout(in_file, path_to_inputs, path_to_refs): - ad = astrodata.open(os.path.join(path_to_inputs, + ad = astrodata.from_file(os.path.join(path_to_inputs, in_file + '_skyCorrected.fits')) # Must use the correct default parameters, since this is a test that the @@ -124,7 +124,7 @@ def test_clean_readout(in_file, path_to_inputs, path_to_refs): p = pclass([ad]) ad_out = p.cleanReadout(clean="default")[0] - ref = astrodata.open(os.path.join(path_to_refs, ad.filename)) + ref = astrodata.from_file(os.path.join(path_to_refs, ad.filename)) assert ad_compare(ad_out, ref, atol=0.01) @@ -146,7 +146,7 @@ def test_clean_readout(in_file, path_to_inputs, path_to_refs): "N20231112S0136", # GNIRS LS ]) def test_clean_fftreadout(in_file, path_to_inputs, path_to_refs): - ad = astrodata.open(os.path.join(path_to_inputs, in_file + '_skyCorrected.fits')) + ad = astrodata.from_file(os.path.join(path_to_inputs, in_file + '_skyCorrected.fits')) # Must use the correct default parameters, since this is a test that the # defaults haven't changed pm = PrimitiveMapper(ad.tags, ad.instrument(generic=True).lower(), @@ -154,5 +154,5 @@ def test_clean_fftreadout(in_file, path_to_inputs, path_to_refs): pclass = pm.get_applicable_primitives() p = pclass([ad]) ad_out = p.cleanFFTReadout(clean="default")[0] - ref = astrodata.open(os.path.join(path_to_refs, in_file + '_readoutFFTCleaned.fits')) + ref = astrodata.from_file(os.path.join(path_to_refs, in_file + '_readoutFFTCleaned.fits')) assert ad_compare(ad_out, ref, atol=0.01) diff --git a/geminidr/core/tests/test_preprocess.py b/geminidr/core/tests/test_preprocess.py index 53ae544a60..1498c9f60a 100644 --- a/geminidr/core/tests/test_preprocess.py +++ b/geminidr/core/tests/test_preprocess.py @@ -38,7 +38,7 @@ def niri_images(niri_image): @pytest.fixture def niriprim(): file_path = download_from_archive("N20190120S0287.fits") - ad = astrodata.open(file_path) + ad = astrodata.from_file(file_path) p = NIRIImage([ad]) p.addDQ(static_bpm=download_from_archive("bpm_20010317_niri_niri_11_full_1amp.fits")) return p @@ -47,7 +47,7 @@ def niriprim(): @pytest.fixture def niriprim2(): file_path = download_from_archive("N20190120S0287.fits") - ad = astrodata.open(file_path) + ad = astrodata.from_file(file_path) ad.append(ad[0]) p = NIRIImage([ad]) p.addDQ() @@ -424,10 +424,10 @@ def test_fixpixels_multiple_ext(niriprim2): #def test_nonlinearity_correct(path_to_inputs, path_to_refs, dataset): def test_nonlinearity_correct(path_to_inputs, path_to_refs, dataset): """Only GSAOI uses the core primitive with real coefficients""" - ad = astrodata.open(os.path.join(path_to_inputs, dataset[0])) + ad = astrodata.from_file(os.path.join(path_to_inputs, dataset[0])) p = GSAOIImage([ad]) ad_out = p.nonlinearityCorrect().pop() - ad_ref = astrodata.open(os.path.join(path_to_refs, dataset[1])) + ad_ref = astrodata.from_file(os.path.join(path_to_refs, dataset[1])) assert ad_compare(ad_out, ad_ref, ignore=['filename']) @@ -456,7 +456,7 @@ def test_scale_by_exposure_time(niri_images): # def test_add_object_mask_to_dq(astrofaker): # ad_orig = astrofaker.create('F2', 'IMAGE') -# # astrodata.open(os.path.join(TESTDATAPATH, 'GMOS', 'N20150624S0106_refcatAdded.fits')) +# # astrodata.from_file(os.path.join(TESTDATAPATH, 'GMOS', 'N20150624S0106_refcatAdded.fits')) # p = GMOSImage([deepcopy(ad_orig)]) # ad = p.addObjectMaskToDQ()[0] @@ -468,7 +468,7 @@ def test_scale_by_exposure_time(niri_images): # @pytest.mark.xfail(reason="Test needs revision", run=False) # def test_adu_to_electrons(astrofaker): # ad = astrofaker.create("NIRI", "IMAGE") -# # astrodata.open(os.path.join(TESTDATAPATH, 'NIRI', 'N20070819S0104_dqAdded.fits')) +# # astrodata.from_file(os.path.join(TESTDATAPATH, 'NIRI', 'N20070819S0104_dqAdded.fits')) # p = NIRIImage([ad]) # ad = p.ADUToElectrons()[0] # assert ad_compare(ad, os.path.join(TESTDATAPATH, 'NIRI', @@ -563,7 +563,7 @@ def test_associate_sky_exclude_some(niri_image, niri_sequence): # pass # def test_darkCorrect(self): -# ad = astrodata.open(os.path.join(TESTDATAPATH, 'NIRI', +# ad = astrodata.from_file(os.path.join(TESTDATAPATH, 'NIRI', # 'N20070819S0104_nonlinearityCorrected.fits')) # p = NIRIImage([ad]) # ad = p.darkCorrect()[0] @@ -584,7 +584,7 @@ def test_darkCorrect_with_af(astrofaker): # af.init_default_extensions() # af[0].mask = np.zeros_like(af[0].data, dtype=np.uint16) # def test_flatCorrect(self): -# ad = astrodata.open(os.path.join(TESTDATAPATH, 'NIRI', +# ad = astrodata.from_file(os.path.join(TESTDATAPATH, 'NIRI', # 'N20070819S0104_darkCorrected.fits')) # p = NIRIImage([ad]) # ad = p.flatCorrect()[0] @@ -597,7 +597,7 @@ def test_darkCorrect_with_af(astrofaker): # def test_normalizeFlat(self): # flat_file = os.path.join(TESTDATAPATH, 'NIRI', # 'N20070913S0220_flat.fits') -# ad = astrodata.open(flat_file) +# ad = astrodata.from_file(flat_file) # ad.multiply(10.0) # del ad.phu['NORMLIZE'] # Delete timestamp of previous processing # p = NIRIImage([ad]) @@ -814,7 +814,7 @@ def test_separate_sky_proximity(groups, niri_sequence): # pass # # def test_subtractSkyBackground(self): -# ad = astrodata.open(os.path.join(TESTDATAPATH, 'NIRI', +# ad = astrodata.from_file(os.path.join(TESTDATAPATH, 'NIRI', # 'N20070819S0104_flatCorrected.fits')) # ad.hdr['SKYLEVEL'] = 1000.0 # orig_data = ad[0].data.copy() @@ -824,7 +824,7 @@ def test_separate_sky_proximity(groups, niri_sequence): # assert (orig_data - ad[0].data).max() < 1000.01 # # def test_thresholdFlatfield(self): -# ad = astrodata.open(os.path.join(TESTDATAPATH, 'NIRI', +# ad = astrodata.from_file(os.path.join(TESTDATAPATH, 'NIRI', # 'N20070913S0220_flat.fits')) # del ad.phu['TRHFLAT'] # Delete timestamp of previous processing # ad[0].data[100, 100] = 20.0 diff --git a/geminidr/core/tests/test_spect.py b/geminidr/core/tests/test_spect.py index f1fa3a6848..4f468f675d 100644 --- a/geminidr/core/tests/test_spect.py +++ b/geminidr/core/tests/test_spect.py @@ -138,7 +138,7 @@ def test_find_apertures(filename, path_to_inputs, change_working_dir): 'S20210709S0035_stack.fits': {'min_snr': 10}} with change_working_dir(path_to_inputs): - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) try: # Check for custom parameter values for individual tests params.update(extra_params[filename]) @@ -158,7 +158,7 @@ def test_find_apertures(filename, path_to_inputs, change_working_dir): @pytest.mark.preprocessed_data def test_create_new_aperture(path_to_inputs): - ad = astrodata.open(os.path.join(path_to_inputs, 'S20060826S0305_2D.fits')) + ad = astrodata.from_file(os.path.join(path_to_inputs, 'S20060826S0305_2D.fits')) p = GNIRSLongslit([ad]) # Test creating a new aperture @@ -181,7 +181,7 @@ def test_create_new_aperture(path_to_inputs): @pytest.mark.preprocessed_data def test_create_new_aperture_warnings_and_errors(path_to_inputs, caplog): - ad = astrodata.open(os.path.join(path_to_inputs, 'S20060826S0305_2D.fits')) + ad = astrodata.from_file(os.path.join(path_to_inputs, 'S20060826S0305_2D.fits')) p = GNIRSLongslit([ad]) # Check that only passing one 'aper' parameter raises a ValueError @@ -394,7 +394,7 @@ def test_adjust_wavelength_zero_point_shift(in_shift, change_working_dir, path_to_inputs): """Apply a shift and confirm that the WCS has changed correctly""" with change_working_dir(path_to_inputs): - ad = astrodata.open('N20220706S0337_wavelengthSolutionAttached.fits') + ad = astrodata.from_file('N20220706S0337_wavelengthSolutionAttached.fits') dispaxis = 2 - ad.dispersion_axis()[0] # python sense center = ad[0].shape[1 - dispaxis] // 2 @@ -413,7 +413,7 @@ def test_adjust_wavelength_zero_point_overlarge_shift(in_shift, change_working_dir, path_to_inputs): with change_working_dir(path_to_inputs): - ad = astrodata.open('N20220706S0337_wavelengthSolutionAttached.fits') + ad = astrodata.from_file('N20220706S0337_wavelengthSolutionAttached.fits') p = GNIRSLongslit([ad]) with pytest.raises(ValueError): @@ -454,7 +454,7 @@ def test_adjust_wavelength_zero_point_auto_shift(filename, result, center = centers.get(filename) with change_working_dir(path_to_inputs): - ad = astrodata.open(filename + '_wavelengthSolutionAttached.fits') + ad = astrodata.from_file(filename + '_wavelengthSolutionAttached.fits') instrument = ad.instrument() p = classes_dict[instrument]([ad]) @@ -484,7 +484,7 @@ def test_adjust_wavelength_zero_point_controlled(filename, center, shift, 'F2': F2Longslit, 'NIRI': NIRILongslit} - ad = astrodata.open(os.path.join(path_to_inputs, + ad = astrodata.from_file(os.path.join(path_to_inputs, filename + '_wavelengthSolutionAttached.fits')) p = classes_dict[ad.instrument()]([ad]) @@ -523,11 +523,11 @@ def test_mask_beyond_slit(in_file, instrument, change_working_dir, 'F2': F2Longslit, 'NIRI': NIRILongslit} - ad = astrodata.open(os.path.join(path_to_inputs, + ad = astrodata.from_file(os.path.join(path_to_inputs, in_file + '_slitEdgesDetermined.fits')) p = classes_dict[instrument]([ad]) ad_out = p.maskBeyondSlit().pop() - ref = astrodata.open(os.path.join(path_to_refs, + ref = astrodata.from_file(os.path.join(path_to_refs, in_file + '_maskedBeyondSlit.fits')) # Find the size of the smallest extension in the file; we don't need the # mask to match *exactly*, so as long as the mismatch isn't more than 0.1 of @@ -564,7 +564,7 @@ def test_slit_rectification(filename, instrument, change_working_dir, 'NIRI': NIRILongslit} with change_working_dir(path_to_inputs): - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) p = classes_dict[instrument]([ad]) @@ -644,7 +644,7 @@ def test_get_sky_spectrum(path_to_inputs, path_to_refs): # is a Chebyshev1D, as required. (In normal reduction, a Cheb1D will be # provided bto _get_sky_spectrum() y determineWavelengthSolution, # regardless of the state of the input file.) - ad_f2 = astrodata.open(os.path.join( + ad_f2 = astrodata.from_file(os.path.join( path_to_inputs, 'S20180114S0104_wavelengthSolutionDetermined.fits')) wave_model = am.get_named_submodel(ad_f2[0].wcs.forward_transform, 'WAVE') @@ -706,15 +706,15 @@ def test_transfer_distortion_model(change_working_dir, path_to_inputs, path_to_r p.findApertures() p.determineWavelengthSolution(absorption=True) """ - ad_no_dist_model = astrodata.open(os.path.join(path_to_inputs, 'N20121221S0199_wavelengthSolutionDetermined.fits')) - ad_with_dist_model = astrodata.open(os.path.join(path_to_inputs, 'N20121221S0199_wavelengthSolutionAttached.fits')) + ad_no_dist_model = astrodata.from_file(os.path.join(path_to_inputs, 'N20121221S0199_wavelengthSolutionDetermined.fits')) + ad_with_dist_model = astrodata.from_file(os.path.join(path_to_inputs, 'N20121221S0199_wavelengthSolutionAttached.fits')) p = primitives_gnirs_longslit.GNIRSLongslit([ad_no_dist_model]) p.streams["with_distortion_model"] = ad_with_dist_model ad_with_dist_model_transferred = p.transferDistortionModel(source="with_distortion_model") p.writeOutputs() with change_working_dir(path_to_refs): ref_with_dist_model_transferred = \ - astrodata.open(os.path.join(path_to_refs, "N20121221S0199_distortionModelTransferred.fits")) + astrodata.from_file(os.path.join(path_to_refs, "N20121221S0199_distortionModelTransferred.fits")) # Compare output WCS as well as pixel values (by evaluating it at the # ends of the ranges, since there are multiple ways of constructing an diff --git a/geminidr/core/tests/test_standardize.py b/geminidr/core/tests/test_standardize.py index 5f61c185db..63e65ab000 100644 --- a/geminidr/core/tests/test_standardize.py +++ b/geminidr/core/tests/test_standardize.py @@ -61,14 +61,14 @@ def test_addDQ(self, change_working_dir, path_to_refs, path_to_common_inputs): with change_working_dir(): - ad = astrodata.open(os.path.join(path_to_refs, + ad = astrodata.from_file(os.path.join(path_to_refs, 'N20070819S0104_prepared.fits')) bpmfile = os.path.join(path_to_common_inputs, 'bpm_20010317_niri_niri_11_full_1amp.fits') p = NIRIImage([ad]) adout = p.addDQ(static_bpm=bpmfile)[0] assert ad_compare(adout, - astrodata.open(os.path.join(path_to_refs, + astrodata.from_file(os.path.join(path_to_refs, 'N20070819S0104_dqAdded.fits'))) @pytest.mark.niri @@ -78,14 +78,14 @@ def test_addIllumMaskToDQ(self, change_working_dir, path_to_inputs, path_to_refs): with change_working_dir(): - ad = astrodata.open(os.path.join(path_to_refs, + ad = astrodata.from_file(os.path.join(path_to_refs, 'N20070819S0104_dqAdded.fits')) p = NIRIImage([ad]) adout = p.addIllumMaskToDQ()[0] assert ad_compare(adout, - astrodata.open(os.path.join( + astrodata.from_file(os.path.join( path_to_refs, 'N20070819S0104_illumMaskAdded.fits'))) @@ -95,11 +95,11 @@ def test_addIllumMaskToDQ(self, change_working_dir, path_to_inputs, def test_addVAR(self, change_working_dir, path_to_inputs, path_to_refs): with change_working_dir(): - ad = astrodata.open(os.path.join(path_to_inputs, + ad = astrodata.from_file(os.path.join(path_to_inputs, 'N20070819S0104_ADUToElectrons.fits')) p = NIRIImage([ad]) adout = p.addVAR(read_noise=True, poisson_noise=True)[0] - assert ad_compare(adout, astrodata.open(os.path.join(path_to_refs, + assert ad_compare(adout, astrodata.from_file(os.path.join(path_to_refs, 'N20070819S0104_varAdded.fits'))) @pytest.mark.dragons_remote_data @@ -112,7 +112,7 @@ def test_makeIRAFCompatible(self, filename, instrument, inst_class): GMOS_keywords = ('GPREPARE', 'GGAIN', 'GAINMULT', 'CCDSUM') - p = inst_class([astrodata.open(download_from_archive(filename))]) + p = inst_class([astrodata.from_file(download_from_archive(filename))]) p.prepare() p.ADUToElectrons() ad = p.makeIRAFCompatible()[0] @@ -133,7 +133,7 @@ def test_makeIRAFCompatible(self, filename, instrument, inst_class): def test_prepare(self, change_working_dir, path_to_inputs, path_to_refs): - ad = astrodata.open(os.path.join(path_to_inputs, + ad = astrodata.from_file(os.path.join(path_to_inputs, 'N20070819S0104.fits')) with change_working_dir(): logutils.config(file_name=f'log_regression_{ad.data_label()}.txt') @@ -143,7 +143,7 @@ def test_prepare(self, change_working_dir, path_to_inputs, outfilename='N20070819S0104_prepared.fits').pop() del prepared_ad.phu['SDZWCS'] # temporary fix - ref_ad = astrodata.open( + ref_ad = astrodata.from_file( os.path.join(path_to_refs, 'N20070819S0104_prepared.fits')) assert ad_compare(prepared_ad, ref_ad) @@ -153,7 +153,7 @@ def test_prepare(self, change_working_dir, path_to_inputs, @pytest.mark.preprocessed_data def test_standardizeHeaders(self, change_working_dir, path_to_inputs): - ad = astrodata.open(os.path.join(path_to_inputs, + ad = astrodata.from_file(os.path.join(path_to_inputs, 'N20070819S0104.fits')) with change_working_dir(): diff --git a/geminidr/core/tests/test_telluric.py b/geminidr/core/tests/test_telluric.py index d8adae2272..781ab8d2c0 100644 --- a/geminidr/core/tests/test_telluric.py +++ b/geminidr/core/tests/test_telluric.py @@ -17,7 +17,7 @@ @pytest.mark.preprocessed_data @pytest.mark.parametrize("filename", ["hip93667_109_ad.fits"]) def test_fit_telluric(path_to_inputs, path_to_refs, filename): - ad = astrodata.open(os.path.join(path_to_inputs, filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, filename)) pm = PrimitiveMapper(ad.tags, ad.instrument(generic=True).lower(), mode='sq', drpkg='geminidr') @@ -26,7 +26,7 @@ def test_fit_telluric(path_to_inputs, path_to_refs, filename): adout = p.fitTelluric(magnitude="K=5.241", bbtemp=9650, shift_tolerance=None).pop() - adref = astrodata.open(os.path.join(path_to_refs, adout.filename)) + adref = astrodata.from_file(os.path.join(path_to_refs, adout.filename)) assert ad_compare(adout, adref) assert np.allclose(adout[0].TELLFIT['PCA coefficients'].data, adref[0].TELLFIT['PCA coefficients'].data) @@ -44,7 +44,7 @@ def test_fit_telluric(path_to_inputs, path_to_refs, filename): ]) def test_get_atran_linelist(filename, model_params, change_working_dir, path_to_inputs, path_to_refs): - ad = astrodata.open(os.path.join(path_to_inputs, filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, filename)) p = GNIRSLongslit([]) wave_model = am.get_named_submodel(ad[0].wcs.forward_transform, 'WAVE') linelist = p._get_atran_linelist(wave_model=wave_model, ext=ad[0], diff --git a/geminidr/core/tests/test_visualize.py b/geminidr/core/tests/test_visualize.py index 006611b19b..21fcb7b84a 100644 --- a/geminidr/core/tests/test_visualize.py +++ b/geminidr/core/tests/test_visualize.py @@ -158,7 +158,7 @@ def input_ads(path_to_inputs, request): input_data_list = [] for p in input_paths: if os.path.exists(p): - input_data_list.append(astrodata.open(p)) + input_data_list.append(astrodata.from_file(p)) else: raise FileNotFoundError(p) @@ -202,7 +202,7 @@ def create_inputs(): arc_paths = [download_from_archive(f) for f in arc_list] cals = [] - raw_ads = [astrodata.open(p) for p in raw_paths] + raw_ads = [astrodata.from_file(p) for p in raw_paths] data_label = raw_ads[0].data_label() print('Current working directory:\n {:s}'.format(os.getcwd())) diff --git a/geminidr/core/tests/test_wcs_creation_and_stability.py b/geminidr/core/tests/test_wcs_creation_and_stability.py index 42f951cc7a..182c231d56 100644 --- a/geminidr/core/tests/test_wcs_creation_and_stability.py +++ b/geminidr/core/tests/test_wcs_creation_and_stability.py @@ -55,7 +55,7 @@ def tile_all(request): return request.param def test_gmos_wcs_stability(raw_ad_path, do_prepare, do_overscan_correct, tile_all): - raw_ad = astrodata.open(raw_ad_path) + raw_ad = astrodata.from_file(raw_ad_path) # Ensure it's tagged IMAGE so we can get an imaging WCS and can use SkyCoord raw_ad.phu['GRATING'] = 'MIRROR' @@ -101,7 +101,7 @@ def test_gmos_wcs_stability(raw_ad_path, do_prepare, do_overscan_correct, tile_a # Now write the file to disk and read it back in and check WCS stability ad.write(TEMPFILE, overwrite=True) - ad = astrodata.open(TEMPFILE) + ad = astrodata.from_file(TEMPFILE) c = SkyCoord(*ad[new_ref_index].wcs(x, y), unit="deg") assert c0.separation(c) < 1e-9 * u.arcsec diff --git a/geminidr/doc/tutorials/F2Img-DRTutorial/savefig/display_flamingos2_stack.py b/geminidr/doc/tutorials/F2Img-DRTutorial/savefig/display_flamingos2_stack.py index b68e121957..73cceef548 100755 --- a/geminidr/doc/tutorials/F2Img-DRTutorial/savefig/display_flamingos2_stack.py +++ b/geminidr/doc/tutorials/F2Img-DRTutorial/savefig/display_flamingos2_stack.py @@ -18,7 +18,7 @@ def main(): filename = get_stack_filename() - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) data = ad[0].data mask = ad[0].mask diff --git a/geminidr/doc/tutorials/GMOSImg-DRTutorial/savefig/display_gmos_single.py b/geminidr/doc/tutorials/GMOSImg-DRTutorial/savefig/display_gmos_single.py index 6c0d1c33c0..b5bbbec06b 100755 --- a/geminidr/doc/tutorials/GMOSImg-DRTutorial/savefig/display_gmos_single.py +++ b/geminidr/doc/tutorials/GMOSImg-DRTutorial/savefig/display_gmos_single.py @@ -19,7 +19,7 @@ def main(): filename = get_stack_filename() - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) fig = plt.figure(num=filename, figsize=(7, 4.5)) fig.suptitle(os.path.basename(filename), y=0.97) diff --git a/geminidr/doc/tutorials/GMOSImg-DRTutorial/savefig/display_gmos_stack.py b/geminidr/doc/tutorials/GMOSImg-DRTutorial/savefig/display_gmos_stack.py index a1c4196221..be8f91cad6 100755 --- a/geminidr/doc/tutorials/GMOSImg-DRTutorial/savefig/display_gmos_stack.py +++ b/geminidr/doc/tutorials/GMOSImg-DRTutorial/savefig/display_gmos_stack.py @@ -19,7 +19,7 @@ def main(): args = _parse_args() filename = args.filename - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) data = ad[0].data mask = ad[0].mask diff --git a/geminidr/doc/tutorials/GSAOIImg-DRTutorial/scripts/show_discostu_output.py b/geminidr/doc/tutorials/GSAOIImg-DRTutorial/scripts/show_discostu_output.py index 64f88cfdd7..58a0757e1f 100755 --- a/geminidr/doc/tutorials/GSAOIImg-DRTutorial/scripts/show_discostu_output.py +++ b/geminidr/doc/tutorials/GSAOIImg-DRTutorial/scripts/show_discostu_output.py @@ -19,7 +19,7 @@ def main(): filename = get_filename() - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) print(ad.info()) fig = plt.figure(num=filename, figsize=(8, 8)) diff --git a/geminidr/doc/tutorials/GSAOIImg-DRTutorial/scripts/show_flat_corrected_image.py b/geminidr/doc/tutorials/GSAOIImg-DRTutorial/scripts/show_flat_corrected_image.py index 98a605abe0..72f7375f32 100755 --- a/geminidr/doc/tutorials/GSAOIImg-DRTutorial/scripts/show_flat_corrected_image.py +++ b/geminidr/doc/tutorials/GSAOIImg-DRTutorial/scripts/show_flat_corrected_image.py @@ -19,7 +19,7 @@ def main(): # filename = 'S20170505S0102_flatCorrected.fits' filename = get_filename() - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) print(ad.info()) fig = plt.figure(num=filename, figsize=(8, 8)) diff --git a/geminidr/f2/tests/longslit/test_determine_distortion.py b/geminidr/f2/tests/longslit/test_determine_distortion.py index 2d1a0fefcd..f2470bd1f0 100644 --- a/geminidr/f2/tests/longslit/test_determine_distortion.py +++ b/geminidr/f2/tests/longslit/test_determine_distortion.py @@ -287,7 +287,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -501,7 +501,7 @@ def create_inputs_recipe(): flat_darks_paths = [download_from_archive(f) for f in cals['flat_darks']] flat_path = [download_from_archive(f) for f in cals['flat']] - arc_ad = astrodata.open(arc_path) + arc_ad = astrodata.from_file(arc_path) data_label = arc_ad.data_label() logutils.config(file_name='log_arc_darks_{}.txt'.format(data_label)) @@ -556,7 +556,7 @@ def create_refs_recipe(): print('Current working directory:\n {:s}'.format(os.getcwd())) for filename, params in input_pars: - ad = astrodata.open(os.path.join('inputs', filename)) + ad = astrodata.from_file(os.path.join('inputs', filename)) p = F2Longslit([ad]) p.determineDistortion(**{**fixed_parameters_for_determine_distortion, **params}) diff --git a/geminidr/f2/tests/longslit/test_determine_wavelength_solution.py b/geminidr/f2/tests/longslit/test_determine_wavelength_solution.py index 1aeeeefe4c..2864c4bd98 100644 --- a/geminidr/f2/tests/longslit/test_determine_wavelength_solution.py +++ b/geminidr/f2/tests/longslit/test_determine_wavelength_solution.py @@ -349,7 +349,7 @@ def test_regression_determine_wavelength_solution( if record.levelname == "WARNING": assert "No acceptable wavelength solution found" not in record.message - ref_ad = astrodata.open(os.path.join(path_to_refs, wcalibrated_ad.filename)) + ref_ad = astrodata.from_file(os.path.join(path_to_refs, wcalibrated_ad.filename)) model = am.get_named_submodel(wcalibrated_ad[0].wcs.forward_transform, "WAVE") ref_model = am.get_named_submodel(ref_ad[0].wcs.forward_transform, "WAVE") @@ -407,7 +407,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -644,7 +644,7 @@ def create_inputs_recipe(): flat_darks_paths = [download_from_archive(f) for f in cals['flat_darks']] flat_path = [download_from_archive(f) for f in cals['flat']] - arc_ad = astrodata.open(arc_path) + arc_ad = astrodata.from_file(arc_path) data_label = arc_ad.data_label() logutils.config(file_name='log_arc_darks_{}.txt'.format(data_label)) @@ -699,7 +699,7 @@ def create_refs_recipe(): print('Current working directory:\n {:s}'.format(os.getcwd())) for filename, params in input_pars: - ad = astrodata.open(os.path.join('inputs', filename)) + ad = astrodata.from_file(os.path.join('inputs', filename)) p = F2Longslit([ad]) p.determineWavelengthSolution(**{**determine_wavelength_solution_parameters, **params}) diff --git a/geminidr/f2/tests/longslit/test_f2_longslit.py b/geminidr/f2/tests/longslit/test_f2_longslit.py index 7892638c87..3f54edc4ac 100644 --- a/geminidr/f2/tests/longslit/test_f2_longslit.py +++ b/geminidr/f2/tests/longslit/test_f2_longslit.py @@ -15,7 +15,7 @@ @pytest.mark.dragons_remote_data def test_addMDF(): - p = F2Longslit([astrodata.open( + p = F2Longslit([astrodata.from_file( download_from_archive('S20140605S0101.fits'))]) ad = p.prepare()[0] # Includes addMDF() as a step. diff --git a/geminidr/f2/tests/longslit/test_flat_correct.py b/geminidr/f2/tests/longslit/test_flat_correct.py index d979d3ac18..c85f7acd41 100644 --- a/geminidr/f2/tests/longslit/test_flat_correct.py +++ b/geminidr/f2/tests/longslit/test_flat_correct.py @@ -38,7 +38,7 @@ def ad(path_to_inputs, request): """Return AD object in input directory""" path = os.path.join(path_to_inputs, request.param) if os.path.exists(path): - return astrodata.open(path) + return astrodata.from_file(path) raise FileNotFoundError(path) diff --git a/geminidr/f2/tests/longslit/test_sky_stacking.py b/geminidr/f2/tests/longslit/test_sky_stacking.py index cfec4434f7..76dc4f229c 100644 --- a/geminidr/f2/tests/longslit/test_sky_stacking.py +++ b/geminidr/f2/tests/longslit/test_sky_stacking.py @@ -13,7 +13,7 @@ # ---- Fixtures --------------------------------------------------------------- @pytest.fixture def f2_abba(): - return [astrodata.open(download_from_archive(f)) for f in + return [astrodata.from_file(download_from_archive(f)) for f in ('S20200301S0071.fits', 'S20200301S0072.fits', 'S20200301S0073.fits', 'S20200301S0074.fits')] @@ -90,7 +90,7 @@ def test_associate_sky_quasi_abcde(): 'S20210515S0203.fits', 'S20210515S0206.fits', 'S20210515S0208.fits'] - data = [astrodata.open(download_from_archive(f)) for f in files] + data = [astrodata.from_file(download_from_archive(f)) for f in files] p = F2Longslit(data) p.prepare() diff --git a/geminidr/f2/tests/spect/test_trace_apertures.py b/geminidr/f2/tests/spect/test_trace_apertures.py index 4d169a8982..c467e189be 100644 --- a/geminidr/f2/tests/spect/test_trace_apertures.py +++ b/geminidr/f2/tests/spect/test_trace_apertures.py @@ -101,7 +101,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) diff --git a/geminidr/f2/tests/test_determine_slit_edges.py b/geminidr/f2/tests/test_determine_slit_edges.py index cda3c8231c..61f88a4f34 100644 --- a/geminidr/f2/tests/test_determine_slit_edges.py +++ b/geminidr/f2/tests/test_determine_slit_edges.py @@ -76,7 +76,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) diff --git a/geminidr/f2/tests/test_select_from_inputs.py b/geminidr/f2/tests/test_select_from_inputs.py index 4472cb2b55..fba0edeb80 100644 --- a/geminidr/f2/tests/test_select_from_inputs.py +++ b/geminidr/f2/tests/test_select_from_inputs.py @@ -21,7 +21,7 @@ def input_ad(request): filename = request.param path = download_from_archive(filename) - ad = astrodata.open(path) + ad = astrodata.from_file(path) return ad diff --git a/geminidr/gemini/tests/test_gemini.py b/geminidr/gemini/tests/test_gemini.py index 244664b28f..5c5ee2e936 100644 --- a/geminidr/gemini/tests/test_gemini.py +++ b/geminidr/gemini/tests/test_gemini.py @@ -16,7 +16,7 @@ # @pytest.fixture(scope='module') # def ad(path_to_inputs): # -# return astrodata.open( +# return astrodata.from_file( # os.path.join(path_to_inputs, 'N20020829S0026.fits')) # --- Delete me? --- @@ -140,7 +140,7 @@ def test_standardize_wcs_create_new(dataset): filenames = [f"{dataset[0][:10]}{{:04d}}.fits".format(i) for i in range(start, start+dataset[1])] files = [download_from_archive(f) for f in filenames] - adinputs = [astrodata.open(f) for f in files] + adinputs = [astrodata.from_file(f) for f in files] # Remove third dimension if adinputs[0].instrument() == "F2": diff --git a/geminidr/gemini/tests/test_qa.py b/geminidr/gemini/tests/test_qa.py index 648a578a39..f26f8701bc 100644 --- a/geminidr/gemini/tests/test_qa.py +++ b/geminidr/gemini/tests/test_qa.py @@ -26,7 +26,7 @@ def ad(path_to_inputs): """Has been run through prepare, addDQ, overscanCorrect, detectSources, addReferenceCatalog, determineAstrometricSolution""" - ad = astrodata.open(os.path.join(path_to_inputs, "N20150624S0106_astrometryCorrected.fits")) + ad = astrodata.from_file(os.path.join(path_to_inputs, "N20150624S0106_astrometryCorrected.fits")) return ad @@ -148,7 +148,7 @@ def test_measureIQ(caplog, ad): def test_measureIQ_no_objcat_AO(caplog): """Confirm we get a report with AO seeing if no OBJCAT""" caplog.set_level(logging.DEBUG) - ad = astrodata.open(download_from_archive("N20131215S0156.fits")) + ad = astrodata.from_file(download_from_archive("N20131215S0156.fits")) p = NIRIImage([ad]) p.measureIQ() @@ -167,7 +167,7 @@ def test_measureIQ_no_objcat_AO(caplog): def test_measure_IQ_GMOS_thru_slit(caplog): """Measure on a GMOS thru-slit LS observation""" caplog.set_level(logging.DEBUG) - ad = astrodata.open(download_from_archive("N20180521S0099.fits")) + ad = astrodata.from_file(download_from_archive("N20180521S0099.fits")) p = GMOSImage([ad]) p.prepare(attach_mdf=True) p.addDQ() @@ -185,7 +185,7 @@ def test_measure_IQ_GMOS_thru_slit(caplog): @pytest.mark.dragons_remote_data def test_measureIQ_no_objcat(): """Confirm the primitive doesn't crash with no OBJCAT""" - ad = astrodata.open(download_from_archive("N20180105S0064.fits")) + ad = astrodata.from_file(download_from_archive("N20180105S0064.fits")) p = GMOSImage([ad]) p.measureIQ()[0] @@ -193,7 +193,7 @@ def test_measureIQ_no_objcat(): @pytest.mark.dragons_remote_data def test_measureIQ_no_objcat_GSAOI(): """Confirm the primitive doesn't for GSAOI with no OBJCAT""" - ad = astrodata.open(download_from_archive("S20150528S0112.fits")) + ad = astrodata.from_file(download_from_archive("S20150528S0112.fits")) p = NIRIImage([ad]) p.measureBG()[0] @@ -201,6 +201,6 @@ def test_measureIQ_no_objcat_GSAOI(): @pytest.mark.dragons_remote_data def test_measureBG_no_zeropoint(caplog): """Confirm the primitive doesn't crash with no nominal_photometric_zeropoint""" - ad = astrodata.open(download_from_archive("N20131215S0152.fits")) + ad = astrodata.from_file(download_from_archive("N20131215S0152.fits")) p = NIRIImage([ad]) p.measureBG()[0] diff --git a/geminidr/ghost/polyfit/test/test_extract.py b/geminidr/ghost/polyfit/test/test_extract.py index f3d7da7d55..6f673e2909 100644 --- a/geminidr/ghost/polyfit/test/test_extract.py +++ b/geminidr/ghost/polyfit/test/test_extract.py @@ -45,7 +45,7 @@ def make_extractor(self, request): datetime.date(2016, 11, 20), None, caltype) for caltype in ('xmod', 'wavemod', 'spatmod', 'specmod', 'rotmod')] - ga.spectral_format_with_matrix(*[astrodata.open(fn)[0].data + ga.spectral_format_with_matrix(*[astrodata.from_file(fn)[0].data for fn in fnames]) # Stand up the Slitview, and run necessary functions @@ -54,7 +54,7 @@ def make_extractor(self, request): sv = slitview.SlitView( slit_image=np.loadtxt(os.path.join(TEST_DATA_DIR, 'slitimage.dat')), flat_image=np.loadtxt(os.path.join(TEST_DATA_DIR, 'slitflat.dat')), - slitvpars=astrodata.open(slitv_fn).TABLE[0], mode=res) + slitvpars=astrodata.from_file(slitv_fn).TABLE[0], mode=res) ext = extract.Extractor(ga, sv) diff --git a/geminidr/ghost/polyfit/test/test_slitview.py b/geminidr/ghost/polyfit/test/test_slitview.py index 2c1d2cfe2f..9abe6b881a 100644 --- a/geminidr/ghost/polyfit/test/test_slitview.py +++ b/geminidr/ghost/polyfit/test/test_slitview.py @@ -26,7 +26,7 @@ def get_slitview_obj(self, request): flat_arr = np.zeros((160, 160)) slitv_fn = get_polyfit_filename( None, 'slitv', res, datetime.date(2016, 11, 20), None, 'slitvmod') - slitvpars = astrodata.open(slitv_fn).TABLE[0] + slitvpars = astrodata.from_file(slitv_fn).TABLE[0] sv = polyfit.slitview.SlitView( data_arr, flat_arr, slitvpars=slitvpars, mode=res) # import pdb; pdb.set_trace() @@ -130,11 +130,11 @@ def test_slitview_slit_profile_shape(self, arm, use_flat, get_slitview_obj): @pytest.mark.ghostslit @pytest.mark.parametrize("filename, results", SEEING_ESTIMATES) def test_seeing_estimate(filename, results, path_to_inputs): - ad = astrodata.open(os.path.join(path_to_inputs, filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, filename)) slitv_fn = get_polyfit_filename( None, 'slitv', ad.res_mode(), ad.ut_date(), None, 'slitvmod') sv = polyfit.slitview.SlitView( - ad[0].data, None, slitvpars=astrodata.open(slitv_fn).TABLE[0], + ad[0].data, None, slitvpars=astrodata.from_file(slitv_fn).TABLE[0], mode=ad.res_mode()) m = sv.model_profile(ad[0].data) for k, v in m.items(): diff --git a/geminidr/ghost/primitives_ghost_slit.py b/geminidr/ghost/primitives_ghost_slit.py index 64d8e2f568..f4434e2d66 100644 --- a/geminidr/ghost/primitives_ghost_slit.py +++ b/geminidr/ghost/primitives_ghost_slit.py @@ -641,7 +641,7 @@ def _total_obj_flux(log, res, ut_date, filename, data, flat_data=None, binning=2 slitv_fn = polyfit_lookup.get_polyfit_filename(log, 'slitv', res, ut_date, filename, 'slitvmod') - slitvpars = astrodata.open(slitv_fn) + slitvpars = astrodata.from_file(slitv_fn) svobj = SlitView(data, flat_data, slitvpars.TABLE[0], mode=res, microns_pix=4.54*180/50, binning=binning) # OK to pass None for flat reds = svobj.object_slit_profiles( diff --git a/geminidr/ghost/primitives_ghost_spect.py b/geminidr/ghost/primitives_ghost_spect.py index 8c89dd1ff1..212ab34863 100644 --- a/geminidr/ghost/primitives_ghost_spect.py +++ b/geminidr/ghost/primitives_ghost_spect.py @@ -155,9 +155,9 @@ def attachWavelengthSolution(self, adinputs=None, **params): arc_before_file = params["arc_before"] arc_after_file = params["arc_after"] if arc_before_file: - arc_before = astrodata.open(arc_before_file) + arc_before = astrodata.from_file(arc_before_file) if arc_after_file: - arc_after = astrodata.open(arc_after_file) + arc_after = astrodata.from_file(arc_after_file) input_frame = adwcs.pixel_frame(2) output_frame = cf.SpectralFrame(axes_order=(0,), unit=u.nm, @@ -1003,10 +1003,10 @@ def determineWavelengthSolution(self, adinputs=None, **params): poly_spat = self._get_polyfit_filename(ad, 'spatmod') poly_spec = self._get_polyfit_filename(ad, 'specmod') poly_rot = self._get_polyfit_filename(ad, 'rotmod') - wpars = astrodata.open(poly_wave) - spatpars = astrodata.open(poly_spat) - specpars = astrodata.open(poly_spec) - rotpars = astrodata.open(poly_rot) + wpars = astrodata.from_file(poly_wave) + spatpars = astrodata.from_file(poly_spat) + specpars = astrodata.from_file(poly_spec) + rotpars = astrodata.from_file(poly_rot) except IOError: log.warning("Cannot open required initial model files; " "skipping") @@ -1355,11 +1355,11 @@ def extractSpectra(self, adinputs=None, **params): poly_spec = self._get_polyfit_filename(ad, 'specmod') poly_rot = self._get_polyfit_filename(ad, 'rotmod') slitv_fn = self._get_slitv_polyfit_filename(ad) - wpars = astrodata.open(poly_wave) - spatpars = astrodata.open(poly_spat) - specpars = astrodata.open(poly_spec) - rotpars = astrodata.open(poly_rot) - slitvpars = astrodata.open(slitv_fn) + wpars = astrodata.from_file(poly_wave) + spatpars = astrodata.from_file(poly_spat) + specpars = astrodata.from_file(poly_spec) + rotpars = astrodata.from_file(poly_rot) + slitvpars = astrodata.from_file(slitv_fn) except IOError: log.warning("Cannot open required initial model files for {};" " skipping".format(ad.filename)) @@ -1728,11 +1728,11 @@ def measureBlaze(self, adinputs=None, **params): poly_spec = self._get_polyfit_filename(ad, 'specmod') poly_rot = self._get_polyfit_filename(ad, 'rotmod') slitv_fn = self._get_slitv_polyfit_filename(ad) - wpars = astrodata.open(poly_wave) - spatpars = astrodata.open(poly_spat) - specpars = astrodata.open(poly_spec) - rotpars = astrodata.open(poly_rot) - slitvpars = astrodata.open(slitv_fn) + wpars = astrodata.from_file(poly_wave) + spatpars = astrodata.from_file(poly_spat) + specpars = astrodata.from_file(poly_spec) + rotpars = astrodata.from_file(poly_rot) + slitvpars = astrodata.from_file(slitv_fn) except IOError: raise RuntimeError("Cannot open required initial model files; " "skipping") @@ -1853,11 +1853,11 @@ def removeScatteredLight(self, adinputs=None, **params): poly_spec = self._get_polyfit_filename(ad, 'specmod') poly_rot = self._get_polyfit_filename(ad, 'rotmod') slitv_fn = self._get_slitv_polyfit_filename(ad) - wpars = astrodata.open(poly_wave) - spatpars = astrodata.open(poly_spat) - specpars = astrodata.open(poly_spec) - rotpars = astrodata.open(poly_rot) - slitvpars = astrodata.open(slitv_fn) + wpars = astrodata.from_file(poly_wave) + spatpars = astrodata.from_file(poly_spat) + specpars = astrodata.from_file(poly_spec) + rotpars = astrodata.from_file(poly_rot) + slitvpars = astrodata.from_file(slitv_fn) except IOError: raise RuntimeError("Cannot open required initial model files; " "skipping") @@ -2292,9 +2292,9 @@ def traceFibers(self, adinputs=None, **params): log.stdinfo(f'Found spatmod: {poly_spat}') slitv_fn = self._get_slitv_polyfit_filename(ad) log.stdinfo(f'Found slitvmod: {slitv_fn}') - xpars = astrodata.open(poly_xmod) - spatpars = astrodata.open(poly_spat) - slitvpars = astrodata.open(slitv_fn) + xpars = astrodata.from_file(poly_xmod) + spatpars = astrodata.from_file(poly_spat) + slitvpars = astrodata.from_file(slitv_fn) except IOError: log.warning("Cannot open required initial model files; " "skipping") @@ -2341,9 +2341,9 @@ def traceFibers(self, adinputs=None, **params): poly_wave = self._get_polyfit_filename(ad, 'wavemod') poly_spec = self._get_polyfit_filename(ad, 'specmod') poly_rot = self._get_polyfit_filename(ad, 'rotmod') - wpars = astrodata.open(poly_wave) - specpars = astrodata.open(poly_spec) - rotpars = astrodata.open(poly_rot) + wpars = astrodata.from_file(poly_wave) + specpars = astrodata.from_file(poly_spec) + rotpars = astrodata.from_file(poly_rot) except IOError: log.warning("Cannot open required initial model files " "for PIXELMODEL; skipping") @@ -2493,7 +2493,7 @@ def _request_bracket_arc(self, ad, before=None): # If the arc is retrieved from user_cals then it will ignore 'ARCBEFOR' # and the same file will be returned twice, but we don't want that if arc_ad: - arc_ad = astrodata.open(arc_ad) + arc_ad = astrodata.from_file(arc_ad) correct_timing = before == (arc_ad.ut_datetime() < ad.ut_datetime()) return arc_ad if correct_timing else None return None diff --git a/geminidr/ghost/recipes/sq/tests/test_reduce_arc.py b/geminidr/ghost/recipes/sq/tests/test_reduce_arc.py index 75f965df4f..358798ac04 100644 --- a/geminidr/ghost/recipes/sq/tests/test_reduce_arc.py +++ b/geminidr/ghost/recipes/sq/tests/test_reduce_arc.py @@ -21,7 +21,7 @@ @pytest.fixture def input_filename(change_working_dir, request): with change_working_dir(): - ad = astrodata.open(download_from_archive(request.param)) + ad = astrodata.from_file(download_from_archive(request.param)) p = GHOSTBundle([ad]) adoutputs = p.splitBundle() return_dict = {} @@ -59,8 +59,8 @@ def test_reduce_arc(input_filename, caldict, arm, path_to_inputs, path_to_refs): makeProcessedArc(p) assert len(p.streams['main']) == 1 output_filename = p.streams['main'][0].filename - adout = astrodata.open(os.path.join("calibrations", "processed_arc", output_filename)) - adref = astrodata.open(os.path.join(path_to_refs, output_filename)) + adout = astrodata.from_file(os.path.join("calibrations", "processed_arc", output_filename)) + adref = astrodata.from_file(os.path.join(path_to_refs, output_filename)) # Changed timestamp kw from STCKARCS -> STACKARC and don't have time to # re-upload reference, so just add these to the "ignore" list assert ad_compare(adref, adout, ignore_kw=['PROCARC', 'STACKARC', 'STCKARCS']) diff --git a/geminidr/ghost/recipes/sq/tests/test_reduce_bias.py b/geminidr/ghost/recipes/sq/tests/test_reduce_bias.py index 47c1841197..5fa1981544 100644 --- a/geminidr/ghost/recipes/sq/tests/test_reduce_bias.py +++ b/geminidr/ghost/recipes/sq/tests/test_reduce_bias.py @@ -17,7 +17,7 @@ @pytest.fixture def input_filename(change_working_dir, request): with change_working_dir(): - ad = astrodata.open(download_from_archive(request.param)) + ad = astrodata.from_file(download_from_archive(request.param)) p = GHOSTBundle([ad]) adoutputs = p.splitBundle() return_dict = {} @@ -42,6 +42,6 @@ def test_reduce_bias(change_working_dir, path_to_inputs, input_filename, arm, pa makeProcessedBias(p) assert len(p.streams['main']) == 1 output_filename = p.streams['main'][0].filename - adout = astrodata.open(os.path.join("calibrations", "processed_bias", output_filename)) - adref = astrodata.open(os.path.join(path_to_refs, output_filename)) + adout = astrodata.from_file(os.path.join("calibrations", "processed_bias", output_filename)) + adref = astrodata.from_file(os.path.join(path_to_refs, output_filename)) assert ad_compare(adref, adout, ignore_kw=['PROCBIAS']) diff --git a/geminidr/ghost/recipes/sq/tests/test_reduce_flat.py b/geminidr/ghost/recipes/sq/tests/test_reduce_flat.py index b4386fd51f..b198096f59 100644 --- a/geminidr/ghost/recipes/sq/tests/test_reduce_flat.py +++ b/geminidr/ghost/recipes/sq/tests/test_reduce_flat.py @@ -20,7 +20,7 @@ @pytest.fixture def input_filename(change_working_dir, request): with change_working_dir(): - ad = astrodata.open(download_from_archive(request.param)) + ad = astrodata.from_file(download_from_archive(request.param)) p = GHOSTBundle([ad]) adoutputs = p.splitBundle() return_dict = {} @@ -55,8 +55,8 @@ def test_reduce_flat(change_working_dir, input_filename, bias, arm, makeProcessedFlat(p) assert len(p.streams['main']) == 1 output_filename = p.streams['main'][0].filename - adout = astrodata.open(os.path.join("calibrations", "processed_flat", output_filename)) - adref = astrodata.open(os.path.join(path_to_refs, output_filename)) + adout = astrodata.from_file(os.path.join("calibrations", "processed_flat", output_filename)) + adref = astrodata.from_file(os.path.join(path_to_refs, output_filename)) assert ad_compare(adref, adout, ignore_kw=['PROCFLAT']) # Comparison doesn't include "exotic" extensions diff --git a/geminidr/ghost/recipes/sq/tests/test_reduce_sci.py b/geminidr/ghost/recipes/sq/tests/test_reduce_sci.py index 9e0f21b5f2..555485828d 100644 --- a/geminidr/ghost/recipes/sq/tests/test_reduce_sci.py +++ b/geminidr/ghost/recipes/sq/tests/test_reduce_sci.py @@ -22,7 +22,7 @@ @pytest.fixture def input_filename(change_working_dir, request): with change_working_dir(): - ad = astrodata.open(download_from_archive(request.param)) + ad = astrodata.from_file(download_from_archive(request.param)) p = GHOSTBundle([ad]) adoutputs = p.splitBundle() return_dict = {} @@ -80,16 +80,16 @@ def test_reduce_science(input_filename, caldict, arm, skysub, path_to_inputs, assert len(p.streams['main']) == 1 p.writeOutputs() output_filename = p.streams['main'][0].filename - adout = astrodata.open(output_filename) - adref = astrodata.open(os.path.join( + adout = astrodata.from_file(output_filename) + adref = astrodata.from_file(os.path.join( path_to_refs, f"skysub_{skysub}", output_filename)) assert ad_compare(adref, adout, ignore_kw=['ARCIM_A', 'ARCIM_B', 'PROCSCI'], atol=1e-14, max_miss=1) # Now compare the _calibrated.fits files (not order-combined) intermediate_filename = output_filename.replace("_dragons", "_calibrated") - adout = astrodata.open(os.path.join(path_to_outputs, "outputs", intermediate_filename)) - adref = astrodata.open(os.path.join( + adout = astrodata.from_file(os.path.join(path_to_outputs, "outputs", intermediate_filename)) + adref = astrodata.from_file(os.path.join( path_to_refs, f"skysub_{skysub}", intermediate_filename)) assert ad_compare(adref, adout, ignore_kw=['ARCIM_A', 'ARCIM_B', 'PROCSCI'], atol=1e-14, max_miss=1) diff --git a/geminidr/ghost/recipes/sq/tests/test_reduce_slit.py b/geminidr/ghost/recipes/sq/tests/test_reduce_slit.py index 3323d84012..94e8c87426 100644 --- a/geminidr/ghost/recipes/sq/tests/test_reduce_slit.py +++ b/geminidr/ghost/recipes/sq/tests/test_reduce_slit.py @@ -27,13 +27,13 @@ @pytest.mark.parametrize("input_filename", bias_datasets) def test_reduce_slit_bias(input_filename, path_to_inputs, path_to_refs, change_working_dir): """Test the complete reduction of slitviewer bias frames""" - ad = astrodata.open(os.path.join(path_to_inputs, input_filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, input_filename)) p = GHOSTSlit([ad]) with change_working_dir(): makeProcessedSlitBias(p) output_filename = p.streams['main'][0].filename - adout = astrodata.open(os.path.join("calibrations", "processed_bias", output_filename)) - adref = astrodata.open(os.path.join(path_to_refs, output_filename)) + adout = astrodata.from_file(os.path.join("calibrations", "processed_bias", output_filename)) + adref = astrodata.from_file(os.path.join(path_to_refs, output_filename)) assert ad_compare(adref, adout, ignore_kw=['PROCBIAS']) @@ -43,15 +43,15 @@ def test_reduce_slit_bias(input_filename, path_to_inputs, path_to_refs, change_w def test_reduce_slit_flat(input_filename, processed_bias, path_to_inputs, path_to_refs, change_working_dir): """Test the complete reduction of slitviewer flat frames""" - ad = astrodata.open(os.path.join(path_to_inputs, input_filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, input_filename)) processed_bias = os.path.join(path_to_inputs, processed_bias) ucals = {"processed_bias": processed_bias} p = GHOSTSlit([ad], ucals=ucals) with change_working_dir(): makeProcessedSlitFlat(p) output_filename = p.streams['main'][0].filename - adout = astrodata.open(os.path.join("calibrations", "processed_slitflat", output_filename)) - adref = astrodata.open(os.path.join(path_to_refs, output_filename)) + adout = astrodata.from_file(os.path.join("calibrations", "processed_slitflat", output_filename)) + adref = astrodata.from_file(os.path.join(path_to_refs, output_filename)) assert ad_compare(adref, adout, ignore_kw=['PRSLITFL']) @@ -61,15 +61,15 @@ def test_reduce_slit_flat(input_filename, processed_bias, path_to_inputs, def test_reduce_slit_arc(input_filename, caldict, path_to_inputs, path_to_refs, change_working_dir): """Test the complete reduction of slitviewer arc frames""" - ad = astrodata.open(os.path.join(path_to_inputs, input_filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, input_filename)) ucals = {k: os.path.join(path_to_inputs, v) for k, v in caldict.items()} p = GHOSTSlit([ad], ucals=ucals) with change_working_dir(): makeProcessedSlitArc(p) output_filename = p.streams['main'][0].filename - adout = astrodata.open(os.path.join("calibrations", "processed_slit", output_filename)) - adref = astrodata.open(os.path.join(path_to_refs, output_filename)) + adout = astrodata.from_file(os.path.join("calibrations", "processed_slit", output_filename)) + adref = astrodata.from_file(os.path.join(path_to_refs, output_filename)) assert ad_compare(adref, adout, ignore_kw=['PRSLITIM']) @@ -79,13 +79,13 @@ def test_reduce_slit_arc(input_filename, caldict, path_to_inputs, def test_reduce_slit_science(input_filename, caldict, path_to_inputs, path_to_refs, change_working_dir): """Test the complete reduction of slitviewer science frames""" - ad = astrodata.open(os.path.join(path_to_inputs, input_filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, input_filename)) ucals = {k: os.path.join(path_to_inputs, v) for k, v in caldict.items()} p = GHOSTSlit([ad], ucals=ucals) with change_working_dir(): makeProcessedSlit(p) for output_filename in [ad.filename for ad in p.streams['main']]: - adout = astrodata.open(os.path.join("calibrations", "processed_slit", output_filename)) - adref = astrodata.open(os.path.join(path_to_refs, output_filename)) + adout = astrodata.from_file(os.path.join("calibrations", "processed_slit", output_filename)) + adref = astrodata.from_file(os.path.join(path_to_refs, output_filename)) assert ad_compare(adref, adout, ignore_kw=['PRSLITIM']) diff --git a/geminidr/ghost/tests/bundle/test_split_bundle.py b/geminidr/ghost/tests/bundle/test_split_bundle.py index 976aa80e1f..83865b6f7e 100644 --- a/geminidr/ghost/tests/bundle/test_split_bundle.py +++ b/geminidr/ghost/tests/bundle/test_split_bundle.py @@ -24,7 +24,7 @@ def test_split_bundle(change_working_dir, path_to_refs): S20230214S0025 has 1 blue, 3 red, and 5 slit images """ with change_working_dir(): - ad = astrodata.open(download_from_archive("S20230214S0025.fits")) + ad = astrodata.from_file(download_from_archive("S20230214S0025.fits")) p = GHOSTBundle([ad]) p.splitBundle() @@ -47,5 +47,5 @@ def test_split_bundle(change_working_dir, path_to_refs): assert len(sciexp) == 4 for adout in blue_files + red_files + slit_files: - adref = astrodata.open(os.path.join(path_to_refs, adout.filename)) + adref = astrodata.from_file(os.path.join(path_to_refs, adout.filename)) assert ad_compare(adref, adout, ignore_kw=['GHOSTDR']) diff --git a/geminidr/ghost/tests/slit/__init__.py b/geminidr/ghost/tests/slit/__init__.py index c774ab7552..bc77fc5341 100644 --- a/geminidr/ghost/tests/slit/__init__.py +++ b/geminidr/ghost/tests/slit/__init__.py @@ -66,7 +66,7 @@ def ad_slit(): # scale by fluxes slitv_fn = polyfit_lookup.get_polyfit_filename( None, 'slitv', 'std', ad.ut_date(), ad.filename, 'slitvmod') - slitvpars = astrodata.open(slitv_fn) + slitvpars = astrodata.from_file(slitv_fn) sview = SlitView(None, None, slitvpars.TABLE[0], mode=ad.res_mode()) slit_data = sview.fake_slitimage(seeing=0.7) for ext in ad: diff --git a/geminidr/ghost/tests/spect/test_combine_orders.py b/geminidr/ghost/tests/spect/test_combine_orders.py index dbe6b05fc0..eac0033a03 100644 --- a/geminidr/ghost/tests/spect/test_combine_orders.py +++ b/geminidr/ghost/tests/spect/test_combine_orders.py @@ -19,7 +19,7 @@ @pytest.mark.parametrize("filename", FILENAMES) def test_combine_orders_single_file(change_working_dir, path_to_inputs, filename): """Check that combineOrders() works on a single file""" - ad = astrodata.open(os.path.join(path_to_inputs, filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, filename)) orig_wavl = make_wavelength_table(ad[0]) p = GHOSTSpect([ad]) ad_out = p.combineOrders().pop() @@ -31,14 +31,14 @@ def test_combine_orders_single_file(change_working_dir, path_to_inputs, filename # Check that we can write and read back the _ordersCombined file with change_working_dir(): ad_out.write("test.fits", overwrite=True) - ad2 = astrodata.open("test.fits") + ad2 = astrodata.from_file("test.fits") np.testing.assert_allclose(ad_out[0].wcs(pixels), ad2[0].wcs(pixels)) @pytest.mark.ghostspect def test_combine_orders_red_and_blue_no_stacking(path_to_inputs): """Check that combineOrders() works on red and blue files with stacking""" - adinputs = [astrodata.open(os.path.join(path_to_inputs, filename)) + adinputs = [astrodata.from_file(os.path.join(path_to_inputs, filename)) for filename in FILENAMES] p = GHOSTSpect(adinputs) adoutputs = p.combineOrders(stacking_mode="none") @@ -54,7 +54,7 @@ def test_combine_orders_red_and_blue_no_stacking(path_to_inputs): @pytest.mark.parametrize("stacking_mode", ("scaled", "unscaled")) def test_combine_orders_red_and_blue_stacking(path_to_inputs, stacking_mode): """Check that combineOrders() works on red and blue files with stacking""" - adinputs = [astrodata.open(os.path.join(path_to_inputs, filename)) + adinputs = [astrodata.from_file(os.path.join(path_to_inputs, filename)) for filename in FILENAMES] orig_wavl = np.array([make_wavelength_table(ad[0]).min() for ad in adinputs]) @@ -74,7 +74,7 @@ def test_combine_orders_red_and_blue_stacking(path_to_inputs, stacking_mode): @pytest.mark.parametrize("stacking_mode", ("scaled", "unscaled")) def test_combine_orders_one_arm_stacking(path_to_inputs, stacking_mode): """Check that combineOrders() stacks files from one arm""" - adinputs = [astrodata.open(os.path.join(path_to_inputs, FILENAMES[0])) * 2] + adinputs = [astrodata.from_file(os.path.join(path_to_inputs, FILENAMES[0])) * 2] orig_wavl = np.array([make_wavelength_table(ad[0]).min() for ad in adinputs]) p = GHOSTSpect(adinputs) diff --git a/geminidr/ghost/tests/spect/test_extract_spectra.py b/geminidr/ghost/tests/spect/test_extract_spectra.py index d5573d9770..83b90d526f 100644 --- a/geminidr/ghost/tests/spect/test_extract_spectra.py +++ b/geminidr/ghost/tests/spect/test_extract_spectra.py @@ -13,7 +13,7 @@ def test_synthetic_slit_profile(path_to_inputs): with a synthetic slit profile. The output is not checked""" sci_filename = "S20230513S0229_red001_arraysTiled.fits" raw_flat_filename = "S20230511S0035.fits" - ad = astrodata.open(os.path.join(path_to_inputs, sci_filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, sci_filename)) arm = ad.arm() processed_flat = os.path.join( path_to_inputs, diff --git a/geminidr/ghost/tests/spect/test_flux_calibrate.py b/geminidr/ghost/tests/spect/test_flux_calibrate.py index 7e1e698c46..ac96e06398 100644 --- a/geminidr/ghost/tests/spect/test_flux_calibrate.py +++ b/geminidr/ghost/tests/spect/test_flux_calibrate.py @@ -31,11 +31,11 @@ def test_flux_calibrate_binning(path_to_inputs, std_filenames): for sci_filename in std_filenames: outputs = {} for std_filename in std_filenames: - ad_sci = astrodata.open(os.path.join(path_to_inputs, sci_filename)) + ad_sci = astrodata.from_file(os.path.join(path_to_inputs, sci_filename)) arm = ad_sci.arm() sci_xbin, sci_ybin = ad_sci.detector_x_bin(), ad_sci.detector_y_bin() p = GHOSTSpect([ad_sci]) - ad_std = astrodata.open(os.path.join(path_to_inputs, std_filename)) + ad_std = astrodata.from_file(os.path.join(path_to_inputs, std_filename)) xbin, ybin = ad_std.detector_x_bin(), ad_std.detector_y_bin() outputs[(xbin, ybin)] = p.fluxCalibrate(standard=ad_std).pop() diff --git a/geminidr/ghost/utils/mkspatmod.py b/geminidr/ghost/utils/mkspatmod.py index b393984462..42581a6a84 100644 --- a/geminidr/ghost/utils/mkspatmod.py +++ b/geminidr/ghost/utils/mkspatmod.py @@ -19,9 +19,9 @@ def get_fibre_separation(p): ad, ad_slitflat = p.streams['main'] #p.getProcessedSlitFlat(refresh=False) #slitflat = p._get_cal(ad, 'processed_slitflat') - #ad_slitflat = astrodata.open(slitflat) + #ad_slitflat = astrodata.from_file(slitflat) slitv_fn = p._get_slitv_polyfit_filename(ad) - slitvpars = astrodata.open(slitv_fn) + slitvpars = astrodata.from_file(slitv_fn) sv = SlitView(None, ad_slitflat[0].data, slitvpars.TABLE[0], mode=ad.res_mode()) slit_models = sv.model_profile(flat_image=ad_slitflat[0].data) @@ -36,7 +36,7 @@ def get_xpars(p): ad = p.streams['main'][0] poly_xmod = p._get_polyfit_filename(ad, 'xmod') print(f"Using XMOD {poly_xmod}") - xpars = astrodata.open(poly_xmod) + xpars = astrodata.from_file(poly_xmod) return xpars[0].data @@ -45,7 +45,7 @@ def get_initial_spatmod(p): ad = p.streams['main'][0] poly_spat = p._get_polyfit_filename(ad, 'spatmod') print(f"Using SPATMOD {poly_spat}") - spatpars = astrodata.open(poly_spat) + spatpars = astrodata.from_file(poly_spat) return spatpars[0].data @@ -229,8 +229,8 @@ def main(ad, ad_slitflat, flat_bin=8): slitflat_filename = sys.argv[2] except IndexError: print("Usage: mkspatmod.py ") - flat = astrodata.open(flat_filename) - slitflat = astrodata.open(slitflat_filename) + flat = astrodata.from_file(flat_filename) + slitflat = astrodata.from_file(slitflat_filename) assert ({'FLAT', 'PROCESSED'}.issubset(flat.tags) and 'SLIT' not in flat.tags), f"{flat.filename} is not a FLAT" assert flat.res_mode() == "std", "Must be run on SR data" diff --git a/geminidr/gmos/lookups/bpmtab.py b/geminidr/gmos/lookups/bpmtab.py index 3d5393ad93..6f3d8dd31d 100644 --- a/geminidr/gmos/lookups/bpmtab.py +++ b/geminidr/gmos/lookups/bpmtab.py @@ -138,7 +138,7 @@ def tabl(ffiles): print(header) ffiles.sort() for ff in ffiles: - ad = astrodata.open(ff) + ad = astrodata.from_file(ff) fname = os.path.split(ff)[-1] if len(fname) < 25: print(rows.format( diff --git a/geminidr/gmos/primitives_gmos.py b/geminidr/gmos/primitives_gmos.py index 7e987b3126..46d3bc322b 100644 --- a/geminidr/gmos/primitives_gmos.py +++ b/geminidr/gmos/primitives_gmos.py @@ -178,7 +178,7 @@ def standardizeInstrumentHeaders(self, adinputs=None, suffix=None): # # When we create the new AD object, it needs to retain the # # filename information # orig_path = ad.path - # ad = astrodata.open(hdulist) + # ad = astrodata.from_file(hdulist) # ad.path = orig_path # KL Commissioning GMOS-N Hamamatsu. Headers are not fully diff --git a/geminidr/gmos/recipes/qa/tests/test_flat_image.py b/geminidr/gmos/recipes/qa/tests/test_flat_image.py index 2d7822745d..69904a260f 100755 --- a/geminidr/gmos/recipes/qa/tests/test_flat_image.py +++ b/geminidr/gmos/recipes/qa/tests/test_flat_image.py @@ -117,7 +117,7 @@ def mock_get_processed_bpm(orig, self, adinputs, caltype, *args, **kwargs): shutil.rmtree('calibrations/') [os.remove(f) for f in glob.glob('*_forStack.fits')] - ad = astrodata.open(r.output_filenames[0]) + ad = astrodata.from_file(r.output_filenames[0]) for ext in ad: data = np.ma.masked_array(ext.data, mask=ext.mask) @@ -198,7 +198,7 @@ def create_master_bias_for_tests(): paths = [download_from_archive(f) for f in filenames] f = paths[0] - ad = astrodata.open(f) + ad = astrodata.from_file(f) if not os.path.exists(f.replace('.fits', '_bias.fits')): print(f" Creating input file:\n") diff --git a/geminidr/gmos/recipes/ql/tests/test_flat_ls_spect.py b/geminidr/gmos/recipes/ql/tests/test_flat_ls_spect.py index b3a10afe71..5ab8bcc696 100644 --- a/geminidr/gmos/recipes/ql/tests/test_flat_ls_spect.py +++ b/geminidr/gmos/recipes/ql/tests/test_flat_ls_spect.py @@ -181,7 +181,7 @@ def mock_get_processed_bpm(orig, self, adinputs, caltype, *args, **kwargs): flat_filename = request.param flat_path = download_from_archive(flat_filename) - flat_raw = astrodata.open(flat_path) + flat_raw = astrodata.from_file(flat_path) master_bias = os.path.join(path_to_inputs, associated_calibrations[flat_filename]) calibration_files = ['processed_bias:{}'.format(master_bias)] @@ -201,7 +201,7 @@ def mock_get_processed_bpm(orig, self, adinputs, caltype, *args, **kwargs): shutil.rmtree('calibrations/') _processed_flat_filename = reduce.output_filenames.pop() - _processed_flat = astrodata.open(_processed_flat_filename) + _processed_flat = astrodata.from_file(_processed_flat_filename) return _processed_flat @@ -261,7 +261,7 @@ def create_master_bias_for_tests(): print('Downloading files...') sci_path = download_from_archive(filename) - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() bias_paths = [download_from_archive(f) for f in bias_files] diff --git a/geminidr/gmos/recipes/sq/tests/test_make_processed_slit_illum.py b/geminidr/gmos/recipes/sq/tests/test_make_processed_slit_illum.py index f03e670697..0b1505e92b 100644 --- a/geminidr/gmos/recipes/sq/tests/test_make_processed_slit_illum.py +++ b/geminidr/gmos/recipes/sq/tests/test_make_processed_slit_illum.py @@ -62,7 +62,7 @@ def processed_slit_illum(change_working_dir, path_to_inputs, request): """ twi_filename = request.param twi_path = download_from_archive(twi_filename) - twi_ad = astrodata.open(twi_path) + twi_ad = astrodata.from_file(twi_path) print(twi_ad.tags) @@ -86,7 +86,7 @@ def processed_slit_illum(change_working_dir, path_to_inputs, request): reduce.runr() _processed_twi_filename = reduce.output_filenames.pop() - _processed_twi = astrodata.open(_processed_twi_filename) + _processed_twi = astrodata.from_file(_processed_twi_filename) return _processed_twi diff --git a/geminidr/gmos/recipes/sq/tests/test_separate_ccd_reduction.py b/geminidr/gmos/recipes/sq/tests/test_separate_ccd_reduction.py index ec506d13a8..779c00d8cc 100644 --- a/geminidr/gmos/recipes/sq/tests/test_separate_ccd_reduction.py +++ b/geminidr/gmos/recipes/sq/tests/test_separate_ccd_reduction.py @@ -37,7 +37,7 @@ def test_separate_ccd_reduction_astrometry(change_working_dir): r.recipename = recipe_name r.suffix = f"_{recipe_name}" r.runr() - adoutputs.append(astrodata.open(r._output_filenames[0])) + adoutputs.append(astrodata.from_file(r._output_filenames[0])) p = GMOSImage(adoutputs) p.detectSources() diff --git a/geminidr/gmos/tests/image/test_add_oiwfs_to_dq.py b/geminidr/gmos/tests/image/test_add_oiwfs_to_dq.py index de4248ebba..d83dd83088 100644 --- a/geminidr/gmos/tests/image/test_add_oiwfs_to_dq.py +++ b/geminidr/gmos/tests/image/test_add_oiwfs_to_dq.py @@ -26,7 +26,7 @@ def test_oiwfs_not_used_in_observation(caplog, filename): """ caplog.set_level(logging.DEBUG) file_path = download_from_archive(filename) - ad = astrodata.open(file_path) + ad = astrodata.from_file(file_path) p = GMOSImage([ad]) p.addOIWFSToDQ() @@ -50,7 +50,7 @@ def test_warn_if_dq_does_not_exist(caplog, filename): """ caplog.set_level(logging.DEBUG) file_path = download_from_archive(filename) - ad = astrodata.open(file_path) + ad = astrodata.from_file(file_path) p = GMOSImage([ad]) p.addOIWFSToDQ() @@ -74,7 +74,7 @@ def test_add_oiwfs_runs_normally(caplog, ext_num, filename, x0, y0): """ caplog.set_level(logging.DEBUG) file_path = download_from_archive(filename) - ad = astrodata.open(file_path) + ad = astrodata.from_file(file_path) p = GMOSImage([ad]) p.addDQ() @@ -114,7 +114,7 @@ def test_add_oiwfs_warns_when_wfs_if_not_in_field(caplog, filename): """ caplog.set_level(logging.DEBUG) file_path = download_from_archive(filename) - ad = astrodata.open(file_path) + ad = astrodata.from_file(file_path) p = GMOSImage([ad]) p.addDQ() diff --git a/geminidr/gmos/tests/longslit/test_add_illum_mask.py b/geminidr/gmos/tests/longslit/test_add_illum_mask.py index 1c654dd17a..3fafc84ff0 100644 --- a/geminidr/gmos/tests/longslit/test_add_illum_mask.py +++ b/geminidr/gmos/tests/longslit/test_add_illum_mask.py @@ -22,7 +22,7 @@ @pytest.mark.parametrize("filename,start_row", datasets_and_locations) def test_add_illum_mask_position(filename, start_row): file_on_disk = download_from_archive(filename) - ad = astrodata.open(file_on_disk) + ad = astrodata.from_file(file_on_disk) p = GMOSLongslit([ad]) p.prepare() @@ -41,7 +41,7 @@ def test_add_illum_mask_position(filename, start_row): @pytest.mark.gmosls def test_add_illum_mask_position_amp5(path_to_inputs, path_to_common_inputs): """Test of bad-amp5 GMOS-S data""" - adinputs = [astrodata.open(os.path.join( + adinputs = [astrodata.from_file(os.path.join( path_to_inputs, f"S20220927S{i:04d}_prepared.fits")) for i in (190, 191)] bpmfile = os.path.join(path_to_common_inputs, diff --git a/geminidr/gmos/tests/longslit/test_flat_correct.py b/geminidr/gmos/tests/longslit/test_flat_correct.py index 783adc8364..6e44be2daa 100644 --- a/geminidr/gmos/tests/longslit/test_flat_correct.py +++ b/geminidr/gmos/tests/longslit/test_flat_correct.py @@ -28,7 +28,7 @@ def ad(path_to_inputs, request): """Return AD object in input directory""" path = os.path.join(path_to_inputs, request.param) if os.path.exists(path): - return astrodata.open(path) + return astrodata.from_file(path) raise FileNotFoundError(path) diff --git a/geminidr/gmos/tests/longslit/test_make_slit_illum.py b/geminidr/gmos/tests/longslit/test_make_slit_illum.py index 58b6ad2492..c291d8891f 100755 --- a/geminidr/gmos/tests/longslit/test_make_slit_illum.py +++ b/geminidr/gmos/tests/longslit/test_make_slit_illum.py @@ -287,7 +287,7 @@ def test_split_mosaic_into_extensions_metadata(filename): """ Tests that the metadata is correctly propagated to the split object. """ - ad = astrodata.open(download_from_archive(filename)) + ad = astrodata.from_file(download_from_archive(filename)) p = primitives_gmos_longslit.GMOSLongslit([ad]) p.prepare() @@ -328,7 +328,7 @@ def ad(request, path_to_inputs): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -388,7 +388,7 @@ def create_inputs_recipe(): twilight_path = [download_from_archive(f) for f in cals['twilight']] bias_path = [download_from_archive(f) for f in cals['bias']] - twilight_ad = astrodata.open(twilight_path[0]) + twilight_ad = astrodata.from_file(twilight_path[0]) data_label = twilight_ad.data_label() print('Reducing BIAS for {:s}'.format(data_label)) @@ -406,7 +406,7 @@ def create_inputs_recipe(): warnings.simplefilter("ignore") p = primitives_gmos_longslit.GMOSLongslit( - [astrodata.open(f) for f in twilight_path]) + [astrodata.from_file(f) for f in twilight_path]) p.prepare() p.addDQ(static_bpm=None) diff --git a/geminidr/gmos/tests/longslit/test_slit_illum_correct.py b/geminidr/gmos/tests/longslit/test_slit_illum_correct.py index b17dd048c3..d8bca20d3f 100755 --- a/geminidr/gmos/tests/longslit/test_slit_illum_correct.py +++ b/geminidr/gmos/tests/longslit/test_slit_illum_correct.py @@ -171,7 +171,7 @@ def _load_file(filename): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - _ad = astrodata.open(path) + _ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -310,7 +310,7 @@ def create_twilight_inputs(): bias_path = [download_from_archive(f) for f in cals['bias']] twilight_path = [download_from_archive(f) for f in cals['twilight']] - twilight_ad = astrodata.open(twilight_path[0]) + twilight_ad = astrodata.from_file(twilight_path[0]) data_label = twilight_ad.data_label() print('Reducing BIAS for {:s}'.format(data_label)) @@ -326,7 +326,7 @@ def create_twilight_inputs(): with warnings.catch_warnings(): warnings.simplefilter("ignore") p = GMOSLongslit( - [astrodata.open(f) for f in twilight_path]) + [astrodata.from_file(f) for f in twilight_path]) p.prepare() p.addDQ(static_bpm=None) p.addVAR(read_noise=True) @@ -384,7 +384,7 @@ def create_quartz_inputs(): print('Download raw files') quartz_path = [download_from_archive(f) for f in cals['quartz']] - quartz_ad = astrodata.open(quartz_path[0]) + quartz_ad = astrodata.from_file(quartz_path[0]) data_label = quartz_ad.data_label() print('Reducing quartz lamp:') @@ -392,7 +392,7 @@ def create_quartz_inputs(): with warnings.catch_warnings(): warnings.simplefilter("ignore") p = GMOSLongslit( - [astrodata.open(f) for f in quartz_path]) + [astrodata.from_file(f) for f in quartz_path]) p.prepare() p.addDQ(static_bpm=None) p.addVAR(read_noise=True) diff --git a/geminidr/gmos/tests/longslit/test_wavelength_propagation_stability.py b/geminidr/gmos/tests/longslit/test_wavelength_propagation_stability.py index c7dda288c6..387647b997 100644 --- a/geminidr/gmos/tests/longslit/test_wavelength_propagation_stability.py +++ b/geminidr/gmos/tests/longslit/test_wavelength_propagation_stability.py @@ -95,7 +95,7 @@ def compare_peaks(ad, y, ref_peaks, fwidth=4, dw=1): assert abs(mean) < 0.1 * dw with change_working_dir(): - ad_sci = astrodata.open(os.path.join(path_to_inputs, science)) + ad_sci = astrodata.from_file(os.path.join(path_to_inputs, science)) p = GMOSLongslit([ad_sci]) p.prepare() p.addDQ() @@ -105,10 +105,10 @@ def compare_peaks(ad, y, ref_peaks, fwidth=4, dw=1): p.addVAR(poisson_noise=True) if save_and_reload: p.writeOutputs() - ad_sci = astrodata.open(ad_sci.filename) + ad_sci = astrodata.from_file(ad_sci.filename) p = GMOSLongslit([ad_sci]) - ad_arc = astrodata.open(os.path.join(path_to_inputs, arc)) + ad_arc = astrodata.from_file(os.path.join(path_to_inputs, arc)) wtable = ad_arc[0].WAVECAL arc_wave_peaks = wtable["wavelengths"] fwidth = wtable["coefficients"][list(wtable["name"]).index("fwidth")] diff --git a/geminidr/gmos/tests/nodandshuffle/test_combine_nod_and_shuffle_beams.py b/geminidr/gmos/tests/nodandshuffle/test_combine_nod_and_shuffle_beams.py index c0c6d3a46d..fdc20a880c 100644 --- a/geminidr/gmos/tests/nodandshuffle/test_combine_nod_and_shuffle_beams.py +++ b/geminidr/gmos/tests/nodandshuffle/test_combine_nod_and_shuffle_beams.py @@ -32,5 +32,5 @@ def ad(path_to_inputs, request): """Return AD object in input directory""" path = os.path.join(path_to_inputs, request.param) if os.path.exists(path): - return astrodata.open(path) + return astrodata.from_file(path) raise FileNotFoundError(path) diff --git a/geminidr/gmos/tests/nodandshuffle/test_dark_nod_and_shuffle.py b/geminidr/gmos/tests/nodandshuffle/test_dark_nod_and_shuffle.py index e3226b83bc..0a19cc6024 100644 --- a/geminidr/gmos/tests/nodandshuffle/test_dark_nod_and_shuffle.py +++ b/geminidr/gmos/tests/nodandshuffle/test_dark_nod_and_shuffle.py @@ -39,5 +39,5 @@ def ad(path_to_inputs, request): """Return AD object in input directory""" path = os.path.join(path_to_inputs, request.param) if os.path.exists(path): - return astrodata.open(path) + return astrodata.from_file(path) raise FileNotFoundError(path) diff --git a/geminidr/gmos/tests/plots_gmos_spect_longslit_arcs.py b/geminidr/gmos/tests/plots_gmos_spect_longslit_arcs.py index 9b46c7a921..18cd5bec72 100644 --- a/geminidr/gmos/tests/plots_gmos_spect_longslit_arcs.py +++ b/geminidr/gmos/tests/plots_gmos_spect_longslit_arcs.py @@ -137,8 +137,8 @@ def distortion_diagnosis_plots(self): output_file = os.path.join(self.output_folder, self.name + ".fits") reference_file = os.path.join(self.ref_folder, self.name + ".fits") - ad = astrodata.open(output_file) - ad_ref = astrodata.open(reference_file) + ad = astrodata.from_file(output_file) + ad_ref = astrodata.from_file(reference_file) self.show_distortion_map(ad) self.show_distortion_model_difference(ad, ad_ref) diff --git a/geminidr/gmos/tests/spect/test_adjust_wcs_to_reference.py b/geminidr/gmos/tests/spect/test_adjust_wcs_to_reference.py index bb917cb172..b2ab69a28d 100644 --- a/geminidr/gmos/tests/spect/test_adjust_wcs_to_reference.py +++ b/geminidr/gmos/tests/spect/test_adjust_wcs_to_reference.py @@ -33,7 +33,7 @@ def test_adjust_wcs_with_correlation(files, path_to_inputs, caplog): in test_resample_2d.py """ caplog.set_level(20) - adinputs = [astrodata.open(os.path.join(path_to_inputs, f)) for f in files] + adinputs = [astrodata.from_file(os.path.join(path_to_inputs, f)) for f in files] pixel_scale = adinputs[0].pixel_scale() centers = [ad[0].APERTURE['c0'][0] for ad in adinputs] diff --git a/geminidr/gmos/tests/spect/test_attach_wavelength_solution.py b/geminidr/gmos/tests/spect/test_attach_wavelength_solution.py index 2cc272dfff..5a043432a3 100644 --- a/geminidr/gmos/tests/spect/test_attach_wavelength_solution.py +++ b/geminidr/gmos/tests/spect/test_attach_wavelength_solution.py @@ -159,7 +159,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -189,7 +189,7 @@ def arc_ad(path_to_inputs, request): if os.path.exists(path): print(f"Reading input arc: {path}") - arc_ad = astrodata.open(path) + arc_ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -229,8 +229,8 @@ def create_inputs_recipe(): sci_path = download_from_archive(filename) arc_path = download_from_archive(cals['arc']) - sci_ad = astrodata.open(sci_path) - arc_ad = astrodata.open(arc_path) + sci_ad = astrodata.from_file(sci_path) + arc_ad = astrodata.from_file(arc_path) data_label = sci_ad.data_label() logutils.config(file_name='log_arc_{}.txt'.format(data_label)) diff --git a/geminidr/gmos/tests/spect/test_calculate_sensitivity.py b/geminidr/gmos/tests/spect/test_calculate_sensitivity.py index d95f958891..b840c3a375 100644 --- a/geminidr/gmos/tests/spect/test_calculate_sensitivity.py +++ b/geminidr/gmos/tests/spect/test_calculate_sensitivity.py @@ -162,7 +162,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -215,7 +215,7 @@ def create_inputs_recipe(): flat_path = [download_from_archive(f) for f in cals['flat']] arc_path = [download_from_archive(f) for f in cals['arcs']] - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() print('Reducing BIAS for {:s}'.format(data_label)) diff --git a/geminidr/gmos/tests/spect/test_cosmics.py b/geminidr/gmos/tests/spect/test_cosmics.py index 7b9f069b6b..d851f45967 100644 --- a/geminidr/gmos/tests/spect/test_cosmics.py +++ b/geminidr/gmos/tests/spect/test_cosmics.py @@ -21,7 +21,7 @@ @pytest.mark.preprocessed_data @pytest.mark.parametrize('bkgmodel', ['both', 'object', 'skyline', 'none']) def test_cosmics_on_mosaiced_data(path_to_inputs, caplog, bkgmodel): - ad = astrodata.open(os.path.join(path_to_inputs, TESFILE1)) + ad = astrodata.from_file(os.path.join(path_to_inputs, TESFILE1)) ext = ad[0] # add some additional fake cosmics @@ -62,7 +62,7 @@ def test_cosmics_on_mosaiced_data(path_to_inputs, caplog, bkgmodel): @pytest.mark.preprocessed_data @pytest.mark.parametrize('bkgmodel', ['both', 'object', 'skyline', 'none']) def test_cosmics(path_to_inputs, caplog, bkgmodel): - ad = astrodata.open(os.path.join(path_to_inputs, TESFILE2)) + ad = astrodata.from_file(os.path.join(path_to_inputs, TESFILE2)) for ext in ad: # add some additional fake cosmics @@ -124,7 +124,7 @@ def create_inputs_recipe(): print('Current working directory:\n {!s}'.format(path.cwd())) for fname in fnames: - sci_ad = astrodata.open(download_from_archive(fname)) + sci_ad = astrodata.from_file(download_from_archive(fname)) data_label = sci_ad.data_label() print('===== Reducing pre-processed data =====') diff --git a/geminidr/gmos/tests/spect/test_determine_distortion.py b/geminidr/gmos/tests/spect/test_determine_distortion.py index bfe150111d..d7c8bd0651 100644 --- a/geminidr/gmos/tests/spect/test_determine_distortion.py +++ b/geminidr/gmos/tests/spect/test_determine_distortion.py @@ -264,7 +264,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -475,7 +475,7 @@ def create_inputs_recipe(): print('Downloading files...') basename = filename.split("_")[0] + ".fits" sci_path = download_from_archive(basename) - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() print('Reducing pre-processed data:') diff --git a/geminidr/gmos/tests/spect/test_determine_wavelength_solution.py b/geminidr/gmos/tests/spect/test_determine_wavelength_solution.py index 4f9cf77467..757d44a55a 100644 --- a/geminidr/gmos/tests/spect/test_determine_wavelength_solution.py +++ b/geminidr/gmos/tests/spect/test_determine_wavelength_solution.py @@ -185,7 +185,7 @@ def test_regression_determine_wavelength_solution( if record.levelname == "WARNING": assert "No acceptable wavelength solution found" not in record.message - ref_ad = astrodata.open(os.path.join(path_to_refs, wcalibrated_ad.filename)) + ref_ad = astrodata.from_file(os.path.join(path_to_refs, wcalibrated_ad.filename)) model = am.get_named_submodel(wcalibrated_ad[0].wcs.forward_transform, "WAVE") ref_model = am.get_named_submodel(ref_ad[0].wcs.forward_transform, "WAVE") @@ -282,7 +282,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -460,7 +460,7 @@ def create_inputs_recipe(): print('Downloading files...') basename = filename.split("_")[0] + ".fits" sci_path = download_from_archive(basename) - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() print('Reducing pre-processed data:') diff --git a/geminidr/gmos/tests/spect/test_distortion_correct.py b/geminidr/gmos/tests/spect/test_distortion_correct.py index 9994f91d0b..8f87e41f4d 100644 --- a/geminidr/gmos/tests/spect/test_distortion_correct.py +++ b/geminidr/gmos/tests/spect/test_distortion_correct.py @@ -198,7 +198,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -240,8 +240,8 @@ def create_inputs_recipe(): flat_paths = [download_from_archive(f) for f in cals['flat']] arc_paths = [download_from_archive(f) for f in cals['arcs']] - sci_ad = astrodata.open(sci_path) - arc_ad = astrodata.open(arc_paths[0]) + sci_ad = astrodata.from_file(sci_path) + arc_ad = astrodata.from_file(arc_paths[0]) data_label = sci_ad.data_label() # is_ham = sci_ad.detector_name(pretty=True).startswith('Hamamatsu') diff --git a/geminidr/gmos/tests/spect/test_distortion_correct_with_wavelength_solution.py b/geminidr/gmos/tests/spect/test_distortion_correct_with_wavelength_solution.py index 5ac3b87544..ad643c0a15 100644 --- a/geminidr/gmos/tests/spect/test_distortion_correct_with_wavelength_solution.py +++ b/geminidr/gmos/tests/spect/test_distortion_correct_with_wavelength_solution.py @@ -209,7 +209,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -251,8 +251,8 @@ def create_inputs_recipe(): flat_paths = [download_from_archive(f) for f in cals['flat']] arc_paths = [download_from_archive(f) for f in cals['arcs']] - sci_ad = astrodata.open(sci_path) - arc_ad = astrodata.open(arc_paths[0]) + sci_ad = astrodata.from_file(sci_path) + arc_ad = astrodata.from_file(arc_paths[0]) data_label = sci_ad.data_label() logutils.config(file_name='log_bias_{}.txt'.format(data_label)) diff --git a/geminidr/gmos/tests/spect/test_extract_1d_spectra.py b/geminidr/gmos/tests/spect/test_extract_1d_spectra.py index f3953e1351..0bde70329a 100644 --- a/geminidr/gmos/tests/spect/test_extract_1d_spectra.py +++ b/geminidr/gmos/tests/spect/test_extract_1d_spectra.py @@ -112,7 +112,7 @@ def ad(request, path_to_inputs): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -206,7 +206,7 @@ def create_inputs_recipe(): print('Downloading files...') basename = filename.split("_")[0] + ".fits" sci_path = download_from_archive(basename) - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() arcs_path = [download_from_archive(f) for f in arcs_name] diff --git a/geminidr/gmos/tests/spect/test_find_source_apertures.py b/geminidr/gmos/tests/spect/test_find_source_apertures.py index ef8df4dc7d..2543c0ba24 100644 --- a/geminidr/gmos/tests/spect/test_find_source_apertures.py +++ b/geminidr/gmos/tests/spect/test_find_source_apertures.py @@ -177,7 +177,7 @@ def ad_and_center(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -214,7 +214,7 @@ def ad_center_tolerance_snr(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -259,7 +259,7 @@ def create_inputs_recipe(): sci_path = download_from_archive(sci_fname) arc_path = download_from_archive(arc_fname) - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() logutils.config(file_name='log_arc_{}.txt'.format(data_label)) diff --git a/geminidr/gmos/tests/spect/test_flux_calibration.py b/geminidr/gmos/tests/spect/test_flux_calibration.py index 60383e5905..5721e5b5b1 100644 --- a/geminidr/gmos/tests/spect/test_flux_calibration.py +++ b/geminidr/gmos/tests/spect/test_flux_calibration.py @@ -175,7 +175,7 @@ def ad(request, path_to_inputs): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -226,7 +226,7 @@ def create_inputs_recipe(): flat_path = [download_from_archive(f) for f in cals['flat']] arc_path = [download_from_archive(f) for f in cals['arcs']] - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() print('Reducing BIAS for {:s}'.format(data_label)) diff --git a/geminidr/gmos/tests/spect/test_qe_correct.py b/geminidr/gmos/tests/spect/test_qe_correct.py index d998887c5d..af2bde78cd 100644 --- a/geminidr/gmos/tests/spect/test_qe_correct.py +++ b/geminidr/gmos/tests/spect/test_qe_correct.py @@ -266,7 +266,7 @@ def ad(path_to_inputs, request): if os.path.exists(path): print(f"Reading input file: {path}") - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -296,7 +296,7 @@ def arc_ad(path_to_inputs, request): if os.path.exists(path): print(f"Reading input arc: {path}") - arc_ad = astrodata.open(path) + arc_ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -782,7 +782,7 @@ def create_inputs_recipe(use_branch_name=False): flat_paths = [download_from_archive(f) for f in cals['flat']] arc_paths = [download_from_archive(f) for f in cals['arcs']] - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() logutils.config(file_name='log_bias_{}.txt'.format(data_label)) diff --git a/geminidr/gmos/tests/spect/test_resample.py b/geminidr/gmos/tests/spect/test_resample.py index 98a1fbc9cd..6242574972 100644 --- a/geminidr/gmos/tests/spect/test_resample.py +++ b/geminidr/gmos/tests/spect/test_resample.py @@ -139,7 +139,7 @@ def input_ad_list(path_to_inputs): input_path = os.path.join(path_to_inputs, input_fname) if os.path.exists(input_path): - ad = astrodata.open(input_path) + ad = astrodata.from_file(input_path) else: raise FileNotFoundError(input_path) @@ -185,7 +185,7 @@ def create_inputs_recipe(): sci_path = download_from_archive(filename) arc_path = [download_from_archive(f) for f in cals['arcs']] - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() print('Reducing ARC for {:s}'.format(data_label)) diff --git a/geminidr/gmos/tests/spect/test_resample_2d.py b/geminidr/gmos/tests/spect/test_resample_2d.py index 001ef93f51..e1383c9e60 100644 --- a/geminidr/gmos/tests/spect/test_resample_2d.py +++ b/geminidr/gmos/tests/spect/test_resample_2d.py @@ -34,7 +34,7 @@ def test_simple_correlation_test(path_to_inputs, offset): """A simple correlation test that uses a single image, shifted, to avoid difficulties in centroiding. Placed here because it uses datasets and functions in this module""" - adinputs = [astrodata.open(os.path.join(path_to_inputs, test_datasets[0])) + adinputs = [astrodata.from_file(os.path.join(path_to_inputs, test_datasets[0])) for i in (0, 1, 2)] add_fake_offset(adinputs, offset=offset) p = GMOSLongslit(adinputs) @@ -162,13 +162,13 @@ def add_fake_offset(adinputs, offset=10): @pytest.fixture(scope='function') def adinputs(path_to_inputs): - return [astrodata.open(os.path.join(path_to_inputs, f)) + return [astrodata.from_file(os.path.join(path_to_inputs, f)) for f in test_datasets] @pytest.fixture(scope='function') def adinputs2(path_to_inputs): - return [astrodata.open(os.path.join(path_to_inputs, f)) + return [astrodata.from_file(os.path.join(path_to_inputs, f)) for f in test_datasets2] @@ -216,16 +216,16 @@ def create_inputs_recipe(): sci_path = download_from_archive(fname) arc_path = download_from_archive(arc_fname) - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() print('Reducing ARC for {:s}'.format(data_label)) logutils.config(file_name='log_arc_{}.txt'.format(data_label)) if os.path.exists(arc_fname.replace('.fits', '_distortionDetermined.fits')): - arc = astrodata.open(arc_fname.replace('.fits', '_distortionDetermined.fits')) + arc = astrodata.from_file(arc_fname.replace('.fits', '_distortionDetermined.fits')) else: - p = GMOSLongslit([astrodata.open(arc_path)]) + p = GMOSLongslit([astrodata.from_file(arc_path)]) p.prepare() p.addDQ(static_bpm=None) p.addVAR(read_noise=True) diff --git a/geminidr/gmos/tests/spect/test_sky_correct_from_slit.py b/geminidr/gmos/tests/spect/test_sky_correct_from_slit.py index 126eead1dd..14cea928f8 100644 --- a/geminidr/gmos/tests/spect/test_sky_correct_from_slit.py +++ b/geminidr/gmos/tests/spect/test_sky_correct_from_slit.py @@ -66,7 +66,7 @@ def test_regression_sky_correct_from_slit(filename, params, refname, path_to_refs): path = os.path.join(path_to_inputs, filename) - ad = astrodata.open(path) + ad = astrodata.from_file(path) with change_working_dir(): logutils.config(file_name=f'log_regression_{ad.data_label()}.txt') @@ -74,7 +74,7 @@ def test_regression_sky_correct_from_slit(filename, params, refname, p.skyCorrectFromSlit(**params) sky_subtracted_ad = p.writeOutputs(outfilename=refname).pop() - ref_ad = astrodata.open(os.path.join(path_to_refs, refname)) + ref_ad = astrodata.from_file(os.path.join(path_to_refs, refname)) # Require that <1% of unmasked pixels differ by >1 sigma for ext, ref_ext in zip(sky_subtracted_ad, ref_ad): @@ -121,7 +121,7 @@ def create_inputs_recipe(): sci_path = download_from_archive(filename) arc_path = download_from_archive(pars['arc']) - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() print('Reducing ARC for {:s}'.format(data_label)) diff --git a/geminidr/gmos/tests/spect/test_trace_apertures.py b/geminidr/gmos/tests/spect/test_trace_apertures.py index abe7d0b4c3..0e38151787 100755 --- a/geminidr/gmos/tests/spect/test_trace_apertures.py +++ b/geminidr/gmos/tests/spect/test_trace_apertures.py @@ -122,7 +122,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -168,7 +168,7 @@ def create_inputs_recipe(): print('Downloading files...') sci_path = download_from_archive(filename) - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() print('Reducing pre-processed data:') diff --git a/geminidr/gmos/tests/spect/test_write_1d_spectra.py b/geminidr/gmos/tests/spect/test_write_1d_spectra.py index 4a2b298553..20770b5e21 100644 --- a/geminidr/gmos/tests/spect/test_write_1d_spectra.py +++ b/geminidr/gmos/tests/spect/test_write_1d_spectra.py @@ -96,7 +96,7 @@ def ad(request, path_to_inputs): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) diff --git a/geminidr/gmos/tests/test_gmos_spect_longslit_arcs.py b/geminidr/gmos/tests/test_gmos_spect_longslit_arcs.py index 07996f211a..682277353b 100644 --- a/geminidr/gmos/tests/test_gmos_spect_longslit_arcs.py +++ b/geminidr/gmos/tests/test_gmos_spect_longslit_arcs.py @@ -202,7 +202,7 @@ def __init__(self, filename, input_dir, output_dir, ref_dir): @staticmethod def reduce(filename): - _p = GMOSLongslit([astrodata.open(filename)]) + _p = GMOSLongslit([astrodata.from_file(filename)]) _p.viewer = geminidr.dormantViewer(_p, None) _p.prepare() @@ -264,7 +264,7 @@ def test_reduced_arcs_contains_stable_wavelength_solution(config): pytest.fail("Reference file not found: {}".format(reference)) ad_out = config.ad - ad_ref = astrodata.open(reference) + ad_ref = astrodata.from_file(reference) for ext_out, ext_ref in zip(ad_out, ad_ref): model = am.get_named_submodel(ext_out.wcs.forward_transform, 'WAVE') @@ -294,7 +294,7 @@ def test_reduced_arcs_are_similar(config): pytest.fail("Reference file not found: {}".format(reference)) ad_out = config.ad - ad_ref = astrodata.open(reference) + ad_ref = astrodata.from_file(reference) # Test reduced arcs are similar for ext_out, ext_ref in zip(ad_out, ad_ref): @@ -326,7 +326,7 @@ def test_distortion_correct(config): p = GMOSLongslit([]) - ad_out = astrodata.open(output) + ad_out = astrodata.from_file(output) ad_out_corrected_with_out = p.distortionCorrect([ad_out], arc=output)[0] ad_out_corrected_with_ref = p.distortionCorrect([ad_out], arc=reference)[0] @@ -372,7 +372,7 @@ def filename(self, name): # B600:0.500 HAM, ROI="Central Spectrum" --- cs = Config("N20171016S0010.fits") - cs.ad = astrodata.open(os.path.join(cs.output_dir, cs.filename)) + cs.ad = astrodata.from_file(os.path.join(cs.output_dir, cs.filename)) # B600:0.500 HAM, ROI="Full Frame" --- ff = Config("N20171016S0127.fits") @@ -423,7 +423,7 @@ def test_distortion_correction_is_applied_the_same_way(config): # if not os.path.exists(reference): # pytest.fail('Reference file not found: {}'.format(reference)) # - # ad_ref = astrodata.open(reference) + # ad_ref = astrodata.from_file(reference) os.rename(filename, os.path.join(config.output_dir, filename)) # Evaluate them --- diff --git a/geminidr/gnirs/recipes/sq/tests/test_ls_spect.py b/geminidr/gnirs/recipes/sq/tests/test_ls_spect.py index 255eb557b9..3fc35f6490 100644 --- a/geminidr/gnirs/recipes/sq/tests/test_ls_spect.py +++ b/geminidr/gnirs/recipes/sq/tests/test_ls_spect.py @@ -121,9 +121,9 @@ def test_reduce_ls_spect(path_to_inputs, path_to_refs, change_working_dir, output = reduce(sci_paths, f"sci_{test_case}", cals, user_pars=datasets[test_case]["user_pars"], return_output=True) - ad_out_2d = astrodata.open(output[0].replace("1D", "2D")) - ad_out_1d = astrodata.open(output[0]) - ad_ref_1d = astrodata.open(os.path.join(path_to_refs, output[0])) + ad_out_2d = astrodata.from_file(output[0].replace("1D", "2D")) + ad_out_1d = astrodata.from_file(output[0]) + ad_ref_1d = astrodata.from_file(os.path.join(path_to_refs, output[0])) # Check fewer than 4 apertures extracted assert len(ad_out_2d[0].APERTURE) < 4 @@ -193,7 +193,7 @@ def reduce(file_list, label, calib_files, recipe_name=None, save_to=None, # -- Fixtures ----------------------------------------------------------------- @pytest.fixture(scope='function') def gnirs_files(files): - return [astrodata.open(download_from_archive(f) for f in files)] + return [astrodata.from_file(download_from_archive(f) for f in files)] @pytest.fixture(scope='module') def keep_data(request): diff --git a/geminidr/gnirs/recipes/sq/tests/test_xd_spect.py b/geminidr/gnirs/recipes/sq/tests/test_xd_spect.py index 5de1a76786..b5d5ad4c70 100644 --- a/geminidr/gnirs/recipes/sq/tests/test_xd_spect.py +++ b/geminidr/gnirs/recipes/sq/tests/test_xd_spect.py @@ -97,11 +97,11 @@ def test_reduce_xd_spect(path_to_inputs, path_to_refs, change_working_dir, output = reduce(sci_paths, f"sci_{test_case}", cals, user_pars=upars, return_output=True) - ad_out_2d = astrodata.open(output[0].replace("1D", "2D")) - ad_out_1d = astrodata.open(output[0]) + ad_out_2d = astrodata.from_file(output[0].replace("1D", "2D")) + ad_out_1d = astrodata.from_file(output[0]) single = "single" if single_wave_scale else "notsingle" ref_filename = output[0].replace("_", f"_{single}_") - ad_ref_1d = astrodata.open(os.path.join(path_to_refs, ref_filename)) + ad_ref_1d = astrodata.from_file(os.path.join(path_to_refs, ref_filename)) # Check fewer than 3 apertures extracted assert len(ad_out_2d[0].APERTURE) < 3 @@ -169,7 +169,7 @@ def reduce(file_list, label, calib_files, recipe_name=None, save_to=None, # -- Fixtures ----------------------------------------------------------------- @pytest.fixture(scope='function') def gnirs_files(files): - return [astrodata.open(download_from_archive(f) for f in files)] + return [astrodata.from_file(download_from_archive(f) for f in files)] @pytest.fixture(scope='module') def keep_data(request): diff --git a/geminidr/gnirs/tests/crossdispersed/test_cut_slits.py b/geminidr/gnirs/tests/crossdispersed/test_cut_slits.py index b7b13515bb..7f7faa4b47 100644 --- a/geminidr/gnirs/tests/crossdispersed/test_cut_slits.py +++ b/geminidr/gnirs/tests/crossdispersed/test_cut_slits.py @@ -29,7 +29,7 @@ def test_cut_slits(adinputs, path_to_inputs): Check that, upon the slits being cut out, input coordinates are recovered successfully when transformed to world coordinates and back. """ - p = GNIRSCrossDispersed([astrodata.open(os.path.join(path_to_inputs, adinputs))]) + p = GNIRSCrossDispersed([astrodata.from_file(os.path.join(path_to_inputs, adinputs))]) adout = p.cutSlits()[0] abs_diff = 20 if 'Long' in adout.camera() else 6 # Roughly 1" for both diff --git a/geminidr/gnirs/tests/crossdispersed/test_determine_distortion.py b/geminidr/gnirs/tests/crossdispersed/test_determine_distortion.py index 6c69fa3f44..b2a4feceb3 100644 --- a/geminidr/gnirs/tests/crossdispersed/test_determine_distortion.py +++ b/geminidr/gnirs/tests/crossdispersed/test_determine_distortion.py @@ -97,7 +97,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) diff --git a/geminidr/gnirs/tests/crossdispersed/test_distortion_correct.py b/geminidr/gnirs/tests/crossdispersed/test_distortion_correct.py index 1506a72c7d..e9a4b2e829 100644 --- a/geminidr/gnirs/tests/crossdispersed/test_distortion_correct.py +++ b/geminidr/gnirs/tests/crossdispersed/test_distortion_correct.py @@ -30,7 +30,7 @@ @pytest.mark.parametrize("filename", test_files) def test_distortion_correct_coords_roundtrip(filename, path_to_inputs): - ad_in = astrodata.open(os.path.join(path_to_inputs, filename)) + ad_in = astrodata.from_file(os.path.join(path_to_inputs, filename)) abs_diff = 10 if 'Long' in ad_in.camera() else 6 # Roughly 1" for both diff --git a/geminidr/gnirs/tests/crossdispersed/test_flat_correct.py b/geminidr/gnirs/tests/crossdispersed/test_flat_correct.py index d686c53f41..3a78d6f817 100644 --- a/geminidr/gnirs/tests/crossdispersed/test_flat_correct.py +++ b/geminidr/gnirs/tests/crossdispersed/test_flat_correct.py @@ -40,7 +40,7 @@ def ad(path_to_inputs, request): """Return AD object in input directory""" path = os.path.join(path_to_inputs, request.param) if os.path.exists(path): - return astrodata.open(path) + return astrodata.from_file(path) raise FileNotFoundError(path) diff --git a/geminidr/gnirs/tests/crossdispersed/test_resample_2d.py b/geminidr/gnirs/tests/crossdispersed/test_resample_2d.py index f28d4a961d..b263c019b6 100644 --- a/geminidr/gnirs/tests/crossdispersed/test_resample_2d.py +++ b/geminidr/gnirs/tests/crossdispersed/test_resample_2d.py @@ -26,7 +26,7 @@ # Local fixtures and helper functions ---------------------------------- @pytest.fixture(scope='function') def adinputs(path_to_inputs): - return [astrodata.open(os.path.join(path_to_inputs, f)) + return [astrodata.from_file(os.path.join(path_to_inputs, f)) for f in test_datasets] def _check_params(records, expected): diff --git a/geminidr/gnirs/tests/crossdispersed/test_straight_slit_edges.py b/geminidr/gnirs/tests/crossdispersed/test_straight_slit_edges.py index c1297a6117..cbf8e3075e 100644 --- a/geminidr/gnirs/tests/crossdispersed/test_straight_slit_edges.py +++ b/geminidr/gnirs/tests/crossdispersed/test_straight_slit_edges.py @@ -18,7 +18,7 @@ @pytest.mark.gnirsxd @pytest.mark.parametrize('filename', ["N20130821S0308_stack.fits"]) def test_edges_and_slit_centers(filename, path_to_inputs): - ad = astrodata.open(os.path.join(path_to_inputs, filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, filename)) # Clear the mask so only pixels beyond the edge are masked for ext in ad: ext.mask = None @@ -31,7 +31,7 @@ def test_edges_and_slit_centers(filename, path_to_inputs): p.cutSlits() ad_masked = p.maskBeyondSlit().pop() - ad = astrodata.open(os.path.join(path_to_inputs, filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, filename)) p = GNIRSCrossDispersed([ad]) ad = p.flatCorrect(flat=ad_masked).pop() for ext in ad: diff --git a/geminidr/gnirs/tests/crossdispersed/test_trace_pinhole_apertures.py b/geminidr/gnirs/tests/crossdispersed/test_trace_pinhole_apertures.py index ac1a292e4a..6428ffa63e 100644 --- a/geminidr/gnirs/tests/crossdispersed/test_trace_pinhole_apertures.py +++ b/geminidr/gnirs/tests/crossdispersed/test_trace_pinhole_apertures.py @@ -104,7 +104,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) diff --git a/geminidr/gnirs/tests/crossdispersed/test_transfer_attribute.py b/geminidr/gnirs/tests/crossdispersed/test_transfer_attribute.py index 9d2fe6a54f..3e48549b67 100644 --- a/geminidr/gnirs/tests/crossdispersed/test_transfer_attribute.py +++ b/geminidr/gnirs/tests/crossdispersed/test_transfer_attribute.py @@ -19,7 +19,7 @@ @pytest.mark.parametrize("dataset", datasets, indirect=False) def test_flat_correct(dataset, change_working_dir): with change_working_dir(): - adinputs = [astrodata.open(download_from_archive(filename)) for + adinputs = [astrodata.from_file(download_from_archive(filename)) for filename in dataset] p = GNIRSCrossDispersed(adinputs) diff --git a/geminidr/gnirs/tests/image/test_add_illum_mask.py b/geminidr/gnirs/tests/image/test_add_illum_mask.py index 6ddd61cac5..e00206f1a1 100644 --- a/geminidr/gnirs/tests/image/test_add_illum_mask.py +++ b/geminidr/gnirs/tests/image/test_add_illum_mask.py @@ -26,9 +26,9 @@ @pytest.mark.parametrize("filename,result", DATASETS) def test_add_illum_mask(filename, result, change_working_dir, path_to_inputs): if filename.startswith("N2022"): - ad = astrodata.open(os.path.join(path_to_inputs, filename)) + ad = astrodata.from_file(os.path.join(path_to_inputs, filename)) else: - ad = astrodata.open(download_from_archive(filename)) + ad = astrodata.from_file(download_from_archive(filename)) with change_working_dir(): p = GNIRSImage([ad]) p.prepare() # bad_wcs="ignore") diff --git a/geminidr/gnirs/tests/longslit/test_adjust_wcs_to_reference.py b/geminidr/gnirs/tests/longslit/test_adjust_wcs_to_reference.py index a11647eb6a..7bbb5b83be 100644 --- a/geminidr/gnirs/tests/longslit/test_adjust_wcs_to_reference.py +++ b/geminidr/gnirs/tests/longslit/test_adjust_wcs_to_reference.py @@ -37,7 +37,7 @@ def test_adjust_wcs_with_correlation(files, path_to_inputs, caplog): params = {'max_apertures': 1, 'percentile': 80, 'min_sky_region': 50, 'min_snr': 5.0, 'use_snr': True, 'threshold': 0.1, 'section': ""} - adinputs = [astrodata.open(os.path.join(path_to_inputs, f)) for f in files] + adinputs = [astrodata.from_file(os.path.join(path_to_inputs, f)) for f in files] pixel_scale = adinputs[0].pixel_scale() centers = [] # GMOS version can use pre-found apertures; GNIRS doesn't have findApertures() diff --git a/geminidr/gnirs/tests/longslit/test_determine_distortion.py b/geminidr/gnirs/tests/longslit/test_determine_distortion.py index 2a0d664521..bdd31045b8 100644 --- a/geminidr/gnirs/tests/longslit/test_determine_distortion.py +++ b/geminidr/gnirs/tests/longslit/test_determine_distortion.py @@ -189,7 +189,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -408,7 +408,7 @@ def create_inputs_recipe(): arc_path = download_from_archive(filename) flat_path = [download_from_archive(f) for f in cals['flat']] - arc_ad = astrodata.open(arc_path) + arc_ad = astrodata.from_file(arc_path) data_label = arc_ad.data_label() logutils.config(file_name='log_flat_{}.txt'.format(data_label)) @@ -445,7 +445,7 @@ def create_refs_recipe(): print('Current working directory:\n {:s}'.format(os.getcwd())) for filename, params in input_pars: - ad = astrodata.open(os.path.join('inputs', filename)) + ad = astrodata.from_file(os.path.join('inputs', filename)) p = GNIRSLongslit([ad]) p.determineDistortion(**{**fixed_parameters_for_determine_distortion, **params}) diff --git a/geminidr/gnirs/tests/longslit/test_determine_wavelength_solution.py b/geminidr/gnirs/tests/longslit/test_determine_wavelength_solution.py index 249dded7f4..40c2746fe8 100644 --- a/geminidr/gnirs/tests/longslit/test_determine_wavelength_solution.py +++ b/geminidr/gnirs/tests/longslit/test_determine_wavelength_solution.py @@ -254,7 +254,7 @@ def test_regression_determine_wavelength_solution( if record.levelname == "WARNING": assert "No acceptable wavelength solution found" not in record.message - ref_ad = astrodata.open(os.path.join(path_to_refs, wcalibrated_ad.filename)) + ref_ad = astrodata.from_file(os.path.join(path_to_refs, wcalibrated_ad.filename)) model = am.get_named_submodel(wcalibrated_ad[0].wcs.forward_transform, "WAVE") ref_model = am.get_named_submodel(ref_ad[0].wcs.forward_transform, "WAVE") @@ -313,7 +313,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -556,7 +556,7 @@ def create_inputs_recipe(): print('Downloading files...') basename = filename.split("_")[0] + ".fits" sci_path = download_from_archive(basename) - sci_ad = astrodata.open(sci_path) + sci_ad = astrodata.from_file(sci_path) data_label = sci_ad.data_label() print('Reducing pre-processed data:') @@ -582,7 +582,7 @@ def create_inputs_recipe(): arc_path = download_from_archive(filename) flat_path = [download_from_archive(f) for f in cals['flat']] - arc_ad = astrodata.open(arc_path) + arc_ad = astrodata.from_file(arc_path) data_label = arc_ad.data_label() logutils.config(file_name='log_flat_{}.txt'.format(data_label)) @@ -617,7 +617,7 @@ def create_inputs_recipe(): flat_path = [download_from_archive(f) for f in cals['flat']] arc_arc_path = [download_from_archive(f) for f in cals['arc']] - arc_ad = astrodata.open(arc_path) + arc_ad = astrodata.from_file(arc_path) data_label = arc_ad.data_label() logutils.config(file_name='log_flat_{}.txt'.format(data_label)) @@ -674,7 +674,7 @@ def create_refs_recipe(): print('Current working directory:\n {:s}'.format(os.getcwd())) for filename, params in input_pars: - ad = astrodata.open(os.path.join('inputs', filename)) + ad = astrodata.from_file(os.path.join('inputs', filename)) p = GNIRSLongslit([ad]) p.determineWavelengthSolution(**{**determine_wavelength_solution_parameters, **params}) diff --git a/geminidr/gnirs/tests/longslit/test_distortion_correct.py b/geminidr/gnirs/tests/longslit/test_distortion_correct.py index d243134975..8a78e38a14 100644 --- a/geminidr/gnirs/tests/longslit/test_distortion_correct.py +++ b/geminidr/gnirs/tests/longslit/test_distortion_correct.py @@ -31,10 +31,10 @@ def test_distortion_correct(filename, path_to_inputs, path_to_refs, change_working_dir): with change_working_dir(path_to_inputs): - ad_in = astrodata.open(filename) + ad_in = astrodata.from_file(filename) with change_working_dir(path_to_refs): - ad_ref = astrodata.open(filename.replace('_readoutCleaned.fits', + ad_ref = astrodata.from_file(filename.replace('_readoutCleaned.fits', '_distortionCorrected.fits')) p = GNIRSLongslit([ad_in]) diff --git a/geminidr/gnirs/tests/longslit/test_flat_correct.py b/geminidr/gnirs/tests/longslit/test_flat_correct.py index 5c170d06bd..433d1b7642 100644 --- a/geminidr/gnirs/tests/longslit/test_flat_correct.py +++ b/geminidr/gnirs/tests/longslit/test_flat_correct.py @@ -38,7 +38,7 @@ def ad(path_to_inputs, request): """Return AD object in input directory""" path = os.path.join(path_to_inputs, request.param) if os.path.exists(path): - return astrodata.open(path) + return astrodata.from_file(path) raise FileNotFoundError(path) diff --git a/geminidr/gnirs/tests/longslit/test_gnirs_longslit.py b/geminidr/gnirs/tests/longslit/test_gnirs_longslit.py index 0e56cc8dec..d1c356e8da 100644 --- a/geminidr/gnirs/tests/longslit/test_gnirs_longslit.py +++ b/geminidr/gnirs/tests/longslit/test_gnirs_longslit.py @@ -15,7 +15,7 @@ @pytest.mark.dragons_remote_data def test_addMDF(): - p = GNIRSLongslit([astrodata.open( + p = GNIRSLongslit([astrodata.from_file( download_from_archive('N20100915S0138.fits'))]) ad = p.prepare()[0] # Includes addMDF() as a step. diff --git a/geminidr/gnirs/tests/longslit/test_prepare.py b/geminidr/gnirs/tests/longslit/test_prepare.py index 8f1813fc91..cd0ef072ab 100644 --- a/geminidr/gnirs/tests/longslit/test_prepare.py +++ b/geminidr/gnirs/tests/longslit/test_prepare.py @@ -18,7 +18,7 @@ def test_longslit_wcs(change_working_dir, filename): """ with change_working_dir(): file_path = download_from_archive(filename) - ad = astrodata.open(file_path) + ad = astrodata.from_file(file_path) p = GNIRSLongslit([ad]) coords1 = ad[0].wcs(X, Y) p.prepare() @@ -26,7 +26,7 @@ def test_longslit_wcs(change_working_dir, filename): assert len(coords2) == 3 np.testing.assert_allclose(coords1, coords2[1:], atol=1e-6) ad.write("test.fits", overwrite=True) - ad2 = astrodata.open("test.fits") + ad2 = astrodata.from_file("test.fits") assert "FITS-WCS" not in ad2.phu # not APPROXIMATE coords3 = ad[0].wcs(X, Y) assert len(coords3) == 3 diff --git a/geminidr/gnirs/tests/longslit/test_resample_2d.py b/geminidr/gnirs/tests/longslit/test_resample_2d.py index dde8dd6c3a..880f5b4db1 100644 --- a/geminidr/gnirs/tests/longslit/test_resample_2d.py +++ b/geminidr/gnirs/tests/longslit/test_resample_2d.py @@ -38,7 +38,7 @@ def test_resample_to_common_frame_with_defaults(input_ad_list, path_to_refs, ad_out = p.stackFrames()[0] _check_params(caplog.records, 'w1=1525.174 w2=1806.038 dw=0.138 npix=2029') assert 'ALIGN' in ad_out[0].phu - ref = astrodata.open(os.path.join(path_to_refs, + ref = astrodata.from_file(os.path.join(path_to_refs, 'N20240329S0022_stack_defaults.fits')) np.testing.assert_allclose(ad_out[0].data, ref[0].data) @@ -54,7 +54,7 @@ def test_resample_to_common_frame_trim_spectral(input_ad_list, path_to_refs, ad_out = p.stackFrames()[0] _check_params(caplog.records, 'w1=1664.096 w2=1666.589 dw=0.138 npix=19') assert 'ALIGN' in ad_out[0].phu - ref = astrodata.open(os.path.join(path_to_refs, + ref = astrodata.from_file(os.path.join(path_to_refs, 'N20240329S0022_stack_trim_spectral_True.fits')) np.testing.assert_allclose(ad_out[0].data, ref[0].data) @@ -71,7 +71,7 @@ def test_resample_to_common_frame_trim_spatial(input_ad_list, path_to_refs, # This should be the same as test_resample_to_common_frame_with_defaults() _check_params(caplog.records, 'w1=1525.174 w2=1806.038 dw=0.138 npix=2029') assert 'ALIGN' in ad_out[0].phu - ref = astrodata.open(os.path.join(path_to_refs, + ref = astrodata.from_file(os.path.join(path_to_refs, 'N20240329S0022_stack_trim_spatial_False.fits')) np.testing.assert_allclose(ad_out[0].data, ref[0].data) @@ -113,7 +113,7 @@ def input_ad_list(path_to_inputs): input_path = os.path.join(path_to_inputs, input_fname) if os.path.exists(input_path): - ad = astrodata.open(input_path) + ad = astrodata.from_file(input_path) else: raise FileNotFoundError(input_path) diff --git a/geminidr/gnirs/tests/longslit/test_sky_correct_from_slit.py b/geminidr/gnirs/tests/longslit/test_sky_correct_from_slit.py index 503c687558..0d1501ba4e 100644 --- a/geminidr/gnirs/tests/longslit/test_sky_correct_from_slit.py +++ b/geminidr/gnirs/tests/longslit/test_sky_correct_from_slit.py @@ -36,7 +36,7 @@ def test_sky_correct_from_slit(file, order, function, change_working_dir, path_to_inputs): - ad = astrodata.open(os.path.join(path_to_inputs, file)) + ad = astrodata.from_file(os.path.join(path_to_inputs, file)) p = GNIRSLongslit([deepcopy(ad)]) ad_out = p.skyCorrectFromSlit(order=order, function=function, **parameters)[0] diff --git a/geminidr/gnirs/tests/longslit/test_sky_stacking.py b/geminidr/gnirs/tests/longslit/test_sky_stacking.py index 0dbddba37e..4fb82b194c 100644 --- a/geminidr/gnirs/tests/longslit/test_sky_stacking.py +++ b/geminidr/gnirs/tests/longslit/test_sky_stacking.py @@ -17,7 +17,7 @@ # ---- Fixtures --------------------------------------------------------------- @pytest.fixture def gnirs_abba(): - return [astrodata.open(download_from_archive(f)) for f in + return [astrodata.from_file(download_from_archive(f)) for f in ('N20141119S0331.fits', 'N20141119S0332.fits', 'N20141119S0333.fits', 'N20141119S0334.fits')] @@ -104,7 +104,7 @@ def test_associate_sky_quasi_abcde(): 'N20220220S0108.fits', 'N20220220S0109.fits', 'N20220220S0110.fits'] - data = [astrodata.open(download_from_archive(f)) for f in files] + data = [astrodata.from_file(download_from_archive(f)) for f in files] p = GNIRSLongslit(data) p.prepare() diff --git a/geminidr/gnirs/tests/test_determine_slit_edges.py b/geminidr/gnirs/tests/test_determine_slit_edges.py index 1ec726dbcc..e8a179edf5 100644 --- a/geminidr/gnirs/tests/test_determine_slit_edges.py +++ b/geminidr/gnirs/tests/test_determine_slit_edges.py @@ -209,7 +209,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) diff --git a/geminidr/gsaoi/tests/test_gsaoi_image.py b/geminidr/gsaoi/tests/test_gsaoi_image.py index 6edaa3a59a..ec30b7720a 100644 --- a/geminidr/gsaoi/tests/test_gsaoi_image.py +++ b/geminidr/gsaoi/tests/test_gsaoi_image.py @@ -28,8 +28,8 @@ def test_gsaoi_adjust_wcs_no_refcat(change_working_dir, path_to_refs, adinputs): p.resampleToCommonFrame(interpolant="linear") p.writeOutputs() for ad in p.streams['main']: - ad = astrodata.open(ad.filename) - ref_ad = astrodata.open(os.path.join(path_to_refs, ad.filename)) + ad = astrodata.from_file(ad.filename) + ref_ad = astrodata.from_file(os.path.join(path_to_refs, ad.filename)) # CJS: The outputs I get on my MacBook apparently do not agree with # those on the Jenkins server, so need to increase the tolerances. # This should still be fine. @@ -72,6 +72,6 @@ def test_gsaoi_resample_to_refcat(path_to_inputs, adinputs): def adinputs(path_to_inputs): adinputs = [] for i in range(148, 151): - adinputs.append(astrodata.open( + adinputs.append(astrodata.from_file( os.path.join(path_to_inputs, f'S20200305S{i:04d}_sourcesDetected.fits'))) return adinputs diff --git a/geminidr/niri/tests/longslit/test_determine_distortion.py b/geminidr/niri/tests/longslit/test_determine_distortion.py index 50bb43fcd7..96a3b4c7df 100644 --- a/geminidr/niri/tests/longslit/test_determine_distortion.py +++ b/geminidr/niri/tests/longslit/test_determine_distortion.py @@ -166,7 +166,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -380,7 +380,7 @@ def create_inputs_recipe(): arc_path = download_from_archive(filename) flat_path = [download_from_archive(f) for f in cals['flat']] - arc_ad = astrodata.open(arc_path) + arc_ad = astrodata.from_file(arc_path) data_label = arc_ad.data_label() logutils.config(file_name='log_flat_{}.txt'.format(data_label)) @@ -417,7 +417,7 @@ def create_refs_recipe(): print('Current working directory:\n {:s}'.format(os.getcwd())) for filename, params in input_pars: - ad = astrodata.open(os.path.join('inputs', filename)) + ad = astrodata.from_file(os.path.join('inputs', filename)) p = NIRILongslit([ad]) p.determineDistortion(**{**fixed_parameters_for_determine_distortion, **params}) diff --git a/geminidr/niri/tests/longslit/test_determine_wavelength_solution.py b/geminidr/niri/tests/longslit/test_determine_wavelength_solution.py index f6cf69e3c6..0d814936e3 100644 --- a/geminidr/niri/tests/longslit/test_determine_wavelength_solution.py +++ b/geminidr/niri/tests/longslit/test_determine_wavelength_solution.py @@ -156,7 +156,7 @@ def test_regression_determine_wavelength_solution( if record.levelname == "WARNING": assert "No acceptable wavelength solution found" not in record.message - ref_ad = astrodata.open(os.path.join(path_to_refs, wcalibrated_ad.filename)) + ref_ad = astrodata.from_file(os.path.join(path_to_refs, wcalibrated_ad.filename)) model = am.get_named_submodel(wcalibrated_ad[0].wcs.forward_transform, "WAVE") ref_model = am.get_named_submodel(ref_ad[0].wcs.forward_transform, "WAVE") @@ -218,7 +218,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) @@ -452,7 +452,7 @@ def create_inputs_recipe(): arc_path = download_from_archive(filename) flat_path = [download_from_archive(f) for f in cals['flat']] - arc_ad = astrodata.open(arc_path) + arc_ad = astrodata.from_file(arc_path) data_label = arc_ad.data_label() logutils.config(file_name='log_flat_{}.txt'.format(data_label)) @@ -488,7 +488,7 @@ def create_inputs_recipe(): flat_path = [download_from_archive(f) for f in cals['flat']] arc_arc_path = [download_from_archive(f) for f in cals['arc']] - arc_ad = astrodata.open(arc_path) + arc_ad = astrodata.from_file(arc_path) data_label = arc_ad.data_label() logutils.config(file_name='log_flat_{}.txt'.format(data_label)) @@ -546,7 +546,7 @@ def create_refs_recipe(): print('Current working directory:\n {:s}'.format(os.getcwd())) for filename, params in input_pars: - ad = astrodata.open(os.path.join('inputs', filename)) + ad = astrodata.from_file(os.path.join('inputs', filename)) p = NIRILongslit([ad]) p.determineWavelengthSolution(**{**determine_wavelength_solution_parameters, **params}) diff --git a/geminidr/niri/tests/longslit/test_flat_correct.py b/geminidr/niri/tests/longslit/test_flat_correct.py index 1a38ccca19..fe9172af04 100644 --- a/geminidr/niri/tests/longslit/test_flat_correct.py +++ b/geminidr/niri/tests/longslit/test_flat_correct.py @@ -36,7 +36,7 @@ def ad(path_to_inputs, request): """Return AD object in input directory""" path = os.path.join(path_to_inputs, request.param) if os.path.exists(path): - return astrodata.open(path) + return astrodata.from_file(path) raise FileNotFoundError(path) diff --git a/geminidr/niri/tests/longslit/test_niri_longslit.py b/geminidr/niri/tests/longslit/test_niri_longslit.py index 8fd70bf3d7..b38b9ef3ab 100644 --- a/geminidr/niri/tests/longslit/test_niri_longslit.py +++ b/geminidr/niri/tests/longslit/test_niri_longslit.py @@ -15,7 +15,7 @@ @pytest.mark.dragons_remote_data def test_addMDF(): - p = NIRILongslit([astrodata.open( + p = NIRILongslit([astrodata.from_file( download_from_archive('N20100620S0116.fits'))]) ad = p.prepare()[0] # Includes addMDF() as a step. diff --git a/geminidr/niri/tests/longslit/test_sky_stacking.py b/geminidr/niri/tests/longslit/test_sky_stacking.py index b10fb00cf2..e8cc299dde 100644 --- a/geminidr/niri/tests/longslit/test_sky_stacking.py +++ b/geminidr/niri/tests/longslit/test_sky_stacking.py @@ -13,13 +13,13 @@ # ---- Fixtures --------------------------------------------------------------- @pytest.fixture def niri_abba(): - return [astrodata.open(download_from_archive(f)) for f in + return [astrodata.from_file(download_from_archive(f)) for f in ('N20100602S0437.fits', 'N20100602S0438.fits', 'N20100602S0439.fits', 'N20100602S0440.fits')] @pytest.fixture def niri_abcde(): - return [astrodata.open(download_from_archive(f)) for f in + return [astrodata.from_file(download_from_archive(f)) for f in ('N20070204S0098.fits', 'N20070204S0099.fits', 'N20070204S0100.fits', @@ -110,7 +110,7 @@ def test_associate_sky_abcde(niri_abcde): 'N20070204S0103.fits': [2, 3, 4, 6], 'N20070204S0104.fits': [3, 4, 5]} - # data = [astrodata.open(download_from_archive(f)) for f in niri_abcde] + # data = [astrodata.from_file(download_from_archive(f)) for f in niri_abcde] p = NIRILongslit(niri_abcde) # Some frames have bad WCS information, so use 'fix' to take care of it. @@ -127,7 +127,7 @@ def test_associate_sky_abcde(niri_abcde): @pytest.mark.dragons_remote_data @pytest.mark.nirils def test_associate_sky_abcde_exclude_some(niri_abcde): - # data = [astrodata.open(download_from_archive(f)) for f in niri_abcde] + # data = [astrodata.from_file(download_from_archive(f)) for f in niri_abcde] p = NIRILongslit(niri_abcde) p.prepare(bad_wcs='fix') diff --git a/geminidr/niri/tests/test_determine_slit_edges.py b/geminidr/niri/tests/test_determine_slit_edges.py index 6ebd737b36..111e763ed6 100644 --- a/geminidr/niri/tests/test_determine_slit_edges.py +++ b/geminidr/niri/tests/test_determine_slit_edges.py @@ -74,7 +74,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) diff --git a/geminidr/niri/tests/test_nonlinearity_correct.py b/geminidr/niri/tests/test_nonlinearity_correct.py index 46ef8dd89c..d6b263d0e2 100644 --- a/geminidr/niri/tests/test_nonlinearity_correct.py +++ b/geminidr/niri/tests/test_nonlinearity_correct.py @@ -34,7 +34,7 @@ def ad(path_to_inputs, request): path = os.path.join(path_to_inputs, filename) if os.path.exists(path): - ad = astrodata.open(path) + ad = astrodata.from_file(path) else: raise FileNotFoundError(path) return ad @@ -56,7 +56,7 @@ def create_inputs(): raw_filename = filename.replace("_varAdded", "") print('Downloading files...') sci_path = download_from_archive(raw_filename) - ad = astrodata.open(sci_path) + ad = astrodata.from_file(sci_path) print(f'Reducing {raw_filename}') p = NIRIImage([ad]) diff --git a/geminidr/tests/test_geminidr.py b/geminidr/tests/test_geminidr.py index 29a09a3d0a..4ab31c19b1 100644 --- a/geminidr/tests/test_geminidr.py +++ b/geminidr/tests/test_geminidr.py @@ -29,7 +29,7 @@ def test_unrecognized_uparm(parm, expected): testfile = download_from_archive("N20160524S0119.fits") with pytest.raises(UnrecognizedParameterException) as upe: - GMOSLongslit(astrodata.open(testfile), mode='sq', ucals={}, uparms=parm, upload=None, config_file=None) + GMOSLongslit(astrodata.from_file(testfile), mode='sq', ucals={}, uparms=parm, upload=None, config_file=None) assert expected in str(upe.value) diff --git a/gempy/adlibrary/dataselect.py b/gempy/adlibrary/dataselect.py index c507969869..7368f31ff6 100644 --- a/gempy/adlibrary/dataselect.py +++ b/gempy/adlibrary/dataselect.py @@ -139,7 +139,7 @@ def select_data(inputs, tags=[], xtags=[], expression='True', adpkg=None): selected_data = [] for input in inputs: - ad = astrodata.open(input) + ad = astrodata.from_file(input) adtags = ad.tags if set(tags).issubset(adtags) and \ not len(set(xtags).intersection(adtags)) and \ diff --git a/gempy/gemini/eti/gemcombinefile.py b/gempy/gemini/eti/gemcombinefile.py index 686168e141..bb79eeac3f 100644 --- a/gempy/gemini/eti/gemcombinefile.py +++ b/gempy/gemini/eti/gemcombinefile.py @@ -114,7 +114,7 @@ def prepare(self): def recover(self): log.debug("OufileETIFile recover()") - ad = astrodata.open(self.tmp_name) + ad = astrodata.from_file(self.tmp_name) ad.filename = self.ad_name ad = gemini_tools.obsmode_del(ad) log.fullinfo(self.tmp_name + " was loaded into memory") diff --git a/gempy/gemini/eti/gmosaicfile.py b/gempy/gemini/eti/gmosaicfile.py index d37cc32eed..32fb1feaa9 100644 --- a/gempy/gemini/eti/gmosaicfile.py +++ b/gempy/gemini/eti/gmosaicfile.py @@ -127,7 +127,7 @@ def recover(self): log.debug("OutAtList recover()") adlist = [] for i, tmpname in enumerate(self.diskoutlist): - ad = astrodata.open(tmpname) + ad = astrodata.from_file(tmpname) ad.filename = self.ad_name[i] ad = gemini_tools.obsmode_del(ad) adlist.append(ad) diff --git a/gempy/gemini/eti/tests/test_gemcombine.py b/gempy/gemini/eti/tests/test_gemcombine.py index 3c0ff14487..58ec9c90d9 100644 --- a/gempy/gemini/eti/tests/test_gemcombine.py +++ b/gempy/gemini/eti/tests/test_gemcombine.py @@ -85,7 +85,7 @@ def test_niri_default(self): # where is the fits diff tool? inputs = [] for filename in TestGemcombine.niri_files: - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) inputs.append(ad) parameters = TESTDEFAULTPARAMS gemcombine_task = \ diff --git a/gempy/gemini/eti/tests/test_gmosaic.py b/gempy/gemini/eti/tests/test_gmosaic.py index 8fcc5150fa..78e96cafa5 100644 --- a/gempy/gemini/eti/tests/test_gmosaic.py +++ b/gempy/gemini/eti/tests/test_gmosaic.py @@ -61,7 +61,7 @@ def test_gmos_default(self): from gempy.gemini.eti import gmosaiceti # where is the fits diff tool? - ad = astrodata.open(TestGmosaic.gmos_file) + ad = astrodata.from_file(TestGmosaic.gmos_file) inputs = [] parameters = TESTDEFAULTPARAMS gmosaic_task = \ diff --git a/gempy/gemini/gemini_tools.py b/gempy/gemini/gemini_tools.py index 833dcf7afe..db1d2c976b 100644 --- a/gempy/gemini/gemini_tools.py +++ b/gempy/gemini/gemini_tools.py @@ -1227,7 +1227,7 @@ def cut_to_match_auxiliary_data(adinput=None, aux=None, aux_type=None, new_ad.append(ext.nddata[detsec.asslice()]) new_ad[-1].SLITEDGE = auxext.SLITEDGE new_ad[-1].hdr[ad._keyword_for('detector_section')] =\ - detsec.asIRAFsection(binning=(xbin, ybin)) + detsec.as_iraf_section(binning=(xbin, ybin)) new_ad[-1].hdr['SPECORDR'] = auxext.hdr['SPECORDR'] # By default, when a section is cut out of an array the WCS is @@ -1728,7 +1728,7 @@ def make_lists(*args, **kwargs): for x in set(_list): if x not in ad_map_dict: try: - ad_map_dict.update({x: astrodata.open(x) + ad_map_dict.update({x: astrodata.from_file(x) if isinstance(x, str) else x}) except OSError: ad_map_dict.update({x: None}) @@ -2383,7 +2383,7 @@ def trim_to_data_section(adinput=None, keyword_comments=None): for i, (oldsec, newsec) in enumerate(zip(sections, new_sections), start=1): #oldsec, newsec = Section(*oldsec), Section(*newsec) - datasecStr = oldsec.asIRAFsection() + datasecStr = oldsec.as_iraf_section() log.fullinfo(f'For {ad.filename} extension {ext.id}, ' f'keeping the data from the section {datasecStr}') newslice = newsec.asslice() @@ -2406,7 +2406,7 @@ def trim_to_data_section(adinput=None, keyword_comments=None): continue # Update logger with the section being kept - datasecStr = datasec.asIRAFsection() + datasecStr = datasec.as_iraf_section() log.fullinfo(f'For {ad.filename} extension {ext.id}, keeping ' f'the data from the section {datasecStr}') diff --git a/gempy/gemini/tests/test_gemini_tools.py b/gempy/gemini/tests/test_gemini_tools.py index 50e7697ad4..fdb63ed832 100644 --- a/gempy/gemini/tests/test_gemini_tools.py +++ b/gempy/gemini/tests/test_gemini_tools.py @@ -44,14 +44,14 @@ def test_convert_to_cal_header(caltype, obj, change_working_dir): """Check that header keywords have been updated and """ # A random NIRI image - ad = astrodata.open(astrodata.testing.download_from_archive('N20200127S0023.fits')) + ad = astrodata.from_file(astrodata.testing.download_from_archive('N20200127S0023.fits')) ad_out = gt.convert_to_cal_header(ad, caltype=caltype, keyword_comments=keyword_comments) # FITS WCS keywords only get changed at write-time, so we need to # write the file to disk and read it back in to confirm. with change_working_dir(): ad_out.write("temp.fits", overwrite=True) - ad = astrodata.open("temp.fits") + ad = astrodata.from_file("temp.fits") assert ad.observation_type() == caltype.upper() # Let's not worry about upper/lowercase @@ -71,7 +71,7 @@ def test_fit_continuum_slit_image(fname, fwhm, change_working_dir): log_file = 'log_{}.log'.format(fname.replace('.fits', '')) logutils.config(file_name=log_file) - ad = astrodata.open(astrodata.testing.download_from_archive(fname)) + ad = astrodata.from_file(astrodata.testing.download_from_archive(fname)) p = GMOSImage([ad]) p.prepare(attach_mdf=True) p.addDQ() @@ -114,7 +114,7 @@ def test_measure_bg_from_image_fake_sections(section, gaussfit, fake_image): @pytest.mark.parametrize("gaussfit", [True, False]) def test_measure_bg_from_image_real(gaussfit): # A random GMOS-N image - ad = astrodata.open(astrodata.testing.download_from_archive("N20191210S0338.fits")) + ad = astrodata.from_file(astrodata.testing.download_from_archive("N20191210S0338.fits")) mean, stddev, nsamples = gt.measure_bg_from_image( ad[8].nddata[ad[8].data_section().asslice()], gaussfit=gaussfit) assert abs(mean - 807) < 1 diff --git a/gempy/scripts/fwhm_histogram.py b/gempy/scripts/fwhm_histogram.py index 45cff72ae5..38e3cae783 100755 --- a/gempy/scripts/fwhm_histogram.py +++ b/gempy/scripts/fwhm_histogram.py @@ -24,7 +24,7 @@ def main(): filename = sys.argv[1] - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) objcat = ad[0].OBJCAT fwhm_arcsec = objcat.field("FWHM_WORLD") * 3600. diff --git a/gempy/scripts/profile_all_obj.py b/gempy/scripts/profile_all_obj.py index 560d75fffc..a110031153 100755 --- a/gempy/scripts/profile_all_obj.py +++ b/gempy/scripts/profile_all_obj.py @@ -154,7 +154,7 @@ def profile_loop(data, xcenter, ycenter, bkg, total_flux, max_flux, size): def main(): filename = sys.argv[1] - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) objcat = ad[0].OBJCAT data = ad[0].data catx = objcat.field("X_IMAGE") diff --git a/gempy/scripts/psf_plot.py b/gempy/scripts/psf_plot.py index 251f75c62a..c64c1a1645 100755 --- a/gempy/scripts/psf_plot.py +++ b/gempy/scripts/psf_plot.py @@ -13,7 +13,7 @@ def main(): filename = sys.argv[1] - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) objcat = ad[0].OBJCAT catx = objcat.field("X_IMAGE") caty = objcat.field("Y_IMAGE") diff --git a/gempy/scripts/showpars.py b/gempy/scripts/showpars.py index 41a1869c96..eae5fb2c4b 100755 --- a/gempy/scripts/showpars.py +++ b/gempy/scripts/showpars.py @@ -40,7 +40,7 @@ def get_pars(filename, adpkg=None, drpkg=None): if adpkg is not None: import_module(adpkg) - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) dtags = set(list(ad.tags)[:]) instpkg = ad.instrument(generic=True).lower() diff --git a/gempy/scripts/typewalk.py b/gempy/scripts/typewalk.py index 74b57d21c1..a707a6040d 100755 --- a/gempy/scripts/typewalk.py +++ b/gempy/scripts/typewalk.py @@ -230,7 +230,7 @@ def typewalk(self, directory=os.getcwd(), only=None, filemask=None, fname = os.path.join(root, tfile) try: - fl = astrodata.open(fname) + fl = astrodata.from_file(fname) dtypes = list(fl.tags) except AttributeError: print(" Bad headers in file: {}".format(tfile)) diff --git a/gempy/scripts/zp_histogram.py b/gempy/scripts/zp_histogram.py index 89db2e3db0..489ce5327f 100755 --- a/gempy/scripts/zp_histogram.py +++ b/gempy/scripts/zp_histogram.py @@ -23,7 +23,7 @@ def main(): filename = sys.argv[1] - ad = astrodata.open(filename) + ad = astrodata.from_file(filename) objcat = ad[0].OBJCAT # check if there's a REFCAT. If not, then the OBJCAT will be diff --git a/gempy/utils/showrecipes.py b/gempy/utils/showrecipes.py index fdbf67b8d4..d2b08f5099 100644 --- a/gempy/utils/showrecipes.py +++ b/gempy/utils/showrecipes.py @@ -38,7 +38,7 @@ def showrecipes(_file, adpkg=None, drpkg=None): # Find the file and open it with astrodata try: - ad = astrodata.open(_file) + ad = astrodata.from_file(_file) tags = ad.tags except AstroDataError: result += ("There was an issue using the selected file, please check " @@ -151,7 +151,7 @@ def showprims(_file, mode='sq', recipe='_default', adpkg=None, drpkg=None): # Find the file and open it with astrodata try: - ad = astrodata.open(_file) + ad = astrodata.from_file(_file) tags = ad.tags except AstroDataError: print("There was an issue using the selected file, please check " diff --git a/gempy/utils/tests/test_decorators.py b/gempy/utils/tests/test_decorators.py index ffac7f81f0..cd974a4aa2 100644 --- a/gempy/utils/tests/test_decorators.py +++ b/gempy/utils/tests/test_decorators.py @@ -20,4 +20,4 @@ def fn(data, exposure_time=5): @pytest.fixture(scope='function') def ad(): ad_path = download_from_archive("N20150123S0337.fits") - return astrodata.open(ad_path) + return astrodata.from_file(ad_path) diff --git a/recipe_system/cal_service/tests/test_caldb.py b/recipe_system/cal_service/tests/test_caldb.py index 8e2ea1ece8..827b068257 100644 --- a/recipe_system/cal_service/tests/test_caldb.py +++ b/recipe_system/cal_service/tests/test_caldb.py @@ -82,7 +82,7 @@ def test_retrieval(path_to_inputs, change_working_dir): cal_file = os.path.join(path_to_inputs, cal) caldb.add_cal(cal_file) - ad_sci = astrodata.open(os.path.join(path_to_inputs, sci)) + ad_sci = astrodata.from_file(os.path.join(path_to_inputs, sci)) for caltype, calfile in cals.items(): cal_return = caldb.get_calibrations([ad_sci], caltype=caltype) assert len(cal_return) == 1 diff --git a/recipe_system/cal_service/tests/test_calrequestlib.py b/recipe_system/cal_service/tests/test_calrequestlib.py index 22e28d9683..790c7bfb88 100644 --- a/recipe_system/cal_service/tests/test_calrequestlib.py +++ b/recipe_system/cal_service/tests/test_calrequestlib.py @@ -17,7 +17,7 @@ @pytest.mark.dragons_remote_data def test_get_cal_requests_dictdescriptor(): path = astrodata.testing.download_from_archive("S20221209S0007.fits") - ad = astrodata.open(path) + ad = astrodata.from_file(path) requests = get_cal_requests([ad], 'bias') # This descriptor works off the decomposed per-arm values for x/y binning # so it's a good test that this worked with a dictionary-based descriptor diff --git a/recipe_system/mappers/primitiveMapper.py b/recipe_system/mappers/primitiveMapper.py index b7f163b625..9b2f100b87 100644 --- a/recipe_system/mappers/primitiveMapper.py +++ b/recipe_system/mappers/primitiveMapper.py @@ -22,7 +22,7 @@ class PrimitiveMapper(Mapper): Retrieve the appropriate primitive class for a dataset, using all defined defaults: - >>> ad = astrodata.open() + >>> ad = astrodata.from_file() >>> dtags = set(list(ad.tags)[:]) >>> instpkg = ad.instrument(generic=True).lower() >>> pm = PrimitiveMapper(dtags, instpkg) diff --git a/recipe_system/mappers/recipeMapper.py b/recipe_system/mappers/recipeMapper.py index fe602eacb1..8627c7f3d8 100644 --- a/recipe_system/mappers/recipeMapper.py +++ b/recipe_system/mappers/recipeMapper.py @@ -22,7 +22,7 @@ class RecipeMapper(Mapper): """ Retrieve the appropriate recipe for a dataset, using all defined defaults: - >>> ad = astrodata.open() + >>> ad = astrodata.from_file() >>> dtags = set(list(ad.tags)[:]) >>> instpkg = ad.instrument(generic=True).lower() >>> rm = RecipeMapper(dtags, instpkg) diff --git a/recipe_system/reduction/coreReduce.py b/recipe_system/reduction/coreReduce.py index 5b6f8526e2..5e4383244c 100644 --- a/recipe_system/reduction/coreReduce.py +++ b/recipe_system/reduction/coreReduce.py @@ -243,7 +243,7 @@ def _convert_inputs(self, inputs): allinputs = [] for inp in inputs: try: - ad = astrodata.open(inp) + ad = astrodata.from_file(inp) except AstroDataError as err: log.warning("Can't Load Dataset: %s" % inp) log.warning(err) @@ -362,7 +362,7 @@ def _convert_inputs(inputs): allinputs = [] for inp in inputs: try: - ad = astrodata.open(inp) + ad = astrodata.from_file(inp) except AstroDataError as err: log.warning("Can't Load Dataset: %s" % inp) log.warning(err) diff --git a/recipe_system/scripts/provenance.py b/recipe_system/scripts/provenance.py index 235535238d..c332ec12a3 100644 --- a/recipe_system/scripts/provenance.py +++ b/recipe_system/scripts/provenance.py @@ -32,7 +32,7 @@ def parse_args(): options, args = parse_args() for arg in args: try: - ad = astrodata.open(arg) + ad = astrodata.from_file(arg) print(f"Reading Provenance for {arg}\n") print(provenance_summary(ad, provenance=options.provenance, history=options.history)) except astrodata.AstroDataError: diff --git a/recipe_system/testing.py b/recipe_system/testing.py index 55a64fc673..e778cc6428 100644 --- a/recipe_system/testing.py +++ b/recipe_system/testing.py @@ -40,9 +40,9 @@ def _get_master_arc(ad, pre_process): if pre_process: with change_working_dir(): - master_arc = astrodata.open(arc_filename) + master_arc = astrodata.from_file(arc_filename) else: - master_arc = astrodata.open( + master_arc = astrodata.from_file( os.path.join(path_to_inputs, arc_filename)) return master_arc @@ -144,7 +144,7 @@ def _reduce_flat(data_label, flat_fnames, master_bias): reduce.runr() master_flat = reduce.output_filenames.pop() - master_flat_ad = astrodata.open(master_flat) + master_flat_ad = astrodata.from_file(master_flat) return master_flat_ad @@ -169,7 +169,7 @@ def ref_ad_factory(path_to_refs): def _reference_ad(filename): print(f"Loading reference file: {filename}") path = os.path.join(path_to_refs, filename) - return astrodata.open(path) + return astrodata.from_file(path) return _reference_ad diff --git a/recipe_system/utils/reduce_utils.py b/recipe_system/utils/reduce_utils.py index 9c18426e13..232007b311 100644 --- a/recipe_system/utils/reduce_utils.py +++ b/recipe_system/utils/reduce_utils.py @@ -357,7 +357,7 @@ def normalize_ucals(cals): ctype, cpath = cal.split(":") scal, stype = ctype.split("_") caltags = {scal.upper(), stype.upper()} - cad = astrodata.open(cpath) + cad = astrodata.from_file(cpath) try: assert caltags.issubset(cad.tags) except AssertionError: diff --git a/recipe_system/utils/tests/test_decorator.py b/recipe_system/utils/tests/test_decorator.py index 5a2ba72237..ee01cc8fd3 100644 --- a/recipe_system/utils/tests/test_decorator.py +++ b/recipe_system/utils/tests/test_decorator.py @@ -14,7 +14,7 @@ def test_skip_primitive(change_working_dir, primitive_name, num_outputs): """Reduce some biases and confirm that the correct thing is skipped (or not)""" with change_working_dir(): files = [download_from_archive(f"N20210101S{i:04d}.fits") for i in range(534, 537)] - adinputs = [astrodata.open(f) for f in files] + adinputs = [astrodata.from_file(f) for f in files] p = GMOS(adinputs, uparms={f'{primitive_name}:skip_primitive': True}) makeProcessedBias(p) assert len(p.streams['main']) == num_outputs diff --git a/tox.ini b/tox.ini index 428412a6e5..bc25ed60ee 100644 --- a/tox.ini +++ b/tox.ini @@ -44,6 +44,7 @@ conda_deps = pytest>=5.2 python-dateutil>=2.5.3 requests>=2.22 + setuptools scikit-image>=0.21 scipy>=1.3 sextractor>=2.8.6 From 1035953468feb7a665c5895bd8b56f09e175b87f Mon Sep 17 00:00:00 2001 From: teald Date: Wed, 2 Apr 2025 17:25:17 -0700 Subject: [PATCH 11/11] feat(tox): Use pip astrodata. --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index bc25ed60ee..ebbf2f10a0 100644 --- a/tox.ini +++ b/tox.ini @@ -63,9 +63,9 @@ extras = test docs: docs deps = + astrodata>=2.10.2 git+https://github.com/GeminiDRSoftware/FitsStorage.git@v3.4.0b2 git+https://github.com/GeminiDRSoftware/pytest_dragons.git@v1.0.5#egg=pytest_dragons - git+https://github.com/GeminiDRSoftware/astrodata.git changedir = .tmp commands =