10 Mapeo y Binning
M.C. Diana Oaxaca y Dra. Mirna Vazquez Rosas Landa
06 de agosto de 2025
10.1 Secuenciación
El ADN ambiental se secuencia utilizando alguna plataforma de secuenciacion o varias:
10.2 Control de calidad
Del proceso de secuenciacion se recuperan lecturas de aproximadamente 300 bps. Las secuencias las recortamos para eliminar artefactos generados durante el proceso de secuenciación. Aquí algunas herramientas utilizadas:
10.3 Ensamble
Las lecturas se ensamblan para armar contigs y scaffolds. Existen diferentes programas para ensamblar metagenomas, aquí algunos de ellos:
10.4 Mapeo
Profundidad: La profundidad de cada contig se calcula mapeando las lecturas al ensamble. Este paso permite evaluar la calidad del ensable y es necesario para hacer la reconstrucción de genomas ya que, como veremos más adelante, es uno de los parámetros que toman en cuenta los “bineadores”.
Vamos a mapear utilizando la herramienta BBMap del programa BBtools. Y samtools.
¡Manos a la obra!
Conéctate al servidor:
Crea tu carpeta y una liga simbólica a los datos:
mkdir -p 01.Mapeo/{data,results}
cd 01.Mapeo/
ln -s /home/diana/samples/htn/data/htn.fasta data/
ln -s /home/mirna/03.Mapeo/01.Trimm_reads/htn*.fastq data/ Primero, activa tu ambiente de conda.
¡Ahora sí! Explora las opciones de bbmap, y vamos a hacer nuestro primer mapeo.
bbmap.sh ref=data/htn.fasta in1=data/htn_1-short.fastq in2=data/htn_2-short.fastq out=results/htn.sam kfilter=22 subfilter=15 maxindel=80 10.5 Binning
Utilizaremos varios programas para hacer la reconstrucción de los genomas y haremos una comparación de estos.
NOTA: Cada programa tiene una ayuda y un manual de usuario, es importante revisarlo y conocer cada parámetro que se ejecute. En terminal se puede consultar el manual con el comando man y también se puede consultar la ayuda con -h o --help, por ejemplo fastqc -h.
La presente práctica sólo es una representación del flujo de trabajo, sin embargo, no sustituye los manuales de cada programa y el flujo puede variar dependiendo del tipo de datos y pregunta de investigación.
10.5.1 MaxBin
Crea tu espacio de trabajo y una liga símbólica hacia los datos que se usarán:
mkdir -p 02.MaxBin/{data,results}
cd 02.MaxBin/
ln -s /home/diana/samples/htn/data/htn.fasta data/
ln -s /home/diana/samples/htn/data/htn-depth.txt data/ Okay, ahora activa tu ambiente.
Explora las opciones y ahora sí, a calcular bins.
10.5.2 MetaBat
Okay vamos a utilizar otro progama. Crea tus ligas simbólicas :)
mkdir -p 03.Metabat/{data,results}
cd 03.Metabat/
ln -s /home/diana/samples/htn/data/htn.fasta data/
ln -s /home/diana/samples/htn/data/htn_sorted.bam data/ Para MetaBat lo primero que tenemos que hacer es crear un archivo de profundidad utilizando el script jgi_summarize_bam_contig_depths.
Entonces, primero activamos el ambiente.
Como cualquier otro programa jgi_summarize_bam_contig_depths tiene opciones, podemos revisarlas.
Okay… exploremos el archivo con head
Para metabat sólo necesitamos dos archivos principales:
- El ensamble
- El archivo de profundidad
10.5.3 CONCOCT
Okay, vamos a utilizar otro programa. Crea tus ligas simbólicas :)
mkdir -p 04.Concoct/{data,results}
cd 04.Concoct/
ln -s /home/diana/samples/htn/data/htn.fasta data/
ln -s /home/diana/samples/htn/data/htn_sorted.bam data/ Primero, activemos el ambiente
Primero, los contigs se tienen que partir en pedazos más pequeños
cut_up_fasta.py data/htn.fasta -c 10000 -o 0 --merge_last -b results/SplitAssembly-htn.bed > results/htn.fasta-split10K.faPara crear la tabla de cobertura se necesita primero indexar el archivo bam
concoct_coverage_table.py results/SplitAssembly-htn.bed data/htn_sorted.bam > results/concoct_coverage_table_htn.tsv¡Ahora sí! A correr concoct.
Normalmente correríamos 500 iteraciones, pero esta vez sólo haremos una.
concoct --coverage_file results/concoct_coverage_table_htn.tsv --composition_file results/htn.fasta-split10K.fa --clusters 400 --kmer_length 4 --threads 4 --length_threshold 3000 --basename concot --seed 4 --iterations 1Combinar contigs
Extraer bins como fasta individualmente
10.6 Refinamiento
10.6.1 DASTool
Preparing input files.
10.6.2 CheckM
Muy bien, crea un nuevo directorio y entra en él.
Ahora activemos el ambiente.
checkm lineage_wf -t 4 -x fa /home/mirna/05.DAS_tool/results/htn_bins_DASTool_bins DAStools-log_htn -f CheckM-DAS_Tool_bins.txtVamos a explorar la salida de checkM
Primero me puedes decir ¿Cuántas lineas tiene tu archivo?
Okay… ahora vamos a remover esas lineas feas.
library(tidyverse)
# CheckM -------------------------------------------------------------------####
checkm<-read.table("CheckM-DAS_Tool_bins_mod.txt", sep = "", header = F, na.strings ="", stringsAsFactors= F)
# Extracting good quality bins Megahit ------------------------------------####
colnames(checkm)<-c("Bin_Id", "Marker", "lineage", "Number_of_genomes",
"Number_of_markers", "Number_of_marker_sets",
"0", "1", "2", "3", "4", "5", "Completeness",
"Contamination", "Strain_heterogeneity")
good_bins<-checkm %>%
select(Bin_Id, Marker, Completeness, Contamination) %>%
filter(Completeness >= 50.00) %>%
filter(Contamination <= 10.00) Okay… quizá podamos recuperar algunos más.
medium_bins<-checkm %>%
select(Bin_Id, Marker, Completeness, Contamination) %>%
filter(Completeness >= 50.00) %>%
filter(Contamination <= 20.00) Muy bien, vamos a extraer esos bins.
10.6.3 Mis Bins
sed 's#bin#cp /home/mirna/05.DAS_tool/results/htn_bins_DASTool_bins/bin#g' lista_medium_bins | sed 's#$#.fa .#g' > copy_bins.shAhora un ejercicio.
¿Cuál es el problema?
change_bin_name<-function(ruta, ambiente){
ruta_original<-getwd()
setwd(ruta)
filez <- list.files()
newname<-paste0(ambiente, "_", filez)
file.rename(from=filez, to=newname)
filez <- list.files()
file.rename(from=filez, to=sub(pattern="\\.", replacement="_", filez))
setwd(ruta_original)
}library(phylotools)
library(tidyverse)
add_names_to_seqs <- function(nombre_del_archivo){
filenames <- unlist(strsplit(nombre_del_archivo, "/"))
filenames <- filenames[[grep("fa", filenames)]]
divide <- unlist(strsplit(filenames, "\\."))
bin_name <- divide[1]
termination <- divide[2]
old_name <- get.fasta.name(nombre_del_archivo)
new_name <- paste0( bin_name, "-scaffold-", old_name)
ref2 <- data.frame(old_name, new_name)
out_file <- paste0(bin_name, "_renamed", ".", termination)
rename.fasta(infile = nombre_del_archivo, ref_table = ref2, outfile = out_file)
}
files <- list.files(".")
files <- paste0("/home/mirna/07.Bins/Genoma/", files)
map(files, add_names_to_seqs)Veamos si funcionó
Muy bien, pongamos eso en una nueva carpeta y esperemos lo mejor jaja. No es cierto, sí movámoslo a otra carpeta, pero quitemos el renamed.
change_bin_name<-function(ruta){
ruta_original<-getwd()
setwd(ruta)
filez <- list.files()
file.rename(from=filez, to=sub(pattern="_renamed", replacement="", filez))
setwd(ruta_original)
}¿Creen que puedan optimizar esos scripts? ¡Discute en tu equipo si tienes una mejor idea!