如何使用 Python 将拟合 table 写入输出 LDAC 拟合目录

How can I write a fits table into an output LDAC fits catalog using Python

我有一个 LDAC 适合的目录,在 Python 代码中我需要将两个数组的元素作为两个新列添加到它。
我在python打开原目录:

from astropy.io import fits
from astropy.table import Table
import astromatic_wrapper as aw  

cat1='catalog.cat'
hdulist1 =fits.open(cat1)
data1=hdulist1[1].data

两个数组准备就绪,调用radec。我给他们键名、格式和其他需要的信息,并将它们转换为列。最后,我将两个新列加入到原始 table 中(检查 newtab.columnsnewtab.data 显示新列已成功附加)。

racol=fits.Column(name = 'ALPHA_J2000', format = '1D', unit = 'deg', disp = 'F11.7',array=ra)
deccol=fits.Column(name = 'DELTA_J2000', format = '1D', unit = 'deg', disp = 'F11.7',array=dec)

cols  = fits.ColDefs([racol, deccol])
tbhdu = fits.BinTableHDU.from_columns(cols)

orig_cols= data1.columns
newtab = fits.BinTableHDU.from_columns(cols + orig_cols)

当我将新 table 保存到新目录时:

newtab.writeto('newcatalog.cat')

这不是我需要的格式。如果我查看每个目录的描述

ldacdes -i 

我看到 catalog.cat :

> Reading catalog(s)  
------------------Catalog information----------------  
Filename:..............catalog.cat  
Number of segments:....3  

******  Table #1  
        Extension type:.........(Primary HDU)  
        Extension name:.........  

******  Table #2  
        Extension type:.........BINTABLE  
        Extension name:.........OBJECTS  
        Number of dimensions:...2  
        Number of elements:.....24960  
        Number of data fields...23  
        Body size:..............4442880 bytes  

******  Table #3
        Extension type:.........BINTABLE  
        Extension name:.........FIELDS  
        Number of dimensions:...2  
        Number of elements:.....1  
        Number of data fields...4  
        Body size:..............28 bytes  


> All done

对于新的:

> Reading catalog(s)  
------------------Catalog information----------------  
Filename:..............newcatalog.cat  
Number of segments:....2  

******  Table #1
        Extension type:.........(Primary HDU)
        Extension name:.........

******  Table #2
        Extension type:.........BINTABLE
        Extension name:.........
        Number of dimensions:...2
        Number of elements:.....24960
        Number of data fields...25
        Body size:..............4842240 bytes


> All done

如上所示,在原始目录catalog.cat中有三个table,我尝试在OBJECTS [=62]中添加两列=].
我需要 newcatalog.cat 也保持其他程序所需的相同结构,但它没有对象 table 并考虑到 "Number of elements" 和 "Number of data fields" newtab 被保存到 Table #2。

是否有控制输出适合目录格式的解决方案?

感谢您的帮助,我希望我能正确地组织我关于 Whosebug 的第一个问题。

我不太了解 LDAC 格式,但从您的示例文件 catalog.cat 来看,它似乎是一个 多扩展名 适合文件。也就是说,每个 table 都存储在一个单独的 HDU 中(对于包含具有不同列集的多个 table 的任何文件来说都是典型的)。

当你做类似

的事情时
newtab = fits.BinTableHDU.from_columns(cols + orig_cols)
newtab.writeto('newcatalog.cat')

您只是在创建一个新的二进制 table HDU 并将该 HDU 本身写入文件(连同强制性主 HDU)。您真正想要的是采用与原始文件相同的 HDU 结构,并将现有的 table HDU 替换为您添加了新列的 HDU。

讨论了创建多扩展 FITS 一些 here, but you don't even need to recreate the full HDU structure from scratch. The HDUList 来自 fits.open 的对象 return 只是一个 HDU 列表,可以像普通 Python 列表一样操作(有一些扩展,例如,支持通过 EXTNAME 建立索引)并写入文件:

 hdulist = fits.open(cat1)
 hdulist['OBJECTS'] = newtab
 hdulist.writeto('newcatalog.cat')