Question
¿Cómo puedo extraer lecturas de un archivo bam
(producido por bwa-mem
) a fastq
dada una lista de secuencias de referencia para filtrar?
Posibles dificultades
- mantener la orientación FR de las lecturas finales del par (en
bam
todas las secuencias son secuencias de referencia) - manteniendo las lecturas de R1 y R2
- manteniendo los puntajes de calidad en la misma codificación que el fastq original (puntajes predeterminados de illumina phred en mi caso)
- bam can ser (normalmente) ordenado por coordenadas
Casi hay soluciones
-
La solución perl de Sujai en blobology hace exactamente lo contrario: obtener lecturas de la lista de referencias (por lo que podría revertir la lista). La desventaja es que el script genera un archivo
fq
intercalado; requiere nombres únicos de compañeros, de lo contrario se pierde la información de R1 / R2. -
samtools + grep todos de archivos fastq
crear una lista de nombres leídos que no se correspondan con andamios filtrados. (cut extraerá sólo los nombres leídos, uniq colapsará el par y los nombres leídos si son iguales). Luego, grep lee los nombres de los archivos fastq y elimina el separador entre hits
samtools view foo.bam | grep -vf list_of_scaffols_filter \ | cut -f 1 | uniq > list_of_reads_to_keepgrep -A 3 -f list_of_reads_to_keep foo_R1.fq | grep -v "^ - $" > foo_R1_filtered_bash.fqgrep -A 3 -f list_of_reads_to_keep foo_R2.fq | grep -v "^ - $" > foo_R1_filtered_bash.fq
- filter bam & herramientas picard
O yo podría hacer solo la parte de filtrado y usar Picard-tools (Picard.SamToFastq), pero como de costumbre, estoy evitando Java tanto como puedo. Supongo que
samtools view foo.bam | grep -vf list_of_scaffols_filter \ | java -jar picard.jar SamToFastq INPUT = / dev / stdin \ FASTQ = foo_R1_filtered_bash.fq SECOND_END_FASTQ = foo_R2_filtered_bash.fq
La primera solución realmente no me funciona ya que no quiero cambiar el nombre de todas las lecturas en el archivo bam y quiero mantener la información de R1 / R2 (ya que R1 y R2 tienen perfiles de error diferentes). Ambas soluciones 2 y 3 me parecen un poco torpes y no estoy seguro de si son generales, podría tener un comportamiento inesperado si una de las lecturas está mapeada y la segunda no ... Ambas se relacionan con el mismo paso de filtrado.
Me preguntaba acerca de alguna solución pysam. Supongo que será mucho más lento, pero al menos será mucho más claro y quizás más general. Algo como en Convertir archivo Bam en archivo Fasta: hay una solución pysam para fasta (no fastq), casi está ...
Historia
Tengo genoma de referencia muy fragmentado. Algunos de los andamios son demasiado pequeños para trabajar con ellos, y algunos de ellos son contaminantes (identificados mediante blobtools). Quiero separar las lecturas que están mapeando a diferentes grupos para separar contaminantes, andamios cortos y andamios que se utilizarán para el análisis posterior. La razón es que si reasignamos todas las lecturas a la referencia filtrada (0,7 - 0,8 del genoma original), la mayoría de ellas (0,95 - 0,99) todavía encontrarán un lugar donde se asignan, por lo tanto, hay 0,2 - 0,3 de lecturas extraviadas que obviamente tendrá que afectar el análisis posterior, como la llamada de variantes.
Esta idea de filtrado se basa en la lógica de que si la región genómica duplicada filtrada contiene algunas pequeñas diferencias, atraerán sus lecturas (y si las filtro, mejorará la llamada de variantes) y si serán exactamente iguales, se asignarán lecturas al azar, por lo que no hay nada de malo en hacer eso.