Pymatgen:如何将查询结果转换为结构
Pymatgen: How to convert query result to structure
我们有现有代码可以为许多 material 人(>60,000)获取一些 material 属性。
from pymatgen import MPRester
mpr = MPRester(api_key="")
criteria={"nelements":{'$lt':4}}
properties=["pretty_formula","cif","material_id", "formation_energy_per_atom", "band_gap"]
c = mpr.query(criteria=criteria,properties=properties)
但是对于这个项目,我们需要特定形式的信息,即结构。我可以通过分别为每个 material ID 调用它们来轻松获得此结构:
structures = []
for mid in mid_list:
structures.append(mpr.get_structure_by_material_id(mid))
在matproj.py中调用这个函数:
def get_structure_by_material_id(self, material_id, final=True,
conventional_unit_cell=False):
"""
Get a Structure corresponding to a material_id.
Args:
material_id (str): Materials Project material_id (a string,
e.g., mp-1234).
final (bool): Whether to get the final structure, or the initial
(pre-relaxation) structure. Defaults to True.
conventional_unit_cell (bool): Whether to get the standard
conventional unit cell
Returns:
Structure object.
"""
问题是,这需要很长时间(>4 小时)并且有时会在调用 API 时卡住。
有没有办法避免调用 API 60,000 次并改为转换初始查询结果?
您不需要查询每个单独的 mpid。您的第一个代码块已经查询了所有材料的 "cif"
信息!
您需要做的就是使用 PyMatGen 将 cif 字符串转换为结构:
from pymatgen.io.cif import CifParser
structures = []
for material in c:
structures.append(CifParser.from_string(material["cif"]).get_structures()[0])
我们有现有代码可以为许多 material 人(>60,000)获取一些 material 属性。
from pymatgen import MPRester
mpr = MPRester(api_key="")
criteria={"nelements":{'$lt':4}}
properties=["pretty_formula","cif","material_id", "formation_energy_per_atom", "band_gap"]
c = mpr.query(criteria=criteria,properties=properties)
但是对于这个项目,我们需要特定形式的信息,即结构。我可以通过分别为每个 material ID 调用它们来轻松获得此结构:
structures = []
for mid in mid_list:
structures.append(mpr.get_structure_by_material_id(mid))
在matproj.py中调用这个函数:
def get_structure_by_material_id(self, material_id, final=True,
conventional_unit_cell=False):
"""
Get a Structure corresponding to a material_id.
Args:
material_id (str): Materials Project material_id (a string,
e.g., mp-1234).
final (bool): Whether to get the final structure, or the initial
(pre-relaxation) structure. Defaults to True.
conventional_unit_cell (bool): Whether to get the standard
conventional unit cell
Returns:
Structure object.
"""
问题是,这需要很长时间(>4 小时)并且有时会在调用 API 时卡住。
有没有办法避免调用 API 60,000 次并改为转换初始查询结果?
您不需要查询每个单独的 mpid。您的第一个代码块已经查询了所有材料的 "cif"
信息!
您需要做的就是使用 PyMatGen 将 cif 字符串转换为结构:
from pymatgen.io.cif import CifParser
structures = []
for material in c:
structures.append(CifParser.from_string(material["cif"]).get_structures()[0])