pymatgenを利用した回折パターン計算
Last Update:2024/09/02
(2021年7月24日)
1. はじめに
Materials Projectとも連動しているpythonライブラリ pymatgenでは、さまざまな物質の特性を取り扱える便利なクラスが整備されている。その取り扱いやすさと充実した公式ドキュメントの存在からか、さまざまな解説記事がQiitaをはじめとしたインターネット上に公開されている。例えば、pymatgenの基本的な使い方に関しては次の記事が参考になるであろう。
- Materials Projectのクエリ機能を使用して所望の計算材料データを大量に取得する。
- Materials Projectで取得できるデータを徹底的に理解する!
- pythonでなんとなく材料研究者の気分を味わおう【pymatgen入門】
どのような計算ができるのかを色々と調べてみたところ、Materials ProjectのワークショップでX線回折(XRD)の計算方法が紹介されていた。(2024年9月現在ではアクセスできないが、https://github.com/materialsproject/workshop/releases から過去のワークショップ情報を閲覧できる。)本記事では、MateriApps LIVE! (ver. 4.1)上でpymatgen(ver. 2024.8.9)を使ったシリコンの回折パターン計算の方法を紹介する。ワークショップのページではXRDについて解説しているが、公式ドキュメントをみるとXRD以外にも透過電子顕微鏡(TEM)や中性子回折(ND)のパターンも計算できそうである。そのため、今回のスクリプトではXRD, TEM, ND全ての結果の出力を試みる。
2.計算環境とコードの準備
MateriApps LIVE!の基本的な使い方は他ページにも記載されているので、ここでは割愛する。まず、MateriApps LVIE!を起動して、左下のメニューからSystem Tools -> LXTerminalを選択してターミナルを起動する。ターミナルが立ち上がったら、次のコマンドを実行して実行ディレクトリを作成する。
mkdir mp
cd mp
今回使用したMateriApps LIVE!にはpymatgenがインストールされていなかったので、次のコマンドを実行してインストールする。
sudo apt install python3-setuptools
python3 -m pip install pymatgen kaleido mp-api
sudo実行時にパスワードを求められるが、これはMateriApps LIVE!にログインした時に使用したものを入力してエンターキーを押せば実行される。ちなみにkaleidoはTEMの出力時に使うパッケージである。(詳しくはこちらを参照。)
最後にpythonスクリプト calcDiffraction.pyをダウンロードする。
wget https://ma.issp.u-tokyo.ac.jp/wp-content/uploads/sites/3/2024/09/calcDiffraction.py
calcDiffraction.pyを実行する前に、calcDiffraction.pyをmousepad等で開いて”USER API KEY”の箇所を自分のAPIキーに書き換える。これで準備は完了である。
3.実行結果
python3 calcDiffraction.py
を実行するとシリコン(mp id=149のデータ)のXRD, ND, TEMの結果が、実行ディレクトリ下に出力される。例えば、XRDの結果が出力されているsi_xrd.pngを開くと次のような結果になっている。
今回のスクリプトでは2θは90°までしかとっていないが、その範囲でのピーク位置の結果は
https://next-gen.materialsproject.org/materials/mp-149
のものと一致していそうである。
4. スクリプトの詳細
最後に今回実行したcalcDiffraction.pyについて簡単に説明する。
9-22行目ではMaterials Projectからシリコン(mp-149)の結晶構造データをダウンロードしている。結果はSi_structureに格納されている。その後、mp id=149のページ中段にあるPropertiesのSpectra/DiffractionPatterns/APIに記載されているように、SpacegroupAnalyzerを使ってconventional cellに変換する。なお、14行目や20行目のコメントアウト(#マーク)を削除すると、どのような構造データになっているかを確認できる。
#Get structure info of Si (mp-149)
with MPRester( MY_API_KEY ) as m:
Si_structure = m.get_structure_by_material_id("mp-149")
#check Si_structure
#print(Si_structure)
#see Spectra/DiffractionPatterns/API on https://next-gen.materialsproject.org/materials/mp-149
from pymatgen.symmetry.analyzer import SpacegroupAnalyzer
sga = SpacegroupAnalyzer(Si_structure)
Si_conv_structure = sga.get_conventional_standard_structure()
#print(Si_conv_structure)
target_structure=Si_conv_structure
24-31行目では、target_structureからXRDの計算とその出力を行なっている。公式ドキュメントをみるとXRDCalculatorの引数で波長などを指定することができるようだ。今回は特に指定をしていないので全てデフォルト値が採用されている。結果の出力にはplot_structuresというメソッドを使っているが、代わりにget_plotメソッドを使っても出力することができる。(詳細はこちらを参照。)なお、plot_structuresでの構造データに関する引数はlistで渡す必要があることに注意が必要である。
プロットせずに結果だけを求めたい場合はget_patternメソッドを使う。スクリプト中にコメントアウトしてあるので興味があればコメントアウトを外して実行してみてほしい。
# X-ray diffraction
xrd = XRDCalculator()
xrd_pattern = xrd.plot_structures(
[target_structure],
two_theta_range=[0, 90],
show=False,
savefig="si_xrd.png"
)
34-41行目ではNDを、44-50行目ではTEMの計算を行なっている。NDはXRDとほとんど同じ使い方で実行することができる。TEMの場合もビーム条件を変更することができる。詳細は公式ドキュメントを参照していただきたいが、TEMの図の形式にはmatplotlibではなくplotlyが使われているので注意が必要。
# Neutron diffraction
nd = NDCalculator()
nd_pattern = nd.plot_structures(
[target_structure],
two_theta_range=[0, 90],
show=False,
savefig="si_nd.png"
)
# TEM
tem = TEMCalculator()
tem_pattern = tem.get_plot_2d(
target_structure
)
#Output (plotly)
tem_pattern.write_image("si_tem.png")
5. まとめ
今回はpymatgenを使ってシリコンの回折パターンを計算した。pymatgenには他にも色々な機能が実装されているので、今後も色々と試してみたい。
#2024/9/2: 新しくなったMaterials Project APIへの対応、および公式サイトに対応するようスクリプトと本文を修正