4

astropy.io.fits手册指出,我们可以使用超过 8 个字符的标题关键字。在这种情况下,将创建 HIERARCH 卡。该手册还指出,如果我们要存储超过 80 个字符的关键字-值对,将自动创建继续卡

然而,在实践中,这两个定义似乎只能相互排斥,即我们不能创建包含关键字值对的 FITS 文件,其中关键字长于 8 个字符(即 HIERARCH 关键字)并且值非常长细绳。

一个例子:

from astropy.io import fits

header1 = fits.Header()
header2 = fits.Header()
header3 = fits.Header()

header1['TEST'] = 'superlongstring'*10
header2['TEST TEST'] = 'superlongstring'
header3['TEST TEST'] = 'superlongstring'*10

在这里header1并且header2将是正确的,但是当调用repr(header3)或尝试保存具有此类标头的 FITS 文件时,ValueError: The keyword TEST TEST with its value is too long会引发错误。

这是 FITS 标准的“意料之外的功能”,即HIERARCH关键字不能在CONTINUE卡片上继续,或者这可能只是一个错误astropy.io.fits

4

2 回答 2

1

答案的以下部分由熟悉 astropy 代码库的同事提供。

查看astropy源代码,明确排除在属于 HIERARCH 关键字的值中使用 CONTINUE 卡。

在源代码中我们发现(astropy/io/fits/card.py#L1227-1236):

keywordvalue_length = len(keyword) + len(delimiter) + len(value)
if (keywordvalue_length > self.length and
        keyword.startswith('HIERARCH')):
    if (keywordvalue_length == self.length + 1 and keyword[-1] == ' '):
        output = ''.join([keyword[:-1], delimiter, value, comment])
    else:
        # I guess the HIERARCH card spec is incompatible with CONTINUE
        # cards
        raise ValueError('The keyword %s with its value is too long' %
                         self.keyword)

该评论来自 2011 年,并在重新设计 pyfits 时被放在那里。在此之前,pyfits 还可以独占读取或写入 HIERARCH 卡或带有 CONTINUE 语句的卡,显然它是这样保持的。相关的旧 PyFITS 代码是

if cardimage[:8].upper() == 'HIERARCH':
    card = _HierarchCard()
    # for card image longer than 80, assume it contains CONTINUE card(s).
elif len(cardimage) > Card.length:
    card = _ContinueCard()

但是,根据我的感觉,HIERARCH 并没有特别的理由将长值与 CONTINUE 排除在外。

到目前为止,我的同事给出了答案,他最后建议在 astropy 问题跟踪器中创建票证。

我自己也做了一些研究。HIERARCH 和 CONTINUE 关键字都不是官方FITS 标准的一部分(Pence, WD et al. 2010, Astronomy & Astrophysics Vol. 524, A42)Wiecencec, A. 等人给出了 HIERARCH 关键字约定 。2009 年,“ESO HIERARCH 关键字约定”)和 CONTINUE 约定由HEASARC FITS 工作组,2007 年。“CONTINUE 长字符串关键字约定”。仔细阅读这两个定义,我完全没有理由认为它们应该相互排斥。因此,我在 astropy 问题跟踪器中创建了一个问题

编辑: 正如Iguananaut的回答中提到的那样——它们确实是互斥的似乎有一个原因,即 HIERARCH 卡正式不包含任何价值......疯狂但真实,因此我认为我的回答是不正确的.

于 2015-04-30T17:11:06.687 回答
1

我在 OP 打开的问题中写了这个,但我也在此处复制它的一个版本作为可能的答案:

这里的问题是,CONTINUE 约定严格限制为使用字符串值扩展卡片的值(即它不适用于具有不同类型值的卡片)。但是,从形式上讲,使用 HIERARCH 约定的卡片根本没有任何价值,因此 CONTINUE 约定不适用于它,除非在使用 HIERARCH 约定解析卡片时隐式支持 CONTINUE 约定。

可以做的是游说 ESO HIERARCH 约定的作者更新他们的约定,以便与 CONTINUE 约定明确相互兼容,此时任何支持这两种约定的 FITS 阅读器都应该允许这样做。但与此同时,这个问题也充满了困难,即使看起来“很明显”他们可以一起工作。

于 2015-04-30T20:25:03.057 回答