Поиск аминокислотных мотивов в последовательности белка
У меня есть простая поисковая система, состоящая из словаря, в котором коды и последовательности 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
Большое спасибо за помощь