有趣的问题!据我所知,没有内置的东西BioPython
。这是我将如何解决它。
让我们从您的示例 2 开始。如果您获取两个文件enolase.txt
,enolase.aln
并分别使用 FASTA 格式的原始未对齐序列和对齐序列,那么我们可以遍历压缩记录,计算对齐序列中的间隙数并计算索引未封闭序列中的残基:
from Bio import SeqIO, AlignIO
def find_in_original(index, original_path, alignment_path):
alignment = AlignIO.read(alignment_path, 'fasta')
original = SeqIO.parse(original_path, 'fasta')
for original_record, alignment_record in zip(original, alignment):
alignment_seq = str(alignment_record.seq)
original_seq = str(original_record.seq)
gaps = alignment_seq[:index].count('-')
original_index = len(alignment_seq[:index]) - gaps
assert alignment_seq[index] == original_seq[original_index]
yield ("The conserved residue {} at location {} in the alignment can be"
" found at location {} in {}.".format(alignment_seq[index],
index, original_index, original_record.id.split('|')[-1]))
结果如下:
>>> for result in find_in_original(394, 'enolase.txt', 'enolase.aln'):
... print result
The conserved residue K at location 394 in the alignment can be found at location 392 in ENO_ECOLI.
The conserved residue K at location 394 in the alignment can be found at location 389 in ENO_BACSU.
对于反向操作,我们查看对齐中所有可能的索引,如果我们减去间隙,看看哪一个等于未加间隙的序列:
def find_in_alignment(index, organism, original_path, alignment_path):
alignment = AlignIO.read(alignment_path, 'fasta')
original = SeqIO.parse(original_path, 'fasta')
for original_record, alignment_record in zip(original, alignment):
if organism in original_record.id:
alignment_seq = str(alignment_record.seq)
original_seq = str(original_record.seq)
residue = original_seq[index]
for i in range(index, len(alignment_seq)):
if alignment_seq[i] == residue and \
alignment_seq[:i].replace('-', '') == original_seq[:index]:
return ("The residue {} at location {} in {} is at location"
" {} in the alignment.".format(residue, index,
organism, i))
结果如下:
>>> print find_in_alignment(392, 'ENO_ECOLI', 'enolase.txt', 'enolase.aln')
The residue K at location 392 in ENO_ECOLI is at location 394 in the alignment.
>>> print find_in_alignment(389, 'ENO_BACSU', ungapped_path, alignment_path)
The residue K at location 389 in ENO_BACSU is at location 394 in the alignment.