此处列出本人使用python操作的步骤(本人编程能力很差,多担待):
import pandas as pd # 导入pandas库
import os # 导入os库,python调用linux shell时需要用到
df = pd.read_csv("prokaryotes.csv") # 读取下载的文件
df['genome_ftp'] = df['GenBank FTP'] + '/' + \
df['GenBank FTP'].apply(lambda x : x.split('/')[-1]) + \
'_genomic.fna.gz'
# 上面是一行代码,即在dataframe中将GenBank FTP列的信息通过整理,得到了新列(即下载地址列)
# apply函数用于处理较为麻烦的事情,这里相当于每一个GenBank FTP地址都经过apply处理
# x就是GenBank FTP,将其使用split分割成列表,再取最后一项。
# 得到的新列就是我们需要的基因组的下载地址啦
df['genome_ftp'].to_csv('dlftp.txt', header = False, index = False)
# 这里只将下载地址保存下来,不需要索引,也不需要列标题,因此两个都是False
inword = "wget -i dlftp.txt -P ./pro_genomes/"
# 字符串用于linux shell调用,wget很多选项按需使用,P选择下载目录,i 表示读取文件中的url
os.system(inword) # linux shell执行上面的下载命令
本地的BLAST与网页版的不同,网页版的可以直接将基因组文件(即fasta文件)传入就能进行BLAST了,但是本地版的BLAST需要先制作目标数据库,也就是基因组文件是需要先被制成一个个的数据库后才能开始BLAST。
通过上述方法下载得到的文件都是以 .gz 为后缀名的,还需要先解压才行,解压后直接制作数据库,制作数据库的命令如下:
makeblastdb -in db.fasta -dbtype nucl -out dbname
数据少时批量解压和建库的操作代码如下:
import os
files = os.listdir("pro_genomes/") # 列出下载的基因组文件,得到的是一个列表
for genome in files: # 循环对列表中的每一个基因组文件进行处理
jieya = "gzip -d pro_genomes/" + genome # 使用gzip -d命令后原压缩包会被自动删除
os.system(jieya) # 通过os.system调用shell来处理上述语句
db_name = genome.strip('.fna.gz')
# 这里我先把建库的名字设好,就是基因组文件名的前缀(无.fna)
mdb = f"makeblastdb -in pro_genomes/{db_name}.fna -dbtype nucl \
-out db/{db_name}/{db_name}"
'''
这里是建库的步骤,mdb是一个字符串,在字符串前加上f表示后面的语句你可以按照正常的
写字符串的顺序写下,即不需要使用+号来连接字符串,在有外界变量时只需要对外界变量加入
中括号即可,是不是很方便呀!这里我将建的库都放在db文件夹中,为防混乱,这里建库的out
还建了一个文件夹即db/{db_name},生成的数据库文件是在这个文件夹中的,最后面的{db_name}
是代表数据库的名字,产生的数据库文件都会以这个名字为前缀,只是后缀不同
(如nhr、nin、nsq这些后缀,最新版的BLAST会产生6个文件)
注意空格不要打少咯!
'''
os.system(mbd)
某些特定要求的BLAST可能需要屏蔽某些低复杂度序列或者基因组内出现很多次的序列,因此需要利用blast+的mask工具windowmasker(核酸)、dustmasker(核酸)或者segmasker(氨基酸)进行屏蔽,屏蔽之后再根据其产生的信息进行后续的BLAST建库,如有这方面要求可以查询一下相关内容。
数据库制作完成就能用来进行本地BLAST了,BLAST有很多种类型如blastp、blastn、tblastn等,根据自己需要选择。此处以tblastn为例,命令如下:
tblastn -query demo.fasta -out demo.blast -db dbname -outfmt 6 -evalue 0.01 -num_threads 20
BLAST还有一些其它参数,若有需要可以blast -help查询一下哈
例(单个BLAST):
# linux shell
tblastn -query sequence.fasta -out demo.blast -outfmt 6 -db db/GCA_900475215.1_42727_B01_genomic/GCA_900475215.1_42727_B01_genomic
由于批量操作的步骤与上面类似,就不再列出。要注意的是在BLAST时,dbname不是文件夹名,而是文件夹下的文件名的前缀(不要后缀)。比如我这里就是有db/GCA_900475215.1_42727_B01_genomic这个文件夹,文件夹里面有GCA_900475215.1_42727_B01_genomic.nhr、CA_900475215.1_42727_B01_genomic.nin、CA_900475215.1_42727_B01_genomic.nsq这几个文件,但我要输数据库的话就是按照上面的输入即db/GCA_900475215.1_42727_B01_genomic/GCA_900475215.1_42727_B01_genomic。
这里新手很容易犯错哦,如果输错的话会报错。
这里我烦了很久的:(
这样一个完整的基础的本地BLAST操作就结束啦,当然还需要自己使用编程工具将这些步骤串起来,形成自动化循环,才能进行大批量的BLAST。当然工作量大时可能还需要用到多线程或多进程等工具,充分利用机器的运行内存加快速度。
大家也可以参考我后面的其它多进程的文章呀(嘿嘿嘿)!
但 BLAST只是工具,在获得结果之后才是更重要的步骤,需要根据自己的需求处理得到的比对结果。似乎这个更麻烦,很麻烦。由于篇幅限制,之后若是有相关的内容也会分享的!
注意:我使用的环境是ubuntu,因此本文中调用的也是Linux shell。