nw.h
上传用户:xiongqisl
上传日期:2022-08-01
资源大小:2k
文件大小:6k
- #include <string>
- #include <vector>
- /**
- * Algoritmo Needleman-Wunsch
- *
- * Creado el 2 de Abril de 2007
- *
- * Autor: Germ醤 Gonz醠ez
- *
- * Basado en la versi髇 java escrita por: Peter Petrov
- */
-
- class NeedlemanWunsch
- {
- private:
- vector < vector <int> > MatrizCosto[4][4];
- vector < vector <int> > MatrizPeso;
- vector <string> resultado;
- vector <int> puntaje;
- int MAX_LINE_LENGTH;
- int gapPenalty;
- string line, s1, s2;
- //stringTokenizer st = ("", "t :rn");
-
- public:
- NeedlemanWunsch();
- vector <string> llenarMatriz(string s1, string s2, int puntaje[]);
- string siguienteToken();
- int obtenerLetraIndice(char letra);
- };
-
- NeedlemanWunsch :: NeedlemanWunsch()
- {
- MAX_LINE_LENGTH = 1024;
- gapPenalty = -1;
- line = "";
- }
-
- vector <string> NeedlemanWunsch :: llenarMatriz(string sec1, string sec2, vector <int> puntaje)
- {
- s1 = sec1;
- s2 = sec2;
-
- int largoS1 = s1.length();
- int largoS2 = s2.length();
-
- MatrizPeso.resize(largoS1 + 1);
- for (unsigned i = 0; i < MatrizPeso.size(); i++)
- {
- MatrizPeso[i].resize(largoS2 + 1);
- }
- MatrizPeso [0][0] = 0;
-
- for (int i=1; i<=largoS1; i++)
- MatrizPeso[i][0] = i * gapPenalty;
-
- for (int i=1; i<=largoS2; i++)
- MatrizPeso[0][i] = i * gapPenalty;
-
- int puntajeSiBajo = 0;
- int puntajeSiVoyalaDerecha = 0;
- int puntajeSiBajoyVoyalaDerecha = 0;
-
- int mejorPuntaje = 0;
- int ind1 = 0;
- int ind2 = 0;
-
- for (int i=1; i<=largoS1; i++)
- {
- for (int j=1; j<=largoS2; j++)
- {
- // Las siguientes 5 lineas pueden ser separadas en un m閠odo auxiliar
- ind1 = obtenerLetraIndice(s1.at(i-1));
- ind2 = obtenerLetraIndice(s2.at(j-1));
- puntajeSiBajo = MatrizPeso[i-1][j] + gapPenalty;
- puntajeSiVoyalaDerecha = MatrizPeso[i][j-1] + gapPenalty;
- puntajeSiBajoyVoyalaDerecha = MatrizPeso[i-1][j-1] + MatrizCosto[ind1][ind2];
-
- mejorPuntaje = Math.max( Math.max(puntajeSiBajo, puntajeSiVoyalaDerecha), puntajeSiBajoyVoyalaDerecha );
- MatrizPeso[i][j] = mejorPuntaje;
- }
- }
-
- string res1, res2;
-
- int i = largoS1;
- int j = largoS2;
-
- // Esta forma nos devuelve el puntaje del m閠odo que llama a la funci髇
- puntaje[0] = MatrizPeso[largoS1][largoS2];
-
- while (i>0 && j>0)
- {
- // Las siguientes 5 lineas pueden ser separadas en un m閠odo auxiliar
- ind1 = obtenerLetraIndice(s1.at(i-1));
- ind2 = obtenerLetraIndice(s2.at(j-1));
- puntajeSiBajo = MatrizPeso[i-1][j] + gapPenalty;
- puntajeSiVoyalaDerecha = MatrizPeso[i][j-1] + gapPenalty;
- puntajeSiBajoyVoyalaDerecha = MatrizPeso[i-1][j-1] + MatrizCosto[ind1][ind2];;
-
- if (MatrizPeso[i][j] == puntajeSiBajo)
- {
- // Subamos!
- res1.insert(0, s1.at(i-1));
- res2.insert(0, '-');
- i--;
- }
-
- else if (MatrizPeso[i][j] == puntajeSiVoyalaDerecha)
- {
- // Vayamos a la izquierda!
- res1.insert(0, '-');
- res2.insert(0, s2.at(j-1));
- j--;
- }
-
- else if (MatrizPeso[i][j] == puntajeSiBajoyVoyalaDerecha)
- {
- // Subamos y vayamos a la izquierda!
- res1.insert(0, s1.at(i-1));
- res2.insert(0, s2.at(j-1));
- i--;
- j--;
- }
- }
-
- while (i>0)
- {
- // Subamos !
- res1.insert(0, s1.charAt(i-1));
- res2.insert(0, '-');
- i--;
- }
-
- while (j>0)
- {
- // Vayamos a la izquierda !
- res1.insert(0, '-');
- res2.insert(0, s2.at(j-1));
- j--;
- }
-
- MatrizPeso = NULL;
- resultado = res1.toString(), res2.toString();
-
- return resultado;
- }
-
- int NeedlemanWunsch :: obtenerLetraIndice(char letra)
- {
- int ind = -1;
- switch (letra)
- {
- case 'A': ind = 0; break;
- case 'G': ind = 1; break;
- case 'C': ind = 2; break;
- case 'T': ind = 3; break;
- }
- return ind;
- }
-
- void NeedlemanWunsch :: parseInput()
- {
- vector <vector <string>> matriz [5][5];
-
- matriz[0][0] = "";
-
- for (int k=1; k<=24; k++)
- {
- matriz[k/5][k%5] = siguienteToken();
- }
- // Guarda la etiqueta de la i-esima fila en etiquetasFilas[i-1]
- char etiquetasFilas[4];
- for (int i=1; i<=4; i++)
- {
- etiquetasFilas[i-1] = matriz[i][0];
- }
- // Guarda la etiqueta de la j-esima columna en etiquetasCol[j-1]
- char etiquetasCol[4];
- for (int j=1; j<=4; j++)
- {
- etiquetasCol[j-1] = matriz[0][j];
- }
-
- for (int i=1; i<=4; i++)
- {
- for (int j=1; j<=4; j++)
- {
- int w = Integer.parseInt(matrix[i][j]);
- int indI = getLetterIndex(rowLabels[i-1]);
- int indJ = getLetterIndex(colLabels[j-1]);
- MatrizCosto[indI][indJ] = w;
- }
- }
-
- siguienteToken(); // Palabra de escape "GAP"
- siguienteToken(); // Palabra de escape "PENALTY:"
-
- // Leer el valor de la penalidad gap
- gapPenalty = Integer.parseInt(siguienteToken());
-
- }
- string NeedlemanWunsch :: siguienteToken()
- {
- while (!st.hasMoreTokens())
- {
- line = readLn(MAX_LINE_LENGTH + 10);
- if (line.empty()) return NULL;
- st = new StringTokenizer(line);
- }
-
- return st.siguienteToken().trim();
- }
- /*
- * M閠odo para leer lineas del flujo
- * de entrada est醤dar (cin)
- */
-
- string NeedlemanWunsch :: leerLn (int maxLg)
- {
- byte lin[] = new byte [maxLg];
- int lg = 0, car = -1;
-
- while (lg < maxLg)
- {
- cin >> car;
- if ((car < 0) || (car == 'n')) break;
- lin [lg++] += car;
- }
-
- if ((car < 0) && (lg == 0))
- {
- // EOF
- return (NULL);
- }
-
- return (new String (lin, 0, lg));
- }
-
- }