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が設定されます。