使用 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 连接

使用rsync进行数据同步

1. rsync 命令作用

rsync 主要用于同步 2 台机器的文件。这里,同步的意思是:

1. 若目的端文件的源端的文件内容不一致,则使目的端文件和源端的文件内容一致。默认下,程序会比较两端文件的时间戳和大小,如果一致,则不会同步。
2. 默认下,若两端都有的文件,不会修改rwx权限和modify time。
3. 源端的路径必须有读权限,目的端必须有写权限,才能正常同步。

2. rsync 常用命令和参数

常用命令示例:
$ rsync -vrP -e 'ssh -p 22' SRC USER@HOST:DEST
可以使用 rsync 替代 scp。因为 scp 不能断点续传。

常用参数:
-v
    输出日志信息,-vvv (多个v)则会输出更多的信息。
-r
    递归,传输文件夹需要加此参数。
-P
    相当同时使用 --partial(断点续传) --progress(显示传输进度)这2个参数。
-e  default: ssh
    设置传输方式。如果ssh端口是 1234,则需要使用参数 -e 'ssh -p 1234' 。
--delete
    删除在目的端删存在而源端不存在的文件,配合 -r 使用。
-z
    使用gzip压缩后传输。
-t
    将源端文件的modify time同步过去。
-p
    将源端文件的rwx权限同步过去。
-I
    程序会比较文件内容是否一致来进行同步,速度慢。

使用PacBioToCA修正Pacbio数据

1. PacBioToCA 简介

PacBioToCA 是 Celera Assembler 的一个模块,用于Pacbio数据的校正。因此,使用 PacBioToCA 需要安装 Celera Assembler。
利用 PacBioToCA 进行校正时:如果 Pacbio 数据量 > 20x 时,可以进行自我校正,而不需要其它更为精确的数据;推荐 Pacbio 数据量 > 50x 时进行自我校正;通常 > 15x 的 Pacbio 数据即可得到很好的组装结果。

2. 安装 Celera Assembler

推荐使用源码安装,直接下载二进制版本,可能提示错误:/lib64/libc.so.6: version `GLIBC_2.14′ not found

$ wget http://sourceforge.net/projects/wgs-assembler/files/wgs-assembler/wgs-8.3/wgs-8.3rc2.tar.bz2
$ tar jxf wgs-8.3rc2.tar.bz2 -C /opt/biosoft/
$ cd /opt/biosoft/wgs-8.3rc2/kmer
以下使用 make,不要使用 -j 参数进行多线程编译,会出错。
$ make && make install && cd ..
$ cd src && make && cd ..
$ echo 'PATH=$PATH:/opt/biosoft/wgs-8.3rc2/Linux-amd64/bin/' >> ~/.bashrc

如果进行 Pacbio 数据的自我校正,则需要 JAVA 1.8 版本
$ wget http://javadl.sun.com/webapps/download/AutoDL?BundleId=106240 -O jre1.8.0_45.tar.gz
$ tar zxf jre1.8.0_45.tar.gz -C /opt/biosoft
$ echo 'PATH=/opt/biosoft/jre1.8.0_45/bin/:$PATH' >> ~/.bashrc
$ source ~/.bashrc

3. PacBioToCA 的使用

3.1 将错误率低的测序数据转换为 FRG 数据

Celera Assembler 软件输入的测序数据的文件格式是 FRG 格式。PacBioToCA 输入的错误率低的数据需要 FRG 格式。
1. 使用 fastqToCA 将 fastq 数据转换为 FRG 格式
一般情况下是利用错误率较低的 Illumina 数据来对 Pacbio 数据进行校正。 因此需要将 Illumina 的 Fastq 文件转换成 FRG 格式。 FRG 文件是文本文件,其中包含有 fastq 文件的路径和一些测序信息,比如插入片段长度、测序方向和碱基质量格式等。
fastqToCA 的常用示例和常用参数:

$ fastqToCA -insertsize 500 50 -libraryname pe500 -mates reads.1.fastq,reads.2.fastq > pe500.frg

-insertsize
    设置插入片段长度,为2个值,前者为插入片段长度,后者为标准差。
-libraryname
    文库的ID
-reads
    单端测序的 fastq 文件路径。
-mates
    双端测序的 fastq 文件路径。若双端数据交叉在一个文件中,则该参数后只有一个路径;若双端数据在2个fastq文件中,则2个路径用逗号分割。
-technology  default:illumina
    测序技术。可选的值有:none, sanger, 454, illumina(读长 < 160bp), illumina-long(任意读长), moleculo, pacbio-ccs, pacbio-corrected, pacbio-raw。
-type  default:sanger
    碱基质量格式。可选的值有:sanger, solexa, illumina。
-innie
    测序方向为 5'-3' <-> 3'-5',适合小片段测序文库。
-outtie
    测序方向为 3'-5' <-> 5'-3',适合大片段文库。

2. 使用 sffToCA 将 SFF 数据为 FRG 格式
Roche/454 数据格式为 SFF。
sffToCA 的常用示例和常用参数:

$ sffToCA  -libraryname LIB -output NAME IN.SFF ...

-insertsize
    设置插入片段长度,为2个值,前者为插入片段长度,后者为标准差。
-libraryname
    文库的ID。
-output
    输出文件的前缀。

3.2 使用 pacBioToCA/PBcR 进行 Pacbio 数据的修正

pacBioToCA 能对 Pacbio 数据进行校正,也能进行调用 runCA 进行基因组组装。
pacBioToCA 的输入文件为:

1. pacbio.spec   该文件包含一些参数信息,以 参数=值 表示。必须提供该文件,该文件内容为空,则全部使用默认参数。
2. pacbio.fastq  Pacbio测序的fastq文件,对该文件中的数据进行校正。
3. seq.frg        Illumina或454数据由 fatsqToCA 转换得到的 FRG 格式文件。如果不提供该文件,则进行自我校正。

pacBioToCA 的常用例子(示例数据)和参数:

$ pacBioToCA -libraryname out_prefix -s pacbio.spec -fastq pacbio.fastq seq1.frg seq2.frg

必须参数:
-libraryname STRING
    设定输出文件的前缀。
-s FILE
    从指定的参数文件获取额外的参数。若该文件内容为空,则使用默认的参数。
-fastq FILE
    输入需要校正的 Pacbio 数据。

可选参数:
-length INT    default:500
    pacBioToCA 对长度大于此值的测序 reads 进行修正。
-partitions INT    default:200
    将用于校正的数据分成指定份数,进行计算。内存不够,则需要增大该值。若内存足够,减小该值,可以减少计算时间。若该值太小(< 总线程数),软件会中途运行runCorrection.sh报错并停止运行。
-threads INT    default:max
    使用的线程数。默认为所有可用的线程数。
-shortReads
    如果用于辅助校准的序列长度都 <= 100bp,则使用该参数。
-genomeSize INT    default:0
    设置基因组大小。设置改值后,在其它默认条件下,如果校正后的数据量 >25x,则会进行基因组组装。不设置该值,可能等同于设置该值为 5000000 (从软件输出信息中查知)。
-maxCoverage INT    default:40
    默认下,最多校正 40x 的数据量。
-maxGap INT
    默认下,如果有一段 pacibo-read 区域没有 short-read 覆盖,则会打断 pacbio-read。此值设定所能允许的没有 short-read 覆盖的最大长度。当然,若此段区域没有其它 pacbio-reads 重叠,则也会进行打断。

此外,在 pacbio.spec 文件中常设置的参数为:

若不进行基因,则需要设置:
assemble=0

软件默认设置最大内存使用量设置为系统最大可使用的内存量,若设定最大使用内存为 64G,则设置:
ovlMemory=64

使用 CA 8 版本对大基因组(>100Mbp)进行校正,设置:
maxGap=1500
ovlHashBlockLength=1000000000
ovlRefBlockLength=1000000000
使用Illumina数据进行校正:
blasr=-noRefineAlign -advanceHalf -noSplitSubreads -minMatch 10 -minPctIdentity 70 -bestn 24 -nCandidates 24
自我校正:
blasr=-minReadLength 200 -maxScore -1000 -maxLCPLength 16 -bestn 24 -nCandidates 24
ovlThreads=16
下面一个参数设置并行数。其值推荐设置为 总线程数 / ovlThreads值 。设置为2,表示每个 blasr 程序运行消耗 16 线程,并行运行 2 个 blasr 程序。
ovlConcurrency=2

若进行基因组组装。默认参数适用于单倍体数据或近亲杂交数据。对于大基因组或双倍体基因组,则需要设置:
asmUtgErrorRate=0.10
asmCnsErrorRate=0.10
asmCgwErrorRate=0.10
asmOBT=1
asmObtErrorRate=0.08
asmObtErrorLimit=4.5
utgGraphErrorRate=0.05
utgMergeErrorRate=0.05
ovlHashBits=24
ovlHashLoad=0.80

linux下测试磁盘的读写IO速度

转载于:http://blog.chinaunix.net/uid-24250828-id-3239100.html

有时候我们在做维护的时候,总会遇到类似于IO特别高,但不能判定是IO瓶颈还是软件参数设置不当导致热盘的问题.这时候通常希望能知道磁盘的读写速度,来进行下一步的决策.

下面是两种测试方法:
(1)使用hdparm命令
这是一个是用来获取ATA/IDE硬盘的参数的命令,是由早期Linux IDE驱动的开发和维护人员 Mark Lord开发编写的( hdparm has been written by Mark Lord , the primary developer and maintainer of the (E)IDE driver for Linux, with suggestions from many netfolk).该命令应该也是仅用于Linux系统,对于UNIX系统,ATA/IDE硬盘用的可能比较少,一般大型的系统都是使用磁盘阵列的.

使用方法很简单
# hdparm -Tt /dev/sda

/dev/sda:
Timing cached reads: 6676 MB in 2.00 seconds = 3340.18 MB/sec
Timing buffered disk reads: 218 MB in 3.11 seconds = 70.11 MB/sec

可以看到,2秒钟读取了6676MB的缓存,约合3340.18 MB/sec;
在3.11秒中读取了218MB磁盘(物理读),读取速度约合70.11 MB/sec

(2)使用dd命令
这不是一个专业的测试工具,不过如果对于测试结果的要求不是很苛刻的话,平时可以使用来对磁盘的读写速度作一个简单的评估.
另外由于这是一个免费软件,基本上×NIX系统上都有安装,对于Oracle裸设备的复制迁移,dd工具一般都是首选.

在使用前首先了解两个特殊设备
/dev/null 伪设备,回收站.写该文件不会产生IO
/dev/zero 伪设备,会产生空字符流,对它不会产生IO

测试方法:
a.测试磁盘的IO写速度
# time dd if=/dev/zero of=/test.dbf bs=8k count=300000
300000+0 records in
300000+0 records out
10.59s real 0.43s user 9.40s system
# du -sm /test.dbf
2347 /test.dbf

可以看到,在10.59秒的时间里,生成2347M的一个文件,IO写的速度约为221.6MB/sec;
当然这个速度可以多测试几遍取一个平均值,符合概率统计.

b.测试磁盘的IO读速度
# df -m
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
19214 9545 8693 53% /
/dev/sda1 99 13 82 14% /boot
none 506 0 506 0% /dev/shm

# time dd if=/dev/mapper/VolGroup00-LogVol00 of=/dev/null bs=8k
2498560+0 records in
2498560+0 records out
247.99s real 1.92s user 48.64s system

上面的试验在247.99秒的时间里读取了19214MB的文件,计算下来平均速度为77.48MB/sec

c.测试IO同时读和写的速度
# time dd if=/dev/sda1 of=test.dbf bs=8k
13048+1 records in
13048+1 records out
3.73s real 0.04s user 2.39s system
# du -sm test.dbf
103 test.dbf

上面测试的数据量比较小,仅作为参考.

相比两种方法:
前者是linux上专业的测试IDE/ATA磁盘的工具,但是使用范围有局限性;(此试验仅仅使用了测试磁盘IO的参数,对于其他参数及解释参考man手册)
后者可以通用,但不够专业,也没有考虑到缓存和物理读的区分,测试的数据也是仅作参考,不能算是权威.

/usr/bin/ld: cannot find -lxxx 的解决办法

在软件编译过程中,经常会碰到类似这样的编译错误:

/usr/bin/ld: cannot find -lhdf5

这表示找不到库文件 libhdf5.so,若是其它库文件,则是 cannot find -lxxx 了,其中 xxx 是库文件的名字。

解决方法有:

1. 安装此库文件和相关软件

一般库文件属于某个软件,google搜索该软件并安装,或者使用 yum 安装。

2. 将库文件所在路径添加到gcc的搜索路径

使用以下命令查询gcc能否搜寻到指定的库文件:

$ gcc -lhdf5 --verbose

查询库文件 libhdf5.so 是否能在搜索路径中找到。

若安装了软件,找到了库文件的路径。但是依然会提示上述错误。则表示gcc的搜索路径不包含该库文件所在的路径。将库文件所在的路径加入到搜寻路径中的方法为:

2.1 使用 /etc/ld.so.conf 配置文件

将库文件所在的路径加入到 /etc/ld.so.conf 尾部,并使之生效:

$ sudo echo '/opt/biosoft/hdf5-1.8.15-patch1/lib/' >> /etc/ld.so.conf
libhdf5.so 在路径 /opt/biosoft/hdf5-1.8.15-patch1/lib/ 下,将该路径加添加到配置文件中
$ sudo ldconfig
运行该命令,重新载入 /ext/ld.so.conf 中的路径,使修改生效。

2.2 修改环境变量

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/biosoft/hdf5-1.8.15-patch1/lib/
修改环境变量 LD_LIBRARY_PATH,加入库文件所在路径。使用 export 命令使修改生效。

$ echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/biosoft/hdf5-1.8.15-patch1/lib/' >> ~/.bashrc
$ source ~/.bashrc
将上述 export 命令加入到配置文件 ~/.bashrc,使之永久生效。

$ export LIBRARY_PATH=/opt/biosoft/hdf5-1.8.15-patch1/lib/:$LIBRARY_PATH
若修改变量 LD_LIBRARY_PATH 不奏效,则修改变量 LIBRARY_PATH 。

DISCOVAR的使用

1. DISCOVAR简介

DISCOVAR 是有 ALLPATHS-LG 软件开发团队做出来的软件。主要用于利用 PE 250bp 数据与参考基因组的比对结果,对基因组进行 Variants calling 的同时,进行基因组的组装。特别是近期公布的 DISCOVAR de novo (experimental) 还能进行基因组的 De novo 组装。

2. DISCOVAR的下载和安装

2.1 DISCOVAR的下载和安装

此软件的安装需要GCC 4.7或以上版本。

$ wget ftp://ftp.broadinstitute.org/pub/crd/Discovar/latest_source_code/LATEST_VERSION.tar.gz
$ tar zxf LATEST_VERSION.tar.gz
$ cd discov*
$ ./configure --prefix=/opt/biosoft/discovar && make -j 4 && make install
$ cd ..
$ rm -rf discov* LATEST_VERSION.tar.gz

2.2 DISCOVAR Denovo的下载和安装

此软件的安装需要GCC 4.7或以上版本,jemalloc 3.6.0或以上版本和samtools(如果使用bam文件,则需要)。

$ wget ftp://ftp.broadinstitute.org/pub/crd/DiscovarExp/LATEST_VERSION.tar.gz
$ tar zxf LATEST_VERSION.tar.gz
$ cd discov*
$ sudo yum install *malloc*
如果没有上一步,则在make过程中会提示错误“/usr/bin/ld: cannot find -ljemalloc”
$ ./configure --prefix=/opt/biosoft/discovarDenovo && make -j 4 && make install
$ echo 'export MALLOC_PER_THREAD=1' >> ~/.bashrc
上一步设置用于allowing per-threads memory management,能提高计算性能。
$ cd ..
$ rm -rf discov* LATEST_VERSION.tar.gz

3. 软件使用的注意事项

1. 强烈推荐使用 PCR-free protocol library 数据;数据量推荐为 ~60x,略大于或小于该值也是 OK 的。
2. 必须使用 Illumina MiSeq 或 HiSeq 2500 测序仪产生的 >=250 bp 长度的 Paired End 数据,并且首尾 reads 要有重叠。如果 PE 250bp 数据,则 Insert Size 长度要为 400-500 bp(需要注意的是软件的 manual 中可能写成 700bp,这是不对的)。
3. 只能使用一个文库的数据。,不支持输入 mate paired 数据。
4. DISCOVAR de novo (experimental) 能进行基因组的 de novo 组装,支持基因组大小可达 ~3 GB。

3. 软件的使用

3.1 DISCOVAR 的使用

软件的输入文件是 sort 过后的 Bam 文件,一个常用例子:

$ Discovar READS=sample-reads.bam REFERENCE=sample-genome.fasta              \
         REGIONS='10:30892106-30933760' OUT_HEAD=./discovar-variants/assembly\
         TMP=./discovar-variants/tmp

软件常用参数:

READS (String)
由逗号分割的一些 bam 文件,或内容为每行一个bam文件路径的 list 文件。
REGIONS (String)
对指定区域进行分析。多个区域则用逗号分割。区域的写法为 chr:start-sotp。如果 REGIONS=all,则对所有区域进行分析。
TMP (String)
指定临时文件路径
OUT_HEAD (String)
输出文件的前缀路径
NUM_THREADS (unsigned int) default: 0
使用的线程数。
REFERENCE (String)
参考序列 fasta 文件。若提供此文件,则能进行 variant calling,并给出 VCF 文件。

3.2 DISCOVAR de novo (experimental) 的使用

软件的输入文件是 sort 过后的 Bam 文件。程序在运行的时候会使用最大的线程数进行运算。

$ DiscovarExp --help special
上述命令用来查看软件的详细参数。
$ DiscovarExp READS=sample-reads.bam OUT_DIR=discovarexpOut
上述是软件的常用命令。同时,软件的参数非常少。
$ ls discovarexpOut/a.final/a.lines.fasta
查看主要结果。

4. DISCOVAR结果

4.1 结果表现形式

Understanding DISCOVAR output
图中,每个单独的箭头称为 edge,这些 edges 代表着序列;从起点到终点,有很多种不同的路径,称之为 lines;上图中有 4 个 cells,其中 3 个 cells 有 2 个 paths,有 1 个 cell 有 3 个 paths。
这种 multiple paths 可能表示:杂合位点;染色体变异;难以测序的位点等。

4.2 DISCOVAR 结果文件

生成的结果文件位于 discovar-variants/ 文件夹下,主要的结果文件是:

assembly.final.fasta 所有的 edges 序列 (edges overlap by K-1 bases)
assembly.final.fasta0 所有的 edges 序列 (without overlaps)
assembly.final.dot dot格式的组装图
assembly.final.variant VCF结果文件

4.3 DISCOVAR de novo 结果文件

生成的结果文件位于 discovarexpOut/a.final/ 文件夹下,主要结果文件有:

a.lines.fasta 多个 paths 中仅选择第一个 path,得到的 lines 序列的 fasta 文件。
a.lines.efasta 标准的 efasta 文件,有所有的 paths 结果。
a.fasta 所有的 edges 序列
a.lines 二进制文件
a.lines.src 上一个文件的文本形式结果

5. 总结

Discovar 能根据 Illumina 测序数据比对到基因组上的结果来进行基因组 de novo 组装,得到 edges 序列;若在提供了基因组序列的情况下,还能进行 Vaiants calling。
Discovar de novo (experimental) 能根据 Illumina 测序数据比对到基因组上的结果来进行基因组 de novo 组装,得到 edges 序列。相比与前者,还能得到 lines 序列,这是比较完整的序列文件。