如何让BLAST返回最优的一个搜索结果,看看你没有有进坑

大部分时候,我们都是看着别人的教程,然后尝试处理自己的数据,结果跑完了,如果和预期相符合就不会怀疑这个工具有啥问题。如果你要学习生物信息学,那么有一个信条一定要记住,不要盲目相信软件的输出结果,多多检查。

BLAST作为最常用的一个序列比对工具,对于大多数用户而言,都是用于找找一个基因在其他物种的同源基因,或者看看一条引物在基因组上是否有多处匹配,大多不会限制输出的匹配数目。

但是对于一些分析流程,你可能希望只要输出一个最佳匹配就好,这个时候你可能会用到两个参数,一个是-max_target_seqs,另一个是-num_alignments, 它们的参数说明如下

 -max_target_seqs =1>                                                                                                                
   Maximum number of aligned sequences to keep                                                                                                  
   Not applicable for outfmt <= 4
  * Incompatible with:  num_descriptions, num_alignments
 -num_alignments =0>                                                                                                                 
   Number of database sequences to show alignments for
   * Incompatible with:  max_target_seqs

如果你认为" aligned sequences" 或者"database sequences" 指的每个序列只会输出一个匹配的话,那么你掉进坑了。

首先给定一个检索序列, 命名为"query.fa"

>query1
CTCAAGAAAAGCAAGGTTTTTGTTTCTCTCTCTCTCTCTGTGAATTGACTATGTTATTCTTCCATCTCCTAAAAATCTTGGTTTCTGCAGCTTACATGGC

选择拟南芥的前1000行序列作为 测试集1

head -n 1000 Athaliana.fa > test1.fa
makeblastdb -in  test1.fa -out test/test1  -dbtype nucl

直接搜索,找不到任何的结果

blastn -query query.fa -db test/test1 -outfmt 6

将搜索的序列加入 测试集1,得到 测试集2

cat query.fa test1.fa > test2.fa
makeblastdb -in test2.fa -out test/test2  -dbtype nucl

此时搜索,可以找到一个结果

blastn -query query.fa -db test/test2 -outfmt 6

如果将同一段序列,重复多次,中间加入一些无意义的序列(如下),之后再加入到 测试集1 中,得 测试集3

>query2
CTCAAGAAAAGCAAGGTTTTTGTTTCTCTCTCTCTCTCTGTGAATTGACTATGTTATTCTTCCATCTCCTAAAAATCTTGGTTTCTGCAGCTTACATGGCCCCTAAACCCTAAACCCTAAACCCTAAACCTCTGAATCCTTAATCCCTAAATCCCTAAATCTTTAAATCCTACATCCAT
GAATCCCTAAATACCTAATTCCCTAAACCCGAAACCGGTTTCTCTGGTTGAAAATCATTGTGTATATAATGATAATTTT
ATCGTTTTTATGTAATTGCTTATTGTTGTGTGTAGATTTTTTAAAAATATCATTTGAGGTCAATACAAATCCTATTTCT
TGTGGTTTTCTTTCCTTCACTTAGCTATGGATGGTTTATCTTCATTTGTTATATTGGATACAAGCTTTGCTACGATCTA
CATTTGGGAATGTGAGTCTCTTATTGTAACCTTAGGGTTGGTTTATCTCAAGAATCTTATTAATTGTTTGGACTGTTTA
TGTTTGGACATTTATTGTCATTCTTACTCCTTTGTGGAAATGTTTGTTCTATCAATTTATCTTTTGTGGGAAAATTATT
TAGTTGTAGGGATGAAGTCTTTCTTCGTTGTTGTTACGCTTGTCATCTCATCTCTCAATGATATGGGATGGTCCTTTAG
CATTTATTCTGAAGTTCTTCTGCTTGATGATTTTATCCTTAGCCAAAAGGATTGGTGGTTTGAAGACACATCATATCAA
AAAAGCTATCGCCTCGACGATGCTCTATTTCTATCCTTGTAGCACACATTTTGGCACTCAAAAAAGTATTTTTAGATGTCTCAAGAAAAGCAAGGTTTTTGTTTCTCTCTCTCTCTCTGTGAATTGACTATGTTATTCTTCCATCTCCTAAAAATCTTGGTTTCTGCAGCTTACATGGC
CCCTAAACCCTAAACCCTAAACCCTAAACCTCTGAATCCTTAATCCCTAAATCCCTAAATCTTTAAATCCTACATCCAT
GAATCCCTAAATACCTAATTCCCTAAACCCGAAACCGGTTTCTCTGGTTGAAAATCATTGTGTATATAATGATAATTTT
ATCGTTTTTATGTAATTGCTTATTGTTGTGTGTAGATTTTTTAAAAATATCATTTGAGGTCAATACAAATCCTATTTCT
TGTGGTTTTCTTTCCTTCACTTAGCTATGGATGGTTTATCTTCATTTGTTATATTGGATACAAGCTTTGCTACGATCTA
CATTTGGGAATGTGAGTCTCTTATTGTAACCTTAGGGTTGGTTTATCTCAAGAATCTTATTAATTGTTTGGACTGTTTA
TGTTTGGACATTTATTGTCATTCTTACTCCTTTGTGGAAATGTTTGTTCTATCAATTTATCTTTTGTGGGAAAATTATT
TAGTTGTAGGGATGAAGTCTTTCTTCGTTGTTGTTACGCTTGTCATCTCATCTCTCAATGATATGGGATGGTCCTTTAG
CATTTATTCTGAAGTTCTTCTGCTTGATGATTTTATCCTTAGCCAAAAGGATTGGTGGTTTGAAGACACATCATATCAA
AAAAGCTATCGCCTCGACGATGCTCTATTTCTATCCTTGTAGCACACATTTTGGCACTCAAAAAAGTATTTTTAGATGT
CTCAAGAAAAGCAAGGTTTTTGTTTCTCTCTCTCTCTCTGTGAATTGACTATGTTATTCTTCCATCTCCTAAAAATCTTGGTTTCTGCAGCTTACATGGC

此时搜索,会得到三个结果

cat query2.fa test1.fa > test3.fa
makeblastdb -in test3.fa -out test/test3 -dbtype nucl
blastn -query query.fa -db test/test3 -outfmt 6
# 结果如下
query1  query2  100.000 100 0   0   1   100 1   100 8.11e-50    185
query1  query2  100.000 100 0   0   1   100 812 911 8.11e-50    185
query1  query2  100.000 100 0   0   1   100 1623    1722    8.11e-50    185

加入我希望只要一个结果,根据我之前的经验,我加入一个参数-num_alignments 1, 帮助里写的是 "Number of database sequences to show alignments for" 我一直认为是,只返回第一个找到的序列,但是运行如下代码,结果出乎我意料

blastn -query query.fa -db test/test3 -outfmt 6 -num_alignments 1
# 结果如下
query1  query2  100.000 100 0   0   1   100 1   100 8.11e-50    185
query1  query2  100.000 100 0   0   1   100 812 911 8.11e-50    185
query1  query2  100.000 100 0   0   1   100 1623    1722    8.11e-50    185

他居然会得到三个结果. 为什么会出现这种情况?

我的猜想是:这里的 Number of database sequencessequences 不是匹配上的序列,而是匹配上的序列对应所在整条序列。那么根据我的猜想, 当数据库中中有A,B,C三条序列,其中A有三个潜在匹配,B有两个潜在匹配,C没有匹配,A, B, C在建立搜索数据库的顺序会影响最终的输出结果,也就是当-num_alignments 1时,blastn搜索到A后,就会输出A里面的三个检索结果就不再继续,如果先搜索到B,就会输出一个匹配,不再继续。当-num_alignments 1会输出四个匹配。

为了验证假设,我将query.fa 和 query2.fa 以不同排列顺序构建测试数据集,发现输出结果的确和顺序有关。

#顺序1
cat query.fa query2.fa test1.fa > test4.fa
makeblastdb -in test4.fa -out test/test4 -dbtype nucl
blastn -query query.fa -db test/test4 -outfmt 6 -num_alignments 1
# 结果如下
query1  query2  100.000 100 0   0   1   100 1   100 8.12e-50    185
query1  query2  100.000 100 0   0   1   100 812 911 8.12e-50    185
query1  query2  100.000 100 0   0   1   100 1623    1722    8.12e-50    185
# 顺序2 
cat   query2.fa  query.fa   test1.fa > test5.fa
makeblastdb -in test5.fa -out test/test5 -dbtype nucl
blastn -query query.fa -db test/test5 -outfmt 6 -num_alignments 1
# 结果如下
query1  query1  100.000 100 0   0   1   100 1   100 8.12e-50    185

这个情况是我用一条短序列搜索全基因组数据时出现(如果是CDS序列库则不会出现一条序列出现多个匹配的情况), 在你设计引物的时候,如果在一条染色体上能够找到多个相似序列,那么这种引物序列就是不合格的。

但是如果你一定要保证每条序列在每个染色体都只要第一个高质量匹配,那么如何解决呢?

我们用到一个不怎么起眼的参数,-max_hsps 1, 根据说明"Set maximum number of HSPs per subject sequence to save for each query", 也就是保留query中最佳的前几个匹配

继续测试,随机删除query2的一些序列得到query3,保证最后一个是最佳匹配,用来验证返回的是一个序列中最好连配,而不是位置相关结果

>query3
CTCAAGAAAAGGTTTCTCTCTCTCTCTCTGTGAATTGACTATGTTATTCTTCCATCTCCTAAAAATCTTGGTTTCTGCAGCTTACATGGCCCCTAAACCCTAAACCCTAAACCCT    AAACCTCTGAATCCTTAATCCCTAAATCCCTAAATCTTTAAATCCTACATCCAT]GAATCCCTAAATACCTAATTCCCTAAACCCGAAACCGGTTTCTCTGGTTGAAAATCATTGTGTATATAATGATAATTTT
ATCGTTTTTATGTAATTGCTTATTGTTGTGTGTAGATTTTTTAAAAATATCATTTGAGGTCAATACAAATCCTATTTCT
TGTGGTTTTCTTTCCTTCACTTAGCTATGGATGGTTTATCTTCATTTGTTATATTGGATACAAGCTTTGCTACGATCTA
CATTTGGGAATGTGAGTCTCTTATTGTAACCTTAGGGTTGGTTTATCTCAAGAATCTTATTAATTGTTTGGACTGTTTA
TGTTTGGACATTTATTGTCATTCTTACTCCTTTGTGGAAATGTTTGTTCTATCAATTTATCTTTTGTGGGAAAATTATT
TAGTTGTAGGGATGAAGTCTTTCTTCGTTGTTGTTACGCTTGTCATCTCATCTCTCAATGATATGGGATGGTCCTTTAG
CATTTATTCTGAAGTTCTTCTGCTTGATGATTTTATCCTTAGCCAAAAGGATTGGTGGTTTGAAGACACATCATATCAA
AAAAGCTATCGCCTCGACGATGCTCTATTTCTATCCTTGTAGCACACATTTTGGCACTCAAAAAAGTATTTTTAGATGTCTCAAGAAAAGCAAGGTTTTTGTTTCTCTCTCTCTC    TCTGTGAATTTTATTCTTCCATCTCCTAAAAATCTTGGTTTCTGCAGCTTACATGGC
CCCTAAACCCTAAACCCTAAACCCTAAACCTCTGAATCCTTAATCCCTAAATCCCTAAATCTTTAAATCCTACATCCAT
GAATCCCTAAATACCTAATTCCCTAAACCCGAAACCGGTTTCTCTGGTTGAAAATCATTGTGTATATAATGATAATTTT
ATCGTTTTTATGTAATTGCTTATTGTTGTGTGTAGATTTTTTAAAAATATCATTTGAGGTCAATACAAATCCTATTTCT
TGTGGTTTTCTTTCCTTCACTTAGCTATGGATGGTTTATCTTCATTTGTTATATTGGATACAAGCTTTGCTACGATCTA
CATTTGGGAATGTGAGTCTCTTATTGTAACCTTAGGGTTGGTTTATCTCAAGAATCTTATTAATTGTTTGGACTGTTTA
TGTTTGGACATTTATTGTCATTCTTACTCCTTTGTGGAAATGTTTGTTCTATCAATTTATCTTTTGTGGGAAAATTATT
TAGTTGTAGGGATGAAGTCTTTCTTCGTTGTTGTTACGCTTGTCATCTCATCTCTCAATGATATGGGATGGTCCTTTAG
CATTTATTCTGAAGTTCTTCTGCTTGATGATTTTATCCTTAGCCAAAAGGATTGGTGGTTTGAAGACACATCATATCAA
AAAAGCTATCGCCTCGACGATGCTCTATTTCTATCCTTGTAGCACACATTTTGGCACTCAAAAAAGTATTTTTAGATGT
CTCAAGAAAAGCAAGGTTTTTGTTTCTCTCTCTCTCTCTGTGAATTGACTATGTTATTCTTCCATCTCCTAAAAATCTTGGTTTCTGCAGCTTACATGGC

构建索引数据库,进行检索,会找到每个序列中的最好匹配,如果你设置了-num_alignments 1,那么最后结果就真的只有一个。

#顺序1
cat query.fa query3.fa test1.fa > test5.fa
makeblastdb -in test5.fa -out test/test5 -dbtype nucl
blastn -query query.fa -db test/test5 -outfmt 6 -max_hsps 1
# 结果如下
query1  query3  100.000 100 0   0   1   100 1606    1705    8.11e-50    185
query1  query1  100.000 100 0   0   1   100 1   100 8.11e-50    185

最后的结论如下:

你可能感兴趣的:(如何让BLAST返回最优的一个搜索结果,看看你没有有进坑)