Alineamiento múltiple
Publicado: 2014-01-13 10:16 @470
Buenas tardes. Llevo una semana dándole vueltas a la cabeza y como soy biólogo y no informático la verdad es que me encuentro bastante perdido, a ver si me pudierais echar un cable.
El programa que intento hacer abre un fichero con un máximo de 8 cadenas que hay que meter previamente en un array. Luego la segunda función del programa se supone que coge de 2 en 2 esas cadenas, siempre la 1 con la 2, la 1 con la 3, la 1 con la 4, etc...
Por algún motivo no me deja subiros el fichero de las cadenas con lo que he hecho una pequeña modificación al programa para que en vez de abrir un fichero lea unas cadenas que he escrito yo al azar.
El caso es que en vez para alinearme las cadenas siempre me devuelve un return de 0, seguro que he cometido más de un error, pero el caso es que me falta el conocimiento para determinar dónde reside...
El programa debería alinear y meterme los resultados en una matriz, y una vez en ella, debería comprobar todas las columnas y hacerme un print con el número de posiciones de la matriz donde coincide en todas las cadenas el mismo carácter (nucleótido).
Si pudierais ayudarme en cualquiera de mis dudas, que siento que sean tantas... os estaría eternamente agradecido.
El código es este:
El programa que intento hacer abre un fichero con un máximo de 8 cadenas que hay que meter previamente en un array. Luego la segunda función del programa se supone que coge de 2 en 2 esas cadenas, siempre la 1 con la 2, la 1 con la 3, la 1 con la 4, etc...
Por algún motivo no me deja subiros el fichero de las cadenas con lo que he hecho una pequeña modificación al programa para que en vez de abrir un fichero lea unas cadenas que he escrito yo al azar.
El caso es que en vez para alinearme las cadenas siempre me devuelve un return de 0, seguro que he cometido más de un error, pero el caso es que me falta el conocimiento para determinar dónde reside...
El programa debería alinear y meterme los resultados en una matriz, y una vez en ella, debería comprobar todas las columnas y hacerme un print con el número de posiciones de la matriz donde coincide en todas las cadenas el mismo carácter (nucleótido).
Si pudierais ayudarme en cualquiera de mis dudas, que siento que sean tantas... os estaría eternamente agradecido.
El código es este:
Using perl Syntax Highlighting
- #################################################################
- ## Programa para alinear por pares 2 secuencias introduciendo ##
- ## gaps para optimizar el número de coincidencias ##
- #################################################################
- #my @lista_cad;
- #my $nombrearchivo= "datos8-500";
- #sub abrir_archivo {my ($nombrearchivo) = shift;
- # unless(open(Archivo, $nombrearchivo)) {
- # print "Se ha detectado un error al abrir archivo, \n compruebe que el nombre del archivo y el formato son correctos,";
- # exit;
- # }
- # @lista_cad = <Archivo>;
- # close Archivo;
- # return @lista_cad;
- # }
- my @lista_cad = ( "AGTGTA", "AGTCTA", "AGTCAA" );
- my @pareja;
- for ( my $i = 1; $i < int(@lista_cad); $i++ ) {
- @pareja = emparejamelas( $array[0], $array[$i] );
- print join( "\n", @pareja );
- }
- sub emparejamelas {
- my ( $sec1, $sec2 ) = @ARGV;
- # Marcador del esquema
- my $basecoincide = 1; # +1 si las bases están emparejadas
- my $basenocoincide = -1; # -1 si las bases están desparejadas
- my $GAP = -1; # -1 para cualquier gap
- # Inicializa
- #abrir_archivo($nombrearchivo);
- my @lista_cad;
- $lista_cad[0][0]{score} = 0;
- $lista_cad[0][0]{pointer} = "none";
- for ( my $j = 1; $j <= length($sec1); $j++ ) {
- $lista_cad[0][$j]{score} = $GAP * $j;
- $lista_cad[0][$j]{pointer} = "left";
- }
- for ( my $i = 1; $i <= length($sec2); $i++ ) {
- $lista_cad[$i][0]{score} = $GAP * $i;
- $lista_cad[$i][0]{pointer} = "up";
- }
- # Rellenar
- for ( my $i = 1; $i <= length($sec2); $i++ ) {
- for ( my $j = 1; $j <= length($sec1); $j++ ) {
- my ( $marc_diagonal, $marc_izq, $marc_up );
- # Calcula el marcador de emparejamiento
- my $letter1 = substr( $sec1, $j - 1, 1 );
- my $letter2 = substr( $sec2, $i - 1, 1 );
- if ( $letter1 eq $letter2 ) {
- $marc_diagonal = $lista_cad[ $i - 1 ][ $j - 1 ]{score} + $basecoincide;
- }
- else {
- $marc_diagonal = $lista_cad[ $i - 1 ][ $j - 1 ]{score} + $basenocoincide;
- }
- # Calcula el marcador de gaps
- $marc_up = $lista_cad[ $i - 1 ][$j]{score} + $GAP;
- $marc_izq = $lista_cad[$i][ $j - 1 ]{score} + $GAP;
- # Elige el mejor resultado
- if ( $marc_diagonal >= $marc_up ) {
- if ( $marc_diagonal >= $marc_izq ) {
- $lista_cad[$i][$j]{score} = $marc_diagonal;
- $lista_cad[$i][$j]{pointer} = "diagonal";
- }
- else {
- $lista_cad[$i][$j]{score} = $marc_izq;
- $lista_cad[$i][$j]{pointer} = "left";
- }
- }
- else {
- if ( $marc_up >= $marc_izq ) {
- $lista_cad[$i][$j]{score} = $marc_up;
- $lista_cad[$i][$j]{pointer} = "up";
- }
- else {
- $lista_cad[$i][$j]{score} = $marc_izq;
- $lista_cad[$i][$j]{pointer} = "left";
- }
- }
- }
- }
- # Rastrear el origen
- my $alineam1 = "";
- my $alineam2 = "";
- # Empieza en la última "cell" de la matriz
- my $j = length($sec1);
- my $i = length($sec2);
- while (1) {
- last if $lista_cad[$i][$j]{pointer} eq "none"; # Termina en la última "cell" de la matriz
- if ( $lista_cad[$i][$j]{pointer} eq "diagonal" ) {
- $alineam1 .= substr( $sec1, $j - 1, 1 );
- $alineam2 .= substr( $sec2, $i - 1, 1 );
- $i--;
- $j--;
- }
- elsif ( $lista_cad[$i][$j]{pointer} eq "left" ) {
- $alineam1 .= substr( $sec1, $j - 1, 1 );
- $alineam2 .= "-";
- $j--;
- }
- elsif ( $lista_cad[$i][$j]{pointer} eq "up" ) {
- $alineam1 .= "-";
- $alineam2 .= substr( $sec2, $i - 1, 1 );
- $i--;
- }
- }
- $alineam1 = reverse $alineam1;
- $alineam2 = reverse $alineam2;
- return $alineam1;
- return $alineam2;
- }
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4