ChemistryBot / materials_utils.py
HailMogambo09's picture
Text Container
1d03008
raw
history blame contribute delete
No virus
3.05 kB
import os
from mp_api.client import MPRester
from robocrys import StructureCondenser, StructureDescriber
import streamlit as st
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("api_key")
def get_mpid(formula):
try:
with MPRester(api_key) as mpr:
docs = mpr.materials.summary.search(formula=[formula],
fields=["material_id", "formula_pretty", "symmetry", "nsites",
"energy_above_hull", "band_gap"])
mpid_dict = {doc.material_id: (
doc.formula_pretty, doc.symmetry.crystal_system, doc.symmetry.symbol, doc.nsites, doc.energy_above_hull,
doc.band_gap) for doc in docs}
return mpid_dict
except Exception as e:
st.write(f"Error finding MP data for formula {formula}: {e}")
return None
def extract_data(doc, field_list):
extracted_data = {}
for field in field_list:
if hasattr(doc, field):
value = getattr(doc, field)
extracted_data[field] = value
return extracted_data
field_list = [
'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'
]
def get_data_from_mpid(mpid):
with MPRester(api_key) as mpr:
docs = mpr.materials.summary.search(material_ids=[mpid])
if docs:
data_dict = extract_data(docs[0], field_list)
return data_dict
else:
return None
def get_structure_description(mpid):
with MPRester(api_key) as mpr:
structure = mpr.get_structure_by_material_id(mpid)
condenser = StructureCondenser()
describer = StructureDescriber()
condensed_structure = condenser.condense_structure(structure)
description = describer.describe(condensed_structure)
return description