FITS 基本格式及其扩展

一、FITS 一般介绍
二、FITS 的一般结构
三、FITS 基本格式
四、FITS 的随机组扩展
五、FITS 的表扩展 (ASCII 表扩展)
六、FITS 的一般扩展和块因子
参考文献

FITS 基本格式及其扩展

柯大荣 赵永恒

(中国科学院北京天文台)

1993 年 7 月

摘 要

FITS (Flexible Image Transport System) 是国际天文学会(IAU)1982 年确定的世界各天文台之间用于数据传输、交换的统一标准格式。它描述了数据的定义和数据编码的一般方法。它是与机器无关的,用磁带作为标准传输介质的独立方法。它提供了图象的单值转换,精度包括符号在内可以达到 32 位。对一维、二维、三维、甚至多维的数据类型都提供了合适的转换。它不仅适用于天文数据, 对其他学科的数据也是可用的。本文介绍了 FITS 的基本格式及其对随机组矩阵的一般扩展,和用于天文星表的表扩展格式, 最后对FITS 格式的块结构与其扩展的一般规则也作了详细的介绍。

主题词: FITS 数据格式 数据结构。

FITS Basic Format and Extensions

Ke Darong, Zhao Yongheng

(Beijing Astronomical Observatory, Chinese Academy of Sciences )

July, 1993

ABSTRACT

FITS (Flexible Image Transport System) was recommended as the standard format for interchange of image data between all observatories by Commission 5 at the 1982 General Assembly of IAU in Patras. It described a general way to encode both a definition of the data and the data itself in a machine independent was using magnetic tape as the standard transport medium. It provides for the unambiguous transfer of images that have accuracies up to 32 bits, include sign. It supports the transformation for the data type with one, two, three or multi-dimensions. It not only is suitable to astronomical data but can be used to the data in other subjects. In this paper we introduce the FITS basic format, the random-groups extension and the ASCII table extension for the images and catalogs of astronomical data, and the FITS blocking and the rules of the generalized extension of FITS format.

一、FITS 一般介绍

近年来, 在射电天文里随着综合孔经望远镜和甚大天线阵的出现,在光学天文里增加了使用 CCD 阵和其他数字技术。另一方面天文卫星的发展,观测也非常频繁, 以数字形式记录的图象量的增加也非常巨大。为了比较不同天文台得到的数据图象和连续处理这些图象。 天文学家经常希望能得到其他天文台的数据、与自己得到的结果进行比较。可行的办法是采用一种独特的磁带交换格式用于合作者之间数字图象的传输。

这种独特的交换格式需要非常灵活,它必须容易方便地进行 n 维的及有均匀间隔的数组的传输,它将能提供一种传输与图象有关的辅助参数的途径, 既使不是全部参数, 或者这些参数的全部种类,但可指出一个顺序。为了鼓励使用“自动记录”数据磁带,它将提供一种在标准数据文件里传输任意数量内容的方法。最后,它也能为新研究所采用和进行交换,并且可用于天文学以外的的图象处理。

为了寻求这种独特的交换格式,七十年代天文界研制和使用了好几种格式, 企图找出一种数据传输问题的解决办法。1979年美国 D.C.Wells(Kitt Peak National Observatory, Tucson, Arizona, U.S.A.)和 E.W.Greisen (National Radio Astronomy Obsorvatory, Charlottesville, Virginia, U.S.A.)等人,首先提出了天文学灵活图象传输系统: FITS(Flexible Image Transport System), 它描述了数据定义和数据本身编码的一般方法, 是与机器无关的, 用磁带作为标准传输介质的独立方法。它提供了图象的单值转换、精度达到 32 位,包括符号在内。这种格式对人和机器都容易编译。用现代地面和人造卫星手段产生了大量的数据,而数据类型有一维的、二维的、三维的、甚至是多维的。对射电、红外、光学和X -射线数据这是合适的。典型的图象用一或二个空间格点,时间频率或者偏振表示该源强度。但是它也可能直接表示如频指数、速度和偏振位置角等在时间或者空间位数量的减少。FITS 对这些数据类型都提供了合适的转换。用一个标准格式传输天文图象的优势性立刻被认识到,而且大多数主要的天文台用它作为数据交换的基本格式。

后来在 1982 年希腊 Patras 召开的 IAU 大会上,第五委员会(学术资料与天文数据委员会)推荐 Wells 等人在 1981 年发表的 FITS 磁带格式作为所有天文台之间进行图象数据交换的标准格式(IAU Inf. Bwll.49,1983)。在那次会议期间也推荐了 Greisen 和 Harten 等人1981 年发表的 FITS 格式的第一扩展格式, 这个随机组扩展(“random-gromps”extension)定义了传输大量带有不规则间隔数据阵的方法。

FITS 格式的使用证明,它对天文学家是非常有用的,现在天文学家可以在不同天文台之间或不同的图象处理系统进行数据交换,只要说明是使用的 FITS 格式就可处理。目前, 不论是综合孔径、甚大阵、CCD观测记录,还是 CDS 发表的天文星表和 CD-ROM 星表等都使用 FITS 格式来存贮交换数据。 为了使我国的天文工作者能了解、掌握和使用 FITS 格式。我们下面将对 FITS 的一般结构和不同的数据结构作一详细的介绍。并给出射电观测、CCD 观测和星表 FITS 格式的例子。

二、FITS 的一般结构

一个 FITS 文件包含一系列逻辑单元,而每个单元的开头都是用一组标题记录描述随后的数据记录。

一个 FITS 文件的逻辑记录长度总是 2880 字节(bytes),每字节 8 位(bits)。标题和数据组都在一个新的逻辑记录里起始。FITS 标题用 ASCII 码编辑成每一个开始用一个 8 字符的关键词(keyword) 定义信息的类型(80字符)。参数值用标准 FORTRAN-77 规则编辑,它们详细地描述了标题记录后面的数据。在文件里最后的标题/数据单元后面,可能存在附加的记录。

标题的设计对描述的数据组所需的参数定义有较大的灵活性。总是需要给出很好定义的标准关键词组,甚至用简单的程序也容易能够读出数据的基本内容。一个 FITS 文件的模块结构也使它容易转换更复杂的数据。以后,它提供了一种可能性,即将 FITS 基本格式标准扩展到新的数据类型,而不用修改现在的 FITS定义。

三、FITS 基本格式

1、数据的物理表示方法

FITS 是在 7 磁道和 9 磁道磁带上记录数字图象的一种数据格式。 数字位的设计和这种磁带的其他物理特性将符合有关的 ANSI (美国国家标准局) 的技术要求。为了简便起见在磁带上每一个物理记录将含有一个并且仅只含有一个逻辑记录。 而且, 全部记录长度均为 23040 bits (2880 bytes / 8 bit, 3840bytes/6 bit)。这个长度能用市场上出售的所有计算机的位长和字长除尽, (即 6,8,12,16,18,24,32,36,48,60 和 64 bits)。这种通用性适用于在各种各样的计算机上读写记录。记录长度对所有的标准磁带 (如800,1600,6250bpi 9 磁道)提供了足够写记录的长度,因此它对小计算机也不存在问题。

对每一个图象用一个磁带文件表示。每个文件开头用了许多包含标题数据的逻辑记录。标题数据用 7 位 ASCII 码的 80 字符形式书写。在 8 位字节里右对齐。每一字符的高位(奇偶检验位)将是零。

第一个数据组记录将直接出现在上一个标题记录的后面。 第一个图象象元值将出现在该第一个数据数组里第一象元位置。每一行第一个象元总是放在当前逻辑记录里下一个可利用的象元位置。 因此写图象数据记录具有最大的效率。不菅记录长度(2880 bytes)一行的具体长度是多少(可以是任一正整数),上面的数据记录的剩余部分用一些零(0)填在最后一个数组象元的后面。FITS 支持三种类型象元值表示法:8 bit 无符号二进制整数, 16 bit 二进制补码带符号二进制整数, 和 32 bit 二进制补码带符号二进制整数。 对16 bit(2字节)和 32 bit(4字节)的二进制整数, 其第一位是符号位, 最后是最小有效位, 即高位在前低位在后。因此Dec PDP-11系列的用户,必须改变那个系列设计的字符交换指令。

表示图象数据的文件用一个带记录结束符表示结束。 读这个文件的程序可以跳过任一记录找到结束符之前最后的数据记录。这个约定允许将来发明新的记录类型,而我们仅仅要求它们必须到数据数组记录的后面,而且它的长度是23040 bit。标题参数的约定允许 FITS 数据数组的大小是 0。因此,希望存在的标准数据数组可能不存在, 而可能由一些新类型的记录代替。可以不要求在磁带上的所有文件具有同样大小。 最后一个附加的带记录结束符写在该磁带上最后的数据文件结束符的后面。

2、标题记录

标题记录描述数据数组的结构和坐标系统及传送任一附加的参数和伴随的正文。 这样的记录的定义在建立一个交换格式中是重要的。在 FITS 里用了 ASCII 编码的卡片映象, 以使能用人机对话方式对标题记录进行编译。不菅是在标准参数卡片映象和注释卡片上都鼓励使用注释,可以传输无限量的文本。包括, 例如源程序, 用的卡片 映象数是不限定的, 以便能够补充扩展。用关键词 END 表示标题记录结束。

一个 FITS 标题卡片映象的基本语法格式是:

Keyword= Value/Comment

(关键词=参数值/注释说明)

关键词是一个左边对齐的 8 字符 ASCII 码字符串, 放在 1-8 列里, 字母必须大写。“=”号出现在第 9 列, 而第 10 列是空格。由于某些限定, 参数值按 FORTRAN-77 表控规定书写,直接可读格式。逻辑值(F 或 T)和数值在数值区中紧靠右排列,字符串用符号: ' ' 括出,字母大写。符号“/”用来表示数值区结束。注释说明紧接符号“/”,用大小写ASCII码字符书写。因此,为了在普通计算机上简化参数译码,要求对大多数基本参数使用一个固定格式,而且对所有其他参数也建议使用这个固定格式,建议和部分要求的固定格式如下:

1) Logical Variable (逻辑变量): T 或 F, 在 30 列里。

2) Integer Variable (整数变量): 右对齐在 11-30 列里,若有虚部右对齐在 31-5 0 列里。

3) Real Variable (实变量): 要求 10 进制小数点,右对齐(如果用指数记数法)在 11-30 列里, 若有虚部,右对齐(如果用指数记数法)在 31-50 列里。

4) Character Variable (字符变量):虽然允许较长的字符串,但正常的长度用 8 个字符表示。在 11 列里用符号 ' 随后跟字符串,紧接着用一个符号 '结束,它不能出现在 20 列之前。

3、最小的 FITS 数据文件

为了简化普通 FITS 磁带的编码,以便用于最基本的计算机系统, 我们定义一组最小设置的关键词。关键词对描述磁带上的该图象是完全必要的。这些关键词在标题记录里具有一个固定的顺序,并用固定的格式表示。这 5 个关键词是

SIMPLE,BITPIX,NAXIS,NAXISn 和 END。它们的含义是:

SIMPLE 逻辑变量,指明文件是否符合基本 FITS 标准。

BITPIX 整数变量,指明用于表示每一个象元值的位数。

NAXIS 整数变量,指明图象里坐标轴数。

NAXIS1 整数变量,指明在数组内沿最快变化轴的象元数。

NAXIS2 整数变量,指明在数组内沿次快变化轴的象元数。

最基本的关键词参数 SIMPLE 要求在每一个文件第一个标题记录的第一张卡片映象里。 这个参数是一个逻辑变量,并且指明现在的磁带文件是否符合基本的 FITS 标准。SIMPLE=T, 表明数据数组是用 8 位无符号,或 16 位或 32 位二进制补码,二进制整数用典型的字符序列写的。数组是一个一般的 n 维均匀间隔数组。而且要求关键词参数在第一个标题记录里,指定位置中提供。如果出现跟随的图象数据记录附加记录的注释用零作为图象的大小,则并不违背 SIMPLE=T。NAXISn 参数仅表明了 NAXISm 里的 n 轴, 这里 m 是 NAXIS 给定值, 最大限定是NAXIS999。END 表示最后的卡片映象, 用在该文件里最后的标题记录里。在最后的标题记录里任何剩余的卡片映象, 必须用ASCII 码空格填满。

所有接受程序将编译、检查和操作没有数据数组的情况。这里基本关键词用设置 NAXIS=0, 或者用设置一个或更多的 NAXISn=0 发出这样情况的信号。描述专门数据记录的结构如在天空不均匀空间位置的光谱观测,在这样情况或许简单的程序就能列出标题和印出结尾磁带结束符之前专门的数据记录数。

作为一个例子,我们假定给出一个 320×512 CCD 照相图象的 FITS 文件。

标题记录文件如下:

CARD# 0........1.........2.........3.........4.........5........6
      12345678901234567890123456789012345678901234567890123456780
I/1   SIMPLE  = T/
I/2   BITPIX  = 16/
I/3   NAXIS   = 2/
I/4   NAXIS1  = 320/
I/5   NAXIS2  = 512/
I/6   END

记录号I/1,I/2,I/3,I/4,I/5,I/6,是为说明清楚加上的, I/1 —I/5,是FITS 文件必须要有的基本关键词,按顺序在标题记录前几行,当然在后面还可以附加一些随意关键词如观测时间,观测对象, 使用仪器,观测者、观测单位等。另一个基本关键词 END 一定出现在标题记录的最后一个卡片映象位置上。

I/1 SIMPLE=T 其中逻辑值 T(True)表明该磁带文件是简单的 FITS 数据文件, 标题记录和数据记录都按 FITS 约定处理, 若逻辑值为 F(False), 则说明不能简单处理。I/2 BITPIX=16 表明每一象元值为16 位带符号的补码形式,每一象元值占用两个字节, 每一记录可记 1440 个象元值(23040÷16= 1440)。I/3 NAXIS=2 表明图象为两维阵列(它也规定了下面只有两个轴参数) I/4 NAXIS1=320 表明第一轴 (列变化方向)的长度为 320 个象元。I/5 NAXIS2=512 表明第二轴(行变化方向)的长度为 512行。I/6 END表明标题结束。记录后面的所有零字节都用 ASCII 码空格填满。

按例子中的标题记录参数规定。数据文件是简单的 FITS 格式, 两维图象的规格为 320×512, 数值为双字节 16 位补码(实际只占用其中 14 位)。

注意, SIMPLE=F 表示磁带并不遵循基本 FITS 规则,可能是由于每象元的位数或象元值的表示是非标准的。SIMPLE=F 主要用于某研究单位内部的数据存贮或交换。然而对外交换数据则应该遵循 FITS 基本规则。

4、基本 FITS 格式的任选关键词

做为简单的图象数据交换,上述的最小 FITS 文件已够用了, 然而对于天文图象数据来说, 坐标信息的辅助参数对明确地解释数字图象是非常重要的, 尤其是为比较天体在不同探测系统之间的时候更是必不可少的。因此 FITS 强调对每幅图象详细地定义其强度、坐标和文本信息, 为此目的选择了一组可以任选的关键词, 它们出现的次序或使用与否是任选的, 但却强烈推荐使用这些关键词。

——BSCALE(浮点数)和 BZERO(浮点数):用于将磁带上的象元值转换为真实值的参数:真实值= ( 磁带值×BSCALE)+BZERO, 这是由于基本 FITS 的数据只能是 8 位、16 位或 32 位的整数格式,如果观测得到的是浮点数,则可以用两个关键词将其转换为基本 FITS 的数据格式。有时对于整数形式的观测数据通过这种变换也可能会减少数据存贮量。

——BUNIT(字符):强度单位,其建议值为 'K',开尔文(温度值); 'JY/BEAM',每射束的 JY; 'JY/PIX',每象数的 JY; 'MAG/PIX', 每象元的星等; 'M/SEC', 每秒米(如速度场); 'DEGREES', 以度为单位的角度(为偏振位置角);' ',无单位(为光学深度,谱指数)。

——BLANK (整数), 如果某象元未定义值, 则磁带上该象元对应位置上所写入的就是由 BLANK 定义的数值。例如对 16 位整数格式, 通常 BLANK 的值取 -32768。该关键词的值应该与任何已定义值的象元值不同。

——OBJECT (字符): 图象名,通常是观测对象的名字。

——DATE (字符): 写 FITS 文件的日期('日/月/年')。

——DATE_OBS (字符): 数据的观测日期('日/月/年')。

——ORIGIN (字符): 写磁带的研究单位。

——INSTRUME (字符): 数据的探测仪器。

——TELESCOP (字符): 所使用的望远镜。

注意, 这两个长关键词 均被截短为 8 个字符,这是作为创立新关键词的约定。

——OBSERVER (字符):观测者姓名。

——CRVALn (浮点数), CRPIXn(浮点数), CDELTn(浮点数), CTYPEn(字符)和 CROTAn(浮点数):这些关键词是用于定义第 n个轴的象元坐标与真实的物理坐标之间的关系。CTYPEn 定义了第 n 轴的物理坐标类型,其建议值为: 'RA',以度为单位的赤径, 'DEC',以度为单位的赤纬; 'LL', 以度为单位的切平面(东西向);'MM', 以度为单位的切平面(南北向); 'GLON', 以度为单位的银经; 'GLAT',以度为单位的银纬 ; 'ELON', 以度为单位的日经; 'ELAT',以度为单位的日纬; 'TIME',以秒为单位的时间; 'FREQ', 以赫兹为单位的频率; 'LAMBDA',以米为单位的波长; 'VELO',以米/秒为单位的速度; 'VELD_LSR', 相对于局域标准静止系的速度; 'VELO_HEL', 相对于太阳的速度; 'VELO_OBS',相对于观测者的速度; 'PLXEL',无单位; ' ',无单位; 'STOKES', Stokes 偏振参数与合成束样,值 0 为束,1=I, 2=Q, 3=U, 4=V;'COMPLEX', 复数值, 1=实部, 2=虚部; 'DISTANCE', 天空中两点间距离, 用于非标准坐标系统 ;'ANGLE',以度为单位的在天空中的角度。注意在 FITS 文件中使用的单位与国际单位值(SI) 相一致只是增加了角度单位: 度和流量单位: JY (央斯基)。CRVALn 和 CRPIXn 给出了某一个参考象元在第 n 轴上的物理坐标值 (CRVALn) 和在数据阵中第n轴上的象元位置(CRPIXn),象元位置在基于通常的 FORTRAN 意义上是在 1 到NAXISn 之间,但 CRPIXn 是个浮点数, 因此参考象元位置可能并不对应一个实际的象元,如 129.5 或 -3 的值也是可以接受的。 CDELTn 为第 n 轴上象元间的物理坐标间隔, 即是物理坐标的增量, 如同FORTRAN 中的计数以 1 为增量。CROTAn 是第 n 个物理坐标轴相对于象元坐标的旋转角。

——DATAMAX(浮点数)和 DATAMIN(浮点数): 给出文件中数据的最大值和最小值。

——EPOCH(浮点数): 坐标系统的历元(以年为单位)。

——空白(无)、COMMENT(无)和 HISTORY(无): 用于说明其它一些信息表明第 9-80 列是注释用的 ASCII 文本。

5、完整的 FITS 标题的例子。

表: 1

0........1.........2.........3.........4.........5.........6.........7.........8
CARD# 12345678901234567890123456789012345678901234567890123456789012345678901234567890
1/1:  SIMPLE  = T /Basic format from nrao(cv)
1/2:  BITPIX  = 16 /2-byte twos-compl integers
1/3:  NAXIS   = 4 /Number of axes
1/4:  NAXIS1  = 512 /#pixels/row (RA)
1/5:  NAXIS2  = 512 /#Rows (DEC)
1/6:  NAXIS3  = 1 /#Frequencies
1/7:  NAXIS4  = 2 /#Stokes (beam,I,Q,U,V)
1/8:
1/9:  BSCALE  = 1.278419E-07 /Real=tape*bscale+Bzero
1/10: BZERO   = 0.0 /No bias added
1/11: BUNIT   = 'JY/BEAM ' /Units of brightness
1/12: OBJECT  = '0810+665' /Source name
1/13:
1/14: CRVAL1  = 122.5419617 /Ref point value degrees
1/15: CRPIX1  = 256.00 /Ref point pixel location
1/16: CTYPE1  = 'LL ' /Coord type:Value is RA
1/17: CDELT1  = -6.944167E-05 /Coord value increment with count degr
1/18: CROTA1  = 00 /CCW Rotates =RA into +DEC
1/19: CRVAL2  = 66.5995040 /Ref point value degrees
1/20: CRPIX2  = 256.00 /Ref point pixel location
1/21: CTYPE2  = 'MM ' /Coord type: value is DEC
1/22: CDELT2  = -6.944167E-05 /Coord value increment with count degr
1/23: CROTA2  = 0.0 /CCW Rotates +DEC into +RA
1/24: CRVAL3  = 4.8856000E+09 /Ref point value HZ
1/25: CRPIX3  = 1.0 / Ref point pixel location
1/26: CTYPE3  = 'FREQ ' /Coord type: value is HZ
1/27: CDELT3  = 0.0 /Coord value increment with count degr
1/28: CROTA3  = 0.0 /Freq rotation undefined
1/29: CRVAL4  = 0.0 /Ref point value stokes#
1/30: CRPIX4  = 1.0 /Ref point pixel location
1/31: CTYPE4  = 'STOKES ' /Coord type: value is #
1/32: CDELT4  = 1.0 /Coord value increment with count is #
1/33: CROTA4  = 0.0 /Stokes rotation undefined
1/34:
1/35: INSTRUME= 'VLA ' /Nrao(cv) vla mapping programs
1/36:
2/1:  DATE-MAP= '16/10/78' /Map creation date DD/MM/YY
2/2:  DATE    = '27/05/79' /Map writing date DD/MM/YY
2/3:  ORIGIN  = 'NRAO(CV) PGM=DEC2FITS(V1)'
2/4:  HISTORY VLACV MAP METHOD='FFT'DATA='OBS. VISIBILITV'
2/5:  HISTORY VLACV MAP WCONU= 0.00000E+00 WCONV= 0.00000E+00 TCONU=0
2/6:  END

表 1 为一个记录射电数据的 FITS 文件的完整标题, 它占了两个记录。标题的前七个卡片构成了图象的必要信息, 并以规定的次序排列。第 8、13、34 和 36 卡片像是空白关键词, 是为了使标题具有易读性。第9-12 卡片像定义图象的亮度标度和名称, 卡片 14-33 提供了坐标轴的数据,而卡片 35 以后提供了一些其他信息。END卡片是第二个记录中的第 6 个卡片,而第二个记录的其余 30 个卡片像均为空格。图象数据开始于该磁带文件的第三个记录。本例在每个参数卡片的后面都加上了额外的注释,这样明显地增加了可读性,但却不是必须的。

注意,第 1-7 卡片都使用固定格式, 这是必须的,但对其它参数卡片中则并不要求这样做。然而推荐对所有参数卡片使用固定格式: 即所有的逻辑值及整数值均右对齐到 30 列, 对浮点数可使用 FORTRAN 的 F和 E 格式,在 F 格式中必须出现小数点, E 格式则必须右对齐到 30 列;字符串变量需用单 ' (ASCII 码:八进制 47)括起, 左 '号在 11 列,附加上些尾空格使右 '号在 20 列或其后。由于不能冗余任意长的字符串, FITS 磁带的接受者应能解释字符串的前八个字符(出现在单引号之间), 而 FITS 磁带的建立者可以写更长的字符串, 但不能指望接受者能解释八个字符以外的内容 (如本例中的 ORIGIN 卡片)。注意串记法对前后空格有不同的处理: 'LL '等于'LL'但不等于 ' LL'。对参数值的写法可以有灵活得多的格式, 但基本FITS 规则要求参数值可以被 FORTRAN 77 标准所读出。

现在来详细地分析一下本标题的内容, 必须的卡片像指出磁带文件是基本格式(SIMPLE=T), 数据阵是由 16 位补码二进制整数(BITPIX=16)组成的, 并是四维的(NAXIS=4)。NAXISn 卡片按 n 的增加而排列的(这是必须的), 说明数据是由两个512×512矩阵组成的。

BSCALE 和 BZERO 参数用于将磁带上的图象数值转换为实际的值, 在 BSCALE卡片的注释域中的公式是FITS 标准的一部分。 因此最大的实际象元值 (对应磁带值 32767) 是每束 4.19mJy。关键词 BUNIT 和OBJECT 是字符串变量并表示对应的图象亮度单位和图象名字。本例射电图没有包含“空”象元, 因此没有给出 BLANK 卡片。

坐标定义是基于一个参考象元的概念,本例中参考象元位于数据阵中心附近(对应于头两个坐标)并有值08h10m10s.07+66°35′58″.2, CDELT1 和 CDELT2 的符号说明磁带上的第一个象元对应射电图的东北角。CTYPEn 参数表明坐标系统是通常用于合成图的(L,M)系统。旋转参数 CROTAn 描述了坐标系统相对于象元坐标系统的旋转,本例中也提供了额外的注释。第三个轴的维数为 1 ,用于传输与数据有关的参数, 这里它是测量频率(CTYPE3='FREQ', CRVAL3=4.8856E+9 或 4.8856GHz)。第四个轴是关于 Stokes 偏振参数的坐标轴其值 0,1,2,3 和 4 定义了束强度, I、Q、U 和 V 的 Stokes 偏振参数, 因此本例中第一个512×512 阵是合成束强度图, 第二个是源的无偏振辐射场图。坐标定义卡片的顺序是任意的,并且 5 个卡片并不需要全都出现。

字符串关键词 INSTRUME、TELESCOP、OBSERVER 和 ORIGIN 用于说明探测器、望远镜、 观测者及写磁带的研究单位。尽管 HISTORY 被定义为做注释,但应象本例那样用于说明对数据的处理步骤。关键词 DATE说明写文件的日期, 注意其格式为'日/月/年', 使用相似的非标准关键词 (如本例中的 DATE-MAP) 有时是必要的。

为说明 FITS 系统的能力与灵活性,我们给出一个例子(见表: 2) 说明如何把一组星系的长狭缝光谱数据贮存于磁带中。光谱或射电谱数据的网格可用简单方式存贮, 其网格可以仅由一个点组成。 由本例的标题可以看到磁带中包含星系 NGC4258的一列谱, 第一个轴是沿谱方向的(1024 点), 第二个轴指出沿狭缝扫描的 33个点(间隔为 0.2 毫米)。数据是以对数形式存贮的,以允许更大的数据范围并能用 32 位整数容纳,这种方法可用于存贮任何其范围超过位数所允许的值。 注释域用于给出其它有关狭缝位置和在天空中的指向等信息, 使用这些注释可以给出数据的完整描述。最后几个卡片提供有关数据的探测器、 预测者及数据状态等信息。

表: 2

0........1.........2.........3.........4.........5.........6.........7....
card# 12345678901234567890123456789012345678901234567890123456789012345678901234
1/1:  SIMPLE  = T /
1/2:  BITPIX  = 32 /4 byte twos-compl integes
1/3:  NAXIS   = 4 /NR. of axes
1/4:  NAXIS1  = 1024 /NR. PTS. per spectrum
1/5:  NAXIS2  = 33 /NR. samples along the slit
1/6:  NAXIS3  = 1 /R.A. of center sample
1/7:  NAXIS4  = 1 /DEC. of center sample
1/8:
1/9:  BSCALE  = 1.0E-6 /REAL=TAPE*BSCALE+BZERO
1/10: BZERO   = 0 /Arbitrary ordinate
1/11: BUNIT   = 'LOG F ' /Flux scale
1/12: OBJECT  = 'NGC 4258' /Name of object
1/13:
1/14: CRVAL1  = 4861.342E-10 /H BETA Wavelength
1/15: CRPIX1  = 37.5 /Location of H beta line
1/16: CRTYPE1 = 'LAMBDA ' /Name of axis
1/17: CRDELT1 = 3.2E-10 /Resolution between points
1/18:
1/19: CRVAL2  = 0.0 /
1/20: CRPIX2  = 17 /Center is NR. 9
1/21: CRTYPE2 = 'DISTANCE' /Along the slit on the plate
1/22: CRDELT2 = 0.0002 /2 MM Between samples along slit
1/23:
1/24: COMMENT The R.A. of the slit center is 184.1225 DEG
1/25: COMMENT The DEC. of the slit center is 47.58139 DEG
1/26:
1/27: COMMENT The slit is oriented at an angle of
1/28: COMMENT 35.4 degrees. rotation is clockwise N thru W
1/29:
1/30: COMMENT The plate scale is 18.7056 degrees per M
1/31: COMMENT This is the same as the palomar survey
1/32: 
1/33: COMMENT The dispersion was 40*10E-10 m per 10e-3 meter
1/34:
1/35: INSTRUME= 'ABC CAMERA'
1/36: TELESCOP= '90 INCH '
2/1:  OBSERVER= 'SMITH '
2/2:  ORIGIN  = 'KPNO-PDS'
2/3:  DATE    = '27/10/78'
2/4:  HISTORY DATA CORRECTED FOR DARK FIELD BUT NO ABSOLUTE INTENSITY CAL.
2/5:  COMMENT SEEING 2 ARC SECONDS
2/6:  END

6、对 FITS 用户的建议

首先,写磁带的单位应考虑接受单位的能力, 特别是使用 FITS 磁带的坐标系统方案。当然最重要的是利用 FITS 标题的工具给出对数据文件的精细描述。

FITS 的许多方面是按通常计算机和图象处理软件结构所设计的, 不同的是它以最大效率来紧缩数据, 而不要求行长度与块长度相一致。把以行组织的数据紧缩到 FITS 记录的算法是很直接的:在程序内部按行中计数的 DO 循环中, 必须为输出数据提供一个计数, 当计数值 超过最大值(根据 BITPIX 的大小为 720,1440 或 2880)时,便写了一个记录, 而该计数再初始化为零。当然可以构造更有效的算法。

操作 FITS 磁带的程序应设计为可以跳过任何无法确认为符合 FITS 基本标准的文件, 而更复杂的程序可以根据关键词来确定文件是否可以进行处理。

注意, 图象阵中象元的二进制数据是高位在前, 低位在后, 如图所示:

第一字节
第二字节
第三字节
第四字节

BITPIX=32

s
31
.
.
.
.
.
.
24

23
.
.
.
.
.
.
16

15
.
.
.
.
.
.
8

7
.
.
.
.
.
.
0

BITPIX=16

s
15
.
.
.
.
.
.
8

7
.
.
.
.
.
.
0

BITPIX=8

s
7
.
.
.
.
.
.
0

由于一般计算机上的字节中位次序都符合 ANSI 标准(即高位在前, 低位在后), 因此在某些计算机上( 如DEC PDP_11)需对二进制数据进行“字节交换”的操作以使其符合 FITS 标准。 另一个问题是计算机的字长可能与 BITPIX 值不匹配, 然而现在的记录长度(2880字节)使该问题可以简单地解决。例如某计算机的字长为 36 位,如果记录是在内存中, 它将占据 640 个内存字, 但象元值是在字中不同位上则比较棘手, 程序员需构造一个子程序来从 4 个 36 位字中取出 9 个 16 位的象元值, 从八个 36 位字中取出 9 个32 位象元值, 以及从两个 36 位字中取出 9 个 8位象元值。整个记录可以通过一个恰当的循环来调用该程序而得到解开的图象(例如对 BITPIX=16需 160 次调用)。

程序也要考虑如何处理补码 16 位及 32 位整数值, 例如一个 16 位补码整数在字长大于 16 位的机器上解开时, 其结果是一个右对齐的整数, 范围为 0 到65535 (8 进制 177777), 如果数值大于 32767 则减去 65536 (八进制 200000) 而得到正确的负数值。 类似的方案可用于 32 位整数 (减去八进制40000000000)。如果计算机字长小于 BITPIX 值, 则要根据情况采取一些折衷方案。

在磁带读出时常会丢失块的用户可以在数据阵中插入额外一列来做为检验或行数, 并在标题中予以说明。但在一般情况下并不需要这样做。

四、FITS 的随机组扩展

基本 FITS 定义的标题和图象格式为包括其他类型数据提供了足够的灵活性,为将来扩展 FITS 格式很好地定义一组规则,可以保证标准所必需的稳定性。1988 年 Grosbol 等人对 FITS 的一般扩展作了定义。

在一个单一的 FITS 文件里便可以放入一系列标题/数据组。每一组开始有一个标题, 标题具有与主标题同样的一般格式。扩展标题的第一个卡片定义随后扩展的类型。因为定义了有关数据记录的位数(bit), 一个阅读文件甚至可以跳过一个不知道的扩展类型, 到下一个标题/数据组。

这种扩展允许 FITS 图象由一系列标题/数据组组成。是现在的 FITS 的一个稍微的修改, 它保留了基本 FITS 的所有规则, 约定和关键词, 该扩展包含六个附加的新关键词, 少数标准关键词和一个稍微修订的数据结构。

基本问题是像限定联系每一个数据阵的坐标参数一样处理一些数据的小的数据, 而且该数据阵不以均匀间隔出现。大多数描述小的数据阵或子数据阵的参数是对每个子数据阵一样的,而且能够用标准 FITS 标题记录描述。与每一个子数据阵相关的参数变化必须用同样的方式。 解决这个问题的方法是引进“组”的概念。由一些参数(用二进制整数写在磁带上) 组成的“组”后跟随着相联系的数据的子数据阵。参数的“组”和子数据阵装入固定长(2880字节)数据记录。下面的图给出了这种类型的图解例子。

这是一个对二进制数据的“组结构”图解的例子。在这个例子中, 包含NAXIS2*,NAXIS3*, NAXIS4* 数据元素的三维子数据阵之前是 PCOUNT 参数元素。表明组长度不对称而且是固定记录长度, 在这个磁带文件里数据记录前面是几个标题记录。

在下面表 3中我们给出这种扩展必要的附加关键词和标准关键词值。 在每一个文件的第一个标题记录里, 至少要有 4 个关键词,按顺序它们是: SIMPLE,BITPIX,NAXIS,NAXIS1,NAXIS2,…。 我们用这些关键词来描述每个子数据阵,表明它们是组结构形式。我们选择约定 NAXIS1 为 0, 而关键词 GROUPS 为真(T) 。

前面表示是一个非标准数据阵结构, 而后者表示一个“组”结构格式,用关键词 NAXIS2,…NAXISn, 来描述标准形式的数据阵。改变的仅是 NAXISn 值, 它现在比子数据阵里真实轴多。因此, 第一个 NAXISn 必须表示点数或者象元沿轴变化的最大数,那个轴是 NAXIS2。除了 CRVAL1,CRPIX1 等没有意义外(由于 NAXIS1=0),关键词 CRVALn, CRPIXn 等有它们通常的含义。

在增加中规定关键词 GROUPS 给它为 T 值,必须提供两个附加的关键词: PCOUNT 表示包含在每个块中的参数, 而 PCOUNT 表示出现在磁带上的这个文件或者图象 (Image) 的组数。 关键词 PTYPEn, PSCALn,PZEROn 应用于参数就象关键词 CTYPEn 应用于轴一样。

表: 3 新关键词和关键词值

A. 关键词

GROUPS 逻辑值 如果是真(true)说明数据结构是一个“组”格式。

PCOUNT 整数 每一个数据块之前参数值数目。

GCOUNT 整数 在该文件或图象中包含的组数。

PTYPEn 字符 第 n 个参数的类型(描述名)。

PSCALn 浮点数 参数 n 的真值=磁带值*PSCALn+PZEROn。

PZEROn 浮点数

B. 对 CTYPE 和 PTYPE 附加值

'UU ' 可见数据的 U 坐标, 一个与 LL 对应的付里叶转换。(单位:秒)

'VV ' 可见数据的 V 坐标, 一个与 MM 对应的付里叶转换。(单位:秒)

'WW ' 可见数据的 W 坐标, 一个与 NN 对应的付里叶转换。(单位:秒)

'HA ' 时角。(单位:度)

'COMPLEX' 复合定值 1=实数, 2=虚数, 3=重量。

为了说明这种 FITS 的扩展,我们举一个例子, 在这个例子里, 观测者收集了在天体周围各种位置的光谱, 在下图表 4中显示一个合理的 FITS 标题格式。

表: 4 围绕一个源的光谱观测组数据结构使用的 FITS 标题记录

0........1.........2.........3.........4.........5.........6.........7
CARD 1234567890123456789012345678901234567890123456789012345678901234567890
1    SIMPLE  = T / Proper FITS conventions used
2    BITPIX  = 16 / 16 bits per data point
3    NAXIS   = 2 /
4    NAXIS1  = 0 / Non-standard array structure
5    NAXIS2  = 384 / Points along array
6 
7    GROUPS  = T / Group data structure
8    PCOUNT  = 4 / There are 4 parameters
9    GCOUNT  = 100 / There are 100 'groups'
10 
11   PTYPE1  = 'GLON ' / Integer Deg. Gal longitude
12   PTYPE2  = 'GLON ' / Fraction
13   PTYPE3  = 'GLAT ' / Integer Deg. Gal longitude
14   PTYPE4  = 'GLAT ' / Fraction
15   PSCAL1  = 1.0 / 
16   PSCAL2  = 1.0E-04 / Fraction in units .0001
17   PSCAL3  = 1.0 / 
18   PSCAL4  = 1.0E-04 / Fraction in units .0001
19   PZERO1  = 0.0 / No offset
20   PZERO3  = 0.0 / 
21   CRPIX2  = 192.0 / Reference point in the array
22   CRVAL2  = -5.0E+01 / Value at the reference point
23   CRDELT2 = 0.874+00 / Increment between points 
24   CRTYPE2 = 'VELO-LSR' / LSR velocities
25   BUNIT   = 'K ' /
26   BSCALE  = 3.333E-03 / Real=tape*BSCALE+BZERO
27   BZERO   = 0 / 
28   BLANK   = -32768 / Undefined data point value
29   OBJECT  = 'W51-21CM'
30   TELESCOP= 'NRAO-140'
31   INSTRUME= '21C-COOL'
32   OBSERVER= 'AENEWMAN'
33   DATE-OBS= '31/03/79' / DD/MM/YY
34   DATE    = '24/12/79' / DD/MM/YY tape written
35   HISTORY TPOWER BASELINE NFIT=3 BDROP=15 EDROP=12/
36   END

该磁带文件对数字表示和数据顺序都遵照基本的 FITS 规定(SIMPLE=T)。它用了 16 位二进制补码二进制整数表示象元和参数值 (BITPIX=16),而且不包含一个标准的有规律间隔矩阵(NAXIS1=0)。文件用块结构包含数据(BLOCKS=T)。数据子数据阵由一维数组组成(NAXIS=2,但 NAXIS1=0), 具有 384 个象元值(NAXIS2=384)。开头的每个子数据阵是 4 个参数(PCOUNT=4)。但是真正的只有两个参数(1,6) 因为每个分为两个数以获得要求的精确度。在那个序列里该参数是银道坐标(PTYPE1='GLON',PTYPE3='GLAT')。

每一个值分为两部分。第一个参数包含度数的整数(PSCAL1=PSCAL3=1)。 在第二个参数里包含用度的 10/1000单位表示的小数部分(PSCAL2=PSCAL4=1.E-04)。这个文件包含参数的 100 个“组”加上它们的各自的子数据阵。每个“组”包含 776(8+768)字节信息。标题信息用一个 END 关键词终止。

在这个例子里标题信息仅要求一个磁带记录(2880字节)。 这是直接允许用包含参数和每个组的数据的数据记录。每个组的信息按顺序放进记录里,而且一个单一组的信息可以跨两个或更多的物理记录。在这种情况, 第一个记录包含从组数 1 (字节 1 到 776), 组数 2(字节 777 到 1552), 组数 3 (字节 1553 到2328)和组数 4 的第一个 552 字节。剩余的信息用类似的方式放。总共有 27 个数据记录 (加一个标题记录)。最后的数据记录没有用的字节按规定用 0 填满。在最后的记录后面用一个带结束符。

总之 FITS 扩展要求建立一种新的简单的数据结构, 加上 6 个附加的新的关键词和几个标准的关键词值来表示数据阵结构。目前 FITS 格式扩展用于综合射电望远镜和甚大阵之间射电综合孔径数据的交换。

五、FITS 的表扩展 (ASCII 表扩展)

1988 年 Harten 等人定义了表和星表的扩展作为 FITS 的第一扩展, 按照这些扩展规则, 这个扩展使它可能交换复杂的数据,这个数据可以表示成一个可打印的表。给出的数据是定义了有每一列特征的 ASCII字符二维数据阵。一个给定域必须有一个固定的格式(遵照 FORTRAN-77 格式规则), 但是可以是任何类型,如实数、整数或者字符串。直接绘制一个可打印的表使得格式比较容易解释, 并对交换很合适。

当你分析一个星表结构时, 你会发现它们是由带有许多固定单元和固定格式的许多行组成, 但是作为无格式输入一相等数据组阵。你需要的是描述星表的内容和星表里每一行的相关内容。这可以用 FITS 扩展来作, 将表作为一个字符数据阵处理。而且定义字符数据阵的一行内每个域的位置和格式。 这种解决办法要求用字符格式存贮所有的星表, 然而, 使用字符格式比使用二进制格式, 设计简单, 而且在表里容易混合各种数据类型, 然而避免由于计算机内部二进制格式许多差别产生的字节交换问题。 目前大多数可机读格式的标准星表是用字符格式。对于这些情况,表扩展是以表的概念模型为基础。包含许多列而且每列的顶部带有字头, 用以打印在纸上, 打印页是有意作为一个 ASCII 码方阵, 而且设计的表扩展用于传输, 而且在扩展的标题里这个矩阵的编码用标题一样的编码。

FITS 表扩展使用标准 FITS 规则, 加上新的 FITS 一般扩展。用一个扩展的主 FITS 标题写的星表优于用一个描述星表内容的扩展标题写的。基本设计是将星表作为一个大的字符矩阵存贮。 表的每一行有一些字符或数, 并由一个有序的域组成,而且这个顺序对每一行都是相同的。不同域的格式不需要是一样 的,但是一给定域的格式对新有行必须是相同的。域之间和内部没有用的空间用空格填充。为了打印出的时候,字符数据阵将容易读, 最好在一行内每一个域之间有一空格。 在一行里字符数和表里记录数或行数的多少决定字符矩阵的大小。

在一行里用一系列关键词描述每一个域(feild), 关键词描述域的名字, 格式, 在一行里字符位置, 和信息的单位。用这个信息, 一个程序可以通过变量名字检索, 抽取适当的字符和转换他们到所要求的格式和单位, 因为在表里每一个域是分别定义的, 而且因为在每一行里字符的长度是固定的。

1、表扩展标题格式

用一个基本 FITS 扩展写的表用 XTENS10N='TABLE'。基本 FITS 标题为了保持一致性还用旧的格式出现, 以描述 FITS 文件的基本特性。扩展是用一个扩展标题, 它将包含表的大小和内容的信息。 这些信息是用关键词形式提供的包括一些与主标题用的相同的关键词。 这个表扩展规则与随机组扩展里的规则一致。

表扩展标题是在一个新记录的第一个字符, 并且将用下面表 5表示的形式出现。

表: 5 表扩展标题记录格式

0........1.........2.........3.........4.........5.........6.........7.....
123456789012345678901234567890123456789012345678901234567890123456789012...
XTENSION= 'TABLE ' / Tells the type of extension
BITPIX  = 8 / Printable ASCII codes (8 is required)
NAXIS   = 2 / The table is a matrix (2 is required)
NAXIS1  = mmm / Width of table in characters
NAXIS2  = nnn / Number of entries in table (1 is legal)
PCOUNT  = 0 / Random parameter count must be 0
GCOUNT  = 1 / Group count must be 1
TFLELDS = kkk / Number of fields in each row
            / (i. e., the number of separate pieces of 
            / information in a row, maximum value of 
            / nnn in TYPEnnn.)
EXTNAME = 'name ' / The name of the table
EXTVER  = vv / Version number of talbe "name"(interger)
EXTLEVEL= hh / Hierarchical level (1 is recommended)
TBCOLnnn= ccc / Starting char. pos. of field nnn
TFORMnnn= 'qww.dd ' / Fortran format of field nnn (I,A,F,E,D)
            / (NOTE: ww is width of field nnn)
TTYPEnnn= 'type ' / Type (heading) of field nnn
TUNITnnn= 'unit ' / Physical units of field nnn
TSCALnnn= sss.ss / Scale factor for field nnn
TZERonnn= zzz.zz / Zero point for field nnn
TNULLnnn= 'bbbbbbbb' / Null (blank) value for field nnn
            / (NOTE: exact match left - justified to)
            / (the width specified by TFORMnnn)
END

首先 8 个关键词(XTENS10N 到 TFIELDS)必须出现, 而且按序顺表示在这里。 对于表扩展参数和计算关键词必须是 PCOUNT=0 和 GCOUNT=1。关键词 TBCOLnnn 和 TFORMnnn 必须在标题里某个地方出现。直到 TFIELDS=kkk, (kkk 是指表中每一行域(fields)的数目),TBCOLnnn 是指表的第 nnn 域字符串的位置,TFORMnnn 是指 nnn 域的 FORTRAN 格式。其他关键词 EXTLEVEL,EXTNAME,EXTVER, TTYPEnnn, UNITnnn,TSCALnnn, TZEROnnn 和 TNULLnnn(参见第 3 节)全部是任选的, END 必须出现,而且包含 END 的标题记录的剩余部分, 用 ASCII 空格填满。

2、表扩展格式举例

下面以 AGK3 星表为例, 说明这个星表的部分位置和自行如何放进 FITS 格式。 首先这个星表应该有一个如下格式的基本 FITS 标题(表 6)。

表: 6 基本 FITS 标题

0........1.........2.........3.........4.........5.........6.........7........
123456789012345678901234567890123456789012345678901234567890123456789012345678
SIMPLE  = T / Standard FITS format
BITPIX  = 8 / Character information
NAXIS   = 0 / No image data array present
EXTEND  = T / There may be standard extensions
ORIGIN  = 'CDS ' / Site which wrote the tape
DATE    = '23/09/83' / Date tape was written
COMMENT AGK3 Astrometric catalog, formatted in FITS Tables format
COMMENT SEE: W.Dieckvoss, Hamburg.Bergedorf 1975.
END

SIMPLE=T 说明该文件是一个标准 FITS 格式。 BITPIX=8 说明是使用 8 位 ASCII 字符编码信息,NAXIS=0 是说不表示图象数据数组,EXTEND=T 是说明是一个标准的 FITS 扩展。ORIGIN, DATE, COMMENT是 AGK3 星表的有关参考信息。END 是一个 FITS 主标题记录不可缺少的结束符。

接下来是描述星表里每行记录的各个域内容的扩展标题记录格式(表 7):

表: 7 FITS 表扩展

0........1.........2.........3.........4.........5.........6.........7.......
123456789012345678901234567890123456789012345678901234567890123456789012345678
XTENSION= 'TABLE ' / Table extemsion
BITPIX  = 8 / 8-bits per "pixel"
NAXIS   = 2 / Simple 2-D matrix
NAXIS1  = 74 / No. of characters per row (=74)
NAXIS2  = 3 / The number of rows (=3)
PCOUNT  = 0 / No "random" parameters
GCOUNT  = 1 / Only one group
TFIELDS = 16 / There are 16 fields per row
EXTNAME = 'AGK3 ' / Name of the catalog
TTYPE1  = 'NO ' / The star number
TBCOL1  = 1 / start in column 1
TFORM1  = 'A7 ' / 7 character field
TTYPE2  = 'MG ' / stellar magnitudes
TBCOL2  = 8 / start in column 8
TFORM2  = 'E4.1 ' / xx.x SP floating point
TUNIT2  = 'MAG ' / units are magnitudes
TTYPE3  = 'SP ' / spectral type
TBCOL3  = 13 / start in column 13
TFORM3  = 'A2 ' / 2 character field
TNULL3  = ' ' / blanck is indefinite value
TTYPE4  = 'RAH ' / right ascension hours
TBCOL4  = 16 / start in column 16
TFORM4  = 'I2 ' / 2 digit integer
TUNIT4  = 'HR ' / units are hours
TNULL4  = '99 ' / null value
TTYPE5  = 'RAM ' / right ascension minutes
TBCOL5  = 19 / start in column 19
TFORM5  = 'I2 ' / 2 digit integer
TUNIT5  = 'MIN ' / minutes of time
TUNLL5  = '99 ' / null value
TTYPE6  = 'RAS ' / right ascension seconds
TBCOL6  = 22 / start in column 22
TFORM6  = 'E6.3 ' / xx.xxx SP floating point
TUNIT6  = 'S ' / seconds of time
TNULL6  = '99.999 ' / null value
TTYPE7  = 'DECDSIGN' / declination sign
TBCOL7  = 29 / start in column 29
TFORM7  = 'A1 ' / character field
TTYPE8  = 'DECD ' / declination degrees
TBCOL8  = 30 / start in column 30
TFORM8  = 'I2 ' / 2 digit integer
TUNIT8  = 'DEG ' / degrees
TNULL8  = '99 ' / null value
TTYPE9  = 'DECM ' / declination minutes
TBCOL9  = 33 / start in column 33
TFORM9  = 'I2 ' / 2 digit integer
TUNIT9  = 'ARCMIN ' / minutes (angle)
TNULL9  = '99 ' / null value
TTYPE10 = 'DECS ' / declination seconds
TBCOL10 = 36 / start in column 36
TFORM10 = 'E5.2 ' / xx.xxx SP floating point
TUNIT10 = 'ARCSEC ' / seconds (angle)
TNULL10 = '99.99 ' / null value
TTYPE11 = 'EPOCH ' / epch of positions
TBCOL11 = 42 / start in column 42
TFORM11 = 'E7.2 ' / xxxx.xx SP floating point
TUNIT11 = 'YR ' / units are yers
TTYPE12 = 'N ' / no. photo. obs.
TBCOL12 = 50 / start in column 50
TFORM12 = 'I1 ' / one digit integer
TTYPE13 = 'RAPM ' / proper motion in r.a.
TBCOL13 = 52 / start in column 52
TFORM13 = 'E4.3 ' / .xxx SP floating point
TUNIT13 = 'ARCSEC.YR.1' / units are arc-seconds/yr
TNULL13 = '9999 ' / null value
TTYPE14 = 'DECPM ' / proper motion in dec.
TBCOL14 = 57 / start in column 57
TFORM14 = 'E4.0 ' / xxx. SP floating point
TUNIT14 = 'ARCSEC.YR.1' / units are arc-seconds/yr
TSCAL14 = 0.001 / scale factor = 0.001
           / (Note use of scale factor !)
TNULL14 = '9999 ' / null value
TTYPE15 = 'DEPOCH ' / difference in epoch AGK3-AGK2
TBCOL15 = 62 / start in column 62
TFORM15 = 'E5.2 ' / xx.xx SP floating point
TUNIT15 = 'YR ' / unit is years
TTYPE16 = 'BD ' / Bonner Durch. star number
TBCOL16 = 68 / start in column 68
TFORM16 = 'A7 ' / 7 character field
TNULL16 = ' ' / blanks indicate null
AUTHOR  = 'W.Dieckvoss'
REFERENC= 'AGK3 Astrometric catalog, Hamburg-Bergedorf, 1975'
DATE    = '14/07/82' / date file was generated
END

在例子中从 XTENS10N 到 TFIELDS 是 FITS 表扩展必须有的关键词, NAXIS= 2 以前都是固定格式,NASIS1=74 是说表的每行记录共有 74 列, NAXIS2=3 是说该表仅有三行记录,PCOUNT=0,GOCOUNT=1 也是固定的, TFIELDS=16 表示每行记录有 16 个域。下面的任选关键词也是固定的,描述了每个域的名字类型、格式、起始列和它们的单位等。

上面表示的扩展标题有 102 行, 因此它们写在 2880 字符的三个逻辑记录里(第三个记录将加填 6 个空格行)。实际的星表数据是在下一个记录里开始(表 8)。数据共 3 行, 每行 74 个字符共 222 字节, 记录剩下的 2658 字节应是 ASCII 空格和一个跟在后面的带 结束符。

表: 8 AGK3 星表

0........1.........2.........3.........4.........5.........6.........7.......
12345678901234567890123456789012345678901234567890123456789012345678901234567
+82457 11.4 G5 15 30 57.480 +82 15 06.18 1960.37 2 -005 +006 29.99 +82 459
+82458 11.4 F5 15 32 41.150 +82 10 17.17 1958.36 2 -010 +004 27.97 +82 460
+82459 12.1    15 32 42.107 +82 40 28.83 1960.37 2 -018 +004 29.99 +82 461

这样, 这个 FITS 表扩展文件将总共包括记录; 第一个记录是基本标题记录, 然后是三个扩展标题记录, 而最后是一个表数据记录。

3、其它表扩展关键词及其使用规则

——TTYPEn='名称' /一行中第 n 个域的名称

(任选, 但强烈推荐使用, 缺省值:' ')。推荐在名称中只使用字符(特别是大写字符)、数字和和下划线( 十六进制码 5F), 避免在不同域中使用同一名字。

——TBCOLn=值 /域的起始列

(要求)。该值是域的起始列数, 一行的第一列为 1 。

——TFORMn='格式 ' /FORTRAN 77 格式的单一值

(要求)。只能使用 FORTRAN 格式 Iww、Aww、Fww.dd、Eww.dd 和 Dww.dd (即整数、字符和单、双精度实数)。I 格式解码的数字可能超出 16 位整数的范围, F 和 E 格式包含单精度实数(6 位十进制有效数字),D 格式表示双精度实数(16 位十进制有效数字)。F 格式的数字编码完全可用 E 和 D 格式来做, 因此实际上不需要 F 格式,提供 F 格式仅仅是为了方便, 但是需要区分浮点精度。注意只能使用 I、A、F、E 和 D格式, 而象 2I2 的格式则不能用, 而应换为 I2 和 I2 (在不同的域里)。A 格式的域可用普通的文本编码,而不需用串记号('')括起来。

——TUNITn='单位' /变量的单位

(缺省:' ')。域的物理单位, 如'K'是开尔文温度(见三、4 节中 BUNIT 的推荐值)。

——TSCALn=值 /可用值的尺度因子

(缺省:1.0)。注意该关键词不能用于 A 格式的域中。

——TZEROn=值 /求值时的零偏量

(缺省:0.0)。注意该关键词不能用于 A 格式的域中。域 n 中的真正值为: (表中域 n 的值 ) * TSCALn+TZEROn。

——TNULLn='空串' /用于标示空域的字符串。

(任选, 无缺省值)用来区分零值和不存在的值。字符串必须是在域中左对齐并用空格填充到域的右界(标准FORTRAN 77 约定)。若没有出现 TNULLn, 读出程序将不需用空串来与域 n 比较,因此它没有缺省值。写入程序应该在域中实际存在空值时再定义 TNULLn, 这也改进了读出效率。读出程序应考虑在遇到非法值时应如何操作, 例如在 I3 域中出现了值'***'但 TNULLn 又没有定义, 则读出程序可以报告该错误并缺省地将其做为内部的空值。

——AUTHOR='姓名' /表的原始作者。

(任选, 缺省:' '), 但推荐使用。

——REFERENC='参考文献' /表的参考文献

(任选, 缺省:' '), 推荐使用。

缺省值是在没有出现关键词时使用的值。对表的任何域都要求给出关键词 TBCOLn 和 TFORMn, 如果不

定义这些关键词, 一个自动解码程序将无法对其予以解码。

4、一些注意事项

每个域的宽度是由其格式 TFORMn 中的 ww 所定义,域 n 开始于字符位置 TBCOLn 并包含 ww 个字符。ww 宽度的总和并不要求等于表的真实宽度 NAXIS1, 但若定义的域延展到 NAXIS1 定义的真实宽度之外时,读出程序将报告其错误。

对格式关键词 TFORMn 还需要说明的是:为便于管理和理解, 每个域必须具有单独的格式 (不允许类似2I2 的多重格式)。如要区分 +00 和-00(即赤纬数据), 则应单独定义符号域,这是绝对需要的,因为很多计算机并不知道 +00 与-00 的区别。符号应定义为字符域并在对相关数字域解码时予以考虑, 因此度/分/秒格式的赤纬要定义四个域, 每个域都有各自的 TTYPEn 和 TFORMn。然而浮点数格式的以度为单位的赤纬则只要求一个域并与标准 FITS 规则一致。

实数的指数部分应由 D 或 E 后接符号和两位数字组成, 字符数据在域中要左对齐, 而整数和实数则右对齐, 这是为了避免不同计算机对空格串的不同处理。为避免将空格串当做零值, 表扩层数据的解码应象 FORTRAN 77 的 OPEN 语一样, 忽略空格字符。

推荐在建立表时, 在不同域之间加上一个空格。 一般的规则是: 包含表的字符阵应具有易读的形式。这样根据标题确定每行的字符数后, 就可直接将表以易读的形式打印出来。

在创立表时, 应注意区分“空”值(无定义值)与零值的区别。通常在数字域中的空格被解释为零(标准FORTRAN 77)规则, 在那些将空格做为零的域中, 应设置关键词 TNULLn 来定义“空”值。要注意空值是由TFORMn 定义的长度为 ww的字符串,它并不要求由 TFORMn 定义的格式来解码, 例如'***' 的空值可用于一个 I3 域中。

数据记录是做为大字符阵而存贮的,从表的左上角开始,总长度为 NAXIS1乘 NAXIS2个字符,而 NAXIS1变化最快。所有信息均以 8 位可打印 ASCII 字符的形式存贮的, 每个字符的第八位(“奇偶位”)设为零(即 16 进制码为 20 到 7E 之间), 在数据阵中没有整数或实数的二进制形式。每个数据记录有 2880 个 8位字符, 并且是一个接一个写入磁带, 这就可能在一个记录中只出现了某行的一部分, 然而这种情况并不影响对此表进行解码。如果用户希望数据记录中都包含完整的行, 则要选择每行的字符数应能够整除2880。

最后一个数据记录的剩余部分均用 ASCII 空格来填充。

可以使用表扩展格式来构造更复杂的数据记录。如果需要那种象子目录一样的多重表, 程序员可按表的方式建立一个主目录, 在某一个值域 中给出子目录表的名称, 它是与主目录表的行号所联系的, 该域是由字符串构成的文件名字, 因此它就设置了一个指针来指向另一个数据结构 (子目录表)。目录表中的其它域将给出与子目录表相联系的各种特性,以帮助寻找子目录表的入口。很明显, 子目录也可指向其它表, 因此可以构造很复杂的结构, 而成为关系数据库。

六、FITS 的一般扩展和块因子

1、FITS 扩展的理由

为了满足传输新型数据结构的需要, 并且提供了处理关系数据库的能力。FITS 一般扩展规则提供了一种使新型的数据结构可以加入 FITS 标准中, 标准程序可以无阻碍地对扩展进行查找和解码, 为 FITS 系统增加了新的灵活性。

2、记录与块

“记录”是指基本的 2880 字节长的 FITS 信息单位,也即“逻辑记录”的概念。一个 FITS 文件便是这些记录的组合, 而扩展将总是开始于一个新的记录。 “块”表示磁带或其它存贮介质上的物理块大小。

要注意在以前的 FITS 文章中这两个词是互相通用的。

3、新的记录——块规则

在 FITS 格式中, 数据的逻辑记录长度将一直保持 23040 位(2880 个 8 位字节)长。但自 1987 年 1月 1 日起, 在数据存贮介质上的物理块长度是一个块因子乘以该逻辑记录长度。数据文件的最后一个物理块要截短到保持剩余数据所需的最少的逻辑记录。 注意 FITS 文件的最后一个逻辑记录要用零或空格填充到 2880 字节, 这与原始 FITS 协议的规则一致。作为缺省值, 块因子对所有存贮介质都是 1。根据协议,对给定的数据存贮介质将指定块因子的允许范围或一组值。用允许的块因子所写的文件是与 FITS 标准符合的。使用此协议不需要改变 FITS 标题中的关键词, 特别是在目前块因子在 FITS 标题里的关键词中没有定义。

对于与 ANSIX3.40-1983 定义相一致的 9 道(track)磁带, 块因子的范围是从 1 到 10 (每块 2880字节) 以利于交换数据。这种对 FITS 标准的显著改变通常称之为“长块 FITS ”。 这主要是为了增加6250bpi 磁带的紧缩效率, 但也可用于 800 和 1600bpi 密度的磁带。

现在定义了一个新的关键词 BLOCKED, 以指出是否需要检查块因子。尽管该关键词不是必须的, 但是推荐使用它(总是取真值, BLOCKED=T)来指出文件可能是以不为 1 的块因子所写的。在使用时, BLOCKED关键词必须写在文件的第一个逻辑记录中。但要注意, 所有新的读出程序应该能读任何 FITS 磁带, 而不论是否有 BLOCKED 关键词。

4、基本原则

设计对 FITS 的新扩展的最重要的原则是与现有的 FITS 磁带的兼容性, 即不能使现有的 FITS 磁带无法使用。但这并不意味着 FITS 格式不能发展。做为所有现在的扩展及本文中定义的扩展新规则的基础,有两条基本的 FTIS 规则:

——任意多个 2880 字节记录可以出现在主要的数据阵之后, 这些附加的记录被称为“特殊记录”。 该规则使得所有基本 FITS 的读出程序可以跳过那些无法解释的记录。

——FITS 文件中可以没有主数据阵, 或是因为轴的数目为零, 或是轴维数之乘积为零。

简单地说, 所有 FITS 扩展必须在 FITS 标题及其相关的主数据阵之后出现, 并且每个扩展必须开始于一个新的 2880字节记录。

新的规则允许用户去创立新的扩展, 但要避免与其他扩展方案冲突,也不能废弃基本 FITS 标准或已有的扩展, 这组新规则提供了一种框架, 使用户可继续创立新的数据结构以满足其局部的需要, 但这仍然是符合 FITS 标准的。对自由创立新扩展的唯一限制是:每一种数据结构只能有一种被认可的扩展格式。只有在数据结构无法被已有的扩展类型管理时 ,才能创立新的扩展类型。想创立新扩展格式的用户必须向 FITS标准委员会了解是否对此类型数据结构的扩展已存在,并确定是否为一个新的扩展类型。在此限制之下, 用户在必要时可以非常自由地创立新的扩展类型, 但要注意: 使用非标准扩展将阻碍天文数据的交换。

5、FITS 扩展的方针与规则

对 FITS 扩展的要求有两种: 一是兼容性与灵活性的要求, 一是解决扩展所面临的问题。FITS 扩展的方针和规则如下:

——新的扩展标准必须与现有的 FITS 磁带(包括那些已存在的标准扩展)兼容。 允许包含有标准及新扩展的 FITS 文件, 以利于向新方案的转变。

——在 FITS 文件中的新扩展不能影响那些不知道新扩展的程序的操作。

——只有在 FITS 标准中定义的二进制和字符编码协定可以用于 FITS 扩展中, 包括在 FITS 标题中的可打印 ASCII 字符,及数据阵中的无“字节交换”的 8 位无符号, 16 位和 32 位二进制补码整理。FITS 委员会希望将来增加 IEEE 浮点数。

——扩展应与基本 FITS 文件具有相同的结构, 即标题加上数据。扩展数据结构可以自行定义, 并能被人或计算机读出。创立 FITS 标题的基本规则同样适用于扩展标题,即包含一些必需的标准关键词, 由 ASCII文本组成并具有任意长度。

——查询磁带的程序可以定位于任何扩展的开头, 并可以跳过该扩展而发现下一个记录的起始点。 这意味着扩展标题必须以自洽和标准的方式来定义有关数据的总长度。

——FITS 扩展应支持不同数据组合的等级结构, 如传输与基本数据阵有关的表、目录等并保持表与数据的关系。要定义一级以上的结构以便为将来的发展提供框架。

——可以在没有认可的情况下设计新扩展。这意味着在 FITS 主标题中的关键词可能并不声明存在着特殊类型的扩展。

——在主标题及其相关数据阵之后可以附加任意数目的扩展。

——在一个 FITS 文件中如出现一种以上类型的扩展, 则扩展的次序是任意的。

——任何人都可以创立设想的扩展格式, 但应该与 FITS 标准委员会联系以确保它不与其它扩展冲突, 并与 FITS 扩展规则相一致。

——在主标题及扩展标题中应该没有任何关于在磁带或其它存贮介质上的 FITS 物理块尺度的显式信息。这使得 FITS 文件可以在不同存贮介质之间互相复制而不改变 FITS 文件中的信息内容。

以上规则是对 FITS 扩展的最小要求。基本的要求是在每个扩展的开始必须有扩展标题, 使程序可以确定扩展类型或是在不能确认其类型时跳过它。

6、对 FITS 主标题的增加

含有标准扩展的磁带要求有关键词 EXTEND, 位于主标题中基本 FITS 协议所要求的最后一个关键词之后, 值域中是逻辑真值(T), 表明文件是符合新扩展标准的。出现该关键词仅仅表示扩展记录可能会出现。

含有数据阵的最小的 FITS 标题的例子如下:

SIMPLE= T/

BIXPIX= 16/

NAXIS = 2/

NAXIS1= 320/

NAXIS2= 512/

EXTEND= T/

END

没有数据阵的最小的 FITS 标题的例子如下:

SIMPLE= T/

BIXPIX= 8/

NAXIS = 0/

EXTEND= T/

END

7、包含扩展记录的文件结构

为解决与现有扩展格式兼容性问题, 定义了三个新规则:

——如果 NAXIS1=0 并且随机组关键词出现在主标题中, 则随机组数据记录出现在主标题之后。

——新型扩展的记录必须在主数据阵或随机组记录之后。 每个扩展以一个类似 FITS 标题的扩展标题开始该标题定义了扩展类型以及可用通常 FITS 规则计算的长度, 扩展标题可以任意长并以 END 结尾。在扩,展标题之后是扩展数据记录,其长度由扩展标题中的信息确定。下一个扩展紧接着前一个。每个新的扩展标题必须开始于一个新的记录。在 FITS 文件中根据需要可包含任意数目的扩展记录。

——任何非标准的扩展记录必须出现在文件的末尾。读出程序应准备在任何位置上遇到这种记录。 它们一般包含标准扩展标题的第一个记录, 这样就可假定在其后的特殊记录是非标准的。 程序应检查该扩展的第一个记录的头 8 个字符, 如果是 XTENS10N, 则表明是一个标准扩展头, 否则就是非标准特殊记录。

8、扩展标题

每个扩展开始于一个新记录的头上(每个记录含 2880 个字节), 它包含了一个标准FITS 标题, 除了用新的关键词 XTENS10N='类型'来代替原来 FITS 标题的第一行(通常是 SIMPLE=T)以说明扩展类型。使用必须的 FITS 关键词 BITPIX, NAXIS 和 NAXISnnn 来定义扩展数据的二进制数据阵的维数。 只有标准FITS 数据类型对于交换目的是可以接受的。虽然新扩展标准允许其它的 BITPIX 值来用于特殊目的, 但这会被认为是非标准用法。

为允许随机组数据结构能以新扩展来写,而没有在原始随机组格式中的 NAXIS1=0 这种不准确约定,新规则要求所有的扩展头必须有 PCOUNT 和 GCOUNT 关键词。对简单矩阵来说, 它们是PCOUNT=0 和 GCOUNT=1。扩展数据的位长度可用下述公式计算:

NBITS=ABS(BITPIX)*GCOUNT*(PCOUNT+NAXIS1*NAXIS2*…*NAXISn)

注意该式使用了 BITPIX 的绝对值, 这是预留给浮点格式国际协议的, IEEE 浮点数的象元值是有符号的, 因而 BITPIX 是负的。也要注意在计算精度不够时(如 16 位整数而不是32 位)使用上式计算可能会造成整数溢出。数据所占用的标准 FITS 记录 (2880字节, 23040位)的总数是: NRECORDS=INT( ( NBITS +23039)/23040)。

注意这些计算将应用于所有的扩展而不管数据结构类型。 这就允许设计者可以灵活使用 BITPIX,GCOUNT, PCOUNT 和 NAXISn 来定义自己的数据结构, 只要用上述公式计算的数据总位数是正确的。

每个扩展标题以 END 语句结尾。在扩展中包含 GCOUNT 和 PCOUNT 允许用户灵活地设计那些半规则结构的数据类型的扩展(参看 Greisen & Harten,1981)没有数据记录的典型扩展标题为:

XTENSION='类型' /扩展类型

BITPIX = 8/

NAXIS = 0/

PCOUNT = 0/

GCOUNT = 1/

END

该例中扩展标题中包含的扩展信息仅仅是其本身。

包含数据记录的最小的扩展标题为:

XTWNS10N='类型' /扩展类型

BITPIX = 8/

NAXIS = 1/

NAXIS1 = 12345/数据记录中的字节数

PCOUNT = 0/

GCOUNT = 1/

该例描述了数据占用 5 个记录: NRECORDS=INT(8*12345+23039/23040),包含的是12345 字符长的8 位无符号整数的数据。这样的一维阵可用于传输一个文本文件。

9、三个新的任选关键词

——EXTNAME='名称'

——EXTVER=n

这两个关键词用于扩展标题中, 给出单个扩展的唯一名称和版本号。在一个 FITS 文件中可包含不同的扩展, 例如三个不同的表扩展(XTENSION='TABLE'),第一个可能是 EXTNAME='BS83'和 EXTVER=1,第二个可能是 EXTNAME='BS83'但 EXTVER=3, 第三个可能是 EXTNAME='AGK3'和 EXTVER=83, 也就是说可以用唯一的版本号来区分多个具有相同类型和相同名称的扩展。版本号不需要从一开始或是连贯的,如果没有定义EXTVER 则读出程序取其缺省值为一。

名称也可用类似某些文件系统中的子目录那样来建立数据的相关性, 此时不同扩展间的联系可直接建立。象“mapl.cleancomp1”或“N1234.field2.starlist ”这样的名称可以容易地显示不同扩展间甚至不同 FITS 文件的扩展间的关系。

——EXTLEVEL=n

该关键词定义了当前扩展标题在扩展的等级结构中的层次。 第一个扩展标题的层次设为一, 任何二级扩展标题从属于前面最后的一级扩展标题,而任何三级扩展标题从属于前面最后的二级标题,以此类推。 这个概念允许传输 FITS 中的任何等级数据结构和文件系统。 若没有定义 EXTLEVEL 读出程序取其缺省值为1。如接受者的数据处理系统无法表现等级结构并遇到 EXTLEVEL 大于 1 的扩展可将 EXTLEVEL 做为 1 来处理。

10、扩展数据记录

新扩展格式仍要求标题与数据处在不同的记录中, 尽管这会浪费空间(在最后的标题记录的末尾上都是无用字节)。因此扩展数据开始于包含扩展标题的 END 的记录之后的第一个记录的头一个字节。

参考文献

1. Greisen E.w. & Harten R.h. (1981), Astron. Astrophys. Suppl.,44,371.

2. Grosbol P., Harten R.H., Greisen E.w., Wells D.C.(1988),Astron. Astrophys. Suppl., 73, 359.

3. Harten R.H., Grosbol P., Greisen E.W., Wells D.C.(1988), Astron. Astrophys. Suppl.,73, 365.

4. IAU. Inf. Bull. 49, 14. (1983)

5. IAU. Inf. Bull. 61, 10. (1989)

6. Wells D.C. & Greisen E.W. (1979), `FITS: a Flexible Image Transport System' in Image Processing in Astronomy, G.Sedmax, M.Capacciol. R.J.Allen (eds),Trieste, 445

7. Wells D.C., Greisen E.W., Harten R.H. (1981), Astron. Astrophys. Suppl.,44,363.

8. Preben Grosbol, ‘The FITS Data Format’in Databases & On-Line Data in Astronomy, Miguel A. Albrecht, Daniel Egret (eds), 253. (1991).

9. 孟新民, 叶彬浔, 王传晋, 云台 CCD 系统 FITS 磁带输出格式, 云南天文台台刊 1988, NO.2, 80-84.

原文地址:https://www.cnblogs.com/tyjsjl/p/3952823.html