我有一个带有DNA序列的FASTA文件和序列的名称,我需要制作重叠分数的矩阵。我在Biopython中找到了模块pairwise2
,它似乎做得很好。除了我的序列已经对齐,当我使用pairwise2
时,它再次尝试对齐非常长的序列,并且显然每个对齐得到相同的重叠分数。所以我的问题是如何在没有尝试再次对齐序列的情况下获得重叠分数?
以下是我到目前为止的情况:
from Bio.Alphabet import IUPAC
from Bio import SeqIO
from Bio import pairwise2
fasta_file = SeqIO.parse('unambiguous.fasta', 'fasta', alphabet=IUPAC.ambiguous_dna)
all_seq = []
for seq_record in fasta_file:
all_seq += [str(seq_record.seq)]
compare = pairwise2.align.globalms(all_seq[0], all_seq[1], 2, -1, -1, 0)
print(compare)
我在这里只使用了FASTA文件中的第一个和第二个序列作为试用版。正如你在脚本中看到的,匹配应该奖励2点,不匹配和差距-1。当两个序列在同一位置上有间隙时,0应该是奖励。我知道把0放在第4位不会给我预期的结果,但我还没有解决这个问题。此时对齐问题似乎更大。 那么有没有使用pairwise2或其他python / biopython模块的人可以得到重叠分数?
答案 0 :(得分:0)
据我所知,unambiguous.fasta
包含对齐的基因序列。您可以使用适合您需求的评分函数对其进行评分:
from itertools import starmap, combinations
def score(seq1, seq2):
def score_(a, b):
return (0 if a == b == "-" # both are gaps
else -1 if a != b # mismatch or gap
else 2) # match
return sum(starmap(score_, zip(seq1, seq2)))
您可能希望修改它以忽略具有模糊基数的位置,就像人们通常那样。这是一种比较所有序列的简洁方法:
sequences = SeqIO.parse('unambiguous.fasta', 'fasta', alphabet=IUPAC.ambiguous_dna)
scores = starmap(score, combinations(sequences, 2))
一旦执行,scores
(注意它是一个惰性迭代器)将生成成对的分数矩阵的平顶上三角形。 score
应该可以很快地工作,尽管你可能想要重新实现使用Cython或Numba,以防有数千个序列(即数百万次比较计算)。
编辑在Python 2.x上,您可能希望将zip
替换为izip
。