gpt4 book ai didi

c++ - 使用 CFITSIO 库从 FITS 表中读取可变长度数组

转载 作者:行者123 更新时间:2023-12-01 13:47:56 24 4
gpt4 key购买 nike

我很难从 FITS 表的条目中读取可变长度数组,使用 CFITSIO 库(由于我正在开发的另一个软件,我必须使用它们)。

现在,我试图阅读的 FITS 表如下所示:

enter image description here

如您所见,最后三列的单元格中没有标量值,而是包含可变长度数组。
CFITSIO文档对于这种特殊情况不是很有帮助:大多数基本例程被认为是通过直接读取常规列来生成数组(在其单元格中带有标量,请参阅 https://heasarc.gsfc.nasa.gov/docs/software/fitsio/c/c_user/node46.html 的第 2 节)。fits_read_col不适用于此数据结构。

现在推荐使用fits_read_descript读取变量列时的例程。问题在于该函数返回低级信息,特别是存储数组的堆中的起始偏移量(参见 https://heasarc.gsfc.nasa.gov/docs/software/fitsio/c/c_user/node82.html 的第 7 节)。
因此,即使我在包含多个数组的单元格上获得低级信息,也不清楚如何使用它来获取数值!

CFITSIO Iterators略有帮助,并且没有具有如此复杂数据结构的示例。

以前有人这样做过吗?是否有人能够使用 CFITSIO 生成片段?读取变长数组?这将是非常有帮助的。

我截取的FITS文件可以在here找到.

这是打开文件并检查列和行的暂定片段,应用建议的 fits_read_descript可变长度列的函数。我不知道如何进一步进行,因为我不知道如何利用返回的参数来获取表中的实际数值。

#include "fitsio.h"
#include <iostream>

int main(){

fitsfile *fp = 0; // pointer to fitsfile type provided in CFITSIO library
int status = 0; // variable passed down to different CFITSIO functions

// open the fits file, go to the Header Data Unit 1 containing the table
// with variable-length arrays
fits_open_file(&fp, "rmf_obs5029747.fits[1]", READONLY, &status);

// read HDU type
int hdutype;
fits_get_hdu_type(fp, &hdutype, &status);
std::cout << "found type " << hdutype << " HDU type." << "\n";

// read number of rows and columns
long nTableRows;
int nTableCols;
fits_get_num_rows(fp, &nTableRows, &status);
fits_get_num_cols(fp, &nTableCols, &status);
std::cout << "the table has " << nTableRows << " rows" << "\n";
std::cout << "the table has " << nTableCols << " columns" << "\n";

// loop through the columns and consider only those with a negative typecode
// indicating that they contain a variable-length array
// https://heasarc.gsfc.nasa.gov/docs/software/fitsio/c/c_user/node29.html
int typecode;
long repeat;
long width;
long offset;

for (int colnum = 0; colnum < nTableCols; ++colnum) {
fits_get_coltype(fp, colnum+1, &typecode, &repeat, &width, &status);
if (typecode < 1) {
std::cout << "->column " << colnum << " contains a variable-length array" << "\n";
std::cout << "->examining its rows..." << "\n";
// loop through the rows
for (int rownum = 0; rownum < nTableRows; ++rownum)
fits_read_descript(fp, colnum, rownum, &repeat, &offset, &status);
}
}
}

最佳答案

只是一个想法,可能你可能已经看到了这个/想到了这个,但以防万一,如果你还没有。

fits_get_col_display_width() = 知道可用的字符数

如果 fits_read_descript() 给出数组中的元素数和起始偏移量,是否可以将总字节数读入字符串并使用分隔符“,”进行标记并获取数字?

关于c++ - 使用 CFITSIO 库从 FITS 表中读取可变长度数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60509665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com