2016-12-08 7 views
3

Я довольно новичок в мире программирования python, и я пытаюсь написать сценарий, который, учитывая файл FASTA, будет сравнивать последовательности друг с другом и оценивать их (если положение нуклеотида в последовательности A совпадает с нуклеотид в том же положении последовательности B, тогда оценка повысилась бы, например, на 2). До сих пор я получил это:Python: Как сравнить несколько последовательностей из файла fasta друг с другом?

from Bio import SeqIO 


def sequence_compare(file): 
    seq_records = SeqIO.parse(file, "fasta") 
    for record in seq_records: 
     len1 = len(str(record.seq)) 
     sequence1 = str(record.seq) 
     print(sequence1) 
     for record in seq_records: 
      len2= len(str(record.seq)) 
      sequence2 = str(record.seq) 
      print(sequence2) 
      a = 0 
      for pos in range (0,min(len1,len2)) : 
       if sequence1[pos] == sequence2[pos]: 
        a+= 2 
       if sequence1[pos] != sequence2[pos]: 
        a+= -1 
       if sequence1[pos] == sequence2[pos] == '-': 
        a+= -2 
      print(a) 

Выход он дает для файла Fasta с 3 последовательностями в нем:

ACTGACTGACTGACTGACTG 
ACTGACTGACTG-ACTGACT 
16 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
-5 

Мне кажется, что первый цикл только петли один раз, а второй для цикл не начинается с первой последовательности.

Желаемый результат будет заключаться в том, что каждая последовательность сравнивается друг с другом и забивается. Таким образом, последовательность 1 по сравнению с последовательностью 1 и ее оценкой, последовательность 1 по сравнению с последовательностью 2 и ее оценкой, последовательность 1 по сравнению с последовательностью 3 и ее оценкой и т. Д.

Если кто-то может мне помочь, это было бы весьма полезно !

+0

Почему вы делаете свой собственный (довольно упрощенно) алгоритм подсчета очков? 'Bio.Align' есть много на выбор. – MattDMo

+0

Я не знал, что существует в Bio.Align. Спасибо за предложение, я посмотрю на это! –

ответ

1

Причина, по которой ваш код не работает, заключается в том, что вы использовали ту же переменную цикла record как для внутренней, так и для внешней петель. Вы можете изменить его на record1 и record2 соответственно.

Но еще лучше, python обеспечивает поддержку для создания парных комбинаций в itertools.combinations(), поэтому вы можете избежать вложенных циклов.

Кроме того, было бы лучше перенести ваши алгоритмы подсчета в отдельную функцию.

С учетом указанных выше двух изменений в виду, вот код:

from Bio import SeqIO 
from itertools import combinations 


def score(sequence1, sequence2): 
    a = 0 
    for pos in range(0, min(len(sequence1), len(sequence2))): 
     if sequence1[pos] == sequence2[pos]: 
      a += 2 
     if sequence1[pos] != sequence2[pos]: 
      a += -1 
     if sequence1[pos] == sequence2[pos] == '-': 
      a += -2 
    return a 


def sequence_compare(file): 
    seq_records = SeqIO.parse(file, "fasta") 
    for record1, record2 in combinations(seq_records, 2): 
     sequence1 = record1.seq 
     sequence2 = record2.seq 
     a = score(sequence1, sequence2) 
     print(sequence1) 
     print(sequence2) 
     print(a) 
+0

Это действительно работает! Спасибо огромное! Но что, если мне хочется сравнить последовательность с собой? Итак, сравните последовательность 1 с последовательностью 1? Я знаю, что это не практично, но возможно ли это с комбинациями? Благодаря! :) –

+0

@ D.Teeki Да. Просто используйте ссылку itertools.combinations_with_replacement(): https://docs.python.org/3/library/itertools.html#itertools.combinations_with_replacement – azalea