def load(filepath, pos_filepath): """ :param filepath: fits image path :return: an Image """ # load image data information data = pyfits.getdata(filepath, hdu=0) primary = Header(pyfits.getheader(filepath, 0)) headers = [primary] extcount = int(primary.get("NEXTEND", 0)) for idx in range(1, extcount): ext = Header(pyfits.getheader(filepath, idx)) headers.append(ext) # load position information pos_primary = Header(pyfits.getheader(pos_filepath, 0)) pos_headers = [pos_primary] pos_extcount = int(pos_primary.get("NEXTEND", 0)) for idx in range(1, pos_extcount): ext = Header(pyfits.getheader(pos_filepath, idx)) pos_headers.append(ext) return Image(array(data), headers, pos_headers)
def test_post_sanitize_header_pc(): test_subject = FITSHelper(io.BytesIO(), io.BytesIO()) data = np.arange(10000).reshape(100, 100) header = Header() wcs = WCS(fix=False) wcs.wcs.pc = [[0.9, 0.8], [0.7, 0.6]] header.set('REMAIN1', 'VALUE1') header.set('DQ1', 'dqvalue1') header.set('NAXIS', 2) header.set('NAXIS1', 88) header.set('NAXIS2', 212) header.set('CRPIX1', 77.0) header.set('WCSAXES', 2) header.set('CTYPE1', 'ctype1value') assert header.get('PC1_1') is None, 'Should not contain PC1_1' assert header.get('PC2_1') is None, 'Should not contain PC2_1' assert header.get('PC1_2') is None, 'Should not contain PC1_2' assert header.get('PC2_2') is None, 'Should not contain PC2_2' result = CutoutResult(data, wcs=wcs) assert header.index('WCSAXES') > header.index('CRPIX1'), \ 'Start with bad indexes...' test_subject._post_sanitize_header(header, result) assert header.get('PC1_1') == 0.9, 'Wrong PC1_1 value.' assert header.get('PC2_1') == 0.7, 'Wrong PC2_1 value.' assert header.get('PC1_2') == 0.8, 'Wrong PC1_2 value.' assert header.get('PC2_2') == 0.6, 'Wrong PC2_2 value.' assert 'VALUE1' == header.get('REMAIN1'), 'REMAIN1 should still be there.'
def __validate_bintable_fits_format(header: fits.Header) -> None: # https://github.com/astropy/astropy/blob/master/astropy/io/fits/hdu/table.py#L548 # Implemented the validators that are aligned with the FITS Spec # http://articles.adsabs.harvard.edu/pdf/1995A%26AS..113..159C assert header['NAXIS'] == 2 assert header['BITPIX'] == 8 assert header['TFIELDS'] > 0 and header['TFIELDS'] < 1000 for idx in range(1, header['TFIELDS'] + 1): t_form: str = header.get(f'TFORM{idx}', None) assert not t_form is None t_type: str = header.get(f'TTYPE{idx}', None) assert not t_type is None else: if idx > 999: raise NotImplementedError(f'Invalid FITS Format')
def test_post_sanitize_header(): test_subject = FITSHelper(io.BytesIO(), io.BytesIO()) data = np.arange(10000).reshape(100, 100) header = Header() wcs = WCS() header.set('REMAIN1', 'VALUE1') header.set('DQ1', 'dqvalue1') header.set('NAXIS', 2) header.set('NAXIS1', 88) header.set('NAXIS2', 212) result = CutoutResult(data, wcs=wcs) test_subject._post_sanitize_header(header, result) assert 'VALUE1' == header.get('REMAIN1'), 'REMAIN1 should still be there.' assert not header.get('DQ1'), 'DQ1 should be gone.'
def test_cd_pc_header_fix(): test_subject = FITSHelper(io.BytesIO(), io.BytesIO()) data = np.arange(10000).reshape(100, 100) header = Header() wcs = WCS() header.set('NAXIS', 2) header.set('NAXIS1', 88) header.set('NAXIS2', 212) header.set('CD1_1', 44) header.set('CD1_2', 88) header.set('CD2_1', 22) header.set('CD2_2', 33) result = CutoutResult(data, wcs=wcs) test_subject._post_sanitize_header(header, result) assert not header.get('CD1_2'), 'CD1_2 should be renamed.' assert not header.get('CD1_1'), 'CD1_1 should be renamed.' assert 44 == header.get('PC1_1'), 'PC1_1 should be 44.' assert 33 == header.get('PC2_2'), 'PC2_2 should be 33.'
def test_pc_leading_zeroes_header_fix(): test_subject = FITSHelper(io.BytesIO(), io.BytesIO()) data = np.arange(10000).reshape(100, 100) header = Header() wcs = WCS() header.set('NAXIS', 2) header.set('NAXIS1', 88) header.set('NAXIS2', 212) header.set('PC01_01', 44) header.set('PC01_02', 88) header.set('PC02_01', 22) header.set('PC02_02', 33) result = CutoutResult(data, wcs=wcs) test_subject._post_sanitize_header(header, result) assert not header.get('PC01_02'), 'PC01_02 should be renamed.' assert not header.get('PC01_01'), 'PC01_01 should be renamed.' assert 22 == header.get('PC2_1'), 'PC2_1 should be 22.' assert 88 == header.get('PC1_2'), 'PC1_2 should be 88.'
def test_post_sanitize_header_ctype(): test_subject = FITSHelper(io.BytesIO(), io.BytesIO()) data = np.arange(10000).reshape(100, 100) header = Header() wcs = WCS() header.set('REMAIN1', 'VALUE1') header.set('DQ1', 'dqvalue1') header.set('NAXIS', 2) header.set('NAXIS1', 88) header.set('NAXIS2', 212) header.set('CTYPE1', 'ctype1value') header.set('WCSAXES', 2) result = CutoutResult(data, wcs=wcs) assert header.index('WCSAXES') > header.index('CTYPE1'), \ 'Start with bad indexes...' test_subject._post_sanitize_header(header, result) assert 'VALUE1' == header.get('REMAIN1'), 'REMAIN1 should still be there.' assert not header.get('DQ1'), 'DQ1 should be gone.' assert header.index('WCSAXES') < header.index('CTYPE1'), 'Bad indexes'
def load(filepath): """ :param filepath: fits image path :return: an Image """ data = pyfits.getdata(filepath, hdu=0) primary = Header(pyfits.getheader(filepath, 0)) headers = [primary] extcount = int(primary.get("NEXTEND", 0)) for idx in range(1, extcount): ext = Header(pyfits.getheader(filepath, idx)) headers.append(ext) return Image(array(data), headers)
print('print(c.image)') print(c.image) print('print(c.value)') print(c.value) print('print(c.unit)') print(c.unit) print('print(c.comment)') print(c.comment) print('+++Put into header') print('hdr = Header([c])') hdr = Header([c]) print("hdr['EXPTIME']") print(hdr['EXPTIME']) print("hdr.get('EXPTIME')") print(hdr.get('EXPTIME')) print("hdr.comments['EXPTIME']") print(hdr.comments['EXPTIME']) print("hdr.cards['EXPTIME'].unit") print(hdr.cards['EXPTIME'].unit) print('+++ --> Header object assignment') print("hdr = Header()") hdr = Header() print("hdr['EXPTIME'] = 12*u.s") hdr['EXPTIME'] = 12 * u.s print("hdr['EXPTIME']") print(hdr['EXPTIME']) print("hdr.get('EXPTIME')") print(hdr.get('EXPTIME')) print("hdr.comments['EXPTIME']")
def update_header(header: fits.Header, keyword, new, comment): old = header.get(keyword) print(f'old {keyword}: {old}\tnew {keyword}: {new}') if old != new: header[keyword] = new header.comments[keyword] = comment