# Formato CRAM

El formato CRAM (siglas del inglés, Compressed Reference-oriented Alignment Map) es un formato de archivo comprimido, basado en columnas, para almacenamiento de secuencias biológicas alineadas con una secuencia de referencia. Fue concebido inicialmente por Markus Hsi-Yang Fritz y colaboradores.
CRAM se diseñó para ser una alternativa eficiente a los formatos SAM (del inglés, Sequence Alignment Map) y BAM (del inglés, Binary Alignment Map). Opcionalmente, utiliza un genoma de referencia para describir las diferencias entre los fragmentos de secuencia alineados y la secuencia de referencia, reduciendo los costes de almacenamiento. Adicionalmente, cada columna en el formato SAM está separada en sus propios bloques, mejorando la relación de compresión. Los archivos CRAM varían típicamente en tamaño de un 30 a un 60% más pequeños que los BAM, dependiendo de los datos que contengan.
Existen implementaciones de CRAM en htsjdk, htslib, JBrowse, y Scramble.
La Global Alliance for Genomics and Health (GA4GH) mantiene las especificaciones del formato, siendo accesible desde la página web de EMBL-EBI.

## Formato de archivo

La estructura básica de un archivo CRAM es una serie de contenedores; el primero contiene una copia comprimida de la línea de cabecera en formato SAM; los siguientes contenedores consisten en otra línea de cabecera de los datos comprimidos, seguida de registros de alineamientos, formateados como una serie de bloques.
Archivo CRAM:
| Número mágico | Contenedor (Línea de cabecera de SAM ) | Contenedor (Datos) | ... | Contenedor (Datos) | Contenedor (EOF) |
Contenedor:
| Línea de cabecera del contenedor | Cabecera de compresión | Porción | ... | Porción |
Porción:
| Cabecera de la porción | Bloque | Bloque | ... | Bloque |
Los archivos CRAM recogen registros de un conjunto de datos, describiendo los componentes de un alineamiento. La cabecera de compresión específica qué datos están codificados en cuales bloques, qué codificador se utiliza y metadatos específicos del codificador (por ejemplo, una tabla de longitudes de códigos Huffman). La mezcla de diferentes conjuntos de datos en un mismo bloque es posible, aunque su separación mejora normalmente la compresión y ofrece la oportunidad para decodificar selectiva e eficientemente los bloques con los datos necesarios.
El acceso selectivo a un archivo en formato CRAM está garantizado mediante el índice (con el sufijo ".crai"). Los índices indican, en datos ordenados por coordenadas genómicas, cuales regiones están cubiertas por cuales porciones. En datos no ordenados, los índices pueden utilizarse para simplemente buscar un contenedor concreto. La decodificación selectiva también puede obtenerse utilizando la cabecera de compresión para pasar sobre conjuntos de datos específicos, si se necesitas registros parciales.

## Historia

| Año | Versión | Notas |
| 2010-11 | pre-CRAM | Publicación original que describe la referencia en la que se basa el formato. Entonces, no se llamaba CRAM, sino mzip. Este software se implementó en python como prototipo y demostración de los conceptos básicos. |
| 2011-12 | 0.3–0.86 | Vadim Zalunin, del Instituto Europeo de Bioinformática (EBI) creó la primera implementación llamada CRAM como un paquete de software llamado CRAMtools, escrito en el lenguaje de programación java. |
| 2012 | 1.0 | Implementación en java CRAMtools. |
| 2013 | | Implementación en C añadida a la herramienta Scramble,creada por James Bonfield, del Instituto Sanger. |
| 2013 | 2.0 | Se incluyó soporte para más de una secuencia de referencia por porción (útil para ensamblajes muy fragmentados); mejor codificación de marcas auxiliares de formato SAM; metadatos para rastreo del número de registros y bases por porción; y correciones para marcas de formato BAM. |
| 2013 | | Añadido a htslib (0.2.0). |
| 2014 | 2.1 | Añadido a bloques EOF para ayudar a identificar archivos truncados. |
| 2014 | | Añadido a htsjdk (1.127). |
| 2014 | 3.0 | Inclusión del algoritmo lzma y el codificador rANS para la compresión de bloques, así como múltiples controles para asegurar la integridad de los datos. |
| 2018 | | Implementación en JavaScript como parte de JBrowse (1.15.0), creada por Rob Buels. |
| 2021 | | Implementación enn Noodles |
| 2023 | 3.1 | Adoptado oficialmente (Borrador de 2019) |
La versión 4.0 de CRAM existe como prototipo en Scramble, demostrado inicialmente en 2015, aunque aún no se ha adoptado como estándar.