Samtools和Bcftools

作者: 井底蛙蛙呱呱呱 | 来源:发表于2017-10-20 10:14 被阅读416次
    Samtools和Bcftools简介

    SAMtools是一个用于操作sam和bam文件的工具合集,包含有许多命令。
    BCFtools主要是用来操作vcf和BCF文件的工具合集,包含有许多命令。
    这些命令的使用方法如下:

    1. view

    view命令的主要功能是查看bam和sam文件的内容。
    bam文件是sam文件的二进制格式,占用空间小,运算速度快。
    view命令的用法和常用参数:

    Usage: samtools view [options] <in.bam>|<in.sam> [region [...]]
    默认情况下不加region,则是输出所有的region.
    
    Options:
    -b  默认输出sam格式文件,该参数设置输出bam格式
    -h  默认输出的sam格式文件不带header,该参数设定输出sam文件时带header信息
    -H  只输出header部分
    -S  默认情况下输入时bam文件,若输入是sam文件,则最好加该参数,否则有时候会报错
    -u  该参数的使用需要-b参数。默认情况下会对输出的bam文件进行压缩,设置此参数后不对文件进行压缩,能节约时间但是需要更多的磁盘空间
    -c  不输出比对结果,仅仅打印匹配上的结果的总数。常常和'-f','-F','-q'联合使用
    -t  File 使用一个list文件来作为header的输入,该文件中包含序列的id和长度
    -T  File 使用序列fasta文件作为header的输入
    -o  File 将结果输入到文件中,默认输出到标准输出
    -f  INT 比对结果中必须要包含的flag,相当于一个过滤条件
    -F  INT 比对结果中不能包含的flag,数字4代表该序列没有比对到参考序列上,数字8代表该序列的mate序列没有比对到参考序列上
    -q  INT 允许的最小比对质量
    -? 给出更多的帮助信息,包括flag的解释
    

    一些栗子:

    #将sam文件转换成bam文件
    $ samtools view -bS a.sam > a.bam
    
    #提取比对到参考序列上的比对结果
    $ samtools view -bF 4 a.bam > a.F4.bam
    
    #提取paired reads中两条reads都比对到参考序列的比对结果,只需要把两个4+8的值12作为过滤参数即可
    $ samtools view -b -F 12 a.bam > a.F12.bam
    
    #提取没有比对到参考序列上的比对结果
    $ samtools view -b -f 4 a.bam > a.f4.bam
    
    #提取bam文件比对到scaffold1上的比对结果,并保存成sam文件格式
    #提取目的区域的比对结果前需先对bam文件进行排序
    $ samtools view a.bam scaffold1 > scaffold1.sam
    
    #提取scaffold1上比对到30k到40k区域的比对结果
    $ samtools view a.bam scaffold1:30000-40000 > scaffold_30k_40K.sam
    
    #根据fasta文件,将header加入到sam或者bam文件中
    $ samtools view -T genome.fasta -h scaffold1.bam > scaffold1.h.sam
    

    2. sort

    sort用来对bam文件进行排序

    Usage: samtools sort [-n] [-m <maxMem>] <in.bam> <out.prefix>
    
    Options:
    -m  设置运行内存大小,默认是500,000,000(即500M,支持K/M/G缩写)。对于处理大数据时,如果内存够用,可设置大些,以节约时间。
    -n  设定排序方式,按short reads的ID排序。默认下是按序列在fasta文件中的顺序(即header和序列从左往右的位点)
    -l  INT 设置压缩水平,0(未压缩)--9(最佳压缩)
    
    -@  INT 设置使用的线程数
    

    例子

    $ samtools sort a.bam a.sort
    

    3. merge

    将2个或2个以上的已经sort的bam文件合并成一个bam文件,合并后的文件不需要再次sort,是已经sort过了的。

    Usage: samtools merge [-nr] [-h inh.sam] <out.bam> <in1.bam> <in2.bam> [...]
    默认下,合并得到的bam文件的header信息是in1.bam中的header。可以使用-h参数指定某一个sam或bam文件的header为out.bam的header。
    
    Options:
      -n         Input files are sorted by read name
      -t TAG     Input files are sorted by TAG value
      -r         Attach RG tag (inferred from file names)
      -u         Uncompressed BAM output
      -f         Overwrite the output BAM if exist
      -1         Compress level 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]
      -c         Combine @RG headers with colliding IDs [alter IDs to be distinct]
      -p         Combine @PG headers with colliding IDs [alter IDs to be distinct]
      -s VALUE   Override random seed
      -b FILE    List of input BAM filenames, one per line [null]
          --input-fmt-option OPT[=VAL]
                   Specify a single input file format option in the form
                   of OPTION or OPTION=VALUE
      -O, --output-fmt FORMAT[,OPT[=VAL]]...
                   Specify output format (SAM, BAM, CRAM)
          --output-fmt-option OPT[=VAL]
                   Specify a single output file format option in the form
                   of OPTION or OPTION=VALUE
          --reference FILE
                   Reference sequence FASTA FILE [null]
      -@, --threads INT
                   Number of additional threads to use [0]
    

    4. index

    对bam文件建立索引,生成后缀为.bai的文件,用于快速检索reads。
    需要对bam文件先进行排序,否则会报错。
    很多时候都需要索引文件的存在,特别是显示序列比对的情况下。比如samtools tview,gbrowse2等。

    Usage:samtools index <in.bam> [out.index]
    
    #栗子:
    $ samtools index a.bam
    

    5. faidx

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

    Usage: samtools faidx <in.bam> [...]
    
    #对基因组文件建立索引
    $ samtools faidx genome.fa 
    生成索引文件为genome.fa.fai,是一个文本文件,分成了5列。第一列是子序列的名称;第二列是子序列的长度。 
     第三列代表第一个碱基的偏移量, 从0开始计数,换行符也统计进行。第四列表示除了最后一行外, 其他代表序
    列的行的碱基数, 单位为bp。第五列表示行宽, 除了最后一行外, 其他代表序列的行的长度, 包括换行符, 
    在windows系统中换行符为\r\n, 要在序列长度的基础上加2。
    
    #有了索引文件后,可以使用以下命令很快从基因组中提取到fasta格式的子序列
    $ samtools faidx genome.fa chr1 > chr1.fa
    

    6. tview

    tview能直观的显示出reads比对到基因组的情况,和基因组浏览器有点类似。

    Usage: samtools tview <aln.bam> [ref.fasta]
    当给出参考基因组的时候,会在第一排显示参考基因组的序列,否则第一排全用N表示。
    按下g,则提示输入要到达基因组的某一位点。例如"chr1:100"表示到达chr1的第100个碱基处。
    使用H(左)J(上)K(右)L(下)移动显示界面,大写字母移动快,小写字母移动慢。
    使用空格键向右快速移动(同L),使用Backspace快速向左移动(同H)
    Ctrl+H向左移动1kb碱基距离,Ctrl+L向右移动1kb碱基距离
    输入'm','b','n',则使用颜色标注比对质量,碱基质量,核苷酸等。30-40的碱基质量或比对质量用白色表示;20-30黄色;0-10蓝色。
    输入'.',则开启或关闭点号视图,此时点号表示比对到正义链上,逗号表示匹配到负义链上
    输入'r',开启或关闭read name的显示
    其他的一些命令可使用'?'查看
    

    7. flagstat

    给出bam文件的比对结果的summary。

    Usage: samtools flagstat <in.bam>
    
    $ samtools flagstat a.bam
    187018343 + 0 in total (QC-passed reads + QC-failed reads)  #总reads数
    280885 + 0 secondary  #不知道
    0 + 0 supplementary  #不知道
    0 + 0 duplicates  #重复reads的数量
    186439767 + 0 mapped (99.69% : N/A)  #比对到参考基因组上的reads数量
    186737458 + 0 paired in sequencing  #paired reads数据数量
    93368729 + 0 read1  #read1的数量
    93368729 + 0 read2  #read2 的数量
    180901328 + 0 properly paired (96.87% : N/A)  #正确地匹配到参考序列的reads数量
    185855190 + 0 with itself and mate mapped  #一对reads都比对到了参考序列上的数量,但是并不一定比对到同一条染色体上
    303692 + 0 singletons (0.16% : N/A)  #  一对reads中只有一条与参考序列相匹配的数量
    2828852 + 0 with mate mapped to a different chr  # 一对reads比对到不同染色体的数量
    1367179 + 0 with mate mapped to a different chr (mapQ>=5)  #一对reads比对到不同染色体的且比对质量值大于5的数量
    

    8. depth

    得到每个位点的测序深度,并输出到标准输出

    Usage: samtools depth [options] in1.bam [in2.bam [...]]
    Options:
       -a                  output all positions (including zero depth)
                           #输出所有位点,包括零深度的位点
       -a -a (or -aa)      output absolutely all positions, including unused ref. sequences
                           #完全输出所有位点,包括未使用到的参考序列
       -b <bed>            list of positions or regions
                           #计算BED文件中指定位置或区域的深度
       -f <list>           list of input BAM filenames, one per line [null]
                           #使用在FILE中的指定bam文件
       -l <int>            read length threshold (ignore reads shorter than <int>) [0]
                           #忽略掉长度小于此INT值的reads
       -d/-m <int>         maximum coverage depth [8000]
                           #最大深度值
       -q <int>            base quality threshold [0]
                           #只计算碱基质量值大于此值的reads
       -Q <int>            mapping quality threshold [0]
                           #只计算比对质量值大于此值的reads
       -r <chr:from-to>    region
                           #只计算指定区域的reads
          --input-fmt-option OPT[=VAL]
                   Specify a single input file format option in the form
                   of OPTION or OPTION=VALUE
          --reference FILE
                   Reference sequence FASTA FILE [null]
    
    The output is a simple tab-separated table with three columns: reference name,
    position, and coverage depth.  Note that positions with zero coverage may be
    omitted by default; see the -a option.
    
    #栗子
    $ samtools depth a.bam | less
    

    9. rmdup

    去除PCR重复和光学重复,重复的reads仅保留一对。

    Usage:  samtools rmdup [-sS] <input.srt.bam> <output.bam>
    
    Options:
      -s  对SE reads去除重复。默认情况下只对PE reads去除重复
      -S  将PE reads作为SE reads来去除重复
    
    #栗子
    $ samtools a.bam b.bam
    

    10. 一些其他有用的命令

    reheader替换bam文件的头文件

    Usage: samtools reheader [-P] in.header.sam in.bam > out.bam
       or  samtools reheader [-P] -i in.header.sam file.bam
    
    Options:
        -P, --no-PG      Do not generate an @PG header line.
        -i, --in-place   Modify the bam/cram file directly.
                         (Defaults to outputting to stdout.)
    
    #栗子
    $ samtools reheader -i in.header.sam out.bam 
    $ samtools reheader in.header.sam in.bam > out.bam
    

    cat链接多个bam文件,适用于非sorted的bam文件

    Usage: samtools cat [options] <in1.bam>  [... <inN.bam>]
           samtools cat [options] <in1.cram> [... <inN.cram>]
    
    Concatenate BAM or CRAM files, first those in <bamlist.fofn>, then those
    on the command line.
    
    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
    

    idxstats 统计一个表格,4列,分别为"序列名,序列长度,比对上的reads数,未比对上的reads数",最后一排则显示没有比对到任何一条序列的reads number。

    chr1 195471971 6112404 0
    chr10 130694993 3933316 0
    chr11 122082543 6550325 0
    chr12 120129022 3876527 0
    chr13 120421639 5511799 0
    chr14 124902244 3949332 0
    chr15 104043685 3872649 0
    chr16 98207768 6038669 0
    chr17 94987271 13544866 0
    chr18 90702639 4739331 0
    chr19 61431566 2706779 0
    chr2 182113224 8517357 0
    chr3 160039680 5647950 0
    chr4 156508116 4880584 0
    chr5 151834684 6134814 0
    chr6 149736546 7955095 0
    chr7 145441459 5463859 0
    chr8 129401213 5216734 0
    chr9 124595110 7122219 0
    chrM 16299 1091260 0
    chrX 171031299 3248378 0
    chrY 91744698 259078 0
    * 0 0 0
    

    11. mpileup

    使用samtools的子命令mpileup分析参考序列上的每个碱基位点的比对结果,并生成VCF/BCF格式文件,BCF是VCF的二进制文件。再使用Bcftools对VCF/BCF格式文件进行SNP/Indel calling。其中,Bcftools是附属于samtools的程序。
    mpileup的常用参数:

    Usage: samtools mpileup [options] in1.bam [in2.bam [...]]
    
    Input options:
      -6, --illumina1.3+      quality is in the Illumina-1.3+ encoding
                              #碱基质量格式为Illumina 1.3+打分方式
      -A, --count-orphans     do not discard anomalous read pairs
                              #在检测变异中,不忽略异常的reads对
      -b, --bam-list FILE     list of input BAM filenames, one per line
                              #以list形式输入BAM文件。每一行代表一个bam文件路径
      -B, --no-BAQ            disable BAQ (per-Base Alignment Quality)
                              
      -C, --adjust-MQ INT     adjust mapping quality; recommended:50, disable:0 [0]
                              #用于降低比对质量的系数,如果reads中含有过多的错配,不能设置为零。BWA推荐值为50
      -d, --max-depth INT     max per-file depth; avoids excessive memory usage [250]
                             #对参考基因组上的每个位点进行SNP/Indel分析的时候,samtools对每个输入文件仅读取的
                              reads数目有上限,该上限默认值是8000/n,其中n表示输入的BAM文件个数。当该参数设置
                              的值>8000/n,则此上限有-d参数决定,否则-d参数无效。例如:当对1000个样品进行重测序
                              后进行SNP/Indel分析,上限若为8000/n,则过小(可能低于测序覆盖度了),此时-d参数
                              生效;而当需要分析的样品数较少的时候,对每个位点读取的reads数目上限则为8000/n,
                              能充分利用测序深度非常高位点的数据
      -E, --redo-BAQ          recalculate BAQ on the fly, ignore existing BQs
    
      -f, --fasta-ref FILE    faidx indexed reference sequence file
                              #输入参考基因组序列fasta文件,fasta文件必须有以fai为后缀的索引文件
      -G, --exclude-RG FILE   exclude read groups listed in FILE
    
      -l, --positions FILE    skip unlisted positions (chr pos) or regions (BED)
                              #输入bed文件,仅在指定区间内进行分析
      -q, --min-MQ INT        skip alignments with mapQ smaller than INT [0]
                              #用于分析的比对质量最小值
      -Q, --min-BQ INT        skip bases with baseQ/BAQ smaller than INT [13]
                              #用于分析的碱基质量最小值
      -r, --region REG        region in which pileup is generated
                              #仅仅在此区间进行分析。默认对所有区间进行分析
      -R, --ignore-RG         ignore RG tags (one BAM = one sample)
                              #忽略BAM文件中的@RG信息,认为一个BAM文件就是一个样品的数据
      --rf, --incl-flags STR|INT  required flags: skip reads with mask bits unset []
      --ff, --excl-flags STR|INT  filter flags: skip reads with mask bits set
                                                [UNMAP,SECONDARY,QCFAIL,DUP]
      -x, --ignore-overlaps   disable read-pair overlap detection
    
    Output options:
      -o, --output FILE       write output to FILE [standard output]
                              #将结果输出到指定文件,默认输出到标准输出
      -g, --BCF               generate genotype likelihoods in BCF format
                              #进行基因分型,将结果输出到BCF格式
      -v, --VCF               generate genotype likelihoods in VCF format
                              #进行基因分型,将结果输出到VCF格式。默认输出bgzip压缩格式的VCF文件,若加入-u参数后则不进行bgzip压缩
    
    Output options for mpileup format (without -g/-v):   #不使用-g/-v参数时有效
      -O, --output-BP         output base positions on reads
                              #输出每个reads的碱基位点
      -s, --output-MQ         output mapping quality
                              #输出比对质量
          --output-QNAME      output read names
      -a                      output all positions (including zero depth)
                              #输出所有位点,包括覆盖深度为0的位点
      -a -a (or -aa)          output absolutely all positions, including unused ref. sequences
                              #输出所有位点,包括参考基因组中为比对上的位点
    Output options for genotype likelihoods (when -g/-v is used):   #当使用-g/-v参数时
      -t, --output-tags LIST  optional tags to output:
                   DP,AD,ADF,ADR,SP,INFO/AD,INFO/ADF,INFO/ADR []
                              #设置FORMAT和INFO的列表内容,以逗号分割。
      -u, --uncompressed      generate uncompressed VCF/BCF output
                              #不对BCF进行压缩,通常用于管道中输入到下一个命令进行分析
    
    SNP/INDEL genotype likelihoods options (effective with -g/-v):      #SNP/Indel 基因分型参数
      -e, --ext-prob INT      Phred-scaled gap extension seq error probability [20]
      -F, --gap-frac FLOAT    minimum fraction of gapped reads [0.002]
                               #含有间隔reads的最小片段
      -h, --tandem-qual INT   coefficient for homopolymer errors [100]
      -I, --skip-indels       do not perform indel calling
                              #不检测indel变异
      -L, --max-idepth INT    maximum per-file depth for INDEL calling [250]
      -m, --min-ireads INT    minimum number gapped reads for indel candidates [1]
                              #候选INDEL的最小间隔的reads
      -o, --open-prob INT     Phred-scaled gap open seq error probability [40]
      -p, --per-sample-mF     apply -m and -F per-sample for increased sensitivity
      -P, --platforms STR     comma separated list of platforms for indels [all]
          --input-fmt-option OPT[=VAL]
                   Specify a single input file format option in the form
                   of OPTION or OPTION=VALUE
          --reference FILE
                   Reference sequence FASTA FILE [null]
    
    Notes: Assuming diploid individuals.
    

    mpileup生成的结果包含6列:参考序列名;位置;参考基因组碱基;比对上的reads数;比对情况;比对上的碱基的质量。
    其中第5列比较复杂,解释如下:

    1. '.'代表read比对到参考基因组正链上
    2. ','代表比对到参考基因组负链上
    3. 'ATGCN'表示正链上的不匹配
    4. 'atgcn'表示在负链上的不匹配
    5. '*'代表模糊碱基
    6. '^'代表匹配的碱基是一个read的开始;'^'后面紧跟的ascii码减去33代表比对质量;这两个符号修饰的是后面的碱基,气候紧跟的碱基代表read的第一个碱基
    7. '$'代表一个read的结束,该符号修饰的是其前面的碱基
    8.正则式'+[0-9]+[ACGTNacgtn]+'代表在该位点后插入的碱基
    9. 正则式'-[0-9]+[ACGTNacgtn]+'代表在该位点后缺失的碱基
    

    使用Bcftools进行variation calling

    Bcftools常用来进行变异检测,用法及参数如下:

    Usage:   bcftools [--version|--version-only] [--help] <command> <argument>
    
    Commands:
    
     -- Indexing
        index        index VCF/BCF files
    
     -- VCF/BCF manipulation
        annotate     annotate and edit VCF/BCF files
        concat       concatenate VCF/BCF files from the same set of samples
        convert      convert VCF/BCF files to different formats and back
        isec         intersections of VCF/BCF files
        merge        merge VCF/BCF files files from non-overlapping sample sets
        norm         left-align and normalize indels
        plugin       user-defined plugins
        query        transform VCF/BCF into user-defined formats
        reheader     modify VCF/BCF header, change sample names
        sort         sort VCF/BCF file
        view         VCF/BCF conversion, view, subset and filter VCF/BCF files
    
     -- VCF/BCF analysis
        call         SNP/indel calling
        consensus    create consensus sequence by applying VCF variants
        cnv          HMM CNV calling
        csq          call variation consequences
        filter       filter VCF/BCF files using fixed thresholds
        gtcheck      check sample concordance, detect sample swaps and contamination
        mpileup      multi-way pileup producing genotype likelihoods
        roh          identify runs of autozygosity (HMM)
        stats        produce VCF/BCF stats
    
     Most commands accept VCF, bgzipped VCF, and BCF with the file type detected
     automatically even when streaming from a pipe. Indexed VCF and BCF will work
     in all situations. Un-indexed VCF and BCF and streams will work in most but
     not all situations.
    
    #其中call常用命令参数如下:
    Usage:   bcftools call [options] <in.vcf.gz>
    
    Options:
      -V, --skip-variants <type>      skip indels/snps
                                      #不进行snp/indel检测
      -v, --variants-only             output variant sites only
                                      #仅仅输出变异位点信息
      -c, --consensus-caller          the original calling method (conflicts with -m)
                                      #SNP/INDEL分析的原始算法,适用于对一个样本分析,与-m参数只能二选一
      -m, --multiallelic-caller       alternative model for multiallelic and rare-variant calling (conflicts with -c)
                                      #适用于多种allele和稀有allele分析的算法,适用于多个样本的分析,与-c参数只能二选一
      -o, --output <file>             write output to a file [standard output]
                                      #设置输出文件
      -O, --output-type <b|u|z|v>     output type: 'b' compressed BCF; 'u' uncompressed BCF; 'z' compressed VCF; 'v' uncompressed VCF [v]
                                      #设置输出文件的格式,该参数的值有:b(压缩BCF格式),u(不压缩BCF格式),z(压缩VCF格式),v(不压缩VCF格式)
    

    相关文章

      网友评论

        本文标题:Samtools和Bcftools

        本文链接:https://www.haomeiwen.com/subject/soiluxtx.html