Как я могу исправить эту ошибку: «BiopythonWarning: Частичный кодон, len (последовательность), не кратный трем.»? - PullRequest
0 голосов
/ 22 декабря 2018

Для назначения мне нужно написать код, который переводит последовательность РНК из файла фаста в последовательность аминокислот.Однако я продолжаю получать следующее предупреждающее сообщение: «BiopythonWarning: Частичный кодон, len (последовательность) не кратен трем. Явно обрежьте последовательность или добавьте конечный N перед трансляцией. Это может стать ошибкой в ​​будущем».

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

Это мой код:

from Bio.Seq import Seq
from Bio import SeqIO
seq_records = SeqIO.parse('rna.fasta', 'fasta')
amino_acids1 = []
amino_acids2 = []
amino_acids3 = []

for record in seq_records:

# starting from nucleotide 1
if len(record) %3 ==0:
     amino_acids1.append(record.translate())
elif (len(record)+1) %3 ==0:
    recordN = record + Seq('N')
    amino_acids1.append(recordN.translate())
elif (len(record)+2) %3 ==0:   
    recordNN = record + Seq('N') + Seq('N')
    amino_acids1.append(recordNN.translate())
print("FIRST")
print(amino_acids1)
with open('rna_out.fasta', 'w') as p_file: 
    SeqIO.write(amino_acids1, p_file, 'fasta')


# starting from nucleotide 2
record2 = record[1:]
if len(record2) %3 ==0:
     amino_acids2.append(record2.translate())
elif (len(record2)+1) %3 ==0:
    record2N = record + Seq('N')
    amino_acids2.append(record2N.translate())
elif (len(record2)+2) %3 ==0:   
    record2NN = record + Seq('N') + Seq('N')
    amino_acids2.append(record2NN.translate() )
print("SECOND")
print(amino_acids2)
with open('rna_out.fasta', 'w') as p_file: 
    SeqIO.write(amino_acids2, p_file, 'fasta')


# starting from nucleotide 3
record3 = record[2:]
if len(record3) %3 ==0:
    amino_acids3.append(record3.translate())
elif (len(record3)+1) %3 ==0:
    record3N = record + Seq('N')
    amino_acids3.append(record3N.translate())
elif (len(record3)+2) %3 ==0:
    record3NN = record + Seq('N') + Seq('N')
    amino_acids3.append(record3NN.translate())
print("THIRD")
print(amino_acids3)
with open('rna_out.fasta', 'w') as p_file: 
    SeqIO.write(amino_acids3, p_file, 'fasta')

Обычно это даст 3 возможных перевода для каждого изпоследовательности из файла fasta.Однако вывод не выглядит правильным.

Это первые 3 строки, которые должны быть 3 различными переводами первой последовательности в файле fasta:

FIRST [SeqRecord (seq = Seq ('GAKRTDRT S VINKLSLLYTSCETIDCYIFFL', HasStopCodon (ExtendedIUPACProtein (), '')), id = '', name = '', description = '', dbxrefs = [])] ВТОРОЙ [SeqRecord (seq = Seq ('GAKRTDRT S VINKLSLLYTSCETIDCYIFFL', HasStopCodon (ExtendedIUPACProtein (), '')), id = '', name = '', description = '',dbxrefs = [])] THIRD [SeqRecord (seq = Seq ('CQKN SDVVVGH QTVVALHVMRND LLYLFP', HasStopCodon (ExtendedIUPACProtein (), '')), id = ''= '', description = '', dbxrefs = [])]

Я не знаю, где это пошло не так, но это определенно неверный перевод.Если вы знаете, где я допустил ошибку, буду очень признателен за вашу помощь !!

1 Ответ

0 голосов
/ 30 декабря 2018

Ваш подход мог бы сработать, но в вашем коде есть ошибка копирования и вставки:

record2 = record[1:]
if len(record2) %3 ==0:
     amino_acids2.append(record2.translate())
elif (len(record2)+1) %3 ==0:
    record2N = record + Seq('N')

Обратите внимание, что record в последней строке должно быть record2.Вы делаете эту ошибку как минимум четыре раза.Я полагаю, что код @Chris_Rands дает вам ценную информацию о проблеме, например, переводе обратных дополнений, но я бы не советовал использовать в этом коде функцию pad_seq().

Ниже приведена доработка pad_seq() интегрировано в ваш код:

from Bio.Seq import Seq
from Bio import SeqIO

def pad_seq(sequence):
    """ Pad sequence to multiple of 3 with N """

    remainder = len(sequence) % 3

    return sequence if remainder == 0 else sequence + Seq('N' * (3 - remainder))

seq_records = SeqIO.parse('rna.fasta', 'fasta')

amino_acids1 = []
amino_acids2 = []
amino_acids3 = []

for record in seq_records:

    # starting from nucleotide 1
    amino_acids1.append(pad_seq(record).translate())
    print("FIRST")
    print(amino_acids1)
    # ...

    # starting from nucleotide 2
    record2 = record[1:]
    amino_acids2.append(pad_seq(record2).translate())
    print("SECOND")
    print(amino_acids2)
    # ...

    # starting from nucleotide 3
    record3 = record[2:]
    amino_acids3.append(pad_seq(record3).translate())
    print("THIRD")
    print(amino_acids3)
    # ...
...