RRUFFの粉末X線回折データで遊ぶ(20260128作成:最終更新20260130)
willemiteの測定回折パターンで検索したところ。ちゃんと候補に出ている。
前書き
RRUFFのラマンデータで遊ぶでRRUFFのラマンデータを使ったラマンスペクトルの検索プログラムを作ったのですが、それのindexを使ったプログラムの方を粉末X線パターンに書き直してみました。回折データもRRUFFが公開しているもの(dif)を使ってます。CODの結晶構造から作った粉末X線回折パターンを検索できるQualX2が既に存在するし、今使っているデータは3400個しかないので、有用かどうかは分かりませんが、鉱物については結構検索できると思います。またpython使っているのでOSには依存しません。その後、別の2万件以上あるdifデータでも検索できるようにしました(最後の方)。
RRUFF difデータ
RRUFFはラマンだけではなくX線回折パターンデータセット(それ以外にもIRスペクトル、結晶構造なども)もあって、RRUFFのサイトから自由にダウンロードすることができます。difデータはXPOWという結晶構造から粉末X線回折パターンを計算するプログラムで出力されたもののようです。dif.zipは実は2つあって、"Powder XRD"のところのものは3000個くらいしかありませんが、このdifとほぼ対応する粉末X線パターンデータ(XY_RAW.zip)が同じところにあるので、検索した後でパターン自体を比較するにはこちらの方が便利です。一方、"AMCSD"の方にあるdif.zipはもっとサイズが大きく2万程度のデータがあります。ただそれに対応する実測粉末X線パターンデータはありません(ピークリストがあるのでピーク位置を比較することは可能です)。今回は前者のdif.zipと同じところにあるXY_RAW.zipを使ってます。その後、後者でも検索プログラムを作りました(最後参照)。
indexファイルを使った検索
- 基本ラマンの時と同じです。プログラムはpythonで作成し、GUIにはTkinterを使ってます。
- "AMCSD"の方にあるdifの方はファイル名が*.difでフォーマットは統一されているようですが、"Powder XRD"のところのdifのデータは*.txtになっていて、フォーマットも結構バラバラな場合があります。
- データベースソフトは使わないで、テキストファイルで処理します。
- difデータ(回折ピークのd値が載っている)を1つづつ処理して、d値を強度高い方から10個拾って、それをindex_dif.txtファイルに書き込みます。ラマンの時と違って回折パターンからピークを検出する必要はありません。既にリストとしてdifにあるので。
- 別途検索用プログラムを作りました。プログラムではindex_dif.txtを最初に読み込んでおきます。次に同定したい観測粉末回折パターンを読み込んで、プロット、平滑化して、バックグラウンドを取り除いて10個ピーク検出してリストアップします。必要ならそこから使わないピークを選択できます。それをindex_dif.txtファイルと比較して、一致のよいものをリストアップします。リストアップしたものから選択されたものをXY_RAWの回折パターンとして表示して、観察パターンと一致しているかどうかはユーザーが判断します。一致度はポイント制で、強度高いもので一致するとポイントを高くしてます。また、逆にreferenceの強度高いものと一致するかもポイントに使ってます。なので正解ではなくてもピーク数が非常に多い相がリストに出てくることがあります。ここはもう少し改善の余地があると思います。
- 観察回折パターンはCu波長を使ったものを想定していて、相対波数と強度がカンマで区切られているcsvファイルかリガクのascファイルを想定してます。これは私の使っていた装置の関係です。もちろん別形式でも(プログラム直せば)対応できます。
- 楽するためになるべくnumpy, scipy等の機能を使います。たとえば平滑化はSavitzky-Golay法を使いますが、scipyのsignalにsavgol_filter()関数があるのでそれを使います。ピーク検出はscipy.signalのfind_peaks()関数を使います。
- 同定に使う観察回折パターンはほぼ単相のものを想定しています。不純物相のピーク位置が分かっている場合はそのピークを除外して検索することが可能です。主相以外の検索は現状できません。
- XY_RAWの回折パターンはCu Ka1,2で測定したもので、特に処理することなく観察パターンと比較してますが、私のデータはCu Ka1なので、ちょっとだけ違いがありますが、検索では問題になりません。
- プログラムは上からボタンをクリックしながらやっていけばほぼ自動的に処理されます。
- 手持ちのデータ10個ほどチェックして問題なく候補上位にリストアップされました。indexを使うので検索は一瞬です。
- ラマンと同じく鉱物名で検索してパターンを比較することもできます(一番下)。
- difとXY_RAWが完全に対応していないようなので、場合によってはパターンが見えないことが起こります。
- matplotlibのプロットでは下側のアイコンで拡大や回折角度範囲の移動などができます。
pythonコードのダウンロード("Powder XRD"のdifとXY_RAW用)
参考のためにコードを公開してます(Mac上で作成)。クリックするとファイル自体が開いてしまうので(その場合、セーブしてください)、リンク上で右クリックでダウンロードするを選んでください。また実際に使うためにはpythonライブラリの追加(matplotlib, numpy,scipyなど)、ファイルのディレクトリをPCに合わせて変更するなどが必要になります。Mac以外でも動くはずですが、フォントサイズがおかしいなどの問題があります(もちろんコードをいじれば直せますが)。
- index_dif.txtを作るプログラム。もちろんRRUFFのdif.zipデータとXY_RAW.zipをダウンロードしておく必要があります。ターミナルから実行する。download。もちろん以下のindex_dif.txtをダウンロードすればこれを使う必要はありません。
- 上記でdifデータセットから作ったindex_dif.txt。download
- 検索するプログラム。index_dif.txtとXY_RAWのデータが必要。これはTKinterを使ったGUIプログラムで、実行例で示しているものです。download
RRUFFのデータを使って鉱物同定などを行った場合はRRUFFを引用してください。https://www.rruff.net/about/に引用すべき論文が示されていてダウンロードできます。このプログラム自体については特に引用の必要はありません。
なお時々不具合を直してアップデートしています。
アリゾナクレーターの砂岩の粉末X線回折パターン(青)を検索したところ。石英が候補になっていて大体合う。余分なピークは共存するコーサイトによるもの。
(20260129追記)
別のdifデータを使った検索
以上は"Powder XRD"のところにあるdifデータを使っていたのですが、"AMCSD"の方にあるdif.zipはもっとサイズが大きく2万程度のデータがあります。折角なのでそちらでも検索できるようにしました。プログラム的にはほぼ同じなのですが、difに対応する実測回折データはないので、こちらではdifファイル内のピークリストからピーク位置を縦線で表示するようになってます。なので別プログラムとなってますが、操作は同じです。これだけ件数あれば鉱物検索には普通は十分ではないでしょうか?
測定とdifの計算強度があまり合ってないのに気づきました。なぜでしょうか?測定は通常のブラッグーブレンタノ式粉末X線回折装置です(SmartLab)。
pythonコードのダウンロード("AMCSD"のdif用)
参考のためにコードを公開してます(Mac上で作成)。クリックするとファイル自体が開いてしまうので(その場合、セーブしてください)、リンク上で右クリックでダウンロードするを選んでください。また実際に使うためにはpythonライブラリの追加(matplotlib,numpy,scipyなど)、ファイルのディレクトリをPCに合わせて変更するなどが必要になります。Mac以外でも動くはずですが、フォントサイズがおかしいなどの問題があります(もちろんコードをいじれば直せますが)。こちらは"AMCSD"の方のdif.zipをダウンロードして展開しておく必要があります。また上記のdifと共存させるためにこちら側のdifはdif2とディレクトリやindexファイルの名称を変えています。
- index_dif2.txtを作るプログラム。もちろんRRUFFの"AMCSD"のdifデータが必要。ターミナルから実行する。もちろん以下のindex_dif2.txtをダウンロードすればこれを使う必要はありません。
download
- 上記でdifデータセットから作ったindex_dif2.txt。download
- 検索するプログラム。index_dif2.txtとdif2のデータが必要。これはTKinterを使ったGUIプログラムで、実行例で示しているものです。download
アラゴナイトの粉末X線回折パターン(青)を検索したところ。こちらは粉末パターンではなく、ピーク位置と計算強度(赤線)で比較する。