nw.h
上传用户:xiongqisl
上传日期:2022-08-01
资源大小:2k
文件大小:6k
开发平台:

C/C++

  1. #include <string>
  2. #include <vector>
  3. /**
  4.  * Algoritmo Needleman-Wunsch
  5.  * 
  6.  * Creado el 2 de Abril de 2007 
  7.  * 
  8.  * Autor: Germ醤 Gonz醠ez
  9.  * 
  10.  * Basado en la versi髇 java escrita por: Peter Petrov
  11.  */
  12.  
  13. class NeedlemanWunsch 
  14.   {
  15.    private:   
  16.                vector < vector <int> > MatrizCosto[4][4];
  17.             vector < vector <int> > MatrizPeso;
  18.                vector <string> resultado;
  19.                vector <int> puntaje;
  20.             int MAX_LINE_LENGTH;
  21.             int gapPenalty;
  22.                string line, s1, s2;
  23.                //stringTokenizer st = ("", "t :rn");
  24.    
  25.    public:
  26.              NeedlemanWunsch();
  27.              vector <string> llenarMatriz(string s1, string s2, int puntaje[]);
  28.              string siguienteToken();
  29.              int obtenerLetraIndice(char letra);
  30. };
  31.    
  32. NeedlemanWunsch :: NeedlemanWunsch()
  33. {
  34.    MAX_LINE_LENGTH = 1024;
  35.    gapPenalty = -1;
  36.    line = "";
  37. }
  38.  vector <string> NeedlemanWunsch :: llenarMatriz(string sec1, string sec2, vector <int> puntaje)
  39.    {
  40.       s1 = sec1;
  41.       s2 = sec2;
  42.       
  43. int largoS1 = s1.length();
  44. int largoS2 = s2.length();
  45.       
  46.      MatrizPeso.resize(largoS1 + 1);
  47.      for (unsigned i = 0; i < MatrizPeso.size(); i++)
  48.      {
  49.        MatrizPeso[i].resize(largoS2 + 1);
  50.      }
  51. MatrizPeso [0][0] = 0;
  52.      
  53. for (int i=1; i<=largoS1; i++)
  54. MatrizPeso[i][0] = i * gapPenalty;
  55.      
  56. for (int i=1; i<=largoS2; i++)
  57. MatrizPeso[0][i] = i * gapPenalty;
  58. int puntajeSiBajo = 0;
  59. int puntajeSiVoyalaDerecha = 0;
  60. int puntajeSiBajoyVoyalaDerecha = 0;
  61. int mejorPuntaje = 0;
  62. int ind1 = 0;
  63. int ind2 = 0;
  64.       for (int i=1; i<=largoS1; i++)
  65.          {
  66. for (int j=1; j<=largoS2; j++)
  67.             {
  68. // Las siguientes 5 lineas pueden ser separadas en un m閠odo auxiliar
  69. ind1 = obtenerLetraIndice(s1.at(i-1));
  70. ind2 = obtenerLetraIndice(s2.at(j-1));
  71. puntajeSiBajo = MatrizPeso[i-1][j] + gapPenalty;
  72. puntajeSiVoyalaDerecha = MatrizPeso[i][j-1] + gapPenalty;
  73. puntajeSiBajoyVoyalaDerecha = MatrizPeso[i-1][j-1] + MatrizCosto[ind1][ind2];
  74. mejorPuntaje = Math.max( Math.max(puntajeSiBajo, puntajeSiVoyalaDerecha), puntajeSiBajoyVoyalaDerecha );
  75. MatrizPeso[i][j] = mejorPuntaje;
  76. }
  77. }
  78. string res1, res2;
  79. int i = largoS1;
  80. int j = largoS2;
  81. // Esta forma nos devuelve el puntaje del m閠odo que llama a la funci髇
  82. puntaje[0] = MatrizPeso[largoS1][largoS2];
  83. while (i>0 && j>0)
  84.       {
  85. // Las siguientes 5 lineas pueden ser separadas en un m閠odo auxiliar
  86. ind1 = obtenerLetraIndice(s1.at(i-1));
  87. ind2 = obtenerLetraIndice(s2.at(j-1));
  88. puntajeSiBajo = MatrizPeso[i-1][j] + gapPenalty;
  89. puntajeSiVoyalaDerecha = MatrizPeso[i][j-1] + gapPenalty;
  90. puntajeSiBajoyVoyalaDerecha = MatrizPeso[i-1][j-1] + MatrizCosto[ind1][ind2];;
  91. if (MatrizPeso[i][j] == puntajeSiBajo)
  92.          {
  93. // Subamos!
  94. res1.insert(0, s1.at(i-1));
  95. res2.insert(0, '-');
  96. i--;
  97. }
  98.         
  99.          else if (MatrizPeso[i][j] == puntajeSiVoyalaDerecha)
  100.          {
  101. // Vayamos a la izquierda!
  102. res1.insert(0, '-');
  103. res2.insert(0, s2.at(j-1));
  104. j--;
  105. }
  106.          
  107.          else if (MatrizPeso[i][j] == puntajeSiBajoyVoyalaDerecha)
  108.          {
  109. // Subamos y vayamos a la izquierda!
  110. res1.insert(0, s1.at(i-1));
  111. res2.insert(0, s2.at(j-1));
  112. i--;
  113. j--;
  114. }
  115. }
  116.       
  117. while (i>0)
  118.       {
  119. // Subamos !
  120. res1.insert(0, s1.charAt(i-1));
  121. res2.insert(0, '-');
  122. i--;
  123. }
  124.       
  125. while (j>0)
  126.       {
  127. // Vayamos a la izquierda !
  128. res1.insert(0, '-');
  129. res2.insert(0, s2.at(j-1));
  130. j--;
  131. }
  132. MatrizPeso = NULL;
  133.       resultado = res1.toString(), res2.toString();
  134. return resultado;
  135. }
  136. int NeedlemanWunsch :: obtenerLetraIndice(char letra)
  137.    {
  138. int ind = -1;
  139. switch (letra)
  140.       {
  141. case 'A': ind = 0; break;
  142. case 'G': ind = 1; break;
  143. case 'C': ind = 2; break;
  144. case 'T': ind = 3; break;
  145. }
  146. return ind;
  147. }
  148. void NeedlemanWunsch :: parseInput()
  149.    {
  150.       vector <vector <string>> matriz [5][5];
  151.       
  152. matriz[0][0] = "";
  153.       
  154. for (int k=1; k<=24; k++)
  155.          {
  156.   matriz[k/5][k%5] = siguienteToken(); 
  157.    }
  158. // Guarda la etiqueta de la i-esima fila en etiquetasFilas[i-1]
  159. char etiquetasFilas[4];
  160. for (int i=1; i<=4; i++)
  161.       {
  162. etiquetasFilas[i-1] = matriz[i][0];
  163. }
  164. // Guarda la etiqueta de la j-esima columna en etiquetasCol[j-1]
  165. char etiquetasCol[4];
  166. for (int j=1; j<=4; j++)
  167.       {
  168. etiquetasCol[j-1] = matriz[0][j];
  169. }
  170. for (int i=1; i<=4; i++)
  171.       {
  172. for (int j=1; j<=4; j++)
  173.          {
  174. int w = Integer.parseInt(matrix[i][j]);
  175. int indI = getLetterIndex(rowLabels[i-1]);
  176. int indJ = getLetterIndex(colLabels[j-1]);
  177. MatrizCosto[indI][indJ] = w;
  178. }
  179. }
  180. siguienteToken(); // Palabra de escape "GAP"
  181. siguienteToken(); // Palabra de escape "PENALTY:"
  182. // Leer el valor de la penalidad gap
  183. gapPenalty = Integer.parseInt(siguienteToken());
  184. }
  185. string NeedlemanWunsch :: siguienteToken()
  186.    {
  187.         while (!st.hasMoreTokens())
  188.          {
  189.             line = readLn(MAX_LINE_LENGTH + 10);
  190.             if (line.empty()) return NULL;
  191.             st = new StringTokenizer(line);
  192.          }
  193.          
  194.         return st.siguienteToken().trim();
  195.    }
  196.     /*
  197.      * M閠odo para leer lineas del flujo 
  198.      * de entrada est醤dar (cin)
  199.      */
  200.    
  201.   string NeedlemanWunsch :: leerLn (int maxLg)
  202.     {
  203.         byte lin[] = new byte [maxLg];
  204.         int lg = 0, car = -1;
  205.      
  206.             while (lg < maxLg)
  207.              {
  208.                 cin >> car; 
  209.                 if ((car < 0) || (car == 'n')) break;
  210.                 lin [lg++] += car;
  211.             }
  212.        
  213.         if ((car < 0) && (lg == 0)) 
  214.         {
  215.          // EOF
  216.          return (NULL);
  217.         }
  218.         
  219.         return (new String (lin, 0, lg));
  220.     }
  221. }