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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM