4 votos

¿Cuáles son las formas más sencillas de obtener datos de un archivo FITS sin una biblioteca?

Existen bibliotecas FITS para la mayoría de los lenguajes de programación (véase esta lista ), pero FITS es un formato lo suficientemente sencillo como para que sea bastante fácil extraer datos sin necesidad de dichas bibliotecas o utilidades.

La parte de datos de una imagen es una simple lista de valores de píxeles, y la de una tabla es sólo una catenación de los valores binarios de cada fila. Las cabeceras son lo suficientemente simples como para que una persona pueda leer la cabecera y ver lo que deberían ser esas filas, así que mi intuición dice que no debería ser demasiado difícil para una persona mirar la cabecera, y escribir un corto bash script para, digamos, imprimir las filas de una tabla como una tabla ASCII que puede ser procesada con awk. Sin embargo, después de probarlo, no parece tan fácil como esperaba al principio; generalmente tengo que recurrir a escribir código (ciertamente simple).

Realmente estoy buscando algo que pueda ejecutar en un sistema con el que no esté familiarizado, y en el que sólo vaya a trabajar durante unos minutos, como cuando estoy ayudando a otra persona en su ordenador. Por lo tanto, me gustaría evitar tener que instalar nada, o escribir algo largo o poco memorable que sería molesto escribir con alguien mirando por encima de mi hombro.

3voto

hromanko Puntos 548

En la mayoría de los sistemas UNIX/Linux, se puede leer la cabecera así:

hexdump -e '80/1 "%_p" "\n"' myfile.fits

que es sólo la mitad de la solución; la otra mitad es sacar los datos reales.

Si recurro a escribir un poco de python, puedo obtener la salida que quiero. Por ejemplo, usando este comando:

hexdump -e '"%_ad\t" 80/1 "%_p" "\n"' astlimits.fits  | less

Puedo buscar en el archivo FITS, y encontrar el número de bytes del inicio de los datos que me interesan. (El %_ad comienza cada línea de salida con un número de byte, el %_p imprime cada carácter imprimible y reemplaza los no imprimibles con un "." Debido a que los datos FITS deben comenzar en un múltiplo entero de 2880, los datos comenzarán en el inicio de una línea cuando se dividen en líneas de 80 bytes). Puedo leer el número de filas de la palabra clave de cabecera NAXIS2 de la HDU que me interesa, y los tipos de cada columna de las palabras clave TFROMx.

Así, si los datos que quiero empiezan en el byte 5760, el número de filas 5730 (sólo por coincidencia), y los bytes por fila 42 (de NAXIS1), puedo usar el siguiente python para extraer la tabla que quiero:

python -c 'import struct
> f = open("astlimits.fits")
> f.seek(5760)
> for i in range(5730): print "\t".join(map(str,struct.unpack(">hhhddhhiiii",f.read(42))))

De forma menos compacta pero más legible, esto es como ejecutar este python script:

import struct
data_start_byte = 5760
num_bytes_in_row = 42   # NAXIS1 from header
num_rows = 5730         # NAXIS2 from header
f = open("astlimits.fits")
f.seek(data_start_byte)
for r in range(num_rows):
    row_bytes = f.read(num_bytes_in_row)
    row_values = struct.unpack(">hhhddhhiiii", row_bytes)
    row_strings = [str(v) for v in row_values]
    print "\t".join(row_strings)

Si utilizara una máquina big endian, podría hacer todo esto con otra sentencia hexdump. Desafortunadamente, hexdump no cambiará el endian-ness.

Lo más difícil aquí es recordar cómo los códigos de tipo utilizados en los valores FITS TFORM se corresponden con los códigos de tipo en el primer argumento de struct.unpack.

Pero, lo que realmente quiero es algo comparable a hexdump en simplicidad.

3voto

TREE Puntos 897

FITS es un formato sencillo, pero ese Flexible que hay en la parte delantera permite una gran complejidad. No estoy seguro de que haya una forma "fácil" de sacar los datos. Creo que vas a necesitar al menos un poco de código (Aunque sería bueno estar equivocado).

El problema radica en el hecho de que hay muchos tipos diferentes de datos que podrían estar en la sección de datos. En el primer nivel tienes la opción de datos de imagen, una tabla ASCII o una tabla binaria. Creo que podrías obtener datos de una tabla ASCII con bastante facilidad una vez que supieras el tamaño de cada una de las columnas de la cabecera, ya que sólo tienes que leer N caracteres para cada columna (donde N se define para cada columna en la cabecera). Pero eso es lo único fácil. Para analizar la tabla binaria, todavía tendrías que hacer el mismo desglose y luego hacer conversiones de todos los tipos de datos posibles (y aquí hay incluso más tipos de datos que en los datos de imagen, incluyendo vectores de todos los tipos de datos posibles también).

Sin embargo, por tu pregunta, creo que estás buscando extraer datos de un array de imágenes. La cabecera puede decirte el tamaño de los datos (8, 16, 32 o 64 bits) y el tipo (entero o punto flotante) basado en el valor de la palabra clave BITPIX. Lo que los datos de la cabecera no te dicen es la endogamia de los datos internos. No recuerdo si el Norma FITS prescribe esto o no pero no creo que lo haga ya que recuerdo haber tenido problemas al mover archivos fits de máquinas big endian (Sparc) a little endian (Intel).

Así que cualquier cosa que termines escribiendo para ver los datos tiene que

  1. Obtener el tamaño y el tipo de datos de la cabecera
  2. recorrer los datos leyendo un bloque de datos a la vez
  3. procesar el bloque de datos de forma adecuada (reconstruir a partir de la correcta endianidad y convertir de punto flotante IEEE si es necesario) y almacenarlo o mostrarlo.

Es ese último paso el que no sé si es fácil de hacer simplemente. Reconozco que nunca lo he intentado. Siempre uso alguna herramienta preexistente (normalmente fv ) para mirar los archivos si necesito hacer algo más que mirar las cabeceras. Y cuando sólo tengo que mirar la cabecera primaria (o la secundaria si la primaria no tiene datos como ocurre en los archivos con los que trabajo a diario), sólo leo la cabecera simplemente haciendo un comando 'more' en el archivo en una ventana de 80 caracteres de ancho :).

2voto

UnkwnTech Puntos 21942

Ver las cabeceras es fácil (como ha mostrado Eric, aunque si alguien está almacenando pilas de imágenes, puede que tengas que buscar las subcabeceras). Personalmente, hago lo mismo que dagorym, y ajusto el ancho de mi ventana a 80 columnas (o un múltiplo), y uso more o less para leer las cabeceras, a menos que intente automatizar la extracción de cabeceras específicas.

La visualización de los datos, por otra parte, va a ser casi imposible de hacer de forma fiable sin un lector FITS dedicado. El problema ni siquiera es el de la tabla binaria, sino que el estándar FITS permite la compresión . Hemos estado teniendo un infierno de un tiempo con los diversos Lectores FITS escritos para IDL . Básicamente tienes que utilizar el sistema IRAF imcopy o CFITSIO's Fpack para escribir una versión sin comprimir y luego léelo.

SAOimage DS9 los lee de forma nativa. No soy un fv usuario, así que no sé si los soporta bien. (Supongo que sí, pero nunca lo he probado)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X