Materials Project APIからデータをクエリする方法
説明
Materials Project (MP)は無機物質に関するオープンソースのデータベースである。MP API クライアントを使用すると Python から便利に MP データベースへアクセスしてデータをクエリできる。
idで検索
まず自分のAPI Keyが必要なので会員登録を先に行う。mpr.materials.summary.search() の入力に欲しい物質の id や物性に関する条件を入れてデータを取得できる。以下のようなコードで mp-2209 と mp-29658 という物質についての概要情報を取得できる。こうして取得した docs は MPDataDoc オブジェクトのリストであり、MPDataDoc の属性を通じて各物質の情報にアクセスできる。
from mp_api.client import MPRester
my_key = "asdfsfasdfdsfsafasf"
with MPRester(my_key) as mpr:
docs = mpr.materials.summary.search(
material_ids=["mp-2209", "mp-29658"]
)
>>> type(docs[0])
<class 'mp_api.client.core.client.MPDataDoc'>
>>> [doc.material_id for doc in docs]
[MPID(mp-29658), MPID(mp-2209)]
>>> [doc.formula_pretty for doc in docs]
['ZrNiH3', 'CeGa2']
上の結果を見ると docs[0] は id が mp-29658 の $\ce{ZrNiH_{3}}$ に関する情報を含むドキュメントで、docs[1] は id が mp-2209 の $\ce{CeGa_{2}}$ に関する情報を含むドキュメントである。search に入力した material_ids の順序とは無関係であることに注意。docs[0] が含む全情報は次の通りである。

以下のように各 MPDataDoc から目的の属性にアクセスできる。
>>> doc = docs[0]
>>> doc.formula_pretty #화학식
'ZrNiH3'
>>> doc.nsites #원자수
10
>>> doc.band_gap #밴드갭
0.0
>>> doc.energy_per_atom #원자당 에너지
-5.438467611000001
>>> doc.is_metal #금속여부
True
利用可能なすべてのフィールドを確認するには mpr.materials.summary.available_fields を実行する。
>>> mpr.materials.summary.available_fields
['builder_meta', 'nsites', 'elements', 'nelements', 'composition', 'composition_reduced', 'formula_pretty', 'formula_anonymous', 'chemsys', 'volume', 'density', 'density_atomic', 'symmetry', 'property_name', 'material_id', 'deprecated', 'deprecation_reasons', 'last_updated', 'origins', 'warnings', 'structure', 'task_ids', 'uncorrected_energy_per_atom', 'energy_per_atom', 'formation_energy_per_atom', 'energy_above_hull', 'is_stable', 'equilibrium_reaction_energy_per_atom', 'decomposes_to', 'xas', 'grain_boundaries', 'band_gap', 'cbm', 'vbm', 'efermi', 'is_gap_direct', 'is_metal', 'es_source_calc_id', 'bandstructure', 'dos', 'dos_energy_up', 'dos_energy_down', 'is_magnetic', 'ordering', 'total_magnetization', 'total_magnetization_normalized_vol', 'total_magnetization_normalized_formula_units', 'num_magnetic_sites', 'num_unique_magnetic_sites', 'types_of_magnetic_species', 'bulk_modulus', 'shear_modulus', 'universal_anisotropy', 'homogeneous_poisson', 'e_total', 'e_ionic', 'e_electronic', 'n', 'e_ij_max', 'weighted_surface_energy_EV_PER_ANG2', 'weighted_surface_energy', 'weighted_work_function', 'surface_anisotropy', 'shape_factor', 'has_reconstructed', 'possible_species', 'has_props', 'theoretical', 'database_IDs']
五十音順にソート
band_gap
bandstructure
builder_meta
bulk_modulus
cbm
chemsys
composition
composition_reduced
database_IDs
decomposes_to
density
density_atomic
deprecated
deprecation_reasons
dos
dos_energy_down
dos_energy_up
e_electronic
e_ij_max
e_ionic
e_total
efermi
elements
energy_above_hull
energy_per_atom
equilibrium_reaction_energy_per_atom
es_source_calc_id
formation_energy_per_atom
formula_anonymous
formula_pretty
grain_boundaries
has_props
has_reconstructed
homogeneous_poisson
is_gap_direct
is_magnetic
is_metal
is_stable
last_updated
material_id
n
nelements
nsites
num_magnetic_sites
num_unique_magnetic_sites
ordering
origins
possible_species
property_name
shape_factor
shear_modulus
structure
surface_anisotropy
symmetry
task_ids
theoretical
total_magnetization
total_magnetization_normalized_formula_units
total_magnetization_normalized_vol
types_of_magnetic_species
uncorrected_energy_per_atom
universal_anisotropy
vbm
volume
warnings
weighted_surface_energy
weighted_surface_energy_EV_PER_ANG2
weighted_work_function
xas
フィルターで検索
特定の条件を満たす物質データを得たい場合は search の入力に条件を与えればよい。ただし注意点として MPDataDoc の属性名と search に入力する名前が完全に一致しないことがある。
例えば、原子数が4以上でバンドギャップが2 eV以上の物質を探したいなら次のようにコードを書く。結果として下記のように合計36,490件の構造データが得られる。
>>> with MPRester(my_key) as mpr:
... docs = mpr.materials.summary.search(
... num_sites=(4, None),
... band_gap=(2, None)
... )
Retrieving SummaryDoc documents: 100%|██████████████████████████████████████████| 36490/36490 [01:10<00:00, 517.50it/s]
search に使えるすべてのフィルターの一覧は以下の通りである。
五十音順にソート
band_gap
chemsys
crystal_system
density
deprecated
e_electronic
e_ionic
e_total
efermi
elastic_anisotropy
elements
energy_above_hull
equilibrium_reaction_energy
exclude_elements
formation_energy
formula
g_reuss
g_voigt
g_vrh
has_props
has_reconstructed
is_gap_direct
is_metal
is_stable
k_reuss
k_voigt
k_vrh
magnetic_ordering
material_ids
n
nelements
num_elements
num_sites
num_magnetic_sites
num_unique_magnetic_sites
piezoelectric_modulus
poisson_ratio
possible_species
shape_factor
spacegroup_number
spacegroup_symbol
surface_energy_anisotropy
theoretical
total_energy
total_magnetization
total_magnetization_normalized_formula_units
total_magnetization_normalized_vol
uncorrected_energy
volume
weighted_surface_energy
weighted_work_function
include_gnome
num_chunks
chunk_size
all_fields
fields
このうち fields で取得するデータに含める属性を指定できる。例えば上記の条件で見つかった物質群のうち、原子数、バンドギャップ、原子あたりのエネルギー、id だけを保存するなら次のようにコードを書く。すると MPDataDoc オブジェクトには指定した属性のみが含まれて保存され、残りの属性は fields_not_requested というリストに名前が格納される。
>>> with MPRester(my_key) as mpr:
... docs = mpr.materials.summary.search(
... num_sites=(4, None), band_gap=(2, None),
... fields=["nsites", "band_gap", "energy_per_atom", "material_id"]
... )
Retrieving SummaryDoc documents: 100%|█████████████████████████████████████████| 36490/36490 [00:11<00:00, 3171.23it/s]
>>> docs[0]
MPDataDoc<SummaryDoc>(
nsites=5,
material_id=MPID(mp-11107),
energy_per_atom=-8.354914895999997,
band_gap=3.522599999999999,
fields_not_requested=['builder_meta', 'elements', 'nelements', 'composition', 'composition_reduced', 'formula_pretty', 'formula_anonymous', 'chemsys', 'volume', 'density', 'density_atomic', 'symmetry', 'property_name', 'deprecated', 'deprecation_reasons', 'last_updated', 'origins', 'warnings', 'structure', 'task_ids', 'uncorrected_energy_per_atom', 'formation_energy_per_atom', 'energy_above_hull', 'is_stable', 'equilibrium_reaction_energy_per_atom', 'decomposes_to', 'xas', 'grain_boundaries', 'cbm', 'vbm', 'efermi', 'is_gap_direct', 'is_metal', 'es_source_calc_id', 'bandstructure', 'dos', 'dos_energy_up', 'dos_energy_down', 'is_magnetic', 'ordering', 'total_magnetization', 'total_magnetization_normalized_vol', 'total_magnetization_normalized_formula_units', 'num_magnetic_sites', 'num_unique_magnetic_sites', 'types_of_magnetic_species', 'bulk_modulus', 'shear_modulus', 'universal_anisotropy', 'homogeneous_poisson', 'e_total', 'e_ionic', 'e_electronic', 'n', 'e_ij_max', 'weighted_surface_energy_EV_PER_ANG2', 'weighted_surface_energy', 'weighted_work_function', 'surface_anisotropy', 'shape_factor', 'has_reconstructed', 'possible_species', 'has_props', 'theoretical', 'database_IDs']
)
