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

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


person user3470313    schedule 02.04.2014    source источник


Ответы (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
person loopbackbee    schedule 02.04.2014

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

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)), и в этом случае вам нужно более точное исследование.

person Math    schedule 02.04.2014

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

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

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

person user3470313    schedule 02.04.2014