astropy.io.fits - HIERARCH 关键字不适用于 CONTINUE 卡:错误或 FITS 标准的 "Feature"?
astropy.io.fits - HIERARCH keywords don't work with CONTINUE cards: Bug or "Feature" of the FITS standard?
astropy.io.fits
手册指出,我们可以使用 header 超过 8 个字符的关键字。在这种情况下 HIERARCH cards will be created. The manual also states, that if we want to store keyword-value pairs longer than 80-characters, continue cards will automatically be created.
然而,在实践中,这两个定义似乎只是互斥的,即我们不能创建包含关键字值对的 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)
或试图用这样的 header 保存 FITS 文件时,错误 ValueError: The keyword TEST TEST with its value is too long
被提出。
这是 FITS 标准的 "unintended feature",即 HIERARCH
关键字是否可以不与 CONTINUE
卡继续,或者这可能只是 astropy.io.fits
的错误?
以下部分答案由一位熟悉 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 语句的卡,显然它一直保持这样。相关old PyFITS code is:
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, W.D. et al. 2010, Astronomy &
天体物理学卷。 524, A42)。 HIERARCH 关键字约定是
给予
Wiecencec, A. et al. 2009, "The ESO HIERARCH Keyword Convention") and the CONTINUE convention is given by the HEASARC FITS Working Group, 2007. "The CONTINUE Long String Keyword Convention". Reading carefully both of these definitions, I see absolutely no reason why they should be mutually exclusive. Hence, I created an issue in the astropy issue tracker.
编辑:
正如 Iguananaut 的回答中提到的那样 - 它们确实相互排斥似乎有一个原因,即 HIERARCH 卡在形式上根本不包含任何价值......疯狂但真实而且所以我认为我的回答是不正确的。
我在 issue opened by the OP 中写了这个,但我也在这里复制它的一个版本作为可能的答案:
这里的问题是 CONTINUE 约定严格限于扩展具有字符串值的卡片的值(即它不适用于具有不同类型值的卡片)。然而,从形式上讲,使用 HIERARCH 约定的卡片根本没有任何价值,因此 CONTINUE 约定不适用于它,除非有人在使用 HIERARCH 约定的卡片解析中隐式支持 CONTINUE 约定。因为在如何做到这一点上存在歧义(例如关键字的最大长度是多少?)并且因为 HIERARCH 约定没有明确允许这种解释(它给出了一组关于如何解释HIERARCH 卡)FITS 读者应避免为 HIERARCH 卡的某些未记录的解释添加任何隐式支持(因此建立了另一个大多数 readers/writers 不支持的隐式约定)。
我们可以做的是游说 ESO HIERARCH 公约的作者更新他们的公约,以便与 CONTINUE 公约明确相互兼容,届时在任何支持这两种公约的 FITS 阅读器中都应该允许这样做。但与此同时,这个问题充满了困难,即使看起来 "obvious" 他们可以一起工作。
astropy.io.fits
手册指出,我们可以使用 header 超过 8 个字符的关键字。在这种情况下 HIERARCH cards will be created. The manual also states, that if we want to store keyword-value pairs longer than 80-characters, continue cards will automatically be created.
然而,在实践中,这两个定义似乎只是互斥的,即我们不能创建包含关键字值对的 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)
或试图用这样的 header 保存 FITS 文件时,错误 ValueError: The keyword TEST TEST with its value is too long
被提出。
这是 FITS 标准的 "unintended feature",即 HIERARCH
关键字是否可以不与 CONTINUE
卡继续,或者这可能只是 astropy.io.fits
的错误?
以下部分答案由一位熟悉 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 语句的卡,显然它一直保持这样。相关old PyFITS code is:
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, W.D. et al. 2010, Astronomy & 天体物理学卷。 524, A42)。 HIERARCH 关键字约定是 给予 Wiecencec, A. et al. 2009, "The ESO HIERARCH Keyword Convention") and the CONTINUE convention is given by the HEASARC FITS Working Group, 2007. "The CONTINUE Long String Keyword Convention". Reading carefully both of these definitions, I see absolutely no reason why they should be mutually exclusive. Hence, I created an issue in the astropy issue tracker.
编辑: 正如 Iguananaut 的回答中提到的那样 - 它们确实相互排斥似乎有一个原因,即 HIERARCH 卡在形式上根本不包含任何价值......疯狂但真实而且所以我认为我的回答是不正确的。
我在 issue opened by the OP 中写了这个,但我也在这里复制它的一个版本作为可能的答案:
这里的问题是 CONTINUE 约定严格限于扩展具有字符串值的卡片的值(即它不适用于具有不同类型值的卡片)。然而,从形式上讲,使用 HIERARCH 约定的卡片根本没有任何价值,因此 CONTINUE 约定不适用于它,除非有人在使用 HIERARCH 约定的卡片解析中隐式支持 CONTINUE 约定。因为在如何做到这一点上存在歧义(例如关键字的最大长度是多少?)并且因为 HIERARCH 约定没有明确允许这种解释(它给出了一组关于如何解释HIERARCH 卡)FITS 读者应避免为 HIERARCH 卡的某些未记录的解释添加任何隐式支持(因此建立了另一个大多数 readers/writers 不支持的隐式约定)。
我们可以做的是游说 ESO HIERARCH 公约的作者更新他们的公约,以便与 CONTINUE 公约明确相互兼容,届时在任何支持这两种公约的 FITS 阅读器中都应该允许这样做。但与此同时,这个问题充满了困难,即使看起来 "obvious" 他们可以一起工作。