Konverze astronomických datových formátů FITS / program Spefo

Ondřej Pejcha, 3. ročník FOF

Program SPEFO poskytuje užitečné rutiny pro analýzu astronomických spekter (měření ekvivalentních šířek čar, radiálních rychlostí, filtrování šumu a další), které dosud nebyly překonány jinými technicky dokonalejšími programy (např. IRAF nebo SPLAT). Nicméně, pokud chce uživatel používat SPEFO, je svázán aplikací pro platformu MS DOS s nevyhovujícím interface.

Nicméně hlavním omezením SPEFA je jeho datový formát (UUI nebo RUI soubory). Bohužel je příliš jednoduchý, takže neumožňuje ukládat informace potřebné ke zpracování spekter z moderních detektorů (složité nelineární disperzní relace, ešeletové řády, datové kostky apod.).

SPEFO samozřejmě obsahuje základní vstupně-výstupní operace, ale díky omezením v jeho datovém formátu dochází ke ztrátě dat. Uživatel je pak nucen ručně doplňovat informace do hlaviček nebo si tyto informace ukládat jinde.

Dokud nebude vytvořen program se stejnými schopnostmi a tak snadnou manipulací jako SPEFO, je nutné převádět data mezi jeho vnitřním formátem a standardem FITS, který se dnes v astronomii téměř výlučně používá.

Tento text obsahuje popis formátu FITS a ukázky jeho použití pod IDL. Zdrojové kódy programu Spefo Conversions lze nalézt v tomto archivu a ukázkové soubory zde. Úplný manuál k programu sídlí na těchto stránkách.

Formát FITS

Zkratka FITS znamená Flexible Image Transport System a v současné době se astronomická data vyměňují téměř výhradně ve formátu dle této konvence. Hlavní účel formátu FITS spočívá v přenosu vícerozměrných polí (1D spekter, 2D obrázků nebo 3D datových kostek) a dvourozměrných tabulek. Standard FITS je spravován Pracovní skupinou IAU, přičemž významnou úlohu hraje i NASA's High Energy Astrophysics Science Archive Research Center a jejich stránka věnovaná formátu FITS.

Stručný přehled struktury

FITS byl původně vyvinut s sedmdesátých letech jako archivní a výměnný formát pro astronomické datové soubory. V posledních letech se začal prosazovat též jako formát vhodný pro internet, protože může být přímo čten a zapisován různými programy pro analýzu dat. Níže bude uvedeno, jak tuto vlastnost zpřístupnit i v IDL.

Soubor ve formátu FITS se skládá z jedné nebo více HDU (Header + Data Unit), přičemž první HDU se nazývá Primární HDU. Primární HDU se skládá z N-rozměrného pole pixelů (1D spektrum, 2D obrázek nebo 3D datová kostka); podporováno je pět datových typů: unsigned 8 bitový byte, 16 a 32 bitový signed integer, 32 a 64 bitová reálná čísla s pohyblivou čárkou a jednoduchou nebo dvojitou přesností. Za primární HDU se může nacházet libovolný počet dalších HDU, ty se nazývají extenze (extensions). Standard FITS rozeznává 3 typy extenzí:

Každá HDU se skládá z hlavičky ve formátu ASCII, kterou mohou následovat samotná data. Z historických důvodů musí být délka každé hlavičky a datové jednotky celočíselným násobkem 2880 bytů. Nevyužité místo na konci hlavičky nebo datové jednotky se vyplňuje buď mezerami nebo nulami v závislosti na typu jednotky.

Každá hlavička se skládá z libovolného počtu záznamů, každý o délce 80 znaků, které mají následující tvar:

JMÉNO = hodnota / komentář

Jméno záznamu musí mít délku do 8 znaků a obsahovat pouze kapitálky, číslice, pomlčku a podtržítko. Po jménu záznamu většinou následuje rovnítko a mezera, po nichž přijde hodnota záznamu, což může být buď celé nebo desetinné číslo, řetězec znaků (uvedený v jednoduchých uvozovkách) nebo booleovská hodnota (T nebo F).

Posledním záznamem je vždy "END", které nemá žádnou hodnotu nebo komentář. Existuje mnoho doporučení a pravidel pro zápis záznamů do hlavičky, takže se většinou při zápisu vyplatí spoléhat na nějaký interface, například CFITSIO.

Každá hlavička začíná sledem záznamů, které specifikují velikost a formát následující datové jednotky. Například dvourozměrný obrázek v primární HDU začíná hlavičku těmito klíčovými slovy:

SIMPLE  =                    T / soubor splňuje FITS standard
BITPIX  =                   16 / počet bitů na jeden pixel
NAXIS   =                    2 / počet datových os
NAXIS1  =                  440 / délka datové osy 1
NAXIS2  =                  300 / délka datové osy 2

Povinné záznamy mohou být následované dalšími, které popisují další aspekty data, například datum, čas a místo pozorování, parametry přístroje apod. Často se používají i klíčová slova COMMENT a HISTORY pro vložení dalších informací.

Ukázka hlavičky FITS souboru obsahujícího spektrum

SIMPLE  =                    T / Fits standard
BITPIX  =                  -32 / Bits per pixel
NAXIS   =                    3 / Number of axes
NAXIS1  =                 1997 / Axis length
NAXIS2  =                    1 / Axis length
NAXIS3  =                    4 / Axis length
EXTEND  =                    F / File may contain extensions
ORIGIN  = 'NOAO-IRAF FITS Image Kernel July 2003' / FITS file originator
IRAF-TLM= '21:21:29 (03/08/2005)' / Time of last modification
OBJECT  = 'alpha Vir'          / Title of observation
DATE    = '2005-08-03T19:21:26' / Date FITS file was generated
SYSVER  = 'BIAS-headers'       / Tue Jun  8 14:05:42 CEST 2004
OBSERVAT= 'ONDREJOV'           / Name of observatory (IRAF style)
LATITUDE=            49.910555 / Telescope latitude  (degrees), +49:54:38.0
LONGITUD=            14.783611 / Telescope longitud  (degrees), +14:47:01.0
HEIGHT  =                 0528 / Height above sea level [m].
OBSERVER= ''                   / Observers
IMAGETYP= 'object'             / Type of observation, eg. FLAT
FILENAME= 'od210023.fit'       / BIAS filename
TELESCOP= 'ZEISS-2m'           / 2m Ondrejov observatory telescope
TELSYST = 'COUDE'              / Telescope setup - COUDE or CASSegrain
EXPTIME =              312.786 / Length of observation excluding pauses
DARKTIME=              312.786 / Length of observation including pauses
EXPVAL  =               20.001 / Exposure value in photon counts [Mcounts]
DATE-OBS= '2005-04-21'         / UTC date start of observation
TM_START=                77333 / 21:28:53
TM_END  =                77675 / 21:34:35
COMMENT =                      /
COMMENT1=                      /
UT      = '21:28:53'           / UTC of  start of observation
!UTMIDDL=                      / UTC of middle of observation - effective
INSTRUME= 'COUDE700'           / Coude spectrograph setup - 1400/700mm focus
CAMERA  = 'BROR'               / Camera head name
DETECTOR= 'SITe 2000x800'      / Name of the detector
CHIPID  = 'SITe005 800x2000'   / Name of CCD chip
BUNIT   = 'ADU'                / Unit of the array of image data
GAINM   = 'HIGH'               / Gain mode
AMPLM   = 'A '                 / Amplifier A,B or AB
MPP     =                    T / Multiphase pinned mode (T/F)
PREFLASH=                    0 / Length of preflash in seconds
GAIN    =                 1.07 / Electrons per ADU
READNOIS=                 7.00 / Readout noise in electrons per pix
CCDTEMP =               -100.0 / Detector temperature
LN2TEMP =               -180.1 /
CCDXSIZE=                 2030 / X Size in pixels of digitised frame
CCDYSIZE=                  800 / Y Size in pixels of digitised frame
CCDXIMSI=                 2030 / X Size of useful imaging area
CCDYIMSI=                  800 / Y Size of useful imaging area
CCDXIMST=                    1 / X Start pixel of useful imaging area
CCDYIMST=                    1 / Y Start pixel of useful imaging area
CCDXPIXE=                   15 / Size in microns of the pixels, in X
CCDYPIXE=                   15 / Size in microns of the pixels, in Y
CCDXBIN =                    1 / Binning factor, in X
CCDYBIN =                    1 / Binning factor, in Y
XOVERSC =                    0 /
YOVERSC =                    0 /
!AOVERSC=                    0 /
!CCDSEC = '[00:0000,00:0000]'  / Orientation to full frame
!DATASEC= '[00:0000,00:0000]'  / Image portion of frame
!ORIGSEC= '[00:0000,00:0000]'  / Original size full frame
CCDSUM  = '1 1'                / CCD binning in both axes
GRATNAME= '3'                  / Grating name - ID
GRATANG =                30.25 / 30:15
GRATPOS =                10889 / Grating angle in increments
GRATCWAV=                      / Central Wavelength in A
DICHMIR =                    1 / Dichroic mirror number
SPECFILT=                    1 / Spectral filter
SLITTYPE= 'BLADE'              / Type of slit - blade or image slicers
SLITWID =                 0.20 / Slit width in mm
SLITHEIG=                 16.5 / Slit hight in mm
COLIMAT = 'OPEN'               / Collimator mask status
CAMFOCUS=                      / Camera focus position
FLATTYPE= 'PROJECT'            / Flat type (Projector/Dome)
COMPLAMP= 'ThAr-BS/15mA'       / Comparison arc setup
COMPMIDA=                      / CCD line at the middle of comp aperture
SEEING  =                      / Estimate of FWHM of seeing disk in arcsec
AUTOGUID= 'NO'                 / Status of autoguider system
COMMENT3=                      /
HISTORY1
RA      = '13:24:44.5'         / 13.412361
DEC     = '-11:11:08.4'        / -11.185667
EQUINOX =          2005.301147 / Equinox of RA and DEC
EPOCH   =          2005.301147 / Same as EQUINOX - for back compat.
!MJD-OBS=                      / Modified Julian Date of midtime of observation
!JD     =                      / Julian Date of midtime of observation
ST      = '12:28:13.2'         / Local sidereal time at start of observation
AZIMUTH =                345.9 / Mean azimuth of observation (degrees)
ZD      =                 62.3 / Mean horizon-distance of observation (degrees)
TELFOCUS=               -13.00 / Telescope focus (milimeters)
DOMEAZ  =                  1.8 / Mean dome azimuth during observation
AIRPRESS=                  960 / Atmospheric preasure in (hPa)
AIRHUMEX=                249.0 / Air humidity outside the dome
AIRHUMIN=                 41.2 / Air humidity inside the dome
OUTTEMP =                193.4 / Temperature outside of the dome
DOMETEMP=                  4.1 / Temperature inside the dome
SPECTEMP=                 26.5 / Temperature in spectrograph room
CAT-NAME=                      / Target input-catalogue name
CAT-RA  =                      / Target Right Ascension
CAT-DEC =                      / Target Declination
CAT-EQUI=                      / Equinox of target coordinates
CAT-EPOC=              2000.00 / Target epoch of proper motions
HISTORY2
WCSDIM  =                    3 /2
LTM1_1  =                   1.
LTM2_2  =                   1.
WAT0_001= 'system=equispec'
WAT1_001= 'wtype=linear label=Wavelength units=angstroms'
WAT2_001= 'wtype=linear'
TRIM    = 'Aug  3 21:14 Trim data section is [16:2012,430:570]'
OVERSCAN= 'Aug  3 21:14 Overscan section is [6:12,1:800] with mean=624.2462'
ZEROCOR = 'Aug  3 21:14 Zero level correction image is Zero'
FLATCOR = 'Aug  3 21:14 Flat field image is Flat10889.fit with scale=25669.61'
CCDSEC  = '[16:2012,430:570]'
CCDPROC = 'Aug  3 21:14 CCD processing done'
JD      =     2453482.39686794
LJD     =             2453482.
AIRMASS =             2.141124
UTMIDDLE= '21:31:29.4'
BANDID1 = 'spectrum - background fit, weights variance, clean yes'
BANDID2 = 'raw - background fit, weights none, clean no'
BANDID3 = 'background - background fit'
BANDID4 = 'sigma - background fit, weights variance, clean yes'
APNUM1  = '1 1 10.30 57.81'
CTYPE1  = 'LINEAR  '
CTYPE2  = 'LINEAR  '
CTYPE3  = 'LINEAR  '
CRVAL1  =      6262.4541015625
CRPIX1  =                   1.
CD1_1   =     0.25681537389755
CD2_2   =                   1.
CD3_3   =                   1.
LTM3_3  =                   1.
WAT3_001= 'wtype=linear'
DC-FLAG =                    0
DCLOG1  = 'REFSPEC1 = od210023od210021.ms 0.2167279'
DCLOG2  = 'REFSPEC2 = od210023od210025.ms 0.78327209'
DISPCOR =                    0
END

Prohlížeče formátu FITS

Mezi oblíbené prohlížeče formátu FITS patří fv a DS9. Čistě pro Windows existují i další programy, které kromě čistého prohlížení umožňují i základní analýzu astronomických snímků, například AVIS FITS Viewer nebo FITSView.

FITS a IDL

IDL sice neumí s formátem FITS přímo pracovat pomocí svých vnitřních funkcí, ale databáze astronomických knihoven v Goddard's Space Flight Center poskytuje víc než bohatou sadu procedur a funkcí pro zápis, čtení a zpracování FITS souborů v IDL.

Například příkazem

IDL> data = readfits (jmeno_souboru, header, /silent)
načteme do pole "data" obsah datové jednotky v souboru "jmeno_souboru", přičemž se do pole stringů "header" uloží hlavička souboru. Údaje uložené v hlavičce můžeme získat například tímto příkazem
IDL> hodnota = fxpar(header, jmeno)
V proměnné "hodnota" bude uložena hodnota v záznamu pojmenovaném "jmeno".

Při zápisu FITSového souboru postupujeme následovně. Máme-li pole, které chceme zapsat, vytvořené například takto

IDL> pole = SHIFT(DIST(500), 250, 250)
IDL> pole = EXP(-(pole/130)^2)
vytvoříme pro něj nejprve minimální hlavičku příkazem
IDL> mkhdr, pole_hdr, pole
Minimální hlavička vypadá takto
IDL> print, pole_hdr
SIMPLE  =                    T / Written by IDL:  Thu Apr 06 18:55:00 2006
BITPIX  =                  -32 / Number of bits per data pixel
NAXIS   =                    2 / Number of data axes
NAXIS1  =                  500 /
NAXIS2  =                  500 /
DATE    = '2006-04-06'         / Creation UTC (CCCC-MM-DD) date of FITS header
COMMENT FITS (Flexible Image Transport System) format is defined in 'Astronomy
COMMENT and Astrophysics', volume 376, page 359; bibcode 2001A&A...376..359H
END
Všimněme si, že řetězce znaků nejsou podle standardu zakončeny znakem "nový řádek", což mírně znepřehledňuje výpis.

Do hlavičky můžeme přidat libovolný počet klíčových slov například takto

IDL> sxaddpar, pole_hdr, 'helcor', 15.47, ' Heliocentric correction in km/s', before='comment', format='F6.2'
IDL> sxaddhist, 'Testovaci FITS hlavicka', pole_hdr
IDL> print, pole_hdr
SIMPLE  =                    T / Written by IDL:  Thu Apr 06 18:55:00 2006
BITPIX  =                  -32 / Number of bits per data pixel
NAXIS   =                    2 / Number of data axes
NAXIS1  =                  500 /
NAXIS2  =                  500 /
DATE    = '2006-04-06'         / Creation UTC (CCCC-MM-DD) date of FITS header
HELCOR  =                15.47 / Heliocentric correction in km/s
COMMENT FITS (Flexible Image Transport System) format is defined in 'Astronomy
COMMENT and Astrophysics', volume 376, page 359; bibcode 2001A&A...376..359H
HISTORY Testovaci FITS hlavicka
END

Výsledek pak zapíšeme do souboru pomocí příkazu

writefits, 'soubor.fit', pole, pole_hdr
V programu DS9 vypadá výsledný FITS soubor takto

Výsledek v programu DS9


4.4.2006