¿Por qué abordar este capítulo primero?
El objetivo de esta serie es "comprender con las manos y el código los algoritmos que un bioinformático profesional utiliza a diario". Para ello, debemos empezar por aclarar cómo se ven nuestros objetos de estudio —el ADN, el ARN y las proteínas— ante los ojos del ordenador. Sin este capítulo, la expresión "lectura de 100 pb" que aparecerá en el siguiente (M02: secuenciación de tercera generación) sería simplemente un número. Sin embargo, esos 100 pb son en realidad una cadena de caracteres finita compuesta por cuatro letras: A, C, G y T, y la función del equipo de secuenciación no es más que generar esa cadena con algún margen de error.
Para abordar el cálculo, descomponemos brevemente una de las ideas centrales de la biología: el dogma central. Luego verificamos los resultados de esta descomposición mediante una solución en Python de cinco líneas para el primer problema de Rosalind (ADN).
¿Por qué es determinante que el alfabeto conste de solo cuatro letras?
Los datos que maneja un ordenador suelen estar basados en un alfabeto de dos caracteres (0/1). El lenguaje natural utiliza Unicode con decenas de miles de caracteres. El ADN se encuentra en un punto intermedio: consta exactamente de cuatro letras: A (adenina), C (citosina), G (guanina) y T (timina). El ARN utiliza U (uracilo) en lugar de T.
Este tamaño finito lo cambia todo. La búsqueda, la compresión, la estadística, la indexación y los embeddings de aprendizaje profundo se basan todos en el hecho de que "ciertos patrones se repiten de manera probabilística dentro de un alfabeto de cuatro letras". Por ejemplo, si se selecciona aleatoriamente una secuencia de 30 pb, la probabilidad de que esa misma secuencia aparezca por casualidad en el genoma humano (3 × 10⁹ pb) es . Esta es la razón fundamental por la que las lecturas de secuenciación, aunque sean cortas, pueden alinearse con una posición específica.
El procesamiento de cadenas sobre alfabetos finitos ha sido ampliamente estudiado en ciencias de la computación: Rabin-Karp, KMP, Aho-Corasick, Suffix Array y FM-index. Todos estos conceptos volverán a aparecer en capítulos posteriores. Por ahora, basta con retener este hecho fundamental: el ADN es una cadena de caracteres finita compuesta por cuatro letras.
El dogma central: la transformación determinista entre tres cadenas
La frase resumida por Francis Crick en 1958 es la siguiente: ADN → ARN → proteína. Existen tres tipos de cadenas y una transformación direccional entre ellas.
Transformación 1: Transcripción — ADN → ARN
T se convierte en U. Además, solo se lee una de las dos hebras. Si dejamos de lado por un momento los detalles adicionales (como el splicing), esta transformación no es más que un simple reemplazo de caracteres en la cadena.
def transcribe(dna: str) -> str: return dna.replace("T", "U")Es una sola línea. El problema de Rosalind sobre ARN se resuelve con esta única función. Los pipelines prácticos añaden aquí el empalmado, la caperuza 5′, la poliadenilación 3′ y la edición del ARN (RNA editing), pero la estructura base es la sustitución de cadenas.
Conversión 2: Traducción (Translation) — ARN → proteína
Cada trío de nucleótidos del ARN (codón, codon) se mapea a un aminoácido. Esta es la famosa tabla del código genético (genetic code table). AUG es el codón de inicio (metionina), y UAA, UAG y UGA son los codones de parada. Los codones intermedios se asignan a sus respectivos aminoácidos correspondientes.
Es decir, la traducción es un problema que consiste en recorrer el ARN con una ventana deslizante de longitud 3 y consultar un diccionario (dict).
GENETIC_CODE = { "AUG": "M", "UAA": "*", "UAG": "*", "UGA": "*", "UUU": "F", "UUC": "F", "UUA": "L", "UUG": "L", "CUU": "L", "CUC": "L", "CUA": "L", "CUG": "L", # ... (64 codones en total)}
def translate(rna: str) -> str: protein = [] for i in range(0, len(rna) - 2, 3): aa = GENETIC_CODE.get(rna[i:i+3], "X") if aa == "*": break protein.append(aa) return "".join(protein)Esta es la estructura básica del problema PROT de Rosalind. En una célula real intervienen la dinámica del ribosoma y la unión tridimensional del ARNt, pero desde el punto de vista computacional se trata de una consulta en un diccionario más una ventana deslizante.
¿Por qué los codones tienen 3 letras?
Detengámonos un momento. Si un codón tuviera dos letras, solo existirían combinaciones, insuficientes para 20 aminoácidos. Con tres letras hay combinaciones, más del triple de las necesarias. De ahí surge la redundancia: varios codones codifican el mismo aminoácido. Es una consecuencia natural del diseño del código, familiar para quien haya estudiado códigos de corrección de errores como Reed–Solomon.
Desglosemos Rosalind DNA en 5 líneas
El primer problema de Rosalind, DNA — Counting DNA Nucleotides, se resume en una frase: «Dada una cadena de ADN, imprima separados por espacios los recuentos de A, C, G y T».
def count_nucleotides(dna: str) -> str: return " ".join(str(dna.count(c)) for c in "ACGT")
# Ejemplosample = "AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC"print(count_nucleotides(sample))# 20 12 17 21No son cinco líneas, es una sola línea. Esto resulta tan sencillo porque el problema se reduce a un conteo sobre un alfabeto finito. Rosalind ofrece más de 100 problemas que aumentan gradualmente en dificultad desde este primer ejercicio, y muchos de ellos son versiones simplificadas de los algoritmos que aprenderemos más adelante (ordenamiento, HMM, ensamblaje, etc.).
Si aún no has creado una cuenta en Rosalind, te conviene hacerlo ahora. En cada episodio colocaremos enlaces a las ubicaciones donde deberás intervenir manualmente.
Trampas comunes en la práctica profesional
- Mezcla de mayúsculas y minúsculas: Los resultados de secuenciación suelen contener letras minúsculas (
acgt) para indicar secuencias de baja complejidad (low-complexity). Al realizar el conteo, debemos normalizar siempre adna.upper(). - Carácter N: Se utiliza para marcar posiciones con baja confianza (
N). El alfabeto efectivo tiene cinco caracteres. En todas las etapas de conteo, búsqueda y ordenamiento, debemos definir una política sobre cómo manejarN. - Confusión entre U y T: Es un error frecuente al procesar ADN y ARN en la misma tubería (pipeline). Las lecturas FASTQ utilizan el alfabeto de ADN, mientras que las secuencias en la anotación GFF pueden ser de ARN. Debemos verificar siempre los encabezados de los archivos.
- Dirección 5′ y dirección 3′: Por convención, las secuencias se escriben en dirección 5′→3′. La cadena opuesta es el complemento inverso (reverse complement, que se aborda en M05). Si pasamos por alto la dirección, todo el alineamiento queda invertido.
Mapeo con Ciencias de la Computación (CS)
- Cadenas de caracteres sobre un alfabeto finito: Son los datos mismos sobre los que operan las expresiones regulares, KMP y Aho-Corasick.
- Transformaciones deterministas: La transcripción (T→U) y la traducción (3 caracteres → aminoácido) pueden interpretarse como Autómatas Finitos Deterministas (DFA). Son autómatas sin estado o con solo tres estados simples.
- IR del compilador: El flujo ADN → ARN → proteína se asemeja estructuralmente a la tubería de un compilador: fuente → IR → código máquina. Cada etapa conserva solo la información necesaria para la siguiente y descarta el resto.
- Redundancia: El diseño de tres caracteres del codón existe por la misma razón (tolerancia a errores) que los conceptos de redundancia en diseños de códigos como Reed-Solomon.
Ramas hacia el próximo episodio
- Próximo episodio (M02): Secuenciación de tercera generación — Cómo Sanger, NGS y las lecturas largas extraen cadenas de caracteres, y por qué sus resultados presentan diferentes tipos de errores.
- Dos episodios después (M03): Distancia de Hamming — La medida más básica para cuantificar la diferencia entre dos secuencias. El punto de partida de las estadísticas de distancia evolutiva.
- Tres episodios después (M04): Proporción GC — Qué tan bien la distribución de los cuatro caracteres del alfabeto permite distinguir entre especies.
- Cinco episodios después (M06): Needleman-Wunsch — Cómo alinear dos secuencias de forma óptima. Este episodio ya está disponible como piloto en la biblioteca.
Si desea profundizar más
El texto principal es una narrativa reconstruida por BPD. Si desea un curso intensivo ortodoxo para profundizar, utilice los siguientes recursos en orden:
- Harvard STAT115 — La Semana 1: Actualización de Biología Molecular del profesor Xiaole Shirley Liu (subtítulos completos, excelente traducción automática). Reensambla el dogma central desde la perspectiva de un estadístico.
- MIT 7.91J — La Introducción a la Biología Computacional y de Sistemas del profesor Christopher Burge (subtítulos completos). Deriva densamente por qué las estadísticas del alfabeto funcionan a escala genómica.
- Artículo original: Crick, F. (1970), Dogma Central de la Biología Molecular, Nature 227, 561–563. El texto original es una breve carta de una página y media.
- Libro web gratuito de referencia: NCBI Bookshelf — Molecular Biology of the Cell. Cubre desde un nivel divulgativo hasta detalles prácticos avanzados.
Resuelva los cuatro problemas de Rosalind: DNA, RNA, REVC y PROT en secuencia. Esto hará que quede claro naturalmente de dónde provienen las lecturas de secuenciación que encontrará en el próximo episodio M02. Es necesario poner manos a la obra.