Tengo una lista de ~200 secuencias de ADN, que representan probablemente 50 regiones genómicas diferentes, pero todas están mezcladas. Por ejemplo, si tengo seq1, seq2.... seq10
, seq1
podría alinearse con seq3
y seq8
, pero no tener ninguna relación con los demás.
También hay algunas diferencias en las longitudes muestreadas, por lo que el ejemplo anterior podría representar:
Seq1-------------------------------------------------
Seq3---------------------- seq8-----------------
Tal que seq3
y seq8
no se alinean entre sí, pero ambos se alinean paraseq1
Entonces, lo que me gustaría hacer es revisar y de alguna manera generar una lista de grupos de secuencias que se alinean entre sí, así como las alineaciones. p.ej:
Grupo 1
Seq1-------------------------------------------------
Seq3---------------------- seq8-----------------
Grupo 2
seq2------------------------------------
. seq6-----------------------------
. seq7--------------------------xxxxxx
Grupo 3 ... etc.
Intentar ClustalW o MUSSLE para alinear todo no funciona (o lleva una cantidad de tiempo irrazonable), supongo que porque hay muchas secuencias que no se alinean en absoluto. Intenté crear una base de datos BLAST personalizada y luego BLASTé cada secuencia contra ella, pero luego obtengo múltiples aciertos para la misma alineación (con el ejemplo del grupo 2 anterior, , , , , seq2:seq6
y seq2:seq7
todos seq6:seq2
se seq6:seq7
devuelven seq7:seq2
como seq7:seq6
6 aciertos únicos, cuando deberían ser agrupados.
Mi conocimiento de codificación actual es bastante básico, pero estoy dispuesto a leer documentos y resolver cosas, simplemente no quiero reinventar la rueda.
Edit2: Realmente, la agrupación es la parte importante: una vez que tengo los grupos, puedo hacer la alineación por separado con poco esfuerzo. Solo me gustaría tener grupos donde cada secuencia esté en un solo grupo.
Puedes probar esto:
seq1
se alinean en el Grupo-1 , luego vaya a las alineaciones de estas secuencias; poner todas las secuencias a las que se alinean de nuevo en el Grupo-1 ; así que sigue poblando el grupo de esta manera.Metodología:
makeblastdb
Un formato de salida tabular se parece a esto:
# BLASTN 2.2.27+
# Query: TCONS_00036712 gene=XLOC_017996
# Database: ../nt_db/nt
# Fields: query id, subject id, % identity, alignment length, mismatches, gap opens, q. start, q. end, s. start, s. end, evalue, bit score
# 1014 hits found
TCONS_00036712 gi|191174875|emb|CU655970.6| 95.54 202 9 0 423 624 16680 16479 8e-85 324
TCONS_00036712 gi|51491599|gb|AC144709.2| 95.02 201 10 0 424 624 28443 28243 1e-82 316
Ignore las #
líneas comentadas ( ); el primer campo es el ID de la consulta, el segundo es el ID del asunto y hay una alineación entre los dos; los otros campos brindan información sobre la alineación (puede elegir estos campos).
Para el análisis utilizo un lenguaje de secuencias de comandos rápido y fácil llamado awk que se incluye en todos los sistemas basados en UNIX. También está disponible para Windows en el paquete GNUWin32.
Lo que tienes que hacer es revisar los dos primeros campos y actualizar el grupo.
# CrearGrupos.awk BEGIN{FS="\t"} # Declarando el separador de campo como tabulador !($1 en grp){ # Comprobar si la secuencia es un grupo principal. Si no... k=1 para(yo en grp){ if($1 in grp[i]){ # Comprobar si la secuencia es parte de algún otro grupo parentgrp[$1]=i if(!($2 in grp[i])) # Comprobar si el segundo campo, es decir, el sujeto, ya está presente en el grupo principal grp[i][$2] # si no asigna el segundo campo al grupo principal k=0 romper # dejar de comprobar más } } if(k==1) # No hay un grupo padre con esta etiqueta y la secuencia no es parte de ningún otro grupo grp[$1][$1] # Cree un grupo con el id de consulta como etiqueta y agregue esta consulta a este grupo. } $1 en grp{ if(!($2 en grp[$1])) grp[$1][$2] # Si el segundo campo no es parte del grupo con el primer campo como etiqueta, asígnelo a ese } FIN{ para(yo en grp){ x++ imprimir "Grupo-"x"\n----------" for(j en grp[i]) imprimir j } imprimir "\n" }
Ejecute este script como este en la terminal:gawk -f MakeGroups.awk blastalignmentfile.txt
Nota: este script contiene matrices multidimensionales. No funcionará con todas las versiones de awk. usogawk version >4.0
_
Como menciona swarnbes en su respuesta, existen algoritmos más rápidos que hacen este tipo de cosas y se utilizan para el ensamblaje de secuencias. Lo que hacen muchos de ellos es hacer un gráfico (redes llamadas gráficos de deBruijn), donde cada conexión es una alineación, y calcular un Camino Euleriano. Vea esta reseña de Pavel Pevzner para más detalles. Las secuencias superpuestas forman contigs y puede rastrear fácilmente qué secuencia proviene de qué contig (que puede llamar Grupo). Cada contig/Group es un subgrafo deBruijn disjunto.
¿Realmente necesitas BLAST? Es decir, ¿las secuencias son lo suficientemente diferentes entre sí como para necesitar un algoritmo que busque grandes diferencias entre ellas?
Tal vez podría usar algo como Phrap, que debería armar contigs para usted, si las secuencias que deberían ir juntas son muy parecidas.
kevbonham
WYSIWYG
kevbonham
WYSIWYG
kevbonham
readline()
declarado explícitamente en python?WYSIWYG
readline()
lee el archivo completo línea por línea y lo almacena como una lista. En la lectura continua, se lee una línea y se implementa el código en ella antes de pasar a la línea siguiente. Para implementar la lectura de secuencias en el uso de pythonfor line in file:
. Ver aquí _ Awk por defecto hace lectura de flujo. Awk también tiene una buena base de expresiones regulares; en python tienes que hacerloimport re
. Dicho esto, Awk no es tan versátil como Python, pero es bueno para ciertas tareas.WYSIWYG
">.*"
como RS para un archivo fasta y cada secuencia de nucleótidos/proteínas se leerá en una secuencia.WYSIWYG
kevbonham
WYSIWYG