国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

CFITSIO 軟件包簡(jiǎn)介及應(yīng)用舉例

2010-03-20 19:24:04歐建斌
微型電腦應(yīng)用 2010年8期
關(guān)鍵詞:狀態(tài)參數(shù)關(guān)鍵字子程序

歐建斌

0 引言

FITS最初由美國(guó)Wells等人于1979年提出[1],它以獨(dú)立于硬件設(shè)備的方式描述了數(shù)據(jù)定義和數(shù)據(jù)本身編碼的一般方法。FITS不像JPG或GIF等僅僅是圖像文件,它可以同時(shí)存儲(chǔ)多維圖像、數(shù)據(jù)矩陣及二維表格[3]。1982年,IAU(國(guó)際天文聯(lián)合會(huì))確立FITS為標(biāo)準(zhǔn)的計(jì)算機(jī)數(shù)據(jù)格式[4],此后便廣泛應(yīng)用于天文界數(shù)據(jù)的傳輸、分析和存儲(chǔ)過(guò)程之中。1990年,NOST(NASA/Science Office of Standards and Technology)推出NOST 100-0.1,成為首個(gè)FITS格式的標(biāo)準(zhǔn)。最近,IAUFWG(IAU FITS Working Group)又通過(guò)了FITS最新標(biāo)準(zhǔn)IAUFWG 3.0[2],進(jìn)一步確立了FITS的地位。

1 FITS

FITS文件由一系列邏輯記錄組成,每一個(gè)邏輯記錄均長(zhǎng)2880個(gè)字節(jié)(一個(gè)字節(jié)8位),可見(jiàn)一個(gè)FITS文件的大小必定是2880字節(jié)的整數(shù)倍。通常,F(xiàn)ITS文件包含一個(gè)或多個(gè)HDU(Header+Data Unit),也就是所謂的文件頭和數(shù)據(jù)單元。第一個(gè)HDU稱(chēng)作“Primary HDU”(主文件頭和數(shù)據(jù)單元)或“Primary Array”(主數(shù)組)。主HDU后面可以有任意多個(gè)HDU作為擴(kuò)展部分,擴(kuò)展部分是可選的。標(biāo)準(zhǔn)的FITS文件有3種不同類(lèi)型的擴(kuò)展:圖像文件、ASCII表文件和二進(jìn)制表文件。

文件頭用來(lái)記錄有關(guān)圖像的信息和說(shuō)明,例如FITS格式的標(biāo)識(shí)符,圖像維數(shù)大小,比特?cái)?shù)等。它是用 ASCII方式編碼的字符串,空閑的地方用空格填充。文件頭由多個(gè)長(zhǎng)80字符的行記錄組成,一個(gè)2880字節(jié)的邏輯記錄則剛好包含36個(gè)行記錄。每個(gè)行記錄表示圖像的某一信息,這樣的設(shè)計(jì)能夠靈活地定義描述數(shù)據(jù)的參數(shù)。

行記錄都有相同的格式,其語(yǔ)法為:keyword=value/comment。keyword(關(guān)鍵字)是由大寫(xiě)英文字母、數(shù)字、下劃線“_”或連字符“-”組成的長(zhǎng)8個(gè)字符的字符串。keyword是左對(duì)齊的,長(zhǎng)度不滿(mǎn)8字符則在末尾用空格填充,但中間不能有空格。如果對(duì)keyword進(jìn)行了賦值,則第9、10列必定是等號(hào)和空格“= ”。value(所賦的值)可以是數(shù)值(整數(shù)、實(shí)數(shù)或復(fù)數(shù))、字符或邏輯值(T或F),右對(duì)齊存放在第11~30列或第11~80列。comment(注釋?zhuān)┯眯本€“/”表示,通常從第 31列開(kāi)始(value后面),若沒(méi)有keyword的也可以從第十列開(kāi)始。

FITS主文件頭必須按順序含有 SIMPLE,BITPIX,NAXIS,NAXISn,END這幾個(gè)關(guān)鍵字。每個(gè)文件頭都以SIMPLE開(kāi)頭,以END結(jié)束,其它行記錄可以插在最后一個(gè)NAXISi和END之間。

SIMPLE:邏輯值,T表示該文件是FITS文件,否則為F。它必須且只能出現(xiàn)在主文件頭中。

BITPIX:整數(shù)值,表示數(shù)據(jù)的格式,其值可為8,16,32,64,-32或-64。8表示字符或無(wú)符號(hào)二進(jìn)制整數(shù);16,32和64分別表示16位,32位和64位補(bǔ)碼二進(jìn)制整數(shù);-32,-64分別表示IEEE單精度和雙精度浮點(diǎn)數(shù)。

NAXIS:整數(shù)值,表示數(shù)據(jù)陣列的維數(shù),取值范圍為0~999。若為0,則表示文件頭后沒(méi)有數(shù)據(jù)。

NAXISn:非負(fù)整數(shù)值,表示沿n軸變化的像素個(gè)數(shù)。若NAXIS為0,則沒(méi)有這一關(guān)鍵字。

END:文件頭結(jié)束標(biāo)記,其后的第9~80列為空格。

FITS擴(kuò)展文件頭必須按順序含有XTENSION,BITPIX,NAXIS,NAXISn,PCOUNT,GCOUNT,END這些關(guān)鍵字。

XTENSION:字符串,表示擴(kuò)展類(lèi)型,必須而且只能出現(xiàn)在擴(kuò)展文件頭中。其值若為“IMAGE”則表示是圖像擴(kuò)展文件,若為“TABLE”則表示是 ASCII表擴(kuò)展文件,若為“BINTABLE”則表示是二進(jìn)制表擴(kuò)展文件。

PCOUNT:整數(shù)值,用于定義數(shù)據(jù)結(jié)構(gòu),根據(jù)不同類(lèi)型的擴(kuò)展文件賦予不同的值。

GCOUNT:整數(shù)值,表示一個(gè)擴(kuò)展文件包含的數(shù)據(jù)陣數(shù)目,取值多為1。

其他關(guān)鍵字是可選的,較為重要的有:

TFIELDS:非負(fù)整數(shù)值,表示 ASCII表擴(kuò)展文件的列數(shù)。

BSCALE:浮點(diǎn)值,表示比例尺,和BZERO連用。

BZERO:浮點(diǎn)值,表示實(shí)際值的 0。實(shí)際值=BZERO+BSCALE×文件值。

在天文圖像中常用的關(guān)鍵字還有 DATE-OBS(觀測(cè)日期)、TELESCOP(望遠(yuǎn)鏡)、OBSERVER(觀測(cè)者)、OBJECT(觀測(cè)對(duì)象)、EPOCH(歷元)等。用戶(hù)還可以設(shè)計(jì)自己的關(guān)鍵字,只要符合定義的規(guī)則而且不與必須存在及保留的關(guān)鍵字沖突即可。

文件頭后面緊跟著的是數(shù)據(jù)單元。數(shù)據(jù)以字節(jié)為單位,包含符號(hào)位的字節(jié)放在前面(高位在前)。以統(tǒng)一的數(shù)據(jù)類(lèi)型按行存放在,不足2880倍數(shù)的用0補(bǔ)足。

2 CFITSIO

2.1 CFITSIO簡(jiǎn)介

FITS是標(biāo)準(zhǔn)數(shù)據(jù)格式,對(duì)FITS文件的讀寫(xiě)是許多天文應(yīng)用軟件的基本功能之一。

FITSIO(Flexible Image Transport System Input Output)軟件包于20世紀(jì)90年代由HEASARC(美國(guó)高能天體物理科學(xué)研究中心)研發(fā)。它用標(biāo)準(zhǔn)Fortran-77語(yǔ)言編寫(xiě),包括350多個(gè)子程序,源代碼有30000行左右。FITSIO是一個(gè)功能強(qiáng)大、但使用十分簡(jiǎn)便的軟件包。它支持所有 NOST定義的FITS格式文件及其擴(kuò)展文件,提供了一個(gè)簡(jiǎn)單的途徑來(lái)讀寫(xiě)FITS格式文件,而不必?fù)?dān)心復(fù)雜的FITS格式標(biāo)準(zhǔn)[5]。在C或FORTRAN語(yǔ)言編寫(xiě)的程序中直接調(diào)用FITSIO的子程序就可以對(duì)FITS格式的數(shù)據(jù)文件進(jìn)行讀寫(xiě)操作。

自從1995年作最后一次更新后,HEASARC不再支持FITSIO而是推薦另一個(gè)FITS讀寫(xiě)程序CFITSIO。CFITSIO完全使用ANSI C語(yǔ)言編寫(xiě),繼承了FITSIO許多強(qiáng)大的功能和優(yōu)秀的特點(diǎn)。CFITSIO是免費(fèi)軟件,目前最新的版本是3.10。

CFITSIO的新特點(diǎn)[6]:

(一)支持IRAF格式圖像(*.imh)和原始二進(jìn)制數(shù)據(jù)陣,通過(guò)轉(zhuǎn)化為虛擬FITS格式文件來(lái)對(duì)文件進(jìn)行讀寫(xiě)操作。

(二)能直接讀取FTP或HTTP URL上的FITS文件。

(三)能在內(nèi)存或共享內(nèi)存內(nèi)讀寫(xiě)FITS文件。

(四)能夠通過(guò)標(biāo)準(zhǔn)輸入輸出流在作業(yè)之間傳輸 FITS文件從而減少寫(xiě)硬盤(pán)臨時(shí)文件的需要。

(五)能直接讀取壓縮包中的FITS文件,包括GZIP、PKZIP和Unix壓縮包。

(六)能實(shí)時(shí)過(guò)濾或修改FITS表。

(七)表中的任意一列數(shù)據(jù)都能實(shí)時(shí)地轉(zhuǎn)換為一維FITS圖像,任何兩列能轉(zhuǎn)換為二維圖像。

(八)能夠多次打開(kāi)一個(gè)FITS文件為一個(gè)獨(dú)立的文件,能同時(shí)讀寫(xiě)一個(gè)FITS文件里面不同的擴(kuò)展部分。

(九)能處理大量分層組織的文件。

(十)能通過(guò)描述文件結(jié)構(gòu)的 ASCII模版來(lái)創(chuàng)建新的FITS表或圖像。

隨著 CFITSIO的廣泛使用,也產(chǎn)生了一系列基于CFITSIO的不同編程語(yǔ)言的軟件包。這些軟件包通過(guò)調(diào)用CFITSIO,提供了許多簡(jiǎn)便易用的接口從較高的層次來(lái)讀寫(xiě)FITS文件,隱藏了繁瑣的操作FITS I/O的細(xì)節(jié)。例如用C++編寫(xiě)的面向?qū)ο蟪绦虬?CCfits[8],用 C#.net編寫(xiě)的CSharpFITS,以及支持Matlab的MFITSIO等。

鑒于CFITSIO承前啟后的作用以及當(dāng)前的重要地位,本文重點(diǎn)關(guān)注CFITSIO的功能和應(yīng)用實(shí)例。

2.2 CFITSIO的功能

大部分CFITSIO程序都有一個(gè)較長(zhǎng)的完整程序名和一個(gè)縮簡(jiǎn)的名字。完整的程序名由3~4個(gè)單詞組成,用下劃線“_”連接起來(lái),如“fits_open_file”。它們都以“fits”開(kāi)頭,方便和用戶(hù)自己的程序相區(qū)別。第2個(gè)單詞表示要進(jìn)行的操作,第3~4個(gè)單詞指明操作的對(duì)象??s簡(jiǎn)的程序名以‘ff’開(kāi)頭,一般長(zhǎng)5~6個(gè)字符,與Fortran-77版本的FITSIO類(lèi)似[5]。許多程序都是以“組”的形式出現(xiàn),不同的只是相關(guān)參數(shù)的數(shù)據(jù)類(lèi)型,通常由程序名的最后一個(gè)字母暗示出來(lái)。對(duì)比起來(lái),完整的程序更具有描述性,易于閱讀和理解,建議用戶(hù)使用這種方式[7]。

在使用CFITSIO前,我們有必要先認(rèn)識(shí)兩個(gè)幾乎出現(xiàn)在所有子程序中的參數(shù):文件指針fptr和狀態(tài)參數(shù)status。fptr是指向當(dāng)前準(zhǔn)備進(jìn)行操作的FITS文件的結(jié)構(gòu)體指針。而status是用來(lái)返回操作是否正常結(jié)束的狀態(tài)參數(shù)。

3 對(duì)FITS文件的一般操作

使用CFITSIO對(duì)FITS文件進(jìn)行操作,首先必須先打開(kāi)或建立 FITS文件,操作完畢后要關(guān)閉文件。例如:fits_open_image(fptr, filename, iomode, > status)以只讀或讀寫(xiě)的方式打開(kāi)一個(gè)已經(jīng)存在的 FITS圖像文件。其中的‘>’符號(hào)不是程序參數(shù),而是為了用戶(hù)方便地區(qū)分每個(gè)程序中的輸入和輸出參數(shù)[7]。在‘>’符號(hào)前面的是輸入?yún)?shù),后面的則是輸出參數(shù)。參數(shù)iomode=0表示只讀,而iomode=1則表示讀寫(xiě)。fits_create_file(fptr, filename, iomode, > status)創(chuàng)建并打開(kāi)一個(gè)新的不含任何數(shù)據(jù)的 FITS文件。fits_close_file(fptr, > status)則關(guān)閉一個(gè)已經(jīng)打開(kāi)的FITS文件。

CFITSIO當(dāng)前正在操作的 HDU叫做 CHDU(Current Header Data Unit)。當(dāng)一個(gè)FITS文件被建立或打開(kāi)的時(shí)候,除非特定指派某一個(gè)HDU,否則CHDU自動(dòng)被定義為第一個(gè) HDU。如果在文件名后面加上擴(kuò)展參數(shù)(例如:myfile.fits+3或 myfile.fits[3]),則文件打開(kāi)后會(huì)移動(dòng)到該HDU。需要注意的是 FITS文件的主數(shù)據(jù)單元就是第一個(gè)HDU,第一個(gè)擴(kuò)展文件就是第二個(gè)HDU了。應(yīng)用CFITSIO可以知道HDU的位置、HDU的數(shù)目、也可以改變CHDU。調(diào)用不同的程序還可以插入不同類(lèi)型的 HDU、刪除已經(jīng)存在的HDU,當(dāng)然還可以復(fù)制整個(gè)HDU等。

3.1 對(duì)FITS文件頭的讀寫(xiě)操作

CFITSIO提供了一系列子程序來(lái)讀寫(xiě)FITS文件CHDU的關(guān)鍵字。在讀取數(shù)據(jù)陣前,可以用fits_get_img_param(fptr,maxdim, > bitpix, naxis, naxes, status)來(lái)獲取幾個(gè)必要關(guān)鍵字的信息。創(chuàng)建FITS文件時(shí),CFITSIO只是寫(xiě)入了必要的關(guān)鍵字以及相應(yīng)默認(rèn)的注釋?zhuān)褂?fits_read_card可以讀取原來(lái)FITS文件中的行記錄,再用fits_write_record把該行記錄插入到新文件中。更方便的是CFITSIO在向數(shù)據(jù)陣寫(xiě)入數(shù)據(jù)前不必知道數(shù)據(jù)陣的各維數(shù)大小,只須在寫(xiě)入后用fits_update_key更新關(guān)鍵字即可[7]。

3.2 對(duì)FITS主數(shù)據(jù)組或圖像擴(kuò)展的輸入/輸出操作

對(duì) FITS文件的操作中最重要的是對(duì)數(shù)據(jù)單元的讀寫(xiě)了,CFITSIO可以讀寫(xiě)FITS文件中的全部或部分?jǐn)?shù)據(jù)。例如:fits_read_pix(fptr, datatype, fpixel, nelement, nulval, >array, anynul, status)把從fpixel開(kāi)始,長(zhǎng)nelement的FITS數(shù)據(jù)單元中的數(shù)據(jù)讀進(jìn)array數(shù)組。其中datatype 是數(shù)據(jù)類(lèi)型,即BITPIX;fpixel是NAXIS維的數(shù)組,表示讀取數(shù)據(jù)的開(kāi)始點(diǎn)坐標(biāo);nelement表示要讀取數(shù)據(jù)的總個(gè)數(shù);array是存放所獲得數(shù)據(jù)的矩陣。而 fits_write_subset(fptr, datatype,fpixel, lpixel, nulval, > array, status)則把子圖像或整個(gè)圖像寫(xiě)進(jìn)FITS數(shù)據(jù)單元內(nèi)。

3.3 對(duì)FITS文件的ASCII或BINARY表的操作

在FITS表文件中,行的數(shù)目由文件頭中關(guān)鍵字NAXIS2給出,列的數(shù)目由FTIELDS給出,值得注意的是表中第一行或列的位置是1而不是0。CFITSIO同樣能夠獲取表的各種信息及對(duì)表行列進(jìn)行編輯操作。例如:fits_find_first_row(fptr, expr, > rownum, status)可以查找第一個(gè)滿(mǎn)足表達(dá)式expr的行。fits_delete_rows(fptr, firstrow, nrows,> status)刪除表中從firstrow開(kāi)始的nrows行。

3.4 錯(cuò)誤狀態(tài)

幾乎所有的 CFITSIO程序都以?xún)煞N方式來(lái)返回錯(cuò)誤信息:函數(shù)本身的返回值和錯(cuò)誤狀態(tài)參數(shù)status。當(dāng)函數(shù)返回0或狀態(tài)參數(shù)為0時(shí)表示正常返回,否則出錯(cuò)。CFITSIO還維持一個(gè)長(zhǎng)80字符的內(nèi)部錯(cuò)誤堆棧,它提供詳細(xì)的錯(cuò)誤描述信息,我們可以調(diào)用 fits_report_error或 fits_read_errmsg函數(shù)來(lái)獲取相應(yīng)的錯(cuò)誤信息[7]。需要特別指出的是狀態(tài)參數(shù)status,它既是輸入?yún)?shù)又是輸出參數(shù),在調(diào)用CFITSIO的子程序前必須先將其設(shè)置為0,否則子程序?qū)⒉蛔鋈魏尾僮鞫⒖谭祷亍R虼宋覀冊(cè)诰幊虝r(shí)只需在程序的最末端檢查狀態(tài)參數(shù)即可。

3.5 CFITSIO的其它功能

CFITSIO中另一個(gè)常用的子程序是fits_iterate_data,它是一個(gè)用戶(hù)定義面向?qū)ο蟮淖x寫(xiě)圖像或表的方法。雖然相對(duì)有點(diǎn)復(fù)雜,但其優(yōu)點(diǎn)在于使用較少的代碼高效地完成工作。

CFITSIO最大可支持6TB的FITS文件,通常來(lái)說(shuō)不存在容量問(wèn)題。同時(shí)CFITSIO能夠高速的操作FITS文件,它的最大I/O速度依賴(lài)于運(yùn)行的操作系統(tǒng)。在現(xiàn)今的工作站或PC上最大I/O速度能達(dá)到5-10M/s或更快。如果FITS文件存放在內(nèi)存時(shí),最大I/O速度甚至可以達(dá)到30M/s[7]。為了獲得最大的I/O速度,應(yīng)該以適當(dāng)?shù)捻樞蛘{(diào)用CFITSIO中的子程序,否則將會(huì)降低程序的執(zhí)行速度。

[1]Wells D C, Greisen E W & Harten R H. FITS: A Flexible Image Transport System. A&AS, 1981, 44: 363-370

[2]FITS Working Group. Definition of the Flexible Image Transport System (FITS). Version 3.0. 2008.

[3]A Primer on the FITS Data Format. http://fits.gsfc.nasa.gov/fits_primer.html.

[4]IAU. Information Bulletin. 1983,49.

[5]李化南,肖泉寶,邵正義.FITSIO 軟件包的簡(jiǎn)介及應(yīng)用舉例.中國(guó)科學(xué)院上海天文臺(tái)年刊, 2005, 26: 119-124.

[6]Pence W. CFITSIO, v2.0: A New Full-Featured Data Interface. ASPC, 1999, 172: 487-489.

[7]HEASARC. CFITSIO User's Reference Guide. Version 3.0. 2007.

[8]Doxygen. CCfits Reference Manual. Version 2.0. 2008.

猜你喜歡
狀態(tài)參數(shù)關(guān)鍵字子程序
基于HHT算法的分布式電力系統(tǒng)狀態(tài)自動(dòng)監(jiān)測(cè)方法
堆石料的三維應(yīng)力分?jǐn)?shù)階本構(gòu)模型
履職盡責(zé)求實(shí)效 真抓實(shí)干勇作為——十個(gè)關(guān)鍵字,盤(pán)點(diǎn)江蘇統(tǒng)戰(zhàn)的2021
成功避開(kāi)“關(guān)鍵字”
基于大數(shù)據(jù)風(fēng)電場(chǎng)狀態(tài)參數(shù)相關(guān)性分析
The validity analysis of ground simulation test for non-ablative thermal protection materials
淺談子程序在數(shù)控車(chē)編程中的應(yīng)用
子程序在數(shù)控車(chē)加工槽中的應(yīng)用探索
西門(mén)子840D系統(tǒng)JOG模式下PLC調(diào)用并執(zhí)行NC程序
基于用戶(hù)反饋的關(guān)系數(shù)據(jù)庫(kù)關(guān)鍵字查詢(xún)系統(tǒng)
论坛| 青冈县| 巴青县| 平遥县| 临泽县| 天等县| 南阳市| 安龙县| 克拉玛依市| 革吉县| 内江市| 油尖旺区| 商河县| 任丘市| 涟源市| 邵阳县| 德化县| 平阳县| 濉溪县| 方正县| 曲沃县| 出国| 尖扎县| 红原县| 湘潭县| 蓬莱市| 平湖市| 卓尼县| 枣阳市| 溧阳市| 长武县| 肥乡县| 泽普县| 廊坊市| 蕲春县| 都匀市| 历史| 抚顺县| 嘉善县| 绥棱县| 漾濞|