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