此前在学习CLASS的过程中记了些笔记,形成了一个极简“教程”(http://blog.sciencenet.cn/home.php?mod=space&uid=117333&do=blog&id=567008)。从我接触到的各种数据处理软件来看,IDL(如果委屈地认为是数据处理软件的话)是比较灵活的,可以方便地读入数据的头文件,数据本身,然后可以进行灵活的数组操作,然后可以把处理完的数据再写到一个新的文件里,这让人感到十分满意;AIPS是最难理解的,虽然很多人用,并且以会用AIPS来显摆,但是说实话,本人从根本上就不喜欢AIPS的哲学,因为没有足够的灵活性;AIPS的改进版用python封装后形成的CASA倒是让人眼前一亮,有空的时候可以去研究一下;CLASS处于中间,有一定的灵活性,当然不如作为一门高级语言的IDL那样灵活,但是CLASS的语法很让我感到亲切,所以我愿意花点时间进行一些研究。
从网上能找到的一些简单教程和例子里可以学到很多关于CLASS的知识和使用技巧,可以进行基本的数据处理。但是要用CLASS达到和IDL相同的灵活性,光从例子就获得不了更多的信息了。所以现在从更基本的层面对CLASS进行一些探索。在这个过程中,类比会有很多帮助。所谓使用CLASS到达IDL那样的灵活性,其实只需要做到,能自己造一个数组,对数组进行各种操作,自己造一个文件头,然后写到一个文件里。 类比FITS文件,CLASS文件也有文件头和数据两部分。从CLASS的手册上看,CLASS文件头有以下一些变量
TELESCOPE Character*12, RW, Telescope name NUMBER Integer, RW, Observation number VERSION Integer, RO, Version number DATATYPE Integer, RO, Type of observation
0 Line, 1 Continuum, 2 Skydip QUALITY Integer, RO, Quality of data SCAN Integer, RO, Original scan number UTOBS Double, RO, UT of observation (Radians)
LSTOBS Double, RO, LST of observation (Radians) AZIMUTH Real, RW, Azimuth of observation (Radians) ELEVATION Real, RW, Elevation of observation (Radians)
TSYS Real, RW, System temperature TIME Real, RW, Integration time (Seconds) SOURCE Character*12, RW, Source name LAMBDA Double, RW, Longitude of source (Radians)
BETA Double, RW, Latitude of source (Radians) OFF_LAMBDA Double, RW, Offset in longitude (Radians) OFF_BETA Double, RW, Offset in latitude (Radians) EPOCH Real, RW, Epoch of coordinates (Years)
LINE Character*12 RW, Line name CHANNELS Integer, RO, Number of channels REFERENCE Real, RW, Reference channel FREQ_STEP Real, RW, Frequency step by channel (MHz)
VELO_STEP Real, RW, Velocity step by channel (km/s) VELOCITY Real, RW, Velocity of reference channel FREQUENCY Double, RW, Rest frequency at reference channel
IMAGE Double, RW, Image frequency " " " " BEAM_EFF Real, RW, Telescope beam efficiency FORWARD_EFF Real, RW, Telescope forward efficiency
GAIN_IMAGE Real, RW, Image to signal band ratio WATER Real, RO, Water vapor content (mm) PRESSURE Real, RO, External pressure (hPa) AMBIENT_T Real, RO, External temperature (K)
CHOPPER_T Real, RO, Chopper temperature (K) COLD_T Real, RO, Cold load temperature (K) TAU_SIGNAL Real, RO, Opacity in signal band TAU_IMAGE Real, RO, Opacity in image band
ATM_SIGNAL Real, RO, Atmospheric temperature in signal band ATM_IMAGE Real, RO, Atmospheric temperature in image band
RX Real[8192] RO, X values of data points RY Real[8192] RW, Y values of data points
在读入数据以后可以用exam命令查看这些变量,例如 LAS> file in qhz.14m LAS> find LAS> get f
LAS> exam frequency 就可以列出 FREQUENCY = 115271.2020000000 ! Double GLOBAL 知道了头文件的变量,除了查看,也可以进行修改。具体可以使用modify命令,但是能修改的变量有限,可以用
LAS> help modify
查看。其他参数的修改就需要用sic中的let命令进行。
如果注意观察的话可以发现,对于光谱文件而言,数据其实是包含在头文件里的,rx和ry就分布是频率和强度值(CLASS不分大小写,这个和IDL是一样的,多数情况很方便)。这样一来实际上可以自己对数据进行操作,例如,认为把光谱强度增加为原来的两倍。
LAS> plot
LAS> let ry ry*2
LAS> plot
观察画出来的图就可以发现(内存中的)数据被更改了。注意,rx是只读的,只能对ry进行处理。
原则上也可以在CLASS里将一幅图像读到一个二维数组里,但是可以发现,这个数组是只读的,也就是说无法直接处理,而三维数据块就更难了。不过仔细思考
可以发现,所谓三维数据块,就是一些排列好的谱线,只要能对每一条谱线进行处理,原则上就可以对数据块进行处理。也就是说,面对一个三维数据块,我们可以
进行以下操作将其转换为普通的CLASS文件(就是一些光谱组成的表)。
LAS> file out qhz_dismantle.14m
LAS> lmv qhz.lmv
之后就可以将文件qhz_dismantle.14m读入进行之前提到的操作了。