Warning: Can not open [/home/conf/public_html/cgi-bin/show_python.log]. Ignore
if i == 0:
output_path = f"{cformula}.{output_format}"
else:
output_path = f"{cformula}_{i+1}.{output_format}"
Download script from get_cif.py
Related files:
import os
import sys
from mp_api.client import MPRester
from pymatgen.core.structure import Structure
from pymatgen.core import Composition
from pymatgen.symmetry.analyzer import SpacegroupAnalyzer
from pymatgen.io.cif import CifWriter, CifParser
formula = None
output_format = "cif"
prec = 1.0e-3
def usage():
print()
print(f"Usage: python {sys.argv[0]} formula [output_format] [prec]\n")
def update_vars():
global formula, output_formuat, prec
argv = sys.argv
narg = len(argv)
if narg <= 1:
print("\nError: Chemical formula must be given as the first arg\n")
input("Press ENTER to terminate>>\n")
exit()
formula = argv[1]
if narg >= 3: output_format = argv[2]
if narg >= 4: prec = float(argv[3])
def get_structure(formula):
API_KEY = os.getenv('MP_APIKEY')
if API_KEY is None:
print("\nError: Can not get MP API Key from the environment var MP_APIKEY\n")
return None
mpr = MPRester(API_KEY)
if mpr is None:
print(f"\nError: Can not get MPRester using the given API_KEY [{API_KEY}]\n")
input("Press ENTER to terminate>>\n")
exit()
if ',' in formula:
elements_in = formula.replace(' ', '').split(',')
search_results = mpr.materials.summary.search(elements = elements_in)
else:
elements_in = None
search_results = mpr.materials.search(formula = formula)
if not search_results:
print(f"No data found for {formula}")
return None
structures = []
for res in search_results:
material_id = res.material_id
material_data = mpr.materials.search(material_ids = [material_id])
if not material_data:
print(f"No structure data found for material_id {material_id}")
continue
structure_dict = material_data[0].structure.as_dict()
structure = Structure.from_dict(structure_dict)
composition = structure.composition
cformula = composition.reduced_formula
# cformula = structure.reduced_formula #formula.replace(" ", "")
# composition = Composition(cformula)
elements_res = [element.symbol for element in composition.elements]
if elements_in:
# print("elements_res=", elements_res)
# print("elements_in=", elements_in)
not_included = []
for e in elements_res:
# print(" e=", e)
if e not in elements_in: not_included.append(e)
if len(not_included) >= 1:
print(f" ** One or more elements are not included for [{cformula}] in the given condition [{formula}]:", not_included)
continue
else:
print(f" ** Found [{cformula}] [{material_id}]")
structure.cmaterial = res
structure.material_id = material_id
structure.cformula = cformula
structure.celements = elements_res
structures.append(structure)
cformula = structure.formula.replace(" ", "")
print(f"Found material_id for {formula}: {material_id}: {cformula}")
return structures
def save_structures(structures, output_format, formula):
print()
for i, structure in enumerate(structures):
cformula = structure.cformula
if output_format == "poscar":
if i == 0:
output_path = f"POSCAR"
else:
output_path = f"POSCAR_{i+1}"
else:
output_path = f"{cformula}_{structure.material_id}.{output_format}"
'''
if i == 0:
output_path = f"{cformula}.{output_format}"
else:
output_path = f"{cformula}_{i+1}.{output_format}"
'''
symmetry_analyzer = SpacegroupAnalyzer(structure, symprec = prec) #, angle_tolerance = 5.0)
symmetrized_structure = symmetry_analyzer.get_symmetrized_structure()
# print()
# print("symmetrized_structure:")
# print(symmetrized_structure)
print(f"Saving {cformula} structure to [{output_path}]...")
# structure.to(filename = output_path, fmt = output_format)
writer = CifWriter(symmetrized_structure, symprec = prec) #, angle_tolerance = 5.0)
writer.write_file(output_path)
def main():
update_vars()
structures = get_structure(formula)
if structures:
save_structures(structures, output_format, formula)
usage()
print()
input("Press ENTER to terminate>>\n")
exit()
if __name__ == "__main__":
main()