Поиск аминокислотных мотивов в последовательности белка

У меня есть простая поисковая система, состоящая из словаря, в котором коды и последовательности 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 Loop для большей точности, чтобы получить результаты, как в первом случае, предполагая, что каждый мотив может быть несколько раз в каждой последовательности?

3 ответа

Если вы хотите найти все вхождения, вам просто нужно использовать 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

Вы можете повторить свое исследование подпоследовательностей:

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:])

Это не сработает, если ваш мотив пересекается с самим собой (например, если вы ищете AEA в AEAEA, вы получите только (AEA)EA, но не AE(AEA)), и в этом случае вам нужно более точное исследование.

Спасибо за предложение!

К сожалению, все примеры с циклами 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

Большое спасибо за помощь

Другие вопросы по тегам