samtools是一個用于操作sam和bam文件的工具集合。
1. view
view命令的主要功能是:將輸入文件轉(zhuǎn)換成輸出文件,通常是將比對后的sam文件轉(zhuǎn)換為bam文件,然后對bam文件進行各種操作,比如數(shù)據(jù)的排序(和提取(這些操作是對bam文件進行的,因而當輸入為sam文件的時候,不能進行該操作)。
bam文件優(yōu)點:
(1)bam文件為二進制文件,占用的磁盤空間比sam文本文件?。?br> (2)利用bam二進制文件的運算速度快。
view命令中,對sam文件頭部的輸入(-t或-T)和輸出(-h)是單獨的一些參數(shù)來控制的。
Usage: samtools view [options] <in.bam>|<in.sam> [region1 [...]]
默認情況下不加 region,則是輸出所有的 region.
Options:
-b output BAM
默認下輸出是 SAM 格式文件,該參數(shù)設置輸出 BAM 格式
-h print header for the SAM output
默認下輸出的 sam 格式文件不帶 header,該參數(shù)設定輸出sam文件時帶 header 信息
-H print header only (no alignments)
-S input is SAM
默認下輸入是 BAM 文件,若是輸入是 SAM 文件,則最好加該參數(shù),否則有時候會報錯。
-u uncompressed BAM output (force -b)
該參數(shù)的使用需要有-b參數(shù),能節(jié)約時間,但是需要更多磁盤空間。
-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]
數(shù)字4代表該序列沒有比對到參考序列上
數(shù)字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</pre>
如果沒有指定option和region選項,則會在屏幕中顯示sam格式的文件,如下所示。

例子:
(1)將sam文件和bam文件相互轉(zhuǎn)換。注意:沒有header的sam文件不能轉(zhuǎn)換成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)提取比對到參考序列上的比對結(jié)果 F
$ samtools view -bF 4 lane.bam > lane.F.bam
(3)提取paired reads中兩條reads都比對到參考序列上的比對結(jié)果,只需要把兩個4+8的值12作為過濾參數(shù)即可
$ samtools view -bF 12 lane.bam > lane.F12.bam
(4)提取沒有比對到參考序列上的比對結(jié)果 f
$ samtools view -bf 4 lane.bam > lane.f.bam
(5)提取paired reads中比對到參考基因組上的數(shù)據(jù)
$ 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上的比對結(jié)果,并保存到sam文件格式
$ samtools view lane.bam scaffold1 > scaffold1.sam
(7)提取scaffold1上能比對到30k到100k區(qū)域的比對結(jié)果
$ samtools view lane.bam scaffold1:30000-100000 $gt; scaffold1_30k-100k.sam
(8)根據(jù)fasta文件,將 header 加入到 sam 或 bam 文件中
$ samtools view -T genome.fasta -h scaffold1.sam > scaffold1.h.sam
(9)sam 和 bam 格式轉(zhuǎn)換
#BAM轉(zhuǎn)換為SAM
$ samtools view -h -o out.sam out.bam
#SAM轉(zhuǎn)換為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的方式對比對結(jié)果進行排序,或者使用-n參數(shù)以read名稱進行排序。將會添加適當?shù)腀HD-SO排序順序標頭標簽或者如果有必要的話,將會更新現(xiàn)存的一個排序順序標頭標簽。sort命令的輸出默認是標準輸出寫入,或者使用-o參數(shù)時,指定bam文件輸出名。sort命令還會在內(nèi)存不足時創(chuàng)建臨時文件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 設置每個線程運行時的內(nèi)存大小,可以使用K,M和G表示內(nèi)存大小。默認下是 500,000,000 即500M。對于處理大數(shù)據(jù)時,如果內(nèi)存夠用,則設置大點的值,以節(jié)約時間。
-n 設置按照read名稱進行排序。默認下是按序列在fasta文件中的順序(即header)和序列從左往右的位點排序。
-l INT 設置輸出文件壓縮等級。0-9,0是不壓縮,9是壓縮等級最高。不設置此參數(shù)時,使用默認壓縮等級;
-o FILE 設置最終排序后的輸出文件名;
-O FORMAT 設置最終輸出的文件格式,可以是bam,sam或者cram,默認為bam;
-T PREFIX 設置臨時文件的前綴;
-@ INT 設置排序和壓縮是的線程數(shù)量,默認是單線程。
例子:
$ 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命令將多個已經(jīng)排序后的bam文件合并成為一個排序的且保持所有輸入記錄并保持現(xiàn)有排序順序的bam文件。
Usage: samtools merge [-nur1f] [-h inh.sam] [-R reg] [-b <list>] <out.bam> <in1.bam> [<in2.bam><in3.bam>…<inN.bam]
Options:
-1 指定壓縮等級;
-b FILE 輸入文件列表,一個文件一行;
-f overwrite the output BAM if exist 強制覆蓋同名輸出文件;
-h FILE copy the header in FILE to <out.bam> [in1.bam]。 指定FILE內(nèi)的’@’頭復制到輸出bam文件中并替換輸出文件的文件頭。否則,輸出文件的文件頭將從第一個輸入文件復制過來;
-n sort by read names。設定輸入比對文件是以read名進行排序的而不是以染色體坐標排序的;
-R STR merge file in the specified region STR [all]。合并輸入文件的指定區(qū)域;
-r attach RG tag (inferred from file names)。使RG標簽添加到每一個比對文件上,標簽值來自文件名;
-u uncompressed BAM output。輸出的bam文件不壓縮;
-c 當多個輸入文件包含相同的@RG頭ID時,只保留第一個到合并后輸出的文件。當合并多個相同樣本的不同文件時,非常有用。
-p 與-c參數(shù)類似,對于要合并的每一個文件中的@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文件中的指定區(qū)域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文件,可以為已經(jīng)基于坐標排序后bam或者cram的文件創(chuàng)建索引,生成以.bai或者.crai為后綴的索引文件。必須使用排序后的文件,否則可能會報錯。另外,不能對sam文件使用此命令。如果想對sam文件建立索引,那么可以使用tabix命令創(chuàng)建。
Usage: samtools index [-bc] [-m INT] aln.bam |aln.cram [out.index]
Options:
-b 創(chuàng)建bai索引文件,未指定輸出格式時,此參數(shù)為默認參數(shù);
-c 創(chuàng)建csi索引文件,默認情況下,索引的最小間隔值為2^14,與bai格式一致;
-m INT 創(chuàng)建csi索引文件,最小間隔值2^INT;
例子:
#創(chuàng)建bai索引
$ samtools index test_2.sorted.bam
$ smatools index -b test_2.sorted.bam
#創(chuàng)建csi索引
$ samtools index -c test_2.sorted.bam
$ samtools index -c -m 10 test_2.sorted.bam
以下兩種命令結(jié)果一樣
$ samtools index abc.sort.bam
$ samtools index abc.sort.bam abc.sort.bam.bai
5. faidx
對fasta文件建立索引,生成的索引文件以.fai后綴結(jié)尾。該命令也能依據(jù)索引文件快速提取fasta文件中的某一條(子)序列.如果沒有指定區(qū)域,faidx命令就創(chuàng)建文件索引并生成后綴為.fai的索引文件。如果指定區(qū)域,那么就是生產(chǎn)并顯示fasta格式的子序列。輸入文件可以使BGZF壓縮格式的文件。
輸入文件中的序列要有不同的名稱。如果不是這樣,即存在相同名稱的序列,在建立索引的過程中將發(fā)出有關重復序列的警告而且生產(chǎn)的同名子序列的信息都要被第一個同名子序列的信息覆蓋。
Usage: samtools faidx <ref.fasta> [region1,…]
例:對基因組文件建立索引
$ samtools faidx genome.fasta

上圖中先顯示了待處理的test.fasta文件的內(nèi)容,由4個長度不一的序列組成,其中前兩個重名。然后使用faidx命令進行處理。最后在顯示生產(chǎn)索引文件test.fasta.fai的內(nèi)容。
生成了索引文件fasta.fai,是一個文本文件,分成了5列。
- 第1列是子序列的名稱,每個序列”>”之后到第一個空格之前的所有字符;
- 第2列是序列長度,單位為bp;
- 第3列是OFFSET,第一個堿基的偏移量,以0為起始值。序列所在的位置”,因為該數(shù)字從上往下逐漸變大,最后的數(shù)字是genome.fasta文件的大小;
- 第4列LINEBASES,除了最后一行以外,其他代表序列的堿基數(shù),單位為bp;
- 第5列行寬(LINEWIDTH),除了最后一行以外,其他代表序列的長度,包括換行符。注:windows系統(tǒng)中換行符為\r\n,要在序列長度的基礎上加2。
于是通過此文件,可以定位子序列在fasta文件在磁盤上的存放位置,直接快速調(diào)出子序列。
由于有索引文件,可以使用以下命令很快從基因組中提取到fasta格式的子序列
$ samtools faidx genome.fasta scffold_10 > scaffold_10.fasta
提取序列如下圖:
6. tview
tview能直觀的顯示出reads比對基因組的情況,和基因組瀏覽器有點類似。
Usage: samtools tview <aln.bam> [ref.fasta]
當給出參考基因組的時候,會在第一排顯示參考基因組的序列,否則,第一排全用N表示。
按下 g ,則提示輸入要到達基因組的某一個位點。例子“scaffold_10:1000"表示到達第10號scaffold的第1000個堿基位點處。
使用H(左)J(上)K(下)L(右)移動顯示界面。大寫字母移動快,小寫字母移動慢。
使用空格建向左快速移動(和 L 類似),使用Backspace鍵向左快速移動(和 H 類似)。
Ctrl+H 向左移動1kb堿基距離; Ctrl+L 向右移動1kb堿基距離
可以用顏色標注比對質(zhì)量,堿基質(zhì)量,核苷酸等。30~40的堿基質(zhì)量或比對質(zhì)量使用白色表示;20~30黃色;10~20綠色;0~10藍色。
使用點號'.'切換顯示堿基和點號;使用r切換顯示read name等
還有很多其它的使用說明,具體按 ? 鍵來查看。
7. flagstat
統(tǒng)計輸入文件的相關數(shù)據(jù)并將這些數(shù)據(jù)輸出至屏幕顯示。每一項統(tǒng)計數(shù)據(jù)都由兩部分組成,分別是QC pass和QC failed,表示通過QC的reads數(shù)據(jù)量和未通過QC的reads數(shù)量。以“PASS + FAILED”格式顯示。
Usage: samtools flagstat <in.bam> |<in.sam> | <in.cram>
例如
4835105 + 0 in total (QC-passed reads + QC-failed reads) # QC pass的reads的數(shù)量為4835105 ,未通過QC的reads數(shù)量為0,意味著總reads數(shù)為4835105條;
529 + 0 secondary
0 + 0 supplementary
0 + 0 duplicates # 重復reads的數(shù)量,QC pass和failed
4719540 + 0 mapped (97.61% : N/A) # 比對到參考基因組上的reads數(shù)量(總體上,reads的匹配率);
4834576 + 0 paired in sequencing # paired reads數(shù)據(jù)數(shù)量(有多少reads是屬于paired reads)
2417288 + 0 read1 # read1的數(shù)量;
2417288 + 0 read2 # read2 的數(shù)量;
4698524 + 0 properly paired (97.19% : N/A) # 完美匹配的reads數(shù):比對到同一條參考序列,并且兩條reads之間的距離符合設置的閾值;
4718936 + 0 with itself and mate mapped # 一對reads都比對到了參考序列上的reads數(shù),但是并不一定比對到同一條染色體上;
75 + 0 singletons (0.00% : N/A) # 一對reads中只有一條與參考序列相匹配的reads數(shù),和上一個相加,則是總的匹配上的;
10646 + 0 with mate mapped to a different chr # 一對reads比對到不同染色體的reads數(shù);
10414 + 0 with mate mapped to a different chr (mapQ>=5) # 一對reads比對到不同染色體的且比對質(zhì)量值大于5的reads數(shù);
7. depth
得到每個堿基位點或者區(qū)域的測序深度,并輸出到標準輸出。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文件中指定位置或區(qū)域的深度;
-f FiLE 使用在FILE中的指定bam文件;
-I INT 忽略掉小于此INT值的reads;
-q INT 只計算堿基質(zhì)量值大于此值的reads;
-Q INT 只計算比對質(zhì)量值大于此值的reads;
-r CHR:FROM –TO 只計算指定區(qū)域的reads,后面跟染色體號(region)
示例:
$ samtools depth in.bam > out.depth.txt
注意: in.bam 必須經(jīng)過了排序。
depth命令運行如下圖所示:
一共得到3列以指標分隔符分隔的數(shù)據(jù),第一列為染色體名稱,第二列為位點,第三列為覆蓋深度。
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文件或者包含區(qū)域位點的位置列表文件。位置文件包含兩列,染色體和位置,從1開始計數(shù)。BED文件至少包含3列,染色體、開始位置和結(jié)束位置,開始端從0開始計數(shù)。
-r –region STR 只在指定區(qū)域產(chǎn)生pileup,需要已建立索引的bam文件。通常和-l參數(shù)一起使用。
-o –output FILE 生成pileup格式文件或者VCF、BCF文件而不是默認的標準輸出。
-g –BCF 計算基因型的似然值和輸出文件格式為BCF。
-v –VCF 計算基因型的似然值和輸出文件格式為VCF。
-C --adjust-MQ INT 用于降低比對質(zhì)量的系數(shù),如果reads中含有過多的錯配。不能設置為零。BWA推薦值為50。
-A --count-orphans 在檢測變異中,不忽略異常的reads對。
-D –輸出每個樣本的reads深度。
-V –輸出每個樣本未比對到參考基因組的reads數(shù)量。
-t –output-tags LIST設置FORMAT和INFO的列表內(nèi)容,以逗號分割。
-u –uncompressed 生成未壓縮的VCF和BCF文件。
-I –skip-indel 不檢測INDEL。
-m –min-ireads INT 候選INDEL的最小間隔的reads。
下面是一個使用-r參數(shù)和-l參數(shù)生成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參數(shù)時,則不生成二進制的bcf文件,而生成一個文本文件(輸出到標準輸出)。該文本文件統(tǒng)計了參考序列中每個堿基位點的比對情況;該文件每一行代表了參考序列中某一個堿基位點的比對結(jié)果。比如:
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<AA+
scaffold_1 2845 G 11 ,,...,..... F656666166*
scaffold_1 2846 A 11 ,,...,..... (1.1111)11*
scaffold_1 2847 A 11 ,,+9acggtgaag.+9ACGGTGAAT.+9ACGGTGAAG.+9ACGGTGAAG,+9acggtgaag.+9ACGGTGAAG.+9ACGGTGAAG.+9ACGGTGAAG.+9ACGGTGAAG.+9ACGGTGAAG %.+....-..)
scaffold_1 2848 N 11 agGGGgGGGGG !!$!!!!!!!!
scaffold_1 2849 A 11 c$,...,..... !0000000000
scaffold_1 2850 A 10 ,...,..... 353333333
mpileup生成的結(jié)果包含6行:參考序列名;位置;參考堿基;比對上的reads數(shù);比對情況;比對上的堿基的質(zhì)量。
其中第5列比較復雜,解釋如下:
-
.代表與參考序列正鏈匹配。 -
,代表與參考序列負鏈匹配。 -
ATCGN代表在正鏈上的不匹配。 -
atcgn代表在負鏈上的不匹配。 -
*代表模糊堿基 -
^代表匹配的堿基是一個read的開始;’^'后面緊跟的ascii碼減去33代表比對質(zhì)量;這兩個符號修飾的是后面的堿基,其后緊跟的堿基(.,ATCGatcgNn)代表該read的第一個堿基。 -
$代表一個read的結(jié)束,該符號修飾的是其前面的堿基。 - 正則式
\+[0-9]+[ACGTNacgtn]+代表在該位點后插入的堿基;比如上例中在scaffold_1的2847后插入了9個長度的堿基acggtgaag。表明此處極可能是indel。 - 正則式
-[0-9]+[ACGTNacgtn]+代表在該位點后缺失的堿基;
9. samtools rmdup
NGS上機測序前需要進行PCR一步,使一個模板擴增出一簇,從而在上機測序的時候表現(xiàn)出為1個點,即一個reads。若一個模板擴增出了多簇,結(jié)果得到了多個reads,這些reads的坐標(coordinates)是相近的。在進行了reads比對后需要將這些由PCR duplicates獲得的reads去掉,并只保留最高比對質(zhì)量的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文件的統(tǒng)計數(shù)據(jù),包括參考序列名稱、序列長度、比對上的read數(shù)量和未比對上的read數(shù)量。輸出結(jié)果顯示在屏幕上,以制表符分割。
Usage: samtools idxstats <in.bam>
如下圖所示:

idxstats 統(tǒng)計一個表格,4列,分別為”序列名,序列長度,比對上的reads數(shù),unmapped reads number”。第4列應該是paired reads中有一端能匹配到該scaffold上,而另外一端不匹配到任何scaffolds上的reads數(shù)。
11. samtools bedcov
計算由BED文件指定的基因組區(qū)域內(nèi)的總堿基數(shù)量。
Usage: samtools bedcovregion.bed <in.bam | in.sam | in.cram>
如下圖所示:

12. 其它有用的命令
reheader 替換bam文件的頭
Usage:samtools reheader <in.header.sam> <in.bam>
cat 連接多個bam文件,適用于非sorted的bam文件
Usage:samtools cat [-h header.sam] [-o out.bam] <in1.bam> <in2.bam> [ ... ]</pre>
13. 將bam文件轉(zhuǎn)換為fastq文件
有時候,我們需要提取出比對到一段參考序列的reads,進行小范圍的分析,以利于debug等。這時需要將bam或sam文件轉(zhuǎn)換為fastq格式。
該網(wǎng)站提供了一個bam轉(zhuǎn)換為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 <in.bam>
使用示例
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 -
注意:雖然有些沒有比對上的結(jié)果 的flag值是141,77等,但是都可以用4過濾掉。

3:提取為fastq:主要參數(shù)為-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