2017年3月19日星期日

远东山雀与环形种


远东山雀(Parus minor)是雀形目山雀科山雀属的鸟类。远东山雀和我们已经或即将介绍的沼泽山雀、黄腹山雀同属山雀属(亦有分类系统依据分子证据和单系群原则将沼泽山雀归入Poecile高山山雀属,将黄腹山雀归入Periparus煤山雀属[1]),而与大家喜闻乐见的长尾山雀科的银喉长尾山雀分属不同的科。分子证据证实,山雀科和长尾山雀科的亲缘关系倒是很近[2]。

图1:几种山雀和相关鸟类的系统发育。改编自参考文献[2]。学名和该参考文献保持一致。

远东山雀个头比树麻雀还要小,但是和沼泽山雀、黄腹山雀等比起来又略大。远东山雀特征性的配色是黑-白-绿。第一个令人印象深刻的特征是它脸颊的大白斑,这是远东山雀和大山雀(P. major)共有的特点。这块白斑之外,远东山雀的头是黑色的。有时可以看到远东山雀的绿色后背,但也有的个体后背颜色不甚明显。它的飞羽颜色斑驳。远东山雀最重要的鉴别特点是它的“拉链”——《北京鸟类志》描述:“上胸及腹部白色,中央贯以宽阔的黑色纵斑带。”[3]这个特征非常明显其稳定,一眼就可以将它同沼泽山雀区分开。经验丰富的观鸟者可以通过这条拉链粗略推测远东山雀的性别,因为雌鸟的拉链一般略窄。除了拉链,腹部基本是白色的。

2015年11月1日,我第一次在eBird数据库上报道了我在燕园内的鸟类观测记录。但不久之后,我却被eBird的志愿者告知记录有问题。原来,在eBird使用的Clements分类系统中,我们常见的乌鸫普通亚种Turdus merula mandarinus被提升为种T. mandarinus,而大山雀的东北亚种Parus major minor被提升成了P. minor种,其中文名就是远东山雀,英文名是Japanese tit。

这是我第一次知道,我们常见的“大山雀”其实并不是大山雀。就这样在北京随处可见的普通鸟类,它的身份居然一直存在争议。它是一个种还是一个亚种?它应该归入什么类别?本文遵循主流分类系统的认识,承认P. minor种的地位,下面将简单介绍这个认识在我国是如何演进的。

我国传统的鸟类分类学主流观点将这种鸟认作是大山雀P. major的亚种。我国鸟类学的前辈大师郑作新先生在不同历史时期编写过几套反映中国鸟类分类认识的巨著。在1958年的《中国鸟类系统检索》[4]及其1964第二版[5]中,P. major包含七个亚种,现在这些亚种很多被归入了现代分类系统中的P. minor之下。我们今天讨论的山雀被作者归为P. major artatus。在2002年的第三版中,P. major只有北方亚种有所微调,所调整的亚种对应于现代分类系统中的P. major[6]。

然而在其它一些鸟类文献中,我们经常看到旧体系中对于该鸟的另一个称呼,P. major minor,也就是认为这种鸟是在大山雀(P. major)这个种下面的minor亚种。在郑先生1987年的著作《中国鸟类区系纲要(英文版)》中,有一条脚注引起了我的注意[7]。这条脚注引用了一篇1950年的法文文献,声称P. major artatus“可能是”('may be')P. major minor的异名[8]。赵正阶先生的《中国鸟类志》对这一异名问题有很详细的讨论[9]。原来P. major artatus是由美国人根据湖北宜昌采集到的标本定名的。在发表该亚种的文章中,原作者将其与P. major minor进行了详细的形态对比,说明二者是不同的亚种[10]。而那篇法文的文章则声称P. major artatus只是P. major minor的同物异名[8]。而郑作新后来的著作中似乎误读了原文,他把P. major artatus当作了正式名,而P. major minor却成为了异名[11,12],而且他仍坚持使用前者作为亚种的名称。受他的影响,国内多将这个亚种的名字称为P. major artatus,而国际同行则多称为P. major minor

所以在熟识这种鸟多年以后,我仍按照观鸟前辈们的习惯,称它为“大山雀”也不足为怪了。虽然中文互联网上的资料仍然在几个亚种之间纠结,国内的业余观鸟者倒是越来越接受“远东山雀”这个新名字了。现在,国际和国内的鸟类学者、观鸟爱好者的共识是,“远东山雀”不应该被视作P. major的一个亚种,而应该被作为独立的种。这种认识上的变化是怎么来的?正如很多分类学上的变动一样,最简单的答案是:新的分子(遗传学)证据表明……

自达尔文以来,演化生物学家就一直面临着一个困难,那就是如何定义种。搞不清这个问题,种的起源和演化就缺乏一个清晰的逻辑框架。一类广为流行的种的界定标准基于“生殖隔离”,把基因交换和有性繁殖作为界定种的关键标准。这种定义取得了很大的成功,但也有一定问题,比如对无性生殖的物种就不太适用。因此还有人以基因差异和演化为核心构建种的概念。[13]

环形种的问题,也是生殖隔离类物种定义遇到的一个困难。下面是一个完全虚构的例子:2015年我们在北大本部发现并命名了一种仅存在于燕园的动物Phallus parvusia Peiyangii,简称DXP。虽然这个DXP种群丰富了燕园的智商多样性,但是为了保护其它本土种,我们将一部分DXP逐出了燕园,只剩个别残余。这群背井离乡的DXP只好四处迁徙扩散,主要向两个方向:一部分向五道口东扩,另一部分往颐和园北扩。DXP移动能力很差,繁殖一代它们的分布范围只能扩散几米。在已经有DXP分布的地方,邻近的DXP种群自然是可以相互交配繁殖的。很多代之后,东扩的DXP分布范围遍及东升乡,而北扩DXP的分布范围也跨越了中关村北大街。终于,两路本是同根生的DXP在清华园里会面了。这时候它们发现,东路和北路两支DXP虽然都分布在同一个清华园中,但他们之间却不能繁殖出可育的后代!

图2:Phallus parvusia分布与扩散(假想图)

至此,我们是否可以说这两种DXP已经不是一个种了?似乎是可以的,因为它们毕竟已经产生了生殖隔离。似乎又是不行的,因为这两种DXP之间虽不能杂交,但仍可以通过上图中绿箭头的方向发生间接的遗传物质交流。

这种情况在自然界中并不鲜见,这就是所谓的环形种。基因交流的通道在地理空间上几乎构成了一个环——只是在接触区出现了缺口。早在1905年,Stanford大学的David Starr Jordan就在Science上发文提出了环形种在地里隔离与新种产生方面的重要意义[14]。从此,环形种的研究成为了演化生物学和分类学中的一个热点议题。

远东山雀的分类学困难,看似是形态学上的混乱,但其本源实际上就是这种基因多样性谜题。在我根据eBird数据库中记录所绘制的山雀属部分种的分布图上看,P. majorP. minor加上P. cinereus这几种鸟,围绕着青藏高原构成了一个环。注意这张图上一些种间分界线受到记录整理方面的人为因素影响,同时由于eBird是一个在我国不甚流行的观鸟记录数据库,在没有人提交观鸟记录的地点是没有信息的。

图3. eBird数据库中Parus属三种鸟的记录分布

环形种的概念是否适用,几代专家提出了很多针锋相对的意见。早在1928年,即有人在阿穆尔河下游的major/minor接触区同时观察到现在称大山雀和远东山雀的两种鸟。但关于这两种鸟是否能“通婚”,不同人有不同的看法。如果能够“通婚”,那就说明存在基因交流,环形种不成立,这两类鸟属于同种不同亚种。如果不能“通婚”,说明这两种生殖隔离的鸟已经可以算是分属不同的种了[15]。2004年,德国美因茨大学一位博士在其学位论文课题中对这个问题进行深入的考察,结合了蛋白序列比较、形态学研究和声音分析,最终确认了环形种的成立——尽管存在着小范围、不常见的“通婚”情形,总的来说P. majorP. minor两类鸟并不能发生有效的基因传递。[16,17]本文被分类学家广泛接受,也成了确立P. minor独立种地位的主要依据。不过后来仍有人通过mtDNA测序的有力证据对这一结论提出质疑。

山雀属是一类擅长鸣叫的鸟类,其鸣声与求偶密切相关。鸣叫除了展示性成熟、交配能力等,也是吸引雌性的手段。鸣叫如同暗号,对不上的话就没有交配权,从而产生生殖隔离。所以,研究鸣叫可能比研究蛋白和核酸的序列更直接的反映出物种差异。日本综合研究大学院大学的铃木俊贵曾在远东山雀的鸣叫方面做出了一些工作。将鸣叫的录音进行频率分析,就可以将声音转化成谱图,得到特征性的“声音指纹”。

图4:大山雀的不同叫声组合。根据CC-BY-4.0协议摘自参考文献[18],未经修改。

通过这些研究,铃木得到了很多有趣的结果。他首先证实了鸟类的语言不仅有“词汇”,还有“语法”:将各种鸣声组合(“词汇”)按不同顺序(“语序”)播放,会引起远东山雀不同的反应[19]。他还发现在远东山雀孵卵过程中,亲鸟对于不同的警示性鸣声也会做出不同的反应,这说明鸣声和危险等级是有关系的[20]。这些远东山雀的研究揭示出,鸟类的“语言”可能比我们原先想象的要复杂。

下面是一段儿远东山雀的叫声,你能知道它在说些什么吗?


图5: Parus minor commixtus叫声频谱图,来自http://www.xeno-canto.org/61847。根据CC BY-NC-ND 2.5协议。

请放心加载播放器脚本。


远东山雀被称为北京最常见的山雀[21]。在2014年发表的《北京大学燕园鸟类组成》一文中,大山雀在北大燕园内的遇见率要低于作为优势种的黄腹山雀和沼泽山雀,属于常见种[22]。该文章依从《中国鸟类分类与分布名录(2011)》的分类系统,将远东山雀归为大山雀的亚种。

最新版IUCN红名单遵照BirdLife的分类系统同样将远东山雀合并到大山雀中,并将该种评价为最低受威胁级别,无危。远东山雀在北京一些地区的方言中又被称为“吱吱黑”,这个名字来源于它鸣叫的声音。在校园中凡有远东山雀鸣叫之处,皆能找到其踪迹。

我有一次在校园北部,中国社会工作研究中心门口的台地上看到很多鸟,其中包括了好几种山雀。这个时候还偶遇了商务印书馆一位观鸟的大叔,他曾在北大生活多年,和我聊了一会儿北大的山雀。此处说的大叔并不是灭雕灵大叔。

另一个我经常路过并且能看到远东山雀的地方是燕南食堂和哲学楼之间的长着紫藤的“破支架子”附近(典出Ingress)。那里经常可见远东山雀和沼泽山雀,由于遮挡较小,往往不需要望远镜就能清楚的看到有什么鸟。燕南园里面也时有远东山雀出没。

致谢:感谢黄瀚晨同学在鸟类学文献方面的重要讨论。

[1] Johansson U S, Ekman J, Bowie R C K, et al. A complete multilocus species phylogeny of the tits and chickadees (Aves: Paridae)[J]. Molecular phylogenetics and evolution, 2013, 69(3): 852-860.

[2] Tian H, Zhang Z, Yan H, et al. Molecular phylogenetic analysis among species of Paridae, Remizidae and Aegithalos based on mtDNA sequences of COI and cyt b[J]. 2010.

[3] 其侃. 北京鸟类志[M]. 北京出版社, 1988.

[4] 郑作新. 中国鸟类系统检索[M]. 科学出版社, 1957.

[5] 郑作新. 中国鸟类系统检索(第二版)[M]. 科学出版社, 1964.

[6] 郑作新. 中国鸟类系统检索(第三版)[M]. 科学出版社, 2002.

[7] Tso-Hsin C. A synopsis of the avifauna of China[M]. Science Press, 1987.

[8] Delacour J, Vaurie C. Les mésanges charbonnières (révision de l’espèce Parus major)[J]. Oiseau Rev. Fr. Ornithol, 1950, 20: 90-121.

[9] 赵正阶. 中国鸟类志[M]. 吉林科学技术出版社, 2001.

[10] Thayer J E, Bangs O. Descriptions of new birds from Central China[M]. Museum, 1909.

[11] 郑作新. 中国鸟类种和亚种分类名录大全: A complete checklist of species and subspecies of the Chinese birds[M]. 科学出版社, 2000.

[12] 郑作新. 中国鸟类分布名录[M]. 科学出版社, 1976.

[13] 洪德元. 生物多样性事业需要科学, 可操作的物种概念[J]. 生物多样性, 2016, 24(9): 979-999.

[14] Jordan, David Starr. "The origin of species through isolation." Science (1905): 545-562.

[15] Kapitonova, Smirenskii, Selivanova, et al. The history of ranges of the great tit (Parus major) and Japanese tit (Parus minor) in the Amur Region[J]. Biology Bulletin, springer, 2011, 38(9): 912–926.

[16] Paeckert M, Martens J, Eck S, et al. The great tit (Parus major)–a misclassified ring species[J]. Biological Journal of the Linnean Society, 2005, 86(2): 153-174.

[17] Päckert M. Differenzierung von Reviergesängen und mitochondrialem Cytochrom-b in drei ausgewählten Singvogelgattungen (Aves, Passeriformes: Genus Regulus, Genus Seicercus und Parus major)[D]. Mainz Univ, 2003.

[18] Kvist L, Martens J, Higuchi H, et al. Evolution and genetic structure of the great tit (Parus major) complex[J]. Proceedings of the Royal Society of London B: Biological Sciences, 2003, 270(1523): 1447-1454.

[19] Suzuki T N, Wheatcroft D, Griesser M. Experimental evidence for compositional syntax in bird calls[J]. Nature communications, 2016, 7.

[20] Suzuki T N. Assessment of predation risk through referential communication in incubating birds[J]. Scientific reports, 2015, 5: 10239.

[21] Townshend, T. 北京常见鸟类指南[OL], (2015-07) [2017-01-28]. https://birdingbeijing.files.wordpress.com/2015/08/e58c97e4baace5b8b8e8a781e9b89fe7b1bbe68c87e58d971.pdf.

[22] 闻丞, 韩冬, 李晟, 等. 北京大学燕园鸟类组成[J]. 北京大学学报 (自然科学版), 2014, 50(3): 416-428.

2017年3月17日星期五

Malvern ZetaSizer Visualizer, a tool to plot the exported data from Malvern DLS

Many labs own Malvern ZetaSizer products, but the data export is always a problem. Nobody loves the low-resolution original output images and the built-in tool to automatically export the data is generates terrible results.The general method of exportation can be found in the user manual, and it is described in Chapter 11. You can follow this link to obtain a full text.

However, for size measurement, you can actually export a "size/volume/intensity distribution table" every time you conduct a measurement.  Albeit the terrible format it produces, this is the most favorable practice in the labs that I have worked in. To view it, you first need to turn on the panel/tab in Tool>>Setting>>Configure Workspace>>Size, and in the tab Report Pages, check Number Stats Table (M). Then after each measurement, just drag/copy the table to a .txt file and save it to your flash disk. Remember, one measurement in each file.

The file looks like this:
It seems to be a poorly formatted, tab separated file which is extremely unfriendly to the graph editing software.

I used to manually cut and paste and use Excel as well as some more specific data analysis software to visualize the data. Recently I am generating a large number of results, so I decided to write a script to process them.

Here is the Python-Gnuplot script. To run it on Windows, you need to first install python (for some reason, I am still using Python 2.7, but I believe it is also compatible with Python 3), Gnuplot and add their directory in %PATH%. Just check "add to %PATH%" options  when you install these softwares.

Then, put all the .txt files in the same directory, download this script file to the same directory and run it. A png figure will be generated for each .txt file in this directory, and it looks just like this one:
In the meantime, another .csv file is generated. You can import this file into other software for a further analysis.

Here is the code of the script:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import subprocess

def transcribe(fname):
 cumul = 0.0
 with open(fname,'r') as source,\
   open(fname[:-4]+'_trans.csv','w') as result:
  content = source.readlines()
  del content[0:2]
  for i in range(0,3):
   for j in content:
    if len(j.split('\t')[4*i])>0:
     x = j.split('\t')[4*i]
     y = j.split('\t')[4*i+1]
     cumul += float(y)
     result.write(x+','+y+','+str(cumul)+'\n')

def plot(fname):
 figtitle = fname[:-10]
 with open(fname,'r') as source:
  dataraw = source.readlines()
 for i in range(0, len(dataraw)-1):
  x = float(dataraw[i].strip().split(',')[0])
  y = float(dataraw[i].strip().split(',')[1])
 with open('gpl_temp.plt','w') as gTemp:
  gTemp.write("set term png\n")
  gTemp.write("set output \"%s.png\"\n" %fname[:-10])
  gTemp.write("set datafile separator \",\"\n")
  gTemp.write("set title \"%s\"\n"%figtitle)
  gTemp.write("set xlabel \"D (nm)\"\n")
  gTemp.write("set ylabel \"N%\"\n")
  gTemp.write("set yrange [0:110]\n")
  gTemp.write("set grid\n")
  gTemp.write("set logscale x\n")
  gTemp.write("set style fill solid 0.4 border\n")
  gTemp.write("plot \"%s\" using 1:2 \"%%lf,%%lf\" title \"\" with boxes,"%(fname)+\
              "\"\" using 1:3  title \"\" with line\n")
  gTemp.write("set output\n")
 p=subprocess.call("gnuplot gpl_temp.plt")


txtdir = os.listdir(os.getcwd())
for i in txtdir:
 if i[-4:] == '.txt':
  transcribe(i)
  plot(i[:-4]+'_trans.csv')