《Bioinformatics Data Skills》据说是入门生信的必备书之一。最近抽了点时间看,发现里面的确有很多有意思的骚操作和建议。我这里简略地列出一些有意思的地方以及其对应的章节目录,大家感兴趣地可以去对应章节看。当然,时间充裕的话,建议大家读整本书。
Charpter 1
-
Write Code for Humans, Write Data for Computers 即代码要尽可能地写的友好一点,要考虑到以后的你和其他人还看不看得懂。但对应的,你所输出的格式必须要让计算机能够读取,即要符合一定的规范。
关于代码的规范,作者给出了google的public style guides for many languages 这一编程范式。
-
Make Assertions and Be Loud, in Code and in Your Methods 即我们在写程序的时候,要将报错也考虑在内。这样万一出错的时候,就可以返回报错信息。关于返回报错信息,我们可以尝试用 Assertions。
几乎每个语言都会有自己的assert function。Python里面是assert(),而R里面是 stopifnot()
Use Existing Libraries Whenever Possible 即尽量地用现成的库去完成你的任务,因为现成的库已经发表了好久,也有很多人去使用并帮助debug。如果是自己写的话,可能会没有考虑到一些问题。就比如一个简单的核酸转蛋白的程序,我们可能只会考虑ATCG的核酸序列。但实际上,序列中还会存在NYW等。NYW这些字符都是在International Union of Pure and Applied Chemistry(IUPAC)里面的,是一些standard ambiguous nucleotides。
Treat Data as Read-Only 即最好你产生的数据都是只读的,你的后续分析都不是去修改数据,而是产生新的文件。这样对以后重新检查、重复分析流程等都会有帮助。
Recommendations for Reproducible Research 对于一个可重复的分析来说,document 是至关重要的,即尝试写README。我们应该学会在document加上软件、数据等相关信息。比如说软件的版本,数据是从哪里下的,数据的下载日期。如果可以的话,最好能在分析流程里面将结果图也放上去,便于你或者其他人后续的重复。R’s knitr和iPython 都可以帮助我们做到这一点。
Chapter 2
-
Project Directories and Directory Structures 在写一个脚本的时候,尽量用相对路径。这样,你的脚本不管放哪里,都可以运行了。
关于相对路径和绝对路径这一点,我觉得是仁者见仁,智者见智的。
-
shell expansion 中有一种brace expansion可以快速地创建结构化的文件
$ echo dog-{gone,bowl,bark} dog-gone dog-bowl dog-bark $ mkdir -p zmays-snps/{data/seqs,scripts,analysis} $ touch seqs/zmays{A,B,C}_R{1,2}.fastq $ ls seqs/ zmaysA_R1.fastq zmaysB_R1.fastq zmaysC_R1.fastq zmaysA_R2.fastq zmaysB_R2.fastq zmaysC_R2.fastq $ touch zmays{A..C}_R{1,2}.fastq $ ls *.fastq zmaysA_R1.fastq zmaysB_R1.fastq zmaysC_R1.fastq zmaysA_R2.fastq zmaysB_R2.fastq zmaysC_R2.fastq
-
Wildcards(通配符)也是一种shell expansion,通配符最常见的语法是
* 代表任意数量的字符(但会忽略 .bashrc 这种点号开头的隐藏文件)
? 代表单个字符
-
[A-Z] 可以匹配方括号里面的任意一个字符(比如[aeiou]),也可以匹配A-Z这26个大写字母([start-end]这种连续范围),也可以匹配0-9这种数字。但需要注意的是,匹配的是含有字母或数字的字符串。
按作者所说,snps_10.txt, snps_11.txt, snps_12.txt 这种是不能用snps_[10-13].txt 来匹配的,如果想要匹配的话,就要用brace expansion来做。即snps_{10..13}.txt 。不过R1,R2,R3这种还是可以正常匹配的。
$ touch snps_{10..13}.txt $ ls *.txt snps_10.txt snps_11.txt snps_12.txt snps_13.txt $ ls snps_[10-13].txt ls: cannot access 'snps_[10-13].txt': No such file or directory $ ls snps_{10..13}.txt snps_10.txt snps_11.txt snps_12.txt snps_13.txt
关于通配符,发现一篇阮一峰的命令行通配符教程
-
OS 和 linux 系统对于命令的参数数目(更准确来说是命令的长度)实际上是有限制的。这种“Argument list too long” 通常会出现在你用通配符匹配了太多的文件。
这种解决方法在书的后面也提到了。
-
我们可以用0021而非21来命名,这样在后续排序的时候会有好处。
$ ls -l -rw-r--r-- 1 vinceb staff 0 Feb 21 21:24 genes-1.txt -rw-r--r-- 1 vinceb staff 0 Feb 21 21:24 genes-11.txt -rw-r--r-- 1 vinceb staff 0 Feb 21 21:24 genes-12.txt -rw-r--r-- 1 vinceb staff 0 Feb 21 21:24 genes-13.txt -rw-r--r-- 1 vinceb staff 0 Feb 21 21:24 genes-14.txt $ ls -l -rw-r--r-- 1 vinceb staff 0 Feb 21 21:23 genes-001.txt -rw-r--r-- 1 vinceb staff 0 Feb 21 21:23 genes-002.txt [...] -rw-r--r-- 1 vinceb staff 0 Feb 21 21:23 genes-013.txt -rw-r--r-- 1 vinceb staff 0 Feb 21 21:23 genes-014.txt
所以你能看见像一些大的Project比如Ensemble,就是采取这种命名方式:ENSG00000164256