GPU blast 的安装与使用

1. 安装 Nvidia 显卡驱动

安装 Nvidia 显卡驱动,得要禁用 CentOS 默认的 nouveau 驱动,然后安装 Nvidia 驱动

下载显卡驱动
# wget  http://cn.download.nvidia.com/XFree86/Linux-x86_64/340.65/NVIDIA-Linux-x86_64-340.65.run

禁用 Nvidia 显卡驱动
# echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf

备份并重建系统引导的 image 文件
# mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
# dracut -v /boot/initramfs-$(uname -r).img $(uname -r)

重启后在 init3 模式下安装显卡驱动
# init 3
# sh NVIDIA-Linux-x86_64-340.65.run

2. 检测显卡性能参数

推荐使用 CUDA-Z 来检测显卡性能参数。正常使用 CUDA-Z 需要依赖一些库文件和 GCC 。

$ wget http://downloads.sourceforge.net/project/cuda-z/cuda-z/0.9/CUDA-Z-0.9.231.run
$ mv CUDA-Z-0.9.231.run ~/bin/CUDA-Z

运行 CUDA-Z 前安装如下一些系统软件
$ sudo yum install libXrender*
$ sudo yum install libXrender*i686*
$ sudo yum install libXext*
$ sudo yum install libXext*i686*
$ sudo yum install libz*
$ sudo yum install libz*i686*
将 GCC 的库文件路径设置正确
$ export C_INCLUDE_PATH=/opt/gcc-4.7.2/include
$ export LD_LIBRARY_PATH=/opt/gcc-4.7.2/lib64:/opt/gcc-4.7.2/lib

运行 CUDA-Z 图形化界面,界面和 windows 下的 CPU-Z 一致。
$ CUDA-Z

显卡一些高级常识,例如:
我的笔记本电脑 GTX570M 显卡: 该 GPU 有 7个 SM,每个 SM 有 48 个 SP,每个 SP 有 32 个 warp; SP 称为流处理器,该值越大,则显卡性能越好; warp 是最小的硬件执行单位,则该显卡最大的线程数是 7*48*32=10752。
SM 之间可以理解是物理隔绝的,不同的 SM 的计算是独立的。将数据用显卡进行计算时,进行并行计算时,我个人理解成这样: 把运行的程序做成很多小份进行并行计算;所有的并行计算的总体称为 Grid,并行运算的最小单元为 thread;gpu-blast在默认设置中,将 64 个 threads 合并为 1 个 block,因此 1 个 block 的运行需要 2 个 SP 进行运算;gpu-blast在默认设置中,运行一个程序,将之分割成 521 个 blocks, 这 512 个 blocks 则需要 1024 个 SP 进行运算,可以达到最快的运算速度。所以,如果 GPU 的 SP 总数超过 1024, 则不能完全发挥显卡的性能。
对于 GTX570M 显卡,我设置 gpu-blast 的参数 -gpu_threads 32 -gpu_blocks 336 我觉得是比较好的。这样,将 blast 程序分割为 336 个 blocks 进行并行计算;将所有的 block 分配给所有的 SP ,刚好每个 SP 都运行 32 线程。但实际上,使用 gpu-blast 默认的参数也更好地发挥显卡性能,我个人实验结果是,-gpu_threads 128 -gpu_blocks 512 的结果更加不错。

3. 安装 CUDA Toolkits

CUDA 的下载网址: https://developer.nvidia.com/cuda-downloads

$ wget http://developer.download.nvidia.com/compute/cuda/6_5/rel/installers/cuda_6.5.14_linux_64.run
$ sudo init 3
# sh cuda_6.5.14_linux_64.run

4. 安装 GPU-Blast

GPU-Blast官网: http://archimedes.cheme.cmu.edu/?q=gpublast
GPU-Blast 提供的最高 blast 版本是 2.2.28 版本,需要 ncbi-blast 同版本源码文件支持。

$ mkdir /opt/biosoft/gpu_blast
$ cd /opt/biosoft/gpu_blast

从源码包安装 ncbi-blast 2.2.28 版本(此步骤可选)
$ wget ftp://ftp.ncbi.nih.gov/blast/executables/blast+/2.2.28/ncbi-blast-2.2.28+-src.tar.gz
$ tar zxf ncbi-blast-2.2.28+-src.tar.gz
$ cd ncbi-blast-2.2.28+-src/c++
$ ./configure && make -j 8 

安装 GPU-Blast 前需要将 CUDA Toolkits 的库文件与头文件加入到能识别的路径
$ echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
$ echo 'export C_INCLUDE_PATH=/usr/local/cuda/include/:$C_INCLUDE_PATH' >> ~/.bashrc
$ source ~/.bashrc

下载并安装 GPU-Blast
$ wget http://eudoxus.cheme.cmu.edu/gpublast/gpu-blast-1.1_ncbi-blast-2.2.28.tar.gz 
$ tar zxf gpu-blast-1.1_ncbi-blast-2.2.28.tar.gz
$ perl -p -i -e 's/LATEST/2.2.28/' install
$ perl -p -i -e 's/make /make -j /' install
$ ./install
Do you want to install GPU-BLAST on an existing installation of "blastp" [yes/no]
如果输入 no 则会自动下载 ncbi-blast-2.2.28+-src.tar.gz,并进行安装,需要做上述修改,否则下载地址不正确。同时,默认下 make 编译是单线程运行,加入 -j 参数来并行运算,从而加快编译速度。
如果选择 yes,则需要输入 blastp 的路径,该路径是 blastp 的编译后所在的路径,而不是安装路径。输入 /opt/biosoft/gpu_blast/ncbi-blast-2.2.28+-src/c++/GCC447-Debug64/bin/ , 按 Enter 进行安装。

安装完毕后,将程序文件所在路径加入环境变量 PATH
$ ln -s ncbi-blast-2.2.28+-src/c++/GCC447-ReleaseMT64/bin/ bin
$ echo 'PATH=$PATH:/opt/biosoft/gpu_blast/bin' >> ~/.bashrc
$ source ~/.bashrc

安装完毕后,程序文件位于

4. 运行 GPU-Blast

以 Swissprot 数据库为例:

首先,以 fasta 文件构建 blast 数据库,需要加入 -sort_volumes 参数
$ makeblastdb -dbtype prot -in uniprot_sprot.fasta -out uniprot_sprot -sort_volumes -max_file_sz 500MB

然后,在普通 blast 数据库基础上构建 gpu 数据库。使用 -method 2 参数生成 gpu 数据库文件
$ blastp -db uniprot_sprot -query test.fa -gpu t -method 2

再使用 -gpu t 运用 gpu_blast,否则是单纯用 CPU 进行计算
$ blastp -db uniprot_sprot -query test.fa -gpu t

使用 gpu_blast 确实能加快速度,在软件的示例中,在 -num_threads 2 下,GPU 有 2.5 倍的加速。
我的使用经验: 对 40 条蛋白序列使用 blastp 比对到 Swissprot 数据库, 设置 -num_threads 8, gpu_blast 耗时 1m41.053s, cpu_blast 耗时 0m52.264s; 对 8 条蛋白质序列使用 blastp 比对到 Swissprot 数据库, 设置 -num_threads 2,gpu_blast 耗时 0m7.892s, cpu_blast 耗时 0m12.717s;对同样 8 条蛋白质序列使用 blastp 比对到 Swissprot 数据库, 设置 -num_threads 8,gpu_blast 耗时 0m5.288s, cpu_blast 耗时 0m5.836s;
个人使用感觉: 虽然有 GPU 加速,但是依然需要耗费大量 CPU,而不是只运用了 GPU 进行计算; 如果 CPU 本身运行速度较快的时候,使用 GPU 加速的比率则较低了。

对转录组数据进行质量控制分析

1. 转录组数据质量控制分析的内容

主要包含几个方面:

1. 测序数据的质量控制,推荐使用 Trimmomatic 对低质量数据进行截除;
2. 是否是链特异性测序,以及链特异性测序的种类;
3. 转录组数据对参考基因组的匹配情况,包括分析匹配到基因内或基因间区的数据量;
4. 转录组数据中 rRNA 数据含量;
5. 转录子从 5' 到 3' 端的覆盖度分析;
6. 转录组测序数据量的饱和度分析。

本文主要讲解后面 4 个内容的分析方法。

2. 使用 RNA-SeQC

下载 RNA-SeQC 及其说明文档

$ wget http://www.broadinstitute.org/cancer/cga/tools/rnaseqc/RNA-SeQC_v1.1.8.jar
$ wget http://www.broadinstitute.org/cancer/cga/sites/default/files/data/tools/rnaseqc/RNA-SeQC_Help_v1.1.2.pdf

程序运行需求的输入文件:

genome.fasta        基因组的序列文件,同时需要有相应的 .fai 和 .dict 文件。
genome.gtf          基因组注释文件,该软件仅支持 GTF 格式。标准的 gtf 文件必须有 start_codon, stop_codon 和 CDS 内容,但本软件要求 gtf 文件必须还含有 exon 内容。
accepted_hits.bam   转录组数据比对到基因组的结果,例如 tophat 的结果。此 bam 文件必须含有 RG 参数。
rRNA.fasa           rRNA 序列,用于计算 rRNA 测序数据含量。此文件不是必须的。
rRNA_intervals.list rRNA 的结构信息文件,每行以 "chromosome_id:start-end" 信息表示 rRNA 结构。此文件不是必须的。但和上一个文件必须要二选一。

准备输入文件

得到基因组的 .fai 和 .dict 文件
$ samtools faidx genome.fasta
$ java -jar /opt/biosoft/picard-tools-1.95/CreateSequenceDictionary.jar R=genome.fasta O=genome.dict

若运行 tophat 没有输入 RG 参数,则运行下面命令得到 RG 参数
$ java -jar /opt/biosoft/picard-tools-1.95/AddOrReplaceReadGroups.jar I=accepted_hits.bam O=accepted_hits.RG.bam ID=A1 LB=A1 PL=ILLUMINA SM=A1 PU=run

若仅有 GFF3 文件,没有标准的 GTF 文件,需要自己编写程序进行转换
$ gff3ToGtf.pl genome.fasa genome.gff3 > genome.gtf
$ perl -p -i -e 's/^\s*$//' genome.gtf
若不去除 genome.gtf 文件中的空行,则会出现错误提示: No attributes were found in the GTF file on line 。

运行 RNA-SeQC 命令

对一个数据运行 RNA-SeQC,并结果输出到制定文件夹
$ java -jar RNA-SeQC_v1.1.8.jar -o A1 -r genome.fasta -s "A1|accepted_hits.RG.bam|A1_note" -t genome.gtf -BWArRNA rRNA.fasta

对多个数据运行 RNA-SeQC
$ echo -e "A1\tA1.bam\tA1_note
A2\tA2.bam\tA2_note
B1\tB1.bam\tB1_note
B2\tB2.bam\tB2_note" > samples.txt
$ java -jar RNA-SeQC_v1.1.8.jar -o rna-seqc_out -r genome.fasta -s samples.txt -t genome.gtf -BWArRNA rRNA.fasta

注意,多个数据运行 RNA-SeQC,输入的 samples.txt 文件内容为:
第一行信息为: "Sample ID\tBam File\tNotes", 这行头部会被忽略,仅起注释作用。
后面多行则为相关的信息,用3列表示,用tab分割,注意Bam文件必须为绝对路径。

使用 HISAT 将转录组数据 mapping 到基因组序列

1. HISAT 简介

HISAT:hical Indexing for Spliced Alignment of Transcripts。该软件和 tophat 开发于同一个单位,它相当于 tophat 的升级版,比对速度比 tophat2 快50倍。

2. HISAT 的下载和安装

$ wget http://www.ccb.jhu.edu/software/hisat/downloads/hisat-0.1.5-beta-Linux_x86_64.zip
$ unzip hisat-0.1.5-beta-Linux_x86_64.zip -d /opt/biosoft/
$ echo 'PATH=$PATH:/opt/biosoft/hisat-0.1.5-beta/' >> ~/.bashrc
$ source ~/.bahsrc

2. HISAT 使用

2.1 构建索引文件
$ hisat-build genome.fasta genome

2.2 进行比对 产用的命令与参数示例:

$ hisat -x genome -u 1000000 -p 24 -I 0 -X 500 --rna-strandness RF -1 reads.1.fastq -2 reads.2.fastq -U single.fastq -S result.sam 

hisat 与 bowtie2 的参数基本一致,常用的参数:

-x    输入索引数据库
-1    输入 reads1
-2    输入 reads2
-U    输入单段序列
-u    仅对前多少个reads进行比对
-I    最小插入片段长度
-X    最大插入片段长度
-S    输出sam文件
--rna-strandness 链特异性测序,一般为 RF
-k    一个reads比对到多个地方,报告几个结果,默认为 5 。

Centos 安装 HP Deskjet 1010 驱动

Linux 下安装 HP Deskjet 1010 驱动需要安装 HPLIP, 可以参考: HPLIP Manual Install.

$ sudo yum -y -d 10 -e 1 install cups cups-devel gcc-c++ ghostscript libjpeg-devel glibc-headers libtool libusb-devel make python python-devel PyXML openssl-devel net-snmp-devel policycoreutils-gui PyQt4 PyQt4-devel dbus-python notify-python sane-backends sane-backends-devel sane-frontends xsane python-imaging python-imaging-devel *crypto*
$ sudo ln -s /lib/libcrypt-2.12.so /lib/libcrypt.so

$ wget http://downloads.sourceforge.net/project/hplip/hplip/3.15.2/hplip-3.15.2.tar.gz
$ tar zxf hplip-3.15.2.tar.gz
$ cd hplip-3.15.2
$ ./configure --with-hpppddir=/usr/share/cups/model/HP --libdir=/usr/lib64 --prefix=/usr --enable-qt4 --disable-libusb01_build --enable-doc-build --enable-cups-ppd-install --disable-foomatic-drv-install --disable-foomatic-ppd-install --disable-hpijs-install --disable-udev_sysfs_rules --disable-policykit --disable-cups-drv-install --enable-hpcups-install --enable-network-build --enable-dbus-build --enable-scan-build --enable-fax-build
$ make -j 4 && sudo make install

$ sudo hp-setup
设置打印机

使用 r8s 估算物种分歧时间

1. r8s 简介

r8s用于通过系统发育树估计分歧时间和分子演化速率。
软件运行需要:

一个带有枝长的有根树;
比对的序列长度。

2. r8s 下载与安装

$ wget http://loco.biosci.arizona.edu/r8s/r8s.dist.tgz
$ tar zxf r8s.dist.tgz -C /opt/biosoft/
$ mv /opt/biosoft/dist /opt/biosoft/r8s
$ echo 'PATH=$PATH:/opt/biosoft/r8s/' >> ~/.bashrx
$ source ~/.bashrc

2. r8s 的使用

软件解压缩后,其中带有一个 mannual 的 PDF 文件。

2.1 r8s 的使用方法

直接输入命令 r8s 则会进入该软件的命令行界面,推荐编写了 r8s 的脚本文件后,直接运行。运行 r8s 的方式如下:

$ r8s -b -f r8s_in.txt > r8s_out.txt

-b    运行 r8s 后推出软件的命令行界面
-f    输入的 r8s 脚本文件,该文件包含 r8s 的命令行

r8s_in.txt 的一个示例如下:

#nexus
begin trees;
tree tree_1 = [&R] ((gluc:0.46,cneg:0.54):4.3,(scer:1.07,tree:0.68):0.52);
end;

begin r8s;
blformat lengths=persite nsites=300000 ulrametric=no;
MRCA asc tree scer;
MRCA bas gluc cneg;
fixage taxon=asc age=520;
constrain taxon=bas min_age=350 max_age=410;
#divtime method=PL crossv=yes cvstart=0 cvinc=1 cvnum=18;
set smoothing=100;
divtime method=PL algorithm=TN;
showage;
describe plot=cladogram;
describe plot=chrono_description;
end;

按照上述示例中,第一部分是输入进化树数据;第二部分是运行 r8s 的命令。

2.2 r8s 命令

按照上述示例,需要依次输入上面的 r8s 命令:

blformat

length      设置树的枝长单位。若枝长单位是位点替换率,则其值为 persize,则 枝长 * 序列长度 = 替换数;若枝长单位是替换数,则该参数值为 total。默认参数是 total。
nsites      设置多序列比对的序列长度。
ultrametric 是否是超度量树,一般进化树选 no。默认参数是 no。

MRCA

该命令用来设置内部节点名。示例中设置了 tree 和 scer 的 most recent common ancestor 的节点名为 asc。

fixage

该命令用来设置 MRCA 指定的节点的分歧时间,使用该指定的分歧时间作为校正,来预测其它节点的分歧时间。
r8s 需要至少有一个内部节点进行 fixage。

constrain

该命令用来约束 MRCA 指定的节点的分歧时间,设置该节点允许的最大或最小分歧时间。

divtime

该命令用来进行分歧时间和替换速率计算。总共有 4 种计算方法(LF | NPRS | PL)和 3 种数学算法(Powell | TN | QNEWT)。 一般常用且较优,是使用 PL 和 TN。
但是使用 PL 方法,则需要设置参数 smoothing 的值。 通过设置多个 smoothing 的值来进行一些计算,选择最优的值即可。一般情况下,该值位于 1~1000 能得到一个最佳(最低)的分值。

divtime method=PL crossv=yes cvstart=0 cvinc=1 cvnum=18;
上述命令,是设置 smoothing 的值从 1, 10, 100, 1000 ... 1e17, 来计算,最后得到最佳的 smoothing 值。

若使用 fixage 对 2 个节点的分歧时间进行了固定,则可以运行命令:
divtime method=PL crossv=yes fossilfixed=yes cvstart=0 cvinc=1 cvnum=18;

若使用 fixage 对 1 个节点进行分歧时间固定,同时使用 constrain 对 2 个节点进行了约束,则可以运行命令:
divtime method=PL crossv=yes fossilconstrained=yes cvstart=0 cvinc=1 cvnum=18;

得到最优的 smoothing 值后,使用 set 进行设置,然后运行 divtime 进行分歧时间和替换速率的计算。

showage

使用该命令能得到各个节点的分歧时间和替换速率。

describe

使用该命令得到进化树的图和文字结果。 其 plot 参数如下:

cladogram    得到分支树的图,图上有各个节点的编号,和 showage 的结果结合观察。
phylogram    得到进化树的图,枝长表示替换数。
chronogram   得到超度量树的图,枝长表示时间。
ratogram     得到树图,枝长表示替换速率。

phylo_description     得到树的ASCII文字结果,枝长表示替换数。
chrono_description    得到树的ASCII文字结果,枝长表示时间。
rato_description      得到树的ASCII文字结果,枝长表示替换速率。

node_info    得到节点的信息表格

使用 CAFE 进行基因家族扩张分析

1. CAFE 简介

CAFE (Computational Analysis of gene Family Evolution) 用于进行基因家族的扩张收缩分析。

2. CAFE 下载和安装

$ wget http://heanet.dl.sourceforge.net/project/cafehahnlab/cafe.linux.x86_64
$ wget http://downloads.sourceforge.net/project/cafehahnlab/CAFEv3.1_Manual.pdf
$ wget http://downloads.sourceforge.net/project/cafehahnlab/CAFEv3.1_Manual.doc
$ mv cafe.linux.x86_64 ~/bin/cafe
$ cafe

3. CAFE 的简单使用

CAFE 需要的输入:

1. 基因家族在各个物种中的数目。该文件内容有多行,以 tab 分割,第一行内容必须如下:
Description    ID    species1    species2    ...
上面 species1 和 species2 为物种名简称。后面的行为相应的值。 Description 的值可以空着; ID 为基因家族的名称;其它的为数字,表示该基因家族在相应物种中的数目。
该文件可以由 OrthoMCL 的结果统计得到。

2. 超度量树,枝长表示分歧时间。可以使用 BEAST 或 r8s 等生成。树中的物种名必须和第一个文件中的物种名对应。

3. 输入参数  λ 的值。该值表示在物种进化过程中,每个单位时间内基因获得与丢失的概率。可以由软件自己进行计算。

直接输入命令 cafe 则进入了软件的命令行界面,也可以将命令写入到 cafe 脚本中,直接运行。一个简单的示例如下:

#!~/bin/cafe
version
date
load -i orthoMCL2cafe.tab -t 16 -l log.txt -p 0.05
tree (((chimp:6,human:6):81,(mouse:17,rat:17):70):6,dog:93)
lambda -s -t (((1,1)1,(2,2)2)2,2)
report out

以下简单介绍如上命令

version
    显示软件的版本

date
    显示当前日期

load
    -i 输入的数据文件
    -t 设置程序运行的线程数,默认为 8
    -l 设置输出的日志文件,默认标准输出
    -p 设置 p_value 的阈值,默认为 0.01

tree 输入超度量树

lambda
    -l 设置 λ 的值
    -s 设置软件自动寻找最优的 λ 值
    -t 默认下所有分支的 λ 值是相同的,若需要不同的分支有不同的 λ 值,则用该参数进行设置。该参数的值和 tree 命令中的树的内容一致,只是去除了分歧时间,并将物种名换成了表示 λ 值的编号。其中,相同的编号表示有相同的 λ 值。例如,该参数的值为 (((1,1)1,(2,2)2)2,2) ,它表示 chimp,human 和 紧邻的分支有相同的 λ 值,其它分支有另外相同的 λ 值。

report out
    设置输出文件的前缀为 out

4. CAFE 的输出结果

CAFE 的输出结果为 out.cafe,该文件内容包含如下几部分:

4.1 Tree

第 1 行为输入的树的信息。

4.2 Lambda

第 2 行为 λ 值。

4.3 节点 ID

第 3 行为节点的 ID。同样是树的文字内容,不过给每个节点进行了编号,有利于后面的数值的对应。

4.4 每个基因家族中扩张或收缩的基因数目

第 4 行给出了一系列的 节点ID 对。CAFE 对这些 ID 对进行了基因家族扩张的统计。
第 6 行的值为平均每个基因家族中扩张的基因数目,负数表示基因家族收缩。

4.5 基因家族数目

第 7 行给出发生了扩张的基因家族数目;
第 8 行给出没有发生改变的基因家族数目;
第 9 行给出发生了收缩的基因家族数目;

4.6 每个基因家族的具体扩张与收缩情况

第 10 行之后是每个基因家族具体的扩张情况。其内容分为 4 列:

第 1 列: 基因家族 ID
第 2 列: 树的信息,其中每个物种名后面多个一个下划线和数字,该数字表示基因家族的数目。特别是每个节点的基因家族数目都计算出来了,从而知道在某一个分化过程中基因家族的扩张情况。
第 3 列: 该基因家族总体上的扩张情况的 p_value,不同物种中的基因数目差异越大,则 p 值越小。
第 4 列: 计算出了每个分枝的基因家族扩张的显著性。

根据 CAFE 的结果,可以自行编写程序提取信息。

使用 SGA 进行基因组组装

1. SGA 简介

SGA (String Graph Assembler), 采用 String Grapher 的方法来进行基因组的组装。软件通过创建 FM-index/Burrows-Wheeler 索引来进行查找 short reads 之间的 overlaps, 从而进行基因组组装。
使用 SGA 的注意事项:

1. SGA 的输入文件为 fastq 文件,序列长度推荐为 100bp 及以上。较短的序列长度,则使用 De Bruijn 的方法进行组装能或得更好的基因组序列。
2. 使用 SGA 进行基因组组装需要最少 40X

2. SGA 安装

SGA 的安装与使用需要依赖 google-sparsehash, bamtools, zlib 和 jemalloc 等软件。

安装 goolge-sparsehash,由于国内屏蔽了google,无法下载该软件。
$ wget www.chenlianfu.com/public/software/sparsehash-2.0.2.tar.gz
$ tar zxf sparsehash-2.0.2.tar.gz
$ cd sparsehash-2.0.2
$ ./configure && make -j 8 && sudo make install

安装 bamtools
$ wget https://github.com/pezmaster31/bamtools/archive/master.zip -O bamtools.zip
$ unzip bamtools.zip
$ cd bamtools-master/
$ mkdir build; cd build
$ cmake ../
$ make -j 8
$ cd ../../
$ mv bamtools-master/ /opt/biosoft/bamtools

安装 jemalloc,可选,有利于减少运算时间。
$ wget https://github.com/jemalloc/jemalloc/archive/dev.zip -O jemalloc.zip
$ unzip jemalloc.zip
$ ./autogen.sh 
$ ./configure && make -j 8 && sudo make install
$ cd ../
$ mkdir /opt/biosoft/sga/
$ mv jemalloc-dev /opt/biosoft/sga/

安装 SGA
$ wget https://github.com/jts/sga/archive/master.zip -O sga.zip
$ unzip sga.zip
$ cd sga-master/src
$ ./autogen.sh
$ ./configure --with-bamtools=/opt/biosoft/bamtools --with-jemalloc=/opt/biosoft/sga/jemalloc-dev/lib/ --prefix=/opt/biosoft/sga/
$ make -j 8
$ make install
$ cd ..
$ mv * /opt/biosoft/sga/
$ echo 'PATH=/opt/biosoft/sga/bin/' >> ~/.bashrc
$ source ~/.bashrc

此外,如果需要使用程序附带的一些 python 程序,则需要安装一些 python 模块。
$ wget https://pypi.python.org/packages/source/r/ruffus/ruffus-2.6.3.tar.gz
$ tar zxf ruffus-2.6.3.tar.gz
$ cd ruffus-2.6.3
$ sudo python setup.py install

3. SGA 的使用

SGA 包含很多个命令,直接输入命令,即可得到帮助信息。
以 2 个 PE 文库和 2 个 MP 文库的测序数据为输入,使用 SGA 进行基因组组装,来介绍运行流程。
输入文件:

pe180.1.fastq    pe180.2.fastq
pe500.1.fastq    pe500.2.fastq
mp2000.1.fastq   mp2000.2.fastq
mp5000.1.fastq   mp5000.2.fastq

3.1 数据预处理

使用 preprocess 程序进行低质量数据的截短和删除,示例:

去除 PE 文库数据中含有 N 的reads。此处仅对需要进行 contig 组装的 PE 数据进行处理。
$ sga preprocess -o pe180.pp.fastq --pe-mode 1 pe180.1.fastq pe180.2.fastq
$ sga preprocess -o pe500.pp.fastq --pe-mode 1 pe500.1.fastq pe500.2.fastq

结果中 pp 表示 preprocess 的意思。
一般用其它软件进行 Fastq 文件的 QC,此处使用 preprocess 去除含有 N 的 reads 即可。由于软件后续有对 reads 的校正过程,因此不推荐对 reads 进行截短处理。

preprocess 命令参数:

sga preprocess [OPTION] READS1 READS2 ...

-o | --output FILE
    将输出数据写入到该文件中。默认输出到标准输出。程序仅得到一个输出文件。成对的数据用 /1 /2 标识出来并在输出文件中交叉排列。
-p | --pe-mode INT
    paired end 模式。 有 3 中模式,用数字 0, 1, 2 表示。
    0:表示认为输入数据都是单端数据;
    1:表示 READS1 中的数据和 READS2 中的数据是成对的,这种情况下若有一条 read 被去除,则对应的另外一条也会被去除;
    2:表示 reads 是成对的,可能该值适合于3个及以上文件作为输入(我没有用过)。
--pe-orphans FILE
    如果 read pair 中有一条序列被去除,则另外一条序列写入到此文件中。
--phred64
    加入该参数,表明输入的 fastq 文件为 phred64 格式,输出结果会转换成 phred33 格式。
--discard-quality
    不输出碱基质量。
-q | --quality-trim INT
    对低质量碱基进行 trim。
-f | --quality-filter INT
    对低质量 reads 进行去除。若 read 中碱基质量 <=3 的低质量碱基多余该值,则去除整条 read。
-m | --min-length INT
    去除长度低于此值的 read。
-h | --hard-clip INT
    将所有的 reads 长度截短到该值。
--permute-ambiguous
    将 reads 中的 N 随机替换为 ATCG 中的一种。
--dust
    去除低复杂度 reads 。
-dust-threshold FLOAT
    去除 dust score 高于此值的 reads。默认为 4.0 。
--suffix STRING
    在每个 read ID 后添加后缀。
--no-primer-check
    不进行 primer 序列检测
-r | --remove-adapter-fwd  STRING
    去除 adapter 序列,提供 adapter 序列的第一条链。
-c | --remove-adapter-rev STRING
    去除 adapter 序列,提供 adapter 序列的第二条链。

2. FM 索引构建与合并

使用 index 命令对 reads 数据构建索引。当使用多组数据进行 contig 组装的时候,使用 merge 对多组数据的索引进行合并。示例:

$ sga index -a ropebwt -t 8 --no-reverse pe180.pp.fastq
$ sga index -a ropebwt -t 8 --no-reverse pe500.pp.fastq

$ sga merge -t 8 -p pe -r pe180.pp.fastq pe500.pp.fastq

index 命令常用参数:

sga index [OPTION] ... READSFILE

-a | --algorithm STRING
    BWT 构建算法,有两种 sais (默认) 和 ropebwt。前者适合与较长的 reads;后者适合与较短的(<200bp) reads,但是速度快,消耗内存少。
-t | --threads INT
    运算的线程数。默认为 1 。
-p | --prefix
    指定输出文件前缀,默认为输入文件的前缀。
--no-reverse
    不生成反向序列的 BWT 文件。由于对测序数据进行校正的时候不许要该文件,一般加入该参数以节约资源。
--no-forward
    不生成正向序列的 BWT 文件。
--no-sai
    不生成 SAI 文件。

merge 命令常用参数:

sga merge [OPTION] ... READS1 READS2

-t | --threads INT
    运算的线程数。默认为 1 。
-p | --prefix 
    指定输出文件前缀,默认为输入文件的前缀。
-r | --remove
    生成合并后的 index 文件后,删除旧的 index 文件和 fastq 文件。

3. reads 的校正

使用 correct 命令对 reads 进行校正,示例:

$ sga correct -t 8 -k 41 -x 2 --learn -o pe.ec.fastq pe.fastq

correct 命令参数:

sga correct [OPTION] ... READSFILE

-p | --prefix STRING
    输入的 index 文件的前缀,默认为输入文件的前缀。
-o | --outfile STRING
    将校正后的数据写入到此文件中,默认输出的文件名为 READSFILE.ec.fa。虽然后缀是 fa,但其实是 fastq 文件。
-t | --threads INT
    运算的线程数。默认为 1 。
--discard
    检测并去除低质量 reads 。
-a | --algorithm STRING
    进行 reads correction 的算法。有 3 种:
    kmer: 使用 kmer 的方法进行校正,默认是该值;
    overlap:基于重叠的方法进行校正;
    hybrid:应该是同时上面 2 中方法进行校正。
--metrics FILE
    校正后,将 read 中每个位点的碱基错误率写入到该文件。

使用 kmer 方法进行校正的参数:
-k | --kerm-size INT
    选取的 kemr 长度,默认为 31 。
-x | --kmer-threshold INT
    对出现次数低于此值的 kmer 进行校正。默认为 3 。
-i | --kmer-rounds INT
    执行 N 轮校正,最多校正 N 个碱基。默认的 N 值为 10。
--learn
    程序自行计算 -x 的参数。若测序覆盖度低于 20x 或测序数据在基因组上的覆盖不均匀,则不适合选择该参数。

使用 overlap 方法进行校正的参数:
-e | --error-rate    default:0.04
    2 条 reads 有 overlap 时,允许的最大错误率。
-m | --min-overlap    default:45
    2 条 reads 重叠的最小碱基数。
-c | --conflict    default:5
    检测出一个错误碱基所需要的最小重叠数目。
-r | --rounds    default:1
    进行迭代校正的指定的次数。

4. reads 的过滤

去除数据中完全一模一样的 duplicate;去除含有低频 kmer 的 reads。示例:

需要先对校正过后的数据重新构建 index
$ sga index -a ropebwt -t 8 pe.ec.fastq

$ sga filter -x 2 -t 8 -o pe.ec.f.fastq --homopolymer-check --low-complexity-check pe.ec.fastq

filter 命令常用参数:

sga filter [OPTION] ... READSFILE

-o | --outfile STRING
    将校正后的数据写入到此文件中,默认输出的文件名为 READSFILE.filter.pass.fa 。
--no-duplicate-check
    不进行 duplicate removal
--no-kmer-check
    不进行 kmer check
--kmer-both-strand
    对 reads 的正负链都进行检测
--homopolymer-check
    检测单碱基连续情况
--low-complexity-check
    去除低重复 reads
-k | --kmer-size    default:27
    kmer 检测时所用的 kmer 值。
-x | --kmer-threshold     default:3
    保留的 read 中所有的 kemr 的覆盖度必须大于该值。

5. 整合出简单的序列

使用 fm-merge 整合出一些简单序列(simple unbranched chains),示例:

$ sga fm-merge -m 55 -t 8 -o merged.fa pe.ec.f.fastq

fm-merge 命令参数:

sga fm-merge [OPTION] ... READSFILE

-m | --min-overlap    default:45
    2 个 reads 之间最小的 ovlerlap 长度。此值设置过小,则消耗更多的计算时间。

6. 去除重复序列

在上一步命令之后,生成的序列中,有很多的包含与被包含的关系,使用 rmdup 命令去除 substrings 序列。示例:

$ sga index -d 1000000 merged.fa
$ sga rmdup -t 8 -o rmdup.fa merged.fa

rmdup 命令参数:

sga rmdup [OPTION] ... READFILE

-o | --out FILE    default:READFILE.rmdup.fa
    设置输出文件名。
-e | --error-rate    default: exact matches required
    设定 2 条序列一致,这 2 条之间的允许的最大错误率。默认 2 条序列必须完全一致。

7. 构建 string grahp

使用 overlap 命令来构建 string graph。如果组装小物种的基因组,可以跳过 fm-merge 和 rmdup 这 2 步。示例:

$ sga overlap -m 55 -t 8 rmdup.fa

overlap 命令常用参数:

-m | --min-overlap    default:45
    2 个 reads 之间最小的 ovlerlap 长度。此值设置过小,则消耗更多的计算时间。

7. 组装 contigs

使用命令 assemble 进行 contigs 组装,示例:

$ sga assemble -m 75 -g 0 -r 10 -o assemble.m75 rmdup.asqg.gz

assemble 命令常用参数:

-m | --min-overlap    default:45
    2 个 reads 之间最小的 ovlerlap 长度。当参数在 fm-merge, overlap 和 assemble 这 3 个命令中都有出现。当测序 reads 长度为 100bp 时, 该参数的值在 3 个命令中比较合适的值分别是 65, 65, 75。当然, reads 长度越长,则该参数的值设置越大。此外,一般通过调节 overlap 中该参数的值来优化组装结果。
-d | --max-divergence    default:0.05
    如果序列中的 SNP 比率 < 0.05,则消除变异。当基因组杂合率非常高时,需要增大该值。
-g | --max-gap-divergence    default:0.01
    如果序列中的 INDEL 比率 < 0.01,则消除变异。当基因组杂合率非常高时,需要增大该值。如果设置改值为 0, 则表示不消除变异。
--max-indel    default:20
    当 indel 长度大于该值的时候,则不消除变异。
-l | --min-branch-length    default:150
    去除 tip 序列,如果其序列长度低于该值。当 reads 长度为 100 bp 时候,推荐设置为 150;若 reads 长度越大,该值也需要越大。
-r | --resolve-small    default: not perfomed
    对 samll repeat 序列进行打断,如果该跨过该区域的 overlaps 之间的最大长度差超过该值时。可以设置该值为 10 。

7. 组装 scaffold

首先,需要将 PE 和 MP 数据比对到 contigs 序列上

$ /opt/biosoft/sga/src/bin/sga-align --name pe180 assemble.m75-contigs.fa pe180.1.fastq pe180.2.fastq
$ /opt/biosoft/sga/src/bin/sga-align --name pe250 assemble.m75-contigs.fa pe250.1.fastq pe250.2.fastq
$ /opt/biosoft/sga/src/bin/sga-align --name mp2000 assemble.m75-contigs.fa mp2000.1.fastq mp2000.2.fastq
$ /opt/biosoft/sga/src/bin/sga-align --name mp5000 assemble.m75-contigs.fa mp5000.1.fastq mp5000.2.fastq

然后,计算 contig 之间的距离

$ sga-bam2de.pl -n 5 --prefix pe180 pe180.bam
$ sga-bam2de.pl -n 5 --prefix pe500 pe500.bam
$ sga-bam2de.pl -n 5 --prefix mp2000 mp2000.bam
$ sga-bam2de.pl -n 5 --prefix mp5000 mp5000.bam

再计算 contig 的拷贝数

$ sga-astat.py -m 200 pe180.refsort.bam > pe180.astat
$ sga-astat.py -m 200 pe500.refsort.bam > pe500.astat

最后,进行 scaffold 组装

$ sga scaffold -m 200 -a pe180.astat -a pe500.astat -pe pe180.de --pe pe500.de --mp mp2000.de --mp mp5000.de -o genome.scaf assemble.m75-contigs.fa
$ sga scaffold2fasta -m 200 -a assemble.m75-graph.asqg.gz -o genomeScaffold.n5.fa -d 1 --use-overlap --write-unplaced genome.scaf

使用 HMMER 进行 PFAM 注释

1. HMMER 简介

HMMER 和 BLAST 类似,主要用于序列比对。

2. HMMER 与 PFAM 的下载安装

安装 HMMER
$ wget ftp://selab.janelia.org/pub/software/hmmer3/3.1b2/hmmer-3.1b2.tar.gz
$ tar zxf hmmer-3.1b2.tar.gz
$ cd hmmer-3.1b2
$ ./configure --prefix=/opt/biosoft/hmmer-3.1b2 && make -j 8 && make install
$ echo 'PATH=$PATH:/opt/biosoft/hmmer-3.1b2/bin/' >> ~/.bashrc
$ source ~/.bashrc
下载 HMMER 软件说明文档
$ wget ftp://selab.janelia.org/pub/software/hmmer3/3.1b2/Userguide.pdf -P  /opt/biosoft/hmmer-3.1b2/

下载 PFAM 数据库
$ cd /opt/biosoft/hmmer-3.1b2/
$ wget ftp://ftp.ebi.ac.uk/pub/databases/Pfam/releases/Pfam27.0/Pfam-A.hmm.gz
$ wget ftp://ftp.ebi.ac.uk/pub/databases/Pfam/releases/Pfam27.0/Pfam-B.hmm.gz
$ gzip -d Pfam-A.hmm.gz; gzip -d Pfam-B.hmm.gz
得到 PFAM 数据库的 HMM 文件。 HMM 文件是文本文件,需要将其变成二进制格式,以加快运算速度,同时进行压缩,并建立成索引数据库。
$ hmmpress Pfam-A.hmm
$ hmmpress Pfam-B.hmm

3. 使用 hmmscan 进行 Pfam 注释

Pfam 数据库中每个编号代表一个蛋白质家族。Pfam 分 A 和 B 两个数据库,其中 A 数据库是经过手工校正的高质量数据库, B 数据库虽然质量低些,依然可以用来寻找蛋白质家族的保守位点。Pfam 最新 v27.0 版本的数据库中, A 数据库包含 14,836 个蛋白质家族编号(以 PF 开头); B 数据库包含 20,000 个蛋白质家族编号 (以 PB 开头)。
使用 hmmscan 进行 Pfam 注释示例:

$ /opt/biosoft/hmmer-3.1b2/bin/hmmscan -o out.txt --tblout out.tbl --noali -E 1e-5 /opt/biosoft/hmmer-3.1b2/Pfam-A.hmm file.fasta

生成结果文件 out.txt 和 out.tbl
out.txt 文件信息比较全面,但是不好阅读;
out.tbl 文件则是表格形式的结果,是一般需要的结果。

hmmscan 命令的常用参数:

$ hmmscan [-options]  

-h
    显示帮助信息
-o FILE
    将结果输出到指定的文件中。默认是输出到标准输出。
--tblout FILE
    将蛋白质家族的结果以表格形式输出到指定的文件中。默认不输出该文件。
--domtblout FILE
    将蛋白结构域的比对结果以表格形式输出到指定的文件中。默认不输出该文件。该表格中包含query序列起始结束位点与目标序列起始结束位点的匹配信息。
--acc
    在输出结果中包含 PF 的编号,默认是蛋白质家族的名称。
--noali
    在输出结果中不包含比对信息。输出文件的大小则会更小。
-E FLOAT    default:10.0
    设定 E_value 阈值,推荐设置为 1e-5 。
-T FLOAT
    设定 Score 阈值。
--domE FLOAT    default:10.0
    设定 E_value 阈值。该参数和 -E 参数类似,不过是 domain 比对设定的值。
--cpu
    多线程运行的CPU。默认应该是大于1的,表示支持多线程运行。但其实估计一般一个hmmscan程序利用150%个CPU。并且若进行并行化调用hmmscan,当并行数高于4的时候,会报错:Fatal exception (source file esl_threads.c, line 129)。这时,设置--cpu的值为1即可。

SSH 隧道

1. 反向隧道

学校关闭了对服务器所有外端口的访问。于是要想在校外登录实验室的服务器,则需要有一台有固定 IP 的外网机器。实验室的服务器能连接上该外网机器,同时来开启一个 ssh 反向隧道,以供外网机器连接到实验室服务器。于是本地机器可以先连接到外网机器,再连接到实验室服务器。
实验室的服务器不需要有固定的 IP,有个用户名为 chenlianfu ;外网服务器的 IP 为 123.123.123.123 ;外网服务器的用户名为 waiwang。

在内网服务器上输入命令,建立一个和外网机器的 ssh 隧道,来保证外网机器能和内网机器进行连接
$ autossh -M 4321 -N -f -R 2222:localhost:22 waiwang@123.123.123.123
输入 123.123.123.123 机器 waiwang 用户的密码来构建反向通道。

-M 推荐加上此参数,可能好些,貌似是发送和接受测试数据用。
-N -f 这两个参数配合使用,让隧道在后台运行。
-R 构建反向隧道,将本地机器的 22 号端口映射成为远程服务器的 2222 端口。

此外,若使用 ssh 也可以运行上述命令,但是容易断掉反向隧道。

在 IP 为 123.123.123.123 的机器上则通过下面命令来连接内网机器:
$ ssh -p 2222 chenlianfu@localhost
输入内网机器 chenlianfu 用户的密码通过反向隧道来连接内网机器。
这时,只需要连接有固定 IP 的外网机器,即可再连接内网服务器。

PBJelly2利用Pacbio数据进行scaffolding

1.PBJelly2 简介

PBJelly2 用于利用 Pacbio 数据进行基因组补洞和 scaffold 连接。

2.安装 PBJelly2

安装 HDF:
$ wget http://www.hdfgroup.org/ftp/HDF5/current/bin/linux-centos6-x86_64/hdf5-1.8.15-patch1-linux-centos6-x86_64-shared.tar.gz
$ tar zxf hdf5-1.8.15-patch1-linux-centos6-x86_64-shared.tar.gz
$ mv hdf5-1.8.15-patch1-linux-centos6-x86_64-shared /opt/biosoft/hdf5-1.8.15-patch1
$ export HDF5INCLUDEDIR=/opt/biosoft/hdf5-1.8.15-patch1/include/
$ export HDF5LIBDIR=/opt/biosoft/hdf5-1.8.15-patch1/lib/
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/biosoft/hdf5-1.8.15-patch1/lib/
$ export C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/biosoft/hdf5-1.8.15-patch1/include/

安装 Blasr(需求 HDF v1.8.0或以上版本):
$ wget https://github.com/PacificBiosciences/blasr/archive/master.zip -O blasr.zip
$ unzip blasr.zip
$ mv blasr-master/ /opt/biosoft/blasr
$ cd /opt/biosoft/blasr
$ make -j 8
$ echo 'PATH=$PATH:/opt/biosoft/blasr/alignment/bin/' >> ~/.bashrc

安装Python模块 Networkx v1.7
$ wget https://pypi.python.org/packages/source/n/networkx/networkx-1.7.tar.gz
$ tar zxf networkx-1.7.tar.gz
$ cd networkx-1.7
$ sudo /usr/local/bin/python setup.py install

安装Python模块 pyparsing
$ wget https://pypi.python.org/packages/source/p/pyparsing/pyparsing-2.0.3.tar.gz
$ tar zxf pyparsing-2.0.3.tar.gz
$ cd pyparsing-2.0.3
$ sudo /usr/local/bin/python setup.py install

安装Python模块 numpy
$ wget https://pypi.python.org/packages/source/n/numpy/numpy-1.9.2.tar.gz
$ tar zxf numpy-1.9.2.tar.gz 
$ cd numpy-1.9.2
$ sudo /usr/local/bin/python setup.py install

安装Python模块 h5py
$ wget https://pypi.python.org/packages/source/h/h5py/h5py-2.5.0.tar.gz
$ cd h5py-2.5.0
$ export LIBRARY_PATH=/opt/biosoft/hdf5-1.8.15-patch1/lib/:$LIBRARY_PATH
$ /usr/local/bin/python setup.py build
$ sudo /usr/local/bin/python setup.py install

安装Python模块 pysam
$ https://pypi.python.org/packages/source/p/pysam/pysam-0.8.3.tar.gz
$ tar zxf pysam-0.8.3.tar.gz 
$ cd pysam-0.8.3
$ sudo /usr/local/bin/python setup.py install

安装Python模块 intervaltree
$ wget https://pypi.python.org/packages/source/i/intervaltree/intervaltree-2.0.4.tar.gz
$ tar zxf intervaltree-2.0.4.tar.gz
$ cd intervaltree-2.0.4
$ sudo /usr/local/bin/python setup.py install

安装 PBJelly2
$ wget http://sourceforge.net/projects/pb-jelly/files/latest/download -O PBSuite.tar.gz
$ tar zxf PBSuite.tar.gz -C /opt/biosoft/
$ SWEETPATH=`ls /opt/biosoft/PBSuite* -d`
$ echo "perl -p -i -e 's#export SWEETPATH=.*#export SWEETPATH=$SWEETPATH#' $SWEETPATH/setup.sh" | sh
$ echo "source $SWEETPATH/setup.sh" >> ~/.bashrc

3. 使用 PBJelly2 进行补洞

首先创建配置文件 Protocol.xml,内容如下:

<jellyProtocol>
    <reference>基因组fasta文件的路径</reference>  
    <outputDir>输出文件路径</outputDir>
    <blasr>-minMatch 8 -minPctIdentity 70 -bestn 1 -nCandidates 20 -maxScore -500 -nproc 24 -noSplitSubreads</blasr>
    <input baseDir="输入Pacbio数据文件所在的文件夹">
        <job>Pacbio数据文件名称</job>
    </input>
</jellyProtocol>

然后依次运行下6步:

$ Jelly.py setup Protocol.xml
$ Jelly.py mapping Protocol.xml
$ Jelly.py support Protocol.xml
$ Jelly.py extraction Protocol.xml
$ Jelly.py assembly Protocol.xml -x "--nproc=24"
$ Jelly.py output Protocol.xml

--nproc 参数设置运行线程数。

输出结果文件为 jelly.out.fasta 。

4. 使用 PBJelly2 进行 scaffold 连接