二、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.
