nuestropc.com
ACCEFYN Mailling Teaching in bioinformatics Back to Homepage
Search LinksSite MapContacts
Servidores, ORACLE, MySQL, ASP, PHP, JSP...Bioinformatica 
Who We Are/Quienes Somos Getting Here Events Teaching/Cursos Genomas, Software Educacion Servidores
 »  Historia
 »  Nuestra relación con ACCEFYN
 »  Pasado y presente
 »  Que ofrecemos?
 »  Seminarios
 »  Cursos
 »  Bioinformatica
 »  Informatica
 »  Prokaryotes: Archeabacteria
 »  EProkaryotes: Eubacteria (Fungi)
 »  Animalia: Eumetazoa::Protozoan
 »  Animalia: Eumetazoa: Bilateria:.:Nematoda
 »  Animalia: :Mammalia: Primates
 »  RasMol version en Español
 »  Software de Bioinformatica
 »  Ofrecimientos en Colombia
 »  Ofrecimientos internacionales

Perl

Manuales y bibliografia Ejemplos en Biologia Desarrollos en Perl Algunos ejemplos y documentacion

 

Por tratarse basicamente de archivos de texto plano donde se identifican regiones que contiene informacion util el lenguaje que de alguna manera ha tenido una alta utilisacion en la Bioinformatica ha sido Perl. Un ejemplo de su uso lo constituyen por ejemplo los desarrollos a nivel de CGIs para presentcion final de resultados porductos de analisis como por ejemplo BLAST. Por sus caracteristicas PERL provee facilidades para manejo de archivos de texto plano, considere el caso de un reporte de BLAST, donde tiene algo como BLASTREPORT, y quisiera por ejemplo conocer dentro de todo el conjunto de resultados cuantas veces una determinada secuencia se repite, atggt o ccttatata por ejemplo. Es en esta clase de situaciones que PERL resulta sumamente util, por su facilidad de porgramacion, y su flexibilidad a la hora de localisar ciertos patrones de busqueda. Un ejemplo de como resolver esta situacion se presenta a continuacion, este ejemplo pretende solamente ilustrar acerca de como PERL es una ayuda efectiva en estas tareas, para aquellos que deseen existen varios muy buenos manuales de PERL, consulte la seccion de manuales y bibliografia que se da en este sitio.

Claramente se identifican las secuencias y se ve como se definen zonas de informacion relevante, consideramos la nesecidad que tenemos de procesamiento: determinar cuantas veces un determinado patron de letras se repite en las secuencias que conforman el relustado de BLAST. De esta manera tenemos tentativamente algo como :

Ese es el esquema basico de el algoritmo de trabajo, de esta manera en codigo de PERL tenemos algo como:

@words=split /\s+/, $line;
if ($line=~ /^Query/)
{
$query_src .=$words[2];
}
elsif ($line =~ /^Sbjct/)
{
$sbjct_src .=$words[2];

Query: 1 ------------------------gtcccagcaatgacagcatcgggaagtccca-----
Dentro de la linea que contiene la secuencia existen espacios definidos. Esto facilita el posicionamiento para la idnetificacion de la secuencia y su posterior comparacion contra un patron dado de busqueda.

@words en posicion 0 @words en posicion 1 @words en posicion 2 @words en posicion 3
Query:
1
SECUENCIA

 

@words=split /\s+/, $line;

Aqui se define el contenido de la variable @words. Se usa una variable vectorial por una razon procedimental, estas permiten el manejo de posiciones. Una ves hecho esto se instruye al pograma para que guarde en $query_src la cadena de caracteres que componen la secuencia. Se procede de igual manera con la siguiente linea de caracteres, dandole asi valores a $sbjct_src.

El siguiente paso a seguir es reconocer el patron a buscar, esto sigunifica tener almacenada en una variable la o las cadenas de caracteres que deseamos identificar dentro de la secuencia, identificar y contar.

@patterns=('gtccca', 'gcaatg', 'cagct', 'tcggga', '-')

Nuevamente se hace uso de una varialbe de tipo vectorial. Para continuar teniendo ya tanto la secuencia blanco como el patron de identificacion se deve iniciar un proceso condicionado, la condicion debe ser clara para que el ciclo tenga realmente un fin, y para que dentro de este ciclo efectivamente se lleve a cabo el proceso que deseamos.

 

my (%query_counts, %sbjct_counts);

#search and store
foreach my $pattern (@patterns)
{
while ($query_src=~ /$pattern/g)
{
$query_counts{$pattern}++;
}
while ($sbjct_src=~ /$pattern/g)
{
$sbjct_counts{ $pattern }++;
}
}

Estas lineas de codigo definen la identificacion y el conteo, para un mejor entendimiento de los comandos aqui utilisados por favor refierase a la bibliografia dada.

Basicamente lo que se le indica aqui a PERL es que tome posiciones excalares de las definidas en el vector @patterns, y que con estas posiciones lleve a cabo una busqueda y conteo para cada caso.

Para cada patron de la lista de patrones, mientras que el valor de $query_counts coincida con el de un patron cuente y almacene. Ese es basicamente el proceso que estas lineas de codigo efectuan.

 

En este punto solo resta la imporesion de un reporte donde se nos diga algo como por ejemplo:

 

'-' seen 58
'cagct' seen
'gcaatg' seen 2
'gtccca' seen 4
'tcggga' seen 2

en query

'-' seen 15
'cagct' seen
'gcaatg' seen
'gtccca' seen 2
'tcggga' seen 2

en sbjct

El codigo fuente completo para este ejemplo es:

 

#!/usr/bin/perl
use strict;
my $REPORT_FILE="report.txt";
my $blast_file=$ARGV[0]||'blast.dat';
unless (-e $blast_file)
{
die "$0: error:missing file: $blast_file";
}
#slurp all the seqs in to the scalar
my ($query_src,$sbjct_src);

#open the blast data file and end prg (DIE) if we can't find it open(IN,
#$blast_file) or die
open (IN, $blast_file) or die "$0: ERROR: $blast_file: $!";

#go trought the blast file line by line, concat all the query and sbj seqs
###while (my $line=<IN>)

my $line;
while ($line=<IN>)
{
chomp $line;
print "processing line $. \n";
# open (IN, $blast_file) or die "$0: ERROR: $blast_file: $!";
my @words=split /\s+/, $line;
if ($line=~ /^Query/)
{
$query_src .=$words[2];
}
elsif ($line =~ /^Sbjct/)
{
$sbjct_src .=$words[2];
}
}
#next line closes the blast file
close IN;

#analysis part
my @patterns=('gtccca', 'gcaatg', 'cagct', 'tcggga', '-');

#find the patterns and sotore them in to the hashes
my (%query_counts, %sbjct_counts);

#search and store
foreach my $pattern (@patterns)
{
while ($query_src=~ /$pattern/g)
{
$query_counts{$pattern}++;
}
while ($sbjct_src=~ /$pattern/g)
{
$sbjct_counts{ $pattern }++;
}
}

#create an empty report fele
open (OUT, ">$REPORT_FILE") or die "$0: ERROR: cant write $REPORT_FILE";

#print the header of the report file
print OUT "Seq report \n",
"lo que sea ", scalar localtime, "\n",
"\nnote in the sakasl saklkskfkdkskskjfkddkfj \n",
"total lenght of the 'Query' seq: \n" ,"\nlenght $query_src, characters \n" , "results for 'Query' :\n";

#my $thetime = scalar (localtime);

#print OUT <<"END_OF_REPORT";
#Seq report
#lo que sea $thetime

#NOTEdfaasafsaada
#total lenght of the query dseq: lenght $query_src characters
#results for 'Query' :
#END_OF_REPORT

#print the query mathces
foreach my $key (sort @patterns)
{
print OUT "\t '$key' seen $query_counts{$key}\n";
}
print OUT "\nTOTAL lenght of 'Sbjct' seq: ","\nlenght $sbjct_src", "cahracters\n", "resoults for 'Sbjct':\n";

#print the sbjct mathces
foreach my $key (sort @patterns)
{
print OUT "\t'$key' seen $sbjct_counts{$key}\n";
}

close OUT;

__END__


Para correrlo es nesesario contar con un archivo de entrada. en este caso es fijo, por defecto buscara a :

blast.dat

y por defecto generara report.txt como OUTPUT

Una explicacion similar de este pequeno juego de comandos en PERL se puede encontrar en: Developing Bioinformatics computer skills, de O´Reilly editores, escrito por Cynthia Gibas&Per Jambeck, pagina 342, este libro hace parte de la bibliografia recomendada.

Para entender como se puede de algun modo tener un proceso para la solucion de problemas consulte aqui.

 

Academia Colombiana De Ciencias Exactas Fisicas y Naturales  Bioinformatica.

COPYRIGHT@www.nuestropc.com2000