STAR和BWA比对软件使用;samtools使用

介绍

BWASTAR作为ENCODE的御用软件,分别用于DNA-seq和RNA-seq

DNA-seq和RNA-seq区别,由于RNA形成中有外显子,区别显然在与区别仅在于是否会考虑跨外显子的比对(即:是否会将没有比对上的reads劈开,对劈开后的两部分再次比对)。

  • DNA-seq:bowtie;bowtie2;BWA
  • RNA-seq:STAR;HISAT2;Tophat
    这里我们主要介绍ENCODE的御用软件
    samtools是一个用于操作sam和bam文件的工具合集,和上面BWA一样都是大佬李恒开发的。题外话;开发高效软件只要用你的软件就算引用这引用真的高。

使用

STAR

下载安装

1
2
3
wget -c https://github.com/alexdobin/STAR/archive/2.7.3a.tar.gz
tar -xvzf 2.7.3a.tar.gz
cd STAR-2.7.3a

构建index

1
2
3
4
5
6
7
STAR
--runThreadN NumberOfThreads
--runMode genomeGenerate
--genomeDir /path/to/genomeDir
--genomeFastaFiles /path/to/genome/fasta1 /path/to/genome/fasta2 ...
--sjdbGTFfile /path/to/annotations.gtf
--sjdbOverhang ReadLength-1

--runThreadN :设置线程数
--genomeDir :index输出的路径
--genomeFastaFiles :参考基因组序列
--sjdbGTFfile :参考基因组注释文件
--sjdbOverhang :这个是reads长度的最大值减1,默认是100
--sjdbFileChrStartEnd:与注释(通过--sjdbGTFfile选项)一起生成新的基因组索引
第二遍映射。这需要对所有样本只做一次。

进行mapping

1
2
3
4
5
6
STAR
--runThreadN NumberOfThreads
--genomeDir /path/to/genomeDir
--outSAMtype BAM SortedByCoordinate
--readFilesIn /path/to/read1 [/path/to/read2 ]
--readFilesCommand UncompressionCommand

--twopassMode Basic:使用two-pass模式进行reads比对。简单来说就是先按索引进行第一次比对,而后把第一次比对发现的新剪切位点信息加入到索引中进行第二次比对。
--quantMode TranscriptomeSAM GeneCounts:将reads比对至转录本序列。
--runThreadN:线程数。
--genomeDir:索引目录。
--alignIntronMin:最短的内含子长度。(根据GTF文件计算)
--alignIntronMax:最长的内含子长度。(根据GTF文件计算)
--outSAMtype BAM SortedByCoordinate:输出BAM文件并进行排序。
--sjdbOverhang:reads长度减1。
--outSAMattrRGline:ID代表样本ID,SM代表样本名称,PL为测序平台。在使用GATK进行SNP Calling时同一SM的样本可以合并在一起。
--outFilterMismatchNmax:比对时允许的最大错配数。
--outSJfilterReads Unique:对于跨越剪切位点的reads(junction reads),只考虑跨越唯一剪切位点的reads。

--outSAMtype :表示输出默认排序的bam文件,类似于samtools sort(还有–outSAMtype BAM Unsorted和–outSAMtype BAM Unsorted SortedByCoordinate)

--outSAMmultNmax:每条reads输出比对结果的数量。
--outFileNamePrefix:输出文件前缀。
--outSAMmapqUnique 60:将uniquely mapping reads的MAPQ值调整为60,满足下游使用GATK进行分析的需要。
--readFilesCommand:对FASTQ文件进行操作。
--readFilesIn:输入FASTQ文件的路径。

两次mapping

STAR 2-pass mode

为了发现更加灵敏的new junction,STAR建议使用2-pass mode,其能增加检测到的new junction数目,使得更多的splices reads能mapping到new junction。因此STAR先用一般参数做一遍mapping,收集检测到的junction信息,然后利用这已经annotated junction来做第二次mapping。

首先做一遍常规的比对,结果中会生成一个SJ.out.tab文件,如上面所提到的,然后用--sjdbFileChrStartEnd参数将所有样品的SJ.out.tab文件作为输入的annotated junction进行第二次建index。


上述方法original方法适用于多样本和单个样本的处理,但是如果是per-sample(单个样本?)的2-pass mapping,可以直接用--twopassMode Basic参数将第两步mapping中的make index省去,直接再mapping。

如果不清楚请使用STAR帮助文档

STARmanual

BWA(Burrows-Wheeler-Alignment Tool)

BWA 的三种模式

  • BWA-backtrack: 是用来比对 Illumina 的序列的,reads 长度最长能到 100bp。

  • BWA-SW: 用于比对 long-read ,支持的长度为 70bp-1Mbp;同时支持剪接性比对。

  • BWA-MEM: 推荐使用的算法,支持较长的read长度,同时支持剪接性比对(split alignments),但是BWA-MEM是更新的算1法,也更快,更准确,且 BWA-MEM 对于 70bp-100bp 的 Illumina 数据来说,效果也更好些。

下载安装

  1. 下载tar

    下载BWA http://bio-bwa.sourceforge.net/bwa.shtml

1
2
3
4
5
6
7
#解压
$ tar -jxvf bwa-*.tar.bz2
$ cd bwa-*;
# 编译BWA
$ make
$ echo 'PATH=$PATH:/path/bwa--*' >> ~/.bashrc
$ source ~/.bashrc
  1. git
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
git clone https://github.com/lh3/bwa.git
cd bwa
make
##command
Command: index index sequences in the FASTA format
mem BWA-MEM algorithm
fastmap identify super-maximal exact matches
pemerge merge overlapping paired ends (EXPERIMENTAL)
aln gapped/ungapped alignment
samse generate alignment (single ended)
sampe generate alignment (paired ended)
bwasw BWA-SW for long queries
shm manage indices in shared memory
fa2pac convert FASTA to PAC format
pac2bwt generate BWT from PAC
pac2bwtgen alternative algorithm for generating BWT
bwtupdate update .bwt to the new format
bwt2sa generate SA from BWT and Occ

构建index

1
2
3
bwa index [ –p prefix ] [ –a algoType ] <in.db.fasta>
# 根据reference genome data(e.g. ref.fa) 建立 Index File:
bwa index ref.fa -p genome # 可以不加-p genome,这样建立索引都是以ref.fa为前缀

进行mapping

BWA-MEM 算法

该算法先使用 MEM(maximal exact matches) 进行 seeding alignments,再使用 SW(affine-gap Smith-Waterman) 算法进行 seeds 的延伸。BWA–MEM 算法执行局部比对和剪接性。可能会出现 query 序列的多个不同的部位出现各自的最优匹配,导致 reads 有多个最佳匹配位点。有些软件如 Picard’s markDuplicates 跟 mem 的这种剪接性比对不兼容,在这种情况下,可以使用 –M 选项来将 shorter split hits 标记为次优。

1
bwa mem [options] ref.fa reads.fq [mates.fq]

-t INT 线程数,默认是1,增加线程数,会减少运行时间。
 -M 将 shorter split hits 标记为次优,以兼容 Picard’s markDuplicates 软件。
 -p 若无此参数:输入文件只有1个,则进行单端比对;若输入文件有2个,则作为paired reads进行比对。若加入此参数:则仅以第1个文件作为输入(会忽略第二个输入序列文件,把第一个文件当做单端测序的数据进行比对),该文件必须是read1.fq和read2.fa进行reads交叉的数据。
 -R STR 完整的read group的头部,可以用 ‘\t’ 作为分隔符, 在输出的SAM文件中被解释为制表符TAB. read group 的ID,会被添加到输出文件的每一个read的头部。
 -T INT 当比对的分值比 INT 小时,不输出该比对结果,这个参数只影响输出的结果,不影响比对的过程。
 -a 将所有的比对结果都输出,包括 single-end 和 unpaired paired-end的 reads,但是这些比对的结果会被标记为次优。
 -Y 对数据进行soft clipping, 当错配或者gap数过多比对不上时,会对序列进行切除,这里的切除并只是在比对时去掉这部分序列,最终输出结果中序列还是存在的,所以称为soft clipping。

BWA其他算法

详情请见BWAmanual

SAMtools

samtools是一个用于操作sam和bam文件的工具合集。能够实现二进制查看、格式转换、排序及合并等功能,结合sam格式中的flag、tag等信息,还可以完成比对结果的统计汇总。同时利用linux中的grep、awk等操作命令,还可以大大扩展samtools的使用范围与功能。包含有许多命令。

下载安装

https://github.com/samtools/samtools/releases/

1
2
3
4
5
6
7
8
9
mkdir ~/biosoft/samtools
cd ~/biosoft/samtools
wget -c https://github.com/samtools/samtools/releases/download/1.9/samtools-1.9.tar.bz2
tar jxvf samtools-1.9.tar.bz2
./configure --prefix=~/biosoft/samtools-1.9
make
make install
echo 'export PATH="/home/vip47/biosoft/samtools-1.9/bin:$PATH" ' >>~/.bashrc
source ~/.bashrc

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$samtools

Program: samtools (Tools for alignments in the SAM format)
Version: 1.9 (using htslib 1.9)

Usage: samtools <command> [options]

Commands:
-- Indexing
dict create a sequence dictionary file
faidx index/extract FASTA
fqidx index/extract FASTQ
index index alignment

-- Editing
calmd recalculate MD/NM tags and '=' bases
fixmate fix mate information
reheader replace BAM header
targetcut cut fosmid regions (for fosmid pool only)
addreplacerg adds or replaces RG tags
markdup mark duplicates

-- File operations
collate shuffle and group alignments by name
cat concatenate BAMs
merge merge sorted alignments
mpileup multi-way pileup
sort sort alignment file
split splits a file by read group
quickcheck quickly check if SAM/BAM/CRAM file appears intact
fastq converts a BAM to a FASTQ
fasta converts a BAM to a FASTA

-- Statistics
bedcov read depth per BED region
depth compute the depth
flagstat simple stats
idxstats BAM index stats
phase phase heterozygotes
stats generate stats (former bamcheck)

-- Viewing
flags explain BAM flags
tview text alignment viewer
view SAM<->BAM<->CRAM conversion
depad convert padded BAM to unpadded BAM
  1. view
1
2
3
view命令的主要功能是:将sam文件与bam文件互换;然后对bam文件进行各种操作,比如数据的排序(sort)和提取(这些操作是对bam文件进行的,因而当输入为sam文件的时候,不能进行该操作);最后将排序或提取得到的数据输出为bam或sam(默认的)格式。
bam文件优点:bam文件为二进制文件,占用的磁盘空间比sam文本文件小;利用bam二进制文件的运算速度快。
view命令中,对sam文件头部(序列ID)的输入(-t或-T)和输出(-h)是单独的一些参数来控制的。

Usage: samtools view [options] | [region1 […]]
下面的view命令的部分参数
默认情况下不加 region,则是输出所有的 region.options:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-b output BAM  
# 该参数设置输出 BAM 格式,默认下输出是 SAM 格式文件
-h print header for the SAM output
# 默认下输出的 sam 格式文件不带 header,该参数设定输出sam文件时带 header 信息
-H print SAM header only (no alignments)
# 仅仅输出文件的头文件
-S input is SAM
# 默认下输入是 BAM 文件,若是输入是 SAM 文件,则最好加该参数,否则有时候会报错。
-u uncompressed BAM output (force -b)
# 该参数的使用需要有-b参数,能节约时间,但是需要更多磁盘空间。
-c print only the count of matching records
# 仅输出匹配的统计记录
-L FILE only include reads overlapping this BED FILE [null]
# 仅包括和bed文件存在overlap的reads
-o FILE output file name [stdout]
# 输出文件的名称
-F INT only include reads with none of the FLAGS in INT present [0]
# 过滤flag,仅输出指定FLAG值的序列
-q INT only include reads with mapping quality >= INT [0]
# 比对的最低质量值,一般认为20就为unique比对了,可以结合上述-bF参数使用使用提取特定的比对结果
-@ Number of additional threads to use [0]
# 指使用的线程数

所有例子在example文件下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 将sam文件转换成bam文件
samtools view -bS abc.sam > abc.bam

# BAM转换为SAM
samtools view -h -o out.sam out.bam

# 提取比对到参考序列上的比对结果
samtools view -bF 4 abc.bam > abc.F.bam

# 提取paired reads中两条reads都比对到参考序列上的比对结果,只需要把两个4+8的值12作为过滤参数即可
samtools view -bF 12 abc.bam > abc.F12.bam

# 提取没有比对到参考序列上的比对结果
samtools view -bf 4 abc.bam > abc.f.bam

# 提取bam文件中比对到caffold1上的比对结果,并保存到sam文件格式
samtools view abc.bam scaffold1 > scaffold1.sam

# 提取scaffold1上能比对到30k到100k区域的比对结果
samtools view abc.bam scaffold1:30000-100000 $gt; scaffold1_30k-100k.sam

# 根据fasta文件,将 header 加入到 sam 或 bam 文件中
samtools view -T genome.fasta -h scaffold1.sam > scaffold1.h.sam
  1. sort

    sort对bam文件进行排序。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Usage: samtools sort [option] <in.bam> -o <out.prefix>  
    -n Sort by read name
    #设定排序方式按short reads的ID排序。默认下是按序列在fasta文件中的顺序(即header)和序列从左往右的位点排序。

    -m INT Set maximum memory per thread; suffix K/M/G recognized [768M]
    # 设置每个线程的最大内存,单位可以是K/M/G,默认是 768M。对于处理大数据时,如果内存够用,则设置大点的值,以节约时间。

    -t TAG Sort by value of TAG. Uses position as secondary index (or read name if -n is set)
    # 按照TAG值排序

    -o FILE Write final output to FILE rather than standard output
    # 输出到文件中,加文件名
1
2
3
#  tmp.bam 按照序列名称排序,并将结果输出到tmp.sort.bam  
samtools sort -n tmp.bam -o tmp.sort.bam
samtools view tmp.sort.bam
  1. merge & cat

merge将多个已经sort了的bam文件融合成一个bam文件。融合后的文件不需要则是已经sort过了的。而cat命令不需要将bam文件进行sort。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Usage: samtools merge [-nurlf] [-h inh.sam] [-b <bamlist.fofn>] <out.bam> <in1.bam> [<in2.bam> ... <inN.bam>]

Options:
-n Input files are sorted by read name
# 输入文件是经过sort -n的
-t TAG Input files are sorted by TAG value
# 输入文件是经过sort -t的
-r Attach RG tag (inferred from file names)
# 添加上RG标签
-u Uncompressed BAM output
# 输出未压缩的bam
-f Overwrite the output BAM if exist
# 覆盖已经存在的bam
-1 Compress level 1
# 1倍压缩
-l INT Compression level, from 0 to 9 [-1]
# 指定压缩倍数
-R STR Merge file in the specified region STR [all]
-h FILE Copy the header in FILE to <out.bam> [in1.bam]
1
2
3
4
5
6
7
$samtools cat
Usage: samtools cat [options] <in1.bam> [... <inN.bam>]
samtools cat [options] <in1.cram> [... <inN.cram>]

Options: -b FILE list of input BAM/CRAM file names, one per line
-h FILE copy the header from FILE [default is 1st input file]
-o FILE output BAM/CRAM
  1. index

对排序后的序列建立索引,并输出为bai文件,用于快速随机处理。在很多情况下,特别是需要显示比对序列的时候,bai文件是必不可少的,例如之后的tview命令。

1
2
3
samtools index <in.bam> [out.index]

samtools index abc.sort.bam
  1. faidx

fasta文件建立索引,生成的索引文件以.fai后缀结尾。该命令也能依据索引文件快速提取fasta文件中的某一条(子)序列。

1
samtools faidx <file.fa|file.fa.gz> [<reg> [...]]samtools faidx <file.fa|file.fa.gz> [<reg> [...]]
1
2
3
4
5
samtools faidx genome.fasta
# 生成了索引文件genome.fasta.fai,是一个文本文件,分成了5列。第一列是子序列的名称;第二列是子序列的长度;个人认为“第三列是序列所在的位置”,因为该数字从上往下逐渐变大,最后的数字是genome.fasta文件的大小;第4和5列不知是啥意思。于是通过此文件,可以定位子序列在fasta文件在磁盘上的存放位置,直接快速调出子序列。

# 由于有索引文件,可以使用以下命令很快从基因组中提取到fasta格式的子序列
samtools faidx genome.fasta scffold_10 > scaffold_10.fasta
  1. tview

能直观的显示出reads比对基因组的情况,和基因组浏览器有点类似。可视化一般用IGV比较好,不建议用tview

1
samtools tview <aln.bam> [ref.fasta]

其他命令

请看帮助文档samtools