我第一次使用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不是要走的路。您还有其他改进建议吗?
谢谢!
答案 0 :(得分:1)
你可以通过以下方式获取有机体:
[...]
blastResult = NCBIWWW.qblast("blastn", "nt", seqRecord.seq)
blastRecord = NCBIXML.read(blastResult)
first_organism = blastRecord.descriptions[0]
这至少可以保存efetch查询。无论如何,“爆炸”可能需要很长时间,如果你打算大规模查询NCBI,你将被禁止。