Hola,
hoy quería compartir recetas en Perl para la comparación eficiente de secuencias de igual longitud. Las dos funciones que vamos a ver devuelven como resultado listas con las posiciones (contando desde 0) en las que difieren dos secuencias.
Para qué sirve esto? En general, para calcular distancias de edición (edit distances); en bioinformática es una manera, por ejemplo, de comparar oligos de igual longitud o secuencias extraídas de un alineamiento múltilple, incluyendo gaps. El siguiente código fuente incluye una subrutina en Perl (con el operador binario ^ y la función pos) y otra en C embebido para hacer la misma operación por dos caminos:
un saludo,
Bruno
hoy quería compartir recetas en Perl para la comparación eficiente de secuencias de igual longitud. Las dos funciones que vamos a ver devuelven como resultado listas con las posiciones (contando desde 0) en las que difieren dos secuencias.
Para qué sirve esto? En general, para calcular distancias de edición (edit distances); en bioinformática es una manera, por ejemplo, de comparar oligos de igual longitud o secuencias extraídas de un alineamiento múltilple, incluyendo gaps. El siguiente código fuente incluye una subrutina en Perl (con el operador binario ^ y la función pos) y otra en C embebido para hacer la misma operación por dos caminos:
use strict;
use warnings;
my $seq1 = 'ACTGGA';
my $seq2 = 'AGTG-A';
my @Pdiffs = find_diffs($seq1,$seq2);
my @Cdiffs = find_diffs_C($seq1,$seq2);
printf("# version Perl\ndiferencias = %d\n%s\n",scalar(@Pdiffs),join(',',@Pdiffs));
printf("# version C\ndiferencias = %d\n%s\n",scalar(@Cdiffs),join(',',@Cdiffs));
sub find_diffs
{
my ($seqA,$seqB) = @_;
my $XOR = $seqA ^ $seqB;
my @diff;
while($XOR =~ /([^\0])/g)
{
push(@diff,pos($XOR)-1);
}
return @diff;
}
use Inline C => <<'END_C';
void find_diffs_C(char* x, char* y)
{
int i;
Inline_Stack_Vars;
Inline_Stack_Reset;
for(i=0; x[i] && y[i]; ++i) {
if(x[i] != y[i]) {
Inline_Stack_Push(sv_2mortal(newSViv(i)));
}
}
Inline_Stack_Done;
}
END_C
Podéis ver en stackoverflow otras versiones y su comparación en base a su tiempo de cálculo,un saludo,
Bruno