pairwiseAlign.c
上传用户:szpanda
上传日期:2016-03-09
资源大小:9k
文件大小:6k
源码类别:

DNA

开发平台:

C/C++

  1. /* File: pairwiseAlign.c                   */ 
  2. /* Author:Qichan Ma, Student No.:250494898 */
  3. #include "globals.h"
  4. #include "pairwiseAlign.h"
  5. /* get the maximal number from 2 numbers */
  6. int max(int x1, int x2) { 
  7.     return (x1 > x2 ? x1 : x2); 
  8. }
  9. /* get the maximal number from 3 numbers */
  10. int max1(int x1, int x2, int x3) {
  11.     return max(max(x1, x2), x3);
  12. }
  13. /* compute the optimal pairwise alignment score of two sequences */
  14. int pairwiseScore(char *x, char *y){
  15.     int n = strlen(x);
  16.     int m = strlen(y); 
  17.     int i, j;
  18. /* use dynamic programming to compute the matrix, and find the maximum alignment score */               
  19.     /* computation matrix of optimal alignment */
  20.     int **A = (int **)malloc((n+1)*sizeof(int *));
  21. for (i=0; i<n+1; i++)
  22.         A[i]=(int *)malloc((m+1)*sizeof(int));
  23.     /* computation matrix of optimal alignment ends with deletion */
  24.     int **I = (int **)malloc((n+1)*sizeof(int *));
  25. for (i=0; i<n+1; i++)
  26.         I[i]=(int *)malloc((m+1)*sizeof(int));
  27.     /* computation matrix of optimal alignment ends with insertion*/
  28.     int **D = (int **)malloc((n+1)*sizeof(int *));
  29. for (i=0; i<n+1; i++)
  30.         D[i]=(int *)malloc((m+1)*sizeof(int));
  31.         
  32.     /* initialize the 3 computation matrices*/ 
  33.     A[0][0] = 0;
  34. for(i=1; i<=n; i++)
  35. A[i][0] = gap_ini + i*gap_ext;
  36. for(j=1; j<=m; j++)
  37. A[0][j] = gap_ini + j*gap_ext;
  38. for(i=0; i<=n; i++)
  39. I[i][0] = A[i][0] + gap_ini;
  40. for(j=0; j<=m; j++)
  41. D[0][j] = A[0][j] + gap_ini;
  42. for(i=1; i<=n; i++)
  43. D[i][0] = D[i-1][0] + gap_ext;
  44. for(j=1; j<=m; j++)
  45. I[0][j] = I[0][j-1] + gap_ext;
  46.    /* compute the 3 matrices */
  47.     for(i=1; i<=n; i++) {
  48. for(j=1; j<=m; j++) {
  49. D[i][j] = max(D[i-1][j]+gap_ext, A[i-1][j]+gap_ini+gap_ext);
  50. I[i][j] = max(I[i][j-1]+gap_ext, A[i][j-1]+gap_ini+gap_ext);
  51.       A[i][j] = max1(A[i-1][j-1]+score[alphaIndex[x[i-1]-65]][alphaIndex[y[j-1]-65]], D[i][j], I[i][j]);
  52. }
  53. }
  54.     for(i=0; i<n+1; i++) {
  55.         free(A[i]);
  56.         free(I[i]);
  57.         free(D[i]);
  58.     }
  59.     free(A);
  60.     free(I);
  61.     free(D);
  62.     
  63.     return A[n][m];
  64. }
  65. /* compute the optimal pairwise alignment score of two sequences and do traceback to get the alignment */
  66. int pairwiseAlign(char *x, char *y){
  67.     int n = strlen(x);
  68.     int m = strlen(y); 
  69.     int i, j;
  70. /* use dynamic programming to compute the matrix, and find the maximum alignment score */               
  71.     /* computation matrix of optimal alignment */
  72.     int **A = (int **)malloc((n+1)*sizeof(int *));
  73. for (i=0; i<n+1; i++)
  74.         A[i]=(int *)malloc((m+1)*sizeof(int));
  75.     /* computation matrix of optimal alignment ends with deletion */
  76.     int **I = (int **)malloc((n+1)*sizeof(int *));
  77. for (i=0; i<n+1; i++)
  78.         I[i]=(int *)malloc((m+1)*sizeof(int));
  79.     /* computation matrix of optimal alignment ends with insertion*/
  80.     int **D = (int **)malloc((n+1)*sizeof(int *));
  81. for (i=0; i<n+1; i++)
  82.         D[i]=(int *)malloc((m+1)*sizeof(int));
  83.  
  84.     /* initialize the 3 computation matrices*/ 
  85.     A[0][0] = 0;
  86. for(i=1; i<=n; i++)
  87. A[i][0] = gap_ini + i*gap_ext;
  88. for(j=1; j<=m; j++)
  89. A[0][j] = gap_ini + j*gap_ext;
  90. for(i=0; i<=n; i++)
  91. I[i][0] = A[i][0] + gap_ini;
  92. for(j=0; j<=m; j++)
  93. D[0][j] = A[0][j] + gap_ini;
  94. for(i=1; i<=n; i++)
  95. D[i][0] = D[i-1][0] + gap_ext;
  96. for(j=1; j<=m; j++)
  97. I[0][j] = I[0][j-1] + gap_ext;
  98.    /* compute the 3 matrices */
  99.     for(i=1; i<=n; i++) {
  100. for(j=1; j<=m; j++) {
  101. D[i][j] = max(D[i-1][j]+gap_ext, A[i-1][j]+gap_ini+gap_ext);
  102. I[i][j] = max(I[i][j-1]+gap_ext, A[i][j-1]+gap_ini+gap_ext);
  103.       A[i][j] = max1(A[i-1][j-1]+score[alphaIndex[x[i-1]-65]][alphaIndex[y[j-1]-65]], D[i][j], I[i][j]);
  104. }
  105. }
  106.     /* traceback to find the optimal alignment */
  107.     char *align1Buf = (char *) malloc((n+m)*sizeof(char));
  108.     char *align2Buf = (char *) malloc((n+m)*sizeof(char));
  109.     int bufIndex=0;
  110.     int state=0; /* the current traceback state. 
  111.                     state==0 -> in matrix A; 
  112.                     state==1 -> in matrix D;
  113.                     state==2 -> in matrix I;   */
  114.     for(i=n,j=m; (i>=1 && j>=1); ) {
  115.         switch(state) {
  116.         case 0:
  117.             if(A[i][j] == A[i-1][j-1]+score[alphaIndex[x[i-1]-65]][alphaIndex[y[j-1]-65]]) {
  118.                 align1Buf[bufIndex] = x[i-1];
  119.                 align2Buf[bufIndex] = y[j-1];
  120.                 bufIndex++;
  121.                 i--;
  122.                 j--;
  123.             } 
  124.             else if (A[i][j] == D[i][j])
  125.                 state = 1;
  126.             else if (A[i][j] == I[i][j])
  127.                 state = 2;
  128.             break;
  129.         case 1:
  130.             if(D[i][j] == A[i-1][j]+gap_ini+gap_ext)
  131.                 state = 0;
  132.             align1Buf[bufIndex] = x[i-1];
  133.             align2Buf[bufIndex] = '-';
  134.             bufIndex++;
  135.             i--; 
  136.             break;
  137.         case 2:
  138.             if(I[i][j] == A[i][j-1]+gap_ini+gap_ext)
  139.                 state = 0;
  140.             align1Buf[bufIndex] = '-';
  141.             align2Buf[bufIndex] = y[j-1];
  142.             bufIndex++;
  143.             j--;
  144.             break; 
  145.         } 
  146. }
  147.     while(i>=1) {
  148.         align1Buf[bufIndex] = x[i-1];
  149.         align2Buf[bufIndex] = '-';
  150.         bufIndex++;  
  151.         i--;          
  152.     }
  153.     while(j>=1) {
  154.         align1Buf[bufIndex] = '-';
  155.         align2Buf[bufIndex] = y[j-1];
  156.         bufIndex++;
  157.         j--;            
  158.     }
  159.     for(i=bufIndex-1; i>=0; i--)
  160.         align1[bufIndex-1-i]=align1Buf[i];
  161.     for(i=bufIndex-1; i>=0; i--)
  162.         align2[bufIndex-1-i]=align2Buf[i];
  163.         align1[bufIndex]=align2[bufIndex]='';
  164.     /* output the optimal alignment score and alignment */
  165. /*    fprintf(out,"The score of the optimal pairwise alignment is: %dn", A[n][m]);
  166.     fprintf(out,"The optimal pairwise alignment is:n");
  167.     fprintf(out,"%sn",align1);
  168.     fprintf(out,"%sn",align2);
  169. */
  170.     free(align1Buf);
  171.     free(align2Buf); 
  172.     for(i=0; i<n+1; i++) {
  173.         free(A[i]);
  174.         free(I[i]);
  175.         free(D[i]);
  176.     }
  177.     free(A);
  178.     free(I);
  179.     free(D);
  180.     
  181.     return A[n][m];
  182. }