This lesson has passed peer-review! See the publication in JOSE.

Data Processing and Visualization for Metagenomics: Binning, Refinamiento y Desreplicación

Mapeo

En los días anteriores aprendieron a evaluar la calidad de las lecturas, filtrarlas y ensamblarlas, por lo que este apartado comenzará con un ensamble ya generado.

De acuerdo con el flujo de análisis (Figura 1), debemos partir de un ensamble, mapear las lecturas y obtener un archivo de profundidad de cada contig en el ensamble.

Archivos necesarios para hacer binning

El proceso de ensamble y mapeo son demandantes en tiempo de ejecución y recursos. Así que nos dimos a la tarea de generar el ensamble y el archivo de profundidad para comenzar directamente con el binning. El ensamble lo corrimos con Megahit, te dejamos la línea que usamos:

# Megahit
megahit -1 data/full/48hrs_sm_R1.fastq -2 data/full/48hrs_sm_R2.fastq --min-contig-len 500 -t 40 --presets meta-sensitive --out-prefix 48hrs -o results/02.assembliesfull/megahit/48hrs
# Con Metaspades podría ser asi:
spades.py --meta  -1 data/48hrs_sm_R1_5M.fastq -2 data/48hrs_sm_R2_5M.fastq -o results/02.assemblies/metaspades/48hrs 

El mapeo lo corrimos con bowtie2 que es una herramienta confiable y muy utilizada para alinear lecturas cortas a una referencia, en nuestro caso, la referencia es el ensamble metagenómico de la muestra de 48hrs. Bowtie2 genera un archivo de mapeo (SAM) que debe convertirse a un formato binario (BAM), para esta conversión usamos samtools que contiene multiples subherramientas para trabajar con archivos de mapeos. Para generar este archivo se utilizaron las siguientes lineas de código:

# Formatear el ensamble
bowtie2-build results/02.ensambles/megahit/48hrs/48hrs.fasta results/03.profundidad/48hrs --threads 40
# Mapear las lecturas contra el ensamble
bowtie2 -x results/03.profundidad/48hrs -1 data/48hrs_sm_R1.fastq -2 data/48hrs_sm_R2.fastq -p 40 -S results/03.profundidad/48hrs.sam
# Convertir de SAM a BAM y ordenar
samtools view -Sb -O BAM -@ 40 results/03.profundidad/48hrs.sam | samtools sort -@ 40  -o results/03.profundidad/48hrs_sorted.bam
# Obtener el índice
samtools index results/03.profundidad/48hrs_sorted.bam

Ya que generamos el archivo bam ordenado y el índice, obtuvimos un archivo con la información de cobertura de cada contig dentro del ensamble, este archivo de profundidad se generó con jgi_summarize_bam_contig_depths que es una herramienta desarrollada por el JGI.

# Obtener el archivo de profundidad de cada contig
jgi_summarize_bam_contig_depths  --outputDepth results/03.profundidad/48hrs.mgh_depth.txt results/03.profundidad/48hrs_sorted.bam

🔊 🔊 No las ejecutes, sólo son un ejemplo para que las puedas usar con tus propios datos en el futuro.


Ejercicio 1. ¿Qué información requieren los programas de binning?

Antes de comenzar, reúnete con tu equipo y juntos:

  • Revisen nuevamente el contenido de los directorios 02.ensambles y 03.profundidad.txt
  • En una diapositiva expliquen el flujo teórico que se siguió para obtener los archivos que están en esos directorios.

Usa esta liga de drive para ir trabajando durante el taller.

Sólo un miembro de cada equipo escriba en la presentación


Binning

🧬 Ahora si, vamos a agrupar los contigs del metaensamble en bins

Metabat2

Metabat2 es una herramienta que agrupa los contigs tomando la cobertura de cada contig y calcula su composición nucleotídica.

Metabat2. Kang et al., 2015. DOI:10.7717/peerj.1165
Metabat2. Kang et al., 2015. DOI:10.7717/peerj.1165


Para correr metabat necesitamos activar el ambiente conda donde se aloja.

conda activate binning


Ahora que ya tenemos el ambiente activado ejecutemos metabat:

metabat2 -i results/02.ensambles/48hrs.fasta -a results/03.profundidad/48hrs.mgh_depth.txt -o results/04.metabat/metabat -t 4 -m 1500


Se sabe que el valor mínimo de contig para reducir errores es 2000, lo puedes ver en la figura 6 de este artículo.

Responde

¿Cuántos bins se formaron? ¿Qué parámetros cambiarías o agregarías?

Solución

ls results/04.metabat/

metabat2 –-help

Ya que corrimos Metabat2 vamos a ejecutar MaxBin2, pero primero necesitamos desactivar el ambiente:

conda deactivate

MaxBin2

MaxBin2 agrupa los contigs de acuerdo a la información de cobertura, composición nucleotídica y marcadores de copia única.

MaxBin2. Wu et al., 2014. https://doi.org/10.1186/2049-2618-2-26
MaxBin2. Wu et al., 2014. https://doi.org/10.1186/2049-2618-2-26


Vamos a ejecutarlo, activemos el ambiente.

conda activate metagenomics

Crea el directorio para los resultados de MaxBin2

mkdir -p results/05.maxbin

Ahora si, vamos a ejecutarlo.

run_MaxBin.pl -thread 4 -min_contig_length 1500 -contig results/02.ensambles/48hrs.fasta -out results/05.maxbin/48hrs_maxbin -abund results/03.profundidad/48hrs.mgh_depth.txt

Responde

¿Cuántos bins se formaron? ¿Qué porcentaje de completitud tienen?

Solución

ls results/05.maxbin/*.fasta | wc -l

cat results/05.maxbin/48hrs_maxbin.summary | column -t


Desactiva el ambiente

conda deactivate


Vamb

VAMB utiliza una combinación de enfoques de aprendizaje profundo y técnicas de agrupamiento basándose en sus patrones de composición de nucleótidos y en la co-ocurrencia de sus frecuencias de cobertura.


Activa el ambiente binning

conda activate binning

Vamos a correr vamb, pero primero crea el directorio de resultados

mkdir -p results/06.vamb

Ejecutemos vamb:

nohup vamb --fasta results/02.ensambles/48hrs.fasta --jgi results/03.profundidad/48hrs.mgh_depth.txt --minfasta 500000 --outdir results/06.vamb/48hrs > outs/06.vamb.nohup &

Responde

Si quisieras recuperar los genomas de virus ¿Qué parámetro cambiarías?

Otros programas para binning

Recientemente se publicó COMEBin, que utiliza un enfoque distinto a lo que hemos usado en este tutorial. En el siguiente link encontrarás el manual y una explicación general sobre su funcionamiento.

Refinamiento

Ya corrimos tres programas de binning, pero, recordemos que los agrupamientos pueden tener errores:


Refinamiento


Para disminuir la contaminación e incrementar la completitud hay algunos programas que pueden ayudarnos. Entre ellos están Binning_refiner y DASTool.

CheckM

Antes de proceder al refinamiento es necesario tener claro cómo se evalúa la completitud y contaminación de los bins. Para esta evaluación se usa CheckM que se ha convertido en una herramienta estándar para la evaluación de la calidad de genomas y MAGs, y es usada por la mayoría de programas de refinamiento.
Para hacer esta evaluación, CheckM utiliza una serie de herramientas: tree organiza los genomas en un árbol de referencia. tree_qa evalúa la cantidad de genes marcadores filogenéticos y su ubicación en el árbol. El comando lineage_set crea un archivo de marcadores específicos de linaje, que se usa en el comando analyze para evaluar la integridad y contaminación de los genomas. Finalmente, el comando qa genera tablas que resumen la calidad de los genomas.


CheckM. Parks et al., 2015. https://genome.cshlp.org/content/25/7/1043.full
CheckM. Parks et al., 2015. https://genome.cshlp.org/content/25/7/1043.full


En este taller no vamos a correr CheckM porque los programas de refinamiento que usaremos ya lo corren de forma interna, sin embargo, es útil correrlo para tener una idea clara sobre la calidad de los bins que obtengamos.

Te dejamos la siguiente línea para que la uses en tus proyectos.

#ejemplo de como correrlo con los bins de vamb
#se debe activar el ambiente metagenomics
#checkm lineage_wf results/06.vamb/48hrs/bins results/checkm/ -x fna -t 4  -f results/checkm/checkm_vamb_bins.txt

Y una captura de ejemplo de como se ve la salida de CheckM:


CheckM ejemplo


Y ahora si, a refinar los bins … 🥳

Binning_refiner

Binning_refiner se enfoca en refinar y fusionar los bins para mejorar la integridad y reducir la contaminación. Identifica bins que pueden representar el mismo genoma y los fusiona. Después elimina posibles contaminaciones, durante el proceso, Binning_refiner evalúa la calidad de los bins.


Binning_refiner. Wei-Zhi & Torsten, 2017.
Binning_refiner. Wei-Zhi & Torsten, 2017. https://doi.org/10.1093/bioinformatics/btx086


Necesitamos crear el directorio de resultados para binning_refiner y un directorio con los bins generados por cada programa

mkdir -p results/07.binning_refiner/48hrsbins/{metabat,maxbin,vamb}


Ahora vamos a crear ligas simbólicas de los bins generados por cada herramienta.

#metabat
cd results/07.binning_refiner/48hrsbins/metabat/

ln -s ../../../04.metabat/*.fa .

#maxbin
cd ../maxbin/
ln -s ../../../05.maxbin/*.fasta .

# vamb
cd ../vamb/
ln -s ../../../06.vamb/48hrs/bins/*.fna .


#regresar
cd ../../


Ahora si, corramos Binning_refiner

Binning_refiner -i 48hrsbins/ -p 48hrs


Y regresemos a nuestro directorio principal

cd && cd taller_metagenomica_pozol/


Exploremos los resultados!

cat results/07.binning_refiner/48hrs_Binning_refiner_outputs/48hrs_sources_and_length.txt
Refined_bin     Size(Kbp)       Source
48hrs_1 1535.49 48hrs_maxbin.004.fasta,metabat.5.fa,676.fna
48hrs_2 1506.01 48hrs_maxbin.002.fasta,metabat.3.fa,6952.fna
48hrs_3 1319.12 48hrs_maxbin.008.fasta,metabat.2.fa,28067.fna
48hrs_4 1263.79 48hrs_maxbin.005.fasta,metabat.9.fa,3736.fna
48hrs_5 1185.25 48hrs_maxbin.001.fasta,metabat.11.fa,15732.fna
48hrs_6 1052.67 48hrs_maxbin.003.fasta,metabat.4.fa,15732.fna
48hrs_7 557.49  48hrs_maxbin.006.fasta,metabat.1.fa,28990.fna


Responde

¿Cuántos bins analizó Binning_refiner y cuántos quedaron después del refinamiento? ¿Hubo separación de algunos bins para formar otros?

Sankey plot

Puedes generar tu propio sankey plot para visualizar los resultados de Binning_refiner. Te dejamos el código por si te es útil.

código

# Cargar las librerias
library(dplyr)
library(networkD3)

# revisa tu ubicación
getwd()

# OJO
setwd("/home/ELALUMNOQUEERES/taller_metagenomica_pozol")

# Cargar los datos
sankey_data <- read.csv("results/07.binning_refiner/48hrs_Binning_refiner_outputs/48hrs_sankey.csv")

# Crear una lista de nodos únicos
nodes <- data.frame(name = unique(c(sankey_data$C1, sankey_data$C2)))

# Crear el dataframe de enlaces
links <- sankey_data %>%
  mutate(source = match(C1, nodes$name) - 1,
         target = match(C2, nodes$name) - 1,
         value = Length_Kbp) %>%
  select(source, target, value)

# Crear el gráfico Sankey
sankey_plot <- sankeyNetwork(Links = links, Nodes = nodes,
                             Source = "source", Target = "target",
                             Value = "value", NodeID = "name",
                             fontSize = 12, nodeWidth = 30)

# Mostrar el gráfico
sankey_plot
# Guardar
library(htmlwidgets)
saveWidget(sankey_plot, file = "48hrs_sankey_plot.html")

Binning Refiner output



DASTool

DASTool es una herramienta utilizada para mejorar la calidad de los bins. Evalúa la integridad, combina los resultados de diferentes bineadores y por consenso selecciona los mejores bins de cada herramienta. Una vez que DASTool ha seleccionado los mejores bins, realiza un proceso de refinamiento para optimizar los resultados.


DASTool. Sieber et al., 2018.
DASTool. Sieber et al., 2018. https://doi.org/10.1038/s41564-018-0171-1.


Vamos a correr DASTool …
Primero crea el directorio para los resultados

mkdir -p results/08.dastool

DASTool necesita como entrada un archivo tabular con información de los resultados de cada programa de binning.

Fasta_to_Contig2Bin.sh -i results/04.metabat/ -e fa > results/08.dastool/48hrs_metabat.dastool.tsv

Fasta_to_Contig2Bin.sh -i results/05.maxbin/ -e fasta > results/08.dastool/48hrs_maxbin.dastool.tsv

Fasta_to_Contig2Bin.sh -i results/06.vamb/48hrs/bins/ -e fna > results/08.dastool/48hrs_vamb.dastool.tsv

Ya que tenemos los archivos tsv podemos empezar con el refinamiento!! 🥳

DAS_Tool -i results/08.dastool/48hrs_metabat.dastool.tsv,results/08.dastool/48hrs_maxbin.dastool.tsv,results/08.dastool/48hrs_vamb.dastool.tsv -l metabat,maxbin,vamb -c results/02.ensambles/48hrs.fasta -o results/08.dastool/48hrs -t 4 --write_bins


Responde

¿Cuántos bins quedaron después del refinamiento con DASTool? ¿Más o menos que con Binning_refiner? ¿Qué calidad tienen?

Desreplicación

dRep

La desreplicación es el proceso de identificar conjuntos de genomas que son “iguales” en una lista de genomas y eliminar todos los genomas excepto el “mejor” de cada conjunto redundante. dRep es una herramienta útil para esto. Utiliza distancias Mash y ANIm para discriminar entre MAGs iguales.


DASTool. Olm et al., 2017.
DASTool. Olm et al., 2017. https://academic.oup.com/ismej/article/11/12/2864/7537826.


Ya que tenemos los resultados de los dos refinadores ejecutaremos dRep para desreplicar y seleccionar el mejor representante de cada bin.


Primero vamos a crear el directorio de resultados para dRep.

mkdir -p results/09.drep/bins

Y entraremos al directorio bins dentro del directorio de resultados para colocar los bins que queremos comparar. En este caso los generados por ambos refinadores (pero podrían ser los bins refinados de cada punto de muestreo).

cd results/09.drep/bins/

Con las siguientes lineas podemos copiar los bins en este directorio:
Primero los de DASTool

for i in $(ls ../../08.dastool/48hrs_DASTool_bins/*.fa); do
    name=$(basename $i .fa); cp $i $name".fasta"
done


Y ahora los de Binning_refiner

cp ../../07.binning_refiner/48hrs_Binning_refiner_outputs/48hrs_refined_bins/*.fasta .


Ya que los copiamos, regresemos al directorio principal.

cd && cd taller_metagenomica_pozol/


Y ahora si, vamos a correr dRep …


export PATH=/miniconda3/envs/metagenomics/bin:$PATH
nohup dRep dereplicate results/09.drep/ -d -comp 50 -con 10 --SkipSecondary -g results/09.drep/bins/*.fasta > outs/09.drep.nohup &


Nota

El argumento --SkipSecondary no se aconseja poner, en la vida real queremos que se hagan todas las agrupaciones para discriminar genomas. En este ejemplo fue necesario ponerlo porque no logramos llamar a ANIm


Este es uno de los plots generados por dRep, que representa los mejores bins desreplicados.


dRep output


Vamos a desactivar el ambiente de dRep

conda deactivate

Responde

¿Cuántos clústers se formaron? ¿Cuántos MAGs son únicos?


🧠 Discusión

Para tomar en cuenta

  • En la vida real, si el proyecto de metagenómica que estás desarrollando tiene librerías de diferentes muestras usarías dRep entre todos los conjuntos de bins ya refinados para no tener redundancia de genomas.
  • Qué harías si antes de desreplicar tienes un bin que tiene 98 % de completitud y 11 % de contaminación?. dRep en automático lo descartaría.

Propondrías alguna manera para quedarte con este bin y curarlo para reducir su contaminación?

Por suerte hay más programas que pueden ayudarnos a curar nuestros bins manualmente, una herramienta útil para esto es mmgenome2

Ya que tenemos los bins refinados y desreplicados opcionalmente podrías reensamblarlos. La manera sería mapear las lecturas de toda la muestra a los bins finales y con las lecturas mapeadas y el bin, generar un ensamble genómico para cada uno. Con esta aproximación se genera un MAG más pulido y la contaminación se reduce.

Aunque en muchos reportes verás que los autores reensamblan sus MAGs, en otros no lo hacen y no hacerlo no está mal, pero hacerlo mejora la calidad.



🧬🦠🥳 Ahora te toca a tí

Ejercicio 2

Ahora te toca a tí.

  • Reúnanse en equipos y repliquen todo el flujo hasta este punto con la muestra que les toca.
  • Discutan cada resultado obtenido.
  • En la carpeta compartida de Drive busquen la diapositiva para el Ejercicio 2.
  • En la diapositiva correspondiente resuman sus resultados obtenidos.

Tiempo de actividad (2 hr)

Tiempo de presentación de resultados (5 min por equipo)