From b34259342d1e905c45acfe9caa509a7a8e0ec9a1 Mon Sep 17 00:00:00 2001 From: Anton Domnin Date: Wed, 27 Nov 2024 18:47:08 +0300 Subject: [PATCH 1/2] update compile_crystal method so it can check elements --- mpds_client/retrieve_MPDS.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/mpds_client/retrieve_MPDS.py b/mpds_client/retrieve_MPDS.py index d618ca0..3307476 100755 --- a/mpds_client/retrieve_MPDS.py +++ b/mpds_client/retrieve_MPDS.py @@ -5,6 +5,7 @@ import math import warnings from urllib.parse import urlencode +from collections import Counter import httplib2 import ujson as json @@ -13,6 +14,7 @@ import jmespath from .errors import APIError +from .utils import all_divmod_equal use_pmg, use_ase = False, False @@ -345,7 +347,11 @@ def get_crystals(self, search, phases=None, flavor='pmg', **kwargs): @staticmethod - def compile_crystal(datarow, flavor='pmg'): + def compile_crystal(datarow, + flavor='pmg', + element_check: bool = False, + elements_counter: dict[str:int] = None + ): """ Helper method for representing the MPDS crystal structures in two flavors: either as a Pymatgen Structure object, or as an ASE Atoms object. @@ -365,7 +371,7 @@ def compile_crystal(datarow, flavor='pmg'): - sg_n - basis_noneq - els_noneq - e.g. like this: {'S':['cell_abc', 'sg_n', 'basis_noneq', 'els_noneq']} + e.g. like this: {'S':['chemical_formula', 'cell_abc', 'sg_n', 'basis_noneq', 'els_noneq']} Args: datarow: (list) Required data to construct crystal structure: @@ -390,7 +396,7 @@ def compile_crystal(datarow, flavor='pmg'): datarow[-4], int(datarow[-3]), datarow[-2], datarow[-1] if flavor == 'pmg' and use_pmg: - return Structure.from_spacegroup( + data = Structure.from_spacegroup( sg_n, Lattice.from_parameters(*cell_abc), els_noneq, @@ -403,7 +409,7 @@ def compile_crystal(datarow, flavor='pmg'): for num, i in enumerate(basis_noneq): atom_data.append(Atom(els_noneq[num], tuple(i))) - return crystal( + data = crystal( atom_data, spacegroup=sg_n, cellpar=cell_abc, @@ -412,3 +418,18 @@ def compile_crystal(datarow, flavor='pmg'): ) else: raise APIError("Crystal structure treatment unavailable") + + # Check if elements composition equal, else return None + if element_check and elements_counter: + if flavor == 'ase': + presented_atoms_data = set(data.get_chemical_symbols()) + else: # pmg + presented_atoms_data = {i.symbol for i in data.species} + + if presented_atoms_data == set(elements_counter.keys()): + pass + else: + # Different composition + data = None + + return data From 2a53e7d6d17effa7e2911ead5a7950fafe0c4e3c Mon Sep 17 00:00:00 2001 From: Anton Domnin Date: Wed, 27 Nov 2024 18:49:47 +0300 Subject: [PATCH 2/2] update naming --- mpds_client/retrieve_MPDS.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mpds_client/retrieve_MPDS.py b/mpds_client/retrieve_MPDS.py index 3307476..16d07e0 100755 --- a/mpds_client/retrieve_MPDS.py +++ b/mpds_client/retrieve_MPDS.py @@ -349,7 +349,7 @@ def get_crystals(self, search, phases=None, flavor='pmg', **kwargs): @staticmethod def compile_crystal(datarow, flavor='pmg', - element_check: bool = False, + elements_check: bool = False, elements_counter: dict[str:int] = None ): """ @@ -420,7 +420,7 @@ def compile_crystal(datarow, else: raise APIError("Crystal structure treatment unavailable") # Check if elements composition equal, else return None - if element_check and elements_counter: + if elements_check and elements_counter: if flavor == 'ase': presented_atoms_data = set(data.get_chemical_symbols()) else: # pmg