Замена всех экземпляров буквы в столбце файла выравнивания FASTA

Я пишу сценарий, который может заменить все экземпляры аминокислотного остатка в столбце файла выравнивания FASTA. Используя AlignIO, я могу только прочитать файл выравнивания и извлечь из него информацию, но не могу изменить их последовательности. Более того, модуль MutableSeq может просто изменять последовательности строк, и если я использую ввод объекта seq, он не может его изменить. Я хотел бы найти модуль или метод для изменения файла выравнивания и сохранения его, пока он находится в структуре AlignIO как объект последовательности для последующих процедур.

Мой код, использующий только AlignIO:

alignment = AlignIO.read(input_handle, "fasta")
for record in alignment:
    if record.seq[10] == "G":
        record.seq[10] = "T"

Вывод:

record.seq[10] = "T"
TypeError: 'Seq' object does not support item assignment

Мой код, использующий как AlignIO, так и MutableSeq:

alignment = AlignIO.read(input_handle, "fasta")
for record in alignment[0:1, : ]:
    mut_align = MutableSeq(record.seq)
    mut_align.__delitem__(10)
    mut_align.insert(10, "T")
    print(mut_align)

Вывод:

del self.data[index]
TypeError: 'Seq' object doesn't support item deletion

person Reza Rezaei    schedule 01.02.2019    source источник


Ответы (1)


Это хороший вопрос, я думаю, что то, что вы делаете с MutableSeq, должно сразу работать или не работать, но вместо этого есть обходной путь:

from Bio import AlignIO

alignment = AlignIO.read('test.fasta', 'fasta')
for record in alignment:
    record.seq = record.seq.tomutable()
    if record.seq[2] == "G":
        record.seq[2] = "T"
    print(record)

Выходы:

ID: 1
Name: 1
Description: 1
Number of features: 0
MutableSeq('ATTAG')
ID: 2
Name: 2
Description: 2
Number of features: 0
MutableSeq('AATAG')

Для входных данных:

$ cat test.fasta 
>1
ATGAG
>2
AAGAG

Я считаю тот факт, что объект MutableSeq создается из объекта Seq в вашем примере, но этот метод не работает как ошибка, которую я зарегистрировал здесь: https://github.com/biopython/biopython/issues/1918


Вот еще один довольно неэффективный обходной путь, каждый раз перестраивающий строку, если вы хотите избежать использования MutableSeq все вместе:

alignment = AlignIO.read('test.fasta', 'fasta')
for record in alignment:
    if record.seq[2] == "G":
        record.seq = record.seq[:2] + 'T' + record.seq[3:]
    print(record)
person Chris_Rands    schedule 01.02.2019
comment
Спасибо за Ваш ответ. Однако я считаю, что для этой проблемы должна быть функция или метод Biopython! Я думаю, это слишком очевидно, что людям нужно модифицировать файлы выравнивания, чтобы Biopython пренебрегал ими! - person Reza Rezaei; 01.02.2019
comment
@RezaRezaei Смотрите мой отредактированный ответ, я предоставил обходной путь и зарегистрировал проблему с Biopython. - person Chris_Rands; 02.02.2019
comment
Спасибо за отредактированный ответ, а также за регистрацию проблемы в Biopython. Я думаю, что буду использовать метод без MutableSeq, который вы написали первым. - person Reza Rezaei; 02.02.2019