找到查询的互惠最佳匹配

时间:2016-03-03 22:26:56

标签: awk sed grep biopython blast

我有一个爆炸输出,并且希望获得最佳匹配,即通过确保查询是参考的最佳匹配来找到最佳匹配,反之亦然,基于第3列和第11列的值(对于列的阈值) 3> 40和第11列< 2e-04。

MnCG00500.1 Ma.15G248500.1  27.78   180 60  5   9   188 1   110 6e-04   41.2
MnCG00510.1 Ma.15G003800.1  87.88   33  4   0   6   38  3   35  2e-13   60.1
MnCG00510.1 Ma.10G208900.1  84.85   33  5   0   6   38  3   35  2e-12   57.0
MnCG00510.1 Ma.17G173700.1  84.85   33  5   0   6   38  3   35  9e-12   55.5
MnCG00280.1 Ma.11G114700.1  97.17   106 3   0   22  127 22  127 8e-65   210
MnCG00280.1 Ma.05G074900.1  98.18   55  1   0   420 474 11  65  3e-29   111
MnCG00280.1 Ma.20G242300.1  80.36   56  11  0   419 474 95  150 3e-22   95.1
MnCG00890.1 Ma.05G094500.1  89.55   67  7   0   321 387 4   70  1e-34   125
MnCG00890.1 Ma.01G201500.1  91.07   56  5   0   332 387 1   56  3e-28   107

我尝试过仅使用基于第12列的类似内衬,并尝试修改以适应我的条件

 awk '{
       a[$1]="0";b[$1]="";c[$2]="0";d[$2]="";
       if (e[$1,$2]==0) 
         e[$1,$2]=$12; 
       else {
         score=e[$1,$2]+$12; 
         e[$1,$2]=score
       }
     }
     END{
       for (i in a) 
         for (j in e) {
           split(j,f,SUBSEP); 
           if (f[1]==i && e[j]>a[i]) {
             a[i]=e[j];b[i]=f[2]
           }
         }; 
         for (i in c) for (j in e) {
           split(j,f,SUBSEP); 
           if (f[2]==i && e[j]>c[i]) {
            c[i]=e[j];d[i]=f[1]
         }
       }; 
       for (i in b) 
         if (b[i] in d && d[b[i]]==i) 
           print i"\t"b[i]"\t"a[i]"\t"c[b[i]]
     }' result.blast

但是不起作用。

最后我需要像

这样的东西
MnCG00500.1, Ma.15G248500.1, MnCG00500.1, no_match  
MnCG00510.1, Ma.15G003800.1, match  
MnCG00510.1, Ma.10G208900.1, match  
MnCG00510.1, Ma.17G173700.1, match  
MnCG00280.1, Ma.11G114700.1, match  
MnCG00280.1, Ma.05G074900.1, match  
MnCG00280.1, Ma.20G242300.1, match  
MnCG00890.1, Ma.05G094500.1,MnCG00890.1, no match   
MnCG00890.1, Ma.01G201500.1, match  

2 个答案:

答案 0 :(得分:1)

您不会从单次爆炸运行的输出中获得RBH。 收集来自目标数据库的最佳得分命中,然后针对查询数据库进行反击。 如果来自第二次爆炸的最佳命中与来自第一次爆炸的查询序列匹配,那么查询和目标序列是#34;互惠最佳命中"

只使用一个blast输出,你可以做的最多就是从目标数据库获取id以反击查询db。

希望有所帮助。

也更小的E(xpect)值更好,所以你需要column_11< 2e-04

答案 1 :(得分:0)

输出文件中只有最佳匹配:

blastx -query myFile.fasta -db myDB -evalue 0.00001 -num_alignments 1 -outfmt "7 qseqid sseqid"  | uniq > myResult.txt