Hi @nigel_hew, the easiest way right now is using the origins field of the summary documents, which will point you to the “task” (a DFT calculation) which generated a given property:
from mp_api.client import MPRester
mp_id_to_task_id = {}
with MPRester() as mpr:
summary_docs = mpr.materials.summary.search(fields = ["material_id", "structure", "origins"])
for doc in summary_docs:
for prop in doc.origins:
if prop.name == "structure":
mp_id_to_task_id[doc.material_id] = {
"task_id": prop.task_id,
"structure": doc.structure,
}
break
thermo_docs = mpr.materials.thermo.search(fields = ["material_id","entries"])
for doc in thermo_docs:
mp_id = doc.material_id
for entry in doc.entries.values():
if entry.data["task_id"] == mp_id_to_task_id[mp_id]["task_id"]:
mp_id_to_task_id[mp_id]["run_type"] = entry.parameters["run_type"]
break
In this case, a run_type of GGA indicates a PBE GGA calculation, GGA_U indicates a PBE+U calculation, and r2SCAN indicates an r2SCAN calculation
An alternative is to use the tasks endpoint to directly locate the task which generated the structure. If you take that approach, it’s worth downloading all the tasks and filtering through the IDs you need:
tasks = mpr.materials.tasks.search(fields=["task_id","run_type","structure","energy"])