宏基因组之物种注释(基于nr库)

简介: 昨天下午捣鼓了一下宏基因组物种注释过程(基于nr库),现在将整个流程记录一下。软件需求:blast,diamond,taxonkit(安装自行百度)

宏基因组之物种注释(基于nr库)


昨天下午捣鼓了一下宏基因组物种注释过程(基于nr库),现在将整个流程记录一下。

软件需求:blast,diamond,taxonkit(安装自行百度)


构建细菌子库


blast方法可能会准确点,但是它的速度简直让我怀疑人生,俩种软件的方法我都说下吧,因为我比对的主要是细菌,我首先想到是干脆按照网上的方法构建一个细菌的子库可能速度会更快点~

说干就干

参考连接:https://www.bioinfo-scrounger.com/archives/207/;

https://bioinf.shenwei.me/taxonkit/tutorial/

我最初想法是构建一张表,第一列是taxid,后面7列跟着门纲目科属种的名称,这样的话我们根据比对结果中的taxid,就直接可以得到物种各层级的信息,相信这也是大多数人的想法,就像下图这样:

image.png

这里我们就可以使用taxonkit这个好轮子去方便的达成这一目的,代码如下:

1.#输出细菌的taxid
 taxonkit list --ids 2 --indent "" > bacteria.taxid.txt 
#33090为植物 2为细菌 2157为Archaea;10239 为Viruses;Eukaryota为2759;Fungi 4751
#有时间的话可以将这几大类的id全都整合在一起,形成一张表
2.less bacteria.taxid.txt|taxonkit lineage |taxonkit reformat -f "{k}\t{p}\t{c}\t{o}\t{f}\t{g}\t{s}" -F |cut -f 1,3- | sed '1i\Taxid\tKingdom\tPhylum\tClass\tOrder\tFamily\tGenu\tSpecies' > Bacteria_taxid_Ano.txt

OK,现在已经得到了这张表,接下来我们就要去比对,得到每个基因的taxid

先来构建细菌子库吧

需要文件:

ftp://ftp.ncbi.nlm.nih.gov/pub/taxonomy/accession2taxid/prot.accession2taxid.gz 蛋白acc号和taxid对应文件

方法参考自爪哥文档:https://bioinf.shenwei.me/taxonkit/tutorial/

#还是像上面那样先得到细菌的taxid
taxonkit list --ids 2 --indent "" > bac.taxid.txt
#得到bac.taxid.acc.txt文件  
zcat prot.accession2taxid.gz |csvtk -t grep -f taxid -P bac.taxid.txt |csvtk -t cut -f accession.version >bac.taxid.acc.txt 
Option 1 :
#直接构建(速度慢)
blastdbcmd -db /home/software/nr-2019-12-18/nr -entry_batch bac.taxid.acc.txt -out - | pigz -c > nr.$id.fa.gz
Option 2: 
#用blast配套工具(这里要注意blastdb_aliastool版本 低版本没有seqidlist) 这步结果就只有一个pal文件
blastdb_aliastool -seqidlist bacteria.taxid.acc.txt -db /home/software/nr-2019-12-18/nr -out nr_bac -title nr_bac  
Option 3:
#采用了分割并行的策略加上爪哥自己写的脚本,速度更加快,建议大家去看爪哥的源文档,这里不再赘述.

序列比对

blastp

我们拿上面Option2得到的文件去进行比对,命令行如下:

blastp -query NR100pro.fasta -db /home/pub_guest/db/nr/nr_bac -out D1_nr.out -outfmt "6 qseqid qgi qacc qaccver qlen sseqid qseq sseq evalue  score length pident  staxids sscinames salltitles " -num_threads 16 -evalue 1e-5 -num_alignments 5
 #记得结果加上 staxid 得到物种taxid信息

diamond

由于索引库不兼容,我们将blastcmd抽提出来的nr库,用diamond先构建索引库

要想得到taxid和种名信息,需要构建的时候额外增加俩个参数--taxonmap和--taxonnodes

1是我们上述说的 蛋白acc号和taxid的对应文件prot.accession2taxid.gz

2是存储有taxonomy数据库的层级文件taxdmp.zip

注意wget的时候会出现连接超时情况,多等几次即可.

diamond makedb --in nr.fa -d Dimond_nr --taxonmap prot.accession2taxid.gz --taxonnodes nodes.dmp  
(#nodes.dmp文件是taxdmp.zip压缩包内的文件,这个地方直接跟这个文件即可,否则建库不完整)
#比对
diamond blastp -p 8 --db Dimond_nr  -q NR100pro.fasta --outfmt 6 qseqid sseqid pident length qlen mismatch gapopen qstart qend evalue bitscore staxids stitle salltitles --max-target-seqs 5 -e 1e-5 -o NR.out

补充一点:

我们可以先将有taixd也有种名信息的提取出来,过滤掉没有taxid和种名信息的基因,因为文件结果中可能会出现一种情况是该基因比对结果没有taxid,但是后面匹配到了种名信息,这时候我们再来用taxonkit这个软件根据种名去得到这些物种的taixid,这样我们的结果里会多一点,这时候还没有匹配到taxid的再将其过滤掉。

这里我将脚本贴出来

#!usr/bin env python
import re
import sys
#根据nr结果1,12,13列信息提取taxid,种名
input_file = sys.argv[1]
fr = open(input_file,'r')
pattern = "\[[^\]]+"
regexp = re.compile(pattern)
for line in fr:
        line = line.strip()
        gene = line.split('\t')[0]
        taxid = line.split('\t')[1]
        if '[' not in line.split('\t')[2]:
                sth = ''
        else:
                sth = regexp.findall(line.split('\t')[2])[0]
        print(f"{gene}\t{taxid}\t{sth}")
fr.close()

好了,上面两种软件得到结果都会有taxid信息和种名了,由于是比对的子库文件,速度也会有所提升,我们可以拿着taxid去匹配最后那张表的信息就能匹配种水平上面几个层级的taxonomy的信息,或者好好利用taxonkit这个好轮子也是可以得到的~~~

相关文章
|
6月前
|
存储 编译器 Serverless
C程序结构研究
C程序结构研究
32 2
|
6月前
|
搜索推荐
代码分享|GPL平台没有基因注释什么办?别慌,基因ID注释万能公式!
本文介绍了处理无基因注释的GEO数据集的方法。当遇到GPL平台无基因注释时,可以通过以下步骤解决:1) 查看数据集补充文件中是否已有注释矩阵;2) 使用搜索引擎或官网查找相关资源;3) 如数据集较新,尝试联系平台官方;4) 利用已有经验进行转换。文中通过多个GSE示例详细解释了如何处理不同情况,并提醒读者注意检查数据集中可能隐藏的注释信息。作者提供了转换ID的代码,并在公众号“多线程核糖体”分享了相关资源。
617 0
|
数据采集
宏基因组数据 数据预处理
宏基因组下载数据过程
286 2
|
数据库 开发工具 数据中心
宏基因组分箱流程MetaWRAP安装和数据库配置
宏基因组分箱流程MetaWRAP安装和数据库配置
2333 0
宏基因组分箱流程MetaWRAP安装和数据库配置
|
算法 索引 Python
宏基因组之基因组装
宏基因组组装,即把短的reads拼装成连续的序列contig,再根据PE等关系将contig拼装成scaffold。与单个基因组组装不同,宏基因组组装最终得到的是环境样品中全部微生物的混合scaffold。理想情况下一条scaffold对应一个物种的全基因组。但由于序列太短或者覆盖度不够,很难拼出一条完整的基因组。针对高通量测序数据,出现了多种拼接算法和软件。
532 0
|
数据库 网络架构 索引
宏基因组之基因丰度计算
目前有两种方式可计算宏基因组基因的丰度,一种是基于比对,比如bwa,bowtie,soapaligner等主流的比对软件,另一种是不比对快速估计基因丰度,可以用近俩年来流行的salmon软件,这个软件在转录组的数据比对中也经常用到,可以直接计算出原始的Counts值和标准化的TPM值,此外由于是基于非比对,计算的速度得到很大的提升,同时也节省了部分的内存(少了庞大的sam/bam文件),可以说是多快好省,但是目前的高分文章中也还是不少用基于比对的方法去计算宏基因组的基因丰度的,下面我就分别简单介绍一下基于比对的soapaligner和不比对快速估计的samlon俩个软件的操作流程!!
787 0
|
数据库
snpEff构建物种数据库及完成vcf变异文件注释
snpEff构建物种数据库及完成vcf变异文件注释
|
存储 Go C语言
编译原理,C语言实现LR(0)分析(扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成、句子的分析)
注:代码生成的项目集规范簇、ACTION GOTO表的顺序可能和课本、教材、参考答案的顺序不同,但这并不影响分析过程的正确性,毕竟机器是按规律办事的😄
499 0
编译原理,C语言实现LR(0)分析(扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成、句子的分析)
|
存储 机器学习/深度学习 算法
Python 实现LSB算法进行信息隐藏 包含空域与变换域 JPEG信息隐藏算法 对PDF文件进行信息隐藏 基于卷积神经网络的隐写分析 Matlab SRM、SCA隐写分析
Python 实现LSB算法进行信息隐藏 包含空域与变换域 JPEG信息隐藏算法 对PDF文件进行信息隐藏 基于卷积神经网络的隐写分析 Matlab SRM、SCA隐写分析
515 0
Python 实现LSB算法进行信息隐藏 包含空域与变换域 JPEG信息隐藏算法 对PDF文件进行信息隐藏 基于卷积神经网络的隐写分析 Matlab SRM、SCA隐写分析
|
安全 编译器 Linux
【C/C++】你了解预处理吗?带你深度剖析#define定义宏
【C/C++】你了解预处理吗?带你深度剖析#define定义宏
211 0