19 de diciembre de 2014

kseq::klib to parse FASTQ/FASTA files

Buenas,
éste tiene pinta de ser el último artículo del año, no? Desde hace tiempo venimos usando en el laboratorio la librería kseq.h , integrante de [ https://github.com/attractivechaos/klib ], para las desagradecidas tareas de manipular grandes archivos en formato FASTQ. Esta librería es un único archivo .h en lenguaje C que de manera muy eficiente permite leer archivos FASTQ, y también FASTA, incluso comprimidos con GZIP, con zlib. La eficiencia es fundamental para estas aplicaciones, porque modificar archivos .fastq de varios GB puede consumir mucho tiempo.

Fuente: http://drive5.com/usearch/manual/fastq_files.html


Como resultado de esta experiencia hace unos meses colgamos de la web del labo un programita, que llamamos split_pairs. Este software facilita trabajos tediosos como pueden ser modificar las cabeceras de una archivo FASTQ con expresiones regulares para que un programa posterior no se queje, y de paso emparejar o interlazar los reads según convenga.  Está escrito en C++ y tiene asociado un script Perl.

De lo que quería hablar hoy es de que es posible utilizar kseq.h directamente desde nuestro lenguaje preferido. Para ellos es necesario emplear herramientas que permitan incluir, y compilar, código C mezclado con el de nuestro lenguaje interpretado. En el caso de Python estaríamos hablando por ejemplo de cython , aquí os muestro cómo hacerlo en Perl con el módulo Inline::CPP, dotando a kseq de una interfaz orientada a objetos para evitar pasar tipos de datos con tipos no estándar:

 package klib::kseq;  
 use Inline CPP => config => namespace => 'klib';    
 use Inline CPP => config => libs => '-lz';  
 use Inline CPP => <<'END_CPP';  
 /*  
 The Klib library [ https://github.com/attractivechaos/klib ], is a standalone and   
 lightweight C library distributed under MIT/X11 license.   
 Klib strives for efficiency and a small memory footprint.  
 This package contains C++ wrappers for components of Klib to make them easy to use from Perl scripts.  
 */  
 using namespace std;  
 #include <iostream>  
 #include <string>  
 #include <zlib.h>  
 #include "kseq.h"   
 /*   
 kseq is generic stream buffer and a FASTA/FASTQ format parser from Klib.  
 Wrapper written by Bruno Contreras Moreira.  
 */  
 KSEQ_INIT(gzFile, gzread)  
 class kseqreader
 {  
 public:  
    kseqreader()  
    {  
       fp = NULL;  
       fromstdin=false;  
       openfile=false;  
       filename = "";  
    }  
    ~kseqreader()  
    {  
       close_stream();  
    }  
    void rewind_stream()  
    {  
       if(openfile == true)  
       {  
          if(fromstdin == false) kseq_rewind(seq);  
          else  
             cerr<<"# reader: cannot rewind STDIN stream"<<endl;  
       }  
    }           
    void close_stream()  
    {  
       if(openfile == true)  
       {  
          kseq_destroy(seq);  
          if(fromstdin == false) gzclose(fp);  
          fp = NULL;  
          fromstdin=false;  
          openfile=false;  
          filename = "";  
       }     
    }  
    // accepts both FASTA and FASTQ files, which can be GZIP-compressed  
    // returns 1 if file was successfully opened, 0 otherwise  
    int open_stream(char *infilename)  
    {  
       filename = infilename;  
       if(filename.empty())  
       {   
          cerr<<"# reader: need a valid file name"<<endl;  
          filename = "";  
          return 0;  
       }     
       else  
       {  
          FILE *ifp = NULL;  
          if(filename == "stdin")  
          {  
             ifp = stdin;  
             fromstdin = true;  
          }  
          else ifp = fopen(filename.c_str(),"r");  
          if(ifp == NULL)     
          {  
             cerr<<"# reader: cannot open input file: "<<filename<<endl;  
             filename = "";  
             return 0;  
          }  
          else // open file and initialize stream  
          {  
             fp = gzdopen(fileno(ifp),"r");   
             seq = kseq_init(fp);   
             openfile=true;  
             return 1;  
          }  
       }     
    }  
     // returns length of current sequence, which can be 0,  
    // -1 in case of EOF and -2 in case of truncated quality string  
    int next_seq()  
    {   
       return kseq_read(seq);   
    }  
     const char *get_sequence()  
    {  
       return seq->seq.s;  
    }  
    // returns FASTA/FASTQ header up to first found space  
    const char *get_name()  
    {  
       return seq->name.s;  
    }  
    const char *get_quality()  
    {  
       if(seq->qual.l) return seq->qual.s;  
       else return "";   
    }  
    const char *get_comment()  
    {  
       if(seq->comment.l) return seq->comment.s;  
       else return "";   
    }  
    const char *get_full_header()  
    {  
       _header = seq->name.s;  
       if(seq->comment.l)  
       {   
          _header += " ";  
          _header + seq->comment.s;  
       }     
      return _header.c_str();  
    }  
 private:  
    gzFile fp;  
    kseq_t *seq;  
    bool fromstdin;  
    bool openfile;  
    string filename;  
    string _header;  
 };  
 END_CPP  
 1;  

Ahora estamos en disposición de probar a leer un archivo con este módulo:

 use strict;  
 use klib;  
 my ($length,$header,$sequence,$quality);  
 my $infile = "sample.fq.gz";  
 # my $infile = "stdin";  
 my $kseq = new klib::kseq::kseqreader();  
 if($kseq->open_stream($infile))  
 {  
   while( ($length = $kseq->next_seq()) != -1 )  
   {  
     ($header,$sequence,$quality) =  
       ($kseq->get_full_header(),$kseq->get_sequence(),$kseq->get_quality());   
   }  
 }  
 $kseq->close_stream()  

Qué ganancia en tiempo de procesamiento de archivos FASTQ se obtiene? Una prueba realizada con el módulo Benchmark , con diez repeticiones y un archivo .fastq.gz con 250K secuencias sugiere que kseq::klib es el doble de rápido:

            s/iter  perlio   kseq
perlio    1.32      --     -50%
kseq    0.660  100%     --

Hasta el próximo año, un saludo,
Bruno

25 de noviembre de 2014

Una buena gráfica científica

Hola,
hoy quisiera compartir una imagen que demuestra, a pesar de toda la literatura al respecto, que no siempre es tan difícil hacer una buena gráfica con los datos de un experimento. En esta ocasión bastó con juntar todos los tomates cherry cosechados junto a la planta de la que proceden, y por supuesto una gráfica debajo para mostrar la varianza natural de estas plantas:

Fuente: http://www.nature.com/ng/journal/v46/n12/fig_tab/ng.3131_F5.html.

El artículo completo está en http://www.ncbi.nlm.nih.gov/pubmed/25362485 . Por cierto, tendrán algo de sabor esos tomates?
Hasta luego,
Bruno

12 de noviembre de 2014

Ofertas de trabajo en bioinformática

Actualización: a partir del 2 de Diciembre de 2014 las ofertas de trabajo que nos lleguen las pondremos en una página propia [http://bioinfoperl.blogspot.com.es/p/ofertas-de-trabajo.html]
separada del resto de entradas del blog.
 


1.  para desarrolladores en PerkinElmer (Granada, España)

"We have two open positions in Spain requiring bioinformatics domain expertise.

Please share the information or submit your CV at:



Thanks!"

2. staff bioinformatician  at Institute of Molecular Biology (Mainz, Alemania)

 http://www.verwaltung.personal.uni-mainz.de/Dateien/Bioinformatiker_CFBI08_docx-zi.pdf






26 de octubre de 2014

Cómo recuperar datos de un disco dañado

Primero aclarar que esta entrada será únicamente útil a los administradores de ordenadores, bioinformáticos o no, que hayan estado haciendo cambios en la distribución de su disco duro (tabla de particiones) y por algún error humano o de software hayan perdido los datos de su ordenador. Si nunca has tocado la tabla de particiones de tus discos, mejor no la toques, aunque puedes seguir leyendo...

Además el tema está de moda, porque muchos políticos y empresarios corruptos borran sus ordenadores antes de que llegue la policía... pero veremos cómo existen muchas herramientas para recuperar esos datos y meterlos en la cárcel ;)

El caso es que cuando instalamos Linux/Windows, o lo desinstalamos, o no nos arranca, o queremos crear una nueva unidad de disco dentro de nuestro propio disco, o queremos modificar las ya existentes... tenemos que modificar la tabla de particiones del disco. No explicaré lo que es la tabla de particiones, la Wikipedia lo hace mejor que yo, pero intentaré contar mi mala experiencia dar unos consejos muy útiles en caso de catástrofe.

Mi historia comienza el jueves pasado cuando me dio por ampliarme la partición de sistema (/) de mi Kubuntu, la creé de 20GB (era pequeña porque mi disco SSD es de 256GB y me gustan ligeras para poder hacer backups rápidamente), y la quería ampliar a 40GB quitando un poco de espacio a mi partición de (/home). Tenía en 10 minutos que asistir a un seminario, así que como puede tardar horas la redistribución era el momento perfecto. Y como el servidor con el que trabajo tarda mucho en arrancar, decidí hacerlo con mi portátil. Arranqué el portátil con un LiveUSB de Kubuntu 14, instalé y ejecuté GParted (ver nota 1), una aplicación que me gusta particularmente para modificar los discos con Linux y sistemas de archivos ext4 (Kubuntu también posee su propia herramienta de administración de discos). Hice los cambios de tamaño de particiones de disco que quería y pulsé la opción de 'Aplicar'. Hasta aquí todo normal, Gparted comenzó a mover datos en una partición para dejar espacio y poder amplicar la otra. Pero me di cuenta que no había conectado mi disco SSD al portátil y que estaba redimensionando mi disco interno NTFS de Windows (que también es de 256GB)... por las prisas decidí pararlo y dejarlo para después.
ERROR Nº 1: nunca detener una herramienta de administración de discos a mitad de un cambio, aunque sólo lleve 1 minuto.

Pensé que con la herramienta fdisk de Linux podía volver a asignar el tamaño original a la partición y el tipo NTFS.
ERROR Nº 2: Si hemos dañado la tabla de particiones, no hacer más cambios en ella, ni intentar formatear, si formateamos no garantizo que las herramientas que explico a continuación nos salven.

¿Qué deberíamos hacer si hemos llegado a este punto en que no podemos leer nuestro disco? Mi consejo es ir a la tienda más cercana, comprar un disco externo y hacer una copia exacta de nuestro disco 'estropeado' con un live CD de Clonezilla por ejemplo (ver nota 2). Así podemos intentar recuperar datos y estar seguros de que no puede ir la cosa a peor.

Leyendo por internet, descubrí una aplicación maravillosa y gratuita llamada TestDisk que analiza nuestro disco descubre particiones modificadas o borradas, lista los archivos que contenían y permite intentar restaurarlas. En este tutorial se describe cómo usar el programa y otras alternativas para recuperar datos. Recomiendo iniciar el ordenador con un LiveCD con TestDisk, ejecutarlo, buscar las particiones eliminadas con las opciones 'QuickSearch' y 'Advanced Search' (si la primera falla) y copiar todo a un disco externo. Posteriormente restaurar la partición con la opción 'Write'.




En mi caso encontré la partición borrada, pude copiar la mayoría de archivos del disco (algunos recientes no) y la opción de 'Write' para restaurar la partición no funcionó... El pánico había pasado, ha pero todavía no había recuperado todos mis datos. Entonces decidí probar el tan odiado chkdsk de Windows XP, aquí se explican todas sus opciones (recomiendo 'chkdsk /r').
ERROR Nº 3:  Si detenemos chkdsk a mitad de chequeo, no se arreglará el disco y al volverlo a ejecutar volverá a empezar desde el principio.

Tras 24 horas ejecutándose chkdsk y corrigiendo archivos, mi ordenador ha resucitado y parece que he recuperado casi todo, pero no todo, estoy tan feliz que he decidido escribir esta entrada :)

MORALEJA: Más vale perder unas horas haciendo copias de seguridad todos los meses, semanas o días, que tener que rezar al cielo para recuperar nuestros datos.

Tras 24 horas ejecutándose chkdsk y corrigiendo archivos, mi ordenador ha resucitado y parece que he recuperado casi todo, estoy tan feliz que he decidido escribir esta entrada :)
MORALEJA: Más vale perder unas horas haciendo copias de seguridad todos los meses, semanas o días, que tener que rezar al cielo para recuperar nuestros datos.

Otro buen consejo es usar almacenamiento redundante en la nube para nuestros datos más valiosos con servicios como Dropbox, aunque sabemos que nos los pueden espiar en cualquier momento.
 
NOTA 1: para modificar la tadesde Windows recomiendo MiniTool Partition Wizard.
 
NOTA 2: mi herramienta favorita de clonado y backup de discos es FSArchiver, pero Clonezilla es más fácil de usar con su interfaz gráfica.

10 de octubre de 2014

Apuntes de genómica microbiana

Hola,
esta semana hemos participado en un taller de 6 días organizado por Mirko Rossi (Universidad de Helsinki, Finlandia) donde hemos repasado los principales aspectos de la genómica comparativa de bacterias. Todo esto desde un punto de vista muy aplicado, dado que la mayor parte de los alumnos eran investigadores de la esfera veterinaria. Nuestra aportación fue una sesión de tres horas y media dedicada a la determinación del pangenoma de un grupo de bacterias de interés, con la ayuda de nuestro software GET_HOMOLOGUES.

Estimación de las dimensiones del core-genoma (izq) y pan-genoma (der)
de una colección de 12 plásmidos plncA/C, genomas de ejemplo en el capítulo
"Robust identification of orthologues and paralogues for microbial pan-genomics
using GET_HOMOLOGUES: a case study of pIncA/C plasmids
", parte del libro

http://www.springer.com/biomed/medical+microbiology/book/978-1-4939-1719-8 .





A parte de esto, en esta entrada quería sobre todo contar algunas de las cosas que otros profesores a los que pude escuchar contaron, por si os pueden ayudar en vuestros proyectos:
  • Con Andrey Prjibelski, del Algorithmic Biology Lab de San Petersburgo, aprendimos a ensamblar genomas bacterianos con el software SPAdes, y luego a comparar y a evaluar distintos ensamblajes con ayuda de QUAST. Nos recomendó http://nucleotid.es para comparar de una manera objetiva las virtudes y defectos de distintos ensambladores disponibles ahora mismo, aunque comentó que dada la variedad de escenarios de los usuarios y de los tipos de lecturas/reads existentes no hay ahora mismo ninguno claramente superior a los demás. Sí remarcó que algunos están mal documentados y son por tanto más difíciles de utilizar. Me quedé un poco con la idea de que Velvet y SPAdes son los mejores para genomas bacterianos. Del primero menciona que es muy estable, de calidad moderada, pero muy limitado con lecturas del tipo mate pair. El segundo es el que desarrollan ellos y fue el que usamos en la sesión. SPAdes trabaja siempre sobre una base de lecturas Illumina/IonTorrent, que por defecto se corrigen antes de ser utilizadas, pero puede hacer ensamblajes híbridos con secuencias de otras plataformas, incluso Sanger, útiles para resolver secuencias repetidas, como mate pairs convencionales o Nextera (hqmp, de alta calidad). El programa tiene además un módulo (--careful) para corregir por mapeo errores (indels,mismatches) en los contigs generados al ensamblar. Su mayor ventaja respecto a Velvet es probablemente que ensambla iterativamente con K-meros diferentes para superar las limitaciones de K pequeños (ciclos) con los grandes y viceversa (falta de solapamientos cortos, ver este blog y este otro para una comparación más amplia).  
  • Bastien Chevreux, de DSM Nutritional Products AG, filosofó acerca de distintos problemas y estrategias para secuenciar y ensamblar genomas bacterianos con su software MIRA. La diferencia fundamental de este ensamblador respecto a los anteriores es que no se basa en grafos de De Bruijn, como Velvet o SPAdes, si no en la acumulación y alineamiento de lecturas solapantes, razón por la que es menos escalable y por tanto más lento que ellos. Este software a mi me parece sin duda más complejo de usar que SPAdes, pero tiene a su favor una lista de correo muy activa y documentación extensa. MIRA se ejecuta simplemente sobre un fichero manifiesto, editado por el usuario, que puede tener una sintaxis bastante compleja, pero que para un mapeo es algo sencillo, como por ejemplo:
    project= nombre_de_proyecto
    job= mapping,genome,accurate
    
    #input data comes next
    readgroup
    is_reference
    data= /path/to/file.gbk
    strain= Ecoli_strainA
    
    readgroup
    technology= solexa
    autopairing # busca PEs por ti
    data= /path/to/reads?.fastq
    strain= Ecoli_strainK12
     
  • Rauni Kivistö, de la Universidad de Helsinki, nosexplicó el uso de los programas ACT y BRIG para visualizar datos de comparación de genomas basados en BLAST.
  •  Veronika Vonstein y Ross  Overbeek, de la Fellowship for the Integration of Genomes, presentaron su plataforma para la anotación automática de genomas RAST que se construye sobre SEED, una colección de componentes, algo parecido a operones o trozos de rutas metabólicas, que llevan curando a mano desde hace dos décadas y que les permiten proyectar en tiempo real, según se van secuenciando nuevos genomas, anotaciones de alta calidad, que tienen en cuenta el contexto genómico y no se basan en BLAST, sino en eficientes búsquedas de K-meros específicos de familias de proteínas prealineadas que llaman FIGFams. Me sorprendió que un trabajo de esta envergadura no tuviera más repercusión, de hecho yo no lo conocía, pero se explica porque durante mucho tiempo trabajaron en el sector privado. Ahora mismo tienen financiación pública y se apoyan en hardware del Argonne National Laboratory.
Creo que esto es todo, un saludo y hasta la próxima,
Bruno