Skip to content

Commit

Permalink
Merge pull request #88 from mwcraig/better-metadata
Browse files Browse the repository at this point in the history
Change metadata to case-insensitive OrderedDict
  • Loading branch information
mwcraig committed May 22, 2014
2 parents 06a2513 + dbd8acf commit a2798ef
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 13 deletions.
20 changes: 11 additions & 9 deletions ccdproc/ccddata.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
from astropy import units as u
import astropy

from .utils.collections import CaseInsensitiveOrderedDict

adu = u.adu
electron = u.def_unit('electron')
photon = u.photon
Expand Down Expand Up @@ -118,19 +120,16 @@ def meta(self):
@meta.setter
def meta(self, value):
if value is None:
self._meta = fits.Header()
elif isinstance(value, fits.Header):
self._meta = value
self._meta = CaseInsensitiveOrderedDict()
else:
h = fits.Header()
h = CaseInsensitiveOrderedDict()
try:
for k, v in value.items():
h[k] = v
except (ValueError, AttributeError):
raise TypeError('NDData meta attribute must be dict-like')
self._meta = h


@property
def uncertainty(self):
return self._uncertainty
Expand All @@ -148,7 +147,7 @@ def uncertainty(self, value):
self._uncertainty = value

def to_hdu(self):
"""Creates an HDUList object from a CCDData object
"""Creates an HDUList object from a CCDData object.
Raises
-------
Expand All @@ -160,13 +159,16 @@ def to_hdu(self):
hdulist : astropy.io.fits.HDUList object
"""
hdu = fits.PrimaryHDU(self.data, self.header)
header = fits.Header()
for k, v in self.header.items():
header[k] = v
hdu = fits.PrimaryHDU(self.data, header)
hdulist = fits.HDUList([hdu])
return hdulist

def copy(self):
"""
Return a copy of the CCDData object
Return a copy of the CCDData object.
"""
return copy.deepcopy(self)

Expand Down Expand Up @@ -288,7 +290,7 @@ def fits_ccddata_writer(ccd_data, filename, **kwd):
kwd :
All additional keywords are passed to :py:mod:`astropy.io.fits`
"""
hdu = fits.PrimaryHDU(data=ccd_data.data, header=ccd_data.header)
hdu = ccd_data.to_hdu()
hdu.writeto(filename, **kwd)


Expand Down
14 changes: 11 additions & 3 deletions ccdproc/tests/test_ccddata.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ def test_initialize_from_FITS(ccd_data, tmpdir):
assert cd.shape == (10, 10)
assert cd.size == 100
assert np.issubdtype(cd.data.dtype, np.float)
assert cd.meta == hdu.header
for k, v in hdu.header.items():
assert cd.meta[k] == v


def test_initialize_from_FITS_bad_keyword_raises_error(ccd_data, tmpdir):
Expand All @@ -63,9 +64,16 @@ def test_ccddata_writer(ccd_data, tmpdir):
np.testing.assert_array_equal(ccd_data.data, ccd_disk.data)


def test_ccddata_meta_is_fits_header(ccd_data):
def test_ccddata_meta_is_case_insensitive(ccd_data):
key = 'SoMeKEY'
ccd_data.meta[key] = 10
assert key.lower() in ccd_data.meta
assert key.upper() in ccd_data.meta


def test_ccddata_meta_is_not_fits_header(ccd_data):
ccd_data.meta = {'OBSERVER': 'Edwin Hubble'}
assert isinstance(ccd_data.meta, fits.Header)
assert not isinstance(ccd_data.meta, fits.Header)


def test_fromMEF(ccd_data, tmpdir):
Expand Down
2 changes: 1 addition & 1 deletion ccdproc/tests/test_ccdproc_logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def test_log_string(ccd_data, key):
assert add_key not in ccd_data.meta
# Long keyword names should be accessible with just the keyword name
# without HIERARCH -- is it?
assert new.meta[add_key] == ''
assert new.meta[add_key] is None


def test_log_keyword(ccd_data):
Expand Down
35 changes: 35 additions & 0 deletions ccdproc/utils/collections.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""
Useful objects based on collections
"""

from __future__ import (absolute_import, print_function)

from astropy.utils.compat.odict import OrderedDict


class CaseInsensitiveOrderedDict(OrderedDict):
"""
docstring for CaseInsensitiveOrderedDict
"""

def __init__(self, *arg, **kwd):
super(CaseInsensitiveOrderedDict, self).__init__(*arg, **kwd)

def _transform_key(self, key):
return key.upper()

def __setitem__(self, key, value):
super(CaseInsensitiveOrderedDict,
self).__setitem__(self._transform_key(key), value)

def __getitem__(self, key):
return super(CaseInsensitiveOrderedDict,
self).__getitem__(self._transform_key(key))

def __delitem__(self, key):
return super(CaseInsensitiveOrderedDict,
self).__delitem__(self._transform_key(key))

def __contains__(self, key):
return super(CaseInsensitiveOrderedDict,
self).__contains__(self._transform_key(key))

0 comments on commit a2798ef

Please sign in to comment.