用于将SNP映射到CDS的Python脚本

时间:2017-04-10 14:16:09

标签: python bioinformatics

我正在尝试制作一个能够识别CDS SNP的程序。它从两个文件中填充两个字典,一个包含SNP,另一个包含GFF3文件。其中一个从GFF3文件填充的dicts包含CDS名称及其作为元组的位置。

一个例子:

cds_pos = {'PRELSG_0019500_6': ('2091320', '2092988'), 'PRELSG_1338600_3': ('1542760','1542853'), 'PRELSG_0013000_1': ('1275531', '1275568')}

另一个字典包含染色体和SNP的位置,例如。

chrom_pos = {'PRELSG_13_v1': {'272093', '964287', '844454', '65770', '336211', '36660'}, 'PRELSG_12_v1': {'1270177', '1368630'}}

我的想法是迭代两个dicts并进行成对比较,看看是否在CDS的间隔中找到了SNP位置。我尝试了下面的代码,但它似乎没有用。

for chrom, snp_pos in chrom_pos.items():
    for cds, pos in cds_pos.items():
            if pos[0] <= str(snp_pos) <= pos[1]:
                print(cds)
                print(snp_pos)

对于我发现不起作用的事情。首先,没有什么能满足interval if语句。其次,因为SNP的位置可以在几条染色体上找到,所以需要考虑这一点,我尝试使用chrom == gene语句。这似乎不起作用。

很高兴任何想法和评论都要继续。感谢

编辑:

到目前为止,我的脚本看起来像:

cds_snp = defaultdict(set)
for chrom, snp_pos in chrom_pos.items():
        for cds, pos in cds_pos.items():
            ed_chrom = chrom[:9]
            ed_cds = cds[:9]
            if ed_cds == ed_chrom:
                for i in snp_pos: # Iterate through the set of snp positions
                    if int(pos[0]) <= int(i) <= int(pos[1]):
                        cds_snp[cds].add(i)

for i,j in sorted(cds_snp.items()):
    print(i)
    print('\n'.join(j))

我必须找到一种方法来评估输出是否正确,但似乎是合理的。

2 个答案:

答案 0 :(得分:3)

为了让您的代码正常运行,需要解决一些问题:

  

因为SNP的位置可以在几条染色体上找到,所以需要考虑这一点,我尝试使用chrom ==基因声明。

您正尝试将SNP与CDS中的位置相关联。但是,你似乎没有CDS位置的染色体(只是名字)。从您发布的示例中,您的CDS名称为'PRELSG_0019500_6', 'PRELSG_1338600_3', 'PRELSG_0013000_1',您的染色体名称为'PRELSG_10_v1', 'PRELSG_12_v1'。没有这些匹配的情况,说实话,他们看起来有不同的格式,你永远不会有chrom == gene

的情况

CDS名称中是否有一些识别信息可能会告诉您它是什么染色体?如果有,您可以从染色体名称中提取染色体编号(即来自&#39; PRELSG_12_v1&#39;),并将其与CDS名称中提取的染色体编号进行比较。

  

无法满足if语句

的间隔

由此我假设你的意思是if pos[0] <= str(snp_pos) <= pos[1]:

有一个简单的解释,为什么这不起作用。当您首次从字典中提取要素时:

for chrom, snp_pos in chrom_pos.items():
    for gene, pos in gene_pos.items():

你提取snp_pos。这不是个人立场,而是一组立场。要迭代各个位置,您可以添加另一个循环:

for snpPos in snp_pos:

最后,为了正确起见,最好将interval语句保持为整数。即将其写为

if int(pos[0]) <= int(snpPos) <= int(pos[1]): 

答案 1 :(得分:0)

可能会过度简化您的问题。

我们可以使用mysql或UCSC表格浏览器下载所有CDS区域,请参阅this example post

然后使用bedtools与merge on overlap SNP床文件。