使用Pysam访问特定位置的Bam文件

时间:2015-06-07 18:52:55

标签: python bioinformatics python-module biopython pysam

我有一个给定的染色体编号和位置(chr1和位置1599812)。我想使用python的pysam模块访问bam文件以获取仅特定区域chr1和位置1599812的读取数字信息。我尝试使用pileup()但它需要一系列位置,而在我的情况下我只想要一个特定的位置,而不是一系列的。

2 个答案:

答案 0 :(得分:1)

如果设置相同的开始和结束,则堆积将仅指向该特定位置。例如。 (纯samtools):

$ samtools mpileup -r chr1:808957-808957 YourFile.bam
chr1    808957  N   102 READSTRING READQUALITYSTRING

显示覆盖染色体1的位置808957的102个读数。

答案 1 :(得分:1)

我不认为pileup()是您想要的-根据pysam API,此函数返回“在基因组位置上的迭代器”,尤其是,“返回与该区域重叠的'所有'读数” 。返回的第一个基数将是第一个读取的第一个基数,而不必是查询中使用的区域的第一个基数。”

您是说您想获取“阅读次数信息”-也就是说,在该特定位置的阅读次数对吗?为此,count_coverage()应该可以完成这项工作。就您而言,我认为这段代码应该为您提供所需的答案:

import pysam

my_bam_file = '/path/to/your/bam_file.bam'
imported = pysam.AlignmentFile(my_bam_file, mode = 'rb')  # 'rb' ~ read bam
coverage = imported.count_coverage(
                  contig = '1',     # Chromosome ID; also might be "chr1" or similar 
                  start = 1599812,
                  stop = 1599813,
                  )
print(coverage)
  

请注意,这是可行的,因为如pysam API glossary中所述,   pysam使用半开间隔,因此范围[1599812,1599813)将   仅包含一个碱基对。

运行上面的代码将为您提供以下信息:

> (array('L', [0]), array('L', [0]), array('L', [0]), array('L', [0]))

是一个数组的元组,分别包含覆盖该基因组位置的读数中的A,C,G和T碱基数。如果您仅对映射到此特定基因组位置的总数感兴趣,则可以对该元组求和:

import numpy as np

print(np.sum(coverage))