pymatgenを使ったMaterials Projectのデータ収集
Last Update:2021/12/09
(2020年2月1日)
1. はじめに
pymatgenは結晶構造やバンド構造などの各種物性データを簡単に取り扱うことができるPythonライブラリである。様々なクラスが導入されているが、そのうちの一つとして、MPResterクラスという物質材料の第一原理計算結果のデータベースであるMaterials Projectのデータをダウンロードできるインターフェースが整備されている。
pymatgenのドキュメント・サンプルはhttps://pymatgen.org/index.htmlやhttps://docs.materialsproject.org/open-apis/the-materials-api/、https://github.com/materialsproject/mapidocなど様々なものがあるが、ここではpymatgenを使ってMaterials ProjectにあるABO3系(A, Bは任意の原子、Oは酸素原子)のデータを収集してみる。他のレビュー記事ではpymatgenを利用した物理量計算の例を紹介しているので、もしそちらに興味があれば参照していただきたい。
2. 準備
・Materials ProjectのAPI key
まず、pymatgenを用いてMaterials Projectのデータをダウンロードするために、API keyを作成する必要がある。Materials Projectの公式サイト https://materialsproject.org にアクセスして、Sign Inをしたのち、右上の”API”をクリックする。その後, “API Keys”のところを読んで指示に従いAPI keyを作る。もし、すでに作られている場合は、自分のAPI keyが表示されている。
・pymatgenのインストール
次に、pymatgenのインストールを行う。pymatgenの公式ドキュメント https://pymatgen.org でのインストール方法を読むとcondaもしくはpipで簡単にインストールをできることがわかる。pipの場合、
pip install pymatgen
とすれば、インストールできる。もし、自分の行いたい計算環境で管理者権限がない場合(研究室クラスター、スーパーコンピュータなど)は
pip install pymatgen --user
とすればlocalの環境にインストールできる。
3. Pythonスクリプトの内容・使い方
今回作ってみたのはABO3系のcifファイルダウンロードといくつかの物質についての物理量をMaterials Projectから持ってくるPythonスクリプトである。スクリプトはここからダウンロードできる。もしくはターミナル上で
wget https://ma.issp.u-tokyo.ac.jp/wp-content/uploads/sites/3/2020/02/get113fromMP.py
を実行してもダウンロードできる。以下、簡単に中身の説明をしていく
・1-4行目:importとAPI keyの設定。5行目の”USER API KEY”のところにMaterials ProjectのAPI keyを入力する。
from pymatgen.ext.matproj import MPRester
import os
MY_API_KEY="USER API KEY"
・6-26行目:pymatgenの使い方がわからなくなったとき適宜参照できるよう、よく使いそうな情報とそれらの参考URLを記載している。そのほかにも公式ドキュメントのMPRester箇所やMPRester.query箇所は書き方の参考になる。query箇所に関してはこちらの日本語記事も参考になるであろう。
・28-55行目:ABO3系のcifファイルをダウンロードするスクリプト箇所。28-36行目にはどのようなABO3のcifファイルをダウンロードした以下の条件が記載されている。
#Get cif files of ABO3 systems
# Only for 0 < band_gap < 1 and spacegroup = Pm-3m
criteria_properties = {"spacegroup.symbol" : 'Pm-3m', "$and": [ {"band_gap":{"$gt": 0}}, {"band_gap":{"$lt": 1}} ]}
# Only for (band_gap = 0 nor total_magnetization != 0) and spacegroup = Pm-3m
#criteria_properties = {"spacegroup.symbol" : 'Pm-3m', "$nor": [ {"band_gap": 0}, {"total_magnetization":{"$ne": 0}} ]}
# Only for band_gap > 0 and spacegroup = Pm-3m
#criteria_properties = {"spacegroup.symbol" : 'Pm-3m', "band_gap":{"$gt": 0}}
# Only for band_gap != 0 and spacegroup = Pm-3m (the same result as for band_gap > 0)
#criteria_properties = {"spacegroup.symbol" : 'Pm-3m', "band_gap":{"$ne": 0}}
デフォルトでは、空間群が”Pm-3m”でバンドギャップが0より大きく1より小さい値であるという条件を使っている。なお、”$and: [ ]”や{“$gt”: 0}という表記はmongoDBで使われており、詳しくは12-26行目のコメントを参照していただきたい。日本語ページとしては、ここやここなどがmongoDBの理解の参考になる。
38-47行目は以下の通りである。
# define physical properties/infos you want to obtain
output = ['pretty_formula','task_id','cif']
with MPRester( MY_API_KEY ) as m:
#Get pretty_formula of ABO3 systems
data_pretty_formula = m.parse_criteria("**O3")
my_criteria = data_pretty_formula
#satisfy "criteria_properties" condition
my_criteria.update( criteria_properties )
#Get cif files of materials in "my_criteria"
results = m.query(criteria=my_criteria, properties=output)
このセクションの初めは、MaterialsProjectのどのような情報をダウンロードしたいかを決めている。このキーワードは6-9行目のリスト(公式ページ)から選ぶことができる。今回のスクリプトでは、Materials Projectで管理されている物質名とそのID、対応するcif情報をダウンロードするように指定している。with文以下では、Materials Projectから情報をダウンロードする手順が記載されている。
まず、組成式が”ABO3”(A、Bはワイルドカード*で表現している。)の辞書クラスのリストdata_pretty_forumulaを手に入れる。続いてmy_criteriaにdata_prety_forumulaをコピーする(data_prety_forumulaを再利用しないのでcopy()を使わなくても良い。)。その後28-55行目で定義したcriteria_propertiesをmy_criteriaに追記する。最後にmy_criteriaに記載されている条件からoutputで定義した情報をダウンロードし、resultsに格納する。
・49-55行目:cifの出力。ABO3_cifディレクトリにcifファイルを出力するよう設定している。ファイル名は物質ID_物質名にしている。
・57-69行目:SrBO3系での計算された物理量をダウンロードするスクリプト箇所。59行目
criteria_properties = {"elements": {"$in":["V","Ti","Co"], "$all":["Sr"]}}
では、”Sr”を必ず含み($all)、”V”,”Ti”,”Co”のいずれかを含む($in)という条件が書かれている。
61行目
output = ['pretty_formula', "band_gap", "formation_energy_per_atom", "spacegroup.symbol"]
で、出力する物理量を設定している。今回のスクリプトでは、組成式、バンドギャップ値、生成エネルギー、空間群を出力するようにしている。with文以下は38-47行目と同じである。
・71-73行目:結果の出力。
4. 実行結果
実行すると以下のテキストと実行ディレクトリにABO3_cifというディレクトリが出力される。”UserWarning: No electronegativity”という警告がいくつか出ると思うが、特に気にしなくて良い。ABO3_cifディレクトリには40個程度のcifファイルがダウンロードされている。
{'pretty_formula': 'SrCoO3', 'band_gap': 0.0, 'formation_energy_per_atom': -1.970111289333334, 'spacegroup.symbol': 'P4/mmm'}
{'pretty_formula': 'SrCoO3', 'band_gap': 0.0, 'formation_energy_per_atom': -1.9235721123333342, 'spacegroup.symbol': 'Pm-3m'}
{'pretty_formula': 'SrCoO3', 'band_gap': 0.0, 'formation_energy_per_atom': -1.9179158828333336, 'spacegroup.symbol': 'P2_1/m'}
{'pretty_formula': 'SrCoO3', 'band_gap': 0.0, 'formation_energy_per_atom': -1.932051960333333, 'spacegroup.symbol': 'P-1'}
{'pretty_formula': 'SrCoO3', 'band_gap': 0.0, 'formation_energy_per_atom': -1.9658606908333334, 'spacegroup.symbol': 'Amm2'}
{'pretty_formula': 'SrCoO3', 'band_gap': 0.0, 'formation_energy_per_atom': -1.9871399353333339, 'spacegroup.symbol': 'P4/mbm'}
{'pretty_formula': 'SrTiO3', 'band_gap': 1.8583000000000003, 'formation_energy_per_atom': -3.552249219, 'spacegroup.symbol': 'I4/mcm'}
{'pretty_formula': 'SrTiO3', 'band_gap': 1.8274, 'formation_energy_per_atom': -3.551357205, 'spacegroup.symbol': 'Pm-3m'}
{'pretty_formula': 'SrTiO3', 'band_gap': 1.7869999999999995, 'formation_energy_per_atom': -3.551666971000001, 'spacegroup.symbol': 'I4/mcm'}
{'pretty_formula': 'SrTiO3', 'band_gap': 1.7367000000000004, 'formation_energy_per_atom': -3.513146747666667, 'spacegroup.symbol': 'P6_3/mmc'}
{'pretty_formula': 'SrVO3', 'band_gap': 0.0, 'formation_energy_per_atom': -2.8794546823333342, 'spacegroup.symbol': 'Pm-3m'}
5. まとめ
このレビュー記事では、pymatgenを使ったMaterials Projectのデータ収集についてまとめてみた。ダウンロードしたcifや物理量を使って機械学習させることで、何かしらの予測器を作ることもできるであろう。Materials informaticsに興味があれば、是非挑戦してほしい。
2021/7/15: スクリプトや説明文等を追記・修正
2021/7/30: 他記事の紹介やタイポ等を追記・修正