陳 晟,黃茂海,劉飛飛
(1.中國科學院國家天文臺,北京 100012;2.中國科學院研究生院,北京 100049)
天基多波段天文變源監(jiān)視器(Space-based Multi-band Astronomical Variable Object Monitor,簡稱SVOM)項目是中法合作建造的天文小衛(wèi)星[1-2],用于探測伽瑪暴(Gamma Ray Burst,GRB)及其余輝,預計2014年發(fā)射。SVOM的科學目標是檢測所有已知類型的GRB,通過天地配合快速、可靠、精確地提供GRB的位置信息,測量GRB的能譜和光變信息,并快速辨識GRB余輝。
針對項目的科學任務需求,SVOM項目共包含中法雙方提供的4個星上載荷和3臺地面設備。4個星上載荷包括1個X射線和伽瑪射線相機(CXG),1個伽瑪射線監(jiān)視器(GRM),1臺軟X射線望遠鏡(SXT)和1臺光學望遠鏡(VT)。3臺地面設備則包括2臺1 m口徑望遠鏡(GFT)和1個廣角相機陣列(GWAC)。衛(wèi)星發(fā)現(xiàn)新的GRB爆發(fā)后,將迅速進行定位和測光,并通過地面上的VHF網(wǎng)絡即時把GRB觸發(fā)警報傳播給地面后隨觀測系統(tǒng),地面后隨觀測系統(tǒng)再進一步進行高精度的觀測。
SVOM衛(wèi)星擁有4種觀測模式。GRB觀測模式對GRB爆發(fā)進行監(jiān)測、報告、后續(xù)觀測;日常觀測模式通過從科學界收集觀測提案,按照提案的要求進行常規(guī)天文觀測,并進行數(shù)據(jù)處理;快速反應和機遇目標觀測模式對偶然發(fā)生的、值得觀測的目標進行觀測;定標與維護安全模式則對航天器和有效載荷進行工程維護或故障排除、系統(tǒng)修復。
SVOM的項目需求與運行模式?jīng)Q定了其科學數(shù)據(jù)不同于傳統(tǒng)的地面天文設備的觀測數(shù)據(jù),而具有以下特點:
第一,數(shù)據(jù)關系復雜。數(shù)據(jù)處理人員需要將來自有效載荷儀器的科學數(shù)據(jù)與衛(wèi)星平臺、軌道、空間環(huán)境、地面配合觀測設備等大量數(shù)據(jù)結合起來,經(jīng)過多級流水線處理才能形成可發(fā)布的最終產(chǎn)品。
第二,處理方法試驗性強。處理方法一方面要根據(jù)衛(wèi)星平臺狀態(tài)、載荷狀態(tài)、空間環(huán)境、個體GRB事件的特性、每個日常觀測提案的特性等因素的變動經(jīng)常調(diào)整,另一方面也會隨著處理算法的改進而變動,因此不宜使用傳統(tǒng)的固化程序進行處理。
第三,時效性要求高。GRB觀測要求異常高速的天地協(xié)同觀測能力,需要對每一個GRB事件進行快速處理并立刻發(fā)布報告產(chǎn)品,以供后續(xù)觀測使用。
第四,用戶需求廣泛多樣。SVOM項目由中法合作建造,雙方的載荷需要協(xié)同使用,統(tǒng)一管理。其主要用戶還將包括來自全世界的天文學家。不同國家不同文化的用戶對處理方法的易用性、靈活性都有較高要求,很多用戶希望按照自己的思維方式做定制處理。
針對SVOM觀測數(shù)據(jù)的這些特點,提出了基于腳本語言的數(shù)據(jù)處理方法。開發(fā)高效、配置靈活的腳本語言,讓儀器工程師和天文學家等非專業(yè)軟件開發(fā)人員都可以在短時間內(nèi)開發(fā)出高質量的處理程序,從而充分適應多變的需求。
腳本語言(Scripting Languages)是一種新興的致力于高效靈活開發(fā)的人性化編程語言。與傳統(tǒng)的系統(tǒng)編程語言(System Programming Languages)不同,腳本通??梢越换ナ降慕忉屵\行而非編譯,并且擁有簡單、易學、易用的語法,能夠快速靈活地完成程序編寫。應用程序的終端用戶可以利用腳本語言按自己的需求定制程序,不再單一地扮演使用者的角色。
相比于以C、C++、Java為代表的系統(tǒng)編程語言,腳本語言的特點主要表現(xiàn)在以下幾個方面:
(1)腳本語言一般都是解釋執(zhí)行,節(jié)省了大量編譯、連接的時間。地面系統(tǒng)軟件往往包括幾十萬行規(guī)模的代碼,整體編譯一遍即使在專用的編譯服務器上也需要2 h以上。如果不使用腳本編程去適應可能隨時變化的需求,任何一個微小修改的實現(xiàn)與測試將變得非常繁瑣。
(2)解釋執(zhí)行的機制還給腳本語言帶來了很好的交互性。程序可以逐行單步執(zhí)行、隨時跳轉,即時看到執(zhí)行結果,并修改下一步的操作,這讓程序調(diào)試變得非常方便。
(3)腳本語言還可以實現(xiàn)運行時的熱編碼功能,給應用程序帶來很大的適應性和可用性。例如,服務器端根據(jù)用戶需求即時生成的Javascript腳本,腳本在瀏覽器中解釋執(zhí)行,達到動態(tài)渲染頁面的效果。Erlang腳本的代碼熱拔插特性使其在系統(tǒng)不中斷運行的情況下,隨時更新自己的模塊,一段結構良好的Erlang腳本可以在其整個生命周期中一直保持運行,這對于要求高可用性的場景來說是一個非常引人注目的特性。
(4)腳本語言通常注重簡潔實用,既有很強的可讀性,又能帶來很高的開發(fā)效率。同樣功能的系統(tǒng)編程語言常常比腳本語言長5~10倍。統(tǒng)計顯示,一條典型的腳本語言語句要執(zhí)行幾百甚至上千條機器指令,而系統(tǒng)編程語言的一條語句一般只執(zhí)行5~10條指令[3]。例如:Perl可以像使用一個整數(shù)一樣直接使用正則表達式,而Java至少需要創(chuàng)建2個對象(Pattern、Matcher)、調(diào)用3個方法(編譯、匹配、查找)才能完成一次正則匹配。
(5)腳本語言的靈活性還表現(xiàn)在語法要求不那么嚴格,大部分腳本語言采用弱類型變量(Python、Jython除外),一個字符串可以隨意與一個整數(shù)、甚至一個函數(shù)進行操作而不需要強制類型轉換。弱類型使得腳本語言可以更好地兼容來自不同系統(tǒng)、不同語言的代碼,更好地發(fā)揮粘合劑的作用。
(6)腳本語言自由的訪問規(guī)則,自動的內(nèi)存管理,以及強大內(nèi)置類庫,也讓開發(fā)者能受益于基于組件(component)的編程,從而更專注于程序的業(yè)務邏輯,而非計算機或者編程語言本身。
(7)使用系統(tǒng)語言編寫的模塊在腳本的粘合下,系統(tǒng)語言的性能優(yōu)勢和腳本語言的靈活性互為促進,使用范圍大大增強。最廣泛的例子就是Unix里的shell腳本,大部分Unix命令使用C語言編寫,而完成系統(tǒng)和用戶任務的幾乎由shell腳本完成。Java平臺的廣泛應用,也推進了大量基于Java的腳本語言的發(fā)展,如Jython、JRuby、Groovy。
腳本語言剛誕生的時候,僅僅被當作批處理和控制臺腳本等粘合工具使用,主要作為高級語言的輔助,處于非主流地位。隨著腳本語言自身的不斷發(fā)展,其內(nèi)置類庫越來越強大,逐漸可以不依賴于其他高級語言,獨立開發(fā)出完整、復雜的應用程序。特別是隨著因特網(wǎng)的廣泛應用,對程序的靈活性、適應性和開發(fā)周期提出了更高的要求,腳本語言得到了空前飛速的發(fā)展,逐漸登上了主流編程語言的舞臺。到了今天,腳本語言已經(jīng)在TIOBE發(fā)布的編程語言排行榜[4]的前十名中穩(wěn)占五位(PHP、Python、JavaScript、Perl、Ruby,Visual Basic未包含其中雖然大量 asp程序很可能使用 VB Script編寫)。
隨著計算機硬件性能指數(shù)級的迅速提高,解釋執(zhí)行帶來的性能損失也越來越微不足道。不少腳本語言還發(fā)展出即時(Just-In-Time,JIT)編譯的運行方式,在程序首次運行時將腳本進行編譯,這對于雖然需要經(jīng)常修改、但是修改次數(shù)遠小于程序執(zhí)行次數(shù)的場景特別適用,這樣既享受了腳本語言帶來的酣暢淋漓的開發(fā)效率,又在很大程度上避免了運行效率問題。而當前最流行的WEB程序絕大部分都符合這樣的場景,這也是腳本語言如今在WEB開發(fā)中占據(jù)絕對主導地位的重要原因。
與此同時,現(xiàn)代系統(tǒng)編程語言也開始意識到腳本語言的意義,逐漸開始學習和吸收腳本語言的優(yōu)勢,使得腳本和系統(tǒng)編程語言之間的界限越來越模糊。Google最近推出的熱門編程語言GO語言便是以高速編譯為亮點,號稱集合了C的性能和Python的開發(fā)效率。而Sun公司更是在Java6中提供了對腳本引擎的全面支持(JSR-223[5]),只要遵循JSR-223的接口規(guī)范,用戶完全可以根據(jù)項目需求量身定制自己的腳本語言,并在Java中對腳本進行解釋或編譯,腳本與Java的整合從此變得空前簡單。
腳本語言的上述特點使其特別適合于SVOM的數(shù)據(jù)處理。
首先,腳本的交互性非常適合處理大量關系復雜的數(shù)據(jù),通過腳本的單步執(zhí)行,數(shù)據(jù)分析員可以即時查看數(shù)據(jù)內(nèi)容和處理結果,并對后面的處理方法做出改進。
其次,腳本無需編譯即改即用的特點也適合于SVOM這樣數(shù)據(jù)處理需求經(jīng)常變動的項目。SVOM的數(shù)據(jù)處理系統(tǒng)需要支持SVOM從研發(fā)測試到在軌運行的整個項目周期,由于對有效載荷特性的認識的深化、定標方式的改進、定標要求的變更,需要數(shù)據(jù)處理方法在受控情況下改進,保證數(shù)據(jù)處理質量隨著用戶對有效載荷和處理方法進行的改進而提高。特別是GRB的偶然性與SVOM的高時效性,更要求數(shù)據(jù)處理系統(tǒng)能夠在可控范圍內(nèi)快速完成修改。
此外,腳本語言的易用性在SVOM項目中也具有重大優(yōu)勢,一方面專業(yè)的軟件開發(fā)人員在項目前期原型系統(tǒng)開發(fā)中效率更高、代碼更可讀,另一方面儀器工程師、項目科學家、時間分配委員會專家等非專業(yè)的參與者也能以更平緩的學習曲線,開發(fā)出質量更高的處理程序。
SVOM科學中心是SVOM項目科學數(shù)據(jù)處理的核心。SVOM衛(wèi)星的下行原始數(shù)據(jù)和測控數(shù)據(jù)在科學中心進行合并,通過定標等多級流水線處理,最終獲得具有科學價值的數(shù)據(jù)產(chǎn)品,供廣大天文學家使用。SVOM科學中心的數(shù)據(jù)處理系統(tǒng)(DP)是科學中心的核心子系統(tǒng)之一,主要提供以下功能:
(1)數(shù)據(jù)產(chǎn)品的定義與生成:包括數(shù)據(jù)建模和標準產(chǎn)品生成;
(2)數(shù)據(jù)產(chǎn)品的存儲與訪問:產(chǎn)品的讀取、保存、修改、刪除、查詢等,存儲地點既可以在本機,也可以基于網(wǎng)絡;
(3)數(shù)據(jù)處理流水線:針對不同觀測模式提供標準的數(shù)據(jù)產(chǎn)品處理流水線;
(4)強大的數(shù)學和繪圖類庫:可以對光譜、圖像、數(shù)據(jù)表天文數(shù)據(jù)等進行可視化的交互分析。
該系統(tǒng)除了部署在科學中心服務器上之外,還可以安裝在任何一臺個人計算機上,由用戶按照自己的需要更新定標數(shù)據(jù),創(chuàng)建、修改數(shù)據(jù)處理流程,或進行進一步的科學分析,從而更方便地為項目科學家、儀器工程師以及廣大天文學家服務。
根據(jù)已經(jīng)取得的預先研究成果,SVOM科學中心數(shù)據(jù)處理系統(tǒng)擬使用Java語言開發(fā),避免多平臺部署問題和主硬件平臺迅速過時的風險,采用完全面向對象的設計,并把Jython[6]作為腳本語言嵌入到整個數(shù)據(jù)處理中,大大提高系統(tǒng)的開發(fā)效率與可配置性。系統(tǒng)利用赫歇爾空間天文臺的交互式分析環(huán)境HIPE(Herschel Interactive Processing Environment[7])提供的強大類庫和工具包。HIPE是歐空局赫歇爾開發(fā)團隊貢獻給天文學界的一款開源軟件,中國科學院國家天文臺自2004年起就加入該項目的軟件研制,包括作者在內(nèi)的項目團隊貢獻了多個核心組件[8-9]。將HIPE在赫歇爾項目中的成功經(jīng)驗,結合SVOM項目的具體需求,應用到SVOM科學中心的數(shù)據(jù)處理系統(tǒng)中。根據(jù)SVOM項目進展要求,科學中心的研發(fā)目前正處于原型驗證階段。
Jython是腳本語言Python的Java實現(xiàn),是一種高級、動態(tài)、面向對象的腳本語言。作為一款開源的自由軟件(Free Software),Jython在商業(yè)和非商業(yè)用途都可以免費使用和發(fā)布,友好的使用協(xié)議最大限度地降低了授權風險。
Jython完全繼承了Python簡潔精悍的語法,既極大地減少了編程的代碼量,又降低了新語言的學習曲線。Numpy、Scipy、Pyraf等Python類庫的出現(xiàn),已經(jīng)在天文學家中積累了大量Python用戶,而Jython語法與天文學家常用的IDL也較為接近,即使不熟悉Python的用戶也可以進行較為平滑的過渡,享受Jython帶來的免費和跨平臺的優(yōu)勢。
Jython能夠直接與內(nèi)存中的Java對象進行交互訪問,從而實現(xiàn)與Java語言無縫集成。一方面Jython可以直接使用Java類,從而使大量Java類庫和API可以應用在腳本編程中,這里不僅包括Java公共類庫,還有本系統(tǒng)為天文學家定制開發(fā)的強大的數(shù)學類庫(numeric包),大大彌補了Jython在數(shù)學處理方面較為薄弱的缺陷。另一方面,Java也可以通過PythonInterpreter實現(xiàn)對Jython腳本的控制(見圖1),包括將內(nèi)存中的Java對象注入Jython和把Jython對象轉為Java對象。
圖1 Java與Jython無縫交互Fig.1 Seamless interaction between Java and Jython objects
一個基本的SVOM數(shù)據(jù)產(chǎn)品(Product)包含產(chǎn)品的元數(shù)據(jù)(Metadata)和數(shù)據(jù)表兩部分。元數(shù)據(jù)與天文學家常用的FITS文件頭信息一一對應,記錄了觀測時間、觀測目標、觀測儀器等等。數(shù)據(jù)表可以是整數(shù)、浮點數(shù)、字符串組成的數(shù)組(1~5維)或表格(列數(shù)不限),以及由此衍生出的光譜數(shù)據(jù)表(1、2維數(shù)組)、圖像數(shù)據(jù)表(2維數(shù)組)等。
由此基本數(shù)據(jù)產(chǎn)品可以衍生出多種科學數(shù)據(jù)產(chǎn)品[10],具體如圖2。
(1)觸發(fā)報告產(chǎn)品(GRBAlertProduct):GRB觸發(fā)信號,包括GRB爆發(fā)時間、位置、測光紅移等基本信息;
(2)觀測數(shù)據(jù)產(chǎn)品(SpaceObservationProduct):星上觀測產(chǎn)品,包括載荷觀測數(shù)據(jù)和航天器信息,四個載荷分別由此衍生出各自的觀測產(chǎn)品;
(3)地基觀測產(chǎn)品(GroundObservationProduct):由地面觀測系統(tǒng)獲得的觀測數(shù)據(jù)。
所有數(shù)據(jù)產(chǎn)品都可以通過數(shù)行Jython代碼方便地讀寫與查詢,大大方便了天文學家獲取SVOM的科學數(shù)據(jù)。圖2顯示的Jython腳本片段的功能是從遠程服務器(SVOM Achieve Server)查詢指定觀測者的VT產(chǎn)品、檢查其內(nèi)容并保存到本地。腳本對本地和遠程服務器的訪問方法完全一致,即數(shù)據(jù)存儲的物理位置對訪問者是透明的。查詢結果將以FITS格式按指定策略分類保存到本地計算機上。
圖2 SVOM數(shù)據(jù)產(chǎn)品結構Fig.2 Structure of the SVOM data product
SVOM的原始數(shù)據(jù)(Raw Data)從地面站接收后,經(jīng)過任務中心的譯碼、解包等預處理,成為未經(jīng)處理的包括所有信息的0級產(chǎn)品。在0級產(chǎn)品的基礎上,科學中心根據(jù)載荷類型、觀測事件和觀測模式對數(shù)據(jù)進行分類,使用輔助數(shù)據(jù)注解,并將數(shù)據(jù)從工程單位轉換為物理單位,形成1級產(chǎn)品。1級產(chǎn)品經(jīng)過數(shù)據(jù)處理流水線的進一步處理,去除儀器效應形成定標后的2級產(chǎn)品,然后經(jīng)過更多的科學分析得到高層的3級產(chǎn)品,包括GRB流量、光變曲線、GRB警報等等。圖3詳細展示了SVOM的數(shù)據(jù)處理流程。
圖3 SVOM數(shù)據(jù)處理流程Fig.3 Flowchart of SVOM data processing
根據(jù)SVOM項目需求,衛(wèi)星發(fā)現(xiàn)GRB發(fā)回觸發(fā)報告后,地面系統(tǒng)需要快速做出響應,因此SVOM的處理流水線又分為快速處理和詳細處理兩部分??焖偬幚淼膶ο笫荊RB觸發(fā)報告產(chǎn)品,采用批處理自動完成,其目的是快速提供光學對應體的位置和亮度,為地面大望遠鏡的光譜和測光觀測提供指導。而詳細處理則是處理觀測數(shù)據(jù)產(chǎn)品。這部分可以加入人工干預,最終完成數(shù)據(jù)的深加工過程。例如:光學數(shù)據(jù)處理的流水線處理部分(預處理部分)包括儀器效應的改正和定標。數(shù)據(jù)的深加工過程包括:(1)對光學對應體的證認,這是對星載光學觀測數(shù)據(jù)處理的第一重要任務;(2)對光學對應體的測光;(3)光變曲線的生成。
科學中心所有數(shù)據(jù)處理流水線都擬使用基于Jython的腳本語言編寫。各級流水線以任務模塊(Task)為基本單位,任務模塊是數(shù)據(jù)處理的基本組件,完成諸如去宇宙線、去溫漂等基礎操作,可以使用Jython腳本編寫,也可以用高級語言Java完成。Jython將各種任務模塊按需求的邏輯關系整合在一起,形成整條數(shù)據(jù)處理流水線。
科學中心提供的標準數(shù)據(jù)處理流水線將通過數(shù)據(jù)驅動自動完成。同時,經(jīng)處理的0~3級數(shù)據(jù)產(chǎn)品和標準處理流水線腳本本身都發(fā)布給天文學家,天文學家可以直接使用自動生成的高級產(chǎn)品進行快視瀏覽,也可以在標準處理流水線的基礎上按各自獨特的需求進行交互式的分析并做出自己的修改,修改后的腳本無須編譯就可以在用戶計算機上直接運行,在任意一級產(chǎn)品的基礎上處理得到自己想要的科學數(shù)據(jù)。另一方面,隨著將來對儀器特性認識的深化和定標產(chǎn)品、定標方法的更新,用戶只需下載新的標準流水線腳本和定標產(chǎn)品,就可以將已有的產(chǎn)品重新處理,得到更高質量的科學成果。
為了軟件的可重用性,大部分基礎處理操作被封裝成一個個小模塊。Task Framework則為這種處理模塊定義了統(tǒng)一的模板,它設定了輸入輸出格式、處理參數(shù)與默認值(包括可選與必選),以及記錄處理歷史、顯示幫助信息等等。眾多任務模塊通過Jython腳本按需求的邏輯關系整合在一起,形成數(shù)據(jù)處理流水線。所以,任務模塊也是上層的Jython流水線與底層Java組件(數(shù)據(jù)產(chǎn)品、數(shù)據(jù)存儲等)通訊的橋梁(圖4)。開發(fā)者在此框架下,只需指定輸入輸出參數(shù),編寫處理方法,就能實現(xiàn)一個支持各種Jython特性的完整的處理模塊。
圖4 Task是流水線腳本與Java底層組件交互的橋梁Fig.4 TASK as an interactive bridge between the pipelines and Java infrastructure
一個Task通常由兩部分構成:
(1)簽名(Signature):用來標識Task的唯一性,并存儲任務執(zhí)行的輸入輸出、處理參數(shù)和歷史記錄,簽名中還存儲著任務的進度信息,方便外部隨時監(jiān)視任務的執(zhí)行狀態(tài)。
(2)執(zhí)行(Execution):即具體的處理方法實現(xiàn),Task的執(zhí)行包括3個方法:預處理(Preamble)在正式處理之前執(zhí)行,例如檢查輸入?yún)?shù)是否合法;處理(Execute)過程則包含了具體的處理算法;后處理(Postamble)在處理之后執(zhí)行,默認為空,開發(fā)者可以按需設置。3個方法都是無參數(shù)方法,因為所有中間信息都保存在簽名中。
圖5 Task Framework類圖Fig.5 A class diagram of the TASK FRAMEWORK
Task Framework的結構如圖5,任務模塊通過實現(xiàn)JythonEnhancedAccess和JythonCallable接口與Jython腳本進行通訊。JythonEnhancedAccess接口繼承自 JythonPropertyAccess和JythonDictionaryAccess兩個接口,兩個接口分別實現(xiàn)了在Jython腳本中方便地訪問Java類的成員變量,前者以object.property的方式調(diào)用,后者則以 object[“key”]的方式訪問。JythonCallable接口則是允許result=myTask(value)的方式直接執(zhí)行任務得到結果,將傳統(tǒng)的先構造對象(task=myTask(value))再調(diào)用其方法(result=task.perform())的兩個步驟合二為一,這樣的實現(xiàn)使得所有任務模塊的調(diào)用可以一行完成,方便了使用。JythonCallable接口的實現(xiàn)方法如下:
HIPE(Herschel Interactive Processing Environment)是包括中科院國家天文臺成員在內(nèi)的歐空局赫歇爾開發(fā)團隊貢獻給天文學界的一款開源軟件,提供了基于Jython腳本的強大的集成開發(fā)環(huán)境,包括可以單步執(zhí)行的腳本編輯器、命令行接口、任務變量列表、歷史日志等功能。
圖6 HIPE的用戶界面Fig.6 GUI of the HIPE
在HIPE中,用戶(圖6)既可以使用其強大的腳本編程環(huán)境進行腳本調(diào)試,也可以通過各種可視化工具進行交互式的分析。圖7展示了HIPE的繪圖和光譜分析工具。
圖7 HIPE的繪圖(左)與光譜分析工具(右)Fig.7 The plot package(left panel)and spectral analysis tools(right panel)of the HIPE
獲得精確的GRB定位是SVOM項目的基本科學需求。GRB的定位流程是先從CCD圖像中提取亮源,再將提取的亮源表與已知的亮星表進行匹配,從而獲得GRB的精確位置[11]。下面的Jython腳本演示了從圖像中提取亮源的過程。腳本調(diào)用了HIPE提供SourceExtractor任務,支持當前通行的DAOPHOT[12]、Bayesian[13]兩種提取算法。
這樣通過短短的幾行腳本,就實現(xiàn)了提取亮源和結果展示。數(shù)秒后腳本執(zhí)行完成,結果如圖8。提取結果sourceList也是一種數(shù)據(jù)產(chǎn)品(SourceListProduct),包含一個表格數(shù)據(jù)集(TableDataset)和相關屬性信息(MetaData),表格里記錄了所有提取出來的源的坐標、尺度和流量等信息。用戶可以用命令行將結果輸出,也可以方便地利用可視化工具瀏覽表格內(nèi)容,或選取某幾列數(shù)據(jù)繪制成圖表。
圖8 亮源提取結果。左上圖為原始圖像;右上圖為提取結果,其中黃色圓圈代表提取出的源;左下、右下圖分別為結果的列表和繪圖展示Fig.8 Results of source extraction.The upper-left panel is the original image.The upper-right panel shows the result of extraction.The table and plot of the results are shown on the lower-left and lower-right panels,respectively
較慢的運行速度是腳本語言一個不可忽視的問題,不過所幸的是,性能問題完全是一個可以預見的問題,這對于空間項目來講尤其重要。如果系統(tǒng)性能在地面測試中不能達標,可以采用優(yōu)化算法、提高計算機性能等方式應對,直到性能達到要求。相對于固化編程后需求變更而又找不到程序員修改的情況,這并不是一個災難性的問題。
在實際使用中,采取有針對性的優(yōu)化,可以大大緩解性能問題的影響。軟件工程的經(jīng)驗告訴我們,90%的軟件性能問題出在10%的代碼中,只要對軟件進行性能測試找出性能瓶頸所在,就可以極大改進軟件性能。
循環(huán)是數(shù)據(jù)處理中最常用的工具之一,而直接在腳本中做循環(huán)遍歷是一個非常耗時的操作,因此Jython本身與numeric類庫都提供了大量函數(shù)來避免直接在腳本中使用循環(huán)。Jython提供很多諸如map()、filter()、reduce()、zip()等函數(shù)對數(shù)組序列進行高效的遍歷,numeric包里的大量構造函數(shù)和修飾方法也盡可能地將循環(huán)轉移到Java內(nèi)部執(zhí)行。所有內(nèi)置數(shù)組類的get()、set()方法都使用內(nèi)部循環(huán)定義,使用where()方法則可以選擇操作多個數(shù)組元素。例如:
map、filter方法可以將對數(shù)組中的每一個元素執(zhí)行指定函數(shù),循環(huán)在Jython底層的C語言API中執(zhí)行,從而使效率大大提高。如下面的代碼對data數(shù)組中所有元素使用str()函數(shù)(轉為字符串),速度大大優(yōu)于在循環(huán)中一個一個操作:
Jython還繼承了Python語言中序列理解(List Comprehension)的精妙之處,不但可以提高效率,還能顯著增強程序的可讀性,讓原本多層嵌套循環(huán)在一行內(nèi)實現(xiàn)。如果需要有選擇地對序列中某些元素執(zhí)行操作,map、filter函數(shù)需要自定義函數(shù)來過濾元素,序列理解這時就可以發(fā)揮作用了。下列代碼可以將data數(shù)組中所有Count屬性大于4的元素乘3,得到一個新數(shù)組:
Jython中使用+做字符串連接的耗時是四次方于字符串長度,而使用join函數(shù)連接耗時是線性的。
SVOM的科學需求和數(shù)據(jù)特點需要一個簡單、高效、能夠根據(jù)需求快速做出變更的數(shù)據(jù)處理系統(tǒng)。由于腳本語言是解釋執(zhí)行而無需編譯,給編程帶來很大的靈活性,特別適合于開發(fā)生命周期長、需求經(jīng)常變化的項目,而腳本語言高效靈活的語法和交互式的特性也特別適合于處理和分析SVOM的科學數(shù)據(jù)。將基于Jython的腳本語言應用在SVOM科學中心的數(shù)據(jù)處理中,作為其數(shù)據(jù)處理流水線編寫和交互式分析的工具,其易用性和靈活性不僅大大提高了軟件工程師的開發(fā)效率,也讓儀器工程師和天文學家等非專業(yè)軟件開發(fā)人員可以在短時間內(nèi)開發(fā)出高質量的處理程序,從而充分適應多變的需求。
同時,SVOM的需求特點在很大程度上反映了空間天文項目的共性。腳本語言在SVOM數(shù)據(jù)處理系統(tǒng)中的成功運用,不但為SVOM科學中心的數(shù)據(jù)處理等系統(tǒng)提供優(yōu)秀的解決方案,也會為國內(nèi)其他空間天文項目的數(shù)據(jù)處理方法研究開辟新的途徑??梢灶A見,基于腳本語言的空間天文數(shù)據(jù)處理系統(tǒng)通過對多個空間天文項目的長生命周期的支持,將不斷的發(fā)展和完善,逐漸形成一套通用的天文數(shù)據(jù)處理系統(tǒng)。目前我們的系統(tǒng)已經(jīng)提供了虛擬天文臺(VO)數(shù)據(jù)的導入接口,未來將可以提供更多的與虛擬天文臺的無縫交互功能,從而使我們的系統(tǒng)成為一個更加通用的天文數(shù)據(jù)處理平臺,從而更好為廣大天文學家服務。
致謝:感謝SVOM項目為本項研究提供必要的基礎環(huán)境,同時感謝赫歇爾地面段研發(fā)團隊提供的優(yōu)秀類庫支持,特別要感謝團隊中的中方軟件工程師李波、李晶晶做出的杰出貢獻。
[1]You Zheng,Guo Jian,Hao Jinxin,et al.SVOM:Chinese First Space Based Astronomy Observatory [C]//34th COSPAR Scientific Assembly,2002:Q-1-02.
[2]Paul Jacques,Wei Jianyan,Zhang Shuangnan,et al.The Chinese-French SVOM Mission for Gamma-Ray Burst Studies[C]//37th COSPAK Scientific Assembly,2008:2368.
[3]Ousterhout J.Scripting:Higher Level Programming for the 21st Century [J].IEEE Computer 1998,31(3):23-30.
[4]TIOBE Programming Community[EB/OL].http://www.tiobe.com.
[5]JSR 223:Scripting for the Java Platform [EB/OL].http://jcp.org/en/jsr/detail?id=223.
[6]Jython [EB/OL].http://www.jython.org.
[7]Ott S,Bakker J,Brumfitt J,et al.The Herschel Data Processing System [C]//Astronomical Society of the Pacific,2006(315):516.
[8]黃茂海.歐洲空間局的赫歇爾(Herschel)空間天文臺 [J].深空探測研究,2005(12):31.
[9]Guest S,Huang M.NAOC-SPIRE Collaboration Evaluation Report[R].SPIRE-RAL-REP-003180,2009.
[10]黃茂海.中法合作天文衛(wèi)星(SVOM)項目科學地面段方案設計報告 [R].2008:9.
[11]Wang T,Qiu Y,Cai H,et al.A Fast Onboard Star-extraction Algorithm Optimized for the SVOM Visible Telescope[J].Science in China Series G,2010,53(1):51-55.
[12]Stetson P.DAOPHOT-A ComputerProgram forCrowed-field StellarPhotometry [J].Astronomical Society of the Pacific,1987(99):191-222.
[13]SavageR,OliverS.Bayesian MethodsofAstronomicalSourceExtraction [J].The Astrophysical Journal,2007,661(2):1339 -1346.