フラットパネルセンサによるデータ(浜松ホトニクス/HiPic)の処理

SPring8での実験など浜松ホトニクス社製フラットパネルセンサのデータを用いる際は、大抵「HiPic」という データ収集ソフトでデータを収集、保存することになります。この際のデータ形式はITEX形式で、 ヘッダのコメント部に測定器(フラットパネルセンサ)などの情報が入っています。
HiPicに関しては、CCDデータ(浜松ホトニクス/HiPic)の処理の話と同じなのですが、 フォーマットはVer.8.3(@SPring8/BL40B2)でも、CCDのVer.6.0(@SPring8/BL45XU)と同様の形式のようです。
ただし、ITEX形式として、32bitのITEXとなっているようで、 従来の処理ソフト(たとえばfit2d)が使えない、 といった問題があるようです。
そこで、従来の形式に戻すプログラムを書いてみました。こちらを参照。

itex2itex hipicfile -s outputfile
のようにすれば、従来の16bit形式になります。C9728DK-10では データ出力は14bitのようなので、これでもデータロスはありません。いずれはもっとダイナミックレンジの大きい デバイスが使用されるかもしれませんが、どうしても以前の形式にしたいなら、16bit(実際には符号付きなので15bit)に 納まるように、何倍かしたほうがいいでしょう(-mオプション)。
なお、ITEX形式ではなく、TIFF形式で保存しておくと、fit2dで読めるようです。

フラットパネルセンサでは、II+CCDとは異なり、像の歪みはないはずなので、X線回折での通常の方法で カメラ長を調べることが出来るはずです。Direct Beam Positionが画像の中にあればいいのですが、そうでない場合も、 何らかの方法で中心位置を決定できなければなりません。
実際には、カメラ長決定用のキャリブレーションデータ(SAXSだとステアリン酸鉛など)を用いることになるでしょう。 その他、CCDと同様に暗電流値データ、(必要ならば)セルのみの空データなどを採っておきます。

実際の処理法は人それぞれのようですが、SPring8などでは各BLである程度の処理法を準備していると思います。
また、自分でプログラムを書いてもいいでしょうし、既存のソフトをうまく利用する手もあります。
私は一旦RigakuのR-AXIS形式に変換してから処理する方法しか思いつきません。
X線のIP(Imaging Plate)ではR-AXISが多く用いられており、R-AXISでの処理方法を利用できるからです。
まず、"ipitex2rax"(拙作iputilsに含まれます)でHiPicのファイルからR-AXISのファイルに変換。
この際には、

ipitex2rax hipicfile -hp -tm -cl:CameraLength -dx:PxlSizeX -dz:PxlSizeZ outfile
のようにして変換し、なるべくHiPicの情報を有効に利用できるようにします。
そのファイルをR-AXISのDisplay等で開き、中心を決定します。 場合によってはTIFFファイルしか保存していないかもしれません。その場合は、
iptiff2rax hipicfile -cl:CameraLength -dx:PxlSizeX -dz:PxlSizeZ outfile
のようにすれば、同じように処理できます。
もしくは、TIFFファイルのままで適切なソフトでTIFFファイルを開き、中心やカメラ長を決めます。
決定した値は、RigakuのR-AXISのヘッダエディットや拙作"ipedit"を用いてファイル中に書き込んでおいた方がいいでしょう。 例えば後者では、
ipedit -t -26:WaveLength -31:CameraLength -45:DirectX -46:DirectZ ImageFile
のようにして、波長、カメラ長、中心座標(X,Z)を指定します。なお、ピクセルサイズは上記例では"ipitex2rax"を実行する際に既に 指定しています。
他に修正したい情報があれば、同様に修正します。
これで変換に必要な情報はそろったので、実際の実験データに対して、順次変換していきます。

まず、暗電流などの補正データを、上記のデータを使い、以下の手順で補正します。

ipitex2rax hipicfile -hp -tm -cl:CameraLength -dx:PxlSizeX -dz:PxlSizeZ raxisfile
または iptiff2rax hipicfile -cl:CameraLength -dx:PxlSizeX -dz:PxlSizeZ raxisfile
ipedit -t -26:WaveLength -31:CameraLength -45:DirectX -46:DirectZ raxisfile ipsub -f1:raxisfile -f2:dark_raxisfile -f2:-1.0 -replace

次いで、全てのデータを変換するシェルスクリプトを作成し、実行します。
プロファイル化も含め、以下のスクリプトでどうでしょう?
データのあるディレクトリに移動し、適当な引数をつけて実行します。

---ここから---
#!/bin/sh

if [ $# -ne 6 ]; then
	echo "sp8_01.sh ... A data converter itex -> rax, and get profile"
	echo "Usage : sp8_01.sh basename destdir centreX centreZ cameraLength reffile"
	exit 1;
fi

base=$1	#ファイル名の共通部分
dest=$2	#作業ディレクトリ
centreX=$3	#ダイレクトビームのX座標
centreZ=$4	#ダイレクトビームのZ座標
length=$5	#カメラ長(mm)
reffile=$6	#暗電流データファイル(変換後)
lines=0

if [ ! -d $2 ]; then
	mkdir $2
fi

if [ ! -d $2 -o ! -w $2 ]; then
	echo "Error !! $2 does not exist or is not writable."
	exit 1
fi

if [ -f ${base}/${base}.csv ]; then
	echo "Error !! $2/$2.csv already exists."
	exit 1
fi

if [ ! -f ${reffile} ]; then
	echo "Error !! reffile does not exist."
	exit 1
fi

num=0
trap 'exit 1' 1 2 3 9 15

function calcfunc()
{
	# ファイル名の設定
	ipname=${dest}/${basename}IP.img
	# ITEX形式からIP形式へ
	ipitex2rax -q ${i} -hp -dx:0.05 -dz:0.05 ${ipname}
	if [ $? -ge 1 ]; then
		echo "Error in ipitex2rax"
		exit 1
	fi
	# IP形式のヘッダの編集 (暗電流ファイルと同じ設定でなければならない)
	ipedit -31:${length} -36:0 ${ipname}
	if [ $? -ge 1 ]; then
		echo "Error in ipedit"
		exit 1
	fi
	# 暗電流を差し引く
	ipsub -q -f1:${ipname} -f2:${reffile} -m2:-1.0 -replace
	if [ $? -ge 1 ]; then
		echo "Error in ipsub"
		exit 1
	fi
	csvname=${dest}/${basename}.csv
	if [ ${num} -eq 0 ]; then
		# 最初のファイルの一次元プロファイル化
		echo "#deg.,${basename}" > ${csvname}
		ipprofile -q ${ipname} -f -sh -mx -sl -dt -xc:${centreX} -zc:${centreZ} - | \
			sed -n '1,3! s/\ *\([^ ]*\)\ ,\ *\([^ ]*$\)/\1,\2/p' >> ${csvname}
		if [ $? -ge 1 ]; then
			echo "Error in ipprofile"
			exit 1
		fi
		lines=`wc -l ${csvname} | sed 's/\ *\([0-9]*\).*/\1/'`
		lines=`expr ${lines} - 1`
		nextargs=${csvname}
	else
		# 2つ目以降のファイルの一次元プロファイル化
		echo "${basename}" > ${csvname}
		ipprofile -q ${ipname} -f -sh -mx -sl -dt -xc:${centreX} -zc:${centreZ} - | \
			cut -f 2 -d \, -s | sed -n '1! s/\ *\([^ ]*\)/\1/p' >> ${csvname}
		if [ $? -ge 1 ]; then
			echo "Error in ipprofile"
			exit 1
		fi
		nextargs=${nextargs}\ ${csvname}
	fi
	num=`expr ${num} + 1`
}

# 連続処理
if [ -f ${base}_0001.img ]; then
	for i in ${base}_[0-9][0-9][0-9][0-9].img
	{
		echo "Trying to ${i} ........"
		basename=`echo ${i} | sed 's/\(.*\)\.img$/\1/'`
		calcfunc
	}
else
	for i in ${base}.[0-9][0-9][0-9][0-9]
	{
		echo "Trying to ${i} ........"
		basename=`echo ${i} | sed 's/\(.*\)\.\([0-9][0-9][0-9][0-9]\)$/\1_\2/'`
		calcfunc
	}
fi

# CSVファイルのマージ
if [ ${lines} -ne 0 ]; then
	paste -d \, ${nextargs} | head -n ${lines} > ${dest}/${base}.csv
else
	echo "Unexpected Error."
	exit 1;
fi

exit 0
---ここまで---
一次元プロファイルを作成し、最後にそれらをマージして大きなCSVファイルにしています。
WinXP上のcygwinで動作しました(但し、改行コードに注意)。
TIFFからの場合、ipitex2raxの部分をiptiff2raxに変えて"-hp"オプションを消し、 ファイル名の周辺を書き換える必要があります。
ファイル名の連番部分が4桁でない場合、連続処理を行っている部分のワイルドカードや正規表現などを 書き換えなければなりません。
また、2θではなくqに対してプロファイルをとる場合、波長の指定も必要になります。 [2010.11.19][2010.12.6追記]

R-AXISがない場合、中心やカメラ長を決めるには、fit2dが便利なようです(32bit ITEX形式以外)。
起動後のメニューの「POWDER DIFFRACTION(2-D)」から「INPUT」で画像ファイルを読み込み、 「BEAM CENTRE」の「CIRLE COORDINATES」でデバイリング上の3点以上をクリックして指定すれば、 中心と半径を決定してくれるようです。
但し、デバイリング上の点のクリックの精度が問題となりますから、より多くの点を指定しておけば、 それら全ての点を使って決定してくれるようなので、精度はよくなります。
更に、「INTEGRATE」で波長やピクセルサイズなどを適切に指定すれば、一次元プロファイルを 計算できるようです。[2010.12.6]


GO PREV.つるたにの自己紹介へ戻る
GO PREV.つるたにのホームページへ戻る
turutani@scphys.kyoto-u.ac.jp