samtools是一个用于操作sam和bam文件的工具集合。
1. view
view命令的主要功能是:将输入文件转换成输出文件,通常是将比对后的sam文件转换为bam文件,然后对bam文件进行各种操作,比如数据的排序(和提取(这些操作是对bam文件进行的,因而当输入为sam文件的时候,不能进行该操作)。
bam文件优点:
(1)bam文件为二进制文件,占用的磁盘空间比sam文本文件小;
(2)利用bam二进制文件的运算速度快。
view命令中,对sam文件头部的输入(-t
或-T
)和输出(-h
)是单独的一些参数来控制的。
Usage: samtools view [options] | [region1 [...]]
默认情况下不加 region,则是输出所有的 region.
Options:
-b
output BAM
默认下输出是 SAM 格式文件,该参数设置输出 BAM 格式
-h
print header for the SAM output
默认下输出的 sam 格式文件不带 header,该参数设定输出sam文件时带 header 信息
-H
print header only (no alignments)
-S
input is SAM
默认下输入是 BAM 文件,若是输入是 SAM 文件,则最好加该参数,否则有时候会报错。
-u
uncompressed BAM output (force -b)
该参数的使用需要有-b参数,能节约时间,但是需要更多磁盘空间。
-c
Instead of printing the alignments, only count them and print the total number. All filter options, such as ‘-f’, ‘-F’ and ‘-q’ , are taken into account.
-1
fast compression (force -b)
-x
output FLAG in HEX (samtools-C specific)
-X
output FLAG in string (samtools-C specific)
-c
print only the count of matching records
-L
FILE output alignments overlapping the input BED FILE [null]
-t
FILE list of reference names and lengths (force -S) [null]
使用一个list文件来作为header的输入
-T
FILE reference sequence file (force -S) [null]
使用序列fasta文件作为header的输入
-o
FILE output file name [stdout]
-R
FILE list of read groups to be outputted [null]
-f
INT required flag, 0 for unset [0]
-F
INT filtering flag, 0 for unset [0]
Skip alignments with bits present in INT [0]
数字4代表该序列没有比对到参考序列上
数字8代表该序列的mate序列没有比对到参考序列上
-q
INT minimum mapping quality [0]
-l
STR only output reads in library STR [null]
-r
STR only output reads in read group STR [null]
-s
FLOAT fraction of templates to subsample; integer part as seed [-1]
-?
longer help
如果没有指定option和region选项,则会在屏幕中显示sam格式的文件,如下所示。
例子:
(1)将sam文件和bam文件相互转换。注意:没有header的sam文件不能转换成bam文件。
$ samtools view -bS lane.sam > lane.bam
$ samtools view -b -S lane.bam -o lane.sam
samtools view -h NA12878.bam >NA12878_2.sam
(2)提取比对到参考序列上的比对结果 F
$ samtools view -bF 4 lane.bam > lane.F.bam
(3)提取paired reads中两条reads都比对到参考序列上的比对结果,只需要把两个4+8的值12作为过滤参数即可
$ samtools view -bF 12 lane.bam > lane.F12.bam
(4)提取没有比对到参考序列上的比对结果 f
$ samtools view -bf 4 lane.bam > lane.f.bam
(5)提取paired reads中比对到参考基因组上的数据
$ samtools view -b -F 4 -f 8 lane.sam > only.read1.mapped.bam
$ samtools view -b -F 8 -f 4 lane.sam > only.read2.mapped.bam
$ samtools view -b -F 12 lane.sam > all.mapped.read1.read2.bam
(6)提取bam文件中比对到caffold1上的比对结果,并保存到sam文件格式
$ samtools view lane.bam scaffold1 > scaffold1.sam
(7)提取scaffold1上能比对到30k到100k区域的比对结果
$ samtools view lane.bam scaffold1:30000-100000 $gt; scaffold1_30k-100k.sam
(8)根据fasta文件,将 header 加入到 sam 或 bam 文件中
$ samtools view -T genome.fasta -h scaffold1.sam > scaffold1.h.sam
(9)sam 和 bam 格式转换
#BAM转换为SAM
$ samtools view -h -o out.sam out.bam
#SAM转换为BAM
$ samtools view -bS out.sam >out.bam
-b 意思使输出使BAM format
-S 意思使输入使SAM,如果@SQ 缺剩, 要写-t 所以如果没有@SQ
samtools faidx ref.fa
samtools view -bt ref.fa.fai out.sam > out.bam
2. sort
对bam文件进行排序,不能对sam文件进行排序。以leftmost coordinates的方式对比对结果进行排序,或者使用-n参数以read名称进行排序。将会添加适当的@HD-SO排序顺序标头标签或者如果有必要的话,将会更新现存的一个排序顺序标头标签。sort命令的输出默认是标准输出写入,或者使用-o参数时,指定bam文件输出名。sort命令还会在内存不足时创建临时文件tmpprefix.%d.bam
Usage: samtools sort [-l level] [-m maxMem] [-o out.bam] [-O format] [-n] [-T tmpprefix] [-@ threads] [in.sam|in.bam|in.cram]
Options:
-m
设置每个线程运行时的内存大小,可以使用K,M和G表示内存大小。默认下是 500,000,000 即500M。对于处理大数据时,如果内存够用,则设置大点的值,以节约时间。
-n
设置按照read名称进行排序。默认下是按序列在fasta文件中的顺序(即header)和序列从左往右的位点排序。
-l
INT 设置输出文件压缩等级。0-9,0是不压缩,9是压缩等级最高。不设置此参数时,使用默认压缩等级;
-o
FILE 设置最终排序后的输出文件名;
-O
FORMAT 设置最终输出的文件格式,可以是bam,sam或者cram,默认为bam;
-T
PREFIX 设置临时文件的前缀;
-@
INT 设置排序和压缩是的线程数量,默认是单线程。
例子:
$ samtools sort abc.bam abc.sort #注意 abc.sort 是输出文件的前缀,实际输出是 abc.sort.bam
$ samtools view abc.sort.bam | less -S
$ samtools sort -l 9 -m 90M -o abc.sorted.bam -T sorted -@ 2 abc.bam
3.merge
当有多个样本的bam文件时,可以使用samtools的merge命令将这些bam文件进行合并为一个bam文件。。Merge命令将多个已经排序后的bam文件合并成为一个排序的且保持所有输入记录并保持现有排序顺序的bam文件。
Usage: samtools merge [-nur1f] [-h inh.sam] [-R reg] [-b ] […
Options:
-1
指定压缩等级;
-b
FILE 输入文件列表,一个文件一行;
-f
overwrite the output BAM if exist 强制覆盖同名输出文件;
-h
FILE copy the header in FILE to
-n
sort by read names。设定输入比对文件是以read名进行排序的而不是以染色体坐标排序的;
-R
STR merge file in the specified region STR [all]。合并输入文件的指定区域;
-r
attach RG tag (inferred from file names)。使RG标签添加到每一个比对文件上,标签值来自文件名;
-u
uncompressed BAM output。输出的bam文件不压缩;
-c
当多个输入文件包含相同的@RG头ID时,只保留第一个到合并后输出的文件。当合并多个相同样本的不同文件时,非常有用。
-p
与-c参数类似,对于要合并的每一个文件中的@PG ID只保留第一个文件中的@PG。
例子
#合并test_L1.bam和test_L2.bam文件
$ samtools merge -h test.sam \
test_L1_L2.bam \
test_L1.sorted.bam \
test_L2.sroted.bam
#合并test_L1.bam和test_L2.bam文件中的指定区域chr7
$ samtools merge -h test.sam \
-R chr7
test_L1_L2.bam \
test_L1.sorted.bam \
test_L2.sroted.bam
Note: Samtools' merge does not reconstruct the @RG dictionary in the header. Users must provide the correct header with -h, or uses Picard which properly maintains the header dictionary in merging.
4.index
为了能够快速访问bam文件,可以为已经基于坐标排序后bam或者cram的文件创建索引,生成以.bai或者.crai为后缀的索引文件。必须使用排序后的文件,否则可能会报错。另外,不能对sam文件使用此命令。如果想对sam文件建立索引,那么可以使用tabix命令创建。
Usage: samtools index [-bc] [-m INT] aln.bam |aln.cram [out.index]
Options:
-b
创建bai索引文件,未指定输出格式时,此参数为默认参数;
-c
创建csi索引文件,默认情况下,索引的最小间隔值为2^14,与bai格式一致;
-m
INT 创建csi索引文件,最小间隔值2^INT;
例子:
#创建bai索引
$ samtools index test_2.sorted.bam
$ smatools index -b test_2.sorted.bam
#创建csi索引
$ samtools index -c test_2.sorted.bam
$ samtools index -c -m 10 test_2.sorted.bam
以下两种命令结果一样
$ samtools index abc.sort.bam
$ samtools index abc.sort.bam abc.sort.bam.bai
5. faidx
对fasta文件建立索引,生成的索引文件以.fai后缀结尾。该命令也能依据索引文件快速提取fasta文件中的某一条(子)序列.如果没有指定区域,faidx命令就创建文件索引并生成后缀为.fai的索引文件。如果指定区域,那么就是生产并显示fasta格式的子序列。输入文件可以使BGZF压缩格式的文件。
输入文件中的序列要有不同的名称。如果不是这样,即存在相同名称的序列,在建立索引的过程中将发出有关重复序列的警告而且生产的同名子序列的信息都要被第一个同名子序列的信息覆盖。
Usage: samtools faidx [region1,…]
例:对基因组文件建立索引
$ samtools faidx genome.fasta
上图中先显示了待处理的test.fasta文件的内容,由4个长度不一的序列组成,其中前两个重名。然后使用faidx命令进行处理。最后在显示生产索引文件test.fasta.fai的内容。
生成了索引文件fasta.fai,是一个文本文件,分成了5列。
- 第1列是子序列的名称,每个序列”>”之后到第一个空格之前的所有字符;
- 第2列是序列长度,单位为bp;
- 第3列是OFFSET,第一个碱基的偏移量,以0为起始值。序列所在的位置”,因为该数字从上往下逐渐变大,最后的数字是genome.fasta文件的大小;
- 第4列LINEBASES,除了最后一行以外,其他代表序列的碱基数,单位为bp;
- 第5列行宽(LINEWIDTH),除了最后一行以外,其他代表序列的长度,包括换行符。注:windows系统中换行符为\r\n,要在序列长度的基础上加2。
于是通过此文件,可以定位子序列在fasta文件在磁盘上的存放位置,直接快速调出子序列。
由于有索引文件,可以使用以下命令很快从基因组中提取到fasta格式的子序列
$ samtools faidx genome.fasta scffold_10 > scaffold_10.fasta
提取序列如下图:
6. tview
tview能直观的显示出reads比对基因组的情况,和基因组浏览器有点类似。
Usage: samtools tview [ref.fasta]
当给出参考基因组的时候,会在第一排显示参考基因组的序列,否则,第一排全用N表示。
按下 g ,则提示输入要到达基因组的某一个位点。例子“scaffold_10:1000"表示到达第10号scaffold的第1000个碱基位点处。
使用H(左)J(上)K(下)L(右)移动显示界面。大写字母移动快,小写字母移动慢。
使用空格建向左快速移动(和 L 类似),使用Backspace键向左快速移动(和 H 类似)。
Ctrl+H 向左移动1kb碱基距离; Ctrl+L 向右移动1kb碱基距离
可以用颜色标注比对质量,碱基质量,核苷酸等。30~40的碱基质量或比对质量使用白色表示;20~30黄色;10~20绿色;0~10蓝色。
使用点号'.'切换显示碱基和点号;使用r切换显示read name等
还有很多其它的使用说明,具体按 ? 键来查看。
7. flagstat
统计输入文件的相关数据并将这些数据输出至屏幕显示。每一项统计数据都由两部分组成,分别是QC pass和QC failed,表示通过QC的reads数据量和未通过QC的reads数量。以“PASS + FAILED”格式显示。
Usage: samtools flagstat | |
例如
4835105 + 0 in total (QC-passed reads + QC-failed reads) # QC pass的reads的数量为4835105 ,未通过QC的reads数量为0,意味着总reads数为4835105条;
529 + 0 secondary
0 + 0 supplementary
0 + 0 duplicates # 重复reads的数量,QC pass和failed
4719540 + 0 mapped (97.61% : N/A) # 比对到参考基因组上的reads数量(总体上,reads的匹配率);
4834576 + 0 paired in sequencing # paired reads数据数量(有多少reads是属于paired reads)
2417288 + 0 read1 # read1的数量;
2417288 + 0 read2 # read2 的数量;
4698524 + 0 properly paired (97.19% : N/A) # 完美匹配的reads数:比对到同一条参考序列,并且两条reads之间的距离符合设置的阈值;
4718936 + 0 with itself and mate mapped # 一对reads都比对到了参考序列上的reads数,但是并不一定比对到同一条染色体上;
75 + 0 singletons (0.00% : N/A) # 一对reads中只有一条与参考序列相匹配的reads数,和上一个相加,则是总的匹配上的;
10646 + 0 with mate mapped to a different chr # 一对reads比对到不同染色体的reads数;
10414 + 0 with mate mapped to a different chr (mapQ>=5) # 一对reads比对到不同染色体的且比对质量值大于5的reads数;
7. depth
得到每个碱基位点或者区域的测序深度,并输出到标准输出。depth命令计算每一个位点的测序深度并在标准显示设备中显示。注意:使用此命令之前必须先samtools index。
Usage: samtools depth [options] [in1.bam|in1.sam|in1.cram[in2.bam|in2.sam|in2.cram]…]
Options:
-a
输出所有位点,包括零深度的位点;-a –a,--aa 完全输出所有位点,包括未使用到的参考序列;
-b
FILE 计算BED文件中指定位置或区域的深度;
-f
FiLE 使用在FILE中的指定bam文件;
-I
INT 忽略掉小于此INT值的reads;
-q
INT 只计算碱基质量值大于此值的reads;
-Q
INT 只计算比对质量值大于此值的reads;
-r
CHR:FROM –TO 只计算指定区域的reads,后面跟染色体号(region)
示例:
$ samtools depth in.bam > out.depth.txt
注意: in.bam 必须经过了排序。
depth命令运行如下图所示:
一共得到3列以指标分隔符分隔的数据,第一列为染色体名称,第二列为位点,第三列为覆盖深度。
8. mpileup
该命令用于生成bcf文件,再使用bcftools进行SNP和Indel的分析。bcftools是samtool中附带的软件,在samtools的安装文件夹中可以找到。
Usage: samtools mpileup [-EBug] [-C *capQcoef*] [-r *reg*] [-f *in.fa*] [-l *list*] [-M *capMapQ*] [-Q *minBaseQ*] [-q *minMapQ*] *in.bam* [*in2.bam* [*...*]]
Options:
-f
–来输入有索引文件的fasta参考序列;
-F
–gap-frac FLOAT 含有间隔reads的最小片段。
-l
–positions FILE BED文件或者包含区域位点的位置列表文件。位置文件包含两列,染色体和位置,从1开始计数。BED文件至少包含3列,染色体、开始位置和结束位置,开始端从0开始计数。
-r
–region STR 只在指定区域产生pileup,需要已建立索引的bam文件。通常和-l参数一起使用。
-o
–output FILE 生成pileup格式文件或者VCF、BCF文件而不是默认的标准输出。
-g
–BCF 计算基因型的似然值和输出文件格式为BCF。
-v
–VCF 计算基因型的似然值和输出文件格式为VCF。
-C
--adjust-MQ INT 用于降低比对质量的系数,如果reads中含有过多的错配。不能设置为零。BWA推荐值为50。
-A
--count-orphans 在检测变异中,不忽略异常的reads对。
-D
–输出每个样本的reads深度。
-V
–输出每个样本未比对到参考基因组的reads数量。
-t
–output-tags LIST设置FORMAT和INFO的列表内容,以逗号分割。
-u
–uncompressed 生成未压缩的VCF和BCF文件。
-I
–skip-indel 不检测INDEL。
-m
–min-ireads INT 候选INDEL的最小间隔的reads。
下面是一个使用-r参数和-l参数生成vcf文件的实例:
$ echo "SamtoolsMpileupByChr Begin: " `date` && \
samtools mpileup \
-l chr25Region.bed \
-r 7 \
-q 1 \
-C 50 \
-t DP,DV \
-m 2 \
-F 0.002 \
-uvf \
human.fasta \
test_3.bam \
--output test_3.chr7.raw.vcf && \
echo "SamtoolsMpileupByChr End: " `date`
$ samtools mpileup -f genome.fasta abc.bam > abc.txt
$ samtools mpileup -gSDf genome.fasta abc.bam > abc.bcf
$ samtools mpileup -guSDf genome.fasta abc.bam | bcftools view -cvNg - > abc.vcf
mpileup不使用-u或-g参数时,则不生成二进制的bcf文件,而生成一个文本文件(输出到标准输出)。该文本文件统计了参考序列中每个碱基位点的比对情况;该文件每一行代表了参考序列中某一个碱基位点的比对结果。比如:
scaffold_1 2841 A 11 ,,,...,.... BHIGDGIJ?FF
scaffold_1 2842 C 12 ,$,,...,....^I. CFGEGEGGCFF+
scaffold_1 2843 G 11 ,,...,..... FDDDDCD?DD+
scaffold_1 2844 G 11 ,,...,..... FA?AAAA
mpileup生成的结果包含6行:参考序列名;位置;参考碱基;比对上的reads数;比对情况;比对上的碱基的质量。
其中第5列比较复杂,解释如下:
-
.
代表与参考序列正链匹配。 -
,
代表与参考序列负链匹配。 -
ATCGN
代表在正链上的不匹配。 -
atcgn
代表在负链上的不匹配。 -
*
代表模糊碱基 -
^
代表匹配的碱基是一个read的开始;’^'后面紧跟的ascii码减去33代表比对质量;这两个符号修饰的是后面的碱基,其后紧跟的碱基(.,ATCGatcgNn)代表该read的第一个碱基。 -
$
代表一个read的结束,该符号修饰的是其前面的碱基。 - 正则式
\+[0-9]+[ACGTNacgtn]+
代表在该位点后插入的碱基;比如上例中在scaffold_1的2847后插入了9个长度的碱基acggtgaag。表明此处极可能是indel。 - 正则式
-[0-9]+[ACGTNacgtn]+
代表在该位点后缺失的碱基;
9. samtools rmdup
NGS上机测序前需要进行PCR一步,使一个模板扩增出一簇,从而在上机测序的时候表现出为1个点,即一个reads。若一个模板扩增出了多簇,结果得到了多个reads,这些reads的坐标(coordinates)是相近的。在进行了reads比对后需要将这些由PCR duplicates获得的reads去掉,并只保留最高比对质量的read。使用rmdup命令即可完成.
Usage: samtools rmdup [-sS]
Options:
-s
对single-end reads。默认情况下,只对paired-end reads
-S
将Paired-end reads作为single-end reads处理。
10.samtools idxstats
检索和打印已建立索引的bam文件的统计数据,包括参考序列名称、序列长度、比对上的read数量和未比对上的read数量。输出结果显示在屏幕上,以制表符分割。
Usage: samtools idxstats
如下图所示:
idxstats 统计一个表格,4列,分别为”序列名,序列长度,比对上的reads数,unmapped reads number”。第4列应该是paired reads中有一端能匹配到该scaffold上,而另外一端不匹配到任何scaffolds上的reads数。
11. samtools bedcov
计算由BED文件指定的基因组区域内的总碱基数量。
Usage: samtools bedcovregion.bed
如下图所示:
12. 其它有用的命令
reheader 替换bam文件的头
Usage:samtools reheader
cat 连接多个bam文件,适用于非sorted的bam文件
Usage:samtools cat [-h header.sam] [-o out.bam] [ ... ]
13. 将bam文件转换为fastq文件
有时候,我们需要提取出比对到一段参考序列的reads,进行小范围的分析,以利于debug等。这时需要将bam或sam文件转换为fastq格式。
该网站提供了一个bam转换为fastq的程序:http://www.hudsonalpha.org/gsl/information/software/bam2fastq
$ wget http://www.hudsonalpha.org/gsl/static/software/bam2fastq-1.1.0.tgz
$ tar zxf bam2fastq-1.1.0.tgz
$ cd bam2fastq-1.1.0
$ make
$ ./bam2fastq
使用示例
1:从bam中过滤掉没有比对上的信息,并将比对上的部分保存到sam中
samtools view -F 4 xxx.bam >xxx.mapped.sam
2:从bam中过滤没有比对上的信息,并保存到bam中:(要加-h,表示输出header)
samtools view -F 4 -h xxx.bam |samtools view -h -o xxx.mapped.bam -
注意:虽然有些没有比对上的结果 的flag值是141,77等,但是都可以用4过滤掉。
3:提取为fastq:主要参数为-f,-F,-G三个。
提取没有比对上的信息到fastq用:
samtools fastq -f 4 xxx.bam > xxx.unmapped.fastq
提取比对上的reads到fastq用
samtools fastq -F 4 xxx.bam > xxx.mapped.fastq
REF:
https://www.plob.org/article/7112.html
http://www.chenlianfu.com/?p=1399
http://en.wikipedia.org/wiki/SAMtools
http://www.htslib.org/doc/samtools-1.1.html
http://sourceforge.net/projects/samtools/files/ http://samtools.sourceforge.net/samtools.shtml
https://www.cnblogs.com/emanlee/p/4316581.html