在这篇文章中,他们解释了如何从ascii文件生成拟合文件。但是,我也想知道如何将标题和数据定义到适合文件中。 (Converting ASCII Table to FITS image)
例如,当我调用带有星座的光谱拟合文件(从望远镜下载)时,我可以分别调用数据和标题。
即
In [1]:hdu = fits.open('observation.fits', memmap=True)
In [2]:header = hdu[0].header
In [3]:header
Out [3]:
SIMPLE = T / conforms to FITS standard
BITPIX = 8
NAXIS = 1
NAXIS1 = 47356
EXTEND = T
DATE = 'date' / file creation date (YYYY-MM-DDThh:mm:ss UT)
ORIGIN = 'XXX ' / European Southern Observatory
TELESCOP= 'XXX' / ESO Telescope Name
INSTRUME= 'Instrument' / Instrument used.
OBJECT = 'ABC ' / Original target.
RA = 30.4993 / xx:xx:xx.x RA (J2000) pointing
DEC = -20.0009 / xx:xx:xx.x DEC (J2000) pointing
CTYPE1 = 'WAVE ' / wavelength axis in nm
CRPIX1 = 0. / Reference pixel in z
CRVAL1 = 298.903594970703 / central wavelength
CDELT1 = 0.0199999995529652 / nm per pixel
CUNIT1 = 'nm ' / spectral unit
..
bla bla
..
END
In [3]:data = hdu[0].data
In [4]:data
Out [4]:array([ 1000, 1001, 1002, ...,
5.18091546e-13, 4.99434453e-13, 4.91280864e-13])
Lets assume, I have data like below
WAVE FLUX
1000 2.02e-12
1001 3.03e-12
1002 4.04e-12
..
bla bla
..
所以,我想用我自己的数据(带有自己的标题)生成一个光谱拟合文件。
迷你问题:现在让我们假设,我正确生成光谱拟合文件,但我意识到我忘了在X轴(1000,1001,1002,......)中取WAVE值的对数。如何在不触及Y轴(2.02e-12,3.03e-13,4.04e-13)的FLUX值的情况下进行此操作?
答案 0 :(得分:1)
FITS文件被组织为一个或多个HDU(标题数据单元),顾名思义,它包含一个数据对象(通常,用于观察的单个数组,有时像表格一样),以及标题与该数据一起使用的元数据。
要从头创建文件,尤其是图像,最简单的方法是直接创建ImageHDU
对象:
>>> from astropy.io import fits
>>> hdu = fits.ImageHDU()
就像从现有文件中读取HDU一样,此HDU具有(通常为空)标头,以及您可以分配给的空数据属性:
>>> hdu.data = np.array(<some numpy array>)
>>> hdu.header['TELESCOP'] = 'Gemini'
如果您满意,可以将HDU写入文件:
>>> hdu.writeto('filename.fits')
(注意:您将看到的许多文档演示了创建HDUList
对象的更复杂过程,将HDU附加到HDU列表,然后编写完整的HDU列表。这只是必要的如果您正在创建一个多扩展FITS文件。对于单个HDU,您可以直接使用hdu.writeto
,框架将处理其他结构细节。)
通常,您不需要操纵描述数据本身格式的标题 - 这是自动的,不应该手动触摸(FITS有将数据结构信息与实际元数据混合的不幸错误) 。您可以在此处查看有关如何操作FITS数据的更多示例:http://docs.astropy.org/en/stable/generated/examples/index.html#astropy-io
你的另一个问题涉及操纵图像的WCS(世界坐标系),特别是对于光谱数据,这可能是非平凡的。我会问一个单独的问题,关于你希望完成什么的更多细节。