0

初めてBiopythonを使用しています。未知の生物の配列データがあり、BLAST を使用して、それらがどの生物に由来する可能性が最も高いかを判断しようとしています。私はそれを行うために次の関数を書きました:

def find_organism(file):
    """
    Receives a fasta file with a single seq, and uses BLAST to find
    from which organism it was taken.
    """
    # get seq from fasta file
    seqRecord = SeqIO.read(file,"fasta")
    # run BLAST
    blastResult = NCBIWWW.qblast("blastn", "nt", seqRecord.seq)
    # get first hit
    blastRecord = NCBIXML.read(blastResult)
    firstHit = blastRecord.alignments[0]
    # get hit's gi number
    title = firstHit.title
    gi = title.split("|")[1]
    # search NCBI for the gi number
    ncbiResult = Entrez.efetch(db="nucleotide", id=gi, rettype="gb", retmode="text")
    ncbiResultSeqRec = SeqIO.read(ncbiResult,"gb")
    # get organism
    annotatDict = ncbiResultSeqRec.annotations
    return(annotatDict['organism'])

正常に動作しますが、種ごとに生物を取得するのに約 2 分かかります。これは非常に遅いように思えます。私はもっ​​とうまくやれるかどうか疑問に思っています。パフォーマンスを向上させるために NCBI のローカル コピーを作成する可能性があることはわかっています。ただし、最初に BLAST にクエリを実行し、次に ID を取得してそれを使用して Entrez にクエリを実行するのは適切ではないと思います。改善のための他の提案はありますか?
ありがとう!

4

1 に答える 1

1

次の方法で有機体を取得できます。

[...]
blastResult = NCBIWWW.qblast("blastn", "nt", seqRecord.seq)
blastRecord = NCBIXML.read(blastResult)

first_organism = blastRecord.descriptions[0]

これにより、少なくとも efetch クエリが節約されます。とにかく、「blastn」には時間がかかりすぎる可能性があり、NCBI に大規模なクエリを実行する予定がある場合は、禁止されます。

于 2014-08-18T14:59:53.233 に答える