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.
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.
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ář
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
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
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.
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, poleMinimá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 ENDVš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_hdrV programu DS9 vypadá výsledný FITS soubor takto