Замена всех экземпляров буквы в столбце файла выравнивания FASTA - PullRequest
0 голосов
/ 01 февраля 2019

Я пишу сценарий, который может заменить все экземпляры аминокислотного остатка в столбце файла выравнивания 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

1 Ответ

0 голосов
/ 01 февраля 2019

Это хороший вопрос, я думаю, что то, что вы делаете с 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 all-вместе:

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)
...