Blast
Blast有好幾個工具,blastn,blastp,blastx還有tblastn,tblastx
blast 是干啥的
就是你有一條query的reads,他幫你在數據庫里找個能配上的,是一個局部對比的工具,尋找兩條序列最相似的地方
可以直接用ncbi的網頁版,也可以自己搞一個本地的,看個人需求。NCBI的blast說明書
blast并不是最好的序列匹配工具,這個軟件的調教偏向于高效率尋找可能的匹配位點,所以有時候不能給出全部可能匹配的位置。其目的是在一個很大的序列已知的數據庫中找到匹配
blast的四條要點
- 可以找核苷酸序列,蛋白序列,也可以把核苷酸翻譯成蛋白來找蛋白序列
- 可以指定不同的算法,返回的結果也很不同
- 其算法依賴于打分矩陣
- 可以自己進行微調,有很多參數一般用戶從來都沒有接觸過
使用blast的幾個基本步驟
- 先建一個數據庫,makeblastdb
- 選一個工具幫你在數據庫里找,可以是blastn也可以blastp,自己調一下參數
- 下邊就讓軟件跑起來
blast小程序分別是干啥的
輸入序列 | 數據庫序列類型 | 匹配水平 | 應該叫啥 | 實際叫啥 |
---|---|---|---|---|
核酸 | 核酸 | 核酸 | blastNN | blastn |
肽鏈 | 肽鏈 | 肽鏈 | blastPP | blastp |
核酸 | 肽鏈 | 肽鏈 | blastNP | blastx |
肽鏈 | 核酸 | 肽鏈 | blastPN | tblastn |
核酸 | 核酸 | 肽鏈 | blastNNP | tblastx |
blast的黑話
- Query: 你手頭的短短小reads
- Target: 我們要去扒拉著找的大數據庫
- Subject 我們叫能匹配上的輸入的序列
- Score 打分
- E-value 期待值,說的是在一個老大的數據庫里面扒拉著找到一個比目前的結果更好的匹配的可能性
咋建數據庫
搞一個埃博拉病毒的的基因組序列,建立索引,這會搞出幾個我們在別的地方根本用不到的文件,當然在這兒可是必須的。所以最好找個專門的地方放置這些索引文件,一般放到自己的目錄的 ~/refs 里面
mkdir -p ~/refs/ebola
efetch -db nucleotide -id KM233118 --format fasta > ~/refs/ebola/KM233118.fa
這個里面有一個或者多個的fasta文件,接下來要把這個fasta搞成數據庫,也就是為blast建一個索引,要用makeblastdb
makeblastdb -h
makeblastdb -help
makeblastdb -in ~refs/ebola/KM233118.fa -dbtype nucl -out ~/refs/ebola/KM233118 -parse_seqids
下邊就可以來查詢建好的數據庫了,先建一條test序列
echo ">test" > query.fa
echo "AATCATACCTGGTTTGTTTCAGAGCCATATCACCAAGAT" >> query.fa
跑一下blastn,其實這個過程就是我們在網頁粘上一條序列,點一下blast按鈕是一樣的。
blastn -db ~/refs/ebola/KM233118 -query query.fa
按照自己的需要來設定輸出格式
可以改成輸出格式6或者7(帶評論和header的表格)
qseqid means Query Seq-id
qgi means Query GI
qacc means Query accesion
qaccver means Query accesion.version
qlen means Query sequence length
sseqid means Subject Seq-id
sallseqid means All subject Seq-id(s), separated by a ';'
sgi means Subject GI
sallgi means All subject GIs
blastn -db ~/refs/ebola/KM233118 -query query.fa -outfmt "6 qseqid sseqid pident"
這樣信息就很簡約
test gi|667853353|gb|KM233118.1| 100.000
blast task
task就是對算法的優化和修改,讓blast工具使用起來更加麻溜完成特定的工作
但是task本身有時候看起來就跟一個程序差不多
比如
blastn 找出更多的不同的align
mega-blast 找少一些不同algin
blastn-short 短小序列的query
這幫子人把這個task搞得比這個還復雜,比如blastn的默認task是megablast
比如咱搞一段短序列,跑一下blast,啥都找不到,但是咱明明就是從開頭部分選的這段一樣的序列哈
echo ">short" > short.fa
echo "AATCATACCTGG" >> short.fa
blastn -db ~/refs/ebola/KM233118 -query short.fa
要想找著,就得改參數
blastn -db ~/refs/ebola/KM233118 -query short.fa -task blastn
這樣就搞定
咱們要是把序列搞得再短一點,那么就只有blastn-short可以搞定了
echo ">mini" > mini.fa
echo "AATCATA" >> mini.fa
blastn -db ~/refs/ebola/KM233118 -query mini.fa -task blastn-short
就是這么的任性,你能腫么辦
兩條短序列的對比
這就不用搞啥數據庫了,直接來就行
blastn -query query.fa -subject ~/refs/ebola/KM233118.fa
blast能不能把所有可能的位置都找到
blast是給大眾干活的,要求太高對他來說就有點不公平,比如基因組中,blast會自動過濾掉低復雜度的區域
#下載yeast的第一個染色體
efetch -id NC_001133 -db nucleotide -format fasta > NC_001133.fa
head -2 NC_001133.fa > start.fa
#但是你blast回整個基因組的時候,發現找不到match的微店
blastn -query start.fa -subject NC_001133.fa
#這是因為query的序列有很多低復雜度的區域,自動過濾掉了
CCACACCACACCCACACACCCACACACCACACCACACACCACACCACACCCACACACACACATCCTAACA
#絕大多數的時候,這是個好事,但是這兒就不是了,所以要關掉這個自動過濾用 -dust no
blastn -query start.fa -subject NC_001133.fa -dust no
建立blast數據庫
其實就是創建一個索引,這個索引是必須的,主要是提高搜索的效率,否則一個一個的扒拉著去找就太費勁了。對于核酸和肽鏈來說,創建的索引是不一樣的。
makeblastdb 創建blast數據庫
blastdbcmd 搜索數據庫
update_blastdb.pl 更新已有的數據庫
我們可不可以直接下載blast數據庫?
雖然咱們可以用makeblastdb來創建數據庫索引,但是費老大勁,其實ncbi有現成的可以直接下載下來
NCBI的blast的索引
我們可不可以自動化這個下載索引的過程
#先找一個地方放我們的下載下來的數據庫
mkdir -p ~/refs/refseq
cd ~/refs/refseq/
##先看看有哪一些數據庫可以下載
update_blastdb.pl --showall
##下載16微生物的索引文件
update_blastdb.pl 16SMicrobial --decompress
##下載分類學數據庫,這個以后有用
update_blastdb.pl taxdb --decompress
我們也可以把blast的索引路徑加入到環境變量中,這樣以后就不用一次次的指定了。
export BLASTDB=$BLASTDB:~/refs/refseq/
#上述變量指定之后,我們就可以直接這樣打命令了
blastdbcmd -db 16SMicrobial -info
查看已經建立好的數據庫的信息
blastdb