blast本地化:格式化数据库(formatdb详解)

构建的fasta格式的数据库文件必须被formatdb格式化后,才能被blastall、blastpgp、MegaBLAST使用。数据库文件也可以是ASN.1格式,但较少用到,所以下面还是主要以FASTA格式为例。

formatdb格式化数据库后,创建三个主要的文件——库索引(indices),序列(sequences)和头(headers)文件。生成的文件的扩展名分别是:.pin、.psq、.phr(对蛋白质序列)或.nin、.nsq、.nhr(对核酸序列)。另外,为便于查找还有一些ISAM索引文件同时生成:.pni和.pnd(或.nni和.nnd)文件,其中的数字索引只包含gi号;而其他的序列识别符和索引则包含在.psi和.psd(或.nsi和.nsd)中。

1.1.1.    参数说明

表:formatdb命令的参数说明

参数 说明 默认值 备注
-t 数据库的标题【可选】 字符
-i 需要创建数据库的文件名 文件名
-l 日志文件名 文件名 formatdb.log
-p 文件数据类型 [T/F] T T – 蛋白质F – 核苷酸
-o 解析选项 [T/F] F T表示解析序列文件并产生索引文件,F则不解析
-a 数据库文件是否为ASN.1格式 [T/F] F T为是ASN.1格式
-b ASN.1的模式 [T/F] F T为二进制,F为文本模式
-e ASN.1数据库的序列数 [T/F] F T表示数据库中只有一条序列
-n 重命名数据库文件的名称 字符窜
-v 数据库卷的大小 整数 0 单位:兆字符
-s 限制索引的类型 [T/F] F T为仅用接收号创建索引
-L 创建数据库别名 输出文件名
-F Gi列表的文件名 输入文件 配合-L使用
-B 生成的Gi二进制的文件名 输出文件 配合-F使用

1.1.2.    使用示例与说明

格式一个蛋白质数据库

formatdb -i protein_db_file_name -p T –o T

格式一个核酸数据库

formatdb -i protein_db_file_name -p F –o T

用指定的Gi列表生成一个子数据库

如果经常搜索一个数据库的子集,比如一个核酸库中的家蚕的序列或者蛋白库中的G蛋白序列,可以用这些序列的gi号来限制搜索的范围,而没有必要重新构建这样的数据库,这样即加快了查询速度,又避免另外的磁盘开销。这里以昆虫核酸数据库的限定家蚕的序列为例子:

a)  获得家蚕序列的gi号,可以从文章或者数据库中检索得到。将gi号保存到一个文本文件中,这里命名为“silkworm.gi.txt”;

b)  利用formatdb程序将这个文本文件,转变为二进制文件;

    formatdb -F silkworm.gi.txt -B silkworm.gi

c)  调用formatdb创建别名文件

formatdb -i insects -p T -L silkworm -F silkworm.gi -t "My silkworm database"

该命令会创建一个silkworm.pal文件,包含silkworm数据库的标题,限制的gi号文件,及其他一些统计信息,如下:

#
# Alias file created Thu Jul  5 15:04:29 2001
#
#
TITLE My database
#
DBLIST ../blast/insects
#
GILIST silkworm.gi
#
#OIDLIST
#
NSEQ 1836
LENGTH 640724

d)  搜索家蚕数据库

   blastall -p blastn -d silkworm -i MYQUERY -o MYOUTPUT

 –o参数的使用

下列情况下,“-o”必须设置为TRUE:

  • a) 使用blastall 或者blastpgp程序,产生的结果为ASN.1格式时;
  • b) blast比对中,“-m”参数设置为非零的值;
  • c) blast比对中,使用“-I”参数,blast结果生成gi列表时;
  • d) 使用fastacmd程序,用接收号或者gi号从数据库中取出序列时。

从NCBI FTP服务器上下载的数据库,或者能保证数据库中的fasta序列都有唯一标识符的数据库,格式数据库时,建议将-o参数设置为TRUE。

超大数据库的格式化

一个单独的blast数据库最大只能为4G,如果格式的数据库大于4G,在“-v”参数未设置的情况下,farmatdb程序会自动对数据库分卷,每卷最大为4G。可以使用“-v”参数设置卷的大小,比如下面命令将卷的大小设置为2G:

formatdb -i hugefasta -p F -v 2000000000

卷的命名规则是,原数据库的名称加两个数字的卷号扩展名,使用数据库时,还是使用原来的数据库名称:

blastall -i infile -d hugefasta -p blastn -o out

其实,blast程序是根据文件名为数据库名加扩展名为“nal”(对于蛋白质数据库扩展名为“pal”)的文件来判断要搜索的数据库的,如上例中,是根据文件“hugefasta.nal”来确定分卷的数据库。“.nal”或“.pal”文件的格式为:

#

# Alias file created Tue Jan 18 13:12:24 2000

#

#

TITLE hugefasta

#

DBLIST hugefasta.00 hugefasta.01 hugefasta.02

#

#GILIST

#

#OIDLIST

#

其中TITLE行定义数据库的标题,DBLIST定义要搜索的数据库名称,数据库名称用空格分开。用户如果要同时搜索多个数据库,可以按照上面文件的格式,用文本编辑器创建类似的文件,文件名就是数据库的名称,如果是核苷酸数据库,就加“.nal”后缀,如果是蛋白质数据库就加“.pal”后缀。DBLIST行放入数据库的名称,这样可以像使用其他数据库一样使用这个数据库。例如创建一个”multi.nal”文件,内容如下:

#

# Alias file created Tue Jan 18 13:12:24 2000

#

#

TITLE multi

#

DBLIST part1 part2 part3

#

#GILIST

#

#OIDLIST

#

他包含part1,part2,part3三个数据库,如下命令,对该数据库进行blast

blastall -i infile -d multi -p blastn -o out

数据库的路径问题

如果你的数据库和工作目录不在同一个目录,或者你在几个目录下处理数据,并且对于数据库的需求也同,比如一个家蚕数据处理,一个是果蝇的数据处理,这时你可以用“-n”参数在工作目录下创建一个数据库别名文件,这样可以避免指定数据库是带入冗长的目录:

formatdb -i insects -n ../blast/insects -p T -L wilkworm -F silkworm.gi -t "My database"

这时,会生成类似与下面内容的silkworm.pal文件:

 

#

# Alias file created Thu Jul  5 15:04:29 2001

#

#

TITLE My database

#

DBLIST ../blast/insects

#

GILIST silkworm.gi

#

#OIDLIST

#

NSEQ 1836

LENGTH 640724

(通过上面的几个例子,大家一定对.pal文件有了深入的了解,就可以用文本编辑器,编写这个文件,灵活订制数据库,使搜索变得更方便)

格式化自定的数据库

 

如果是自己构建的数据库,数据库中fasta格式序列命名有以下三种方式:

  • a)  gnl|database|identifier
  • b)  lcl|identifier
  • c)  identifier

identifier为你指定的序列名称,dababase为你要指定的数据库的名称(详细的说明参见fasta序列格式章节)。如果要使用“-o T”设置,序列的名称应该唯一,不能重复。

UNIX或linux下压缩文件不经解压直接格式数据库

uncompress -c nt.Z|formatdb -i stdin -o T -p T -n "nt" -v 100000000

formatdb的日志文件

formatdb会默认生成一个名称为formatdb.log的日志文件,记录数据库生成的时间,及其程序运行的结果。运行程序后,读一下日志文件是很好的习惯,以确保数据库正确格式化。也可以通过“-l”参数指定日志文件。

命令举例:

formatdb-t “E. coli genome”-i U00096.fna -p F -o T -n ecoli

formatdb-t “Clusters of OrthologusGroups”-i COGsDB

formatdb-t “Non-Redundant Protein Database”-i nr -o T

blast本地化:格式化数据库(formatdb详解)》上有36条评论

  1. 博主:您好
    在windows环境下进行本地Blast
    在格式化 数据库nr(我的数据库放在E:\blast\nr) 的时候,输入相应的代码
    formatdb -i E:\blast\nr -p f -o t
    回车
    运行好长一段时间后,在数据库nr也产生了一系列的文件,但过了一会却出现了
    [NULL_CAPTION]FATAL ERROR:Fatal error when adding sequence to BLAST database
    进行blast里程序blastn 在out.txt中也有类似以下的结果
    BLASTN 2.2.21 [Jun-14-2009]

    Reference: Altschul, Stephen F., Thomas L. Madden, Alejandro A. Schaffer,
    Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997),
    “Gapped BLAST and PSI-BLAST: a new generation of protein database search
    programs”, Nucleic Acids Res. 25:3389-3402.

    Query= F2
    (392 letters)
    这是怎么回事?
    期待你的答案,谢谢!!
    呵呵
    祝你快乐

    • 估计是nr库的fasta文件有问题,请作如下检验:
      从你的库文件中取出一部分,(3到5个序列就可以了),从新做formatdb,如果没有报错,就可以肯定是上面的结论。
      你先做这样的排除,再把你库文件的来源说明一下。出错的地方可能有很多,只能一个个排除。

      • 你用的NR非冗余的蛋白质数据库 但是你格式化的时候-p F 让计算机认为是核酸的数据库啊!

  2. 谢谢 adnim
    数据库 NCBI FTP BLAST里下载的
    db/FASTA/nr.gz
    最近几天都在找原因
    nr.gz是蛋白质序列数据库
    格式化的命令错了,我重新写命令
    formatdb -i E:\blast\nr -p t -o t
    格式化过程中是没有错的了
    测试是用的blastx命令
    blastall -p blastx -d E:\blast\nr -i c:\blast\bin\test.txt -o c:\blast\bin\out.txt
    但是在后面用测试序列测试的时候却出现了
    [NULL_Caption] WARNING: Test: Could not find index files for database nr 00
    [NULL_Caption] WARNING: Test: Could not find index files for database nr 01
    [NULL_Caption] WARNING: Test: Could not find index files for database nr 02
    在out.txt 里再次出现

    BLASTN 2.2.21 [Jun-14-2009]

    Reference: Altschul, Stephen F., Thomas L. Madden, Alejandro A. Schaffer,
    Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997),
    “Gapped BLAST and PSI-BLAST: a new generation of protein database search
    programs”, Nucleic Acids Res. 25:3389-3402.

    Query= F2
    (392 letters)

    比对的内容就没有了
    换成是其他的序列,结果类似
    呵呵,都不知道是怎么搞的!!急啊!

    • 是这样的,如果出问题,
      一个可能是你的blast程序有问题,
      一个可能是用来搜索的库有问题,
      ok,现在你是不是可以保证blast程序没有问题,也就是说你格式其他库,blast那个库都没有问题,如果不能保证请另行测试。

      因为你描述的错误我这里无法怎样都无法重现,你的nr库打开看过吗?还有我想知道你对于blast的认识有多少,不用着急,没有那么神,细心,什么问题都能解决。

  3. 在格式化的时候添加了 -o T
    命令如下
    formatdb -i e:\blast\nr -p T -o T
    (nr是蛋白质数据库)
    但是最后进行运行的时候仍然提醒说是没有发现的创建索引文件?
    是为什么呢?索引文件的后缀是什么?

  4. 我用小的数据库如 yeast.nt也做过
    格式化成功了
    而且后面进行核苷酸blastn比对,也都成功了
    这是我的数据库(nr)有问题吗?
    如果有问题,从哪些方面可以看出来?
    谢谢啊!!

  5. 哦,如果这样,肯定是库文件问题,索引文件的后缀名为.pin,但是是二进制文件,有没有问题也不好看出来。blast的数据库文件是fasta格式的文本文件,如果文件小可以直接用文本编辑器(比如:记事本)打开,看看fasta文件是否有问题。文件比较大时建议使用ultraedit打开,或者在命令行使用more命令。fasta格式说明可以参看网站上相关介绍。另外要注意文件的大小,你下载的.gz是多大,解压缩后是多大?要不就在下载一下,解压缩后在格式化试试。

  6. nr.gz为2G,解压后是4G,呵呵 挺大的,下载差不多要一天,格式化也要一天
    刚刚接触本地BLAST,所以问题多的一塌糊涂。
    boyun博主,方便给你的QQ吗?我想QQ咨询你,我的QQ是51684804

  7. 哦,需要那么长时间,估计是下载的文件有问题,建议你直接下载格式好的库ftp://ftp.ncbi.nlm.nih.gov/blast/db/,这样你解压缩后就可以使用了。另我的QQ是284077408,只是我可能没有时间立即响应你。刚开始都会遇到很多问题,也是好事,逼迫自己多思考和学习点。

  8. 博主,谢谢你哦!这几天把你说的数据库下载下来,运行Blast的各项程序都成功了,呵呵。现在正在学习更多的有关知识,想问一下你,有办法能让在Blast搜索的更快一些吗(我感觉现在的运行速度还是比较慢的!)?
    还有在写命令的时候能限定某个物种吗?

    • 要使Blast更快些,可采用以下几种方案:

      1、硬件,上多个cpu,哈哈,blast毕竟是非常耗资源的东东
      2、精简库,要根据你的目的,使用最小的库,比如使用某种蛋白质的库,使用某个物种的库
      3、选择恰当的程序,当然这也要根据你的目的,比如优先使用megablast
      4、设置参数,比如-e,-w, -b, 不要设置太大(没有实验证实)
      5、将耗时的比对放在晚上,哈,这样就不会感觉慢了

      最后,Blast是非常耗资源的,所以呢,不要认为他慢,他就要花时间,所以重要的是,明确你目的,做实验就是用小库,库与库的比对就放到晚上。

    • 没有直接的参数可以限定物种!想想Blast的原理,库文件时fasta格式的,fasta格式没有对于序列是属于哪个物种的定义,序列的唯一身份就是其标识号(来源于ncbi的序列就是其gi号),库本身就没有物种的概念,所以也不可能有参数限制物种。
      相似的命令:做blast的时候使用-l限制gi的范围,同样可以使用制定gi号通过formatdb构建子库,如正文中所举的例子。
      真正方便的是自己构建库,通过搜索genbank,比如某个物种的,比如某个蛋白质家族的,下载查询结果,构成自己的库,还有就是到某个物种的基因组专题的网站,下载相关的库。

  9. 请问一下,我把nr数据库下载下来了,然后进行了解压,可是解压后的文件后缀都是pin pni ppd ppi psi psq等格式,打不开要不就是乱码,这个怎么用呀!急用,谢谢!

    • 1、下载fasta格式的序列文件;
      2、使用formatdb程序对文件进行格式化
      3、格式化后会生成一系列的文件,类似于pin,pni等后缀的文件,这是文件时二进制文件,你可以认为这一组文件就是数据库了,这样就可以通过blast提供的程序对数据库进行操作了,注,文本打开是没有意义的

  10. 你好,我在使用blast过程中遇到了一个问题。
    我在ncbi下载的other_genomic.gz数据库,解压缩后6G,分为4卷格式化,每卷1.5G,
    命令如下
    formatdb -i d:\blast\db -p F -o T -v 1500

    格式化后,进行blast,
    命令如下
    blastall -p blastn -i target_sequence\test.fasta -d db\other_genomic -m 8 -b 5 -a 2 -o out.txt
    结果出现错误,显示
    Unable to open other_genomic.00.nin
    ……
    Unable to open other_genomic.03.nin
    我用记事本打开这些nin文件,都是乱码

    请问哪里出错了?我是个新手,这个问题困扰了我2天了。

  11. 请问记事本上的NCBI序列号是从哪得到的 那个老师说我们要先建一个记事本再到Batch Entrez搜索 如果方便能发到我邮箱吗

    • 到NCBI的网站上, 根据你的需要选择不同的数据库, 进行检索, 得到的结果可以只把序列号保存下来. 你想要做什么, 检索, 目标序列. 或者是从文献或者其他网站上得到序列号, 然后再想去做什么.
      注: 这里的序列号等同于接受号, AC号

  12. 从网上下载了一个蛋白质数据库,格式化后,进行blast,总是出现[blastall 2.2.24] ERROR: SeqPortNew: lcl|2352_Genome\…> start(329) >= len(270)
    [blastall 2.2.24] ERROR: SeqPortNew: lcl|2352_Genome\…> start(352) >= len(270)
    [blastall 2.2.24] ERROR: SeqPortNew: lcl|2352_Genome\…> start(357) >= len(270)
    [blastall 2.2.24] ERROR: SeqPortNew: lcl|2352_Genome\…> start(329) >= len(270)

    不知道是什么原因,哪位高手可以解答啊?不胜感激

    • 有两方面的可能,一个是下载的蛋白质,文件内容可能有问题,两个就是格式化数据的时候,参数有问题。因为这个错误别人无法重复,所以只能猜测,你可以通过做实验来排除,大致思路,打开那个蛋白质库,从中剪切出一条序列,建立一个文件,用这个文件当做库,重新进行格式化,比对,如果还是出问题,请将使用的formatdb、blast参数贴出来,再讨论。

    • 正解:
      This type of error can result from a blast database that was built from a file that is not in true FASTA format. True FASTA format considers only the first word after the > as the sequence name and anything after the first space is considered annotation. For example, if an input file looks like this:
      >Repeat Id: 1234567
      ccgcgatgctagtca…
      >Repeat Id: 2345678
      tttgtcagtgtcg…
      all of the sequences have the same name, ‘Repeat’! To remove the common portion of the names, the following sed command can be used:
      sed -e “s/Repeat Id: //” NewInput.fa
      After that the NewInput.fa file can be used as input to the formatdb command.

  13. 博主 你好 我最近也刚接触本地化blast 有些问题想问你 可不可以也加你qq啊?我的qq是814872086

  14. 刚接触BLAST工具,,求教BLAST格式化的具体操作步骤,,要具体的,我是完全新手,求教急用。。。

  15. 博主,我想格式化数据库,但总是出现这种情况,求帮忙分析
    C:\Blast\bin>formatdb -i c:\blast\bin\filt_reverse_CDS201410.fna -p F
    [formatdb 2.2.24] ERROR:Could not open c:\blast\bin\filt_reverse_CDS201410.fna
    运行第一段代码后,就报错了,但文件夹出现了三个格式化后的文件

  16. 博主,我在格式化数据库的时候遇到了问题,求帮忙
    C:\blast\bin>formatdb -i c:\blast\bin\filt_reverse_CDS201410.fna -p F
    [formatdb 2.2.24] ERROR: Could not open c:\blast\bin\filt_reverse_CDS201410.fna
    运行第一段代码后,就报错了,但文件夹中产生了三个格式化后的文件,不知道是哪里出错了

  17. 你好,博主。我现在在做本地blast,一直出现问题无法解决,想请问你一下。希望你可以在百忙中帮助我一下。
    makeblastdb -in tr.fasta -dbtype nucl -out trdatabase -logfile trlog
    然后产生了三个文件:trdatabase.nhr,trdatabase.nin,trdatabase.nsq
    然后进行blast比对,出现错误:
    igblastn -germline_db_V tryy -organism human -domain_system imgt -query %s -auxiliary_data 20150429-IgBLAST_optional_files/human_gl.aux -outfmt ‘7 qseqid sseqid pident length mismatch gapopen gaps qstart qend sstart send evalue bitscore qlen slen qseq sseq score frames qframe sframe positive ppos btop staxids stitle sstrand qcovs qcovhsp’ -num_alignments_V 10 -out /zzh_gpfs02/wujiaqi/2016_7_18_blast/result/IgBLAST_result_%s &”%(infile,fname),shell=True)
    报错:LAST Database error: No alias or index file found for nucleotide database [human_gl_D] in search path [/zzh_gpfs02/wujiaqi::]
    请问应该如何让解决

  18. 博主您好!我从NCBI上下载16SMicrobial数据库,想在本地blastdbcmd获得id号,本地安装blast并把16SMicrobial文件(包含nhr,nin,nnd,nni,nog,nsd,nsi,nsq这8个文件)和16SMicrobial.fasta文件一并放入bin文件中,在开始运行程序里执行G:\blast_2\blast-2.2.30+\bin>blastdbcmd -db 16SMicrobial\ -outfmt ‘%f’ -entry ‘all’ > 16SMicrobial.fasta 命令,报错BLAST Database error: Np alias or index file found for nucleotide database [16SMicrobial in search path [G:\blast_2\blast-2.2.30+\bin;;]
    这里是不是提示我db文件路径没有写对?16SMicrobial这个文件我就是放在G:\blast_2\blast-2.2.30+\bin目录下的,我把这个目录写在16SMicrobial文件前仍然提示这个错误,期望博主指点一下这里的文件路径要如何写?谢谢!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请启用Javascript,以完成验证!