Проблема Biopython в поиске мотивов в строках и удалении целевой последовательности

#python #biopython

#python #biopython

Вопрос:

Привет, у меня есть большой файл FASTA, который выглядит следующим образом

 >EMBOSS_001
GTCATCACAGTTTTCCCCGCCCTGTATATGGCTAATAGGCCCTCGCAATCTCCGATAAAT
>EMBOSS_002
CTGATGCTAGTCCCGTGTCCCAAACACTTCCGCAGAAGATCGCCCCGGGGGGCGTGTACC
>EMBOSS_003
CGCGCATGGACTCCATCCGTGATCTTTTGAGGCCATGAGTCCAAGTTTACCTCGGATATA
>EMBOSS_004
CGACCCGCCATTCTCCATCGTAACTTAGTCACGACGACAGTCAGCTTGTTCGTTCGTTAT
 

Я хотел бы найти все последовательности, которые имеют определенный мотив, и устранить их
Например, если мотивом является TTTCCC, ожидаемый результат должен быть:

 >EMBOSS_002 CTGATGCTAGTCCCGTGTCCCAAACACTTCCGCAGAAGATCGCCCCGGGGGGCGTGTACC
>EMBOSS_003 CGCGCATGGACTCCATCCGTGATCTTTTGAGGCCATGAGTCCAAGTTTACCTCGGATATA
>EMBOSS_004 CGACCCGCCATTCTCCATCGTAACTTAGTCACGACGACAGTCAGCTTGTTCGTTCGTTAT
 

Я написал код с помощью Biopython:

 from Bio.Seq import Seq
import Bio.motifs as motifs
from Bio import SeqIO

instances = [Seq("TTTCCC")]
m = motifs.create(instances)

reads = list(SeqIO.parse("/Users/EMBOSS-6.6.0/emboss/genome.fa", "fasta"))

for i in range(len(reads)):
    for pos, seq in m.instances.search(reads[i].seq):
        print("%i %s" % (pos, seq))
 

Однако он возвращает мне только информацию о позиции начала мотивов, 11 TTTCCC
Я хотел бы вернуть информацию о последовательности, в которой она была найдена:
EMBOSS_001 11 TTTCCC
Кроме того, я хотел бы, чтобы код исключал ту последовательность, в которой был найден мотив.

Кроме того, я не могу удалить строку, в которой был найден мотив, и записать ее в output

 for i in range(len(reads)):
    for pos, seq in m.instances.search(reads[i].seq):
        print(" %s %i %s" % (reads[i - 0][1:], pos, seq))
        del reads[i - 0:i]
        SeqIO.write(reads, "/Users/EMBOSS-6.6.0/emboss/results6.fa", "fasta")
 

Ответ №1:

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

Если структура файла такая, как вы упомянули, то одна из точек, которые вы можете вывести, заключается в том, что там, где проверяются экземпляры, они происходят на четной строке (скажем n ), и какую последовательность они представляют, это просто n-1 . Итак, для того, чтобы вы могли выводить в этом формате EMBOSS_001 11 TTTCCC , самый простой способ — использовать индекс i в качестве счетчика и определить последовательность.

Например: reads[i-1] даст вам последовательность >EMBOSS_001 для FASTA GTCATCACAGTTTTCCCCGCCCTGTATATGGCTAATAGGCCCTCGCAATCTCCGATAAAT . Чтобы удалить > , установите для него значение reads[i-1][1:] .

Чтобы устранить seq при TTTCCC обнаружении мотива, есть много способов сделать это. Самым простым было бы использовать del метод для объектов списка python. Это просто удалит последовательность и элемент, в котором встречается мотив.

Это можно сделать легко, и вот как это изменение будет выглядеть в вашем коде

 for pos, seq in m.instances.search(reads[i].seq):
        print(" %s %i %s" % (reads[i-1][1:],pos, seq))#should print in format EMBOSS_001 11 TTTCCC
        del reads[i-1:i]
 

Надеюсь, это должно решить проблему. Дайте мне знать, если у вас возникнут какие-либо ошибки.

Редактировать: мое первоначальное намерение записи должно было выглядеть так — я также добавил оператор break, чтобы посмотреть, решает ли это проблему.

 for i in range(len(reads)):
    for pos, seq in m.instances.search(reads[i].seq):
        print(" %s %i %s" % (reads[i - 0][1:], pos, seq))
        del reads[i - 0:i]
        break 
SeqIO.write(reads, "/Users/EMBOSS-6.6.0/emboss/results6.fa", "fasta")
 

Если после обнаружения мотивов эта последовательность будет устранена. Это означает, что теперь в метод должны быть записаны только строки без мотивов SeqIO.write() .

Комментарии:

1. привет, спасибо, это вроде сработало, но мне пришлось изменить на i-0 вместо i-1, потому что он указывал на ИДЕНТИФИКАТОР следующей последовательности, я думаю.

2. кстати, если я хочу записать в новый файл вывод, нужно ли мне использовать SeqIO.write?

3. да, я использовал SeqIO.write для записи файла fasta после удаления последовательности, в которой мотив был найден, как вы сказали, но последовательность не была удалена

4. да, вместо этого I-1 указывал на последнюю последовательность файла

5. @PaoloLorenzini Я думаю, вы можете использовать seqIO.write для записи выходных данных. Если последовательность появляется в файле записи, то это может быть связано с тем, что вы, возможно, записываете файл до удаления последовательности. Можете ли вы задать еще один вопрос о том, как вы пишете это и @ me здесь?

Ответ №2:

 for i in range(len(reads)):
    for pos, seq in m.instances.search(reads[i].seq):
        seq_rem = str(" %s %i %s" % (reads[i - 0][1:], pos, seq))
        reads_dict = SeqIO.to_dict(reads)
        seq_rem = seq_rem.splitlines()[0][5:]
del reads_dict[seq_rem]
SeqIO.write(reads_dict.values(), "/Users/EMBOSS-6.6.0/emboss/results10.fa", "fasta")
 

Мне удалось придумать что-то подобное, что работает