美文网首页
实用生信小技巧:利用pysam高效处理bam文件

实用生信小技巧:利用pysam高效处理bam文件

作者: 陈光辉_山东花生 | 来源:发表于2023-08-29 22:38 被阅读0次

由于bam文件是二进制的压缩文件,正常情况下我们无法用普通编辑器打开查看,一般情况下我们借助samtools软件来对文件进行处理。但很多小伙伴一定遇到过这样的问题:如果我想对bam文件进行个性化的处理,需要怎么做呢?常规的做法是利用samtools将bam文件先转化成可读写的sam文件,再进行后续的处理。这样做一方面牺牲了大量的时间和存储,另一方面在编程时需要调用shell命令十分繁琐,今天介绍的pysam可以说是一条龙服务完美解决问题。

01 安装pysam

pysam是python的一个库,安装好python以后可以利用python自带的pip安装pysam。在后续使用中请注意,samtools软件的坐标是1-base,而pysam对于基因组坐标的处理是0-base:

pip install pysam

02 读入bam文件

pysam可读入的文件格式有bam、sam、cram,以test前缀的文件作为示例,读入方法如下,读入后生成对象bf,后续对文件的操作都基于对bf的访问:

import pysam

bf = pysam.AlignmentFile("test.bam", "rb") #对bam文件的读入

bf = pysam.AlignmentFile("test.sam", "r") #对sam文件的读入

bf = pysam.AlignmentFile("test.cram", "rc") #对cram文件的读入

03

检查bam文件是否存在index:

bf.check_index()  #返回True则存在索引,返回False则索引不存在

04

pysam封装了samtools,因此可以避开命令行调用直接对bam文件进行sort:

pysam.sort("-o", "output.bam", "test.bam")

05

想要提取bam文件的头文件,可以这样操作:

head=bf.header  #返回一个迭代器,可以利用循环来访问

06

想要提取bam文件的前10行比对结果,可以这样操作:

out=bf.head(10)  #该命令会以迭代器的形式返回bam文件的前10行

07

如果想提取基因组某个区域的比对结果,比如现在我想提取bam文件中比对到血红蛋白基因上的结果,可以这样操作:

hemoglobin_region=bf.fetch(contig="chr11",start=5246694,stop=5250625)  #结果同样是以迭代器的形式返回

08

想要计算落在某个区间的reads数目,可以这样操作:

readsNumber=bf.count(contig="chr1",start=1,stop=1000000) #返回reads数目值

09

想要计算某个区间的每个碱基上的覆盖深度,可以这样操作:

baseCov=bf.count_coverage(contig="chr1",start=1,stop=1000000) #返回一个数组,数组的长度和区间长度一致,表示每个碱基的覆盖深度

10

对参考基因组的信息进行统计,可以这样操作:

bf.get_index_statistics() #返回一个元组,每个元素记录一条染色体比对上的reads数目和未比对上的reads数目

bf.lengths      #返回一个元组,每个元素记录一条染色体长度

bf.references     #以元组的形式返回参考基因组每条染色体的名称

bf.nreferences    #返回参考基因组的染色体条数

11

对比对信息进行统计,可以这样操作:

bf.mapped      #返回比对上的reads数目
bf.unmapped     #返回未比对上的reads数目

12

对于bf对象可以利用for循环进行访问,每个循环是一个read,对于read的各种处理操作汇总如下:

for read1 in bf:
    read2=bf.mate(read1) #获取与read1配对的read2的比对信息
    read1.cigarstring  #字符串形式返回read1的cigar值
    read1.is_duplicate #返回布尔型变量,判断read1是否为PCR重复
    read1.is_paired  #返回布尔型变量,判断read1是否为成对reads
    read1.is_read1  #返回布尔型变量,判断read1是否为左端reads
    read1.is_read2  #返回布尔型变量,判断read1是否为右端reads
    read1.is_reverse  #返回布尔型变量,判断read1是否为反向比对
    read1.is_secondary #返回布尔型变量,判断read1是否为次级比对
    read1.is_unmapped  #返回布尔型变量,判断read1是否比对上参考基因组
    read1.is_qcfail  #返回布尔型变量,判断read1是否qc质控失败
    read1.mapping_quality #返回数值型变量,代表read1的比对质量
    read1.mate_is_reverse #返回布尔型变量,判断read1的配对read2是否为反向比对
    read1.get_blocks() #返回数值型元组,表示read1在参考基因组比对的起始坐标和终止坐标
    read1.get_overlap(5246694,5250625)  #返回数值,表示read1在基因组上的坐标和输入参数坐标的重叠区间长度
    read1.get_reference_sequence() #字符串形式返回read1所在参考基因组位置的参考序列

小结:

pysam库的使用可以大大减少在脚本中对bash命令行的调用,一方面美化代码便于后期维护更新,另一方面可以个性化调取reads信息。本篇代码涵盖了pysam的常用方法,其他参数详解可见官网https://pysam.readthedocs.io/en/latest/usage.html

相关文章

网友评论

      本文标题:实用生信小技巧:利用pysam高效处理bam文件

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