[ English Page is HERE. ]
リガク(理学電機)の粉末回折計 RAD2 システム用のユーティリティです。
RAD2 は Bragg-Brentano タイプの実験室型粉末回折計で, やや古いシステムですが今でも現役で使っています。 測定データは独自形式のバイナリ形式で保存されますが,アスキーデータに変換するプログラム "UCONV.BAS" が付属しています。
しかし,測定ステップをあまり細かくすると,データが大きくなり過ぎて, "UCONV.BAS" ではアスキーデータに変換できないという不都合が起きます。 そこで,データの形式を解析して,アスキー形式に変換するプログラムを 独自に作ることにしました。
強度データは測定時に指定したファイル名で保存されますが,測定条件などを記録した INDEX ファイルも 書き換えられます。 強度データファイルの内容を調べると,16ビットの整数データで保存されていることがわかりました。 コントローラのプロセッサはインテルの 8086 なので,ビットの並びはリトルエンディアン, つまり,下位バイトから順に並んでいるようです。 この整数データをグラフに描いてみると "UCONV.BAS" で変換された結果と微妙に違っています。 "UCONV.BAS" ではデータを単にアスキー変換しているだけではないようです。 しかし,"UCONV.BAS" ではデータの変換をしている部分が機械語で書かれているので すぐにはどのような変換がほどこされているかはわかりません。
この整数データを "UCONV.BAS" で変換した結果に対してプロットしてみると, 滑らかな曲線になりました(一致していたら傾き1の直線になるはずですね)。 ためしに対数ー対数プロットを取ってみると,今度は直線にのりました。 傾きはだいたい 0.5 で,切片は ln(256) くらいです。 つまり, y = x^2 / 256 という変換がほどこされていることがわかりました。
カウンティングにより強度を測定している場合には測定値の分布が Poisson 分布に従い, 誤差が少なくともカウント数の平方根ていどありますから, これは理にかなったデータの保存方法だといえるでしょう。 まともに 16 ビットの整数値だとすると 65535 カウントのデータまでしか扱えませんが, この方式だと,16 ビットで 65535^2/256 = 16776704 カウントのデータまで 扱えることになります。
今ならはじめから 32 ビット使えばいいじゃん,ということになりがちでしょうが, このような工夫は,メモリスペースを節約するだけでなくデータ転送速度を向上する ことにもつながるので,ぜひ見習いたいものだと思いました。
一方,INDEX ファイルの方は,これもバイナリ形式なのですが, "UCONV.BAS" の中では BASIC で 処理されているので構造はすぐにわかりました。 BASIC 独自の「ランダムアクセスファイル」という形式で,128 バイトごとを 1 ページとして管理されています。 数値パラメータはやはりバイナリの独自の形式でしたが, 変換の方法を記述したコードはそれほど難しくなく見つけることができました。
私自身は主に Macintosh を使っているのですが,研究室の他のメンバーは主に Windows パソコンを 使っているので,どちらでも使えるプログラムの方が便利です。 そこで,標準的な C 言語のライブラリを使ってプログラミングをすることにしました。 コンパイラは CodeWarrior で,一つのパッケージで Macintosh 用と Windows 用の両方のアプリケーションプログラム を作成できます。 ファイルシステムをちゃんと管理しようとするとコードがややこしくなるので, 「実行形式のアプリケーションと同じフォルダ(ディレクトリ)にあるファイルのみを扱う」 ことにしてしまいました。 他のフォルダにあるファイルの処理や Drag & Drop 操作などは,もし必要ならシェルスクリプトなどで 対応できるでしょう。
はじめに強度データを変換するだけのプログラム "rint.c" を作りました。 しかし,これだと変換後のデータが強度データしか含まないので,測定角度範囲などがわかりません。 "UCONV.BAS" の中では INDEX ファイルの内容をアスキーデータに変換してヘッダとして付加しているので, この部分を C 言語にコーディングしなおすことにしました。 これが "rindex.c" です。
この2つのプログラムをつなぎ合わせて使いやすくしたのが "rint2.c" です。 ほとんどの場合に "rint2.c" を使うのが便利だろうと思います。
実際に使ってみると,RAD2 のコントローラ上の "UCONV.BAS" でフロッピーディスク上のデータに 対して処理をおこなうよりも, バイナリデータを Windows パソコンのハードディスクにコピーしたものに対して "rint2" で処理を行った方が,当然のことながら圧倒的に早くて便利です。
というわけで,このプログラムをソースコードも含めて公開することにしました。 著作権を放棄するつもりはありませんが,再配布も改変も自由なものと考えています。
私の C 言語のコーディングにはクセがあり,これは主に Pascal でのコーディングのスタイルの影響を受けています。 必ずしもおすすめできるものではないことをお断りしておきます。
下のリンクをクリックするとダウンロードします。