cfitsioで16-bit unsigned integerを扱う例

cfitsioを用いたFITSファイルを生成するプログラムを書いているときに混乱したので、メモしておきます。

cfitsioはextensionとしてunsigned型の整数を読み書きする機能を提供しています。詳細はオフィシャルのユーザマニュアルの

で説明されています。

要点は、カラム型としてUがuint16_tに、Vがuint32_tに対応しており、fits_write_col()するときに、TUSHORTやTUINTで値を渡すせばOKです。ヘッダーの絡む定義部に自動的に適切なTZERO/TSCALが記入され、unsigned型で読み書きができるようになります。

例題の一部を抜き出すと、

カラム定義

1
2
3
char* ttype[] = { (char*) "UNSIGNED_16BIT_INT" };
char* tform[] = { (char*) "1U" };
char* tunit[] = { (char*) "" };

カラムへの書き込み

1
2
3
4
5
6
7
8
9
10
11
uint16_t x[nElements]={0, 32767, 32768, 32769, 65535};

for(int rowIndex=1;rowIndex<=nElements;rowIndex++){
 void* bufferPointer=x+rowIndex-1;
 fits_write_col(file, TUSHORT, columnIndex, rowIndex, firstelem, 1, bufferPointer, &fitsStatus);
 if(fitsStatus){
 printf("Error while writing unsigned 16-bit value to row %d.\n", rowIndex);
 fits_report_error(stderr, fitsStatus);
 exit(-1);
 }
 }

例題の全ソースコードはmain.ccからダウンロードしてください。 コンパイルは、以下のようにしてください。

1
clang++ -std=c++11 -stdlib=libc++ -o main main.c  -lcfitsio

実行するとsample.fitsが生成され、fv等で開くと、以下のように値が詰まっているはずです。

ヘッダ部は以下のように、TZEROとTSCALが設定されます。