危兵,王锋,邓辉,戴伟,卫守林,梁波,季凯帆
(1.昆明理工大学云南省计算机技术应用重点实验室,云南 昆明 650500;2.中国科学院云南天文台,云南 昆明 650011;3.云南省信息技术发展中心,云南 昆明 650090)
CASA混合编程技术分析与功能扩展研究
危兵1,3,王锋1,2,邓辉1,戴伟1,卫守林1,梁波1,季凯帆1
(1.昆明理工大学云南省计算机技术应用重点实验室,云南 昆明 650500;2.中国科学院云南天文台,云南 昆明 650011;3.云南省信息技术发展中心,云南 昆明 650090)
我国新一代厘米—分米波太阳射电日像仪(Chinese Spectral Radio Heliograph,CSRH)已经进入了设备调试阶段,对数据系统的建设有迫切的要求。如何快速、可靠地实现数据的可信处理,实现一个可供调试及未来使用的数据处理系统是一项十分重要的工作。以射电天文软件包CASA为对象,分析探讨了CASA混合软件开发模式和二次开发利用的可能性,系统阐述了利用Python开发前台,后台调用C++语言的混合编程方法,进而讨论分析了利用混合编程扩展CASA功能以满足太阳射电日像仪应用需求的方法。本方法具有较强的针对性,对我国其它天文新设备数据处理软件系统的开发具有一定的借鉴作用。
CASA;Python/C++;混合编程
CN53-1189/P ISSN1672-7673
为了推动太阳射电观测技术的发展,由我国天文学家提出的400 MHz~15 GHz范围内的厘米—分米波日像仪(Chinese Spectral Radio Heliograph,CSRH)将首次在多波段上实现同时以高空间、高时间和高频率分辨率观测太阳活动的动力学性质,对太阳从色球层到高日冕的广大区域进行高分辨率的三维动态成像观测,填补国际科学界在太阳耀斑、日冕物质抛射等爆发活动的能量初始释放区高分辨射电成像观测的空白,揭示太阳剧烈活动的起源和发生规律,并取得一批原创性的研究成果[1],大大提升我国在太阳活动预报方面的能力,为航空、航天、卫星通讯和国防建设等提供有效保障,对推动学科发展及相关高技术领域的建设具有重要作用。
随着太阳射电日像仪建设不断取得进展,数据处理系统的研制成为当前的一项重要工作。采用何种方式或者技术,快速可靠地实现可信的数据处理,成为当前太阳射电日像仪数据处理系统的一个值得研究的问题。从国际上来看,在射电天文领域,主要采用的数据处理软件有AIPS、AIPS++以及CASA等。这些软件的开发者均是美国国家射电天文台(National Radio Astronomy Observatory,NRAO)。AIPS软件于20世纪70年代开发,基本采用FORTRAN语言,逐渐发展成为射电天文领域的标准数据处理软件。在1988年和1989年,时任国家射电天文台台长的Paul Vanden Bout先生开始推动AIPS++[1]的开发,并成立了软件咨询顾问组(Software Advisory Group,SWAG);90年代后,AIPS++计划启动,用以替代日趋老化的AIPS软件系统。AIPS++开始全面转向C++语言,支持单天线与综合口径射电望远镜的数据处理。
2004年以来,AIPS++的代码被全部重新组织与重构,以提供更好的模块化结构,并开始被逐渐融合到一个新的软件系统通用天文软件应用(Common Astronomy Software Applications,CASA)[2]中去。CASA包括了从最初AIPS++演变而来的一系列C++库,并采用了Python语言代换原有的Glish脚本系统,产生了CASApy软件。老的AIPS++的核心,发展成为一个相对独立的软件部分,即casacore。
CASA软件的发展充分说明了国外天文技术发展中对核心软件系统的重视,从AIPS到AIPS++,再发展到CASA,历时近40年,功能日趋完善,处理能力与性能显著增强,发展成为领域内的标准数据处理软件,这种长时间稳定地对软件系统开发与投入的模式值得我们学习与借鉴。从技术方面发展来看,无论是AIPS、AIPS++,还是CASA,在开发过程中均全面采用或者融入了在开发年代的信息领域的最新技术。从AIPS最初的FORTRAN,再发展到AIPS++全面采用C++编程,并从VAX平台迁移到LINUX平台;发展到CASA时,为了提供更为良好的用户交互界面,同时开始向多平台发展,CASA采用Python语言开发用户界面,通过Python调用casacore中的原AIPS++的处理程序。仔细分析这样的软件模式,不难发现其鲜明的定位与实用的考虑。PYTHON是一种脚本解释执行语言,不需要编译,方便快捷,且能够很好地跨平台。而C++需要编译后运行,在特定的机器上编译后在特定的机上运行,运行效率高,安全稳定。CASA采用这样的模式,充分发挥了两种语言的优势,同时也充分利用长期软件源代码的积累,给太阳射电日像仪数据信息处理系统的研制提供了新的思路。
本文通过分析CASA中Python和C++混合编程的方法,根据新一代厘米—分米波太阳射电日像仪[3-4]对数据处理的要求,实现了在CASA基础上的功能扩展。本文的研究工作充分利用了CASA系统近40年的成功经验和稳定代码,加快了太阳射电日像仪数据处理系统的开发,对国内其它大型望远镜数据处理系统的开发有一定的借鉴作用。
1.1 BOOTST与SWIG技术
如前所述,CASA系统的开发汇集了多个国家的很多科技人员。因此,不同的研发团组采用了不同的Python与C++两种语言混合编程技术,一是Boost开源库(http://www.boost.org)[5]。Boost. Python是一个开源的C++程序库,提供类似接口定义语言(IDL)的接口把C++类和函数绑定到Python。Boost.Python完全用C++实现,没有引入新的语法。提供了丰富的特性和高级接口,从底层起支持按混合系统的方式设计组件,降低程序员编程难度,并且支持C++高效的编译时多态和Python极其方便的运行时多态。
另一种是SWIG(http://www.swig.org)开发工具,CASA开发了一个CASAPY-SWIG程序[6],扩展了XML定义接口。SWIG是一个帮助使用C或者C++编写的软件,能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl、PHP、Python、Tcl、Ruby和PHP。支持语言列表中也包括非脚本编译语言,例如C#、Common Lisp(CLISP、Allegro CL、CFFI、UFFI)、Java、Modula-3、OCAML以及R,甚至是编译器或者汇编的计划应用(Guile、MzScheme、Chicken)。SWIG普遍应用于创建高级语言解析或汇编程序环境,用户接口,作为一种用来测试C/C++或进行原型设计的工具。SWIG还能够导出XML或Lisp s-expressions格式的解析树。当前介绍Python-Boost的技术资料非常多[7-8],本文重点讨论基于SWIG的混合编程方法。
1.2 基于SWIG的混合编程基本过程
CASA所涉及的混合编程主要是在Python中调用C++编写的代码。事实上,基于SWIG开发工具实现这样的混合编程思路较为简单,就是将C++写的模块编译成动态链接库(在UNIX或类UNIX操作系统中的so文件),然后由Python主程序使用。下面通过模拟在实际天文软件开发中利用C++程序读出标准时间,由Python程序调用这一实际应用场景,介绍混合编程的实现过程。具体说明如下:
1、在C或C++编程中,实现所需要被调用的函数。代码如下:
2、编写接口文件(Interface),在SWIG开发工具中,通过编写一个接口文件,再利用工具直接生成一个C/C++的封装文件,可以简化编程。在编程中,也可以直接把这个接口文件的内容放到C/C++的头文件中。
3、编译与测试,操作示意如下:
在生成so文件后,在Python中就可以对生成的进行调用,具体如下:
2.1 CASA程序代码执行流程分析
为进一步理解CASA混合编程的实现,掌握代码执行流程与调用关系。本文对CASA的程序执行过程进行了跟踪。以CASA中导入UVFITS格式的功能importuvfits为例,用户在casapy中输入:
importuvfits命令表示要进行数据文件的转换,从一个uvfits文件sun0922_1011_0.fits转换为ms格式。具体执行过程中,CASA执行的流程跟踪分析如下:
(1)CASA通过词法分析判断输入的用户命令,在本例中判断用户的命令是importuvfits,然后执行相应的Python程序task_importuvfits.py(源程序位于gcwrap/python/scripts/task_importuvfits.py)。在程序中,可以看到有关键的一行:myms.fromfits(vis,fitsfile,antnamescheme=antnamescheme),这表明程序进一步调用了ms包中的fromfits方法。
(2)进一步跟踪分析,可以分析fromfits方法位于gcwrap/tools/ms/ms_cmpt.cc中,数据转换的流程在这个C++程序中实现。
(3)分析ms_cmpt.cc代码,可以分析ms_cmpt.cc中的基本处理逻辑主要是调用casacore的核心代码MSFitsInput.cc,也就是说真正实现转换功能的程序是casacore中的C++代码实现的。
上述分析可知,CASA的编程,虽然采用了Python与C++混合编程,但相互边界非常清楚。用户交互采用Python实现,其后通过C++实现一个边界类供Python调用,这个边界类再去调用相应的casacore的核心代码完成整个功能。这样的实现模式也意味着要自行扩展CASA的功能是完全可能的,只要增加相应的Python程序,设计对应的_cmpt.cc方法,就可以实现功能的扩展。
2.2 XML接口定义分析
上节集中分析了CASA流程的执行,但简单的编写Python程序和边界类的设计还不足以扩展相应的功能。这是因为CASA要求申明C++类的调用接口,也就是前述的接口文件。CASA在具体的混合编程中,考虑到CASA需要调用的功能众多,如果采用1.2节接口描述的方法,则需要逐一对调用功能进行定义,这样后期维护性较差。为此,CASA在程序设计中扩展了SWIG技术,通过进一步引入了扩展标记语言(XML)定义方法以及所有相关的属性,也就是所谓的CASA-SWIG。
CASA-SWIG规定,每个边界类都对应一个XML描述。XML中描述了类的接口,接口参数的缺省值和约束,以及每个类相应功能或服务调用的帮助信息。XML通过标签对相应参数或属性进行定义如下:
仍以上述例子为例,转换uvfits的功能程序位于gcwrap下的tools目录。XML定义包含在image. xml文件中,分析说明如下(为节约篇幅,定义中的描述内容有省略):
2.3 类代码的实现分析
在XML定义完成后,需要编写相应的边界类。在CASA中,对应的边界类源程序文件名采用模块名_CMPT.cc命名。fromfits方法被封装在/casa/gcwrap/tools/image_cmpt.cc中。说明如下:
(在代码实现时,所有的参数与XML的定义要严格对应。方法定义中,可以看出返回类型为bool变量,同时,fromfits一共有6个调用参数,显而易见,参数类型与XML所描述的完全一致。)
3.1 CASA源程序的获得与环境的搭建
根据CASA官方的资料介绍,开发环境尽可能选用Redhat Linux Enterprise 5.x,也就是红帽的LINUX服务器版本5,但由于该版本为商业版本,在实际开发中可以采用CentOS 5.7/5.8版本。同时作者开发时,曾分别试验了Scientific Linux6和CentOS 6等,发现版本过高反而存在较多问题,主要原因是CASA开发若干环境上与新版本不兼容。
在CentOS安装完成后,通过yum-y update升级当前所有的系统软件。完成后配置YUM升级源,再下载CASA开发环境即可。说明如下:
CASA所有的源程序均提供开放下载,为确保与开发者的版本同步,要用Subversion进行下载与版本控制是一个较好的方法。在LINUX环境中,顺序执行如下命令:
(设定需要下载的版本,这个可以直接用浏览器访问https://svn.cv.nrao.edu/svn/casa/进行查看,原则上应尽可能取最新的发行版)
(设定CASA源程序下载后的存放目录)
(通过svn程序,建本地项目)
(下载4个主要部分,即:casacore,code,gcwrap,asap)
3.2 CASA功能扩展
结合第2节的分析可知,对CASA进行功能扩展,核心就是在所需要扩展的模块文件上,修改更新XML定义,明确接口。其次在C++程序上,扩展类的方法,完成具体的实现。
本文以扩展一个数据导入模块为例,描述功能扩展的具体方法。太阳射电日像仪的前端数字接收机由中国科学院电子所开发,保存为相应的二进制格式文件,根据业务需要,将这样的二进制数据文件转为MeasurementSet格式(ms格式)。当前CASA系统主要支持ms格式,FITS-IDI与UVFITS格式的转换。如果可以通过扩展功能,使得在CASA软件中直接支持电子所数据格式的转换,无疑就可以直接利用CASA软件的功能,简化数据处理流程,在导入文件后直接利用CASA软件进行数据处理。整个功能扩展的过程描述如下:
(4)功能部署
在代码编写完成后,重新编译casa系统,并进行安装。Casa全面采用跨平台MAKE(cmakehttp://www.cmake.org)作为项目编译软件,编译过程相对简单,具体的编译过程可以参考casa网站相关资料(https://safe.nrao.edu/wiki/bin/view/Main/ScottRankinCasaBuildNotes)。在重新进入casa系统后,可以发现新增的命令已经可以在casa中被正确调用。
CASA已经是当前射电数据处理的标准,国外大量的射电天文台都利用CASA软件进行观测数据的处理。本文的研究结果,可以根据新一代厘米—分米波太阳射电日像仪数据处理的需要,以CASA和相应的底层开发包(Casacore等)为基础,利用Python和C++混合编程的方法,在CASA快速扩展自定义功能,这样的编程方法,无疑可以加快太阳射电日像仪数据处理系统的研制。由于充分利用了原有CASA的功能快速地构建数据处理软件的原型,因此从基础算法等方面来看,数据的可信度能被天文学家直接采信。在确保数据处理过程可信度的前提下反过来检验机器各类误差,又可以有效地加快仪器调试过程,对加快太阳射电日像仪的调试过程起到了较好的推动与保障作用,对国内其它大型望远镜系统数据处理系统的开发也有一定的借鉴作用。
[1] Croes G A.On AIPS++,a new astronomical information processing system[C]//Hanisch R J,Brissenden R J V,eannette Barnes,et al.Astronomical Data Analysis Software and Systems II,A.S.P.Conference Series,1993,52:156-166.
[2] McMullin J P,Waters B,Schiebel D,et al.CASA architecture and applications[C]// Richard A S,Frank H,David J B.Astronomical data analysis software and systems XVI ASP conference series.Proceedings of the conference held 15-18 October 2006 in Tucson,Arizona,USA.2006,376:127.
[3] 黄静.新一代厘米分米波射电日像仪科学目标探讨[C]//太阳射电天文学——新一代射电频谱日像仪建设进展研讨会摘要集,2010.
[4] 王威.中国射电日像仪5单元系统校准与数据处理方法[C]//太阳射电天文学——新一代射电频谱日像仪建设进展研讨会摘要集,2010.
[5] 徐凌,尹勇.基于Boost.Python库的混合语言编程及其应用[J/OL].[2012-12-18].中国科技论文在线,http://www.paper.edu.cn/releasepaper/content/200803-171.
[6] Nikolic B,Graves S F,Bolton R C,et al.Design and implementation of the wvrgcal program [J].Instrumentation and Methods for Astrophysics,2012:1-8.
[7] 徐剑飞,薄亚明.C语言与Python语言混合编程的接口设计[J].微处理机,2003(5):31-32+35.
Xu Jianfei,Bo Yaming.Interface designing of C and Python languages hybrid programming[J]. Microprocessors,2003(5):31-32+35.
[8] 罗霄,任勇,山秀明.基于Python的混合语言编程及其实现[J].计算机应用与软件,2004,21(12):17-18+112.
Luo Xiao,Ren Yong,Shan Xiuming.Python based mixed-language programming and its implementation[J].Computer Applications and Software,2004,21(12):17-18+112.
An Analysis of Python/C++Hybrid Programming for the CASA Software System and a Study of an Approach to Expand CASA Functions
Wei Bing1,3,Wang Feng1,2,Deng Hui1,Dai Wei1,Wei Shoulin1,Liang Bo1,Ji Kaifan1
(1.Key Laboratory of Applications of Computer Technologies of the Yunnan Province,University of Science and Technology of Kunming,Kunming 650500,China,Email:wangfeng@cnlab.net;2.Yunnan Observatoryies,Chinese Academy of Sciences,Kunming 650011,China;3.Center of the Development of Information Technology of the Yunnan Province,Kuming 650090,China)
The new generation spectral radioheliograph of China(CSRH)working in the wavelength range from centimeters to decimeters has entered its testing stage.It becomes urgent to study efficient and reliable approaches of instrument calibration and observational data processing for the CSRH to facilitate its development.In this paper,in order to meet the need of establishing a data processing system that can be used for current tests and future observations with the CSRH,we discuss development modes for the CASA(Common Astronomy Software Applications)software system and explore approaches of secondary developments of the system.We propose a hybrid programming method combining the Python and C++for developments of software applications.We discuss the details of this method,which for a software application uses the Python for developing the front stage and makes C++routines called in the back stage.We further describe a practical approach to expand the functions of the CASA based on the hybrid programming.In summary,our method can contribute to the research and development of the CSRH;furthermore,it can serve as a reference for the research of data processing software systems for other new astronomical telescopes in China.
CASA;Python/C++;Hybrid programming
TP311.1
A
1672-7673(2014)01-0046-08
2012-12-18;修定日期:2013-01-12
危 兵,男,正高级工程师.研究方向:计算机网络应用.Email:weibing@ynnic.gov.cn
王 锋,男,教授.研究方向:分布式计算,天文技术与方法.Email:wangfeng@cnlab.net