Парное выравнивание Biopython приводит к ошибке сегментации при запуске в цикле - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь запустить попарно метод глобального выравнивания в biopython в цикле для примерно 10000 пар строк. Каждая строка в среднем состоит из 20 символов. Запуск метода для одной пары последовательностей работает нормально. Но выполнение этого в цикле, всего для 4 пар, приводит к ошибке сегментации. Как это можно решить?

from Bio import pairwise2
def myTrial(source,targ):

     if source == targ:
         return [source,targ,source]

     alignments = pairwise2.align.globalmx(source, targ,1,-0.5)
     return alignments
sour = ['najprzytulniejszy', 'sadystyczny', 'wyrzucić', 'świat']
targ = ['najprzytulniejszym', 'sadystycznemu', 'wyrzucisz', 'świat']
for i in range(4):
   a = myTrial(sour[i],targ[i])

1 Ответ

0 голосов
/ 30 июня 2018

Ошибка сегментации происходит не потому, что вы используете цикл, а потому, что вы предоставляете символы не ASCII в качестве входных данных для режима выравнивания, который принимает только строковые входные данные ASCII. К счастью, Bio.pairwise2.align.globalmx также позволяет выравнивать списки, которые содержат произвольные строки символов ASCII и не-ASCII в качестве токенов (то есть выравнивание списков строк, таких как ['ABC', 'ABD'] с ['ABC', 'GGG'], для получения выравниваний, подобных

['ABC', 'ABD', '-'  ]
['ABC', '-'  , 'GGG']

или, в вашем случае, выравнивание списков не-ASCII символов, таких как ['ś', 'w', 'i', 'a', 't'] и ['w', 'y', 'r', 'z', 'u', 'c', 'i', 's', 'z'], для получения выравниваний, таких как

['ś', 'w', '-', '-', '-', '-', '-', 'i', 'a', 't', '-', '-']
['-', 'w', 'y', 'r', 'z', 'u', 'c', 'i', '-', '-', 's', 'z']

Для этого с помощью Biopython в вашем коде замените

alignments = pairwise2.align.globalmx(source, targ,1,-0.5)

с

alignments = pairwise2.align.globalmx(list(source), list(targ), 1, -0.5, gap_char=['-'])

Так что для ввода

source = 'świat'
targ = 'wyrzucisz'

измененный код будет выдавать

[(['ś', 'w', '-', '-', '-', '-', '-', 'i', 'a', 't', '-', '-'],
  ['-', 'w', 'y', 'r', 'z', 'u', 'c', 'i', '-', '-', 's', 'z'],
  2.0,
  0,
  12)]

вместо ошибки сегментации.

И поскольку каждый токен в списке имеет длину всего один символ, вы можете также преобразовать полученные выровненные списки обратно в строки, используя:

new_alignment = []

for aln in alignment:
    # Convert lists back into strings
    a = ''.join(aln[0])
    b = ''.join(aln[1])

    new_aln = (a, b) + aln[2:]
    new_alignment.append(new_aln)

В приведенном выше примере new_alignment будет тогда

[('św-----iat--', '-wyrzuci--sz', 2.0, 0, 12)]

по желанию.

...