238 fitsfile *fp=
nullptr;
240 char errdescr[FLEN_STATUS+1];
243 fits_open_file(&fp, filepath_filter.
Data(), READONLY, &status);
244 if (status)
goto ERR;
248 fits_get_hdu_num(fp, &hdunum);
253 fits_get_hdu_type(fp, &hdutype, &status);
254 if (status)
goto ERR;
259 char keyname[FLEN_KEYWORD+1];
260 char keyvalue[FLEN_VALUE+1];
261 char comment[FLEN_COMMENT+1];
263 fits_get_hdrspace(fp, &nkeys, &morekeys, &status);
264 if (status)
goto ERR;
268 for (
int i = 1; i <= nkeys; i++) {
269 fits_read_keyn(fp, i, keyname, keyvalue, comment, &status);
270 if (status)
goto ERR;
280 for (
int i = 0; i < nkeys; i++) {
281 if (
fRecords[i].fKeyword ==
"EXTNAME") {
289 Info(
"LoadHDU",
"The selected HDU contains an Image Extension");
292 long *param_dimsizes;
295 fits_get_img_dim(fp, ¶m_ndims, &status);
296 if (status)
goto ERR;
297 if (param_ndims > 0) {
299 param_dimsizes =
new long[param_ndims];
300 fits_get_img_size(fp, param_ndims, param_dimsizes, &status);
302 delete [] param_dimsizes;
308 for (
int i = 0; i < param_ndims; i++) {
309 fSizes->SetAt(param_dimsizes[i], i);
312 delete [] param_dimsizes;
316 long *firstpixel =
new long[param_ndims];
320 for (
int i = 0; i < param_ndims; i++) {
321 npixels *= (long)
fSizes->GetAt(i);
325 double *pixels =
new double[npixels];
327 fits_read_pix(fp, TDOUBLE, firstpixel, npixels,
328 (
void *) &nulval, (
void *) pixels, &anynul, &status);
331 delete [] firstpixel;
338 delete [] firstpixel;
347 Info(
"LoadHDU",
"The selected HDU contains a Table Extension");
353 fits_get_num_rows(fp, &table_rows, &status);
354 if (status)
goto ERR;
358 fits_get_num_cols(fp, &table_cols, &status);
359 if (status)
goto ERR;
370 fits_get_colname(fp, CASEINSEN, (
char*)
"*", colname, &colnum, &status);
371 while (status == COL_NOT_UNIQUE)
374 fits_get_colname(fp, CASEINSEN, (
char*)
"*", colname, &colnum, &status);
376 if (status != COL_NOT_FOUND)
goto ERR;
380 fCells =
new union Cell [table_rows * table_cols];
388 for (colnum = 0, cellindex = 0; colnum <
fNColumns; colnum++) {
389 fits_get_coltype(fp, colnum+1, &typecode, &repeat, &width, &status);
391 if (status)
goto ERR;
393 if ((typecode == TDOUBLE) || (typecode == TSHORT) || (typecode == TLONG)
394 || (typecode == TFLOAT) || (typecode == TLOGICAL) || (typecode == TBIT)
395 || (typecode == TBYTE) || (typecode == TSTRING)) {
397 if (typecode == TSTRING) {
402 fits_get_col_display_width(fp, colnum+1, &dispwidth, &status);
403 if (status)
goto ERR;
406 char *nulval = (
char*)
"";
410 if (dispwidth <= 0) {
414 array =
new char* [table_rows];
415 for (
long row = 0; row < table_rows; row++) {
416 array[row] =
new char[dispwidth+1];
420 fits_read_col(fp, TSTRING, colnum+1, 1, 1, table_rows, nulval, array, &anynul, &status);
422 for (
long row = 0; row < table_rows; row++) {
423 delete [] array[row];
431 for (
long row = 0; row < table_rows; row++) {
432 strlcpy(array[row],
"-",dispwidth+1);
437 for (
long row = 0; row < table_rows; row++) {
438 fCells[cellindex++].fString = array[row];
451 double *array =
nullptr;
452 char *arrayl =
nullptr;
456 if (typecode == TLOGICAL) {
457 arrayl =
new char[table_rows * repeat];
458 fits_read_col(fp, TLOGICAL, colnum + 1, 1, 1, table_rows * repeat, &nulval, arrayl, &anynul,
465 array =
new double[table_rows * repeat];
466 fits_read_col(fp, TDOUBLE, colnum + 1, 1, 1, table_rows * repeat, &nulval, array, &anynul,
476 array =
new double[table_rows];
477 for (
long row = 0; row < table_rows; row++) {
486 if (typecode == TLOGICAL) {
487 for (
long row = 0; row < table_rows; row++) {
488 int temp = (
signed char)arrayl[row];
493 for (
long row = 0; row < table_rows; row++) {
494 fCells[cellindex++].fRealNumber = array[row];
498 }
else if (repeat > 1) {
501 if (typecode == TLOGICAL) {
502 for (
long row = 0; row < table_rows; row++) {
503 double *
vec =
new double[repeat];
504 long offset = row * repeat;
505 for (
long component = 0; component < repeat; component++) {
506 int temp = (
signed char)arrayl[offset++];
513 for (
long row = 0; row < table_rows; row++) {
514 double *
vec =
new double[repeat];
515 long offset = row * repeat;
516 for (
long component = 0; component < repeat; component++) {
517 vec[component] = array[offset++];
525 }
else if (typecode < 1) {
538 for (
long row = 0; row < table_rows; row++) {
542 fits_read_descript(fp, colnum+1, row+1, &repeat_row, &offset, &status);
548 for (
long row = 0; row < table_rows; row++) {
567 std::vector<short> data;
569 fits_read_col(fp, abstype, colnum + 1, row + 1, 1, nelements, &nulval, data.data(), &anynul, &status);
570 for (
int i = 0; i <
size; i++)
571 vec->SetAt(data[i], i);
572 }
else if (abstype == 41) {
573 std::vector<int> data;
575 fits_read_col(fp, abstype, colnum + 1, row + 1, 1, nelements, &nulval, data.data(), &anynul, &status);
576 for (
int i = 0; i <
size; i++)
577 vec->SetAt(data[i], i);
578 }
else if (abstype == 42) {
579 std::vector<float> data;
581 fits_read_col(fp, abstype, colnum + 1, row + 1, 1, nelements, &nulval, data.data(), &anynul, &status);
582 for (
int i = 0; i <
size; i++)
583 vec->SetAt(data[i], i);
584 }
else if (abstype == 82) {
585 std::vector<double> data;
587 fits_read_col(fp, abstype, colnum + 1, row + 1, 1, nelements, &nulval, data.data(), &anynul, &status);
588 for (
int i = 0; i <
size; i++)
589 vec->SetAt(data[i], i);
591 Error(
"LoadHDU",
"The variable-length array type in column %d is unknown", colnum + 1);
597 Warning(
"LoadHDU",
"error opening FITS file. Column type %d is currently not supported", typecode);
601 if (hdutype == ASCII_TBL) {
610 fits_close_file(fp, &status);
614 fits_get_errstatus(status, errdescr);
615 Warning(
"LoadHDU",
"error opening FITS file. Details: %s", errdescr);
617 if (fp) fits_close_file(fp, &status);
666 fitsfile *fp=
nullptr;
668 char errdescr[FLEN_STATUS+1];
669 int hducount, extnum;
670 int hdutype = IMAGE_HDU;
672 char extname[FLEN_CARD]=
"PRIMARY";
673 int verbose = (opt[0] ? 1 : 0);
676 fits_open_file(&fp,
fBaseFilePath.Data(), READONLY, &status);
677 if (status)
goto ERR;
680 fits_get_num_hdus(fp, &hducount, &status);
681 if (status)
goto ERR;
682 printf(
"Total: %d HDUs\n", hducount);
687 fits_get_hdu_type(fp, &hdutype, &status);
688 if (status)
goto ERR;
690 if (hdutype == IMAGE_HDU) {
692 }
else if (hdutype == ASCII_TBL) {
693 exttype=
"ASCII TABLE";
695 exttype=
"BINARY TABLE";
700 char keyname[FLEN_KEYWORD+1];
701 char keyvalue[FLEN_VALUE+1];
702 char comment[FLEN_COMMENT+1];
704 fits_get_hdrspace(fp, &nkeys, &morekeys, &status);
705 if (status)
goto ERR;
709 for (
int i = 1; i <= nkeys; i++) {
710 fits_read_keyn(fp, i, keyname, keyvalue, comment, &status);
717 records[i-1].
fValue = keyvalue;
720 if (strcmp(keyname,
"EXTNAME") == 0) {
722 strlcpy(extname, keyvalue,FLEN_CARD);
727 printf(
" [%d] %s (%s)\n", extnum, exttype, extname);
731 for (
int i = 0; i < nkeys; i++) {
733 printf(
" %-10s = %s / %s\n", records[i].fKeyword.Data(), records[i].
fValue.
Data(), records[i].
fComment.
Data());
735 printf(
" %-10s = %s\n", records[i].fKeyword.Data(), records[i].
fValue.
Data());
746 fits_movrel_hdu(fp, 1, &hdutype, &status);
747 if (status)
goto ERR;
752 fits_close_file(fp, &status);
756 fits_get_errstatus(status, errdescr);
757 Warning(
"PrintFileMetadata",
"error opening FITS file. Details: %s", errdescr);
759 if (fp) fits_close_file(fp, &status);