0%

0-based和1-based

生物信息文件格式中有很多格式是基于基因组坐标的,比如常见的BED格式或者GTF格式。然而对于对标系的定义,这两者有着截然的区别。BED格式第一个位置的下标是0,区间前开后闭;而GTF格式第一个位置的下标是1,区间都是闭的。不妨我们称前者为0-based,后者为1-based。0-based的优点是长度的计算很简单,直接相减就可以得到序列的长度;而1-based的优点是比较直观。

除了BED格式和GTF格式,下表列举了其他格式的情况。

长度计算

Length(0-based) = End(0-based) - Start(0-based)
Length(1-based) = End(1-based) - Start(1-based) + 1

坐标转换

0-based转1-based
Start(1-based) = Start(0-based) + 1
End(1-based) = End(0-based)

1-based转0-based
Start(0-based) = Start(1-based) - 1
End(0-based) = End(1-based)

BBR 是 Google开发的TCP拥塞控制算法,可以显著提高Linux服务器TCP传输的吞吐量。我最早是从Youtube上那帮做翻墙视频的人那里知道BBR的。翻墙服务器开启BBR后,观看4K Youtube视频毫无压力。受此启发,我把所有的服务器都开启了BBR,SFTP上传下载的速度提升有10倍以上,服务器上的网站访问也比以前流畅了。

查看Linux内核版本

从Linux 4.9内核开始,BBR已经加入到Linux内核之中。如果所使用的Linux系统内核版本大于4.9,就可以直接开启BBR功能。现在常用的的CentOS 8和Ubuntu 18.04的内核版本都大于4.9。如果你的系统内核低于4.9,需要自己安装BBR,但是不推荐新手这么做。我们可以使用如下命令查看Linux内核版本。

1
uname -r

查看BBR状态

1
sysctl net.ipv4.tcp_available_congestion_control


返回值为net.ipv4.tcp_available_congestion_control = reno cub,说明当前系统没有开启BBR。

开启BBR

1
2
3
sudo bin/su -c "echo 'net.core.default_qdisc=fq' >> /etc/sysctl.conf"
sudo bin/su -c "echo 'net.ipv4.tcp_congestion_control=bbr' >> /etc/sysctl.conf"
sudo sysctl -p


再次,查看BBR状态

1
sysctl net.ipv4.tcp_available_congestion_control


此时,返回值为net.ipv4.tcp_available_congestion_control = reno cub bbr,说明BBR已经成功开启。

使用一键脚本

对BBR最为喜欢的是做翻墙的一群人,他们开发的一键脚本不仅支持官方的BBR算法,还有魔改BBR、BBR plus、锐速BBR。非官方BBR算法更加激进,比起官方BBR,在翻墙速度方面有所提升,但提升的幅度并没有是否开启BBR的差距大。考虑到稳定性,推荐只使用官方BBR。

1
2
3
wget -c https://static.biochen.com/software/tcp.sh
sudo chmod 755 tcp.sh
./tcp.sh

Python语言简洁,学习起来非常快,使用Python的科研工作者越来越多。Python拥有丰富的扩展包,这使得它可以轻松处理各种问题。

Python用于科学计算的包括但不限于如下:

  • Numpy:提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库等。
  • Scipy:提供许多科学计算函数库,包括统计,优化,整合,线性代数模块,傅里叶变换,信号和图像处理,常微分方程求解器等。
  • Pandas:基于Numpy,提供了大量库和一些标准的数据模型,比如二维数组。
  • Matplotlib:绘图包,旨在替代MATLAB。

Anaconda是一个集合,包括conda,Python解释器,一些第三方库。conda用于包管理和环境管理。包管理与pip类似,管理Python第三方库。conda将一切都看成包,包括conda本身和Python解释器。环境管理类似于virtualenv,能够允许用户使用不同版本的Python和不同的第三方库环境,并灵活切换。

用Anaconda来管理环境和第三方库将是非常方便的,而且自己安装这些库对新手来说是一个不小的挑战。

Anaconda包括了科学、数学、工程、数据分析中最受欢迎的300多个Python包,支持Python2/3, Windows/Linux/Mac,而且还是非常有好的安装包(.exe/.sh/.pkg)。一键安装科学计算中常用的包,爽!

安装Anaconda

在Linux上安装Anaconda非常简单。Anaconda带了很多包,体积非常大,为了节省空间也可以先装Miniconda,再装自己需要的包。

1
sh Anaconda3-5.1.0-Linux-x86_64.sh

安装过程中会提示安装的路径PREFIX=/home/chenwen/anaconda3,默认在用户的home目录,可以安装到其他地方。还会提示是否将此路径添加到用户的环境变量(/home/chenwen/.bashrc)。

安装Anaconda之后,输入如下命令验证Anaconda是否安装成功,并查看它的版本。

1
conda --version

修改源镜像

Anaconda安装成功之后,我们首先将软件源修改为国内镜像,运行如下命令。

1
2
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

查看已经添加的镜像

1
conda config --get channels

管理虚拟环境

有些包依赖特定版本的Python,或者依赖其他特定版本的包,与我们已有的Python环境不同。如果我们因此重装Python,或者重装一些软件包,就把已有的Python环境搞乱了,这时候虚拟环境就派上用场了。如果只是简单的学习Python,直接用基础环境就可以了,没有必要创建虚拟环境。

我们可以通过create命令来创建虚拟环境。

1
conda create --name tensorflow python=3.5

这样我就创建了一个名叫tensorflow的虚拟环境,当然你可以用任何你喜欢的名字代替。我还指定了Python版本是3.5。环境创建完毕后,我们可以使用info命令查看所有环境。

1
conda info --envs

我看到这条命令的输出有tensorflow /home/chenwen/anaconda3/envs/tensorflow,告诉我们tensorflow这个虚拟环境的路径。虚拟环境的实质就是创建了一个文件夹,把相关的包放在这里,并且把一些环境变量指向这里。如果需要切换到该虚拟环境,可以使用activate命令。

1
conda activate tensorflow

如果想取消激活,使用deactivate命令即可。

1
conda deactivate

如果想删除虚拟环境,使用remove命令。

1
conda remove --name tensorflow --all

当我们切换到某个虚拟环境后,就可以进行这个环境的包管理了。

管理包

查看安装的包,可以使用list命令。

1
conda list

如果你发现某个包默认没有装,比如scikit-learn,可以使用conda install 命令安装。

1
conda install scikit-learn

更新包,可以使用conda update命令

1
conda update scikit-learn

后记

Anaconda的功能非常强大,熟悉R的朋友可能知道Bioconductor,与此对应的有Bioconda。Bioconda不仅是装Python包,还能装很多其他生信软件。

此外,我还非常喜欢Anaconda带的IDE工具spyder,比起Python官方自带的IDLE强很多,但是又不复杂。

DNA是双链分子,按照A与T、C与G的原则互补配对。知道其中一条链,就可以反推出另外一条链。因此,在数据库中,染色体DNA参考序列都是单链。那么,染色体DNA参考序列是哪一条链呢?这是一个有趣而又不重要的问题。

Google了一下,国外还真有人讨论这个问题。地址如下
https://biology.stackexchange.com/questions/36595/what-is-the-strand-specificity-of-a-reference-genome
英文不难懂,建议大家去看原版,这里简单翻译一下。

对于具体的物种,最好去看数据库的说明。大概有如下原则:

  1. 细菌基因组和质粒
    原核生物大多为环状DNA,一个复制原点,两侧同时开始复制。数据库中的参考序列从复制原点左边的链5端开始的方向。

  2. 真核染色体
    对于知道染色体核型的情况,数据库中的染色体参考序列从短臂的5端开始。

  3. 单链RNA病毒
    单链RNA病毒的参考序列是正链”+”。

有一次我在知乎上回答了一个论文作者纠纷的问题,最近收到了好几个类似问题的邀请。归纳起来就是,第一作者被导师抢走了,第一作者被师兄抢走了,第一作者被其他人抢走了。问题下面的回答很多都批评导师无良和学界黑暗,而很少就问题本身做出阐释。可能不同学科的情况有所不同,至少在生命科学这个领域,论文作者排名的问题,有必要跟大家说一说。

依赖个人好奇心驱动和科学家个人能力进行探索的科研时代已经过去很久了。现代科研体系中的团队内合作,乃至跨团队合作是常态,这意味着论文的作者不再是单个人。单个作者的论文不是说没有,而是非常罕见。有一次我们去参加一个生物信息学国际会议,我的下一场报告刚好就一个作者。大家私下里聊天,不是赞叹这个老师个人能力有多强,而是很同情他,没有合作者,没有团队,没有学生,一个人孤单地搞研究。相信我,一个人发论文,真的是一件凄惨的事情。

既然多个作者是常态,如何评价贡献大小呢?很朴素的做法就是按照贡献大小,从前往后排,我们隔壁的计算机科学领域就是这样子的。但是,在我们生命科学领域(我是做生物信息的,自认为是生命科学领域的,而不是隔壁那家)最重要的作者通常排在最后。

论文最重要的作者是通讯作者,名字后面有个星号*,脚注中还留了E-mail。通讯作者对这篇论文负责,知识产权也主要属于他。如果这篇论文得奖,首先获奖的是通讯作者;如果有同行对这篇论文感兴趣,也是联系通讯作者。如果觉得自己干活最多,贡献也应该是最大,理应是通讯作者了吧。知乎上类似问题的题主大多也是觉得自己干活多,应该是论文最主要的贡献者。评价作者对论文的贡献不能简单地看绝对工作量,后面还会有论述。

通讯作者在论文中承担什么样的工作呢?一个好的通讯作者,要提出研究思路,大家的研究课题是谁给的呢?不是充话费送的吧。通讯作者,还要提供科研条件和科研经费,并监督整个课题的进展。说了这么多,大家应该明白,通讯作者应该是自己的导师了吧。

那努力做实验的你,应该搁哪呢?你最好的位置是第一作者。注意,我没有说,你做了实验,甚至做了大部分实验,就应该是第一作者。一个好的第一作者,要独立或者领导师弟师妹完成大部分实验,和导师共同分析实验结果并讨论研究思路,撰写论文初稿。要做这点并非容易,现在有些导师招博士要求所谓的独立科研能力,大概也是指做一个好的第一作者的能力。

如果你的导师除了要做通讯作者的工作,还要分担第一作者的工作,请心疼一下他。正因为有撸起袖子自己干的导师,所以有人觉得导师应该手把手指导自己做实验,不然就是”乱搞”。不仅觉得自己的导师”乱搞”,还觉得国内学界大佬大多是不务正业。前面讲了,导师作为通讯作者,更大的责任是供科研条件和科研经费。一个课题组每年几十万乃至上百万的开销,是压在他心头的一块大石头。我老师经常跟我讲,要是还拿不到经费,课题组还能支撑一年半(每次都不同哈)。没有导师手把手指导,作为一个研究生,怎么学习具体的实验技术呢?主要靠自学(相信我,研究生能学到的最好的东西是解决问题的能力)。如果遇到一个肯教你的师兄师姐,你应该感谢他,他没有教你义务。

如果什么事情都很容易分清,这世界也就不会有纠纷。有些同学有大小两导师,大导师是领导/大教授,是名义上的导师;小导师是讲师或者副教授。小导师会手把手教你,还会帮你把实验结果分析和研究思路都做好,可能连论文也是他写的。他既干了部分第一作者活,又干了部分通讯作者的活,但更应该做通讯作者的是大导师。小导师可能会要第一作者的位置,毕竟这种情况下,他比你更适合做第一作者。

一般情况下,大导师不会要第一作者的位置。他有了大家最认可的通讯作者位置,如果还要第一作者的位置,等于抢了下属的功劳,不利于激励团队。另外,如果他这样做,会被同行耻笑,就像大家嘲笑蒋校长自授特级上将一样。考虑到硕士研究生不需要第一作者的论文就能毕业,而博士研究生毕业必须要第一作者的论文,第一作者的位置优先考虑博士研究生,然后是小导师,再次是硕士研究生。很多时候做研究时候,都是有商量的,将来作者如何分配。所以,请不要看到室友做的事情还不如自己,然后靠一篇第一作者论文拿到2万块国家奖学金而愤愤不平。请思考自己是否做到了好的第一作者该做的所有事情,其次是团队中是否有人比自己更需要第一作者。

为了缓解作者排名纠纷,鼓励合作,天才发明共同第一作者/共同通讯作者。论文脚注”These authors contributed equally to this work”。较真的话,哪会有人贡献是一样的呢?给合作者共同第一作者是承认他对论文做出了重要贡献。作为一个研究生,甚至是本科生,有一篇共同第一作者的论文也是不错的。

我们之前讲了,评价作者对论文的贡献不能简单地看绝对工作量。那么一篇论文的发表究竟什么最重要呢?突破性和创新的构思?扎实而可靠的实验?这些都非常重要。还有一个非常重要的东西,经常被刚入行的人忽视,那就是作者在这个领域的credit或者叫reputation。等我发表了自己的第一作者的论文,也审了别人的论文,才明白credit的重要性。作为杂志的编辑和审稿人,不想重复也没有精力和必要去重复你的研究,凭什么相信你的研究是真实可靠的呢?凭的是这篇论文的作者在这个领域做的持续贡献。导师就是作者中提供最重要的credit那个人,他在这个领域多年的笔耕不辍,他拿他的职业生涯为论文的真实性提供背书。

跟着到导师发表了论文,以后你在这个领域发表论文也就有了credit,这叫”借”。如果自己进入一个全新领域,一步一个脚印,从小论文(对credit的要求没有那么高)发起,这叫”攒”。还有人”偷”,这就不可取了。前几天看公众号,某教授被人白送一篇6分多的论文,做为通讯作者,他的E-mail地址是伪造的。

现在很多杂志鼓励在论文的”Authors’ contributions”部分写明各个作者的具体贡献。本文不是要做做个公道伯,去解决论文作者纠纷。而是,希望大家思考论文作者背后的贡献、义务与权利。

一篇第一作者的论文,或许意味着丰厚的奖金,顺利毕业,一份工作,或者事业更上一层楼。但请考虑作为人生重要的一个阶段,你和导师、师兄师姐共同度过3年乃至更久的共同奋斗时光。当你离开了这个实验室,某天在街上偶遇,能开开心心一起坐下来喝个茶、吃个饭,该是一件多么美妙的事情啊。