FITS - Flexible Image Transport System

http://fits.gsfc.nasa.gov/

História a súčasnosť

FITS formát začal vznikať na konci 70. rokov kvôli potrebe výmeny astronomických obrazových dát medzi počítačmi rôznych architektúr. Toho času PC neexistovalo. Prvý oficiálny návrh je z roku 1981. V roku 1989 sa FITS formát dočkal revízie. FITS formát získal podporu pre veľké množstvo dátových štruktúr, aby vyhovel požiadavkám nových dát z nových prístrojov. Obrázky, spektrá, textové tabulky, binárne tabulky, to všetko je formátom FITS podporované.FITS formát sa stal nesmierne populárny a široko používaný štandart, hlavne v astronomickej komunite. Väčšina astronomického softvéru priamo podporuje tento formát, nie len na načítavanie dát, ale aj ako vlastnú dátovú štruktúru. Isté nedostatky formátu, ako napr. keď je zaplnený alokovaný priestor záznamov hlavičky a chceme zapísať novú hlavičku, je nutné prepísať všetky nasledujúce dáta, sú vyvážené náramnými zlepšeniami v efektívnosti CPU a I/O operácií moderných PC.

V roku 1987 NASA vytvorila plán urobiť jednotný sytém pre astrofyzikálne dáta. Rozhodla, ze všetky dáta z misií NASA budú uverejňované komunite vo formáte FITS. Popri NOST (NASA/Science Office of standarts and Technology) vznikol úrad podpory pre FITS formát. Do roku 1998 vzniklo šesť revizií formátu, posledná NOST 100-2.0, obsahuje všetky rozšírenia a zmeny. Bola vytvorená IAU-FWG (FITS Working Group popri IAU). Formát FITS sa naďalej rozširuje podľa potreby, ale posledné slovo pri pridávaní nových vlastností má IAU-FWG, aby bola zachovaná kompatibilita.

Formát FITS nie je rozšírený len u astronómov, ale našiel uplatnenie aj v programoch, ktore používajú geofyzici (na zobrazovanie geomagnetického poľa), alebo aj biológovia (napríklad VisAD).

Štruktúra FITS

Súbor FITS pozostáva z HDU (Header and Data Unit), t.j. z hlavičky (Header), ktorá obsahuje rôzne kľúčové slová (Keywords), za ktorou nasledujú dáta. Za HDU môžu nasledovať volitelné rozšírenia a iné špeciálne záznamy. Štruktúra FITS súboru by mala pozostávat z celočíselného počtu logických záznamov. Veľkosť logického záznamu má byť 23040 bitov, čo je 2880 bytov (z historického dôvodu nemožnosti zapísať menší záznam na páskovu jednotku).

Primárna HDU má pozostávať z celočíselného počtu hlavičkových záznamov, ktoré pozostávaju z ASCII textu, a potom z celočíselného počtu binárnych dátových záznamov. Medzi záznamom v hlavičke a dátami nie je nič, nasledujú hneď za sebou. Hlavička by mala pozostávať z 36 záznamov, obsahujúc iba znaky ASCII. Prázdny záznam by mal byť vyplnený prázdnym ASCII znakom (hex20). Primárne dátove pole môže pozostávať z dátového poľa o 0 až 999 dimenziách. Hodnoty majú byť zapísané za sebou bez medzery resp. oddeľovača. Viacrozmerné polia majú pozostávať z postupnosti dát tak, že záznam podľa prvej osi (dimenzie) sa mení najintenzívnejšie, podľa druhej osi ako druhý najintenzívnejšie atd. a posledný najmenej intenzívne. Elementy poľa A(x1,x2,...,xm) majú byť v poradí, ako ukazuje nasledujúca tabuľka.

Tab. č. 1.
A(1, 1, ..., 1),
A(2, 1, ..., 1),
...,
A(NAXIS1, 1, ..., 1),
A(1, 2, ..., 1),
A(2, 2, ..., 1),
...,
A(NAXIS1, 2, ..., 1),
...,
A(1, NAXIS2, ..., NAXISm),
...,
A(NAXIS1, NAXIS2, ..., NAXISm)
kde NAXISm je kľúčové slovo označujúce dimenziu a m je dimenzia.

Rozšírenia (Extensions)

Každé rozšírenie musí mať jedičné pomenovanie, špecifikované v hlavičke a spĺnať syntax. Aby nevznikali konflikty v názvoch, rozšírenia musia byť registrované IAUFWG. Veľkosť dát rozšírenia má byť specifikovaná v hlavičke. Žiadne rozšírenie nesmie narušiť konzistenciu FITS súboru.

Štandartné rozšírenia

Spĺňajú štandart FITS z roku 1998. Každé štandartné rozšírenie má mať jedinečné meno dané hodnotou kľúčového slova XTENSION. Rozšírenie môže nasledovať po primárnej HDU alebo po inom rozšírení. Na poradí nezáleží.

Špeciálne záznamy

Prvých 8 bytov špeciálneho záznamu nesmie obsahovať reťazec "XTENSION" alebo "SIMPLE " (za písmenom E je ešte medzera). Záznam musí mať štandartnú dĺžku 23040 bitov.

Hlavička

Pozostáva z kľúčového slova, indikátora hodnoty, hodnoty (nepovinné) a komentára (nepovinné). Poradie kľúčových slov je ľubovoľne až na výnimky spomenuté nižšie.

Kľúčové slovo (1. az 8. byte) má byť zarovnané vľavo, má obsahovať iba číslice 0 až 9 (hex30 až hex39) a veľké písmená latinky (hex41 až hex5A). Povolené sú ešte znaky "-" (hex2D) a "_" (hex5F). Žiadne iné písmená nie sú povolené.

Ak indikátor hodnoty (9. až 10. byte) obsahuje "= ", značí to prítomnosť hodnoty kľúčového slova. Ak nie, môže ďalej nasledovať ľubovoľný ASCII text.

Hodnota alebo komentar (11. až 80. byte) obsahuje hodnotu kľúčového slova podľa typu premennej, resp. ľubovoľný komentár. Komentár , napr. za hodnotou, má začínať znakom "/" (hex2F). Medzera medzi hodnotou a "/" je nutná. Hodnota je pre niektoré typy premenných pevne stanovená. Pevne stanovená hodnota začína (11. byte) a konci (pred/alebo 80. byte) úvodzovkami " " " (bez medzier hex27) a pozostáva výhradne z ASCII znakov. Ak hodnota obsahuje úvodzovky, zapíše sa to ako dve úvodzovky za sebou takto: zápis "O"B" znamená O"B. Počiatočné prázdne znaky (medzera, tabulátor apod.) sa berú do úvahy, koncové nie. Pre nie pevne stanovené hodnoty platia rovnaké pravidlá, akurát, že úvodzovky " " " (bez medzier hex27) nemusia byť na 11. mieste. Príklady:

KEYWORD1= "" /kľúčové slovo je prázdny reťazec
KEYWORD2= " " /kľúčové slovo je prázny znak
KEYWORD3= /kľúčové slovo nie je definované

Ak je hodnota pevne daná logická konštanta, na 30. mieste by sa malo objaviť písmeno "T" alebo "F" (T ako True, F ako False). Pre nie pevný formát je predpisané, aby T resp. F bolo prvým neprázdnym znakom na ľubovoľnom mieste (ale nie pred 11. bytom).

Celé číslo sa uvádza vo formáte "+" (hex 2B, nepovinné) resp. "-" (hex 2D) a cifry. Číslo sa chápe ako dekadické. Zarovnáva sa vpravo.

Reálne číslo s desatinnou čiarkou sa uvádza ako dekadické číslo, za ktorým nasleduje nepovinný exponent. Zarovnáva sa vpravo. Číslo začína znakom "+" (nepovinné) alebo "-" a nasledujú cifry, medzi ktorými sa môže vyskytnúť bodka "." ako desatinná čiarka. Ak je uvedená iba mantisa, číslo musí začínať bodkou. Exponent (nepovinné) má začínať veľkým písmenom "E" alebo "D" a nasleduje číslo v dekadickom tvare. Úplná presnosť 64bitových hodnôt nemôže byť vyjadrená v tomto predpísanom tvare.

Komplexné čísla sa uvádzajú v rovnakom tvare ako celé čísla, resp. reálne, akurát sa uzatvoria do zátvoriek "[", "]" a oddeľujú sa čiarkou ",".

Jednotky

Všetky jednotky, až na uhlové miery, majú spĺňať doporučenie IAU Style Manual (McNally 1988). Pre uhlovú mieru je doporučený stupeň ("deg").

Povinné kľúčové slová

Tie sú povinné pre každú HDU. Nesmú byť pozmenené a musia sa uvádzať v predpísanom tvare.

Hlavička by mala vždy obsahovať tieto kľúčové slová v uvedenom poradí:

SIMPLE
BITPIX
NAXIS
NAXISn, n = 1, ...,NAXIS
...
END /ako posledné

Kľúčové slovo SIMPLE je potrebné uviesť ako prvé kľúčové slovo v primárnej hlavičke súboru FITS. Nie je povolené ho uvádzať v rozširujúcich hlavičkách. Jeho hodnota môže byť "T", ak súbor spĺňa štandart, alebo "F", ak nie.

BITPIX udáva akú číselnú presnosť majú dáta. Povolené hodnoty tohto kľúčového slova udáva nasledujúca tabuľka.

Tab. č. 2.
Hodnota dáta sú reprezentované ako:
8 znak alebo binary integer)* bez znamienka
16 16-bit two-complement binary integer
32 32-bit two-complement binary integer
-32 IEEE)** single precision floating point
-64 IEEE double precision floating point

)* Výrazy typu integer a floating point je zbytočné prekladať, pretože, kto rozumie danej problematike, tak to chápe a preklad by bol zbytočne mätúci.

)** Institute of Electrical and Electronic Engineers

NAXIS udava počet ôs (dimenzií) v dátovom poli. Povolené hodnoty sú 0 až 999.

NAXISn udáva počet hodnôt v danej osi dátového poľa pre každú os n = 1, ..., NAXIS a žiadnu ďalšiu. Ak je niektorá hodnota pre hociktorú os 0, znamená to, že za hlavičkou nenásledujú žiadne dáta v HDU. Ak hodnota NAXIS je 0, potom sa nemusi uvádzať kľúčové slovo NAXISn.

END stojí na konci hlavičky a nemá žiadnu hodnotu. Byty 9 až 80 majú byť vyplnené prázdnymi znakmi.

Povolené rozšírenia

Všetky povolené rozšírenia by mali obsahovať povinne nasledujúce kľúčové slová v poradí uvedenom v nasledujúcej tabuľke.

Tab. č. 3.

XTENSION
BITPIX
NAXIS
NAXISn, n = 1, ..., NAXIS
...
(rôzne kľúčové slová)
...
PCOUNT
GCOUNT
...
END /posledné kľúčové slovo

Žiadne iné kľúčové slová nie sú povolené medzi XTENSION a NAXISn.

Počet bitov N v dátovom poli rozšírenia, ktoré budú zaberať dáta, sa vypočíta ako :
N = |BITPIX| * GCOUNT * (PCOUNT + NAXIS1 * NAXIS2 * ...* NAXISm. (1)

XTENSION je povinné kľúčové slovo pre hlavičku rozšírenia a nesmie sa uvádzať v primárnej hlavičke. Jeho hodnota je znakový reťazec, ktorý pomenúva dané rozšírenie. Pomenovanie nesmie byť zhodné s iným, už schváleným pomenovaním.

PCOUNT určuje dátovú štruktúru konzistentne s rovnicou (1). Hodnota je celé číslo.

GCOUNT určuje dátovú štruktúru konzistentne s rovnicou (1). Hodnota je celé číslo.

EXTEND Ak hlavička obsahuje toto kľúčové slovo a jeho hodnota je "T", tak daný FITS súbor môže, ale nemusí obsahovať rozšírenia. Toto kľúčové slovo musí nasledovať hneď za NAXISn. Ak hlavička neobsahuje slovo NAXISn, tak hneď za NAXIS.

Ďalšie rezervované kľúčové slová

Nie je ich málo, uvedieme si len niektoré zaujímavé. Môžte si pozrieť príklad na konci stránky, kde je skoro u každého kľúčového slova v komentári uvedený jeho význam.

DATE obsahuje dátum vytvorenia FITS súboru v tvare RRRR-MM-DDThh:mm:ss[.ddd]. V zátvorkach je nepovinná časť. (R ako rok, M ako mesiac, D ako deň, T je oddeľovač, h ako hodina, m ako minúta, s ako sekunda, d ako desatiny sekundy.)

OBSERVER obsahuje v znakovom reťazci meno pozorovateľa.

COMMENT je v podstate komentár. Nemá predpísanú hodnotu. 9. až 80. byte môže obsahovať ľubovoľný ASCII text.

BSCALE sa musí uvádzať vždy spolu s BZERO. Hodnota v dátovom poli FITS súboru väčšinou nekorešponduje s fyzikálnou veličinou. Hodnota BSCALE sa uvádza ako desatinné číslo a umožní nám previesť hodnoty v dátovom poli na fyzikálne hodnoty pomocou rovnice (2). Implicitná hodnota pre toto kľúčové slovo je "1.0".

Fyzikálna hodnota = BZERO + BSCALE * hodnota_v_dátovom_poli (2)

BZERO sa musí uvádzať vždy spolu s BSCALE. Hodnota BZERO sa uvádza ako desatinné číslo a určuje nám reálnu hodnotu fyzikálnej veličiny pri nulovej hodnote v dátovom poli, ako je uvedené v rovnici (2). Implicitná hodnota pre toto kľúčové slovo je "0.0".

BUNIT Hodnotou je znakový reťazec, ktorý určuje v akých fyzikálnych jednotkách sú čísla uvedené v BSCALE a BZERO. Mali by spĺnať štandart spomenutý v odstavci Jednotky.

Referencie

R. J. Hanisch, A. Farris, E. W. Greisen, W. D. Pence, B. M. Schlesinger, P. J. Teuben, R. W. Thompson and A. Warnock III
Definition of the Flexible Image Transport System (FITS)

Astronomy & Astrophysics 376, 359-380 (2001)

Ďaľšie odkazy:

O samotnom formáte

  1. The FITS Support Office at NASA/GSFC - Dobrý začiatok, ak sa chcete dozvedieť viac o formáte FITS.
  2. FITSIO - Knižnice pre programátorov podporujúce formát FITS:

Užitočné programy pre prácu, ktoré podporujú formát FITS

  1. fv - Program na zobrazovanie FITS súborov ľubovoľných dátových typov.
  2. Skycat - Program na zobrazovanie FITS súborov zo CCD snímkov. Vie zobrazovať informácie z internetových hviezdnych katalógov.
  3. VisAD - Dôkaz o tom, že formát FITS je podporovaný softvérom, ktorý nie je určený len pre astronómov.

Na záver ukážka

V nasledujúcej tabuľke si môžte pozrieť ako vyzerá hlavička súboru FITS, konkrétne sa jedná o spektrum hviezdy.
Súbor si môžte stiahnuť tu.

Tab. č. 4.

SIMPLE  =                    T / Fits standard                                  
BITPIX  =                  -32 / Bits per pixel    
NAXIS   =                    1 / Number of axes                                
NAXIS1  =                 1997 / Axis length                    
ORIGIN  = 'NOAO-IRAF FITS Image Kernel July 1999' / FITS file originator  
IRAF-TLM= '13:32:07 (26/01/2004)' / Time of last modification                  
EXTEND  =                    F / File may contain extensions                    
OBJECT  = 'SZ Cam  '           / Title of observation                           
DATE    = '2004-01-26T12:32:07'/ Date FITS file was generated                   
SYSVER  = 'BIAS-headers'       / Thu Nov 13 11:17:54 CET 2003                   
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= 'lf, Lenka, Zasche ' / Observers                                      
IMAGETYP= 'object'             / Type of observation, eg. FLAT                  
FILENAME= 'na220017.fit'       / BIAS filename                                  
TELESCOP= 'ZEISS-2m'           / 2m Ondrejov observatory telescope              
TELSYST = 'COUDE'              / Telescope setup - COUDE or CASSegrain          
EXPTIME =             2400.000 / Length of observation excluding pauses         
DARKTIME=             2400.000 / Length of observation including pauses         
EXPVAL  =                0.000 / Exposure value in photon counts [Mcounts]      
DATE-OBS= '2004-01-22'         / UTC date start of observation                  
TM_START=                66633 / 18:30:33                                       
TM_END  =                69062 / 19:11:02                                       
COMMENT =                      /                                                
COMMENT1=                      /                                                
UT      = '18:30:33'           / 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 =                  0.0 / Detector temperature                           
LN2TEMP =                  0.0 /                                                
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      = '4:08:14.6'          / 4.137389                                       
DEC     = '62:20:30.4'         / 62.341778                                      
EQUINOX =          2004.057495 / Equinox of RA and DEC                          
EPOCH   =          2004.057495 / Same as EQUINOX - for back compat.             
!MJD-OBS=                      / Modified Julian Date of midtime of observation 
!JD     =                      / Julian Date of midtime of observation          
ST      = '3:51:13.5'          / Local sidereal time at start of observation    
AZIMUTH =                175.7 / Mean azimuth of observation (degrees)          
ZD      =                 12.6 / Mean horizon-distance of observation (degrees) 
TELFOCUS=               -14.00 / Telescope focus (milimeters)                   
DOMEAZ  =                234.9 / Mean dome azimuth during observation           
AIRPRESS=                  961 / Atmospheric preasure in (hPa)                  
AIRHUMEX=                248.9 / Air humidity outside the dome                  
AIRHUMIN=                 69.1 / Air humidity inside the dome                   
OUTTEMP =                193.1 / Temperature outside of the dome                
DOMETEMP=                 -8.2 / Temperature inside the dome                    
SPECTEMP=                 24.4 / 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  =                    1                                                  
LTM1_1  =                   1.                                                  
WAT0_001= 'system=equispec'                                                     
WAT1_001= 'wtype=linear label=Wavelength units=angstroms'                       
TRIM    = 'Jan 23  3:01 Trim data section is [16:2012,430:570]'                 
OVERSCAN= 'Jan 23  3:01 Overscan section is [6:12,1:800] with mean=628.0942'    
ZEROCOR = 'Jan 23  3:01 Zero level correction image is Zero'                    
FLATCOR = 'Jan 23  3:01 Flat field image is Flat30.25.fit with scale=19537.26'  
CCDSEC  = '[16:2012,430:570]'                                                   
CCDPROC = 'Jan 23  3:01 CCD processing done'                                    
JD      =     2453027.28510421                                                  
LJD     =             2453027.                                                  
AIRMASS =             1.024402                                                  
UTMIDDLE= '18:50:33.0'                                                          
BANDID1 = 'spectrum - background none, weights variance, clean yes'             
APNUM1  = '1 1 14.75 63.23'                                                     
CTYPE1  = 'LINEAR  '                                                            
CRVAL1  =     6258.22572842875                                                  
CRPIX1  =                   1.                                                  
CDELT1  =    0.256658782204344                                                  
CD1_1   =    0.256658782204344                                                  
DC-FLAG =                    0                                                  
DCLOG1  = 'REFSPEC1 = na220017na220016.ms 0.4436231'                            
DCLOG2  = 'REFSPEC2 = na220017na220018.ms 0.55637687'                           
DISPCOR =                    0                                                  
HJD     =     2453027.28795303                                                  
VHELIO  =    -17.2080914960978                                                  
VLSR    =    -15.3853550815844                                         
VSUN    = '   20.    18.    30.  1900.'                                         
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                

                                                                                
END