8 de noviembre de 2010

Buscar un elemento en un array de perl

En Perl no tenemos la útil función "in_array()" que posee PHP, por lo cual cuando queremos saber si un array contiene un determinado elemento tenemos que escribir un poquito más de código.

Aunque buscando en google "perl array search element" obtenemos muchas soluciones a este problema, aquí presentaré 2 muy sencillas.

Para saber únicamente si un elemento está o no está en el array:

 # Search an element inside an array and return 1 or 0 if the element is present or not, example: in_array(\@my_array, $element);  
 sub in_array {  
      my ($array,$search_for) = @_;  
      my %items = map {$_ => 1} @$array; # create a hash out of the array values  
      my $exist = (exists($items{$search_for}))?1:0;  
      return $exist;
 }  

Si queremos además poder buscar expresiones regulares en todo el array y
conocer la o las posiciones de los resultados:

 # Search a regular expression inside an array and retrieve the positions of the hits, example: in_array(\@my_array, "/$expression/");  
 sub in_array {  
      my ($array,$search_for) = @_;  
      my @pos;  
      if ($search_for =~ /^\/.+\/$/){  
           $search_for =~ s/^\/|\/$//g;  
           @pos = grep { $_ =~ /$search_for/ } @{$array};  
      } else {  
           @pos = grep { $_ eq $search_for } @{$array};  
      }  
      (scalar @pos)?return (1,\@pos):return (0);  
 }  

Otra opción sería usar el módulo Tie::IxHash que permite crear hashes manteniendo el orden de los elementos y buscar los índices de los mismos:

 # Search a regular expression inside an array and retrieve the positions of the hits, example: in_array(\@my_array, "/$expression/");  
 sub in_array {  
      my ($array,$search_for) = @_;  
      my @pos;  
      if ($search_for =~ /^\/.+\/$/){  
           $search_for =~ s/^\/|\/$//g;  
           @pos = grep { $_ =~ /$search_for/ } @{$array};  
      } else {  
           @pos = grep { $_ eq $search_for } @{$array};  
      }  
      (scalar @pos)?return (1,\@pos):return (0);  
 }  

2 de noviembre de 2010

Formación en Bioinformática en Europa


 
La semana pasada estuvimos en las X Jornadas de Bioinformática, que desde hace ya un par de ediciones aglutinan a la mayoría de grupos de España y Portugal que se dedican a esto. Además de un montón de presentaciones científicas y paneles de pósters,tuvimos una sesión dedicada a discutir opciones de formación en Bioinformática. De entre todo lo que se dijo me gustaría destacar un calendario, mantenido por Pedro Fernandes, del Gulbenkian Training Program in Bioinformatics, donde se irán publicando las eventos de formación que se organicen en Europa. El enlace al calendario es: http://sites.google.com/site/bioinftraining/calendarofevents

Un saludo,
Bruno

22 de octubre de 2010

Alineamiento de perfiles con HHalign

Hola,
hoy discutiré un problema habitual cuando trabajamos con familias de proteínas, el de alinear entre si dos grupos de secuencias previamente alineadas (MSAs=multiple sequence alignments) , como se ilustra en el esquema siguiente:


Dadas las secuencias del grupo 1, que hemos alineado entre si con ayuda de programas como muscle, clustal o MAFFT, y las secuencias del grupo 2, que hemos procesado de manera similar, ahora queremos ver cómo se alinean todas juntas, por ejemplo para inferir diferentes funciones o estructuras.

En el caso trivial sería tan sencillo como poner todas las secuencias en el mismo archivo y hacer un alineamiento múltiple de una vez. Sin embargo, el caso que discutimos aquí es más complicado, el que se da cuando no es sencillo alinear una secuencia del grupo 1 con otra del 2, porque han divergido bastante. Entonces podemos probar a convertir el alineamiento MSA1 a un perfil y a alinearlo contra el perfil correspondiente a MSA2, como si fuera un alineamiento pareado. Podemos incorporar, además de la información evolutiva capturada en cada perfil, información de estructura secundaria para ayudar a guiar el alineamiento.

Todo esto es sencillo de realizar con el paquete de programas HHsearch, que podemos descargar de ftp://toolkit.lmb.uni-muenchen.de/HHsearch.

Los pasos a seguir son 3:

1) Obtener archivos FASTA de MSA1.faa (30 secuencias) y MSA2.faa (35 secuencias). Para mayor precisión en el alineamiento es recomendable añadir en ambos archivos una predicción de estructura secundaria, en el formato de PSIPRED. Por ejemplo, el contenido de MSA1.faa comenzaría con las siguientes líneas:
>aa_pred
MVVSIGVFDGVHI--GHQKVL...
>ss_pred
CEEEEECCCCEEH--HHHHHH...
>ss_conf
8888617775007--889999...
>seq1 (y todas las 29 siguintes a continuación)
MVVSIGVFDGVHI--GHQKVL...
2) Convertir MSA1.faa y MSA2.faa en perfiles de Markov (MSA1.hhm y MSA2.hhm), con el ejecutable hhmake:

$ ~/soft/HHsearch/hhmake -i MSA1.faa -seq 30
$ ~/soft/HHsearch/hhmake -i MSA2.faa -seq 35


3) Alinear MSA1 contra MSA2, ya sea de manera global o local:

$ ~/soft/HHsearch/hhalign -i MSA1.hhm -t MSA2.hhm -glob -seq 65 -ofas globalMSA.faa

La salida obtenida es algo como:
REMARK: in -mac -global mode -mact is forced to 0
Query file is in HHM format
Read in HMM seq1 with 467 match states and effective number of sequences = 3.1
Query file is in HHM format
Read in HMM seq31 with 576 match states and effective number of sequences = 1.8
Using maximum accuracy (MAC) alignment algorithm ...
Printing alignments in FASTA format to globalMSA.faa 
Aligned seq1 with seq31: Score = 218.04   P-value = 1     
Done
Un ejemplo de aplicación real de esta técnica de alineamiento lo tenéis en el artículo http://www.biomedcentral.com/1471-2148/10/311 .

15 de octubre de 2010

Cómo crear un blog de laboratorio

Hoy en día todo laboratorio que se precie tiene que tener una presencia mínima en internet. Eso supone tener una página web donde se puedan consultar los datos de contacto, líneas de investigación, proyectos, publicaciones, ofertas de trabajo, etc. referentes al laboratorio. Toda esta información será una buena carta de presentación para otros investigadores que busquen colaboraciones, estudiantes y doctores que quieran entrar en el laboratorio, y toda aquella gente que esté interesada en los temas que se investigan en el laboratorio. Por ejemplo, ésta es nuestra web: http://www.eead.csic.es/compbio/

 La información de una página web de laboratorio es más o menos estática, esto es, no cambian sus contenidos frecuentemente, normalmente sólo se actualiza 2 o 3 veces al año. Sin embargo la actual tendencia de Web 2.0 hace que la gente busque en internet información cada vez más actualizada, dinámica y cambiante. Por ello un Blog de Laboratorio puede servirnos para ampliar la información de nuestra página web de una forma más flexible, personal y frecuente. A continuación se darán unas pautas y consejos para ayudar a cualquier investigador que quiera crear su propio blog o un blog para su laboratorio.

¿Por qué crear un Blog?
Un blog nos permitirá publicar de forma rápida y sencilla contenidos en internet. De esta forma mejorará la visibilidad de nuestras investigaciones en Google. Además, el vocabulario que se suele usar en los blogs es más directo y sencillo, con lo cual se amplía también el rango de gente a la que le pueda interesar lo que publiquemos.

¿Cómo y dónde crear un Blog?
Actualmente existen dos grandes plataformas gratuitas para crear un blog en internet: Blogger y Wordpress. Las dos son muy buenas opciones, y decidirse por una u otra a veces es cuestión de gustos, este artículo os puede ayudar a decidir: http://entretecnologia.blogspot.com/2010/04/blogger-y-wordpress-como-elegir.html En mi humilde opinión, Blogger es más sencillo y Wordpress es más completo y personalizable, así que para un laboratorio puede servirnos muy bien la primera opción.
 
¿Qué escribir en el Blog?
No tiene sentido crear un Blog para el laboratorio y escribir en él cosas de política, así que mi recomendación es que sea un blog con temática cercana a la de las investigaciones del laboratorio. No por ello han de ser contenidos técnicos y complicados, si no no los leería nadie. Y tampoco hay que ser muy estrictos en respetar siempre la temática del blog y de vez en cuando se puede uno permitirse el lujo de hablar de algo diferente, como por ejemplo este post. Un buen consejo es escribir párrafos cortos y poner de vez en cuando alguna imagen.

¿Cada cuánto debo escribir en el Blog?
No hay ninguna obligación de escribir todos los días en el blog, pero sí que sería conveniente publicar algo todas las semanas, o al menos un artículo todos los meses. Cuanto más cosas escribamos y más interesantes sean, más gente nos leerá y conseguiremos nuestro objetivo de informar y dar a conocer nuestro laboratorio.

¿Y si leo este artículo y creo un Blog?
Si es así publica un comentario en este post con el título, temática y dirección de tu Blog de Laboratorio, así empezarás a darlo a conocer...


Espero que algún investigador se anime después de leer esto, y empiecen los comentarios :D

Publica tu código


Hola,
hoy en vez de evaluar un programa o unas líneas de código os sugiero una columna
publicada esta misma semana en la influyente revista Nature, donde el autor, Nick Barnes, director de la Climate Code Foundation, defiende que los científicos salimos ganando y de hecho contribuimos a difundir nuestro propio trabajo, cuando publicamos el código fuente de los programas que escribimos para nuestros proyectos, aunque nunca lo hubiésemos escrito con la idea de distribuirlo. En caso contrario, defiende el autor, generalmente ese código se pierde y se convierte en abandonware (fuente de la imagen: http://top-buzz.com/2009/10).

Cualquiera que lleve cierto tiempo trabajando en Bioinformática seguro que tiene programitas y scripts que llevan tiempo languideciendo en directorios o incluso en copias de seguridad condenadas al olvido. Lo que propone el autor es que muchos de esos programas se podrían publicar por ejemplo como material suplementario junto con los artículos para los que se escribieron. Yo añadiría que son todavía más visibles, y por tanto potencialmente más útiles para otros usuarios, si los colgamos de la web en blogs como éste.


El enlace al artículo original en inglés es:
http://www.nature.com/news/2010/101013/full/467753a.html