从 fasta 文件估计 Biopython 中的字母表

Estimate Alphabet in Biopython from fasta file

我正在寻找一种方法来读取 Biopython 中的 .fasta 文件,并估计我们处理的是 DNA、RNA 还是蛋白质。 到目前为止,我读取的数据是这样的:

with open('file.fasta', 'r') as f:
    for seq in sio.parse(f, 'fasta'):
        # do stuff, depending on alphabet

我现在的问题是我不知道我会在 .fasta 文件中找到什么样的序列。它可以是蛋白质、DNA 或 RNA,但我必须知道字母表中的字母数。

有没有办法从 Biopython 的序列中 "estimate" 字母表?我知道一个人可能有一种只包含字母 ACGT 的蛋白质,这就是为什么我想估计字母表的原因。

这对于小序列来说很难做到。例如,序列 ACGCGACAGA 可以是 DNA、RNA 或蛋白质序列,因为字母 ACG 对于所有三个字母表都是通用的。在没有其他知识的情况下,无法估计哪个是最佳匹配。

以下代码将打印出给定 FASTA 文件中第一条记录所属的所有字母表:

from Bio import SeqIO
from Bio.Alphabet.IUPAC import *

alphabets = [extended_protein,  ambiguous_dna, unambiguous_dna, extended_dna, ambiguous_rna, unambiguous_rna]

def validate(seq, alphabet):
    "Checks that a sequence only contains values from an alphabet"
    # inspired by https://www.biostars.org/p/102/
    leftover = set(str(seq).upper()) - set(alphabet.letters)
    return not leftover

with open("example.fasta") as handle:
    first_record = list(SeqIO.parse(handle, "fasta"))[0]
    valid_alphabets = [str(alphabet) for alphabet in alphabets if validate(first_record.seq, alphabet)]
    print("Valid alpahabet(s) for fasta file: {}".format(', '.join(valid_alphabets)))

因此,对于序列 ACGCGACAGA 这将打印:

Valid alpahabet(s) for fasta file: ExtendedIUPACProtein(), IUPACAmbiguousDNA(), IUPACUnambiguousDNA(), ExtendedIUPACDNA(), IUPACAmbiguousRNA(), IUPACUnambiguousRNA()

但是对于序列 MKQHKAMIVALIVICITAVVAALVTRKDLCEVHIRTGQTEVAVFX 它将打印:

Valid alpahabet(s) for fasta file: ExtendedIUPACProtein()