2012-06-13 4 views
2

Я работаю над алгоритмом соответствия для последовательности белка. Я начинаю с выровненной последовательности белка, и я пытаюсь преобразовать неправильно выровненную последовательность в правильно выровненную. Ниже приведен пример:Пит-код для сопоставления последовательности белков

оригинал выровнен последовательности: ---- АВ - CD -----

неправильно выравненные последовательности: -А - БК --- D-

ожидаемый результат должен выглядеть следующим образом:

оригинал выровнен последовательность: ---- AB - CD -----

неправильно выравненные последовательности: ---- AB - CD ---- - (оба сейчас то же самое)

Мне говорят, что очень специфические о моей проблеме, но последовательности, которые я пытаюсь сопоставить, составляют> 4000 символов, и выглядят смешно при вставке здесь. Однако я опубликую две последовательности, представляющие мою проблему, и это должно сделать.

seq="---A-A--AA---A--" 
newseq="AA---A--A-----A-----" 
seq=list(seq) #changing maaster sequence from string to list 
newseq=list(newseq) #changing new sequence from string to list 
n=len(seq) #obtaining length of master sequence 
newseq.extend('.') #adding a tag to end of new sequence to account for terminal gaps 

print(seq, newseq,n) #verification of sequences in list form and length 

for i in range(n) 
    if seq[i]!=newseq[i]: 
     if seq[i] != '-': #gap deletion 
      del newseq[i] 

     elif newseq[i] != '-': 
      newseq.insert(i,'-') #gap insertion 


     elif newseq[i] == '-': 
      del newseq[i] 


old=''.join(seq) #changing list to string 
new=''.join(newseq) #changing list to string 
new=new.strip('.') #removing tag 

print(old) #verification of master-sequence fidelity 
print(new) #verification of matching sequence 

Выход я получаю от этого конкретного кода и множество последовательностей:

--- АА - АА --- A--

--- АА - А- --- A ----- A -----

Я не могу заставить цикл правильно удалить ненужные штрихи между буквами более одного раза, поскольку остальные итерации цикла используются в паре штрих-кода добавьте тире/удалить.
Это хорошее начало здесь.

Как можно написать эту петлю, чтобы успешно получить свой желаемый результат (две идентичные последовательности)

+2

Там нет петли в этом код образца –

+0

Спасибо, что указали это! Я думаю, что я потерял команду цикла в тасовании. – AHuck

ответ

0

Я редактировал свой код и он дает правильный вывод в настоящее время:

seq="----AB--C-D-----" 
newseq="--A--BC---D-" 
seq=list(seq) #changing maaster sequence from string to list 
newseq=list(newseq) #changing new sequence from string to list 
n=len(seq) #obtaining length of master sequence 
newseq.extend('.') #adding a tag to end of new sequence to account for terminal gaps 

print(seq, newseq,n) #verification of sequences in list form and length 
for i in range(len(seq)): 
    if seq[i]!=newseq[i]: 
     if seq[i]=='-': 
      newseq.insert(i,'-') 

     elif newseq[i]=='-': 
      newseq.insert(i,seq[i]) 
     else: 
      newseq.insert(i,seq[i]) 

else: 
    newseq=newseq[0:len(seq)] 

old=''.join(seq) #changing list to string 
new=''.join(newseq) #changing list to string 
new=new.strip('.') #removing tag 

print(old) #verification of master-sequence fidelity 
print(new) #verification of matching sequence 

выход:

----AB--C-D----- 
----AB--C-D----- 

и AA---A--A-----A-----:

---A-A--AA---A-- 
---A-A--AA---A-- 
+1

. Этот алгоритм, как и предыдущий, не учитывает возможное несоответствие между конкретными позициями, строками разных размеров и не имеет возврата, если после этого возникает более хорошее решение. Пожалуйста, подумайте о динамическом программировании. – rlinden

+0

Я обязательно буду стремиться к динамическому программированию для будущей работы. Однако этот код работает в моих непосредственных целях (последовательности всегда одного и того же порядка, есть только одно решение, и этот код работает для строк разного размера). Благодаря! – AHuck

3

Проблема выравнивания последовательностей хорошо известна и ее решение хорошо описывается. Для вводного текста см. Wikipedia. Лучшее решение, которое я знаю, включает в себя динамическое программирование, и вы можете увидеть пример реализации Java на this site.

Смежные вопросы