def test_matches(self): self.assertTrue(self.NiO.matches(self.NiO_AFM_111)) self.assertTrue(self.NiO.matches(self.NiO_AFM_001)) # MSA adds magmoms to Structure, so not equal msa = CollinearMagneticStructureAnalyzer( self.NiO, overwrite_magmom_mode="replace_all") self.assertFalse(msa.matches_ordering(self.NiO)) self.assertFalse(msa.matches_ordering(self.NiO_AFM_111)) self.assertFalse(msa.matches_ordering(self.NiO_AFM_001)) msa = CollinearMagneticStructureAnalyzer( self.NiO_AFM_001, overwrite_magmom_mode="respect_sign") self.assertFalse(msa.matches_ordering(self.NiO)) self.assertFalse(msa.matches_ordering(self.NiO_AFM_111)) self.assertTrue(msa.matches_ordering(self.NiO_AFM_001)) self.assertTrue(msa.matches_ordering(self.NiO_AFM_001_opposite)) msa = CollinearMagneticStructureAnalyzer( self.NiO_AFM_111, overwrite_magmom_mode="respect_sign") self.assertFalse(msa.matches_ordering(self.NiO)) self.assertTrue(msa.matches_ordering(self.NiO_AFM_111)) self.assertFalse(msa.matches_ordering(self.NiO_AFM_001)) self.assertFalse(msa.matches_ordering(self.NiO_AFM_001_opposite))
def collate_mp_data(struct): mag_tasks = {} min_energy = 0 ordering_labels = { "Unknown": "Unknown", "FM": "Ferromagnetic", "AFM": "Antiferromagnetic", "FiM": "Ferrimagnetic", "NM": "Non-magnetic", } with MPRester(endpoint="https://zola.lbl.gov/rest/v2") as mpr: # find similar structures in Materials Project mpids = mpr.find_structure(struct) # and all tasks for those materials, specifically their structures # and total energy per atom for d in mpr.query({"task_id": {"$in": mpids}}, ["task_ids"]): for task_id in d["task_ids"]: add_task = True task_struct = mpr.get_task_data( task_id, prop="structure")[0]["structure"] have_magmoms = "magmom" in task_struct.site_properties task_energy = mpr.get_task_data( task_id, prop="energy_per_atom")[0]["energy_per_atom"] min_energy = min([min_energy, task_energy]) msa = CollinearMagneticStructureAnalyzer(task_struct) if not have_magmoms: ordering = "Unknown" else: ordering = msa.ordering.value # group together similar orderings, only display lowest # energy task for each ordering mag_tasks_to_remove = [] for mag_task_id, mag_task in mag_tasks.items(): struct_to_compare = mag_task["struct"] if msa.matches_ordering(struct_to_compare): # if existing task is lower in energy, keep that one if mag_task["energy"] < task_energy: add_task = False # else remove existing task and add this one else: mag_tasks_to_remove.append(mag_task_id) # remove higher energy duplicate tasks for mag_task_id in mag_tasks_to_remove: del mag_tasks[mag_task_id] if add_task: mag_tasks[task_id] = { "struct": task_struct, "ordering": ordering_labels[ordering], "energy": task_energy, } for k, v in mag_tasks.items(): v["energy"] = 1000 * (v["energy"] - min_energy) mag_tasks[k] = v return mag_tasks