14 de septiembre de 2015

Secuenciación de amplicones y genotipado de alto rendimiento

Secuenciación de amplicones (SA)  es una traducción aproximada al español de la técnica de "Amplicon sequencing" que junto con las tecnologías de secuenciación masiva (del inglés new generation sequencing, NGS) permite genotipar cientos/miles de individuos en un único experimento.

La secuenciación de amplicones (SA) consiste en secuenciar los productos de múltiples PCRs. Un amplicón se define como el conjunto de secuencias obtenidas de cada PCR individual.

Antiguamente se realizaban PCRs individuales y se secuenciaban uno a uno los productos. Con las nuevas técnicas de NGS, podemos incluir etiquetas de DNA (por ej. una secuencia única de 6 nucleótidos) diferentes para cientos de muestras o individuos y clasificar más tarde las secuencias o reads resultantes de una única secuenciación (Binladen et al. 2007; Meyer et al. 2007).
Esquema de etiquetado y amplificación para la secuenciación de amplicones.

Mediante esta técnica podremos genotipar individuos y distinguir los diferentes alelos (con la secuenciación tradicional a veces es complicado separar alelos de un mismo gen). El principal problema de las técnicas de NGS es su alta tasa de error, que a su vez puede ser compensada incrementando la profundidad de secuenciación (el número de reads). Otros problemas pueden ser los errores de la polimerasa o la generación de quimeras (una secuencia mezcla de otras).

En el siguiente enlace podemos ver un vídeo explicativo del proceso de secuenciación de amplicones:
http://www.jove.com/video/51709/la-secuenciacin-de-prxima-generacin-de-16s-arn-ribosomal-genes?language=Spanish

Básicamente existen 4 etapas en el análisis por AS con NGS:
  1. Diseño experimental de los primers usados para amplificar los genes de interés (marcadores) y las etiquetas a usar para distinguir los diferentes individuos o muestras.
  2. Amplificación por PCR de los marcadores en el laboratorio, generalmente se realiza una PCR por cada muestra.
  3. Secuenciación de los productos de amplificación. Las tecnologías de NGS más usadas para SA son: Illumina, 454 e Ion Torrent.
  4. Análisis bioinformático de los datos de secuenciación. El análisis incluye separación de las reads en amplicones, corrección de errores de secuenciación, filtrado de reads minoritarias/contaminantes y generación de genotipados.
Etapas de la técnica de secuenciación de amplicones mediante NGS.

Aplicaciones 


SA es utilizado para realizar clasificaciones taxonómicas usando genes como: cytochrome c oxidase subunit 1 (CO1), genes rRNA (16S/18S/28S), genes específicos de plantas (rbcL, matK, and trnH-psbA) y espaciadores internos nucleares (ITSs) (Kress et al. 2014; Joly et al. 2014). Los genes anteriores se distinguen por una tasa de mutación suficientemente rápida como para distinguir especies cercanas y a la vez suficientemente estables como para distinguir congéneres.

Lista de genes habitualmente usados como marcadores taxonómicos (fuente: Kress et al. 2014)

Un experimento pionero de SA fue la determinación de la diversidad microbiana en aguas marinas profundas (Sogin et al. 2006), usando primers flanquenado la región V6 hipervariable de la subunidad 16S rRNA bacteriana. Dicho estudio descubrió miles de poblaciones minoritarias de organismos no conocidos con anterioridad.

Otro gran campo de aplicación es el genotipado de familias de genes de alta complejidad, como el complejo mayor de histocompatibilidad, que poseen múltiples loci y diferente número de copias entre individuos, incluso de la misma especie (Babik et al. 2010; Lighten et al. 2014). El complejo mayor de histocompatibilidad (MHC) de clase I y II codifica receptores celulares que presentan antígenos a las células del sistema inmune y son los genes más polimórficos conocidos en vertebrados . El MHC humano también se conoce como HLA (Human Leukocyte Antigen) y juega un papel clave en la compatibilidad en el transplante de órganos. Los loci del MHC son tan polimórficos que no hay dos individuos en una población no endogámica que posean el mismo conjunto de alelos (excepto gemelos).

Estadísticas del número de alelos conocidos para la familia de genes del HLA (fuente: base de datos IMGT-HLA)
Hasta hace poco era necesario clonar y secuenciar uno por uno los diferentes alelos de este tipo de genes para conseguir una secuencia fiable. Actualmente tan tediosa tarea puede ser simplificada mediante un único experimento de NGS que incluya múltiples individuos y múliples genes. El secuenciador de nueva generación (ej.: Illumina, 454 o Ion Torrent) leerá las sequencias individuales de cada uno de los alelos. Actualmente existen incluso kits comerciales para simplificar el proceso: Illumina TruSeq Custom Amplicon, Roche 454 Fluidigm Access Array or Life Technologies Ion Torrent Ion AmpliSeq.

13 de agosto de 2015

rperl: de perl a c++

Hola,
el proyecto RPerl acaba de liberar la primera versión en CPAN tras más de dos años de desarrollo en https://github.com/wbraswell/rperl . Su mascota es un correcaminos y a su autor principal (Will Braswell), a tenor de lo que escribe en la página del proyecto, parece que le gusta la literatura fantástica o las películas de semana santa.
 
Volviendo a lo importante, la filosofía del proyecto es hacer un compilador que permita convertir código Perl, siguiendo una versión limitado de su sintaxis, en código C++ que se compila y enlaza con Inline::CPP, del que ya hablamos en otra entrada.

Apenas he hecho algunas pruebas, os dejo mis notas:
  1.  Para instalar RPerl hay instrucciones detalladas en: https://github.com/wbraswell/rperl/blob/master/INSTALL. En mi caso no funcionaron a la primera, pero tras actualizar g++ a la versión 4.7 Io logré con:

    $ cpan -i  Inline::C
    $ cpan -if Inline::CPP
    $ cpan -i RPerl 
    

  2. Los ejemplos más sencillos de uso los encontré en: https://github.com/wbraswell/rperl/tree/master/lib/RPerl/Learning
  3. Para encontrar otros ejemplos más completos tuve que rebuscar en: https://github.com/wbraswell/rperl/tree/master/lib/RPerl/Test. Por ejemplo, para ver la sintaxis RPerl para escribir en un archivo encontré esto, o esto otro para expresiones regulares.
Como ejemplo de la ganancia en velocidad por usar tipos de datos estáticos y algoritmos compilados, los autores muestran un one-liner que ordena 5000 enteros:

$ perl -e 'use RPerl::Algorithm::Sort::Bubble; my $a = [reverse 0 .. 
5000]; use Time::HiRes qw(time); my $start = time; my $s = 
integer_bubblesort($a); my $elapsed = time - $start; print Dumper($s); 
print "elapsed: " . $elapsed . "\n";'

Este experimento, en sus manos, tarda 15s con Perl interpretado y 0.045s con RPerl precompilado. Por tanto parece que para algunas tareas numéricas vale pena complicar un poco el código Perl para obtener estas ganancias, no?

Me queda por ver si también vale la pena en otras tareas habituales en nuestro campo como leer y procesar archivos de gran tamaño y consultar luego datos extraído por medio de hashes, pero eso queda para otro día,
hasta luego,
Bruno



6 de julio de 2015

Alineamiento de secuencias de proteína y filogenias

Hola,
como anunciábamos hace unas semanas, esta semana participamos en un curso de verano de la Universidad de Zaragoza que empieza hoy en la ciudad de Jaca, al pie mismo del Pirineo. Por esta razón hemos preparado un material sobre Alineamiento de secuencias de proteína y filogenias que hoy colgamos en la Red para que podáis consultarlo si a alguien le interesa:

http://eead.csic.es/compbio/material/alineafilog

y que también podés descargar en formato PDF en:

http://digital.csic.es/handle/10261/117608


El índice del curso es el siguiente:
  •  Análisis jerárquico de la estructura de proteínas
    • Estructura primaria
    • Estructura secundaria
    • Estructura terciaria y cuaternaria
      • Demarcación de dominios en proteínas

Un saludo,
hasta pronto,
Bruno

13 de mayo de 2015

Curso de Python para biólogos - Lección 7. Lectura y escritura de archivos

Con Python podemos leer, crear y modificar archivos de texto. Por ejemplo podemos leer un fichero con miles/millones de secuencias de DNA y extraer información del mismo, lo cual sería muy complicado de forma manual. Se verá un ejemplo al final de la lección.

Trabajando con directorios

Antes de empezar a crear y leer archivos, vamos a consultar el directorio de trabajo por defecto de Python con el comando 'os.getcwd', crear un nuevo directorio para trabajar en esta lección con 'os.makedirs' y cambiar el directorio de trabajo por este nuevo directorio ('os.chdir'). Para realizar todo ello primero tenemos que importar el módulo 'import os' (Operating System) que nos proporcionará los métodos mencionados. Un módulo es una extensión de Python y se debe importar para poder trabajar con sus herramientas.

Creación de archivos

Una vez que estamos en el directorio de trabajo deseado, vamos a crear un archivo llamado 'example.txt', para ello usaremos la función 'open' con la opción 'w' que indica escritura (write). El nuevo archivo será un objeto guardado en la variable 'f' y con el método 'write' podremos insertar un texto en el mismo. No debemos olvidar cerrar siempre el archivo después de leer o modificar sus contenidos con el método 'close'. Si abrimos el archivo con nuestro explorador de archivos, veremos el texto que contiene.

Usando un bucle 'for' podemos insertar automáticamente múltiples líneas de texto:

Lectura de archivos

Para leer un archivo, primero debemos abrirlo con la función 'open' y la opción 'r' que indica lectura (read). El método 'read' leerá todo el archivo de una vez si no se especifica ningún argumento. Importante, después de leerlo debemos cerrarlo con la función close.

Una  forma más adecuada de leer un fichero puede ser línea a línea con un bucle 'for', cada línea será almacenada en la variable 'line' en cada iteración.

Existen varias formas alternativas de leer los ficheros, entre ellas los métodos 'read' y 'readline', ambos aceptan especificar el número de caracteres que serán leídos. En próximas lecturas, Python continuará en la posición que terminó la anterior.

Ejercicio. Contar el número de genes codificantes que tiene el genoma de Escherichia coli

Para ello, primero descargaremos el fichero del proteoma de E. coli del siguiente enlace. Después, copiaremos el fichero descargado a nuestro directorio de trabajo. Y por último escribiremos un código en Python que cuente el número de veces que aparece el símbolo '>' al comienzo de una línea, dicho símbolo indica el comienzo de una proteína.

Si hemos hecho todo bien, el número de genes debería ser '4140', o similar (las nuevas versiones del genoma pueden variar ligeramente dicho número). Podemos confirmarlo en la web de KEGG.

Próxima lección

 En la próxima lección se hará una introducción a las expresiones regulares.

Curso de Python para biólogos - Lección 6. Bucles 'for'

En la lección de hoy presentaremos los bucles 'for', muy similares a los 'while' explicados en la lección 4, pero con un código más sencillo.

Bucles 'for':

Un bucle 'for', al igual que 'while', repite la ejecución de un bloque de código un número determinado de veces. Si invocamos el bucle 'for' con un nombre de variable más 'in' y una lista, el número de repeticiones vendrá determinado por el número de elementos de la lista, que serán pasados de uno en uno a la variable durante cada iteración. Veamos algunos ejemplos:

Con la función 'range' podemos especificar un listado de números que serán pasados a la variable especificada en el bucle. El primer parámetro de la función será el número inicial en el bucle, el segundo parámetro indicará el último número y el tercer parámetro proporcina el incremento a aplicar en cada iteración, por defecto el incremento es 1.

Como ya se ha comentado 'for' es una simplificación de 'while' cuando se trabaja con listas o números. El mismo código con 'while' es posible, pero será más largo y complejo.

Veamos como podemos usar 2 bucles 'for' anidados para recorrer los elementos de una matriz:

Sentencias de control de bucles: 'break', 'continue' y 'pass'

A veces nos interesará salir de un bucle (ya sea 'while' o 'for') antes de terminar todas las iteraciones, la forma de conseguirlo es mediante las sentencias de control 'break' y 'continue'. 'Break' terminará totalmente el bucle y continuará la ejecución del código del resto de programa. 'Continue' terminará la ejecución de una iteración y pasará directamente a la siguiente iteración del bucle, sin salir del bucle. 'Pass' no hace nada, es simplemente una sentencia que puede ser usada cuando no se requiere ejecutar ninguna acción pero es requerido escribir algo.

Bucles 'for' y diccionarios:

Los bucles 'for' también pueden ser útiles para procesar una a una las claves de un diccionario, sus valores o ambas cosas a la vez.


Ejercicios: 

Volvamos a los ejercicios propuestos en la lección anterior y resueltos con bucles 'while', veamos cómo pueden resolverse de una forma más sencilla mediante bucles 'for'.



Próxima lección

En la próxima lección se explicará como leer y escribir archivos con Python.