2

我有一个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。我给他们键名、格式和其他需要的信息,并将它们转换为列。最后,我将两个新列加入到原始表中(检查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)

当我将新表保存到新目录中时:

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中有三个表,我尝试在 OBJECTS 表中添加两列。
我需要newcatalog.cat也保持其他程序所需的相同结构,但它没有 OBJECTS 表,并且考虑到“元素数”和“数据字段数”,将 newtab 保存到表中# 2.

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

感谢您的帮助,我希望我能正确地构建关于 stackoverflow 的第一个问题。

4

1 回答 1

0

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

当你做类似的事情时

newtab = fits.BinTableHDU.from_columns(cols + orig_cols)
newtab.writeto('newcatalog.cat')

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

这里讨论了创建多扩展 FITS ,但您甚至不需要从头开始重新创建完整的 HDU 结构。返回的HDUList对象fits.open只是一个 HDU 列表,可以像普通 Python 列表一样进行操作(具有一些扩展,例如,支持通过 EXTNAME 进行索引)并写入文件:

 hdulist = fits.open(cat1)
 hdulist['OBJECTS'] = newtab
 hdulist.writeto('newcatalog.cat')
于 2015-09-28T12:58:31.063 回答