JS实现DNA序列比对

  1. <script>   
  2. function pairaln(seq1, seq2){   
  3.     // scoring scheme   
  4.        
  5.     var MATCH    =  1; // +1 for letters that match   
  6.     var MISMATCH = -1; // -1 for letters that mismatch   
  7.     var GAP      = -1; // -1 for any gap   
  8.     // initialization   
  9.        
  10.     var score=[[]];   
  11.     var pointer=[[]];   
  12.     score[0][0]   = 0;   
  13.     pointer[0][0] = 0;   
  14.     var l1=seq1.length   
  15.     var l2=seq2.length   
  16.        
  17.     for(var j = 1; j <= l1; j++) {   
  18.            
  19.             score[0][j]   = GAP * j;   
  20.             pointer[0][j] = 2;   
  21.     }   
  22.     for (var i = 1; i <= l2; i++) {   
  23.            
  24.         score[i]=[];   
  25.         pointer[i]=[];   
  26.             score[i][0]   = GAP * i;   
  27.             pointer[i][0] = 3;   
  28.     }   
  29.     // fill   
  30.        
  31.     for(var i = 1; i <= l2; i++) {   
  32.         var letter2 = seq2.charAt(i-1);   
  33.     
  34.             for(var j = 1; j <= l1; j++) {   
  35.                    
  36.                 var diagonal_score, left_score, up_score;   
  37.                 // calculate match score   
  38.                    
  39.                 var letter1 = seq1.charAt(j-1);                           
  40.                    
  41.                 if (letter1 == letter2) {   
  42.                        
  43.                         diagonal_score = score[i-1][j-1] + MATCH;   
  44.                 }   
  45.                    
  46.                 else {   
  47.                         diagonal_score = score[i-1][j-1] + MISMATCH;   
  48.                 }   
  49.                 // calculate gap scores   
  50.                    
  51.                 up_score   = score[i-1][j] + GAP;   
  52.                 left_score = score[i][j-1] + GAP;   
  53.                 // choose best score   
  54.                    
  55.                 if (diagonal_score >= up_score) {   
  56.                            
  57.                         if (diagonal_score >= left_score) {   
  58.                                
  59.                             score[i][j]   = diagonal_score;   
  60.                             pointer[i][j] = 1;   
  61.                         }   
  62.                        
  63.                     else {   
  64.                             score[i][j]   = left_score;   
  65.                             pointer[i][j] = 2;   
  66.                         }   
  67.                    
  68.                 } else {   
  69.                            
  70.                         if (up_score >= left_score) {   
  71.                                
  72.                             score[i][j]   = up_score;   
  73.                             pointer[i][j] = 3;   
  74.                         }   
  75.                            
  76.                         else {   
  77.                             score[i][j]   = left_score;   
  78.                             pointer[i][j] = 2;   
  79.                         }   
  80.                 }   
  81.             }   
  82.     }   
  83.     // trace-back   
  84.        
  85.     var align1 = [];   
  86.     var align2 = [];   
  87.     // start at last cell of matrix   
  88.     var j = l1;   
  89.     var i = l2;   
  90.     while (1) {   
  91.        
  92.             if(pointer[i][j] == 0)break // ends at first cell of matrix   
  93.             if (pointer[i][j] == 1) {   
  94.            
  95.                 align1[align1.length] = seq1.charAt(j-1);   
  96.                 align2[align2.length] = seq2.charAt(i-1);   
  97.                 i--;   
  98.                 j--;   
  99.             }   
  100.                
  101.             if (pointer[i][j] == 2) {   
  102.            
  103.                 align1[align1.length] = seq1.charAt(j-1);   
  104.                 align2[align2.length] = "-";   
  105.                 j--;   
  106.             }   
  107.                
  108.             if (pointer[i][j] == 3) {   
  109.            
  110.                 align1[align1.length] = "-";   
  111.                 align2[align2.length] = seq2.charAt(i-1);   
  112.                 i--;   
  113.             }       
  114.     }   
  115.     align1 = align1.reverse();   
  116.     align2 = align2.reverse();   
  117.     return "序列:<p>"+seq1+"<br>"+seq2+"<p>比对结果:<table><tr><td>"+align1.join("</td><td>")+"</td></tr><tr><td>"+align2.join("</td><td>")+"</tr></table>";   
  118. }   
  119. document.write(pairaln('CTGGGCTGACTGA', 'GACTAGCTAGACTGA'));   
  120. </script>  
  1. da shang
    donate-alipay
               donate-weixin weixinpay

发表评论↓↓