【问题标题】:Looking for the amino acids motifs within protein sequence寻找蛋白质序列中的氨基酸基序
【发布时间】:2014-05-13 15:21:30
【问题描述】:

我有一个简单的搜索引擎,其中包含多个条目的 UniProt 代码和序列。

最终我想在所有这些序列中找到一些基序,并在每个序列中打印其位置(仅起始氨基酸)。

对于简单的图案,我使用下面的代码完成了这样的任务

#Simple definition of the motif 
motif='AA'

for u, seq in dict.iteritems():
    for i in range(len(seq)):
        if seq[i:].startswith(motif):
            print "%s has been found in %d position of %s"%(motif, i+1, u)
            continue

我的字典在哪里

>>> dict
{'P07204_TRBM_HUMAN': 'MLGVLVLGALALAGLGFPAPAEPQPGGSQCVEHDCFALYPGPATFLNASQICDGLRGHLMTVRSSVAADVISLLLNGDGGVGRRRLWIGLQLPPGCGDPKRLGPLRGFQWVTGDNNTSYSRWARLDLNGAPLCGPLCVAVSAAEATVPSEPIWEEQQCEVKADGFLCEFHFPATCRPLAVEPGAAAAAVSITYGTPFAARGADFQALPVGSSAAVAPLGLQLMCTAPPGAVQGHWAREAPGAWDCSVENGGCEHACNAIPGAPRCQCPAGAALQADGRSCTASATQSCNDLCEHFCVPNPDQPGSYSCMCETGYRLAADQHRCEDVDDCILEPSPCPQRCVNTQGGFECHCYPNYDLVDGECVEPVDPCFRANCEYQCQPLNQTSYLCVCAEGFAPIPHEPHRCQMFCNQTACPADCDPNTQASCECPEGYILDDGFICTDIDECENGGFCSGVCHNLPGTFECICGPDSALARHIGTDCDSGKVDGGDSGSGEPPPSPTPGSTLTPPAVGLVHSGLLIGISIASLCLVVALLALLCHLRKKQGAARAKMEYKCAAPSKEVVLQHVRTERTPQRL', 'B5ZC00': 'MKNKFKTQEELVNHLKTVGFVFANSEIYNGLANAWDYGPLGVLLKNNLKNLWWKEFVTKQKDVVGLDSAIILNPLVWKASGHLDNFSDPLIDCKNCKARYRADKLIESFDENIHIAENSSNEEFAKVLNDYEISCPTCKQFNWTEIRHFNLMFKTYQGVIEDAKNVVYLRPETAQGIFVNFKNVQRSMRLHLPFGIAQIGKSFRNEITPGNFIFRTREFEQMEIEFFLKEESAYDIFDKYLNQIENWLVSACGLSLNNLRKHEHPKEELSHYSKKTIDFEYNFLHGFSELYGIAYRTNYDLSVHMNLSKKDLTYFDEQTKEKYVPHVIEPSVGVERLLYAILTEATFIEKLENDDERILMDLKYDLAPYKIAVMPLVNKLKDKAEEIYGKILDLNISATFDNSGSIGKRYRRQDAIGTIYCLTIDFDSLDDQQDPSFTIRERNSMAQKRIKLSELPLYLNQKAHEDFQRQCQK', 'A2Z669': 'MRASRPVVHPVEAPPPAALAVAAAAVAVEAGVGAGGGAAAHGGENAQPRGVRMKDPPGAPGTPGGLGLRLVQAFFAAAALAVMASTDDFPSVSAFCYLVAAAILQCLWSLSLAVVDIYALLVKRSLRNPQAVCIFTIGDGITGTLTLGAACASAGITVLIGNDLNICANNHCASFETATAMAFISWFALAPSCVLNFWSMASR', 'P20840_SAG1_YEAST': 'MFTFLKIILWLFSLALASAININDITFSNLEITPLTANKQPDQGWTATFDFSIADASSIREGDEFTLSMPHVYRIKLLNSSQTATISLADGTEAFKCYVSQQAAYLYENTTFTCTAQNDLSSYNTIDGSITFSLNFSDGGSSYEYELENAKFFKSGPMLVKLGNQMSDVVNFDPAAFTENVFHSGRSTGYGSFESYHLGMYCPNGYFLGGTEKIDYDSSNNNVDLDCSSVQVYSSNDFNDWWFPQSYNDTNADVTCFGSNLWITLDEKLYDGEMLWVNALQSLPANVNTIDHALEFQYTCLDTIANTTYATQFSTTREFIVYQGRNLGTASAKSSFISTTTTDLTSINTSAYSTGSISTVETGNRTTSEVISHVVTTSTKLSPTATTSLTIAQTSIYSTDSNITVGTDIHTTSEVISDVETISRETASTVVAAPTSTTGWTGAMNTYISQFTSSSFATINSTPIISSSAVFETSDASIVNVHTENITNTAAVPSEEPTFVNATRNSLNSFCSSKQPSSPSSYTSSPLVSSLSVSKTLLSTSFTPSVPTSNTYIKTKNTGYFEHTALTTSSVGLNSFSETAVSSQGTKIDTFLVSSLIAYPSSASGSQLSGIQQNFTSTSLMISTYEGKASIFFSAELGSIIFLLLSYLLF'}

这会打印所有三个序列中的所有 AA 基序位置。

现在我想使用 RE 沿着这些序列找到复杂的基序。

# search complex motifs using regular expressions
for u, seq in dict.iteritems():
        m=re.search(r"N[^P](S|T)[^P]", seq[:])
        if re.search(r"N[^P](S|T)[^P]", seq[:]):
            print "%s has been found at the %s position in %s"%(m.group(), str(m.start()+1), u)
            continue

使用此代码,我只能在序列中检测一次主题。假设每个基序在每个序列中可以多次出现,我应该如何定义加法 FOR 循环以获得更准确的结果?

【问题讨论】:

    标签: python bioinformatics dna-sequence


    【解决方案1】:

    感谢您的建议!

    不幸的是,所有带有 WHILE 循环的示例都产生了错误结果的不定式循环。

    我已经使用 re.match 方法和我的第一个算法解决了这个问题。我怎样才能提高这种循环的效率

    for u, seq in dict.iteritems():
        for i in range(len(seq)):
            if re.match(motif, seq[i:]):
                print "%s has been found in %d position of %s"%(motif, i+1, u)          
                found[u]=i+1
                continue
    

    我也对在这个循环中定义的找到的字典有问题,应该附加值(每个 Uniprot 代码(键)的找到的主题的位置。下面你可以看到,在循环之后,只有每个键的最后一个位置被附加了在多个位置发现了图案

    {'P07204_TRBM_HUMAN': 409, 'B5ZC00': 395, 'P20840_SAG1_YEAST': 614}
    

    还有如何以显式形式呈现motif=re.compile(r"N^P[^P]")。您可以在下面看到一些错误的结果,首先应该定义主题

    <_sre.SRE_Pattern object at 0x7f4ee5b11b70> has been found in 364 position of P20840_SAG1_YEAST
    <_sre.SRE_Pattern object at 0x7f4ee5b11b70> has been found in 402 position of P20840_SAG1_YEAST
    <_sre.SRE_Pattern object at 0x7f4ee5b11b70> has been found in 485 position of P20840_SAG1_YEAST
    <_sre.SRE_Pattern object at 0x7f4ee5b11b70> has been found in 501 position of P20840_SAG1_YEAST
    <_sre.SRE_Pattern object at 0x7f4ee5b11b70> has been found in 614 position of P20840_SAG1_YEAST
    

    非常感谢您的帮助

    【讨论】:

      【解决方案2】:

      如果要查找所有匹配项,只需使用findall 而不是search。它返回结果列表而不是单个结果。

      另外,您正在以一种比它需要的慢得多的方式进行简单的主题搜索。与其对字符串进行多次分区(seq[i:])并在分区上使用startswith,不如考虑在整个字符串上多次使用string.index

      motif='AA'
      
      for u, seq in dict.iteritems():
          i=-1 #start search at the beginning of the sequence
          while True:
              try:
                  i= seq.index(motif, i+1) #get the index of the next occurrence
                  print "%s has been found in %d position of %s"%(motif, i+1, u)
              except ValueError:
                  break #no more motifs found
      

      【讨论】:

        【解决方案3】:

        您可以重复您对子序列的研究:

        for u, seq in dict.iteritems():
            start = 0;
            m=re.search(r"N[^P](S|T)[^P]", seq[start:])
            while (m) :
                print "%s has been found at the %s position in %s"%(m.group(), str(m.start()+1), u)
                start = m.start()
                m=re.search(r"N[^P](S|T)[^P]", seq[start:])
        

        如果您的主题与其自身重叠(即,如果您在 AEAEA 中查找 AEA,您只会得到 (AEA)EA 而不是 AE(AEA)),这将不起作用,在这种情况下,您需要进行更精确的研究。

        【讨论】:

          猜你喜欢
          • 2014-11-28
          • 1970-01-01
          • 2020-07-21
          • 2014-03-28
          • 1970-01-01
          • 2014-04-08
          • 2013-12-10
          • 2020-05-01
          • 2019-11-17
          相关资源
          最近更新 更多