二、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 文件包含一系列逻辑单元,而每个单元的开头都是用一组标题记录描述随后的数据记录。
对每一个图象用一个磁带文件表示。每个文件开头用了许多包含标题数据的逻辑记录。标题数据用 7 位 ASCII 码的 80 字符形式书写。在 8 位字节里右对齐。每一字符的高位(奇偶检验位)将是零。
1) Logical Variable (逻辑变量): T 或 F, 在 30 列里。
2) Integer Variable (整数变量): 右对齐在 11-30 列里,若有虚部右对齐在 31-5 0 列里。
3) Real Variable (实变量): 要求 10 进制小数点,右对齐(如果用指数记数法)在 11-30 列里, 若有虚部,右对齐(如果用指数记数法)在 31-50 列里。
SIMPLE,BITPIX,NAXIS,NAXISn 和 END。它们的含义是:
SIMPLE 逻辑变量,指明文件是否符合基本 FITS 标准。
作为一个例子,我们假定给出一个 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 值, 则要根据情况采取一些折衷方案。
在磁带读出时常会丢失块的用户可以在数据阵中插入额外一列来做为检验或行数, 并在标题中予以说明。但在一般情况下并不需要这样做。
GROUPS 逻辑值 如果是真(true)说明数据结构是一个“组”格式。
PSCALn 浮点数 参数 n 的真值=磁带值*PSCALn+PZEROn。
'UU ' 可见数据的 U 坐标, 一个与 LL 对应的付里叶转换。(单位:秒)
'VV ' 可见数据的 V 坐标, 一个与 MM 对应的付里叶转换。(单位:秒)
'WW ' 可见数据的 W 坐标, 一个与 NN 对应的付里叶转换。(单位:秒)
'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 格式扩展用于综合射电望远镜和甚大阵之间射电综合孔径数据的交换。
表扩展标题是在一个新记录的第一个字符, 并且将用下面表 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 空格来填充。
可以使用表扩展格式来构造更复杂的数据记录。如果需要那种象子目录一样的多重表, 程序员可按表的方式建立一个主目录, 在某一个值域 中给出子目录表的名称, 它是与主目录表的行号所联系的, 该域是由字符串构成的文件名字, 因此它就设置了一个指针来指向另一个数据结构 (子目录表)。目录表中的其它域将给出与子目录表相联系的各种特性,以帮助寻找子目录表的入口。很明显, 子目录也可指向其它表, 因此可以构造很复杂的结构, 而成为关系数据库。
——任意多个 2880 字节记录可以出现在主要的数据阵之后, 这些附加的记录被称为“特殊记录”。 该规则使得所有基本 FITS 的读出程序可以跳过那些无法解释的记录。
——FITS 文件中可以没有主数据阵, 或是因为轴的数目为零, 或是轴维数之乘积为零。
简单地说, 所有 FITS 扩展必须在 FITS 标题及其相关的主数据阵之后出现, 并且每个扩展必须开始于一个新的 2880字节记录。
对 FITS 扩展的要求有两种: 一是兼容性与灵活性的要求, 一是解决扩展所面临的问题。FITS 扩展的方针和规则如下:
——新的扩展标准必须与现有的 FITS 磁带(包括那些已存在的标准扩展)兼容。 允许包含有标准及新扩展的 FITS 文件, 以利于向新方案的转变。
——在 FITS 文件中的新扩展不能影响那些不知道新扩展的程序的操作。
——查询磁带的程序可以定位于任何扩展的开头, 并可以跳过该扩展而发现下一个记录的起始点。 这意味着扩展标题必须以自洽和标准的方式来定义有关数据的总长度。
——FITS 扩展应支持不同数据组合的等级结构, 如传输与基本数据阵有关的表、目录等并保持表与数据的关系。要定义一级以上的结构以便为将来的发展提供框架。
——可以在没有认可的情况下设计新扩展。这意味着在 FITS 主标题中的关键词可能并不声明存在着特殊类型的扩展。
——在一个 FITS 文件中如出现一种以上类型的扩展, 则扩展的次序是任意的。
——任何人都可以创立设想的扩展格式, 但应该与 FITS 标准委员会联系以确保它不与其它扩展冲突, 并与 FITS 扩展规则相一致。
——在主标题及扩展标题中应该没有任何关于在磁带或其它存贮介质上的 FITS 物理块尺度的显式信息。这使得 FITS 文件可以在不同存贮介质之间互相复制而不改变 FITS 文件中的信息内容。
以上规则是对 FITS 扩展的最小要求。基本的要求是在每个扩展的开始必须有扩展标题, 使程序可以确定扩展类型或是在不能确认其类型时跳过它。
——如果 NAXIS1=0 并且随机组关键词出现在主标题中, 则随机组数据记录出现在主标题之后。
NBITS=ABS(BITPIX)*GCOUNT*(PCOUNT+NAXIS1*NAXIS2*…*NAXISn)
该例描述了数据占用 5 个记录: NRECORDS=INT(8*12345+23039/23040),包含的是12345 字符长的8 位无符号整数的数据。这样的一维阵可用于传输一个文本文件。
新扩展格式仍要求标题与数据处在不同的记录中, 尽管这会浪费空间(在最后的标题记录的末尾上都是无用字节)。因此扩展数据开始于包含扩展标题的 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)
7. Wells D.C., Greisen E.W., Harten R.H. (1981), Astron. Astrophys. Suppl.,44,363.
9. 孟新民, 叶彬浔, 王传晋, 云台 CCD 系统 FITS 磁带输出格式, 云南天文台台刊 1988, NO.2, 80-84.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步