创建三个阅读框的列表列表

时间:2014-05-17 06:48:00

标签: python bioinformatics

所以我认为在三个不同的帧上读取序列会很酷,我在下面粘贴了它。但是,我遇到了一个难题:如何列出清单。看,我想要一个最终输出显示带有+或a的帧类型的数据,以表示读取的方向(+ 1,+ 2,+ 3,-1,-2,-3),每个起始密码子的数字位置及其终止密码子,以及起始密码子和终止密码子之间的长度。 (我只是寻找最长的ORFs)输出的一个例子如下:

 +1 57166..61908  4743. 

我之所以喜欢列表列表,是因为我可以使用下面代码中找到的所有Starts,存储它,然后能够以某种方式将它放入输出中。我认为列表列表可能是从三个不同帧中获取此信息的最佳方式。但是,我不知道如何解决这个问题......有人可以给我一个开始的方法吗? while循环工作正常,上次检查时。感谢。

def codons(self, frame_one, frame_two, frame_three): 
    while frame_one <=len(self.seq): 
        yield (self.seq[frame_one:frame_one+3]) 
        frame_one += 3

    while frame_two <=len(self.seq):
        yield (self.seq[frame_two:frame_two+3])
        frame_two += 3

    while frame_three <=len(self.seq):
        yield (self.seq[frame_three:frame_three+3])
        frame_three += 3

val = seq.codons(0,1,2)

for i in val:
    return(i)

self.startlist.append[[frame_one], [frame_two], [frame_three]]

2 个答案:

答案 0 :(得分:0)

一些建议:

  1. return仅用于函数定义和生成器,而不是其他任何地方。您可能希望替换print()

  2. frame_oneframe_twoframe_three(我假设,因为我们无法看到您的其余代码)函数参数,并且可以&#39 ;在函数外部访问。那么,你的最后一个陈述,似乎是在函数定义之外(你的缩进是正确的吗?),不会像你期望的那样工作,甚至根本没有。

  3. 同样,由于我们无法查看您的代码,因此不清楚seq是什么 - 它是您班级的另一项功能吗?它是班级的一个实例吗?它是一个类属性吗?无论是什么,请确保在所有情况下都正确引用它。您在self.seq语句中引用了while,让我相信它是该课程的另一部分 - 可能是一个属性,因为您正在计算其长度。但是,在函数之外,seq成为某种实例对象,调用其方法codon()。您无法做到 - 请尝试拨打self.codon()

  4. 仔细查看您的代码,在Python REPL中逐行运行,并确保其真正正常运行。然后,回过头来问一个合理的问题,展示一些示例输入和预期输出,并清楚地描述 你想做什么,到目前为止你为实现它做了什么,以及如有必要,可能会出现相关错误的完整文本。我是一名生命科学家,所以我知道ORF是什么,但至少快速解释或链接到维基百科也是合适的。

答案 1 :(得分:0)

我想你有一系列来自DNA的核苷酸,你想知道序列的三个框架中是否有任何一个。我建议使用Biopython来做到这一点,但还有其他方法可以在不使用&#34;标准的情况下制作它#34;解。在这里,我提出了一个我自己的解决方案。

主要问题是如何获得蛋氨酸和终止密码子的位置(长度只是在它们被发现的位置之间休息)。要做到这一点,我们需要知道他们是怎么做的:

start = 'AUG'
stop = ('UAA', 'UGA', 'UAG')

ORF的起点是编码蛋氨酸的密码子,止点可以是任何琥珀,赭石或蛋白石密码子。

现在我们可以列出他们在哪里:

sequence = "ATATAGACATCGAATACTAATAGCATACAGTCCAAATTCGGAGCCCGACATTCTTCGATAACGACCGCTGATTATATGGGGCTCCGTCTACTCTAGGAGTTCTTGGCTGAGCCCTTCTAATTACCCACCGGGTGGCACACCAAGGACCGAAAAACCGTGGCCCGTGGGGAAAGTATCAGAACGGTACGGACCGTTTTTCCACCTCAAGGGACACCTTTGTCCCCGCCAATTATGCCAACCTCTCATAGTATTATATCTCCTCAATTTCTATGTGCGCAGTGTCTGTATGTTAGGACGCGCATGCACTGAAATGGCGATAGTGTGAATACATAGGTCATCTTGTGCCAGTGGCTGACTGATCGTCTACAAGTGACAATGCTGTGAATAACAAGATTGTGCACATGTCTAACCCGTGAGCTGGAGCTCCATAGCTATGGAGCTCCAGCTCACGGGTTAGACATTTTACAGTAGCGTACATTTCTGGCCGACCAACAGTGCATGGAGTTCAAGGCACATCCTTACTAAATTCTCCGTGTCCAGATTTAACAGCGAAGACGCTTTCCACGGACACAAGTATGAAAAGCGGCCGAAGGGGTCATTTGGACCAATGGACTGTTAGCGATACGCAAGAGTGAAAGGCGGGCGATCCACATTACAAATCCCTATCAGGACTGCGAATAAGATTTTCCTGAATATGAGTGGTGTGGACAGAGCTATGTTTTTCGAATTCCGCACACTCGAGTGCGCGGCCTTCTCAGAGTTTTAAACTTTGCCTGGGTACTGATTATTATAGTCCAAGTAGAATAGTCACTCTATATTTTTAATAGAATGCGGGTGACACCGGCAAGAGAACCGAGCATTT"

start = 'ATG'
stop = ('TAA', 'TGA', 'TAG')
stop_positions = []
start_positions = []

# Normal direction
for i in range(len(sequence)): # Create the index value
    if sequence[i:].startswith(start): # Check if there is a methionine in this position.
        start_positions.append(i)
    else:
        for stop_codon in stop:
            if sequence[i::].startswith(stop_codon): # Check if there is a stop in this position.
                stop_positions.append(i)
                break

要反转它们,我们可以执行sequence = sequence[::-1],然后重复上述代码。 (请注意,如果您这样做,您将获得相反的索引) 现在我们需要得到哪个是ORF而哪个不是。我们可以通过几个循环来实现:

for start_ in start_positions:
    for  stop_ in stop_positions:
        if stop_ <= start_:
            continue
        else:
            print("{}...{}".format(start_, stop_))
            break

要获得框架的名称很简单,除以3开始,模数为-1是框架。

以上是上述代码的输出,您可以看到我没有实现您需要的所有内容,但添加它并不复杂。

75...93
231...245
269...290
286...290
300...306
310...317
375...381
401...406
433...454
498...522
575...576
607...616
694...695
715...763
828...835
Reversed sequence
# Note that the indexes start from 1, to get the real index do len(sequence) -index
61...62 
82...101
286...287
387...393
392...393
575...582
612...613
676...688
687...688

一些注意事项:

检查长度是否超过1个核苷酸。一种更快的方法是翻译序列并获得蛋氨酸和停止代码之间的所有内容。如果您有其他版本可能需要更改某些内容,则此代码适用于python 3。

如果您无法调整此代码以获取相应的代码,您可能需要改进此代码以获得您想要的确切结果,您不能真正了解它的工作方式,请注意以下内容,或者如果您有高级或你有主要问题,这会引发一个新问题并等待。 (我不想直接回答罗莎琳德的问题)