昨天下午搗鼓了一下宏基因組物種注釋過程(基于nr庫),現在將整個流程記錄一下。
軟件需求:blast,diamond,taxonkit(安裝自行百度)
構建細菌子庫
blast方法可能會準確點,但是它的速度簡直讓我懷疑人生,倆種軟件的方法我都說下吧,因為我比對的主要是細菌,我首先想到是干脆按照網上的方法構建一個細菌的子庫可能速度會更快點~
說干就干
參考連接:https://www.bioinfo-scrounger.com/archives/207/;
https://bioinf.shenwei.me/taxonkit/tutorial/
我最初想法是構建一張表,第一列是taxid,后面7列跟著門綱目科屬種的名稱,這樣的話我們根據比對結果中的taxid,就直接可以得到物種各層級的信息,相信這也是大多數人的想法,就像下圖這樣:
這里我們就可以使用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這個好輪子也是可以得到的~~~
下面是剛創建個人公眾號,會定時更新R、linux、python,組學方面的學習內容,請多多支持呦~~