0%

Baseline 基线的概念

在射电天文学中,基线是连接两个射电望远镜构成的矢量,主要用于干涉测量,以确定观测中某颗源”相位中心”的条纹率,一条基线对应傅里叶空间中的一个点。

对于具有N个元素的干涉仪,有N(N-1)/2个独立的基线。靠近在一起的天线对善于测量源中的大尺度结构,而长基线具有更好的分辨率和解析精细结构。

首先是“基线”,即干涉阵中两个天线所构成的矢量,它是干涉测量的基础概念,一条基线对应傅里叶空间中的一个点。基线由阵列的布局决定。

物理基线

物理基线是在三维空间中,两个天线之间的几何连接。投影基线是该三维的物理基线在二维平面上的投影,该二维平面由观测方向决定。在地面参考系(In Terrestrial Reference Frame,ITRF)中,物理基线是常数,不会变,但是投影基线却会随着地球的自转而改变,因为在天空参考系里,源固定不动,因此投影基线所在的二维平面在随时变化。

杨氏双缝实验

函数double_slit画了一个双缝实验装置, 𝑝处有一个光源(事实上,这个函数可以画多个光源,这里我们暂时只画了一个源)。蓝色点线是光轴(𝑝=0),正弦波可以看出波长(这里单位任意,因为只有跟波长相关的几何距离才会影响到结果)。黑线表示光波通过狭缝到达右边像屏的路径。右边的条纹是干涉模式,红色曲线为干涉模式横截面的光强曲线。

干涉模式随基线baseline 𝐵B (两狭缝之间的距离)和波长𝜆λ 的变化。调整下面的baseline和wavelength滑块,观察右边条纹的变化:baseline越长,条纹频率越高(间隔越窄),波长越短,条纹频率也越高。

最早的双缝实验验证了光的波动性质,光源只是被用来照亮狭缝。现在反问一下自己,如果给定一个双缝装置,我们是否能利用它获得一些光源信息?是否能利用双缝实验做成一个测量设备,也就是 干涉仪 呢?

假定移动位置,我们注意到,长基线对源的位置变化很敏感,而短基线则没有那么敏感。在第四章我们将学习到,干涉仪的空间分辨率(可以区分出的最小源间距离)由𝜆/𝐵λ/B决定,而传统望远镜的空间分辨率由𝜆/𝐷λ/D决定,其中𝐷D为天线(或者镜子)的口径。这是一件非常幸运的事实,因为长基线的造价要比大口径低很多!

然而,由于干涉模式的周期性,长基线测到的位置并不明确。相反,短基线正好能解决上述问题.

如下:

短基线的效果:

最早的visibility的出现,在杨氏双缝实验就已经使用了术语“可见度”visibility,该术语最早指的是干涉模式中亮纹和暗纹间的对比度。

现代干涉仪用的是复可见度,是复数。一个复可见度的振幅,或者可见度振幅,对应了干涉模式的亮度,可见度相位对应了相对相位(在我们的模拟实验中,指的是屏幕中央条纹的相位)。一个复数就表示了光源了所有信息,然而,双缝实验显示了整个干涉模式,屏幕上模式的变化完全取决于“盒子”(一般是用于测量的仪器)的几何规格,光源的信息内容只有幅度和相位。

现代干涉仪用的是复可见度,是复数。一个复可见度的振幅,或者可见度振幅,对应了干涉模式的亮度,可见度相位对应了相对相位(在我们的模拟实验中,指的是屏幕中央条纹的相位)。一个复数就表示了光源了所有信息,然而,双缝实验显示了整个干涉模式,屏幕上模式的变化完全取决于“盒子”(一般是用于测量的仪器)的几何规格,光源的信息内容只有幅度和相位。

到目前为止,我们仅仅只是关注了测量源的属性。显然,干涉模式对仪器的几何性质也很敏感。根据上述现象引申出了干涉仪的许多其它应用,从大地测量VLBI(通过对已知源的射电干涉探测,精确测出天线位置的变化,从而得到大陆的漂移量),到最近LIGO做的引力波探测(以激光作为光源,通过干涉模式测出由引力波引起的时空的微小扭曲,也就是干涉仪的几何改变)。

上面的双缝实验模拟器已经向我们展示了,不同基线长度,其干涉模式传递了天空的某项特定信息。在下面的例子中,对同一条基线,三个不同的“天空”却得到了相同的干涉模式,因此,一次测量无法区分它们:

但是,改变基线长度再次进行测量,得到了截然不同的干涉模式:

使用更多基线,我们能收集到足够信息,重建得到天空图像。这是因为,本质上,每条基线测得的是天空亮度分布的一个傅立叶分量(详见第4章),知道了傅立叶分量,通过傅里叶变换,就能重建出天空图像。1960年代末,计算机的出现使该技术成为可能,射电干涉仪变成了通用化的成像仪器。若非特别说明,现代射电干涉测量指的就是孔径合成。

Michelson interferometer 迈克尔逊干涉仪

完整起见,我们修改上面的函数,使之更接近现实的干涉仪。主要改了两处:

  • 把光源改为无限远
  • 按照迈克尔逊干涉仪修改光路

我们对程序做了如下改动。首先,光源位于无限远,因此我们根据入射波前的到达角度(0表示同轴,即沿垂直轴)来定义光源位置。然后用波长数定义基线长度。抵达干涉仪的两个臂的波前“相位差”完全根据到达角来定义,进入干涉仪外臂的两条“射线”指示了入射角。

在不同的position、intensity和baseline的情况下的效果如下所示:

此时用2个源来测试一下:

参考

Broadband 宽带

天文学中,术语”宽带“是指进行给定观测的频谱的宽度,用于区分连续体和光谱线观测(参见后者的窄带条目)。观测的带宽越宽,灵敏度越高,因此对于任何波长的连续观测或光度测量,都可以使用宽带(宽带)滤波器。

射电天文学中,宽带观测通常是指约100 MHz的频率宽度。

参考:COSMOS (swin.edu.au)

HPC 相关

FLOPS is floating point operations per second. This is used as a measurement because historically floating point operations has been very expensive operations compared to other operations. 每秒浮点运算次数,亦称每秒峰值速度,(英语:Floating-point operations per second;缩写:FLOPS),即每秒所运行的浮点运算次数。浮点(floating-point)指的是带有小数的数值,浮点运算即是小数的四则运算,常用来测量电脑运算速度或被用来估算电脑性能,尤其是在使用到大量浮点运算的科学计算领域中。因为FLOPS后缀的那个S代表,而不是复数,所以不能够省略。在多数情况下,测算FLOPS比测算每秒指令数(IPS)要准确。

浮点运算实际上包括了所有涉及浮点数的运算,在某类应用软件中常常出现,比较整数运算更用时间。现今大部分的处理器中都有浮点运算器。因此每秒浮点运算次数所量测的实际上就是浮点运算器的运行速度。而最常用来测量每秒浮点运算次数的基准程序(benchmark)之一,是Linpack

FLOPS在高性能计算机集群(超算)上可以使用这一公式得出:
${\displaystyle {\text{FLOPS}}={\text{racks}}\times {\frac {\text{nodes}}{\text{rack}}}\times {\frac {\text{sockets}}{\text{node}}}\times {\frac {\text{cores}}{\text{socket}}}\times {\frac {\text{cycles}}{\text{second}}}\times {\frac {\text{FLOPs}}{\text{cycle}}}}$

简化到计算机只拥有一块CPU的情况时,可以使用以下公式:

${\displaystyle {\text{FLOPS}}={\text{cores}}\times {\frac {\text{cycles}}{\text{second}}}\times {\frac {\text{FLOPs}}{\text{cycle}}}}$

Environment Modules

Environment Modules 给用户提供了一个通过modulefiles动态的修改环境变量的方法。

什么是 Environment Modules?

通常,用户在登录时通过为会话期间要引用的每个应用程序设置环境信息来初始化其环境。Environment Modules包是一个简化shell初始化的工具,它允许用户在使用modulefile进行会话期间轻松地修改环境。

每个modulefile包含为应用程序配置shell所需的信息。初始化Modules包后,可以使用modulefiles的module命令在每个模块的基础上修改环境。通常,modulefiles 可以使用module命令更改或设置shell环境变量,如PATH、MANPATH等。modulefile可以由系统上的许多用户共享,用户可以有自己的集合来补充或替换共享的modulefile。

模块可以使用 loadedunloaded 动态操作。支持所有主流的shell,比如 bash, ksh, zsh, sh, csh, tcsh, fish, 还有一些其他的脚本语言,如 perl, ruby, tcl, python, cmakeR.

模块在管理不同版本的应用程序时非常有用。模块也可以绑定到元模块中,元模块将加载一整套不同的应用程序。

快速示例

Here is an example of loading a module on a Linux machine under bash.

1
2
3
$ module load gcc/8.3
$ which gcc
/usr/local/gcc/8.3/linux-x86_64/bin/gcc

Now we’ll switch to a different version of the module

1
2
3
$ module switch gcc gcc/9.2
$ which gcc
/usr/local/gcc/9.2/linux-x86_64/bin/gcc

And now we’ll unload the module altogether

1
2
3
$ module unload gcc
$ which gcc
gcc not found

Now we’ll log into a different machine, using a different shell (tcsh).

1
2
3
% module load gcc/9.2
% which gcc
/usr/local/gcc/9.2/linux-aarch64/bin/gcc

Note that the command line is exactly the same, but the path has automatically configured to the correct architecture.

开始使用 Modules

Download latest version of Modules. Learn how to install it on Unix or how to install it on Windows. You may alternatively automatically retrieve and install Modules with your preferred package manager as Environment Modules is widely available. If you are upgrading from an older version of Modules, read the MIGRATING guide to learn all new features recently introduced.

Reference manual page for the module(1) and ml(1) commands and for modulefile(4) script provide details on all supported options. If you have questions, comments or development suggestions for the Modules community, please read the CONTRIBUTING guide.

搜索路径问题

1
2
3
4
5
6
7
#这个是关于引用博主和我自己的使用情况的一些总结:
#查看MODULEPATH
echo $MODULEPATH

#修改路径
#在默认的/usr/share/module/init/bash中添加最后一行
export MODULEPATH=/YOUR/PATH/:$MODULEPATH

modulefiles文件的书写

  • 文件的开头一定是#%Module1.0开始
  • 有几个命令
    • prepend 要修改的环境变量 路径
    • setenv 修改环境变量的值
    • conflict modulefile 如果这个modulefile已经被加载,则当前的modulefile不能被加载

一个模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#%Module1.0
proc ModulesHelp { } {
global version prefix

puts stderr "\t Loads the environment for my installed home folder HOME/local"
}

module-whatis "Loads the environment for my installed home folder HOME/local"

set HOME /home/svu/a0081742

prepend-path PATH $HOME/local/bin
prepend-path LIBRARY_PATH $HOME/local/lib
prepend-path LD_LIBRARY_PATH $HOME/local/lib
prepend-path LD_INCLUDE_PATH $HOME/local/include
prepend-path MANPATH $HOME/local/share/man

使用方法

  • module avail 显示可以使用的模块
  • module load 加载模块
  • module unload 卸载模块
  • module list 显示已经加载的模块

Ubuntu busybox 无法启动问题

屏幕错误提示

错误显示类似于:

1
2
3
4
5
6
7
8
9
10
11
12
mount: mounting /dev/disk/by-uuid/***************************** on /root
failed: Invalid argument
mount: mounting /sys on /root/sys failed: No such file or directory
mount: mounting /dev on /root/dev failed: No such file or directory
mount: mounting /sys on /root/sys failed: No such file or directory
mount: mounting /proc on /root/proc failed: No such file or directory
Target file system doesn't have /sbin/init
No init found. Try passing init= bootarg

Busybox v1.13.3 (Ubuntu 1:1.13.3-1ubuntu7) built-in shell (ash)
Enter 'help' for a list of built-in commands
(initramfs) _

解决方案

  1. 从Ubuntu10.04 live CD引导系统;
  2. 打开命令行;
  3. 运行sudo fdisk -l回车,目的是查看设备名称。输出类似于:
    1
    2
    3
    4
    5
    6
    7
    8
    Disk /dev/sda: 250.1 GB, 250059350016 bytes
    255 heads, 63 sectors/track, 30401 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Disk identifier: **********
    Device Boot Start End Blocks Id System
    /dev/sda1 * 1 30238 242886703+ 83 Linux
    /dev/sda2 30239 30401 1309297+ 5 Extended
    /dev/sda5 30239 30401 1309266 82 Linux swap / Solaris
    选择Linux所在分区: /dev/sda1。如果/boot单独分区了则选择/boot所在分区。(我个人认为)
  4. 运行sudo fsck /dev/sda1回车;
  5. 重启电脑,正常引导系统。

世上还是有后悔药 - git reset

如果你想 **取消上一次的 git commit**,可以根据具体情况使用不同的方法:


1. 仅撤销 commit(保留修改)

如果你只想 撤销 commit 但保留文件的修改(即回到 git commit 之前的状态):

1
git reset --soft HEAD~
  • --soft 选项会 保留你的修改,只是撤销了 commit 记录,相当于回到了 git add 之后但还没 commit 的状态。

2. 撤销 commit 并取消 git add

如果你还想 **同时取消 git add**,让所有文件恢复为未暂存(unstaged)的状态:

1
git reset HEAD~
  • 这会撤销 commit,并且将已经 git add 的文件放回未暂存状态。

3. 彻底撤销 commit 并删除修改

如果你想 完全撤销 commit 并丢弃所有修改

1
git reset --hard HEAD~
  • 这个操作是不可逆的,会删除所有的未推送的修改,谨慎使用!

4. 如果 commit 已经推送到远程仓库

如果 commit 已经被推送到远程仓库(如 GitHub、GitLab),git reset 只是本地生效,远程不会变化。此时需要强制推送

1
2
git reset --soft HEAD~
git push origin -f

警告: git push -f重写远程仓库的提交记录,可能影响其他开发者,谨慎使用!


5. 使用 git revert(安全方式)

如果 commit 已推送,并且你不希望使用 git push -f 强制覆盖历史,推荐使用 git revert

1
git revert HEAD
  • 这会创建一个新的 commit 来撤销上一次提交,而不会改变历史记录(适用于多人协作的情况)。

总结如下

操作 影响
git reset --soft HEAD~ 仅撤销 commit,保留所有修改(回到 git add 之后的状态)
git reset HEAD~ 撤销 commit,并取消 git add(回到 git status 可见的未暂存状态)
git reset --hard HEAD~ 彻底删除 commit 和修改(谨慎使用!)
git revert HEAD 创建一个新的 commit 来撤销上一次提交(安全方式,适用于已推送的 commit)
git push origin -f 强制推送修改后的提交历史(危险操作,谨慎使用)

如果你不确定哪种方式适合你的情况,可以先运行 git status 看看当前状态,然后选择合适的操作。

使用 git reset HEAD <file>... 来取消暂存。 所以,我们可以这样来取消暂存 CONTRIBUTING.md 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

renamed: README.md -> README

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: CONTRIBUTING.md

这个命令有点儿奇怪,但是起作用了。 CONTRIBUTING.md 文件已经是修改未暂存的状态了。

git reset 确实是个危险的命令,如果加上了 --hard 选项则更是如此。 然而在上述场景中,工作目录中的文件尚未修改,因此相对安全一些。

Python3 内置虚拟环境venv

.. _python-venv-python3:

在虚拟环境中安装(可选)

您还可以选择在虚拟环境(或应用程序虚拟环境)中安装各种软件,以保持环境清洁。

1
$ python3 -m venv packenv

创建后,通过从命令行运行来激活虚拟环境

1
2
3
4
# Windows
$ call packenv\scripts\activate.bat
# Linux
$ source packenv/bin/activate

最后,安装所需的软件包,比如numpy

1
$ pip3 install numpy

同时也可以增加一个提示符,比如NAME

1
$ python3 -m venv --prompt NAME virtual_name 

构建Docker镜像时处理Configuring tzdata交互输入

在Dockerfile中安装deb软件包时,某些软件将tzdata作为依赖项安装。

tzdata会以交互方式提醒用户选择使用位置。

Configuring tzdata
------------------
Please select the geographic area in which you live. Subsequent configuration
questions will narrow this down by presenting a list of cities, representing
the time zones in which they are located.
 1. Africa      4. Australia  7. Atlantic  10. Pacific  13. Etc
 2. America     5. Arctic     8. Europe    11. SystemV
 3. Antarctica  6. Asia       9. Indian    12. US
Geographic area:

可能一直会卡在这个界面(我就遇到了)。

为了解决这个问题,我们需要将tzdata设置为非交互方式。

首选的方法是在Dockerfile的第一条RUN之前加入以下配置:

ENV DEBIAN_FRONTEND=noninteractive
第二个方法是,在DEBIAN_FRONTEND=noninteractive条件下使用命令apt install或apt-get install配置安装tzdata:

RUN DEBIAN_FRONTEND=noninteractive apt install -y tzdata
这将自动选择默认配置安装tzdata。

简介

casacore 是一系列射电天文数据处理的C++库

安装

Debian/Ubuntu

1
2
3
4
5
$ apt-get update
$ sudo apt-get install build-essential cmake gfortran g++ libncurses5-dev libreadline-dev flex bison libblas-dev liblapacke-dev libcfitsio-dev wcslib-dev
$ sudo apt-get install libhdf5-serial-dev libfftw3-dev python-numpy libboost-python-dev libpython3.4-dev libpython2.7-dev
$ apt-get search casacore
$ apt-get install casacore

CentOS

1
2
3
4
$ yum update
$ sudo yum install cmake cmake-gui gcc-gfortran gcc-c++ flex bison blas blas-devel lapack lapack-devel cfitsio cfitsio-devel wcslib wcslib-devel ncurses ncurses-devel readline readline-develpython-devel boost boost-devel fftw fftw-devel hdf5 hdf5-devel numpy boost-python
$ apt-get search casacore
$ apt-get install casacore

MacOSX

1
2
$ brew tap ska-sa/tap
$ brew install casacore

Docker

1
$ docker pull quay.io/casacore/casacore:master

测试数据集

ftp://ftp.astron.nl/outgoing/Measures/

代码参考 https://www.github.com/shaoguangleo/radio_astronomy

简介

python-casacore是casacore的python绑定。

在安装这个之前,需要先行安装casacore。

安装

二进制安装

1
$ pip install python-casacore

Debian/Ubuntu

1
$ sudo apt-get install python-casacore

Kern

此处为使用Ubuntu LTS系统的

1
2
3
4
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:kernsuite/kern-5
$ sudo apt-get update
$ sudo apt-get install python-casacore

MacOSX

On Macs, you may need to create an /etc/sysctl.conf file
Put in it the following lines

重启后可以使用 sysctl kern.sysv来查看状态。

代码参考 https://www.github.com/shaoguangleo/radio_astronomy