From bd88e0d9a6105b50e2abfb40bb48202fbb9587df Mon Sep 17 00:00:00 2001 From: Aakash Ashok Naik <91958822+naik-aakash@users.noreply.github.com> Date: Sun, 18 Feb 2024 06:49:25 +0100 Subject: [PATCH] [WIP] Lobsterenv improvements (#3624) * add args to work with pymatgen objs * adapt and add test --- pymatgen/io/lobster/lobsterenv.py | 100 ++++++++++------- tests/io/lobster/test_lobsterenv.py | 159 ++++++++++++++++------------ 2 files changed, 154 insertions(+), 105 deletions(-) diff --git a/pymatgen/io/lobster/lobsterenv.py b/pymatgen/io/lobster/lobsterenv.py index 688209fed07..71144f44d4e 100644 --- a/pymatgen/io/lobster/lobsterenv.py +++ b/pymatgen/io/lobster/lobsterenv.py @@ -57,17 +57,19 @@ class LobsterNeighbors(NearNeighbors): def __init__( self, structure: Structure, - filename_ICOHP: str = "ICOHPLIST.lobster", + filename_icohp: str | None = "ICOHPLIST.lobster", + obj_icohp: Icohplist | None = None, are_coops: bool = False, are_cobis: bool = False, valences: list[float] | None = None, limits: tuple[float, float] | None = None, additional_condition: int = 0, only_bonds_to: list[str] | None = None, - perc_strength_ICOHP: float = 0.15, + perc_strength_icohp: float = 0.15, noise_cutoff: float = 0.1, valences_from_charges: bool = False, - filename_CHARGE: str | None = None, + filename_charge: str | None = None, + obj_charge: Charge | None = None, which_charge: str = "Mulliken", adapt_extremum_to_add_cond: bool = False, add_additional_data_sg: bool = False, @@ -79,7 +81,8 @@ def __init__( """ Args: - filename_ICOHP: (str) Path to ICOHPLIST.lobster or ICOOPLIST.lobster or ICOBILIST.lobster + filename_icohp: (str) Path to ICOHPLIST.lobster or ICOOPLIST.lobster or ICOBILIST.lobster + obj_icohp: Icohplist object structure: (Structure) typically constructed by Structure.from_file("POSCAR") are_coops: (bool) if True, the file is a ICOOPLIST.lobster and not a ICOHPLIST.lobster; only tested for ICOHPLIST.lobster so far @@ -95,13 +98,14 @@ def __init__( DO_NOT_CONSIDER_ANION_CATION_BONDS=5 ONLY_CATION_CATION_BONDS=6 only_bonds_to: (list[str]) will only consider bonds to certain elements (e.g. ["O"] for oxygen) - perc_strength_ICOHP: if no limits are given, this will decide which icohps will still be considered ( + perc_strength_icohp: if no limits are given, this will decide which icohps will still be considered ( relative to the strongest ICOHP (ICOOP or ICOBI) noise_cutoff: if provided hardcodes the lower limit of icohps considered valences_from_charges: if True and path to CHARGE.lobster is provided, will use Lobster charges ( Mulliken) instead of valences - filename_CHARGE: (str) Path to Charge.lobster + filename_charge: (str) Path to Charge.lobster + obj_charge: Charge object which_charge: (str) "Mulliken" or "Loewdin" adapt_extremum_to_add_cond: (bool) will adapt the limits to only focus on the bonds determined by the additional condition @@ -113,7 +117,12 @@ def __init__( id_blist_sg2: (str) Identity of data in filename_blist_sg2, e.g., "icoop" or "icobi". """ - self.ICOHP = Icohplist(are_coops=are_coops, are_cobis=are_cobis, filename=filename_ICOHP) + if filename_icohp is not None: + self.ICOHP = Icohplist(are_coops=are_coops, are_cobis=are_cobis, filename=filename_icohp) + elif obj_icohp is not None: + self.ICOHP = obj_icohp + else: + raise ValueError("Please provide either filename_icohp or obj_icohp") self.Icohpcollection = self.ICOHP.icohpcollection self.structure = structure self.limits = limits @@ -167,8 +176,10 @@ def __init__( # will read in valences, will prefer manual setting of valences self.valences: list[float] | None if valences is None: - if valences_from_charges and filename_CHARGE is not None: - chg = Charge(filename=filename_CHARGE) + if valences_from_charges and filename_charge is not None: + chg = Charge(filename=filename_charge) + if valences_from_charges and obj_charge is not None: + chg = obj_charge if which_charge == "Mulliken": self.valences = chg.Mulliken elif which_charge == "Loewdin": @@ -199,7 +210,7 @@ def __init__( upperlimit=self.upperlimit, only_bonds_to=only_bonds_to, additional_condition=self.additional_condition, - perc_strength_ICOHP=perc_strength_ICOHP, + perc_strength_icohp=perc_strength_icohp, adapt_extremum_to_add_cond=adapt_extremum_to_add_cond, ) @@ -235,7 +246,7 @@ def anion_types(self): def get_anion_types(self): return self.anion_types - def get_nn_info(self, structure: Structure, n, use_weights=False): + def get_nn_info(self, structure: Structure, n, use_weights: bool = False): """ Get coordination number, CN, of site with index n in structure. @@ -408,21 +419,24 @@ def get_info_icohps_to_neighbors(self, isites=None, onlycation_isites=True): def plot_cohps_of_neighbors( self, - path_to_COHPCAR="COHPCAR.lobster", - isites=None, - onlycation_isites=True, - only_bonds_to=None, - per_bond=False, - summed_spin_channels=False, + path_to_cohpcar: str | None = "COHPCAR.lobster", + obj_cohpcar: CompleteCohp | None = None, + isites: list[int] | None = None, + onlycation_isites: bool = True, + only_bonds_to: list[str] | None = None, + per_bond: bool = False, + summed_spin_channels: bool = False, xlim=None, ylim=(-10, 6), - integrated=False, + integrated: bool = False, ): """ Will plot summed cohps or cobis or coops (please be careful in the spin polarized case (plots might overlap (exactly!)). Args: + path_to_cohpcar: str, path to COHPCAR or COOPCAR or COBICAR + obj_cohpcar: CompleteCohp object isites: list of site ids, if isite==[], all isites will be used to add the icohps of the neighbors onlycation_isites: bool, will only use cations, if isite==[] only_bonds_to: list of str, only anions in this list will be considered @@ -442,7 +456,8 @@ def plot_cohps_of_neighbors( cp = CohpPlotter(are_cobis=self.are_cobis, are_coops=self.are_coops) plotlabel, summed_cohp = self.get_info_cohps_to_neighbors( - path_to_COHPCAR, + path_to_cohpcar, + obj_cohpcar, isites, only_bonds_to, onlycation_isites, @@ -462,19 +477,21 @@ def plot_cohps_of_neighbors( def get_info_cohps_to_neighbors( self, - path_to_COHPCAR="COHPCAR.lobster", - isites=None, - only_bonds_to=None, - onlycation_isites=True, - per_bond=True, - summed_spin_channels=False, + path_to_cohpcar: str | None = "COHPCAR.lobster", + obj_cohpcar: CompleteCohp | None = None, + isites: list[int] | None = None, + only_bonds_to: list[str] | None = None, + onlycation_isites: bool = True, + per_bond: bool = True, + summed_spin_channels: bool = False, ): """ Return info about the cohps (coops or cobis) as a summed cohp object and a label from all sites mentioned in isites with neighbors. Args: - path_to_COHPCAR: str, path to COHPCAR or COOPCAR or COBICAR + path_to_cohpcar: str, path to COHPCAR or COOPCAR or COBICAR + obj_cohpcar: CompleteCohp object isites: list of int that indicate the number of the site only_bonds_to: list of str, e.g. ["O"] to only show cohps of anything to oxygen onlycation_isites: if isites=None, only cation sites will be returned @@ -493,16 +510,21 @@ def get_info_cohps_to_neighbors( with tempfile.TemporaryDirectory() as t: path = f"{t}/POSCAR.vasp" - self.structure.to(filename=path, fmt="POSCAR") + self.structure.to(filename=path, fmt="poscar") if not hasattr(self, "completecohp"): - self.completecohp = CompleteCohp.from_file( - fmt="LOBSTER", - filename=path_to_COHPCAR, - structure_file=path, - are_coops=self.are_coops, - are_cobis=self.are_cobis, - ) + if path_to_cohpcar is not None and obj_cohpcar is None: + self.completecohp = CompleteCohp.from_file( + fmt="LOBSTER", + filename=path_to_cohpcar, + structure_file=path, + are_coops=self.are_coops, + are_cobis=self.are_cobis, + ) + elif obj_cohpcar is not None: + self.completecohp = obj_cohpcar + else: + raise ValueError("Please provide either path_to_cohpcar or obj_cohpcar") # will check that the number of bonds in ICOHPLIST and COHPCAR are identical # further checks could be implemented @@ -681,9 +703,9 @@ def _evaluate_ce( lowerlimit, upperlimit, only_bonds_to=None, - additional_condition=0, - perc_strength_ICOHP=0.15, - adapt_extremum_to_add_cond=False, + additional_condition: int = 0, + perc_strength_icohp: float = 0.15, + adapt_extremum_to_add_cond: bool = False, ) -> None: """ Args: @@ -693,7 +715,7 @@ def _evaluate_ce( neighbors only_bonds_to: restricts the types of bonds that will be considered additional_condition: Additional condition for the evaluation - perc_strength_ICOHP: will be used to determine how strong the ICOHPs (percentage*strongest ICOHP) will be + perc_strength_icohp: will be used to determine how strong the ICOHPs (percentage*strongest ICOHP) will be that are still considered for the evaluation adapt_extremum_to_add_cond: will recalculate the limit based on the bonding type and not on the overall extremum. @@ -702,7 +724,7 @@ def _evaluate_ce( if lowerlimit is None and upperlimit is None: lowerlimit, upperlimit = self._get_limit_from_extremum( self.Icohpcollection, - percentage=perc_strength_ICOHP, + percentage=perc_strength_icohp, adapt_extremum_to_add_cond=adapt_extremum_to_add_cond, additional_condition=additional_condition, ) diff --git a/tests/io/lobster/test_lobsterenv.py b/tests/io/lobster/test_lobsterenv.py index 1f76da32d6a..c84ffe9797a 100644 --- a/tests/io/lobster/test_lobsterenv.py +++ b/tests/io/lobster/test_lobsterenv.py @@ -10,8 +10,9 @@ from pymatgen.analysis.graphs import StructureGraph from pymatgen.core import Element from pymatgen.core.structure import Structure -from pymatgen.electronic_structure.cohp import Cohp +from pymatgen.electronic_structure.cohp import Cohp, CompleteCohp from pymatgen.electronic_structure.core import Spin +from pymatgen.io.lobster import Charge, Icohplist from pymatgen.io.lobster.lobsterenv import LobsterNeighbors from pymatgen.util.testing import TEST_FILES_DIR @@ -32,7 +33,7 @@ def setUp(self): self.chem_env_lobster1 = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_190.gz"), additional_condition=1, ) @@ -40,7 +41,7 @@ def setUp(self): # all bonds self.chem_env_lobster0 = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_190.gz"), additional_condition=0, ) @@ -48,7 +49,7 @@ def setUp(self): # only cation-cation, anion-anion bonds self.chem_env_lobster5 = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_190.gz"), additional_condition=5, ) @@ -56,7 +57,7 @@ def setUp(self): # only cation-cation bonds self.chem_env_lobster6 = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_190.gz"), additional_condition=6, ) @@ -64,21 +65,21 @@ def setUp(self): # 2,3,4 are not tested so far self.chem_env_lobster2 = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_190.gz"), additional_condition=2, ) self.chem_env_lobster3 = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_190.gz"), additional_condition=3, ) self.chem_env_lobster4 = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_190.gz"), additional_condition=4, ) @@ -86,49 +87,49 @@ def setUp(self): # search for other testcase where 2,3,4 arrive at different results self.chem_env_lobster0_second = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), additional_condition=0, ) self.chem_env_lobster1_second = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), additional_condition=1, ) self.chem_env_lobster2_second = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), additional_condition=2, ) self.chem_env_lobster5_second = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), additional_condition=5, ) self.chem_env_lobster5_second_percentage = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), additional_condition=5, - perc_strength_ICOHP=1.0, + perc_strength_icohp=1.0, ) self.chem_env_lobster6_second = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), additional_condition=6, ) # coop / cobi self.chem_env_lobster1_coop_NaCl = LobsterNeighbors( are_coops=True, - filename_ICOHP=f"{TEST_DIR}/ICOOPLIST.lobster.NaCl.gz", + filename_icohp=f"{TEST_DIR}/ICOOPLIST.lobster.NaCl.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.NaCl.gz"), additional_condition=1, noise_cutoff=None, @@ -136,7 +137,7 @@ def setUp(self): self.chem_env_lobster1_cobi_NaCl = LobsterNeighbors( are_coops=True, - filename_ICOHP=f"{TEST_DIR}/ICOBILIST.lobster.NaCl.gz", + filename_icohp=f"{TEST_DIR}/ICOBILIST.lobster.NaCl.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.NaCl.gz"), additional_condition=1, noise_cutoff=None, @@ -144,7 +145,7 @@ def setUp(self): self.chem_env_lobster1_cobi_mp470 = LobsterNeighbors( are_coops=True, - filename_ICOHP=f"{TEST_DIR}/ICOBILIST.lobster.mp_470.gz", + filename_icohp=f"{TEST_DIR}/ICOBILIST.lobster.mp_470.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_470.gz"), additional_condition=1, ) @@ -152,111 +153,125 @@ def setUp(self): # TODO: use charge instead of valence self.chem_env_lobster1_charges = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", additional_condition=1, ) self.chem_env_lobster1_charges_noisecutoff = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_632319.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_632319.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_632319.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp_632319.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp_632319.gz", additional_condition=1, - perc_strength_ICOHP=0.05, + perc_strength_icohp=0.05, noise_cutoff=0.1, ) self.chem_env_lobster1_charges_wo_noisecutoff = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_632319.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_632319.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_632319.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp_632319.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp_632319.gz", additional_condition=1, - perc_strength_ICOHP=0.05, + perc_strength_icohp=0.05, noise_cutoff=None, ) self.chem_env_lobster1_charges_loewdin = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", additional_condition=1, which_charge="Loewdin", ) self.chem_env_lobster6_charges_additional_condition = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", additional_condition=6, adapt_extremum_to_add_cond=True, ) self.chem_env_lobster5_charges_additional_condition = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", additional_condition=5, adapt_extremum_to_add_cond=True, ) self.chem_env_lobster4_charges_additional_condition = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", additional_condition=4, adapt_extremum_to_add_cond=True, ) self.chem_env_lobster3_charges_additional_condition = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", additional_condition=3, adapt_extremum_to_add_cond=True, ) self.chem_env_lobster2_charges_additional_condition = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", additional_condition=2, adapt_extremum_to_add_cond=True, ) self.chem_env_lobster1_charges_additional_condition = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", additional_condition=1, adapt_extremum_to_add_cond=True, ) self.chem_env_lobster0_charges_additional_condition = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", additional_condition=0, adapt_extremum_to_add_cond=True, ) self.chem_env_lobster0_NaSi = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.NaSi.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.NaSi.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.NaSi.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.NaSi.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.NaSi.gz", + additional_condition=0, + adapt_extremum_to_add_cond=True, + ) + # Test LobsterNeighbors using pymatgen objects + self.obj_icohp = Icohplist(filename=f"{TEST_DIR}/ICOHPLIST.lobster.NaSi.gz") + self.obj_charge = Charge(filename=f"{TEST_DIR}/CHARGE.lobster.NaSi.gz") + self.chem_env_w_obj = LobsterNeighbors( + filename_icohp=None, + are_coops=False, + obj_icohp=self.obj_icohp, + obj_charge=self.obj_charge, + structure=Structure.from_file(f"{TEST_DIR}/POSCAR.NaSi.gz"), + valences_from_charges=True, + filename_charge=f"{TEST_DIR}/CHARGE.lobster.NaSi.gz", additional_condition=0, adapt_extremum_to_add_cond=True, ) @@ -267,7 +282,7 @@ def test_cation_anion_mode_without_ions(self): ): _ = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/../ICOHPLIST.lobster", + filename_icohp=f"{TEST_DIR}/../ICOHPLIST.lobster", structure=Structure.from_file(f"{TEST_DIR}/../POSCAR"), valences_from_charges=False, additional_condition=1, @@ -277,7 +292,7 @@ def test_cation_anion_mode_without_ions(self): ): _ = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/../ICOHPLIST.lobster", + filename_icohp=f"{TEST_DIR}/../ICOHPLIST.lobster", structure=Structure.from_file(f"{TEST_DIR}/../POSCAR"), valences_from_charges=False, additional_condition=1, @@ -290,20 +305,20 @@ def test_wrong_additional_correction(self): ): LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", additional_condition=10, ) def test_set_limits(self): test = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_353.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_353.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.mp-353.gz", additional_condition=1, limits=[-100000, 0], ) @@ -611,10 +626,10 @@ def test_structure_graph(self): def test_extended_structure_graph(self): self.chem_env_lobsterNaCl = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.NaCl.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.NaCl.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.NaCl.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.NaCl.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.NaCl.gz", filename_blist_sg1=f"{TEST_DIR}/ICOBILIST.lobster.NaCl.gz", filename_blist_sg2=f"{TEST_DIR}/ICOOPLIST.lobster.NaCl.gz", add_additional_data_sg=True, @@ -639,10 +654,10 @@ def test_raises_extended_structure_graph(self): with pytest.raises(ValueError, match="Algorithm can only work with ICOOPs, ICOBIs"): self.chem_env_lobsterNaCl = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.NaCl.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.NaCl.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.NaCl.gz"), valences_from_charges=True, - filename_CHARGE=f"{TEST_DIR}/CHARGE.lobster.NaCl.gz", + filename_charge=f"{TEST_DIR}/CHARGE.lobster.NaCl.gz", filename_blist_sg1=f"{TEST_DIR}/ICOBILIST.lobster.NaCl.gz", filename_blist_sg2=f"{TEST_DIR}/ICOOPLIST.lobster.NaCl.gz", add_additional_data_sg=True, @@ -703,7 +718,7 @@ def test_get_sum_icohps_between_neighbors_of_atom(self): chemenv_here = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp-7000.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp-7000.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp-7000.gz"), additional_condition=1, ) @@ -737,13 +752,13 @@ def test_get_plot_label(self): def test_get_info_cohps_to_neighbors(self): chem_env_lobster1 = LobsterNeighbors( are_coops=False, - filename_ICOHP=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190_2.gz", + filename_icohp=f"{TEST_DIR}/ICOHPLIST.lobster.mp_190_2.gz", structure=Structure.from_file(f"{TEST_DIR}/POSCAR.mp_190.gz"), additional_condition=1, ) cohpcar_lobster_mp_190 = f"{TEST_DIR}/COHPCAR.lobster.mp-190.gz" plot_label, summed_cohpcar_mp_190 = chem_env_lobster1.get_info_cohps_to_neighbors( - path_to_COHPCAR=cohpcar_lobster_mp_190, + path_to_cohpcar=cohpcar_lobster_mp_190, isites=[0], only_bonds_to=["O"], ) @@ -751,7 +766,7 @@ def test_get_info_cohps_to_neighbors(self): assert isinstance(summed_cohpcar_mp_190, Cohp) coph_thing = chem_env_lobster1.get_info_cohps_to_neighbors( - path_to_COHPCAR=cohpcar_lobster_mp_190, + path_to_cohpcar=cohpcar_lobster_mp_190, isites=[0], only_bonds_to=None, per_bond=False, @@ -762,7 +777,7 @@ def test_get_info_cohps_to_neighbors(self): # summed_spin_channel coph_thing = chem_env_lobster1.get_info_cohps_to_neighbors( - path_to_COHPCAR=cohpcar_lobster_mp_190, + path_to_cohpcar=cohpcar_lobster_mp_190, isites=[0], only_bonds_to=None, per_bond=False, @@ -771,7 +786,7 @@ def test_get_info_cohps_to_neighbors(self): assert coph_thing.icohp[Spin.up][300] == approx(chem_env_lobster1.get_info_icohps_to_neighbors(isites=[0])[0]) plot_label, summed_cohpcar_mp_190_Te = chem_env_lobster1.get_info_cohps_to_neighbors( - path_to_COHPCAR=cohpcar_lobster_mp_190, + path_to_cohpcar=cohpcar_lobster_mp_190, isites=[0], only_bonds_to=["Te"], ) @@ -780,14 +795,26 @@ def test_get_info_cohps_to_neighbors(self): assert summed_cohpcar_mp_190_Te is None plot_label, _summed_cohpcar_NaSi = self.chem_env_lobster0_NaSi.get_info_cohps_to_neighbors( - path_to_COHPCAR=f"{TEST_DIR}/COHPCAR.lobster.NaSi.gz", + path_to_cohpcar=f"{TEST_DIR}/COHPCAR.lobster.NaSi.gz", isites=[8], onlycation_isites=False, only_bonds_to=["Na"], ) assert plot_label == "1 x Na-Si (per bond)" + + obj_cohpcar = CompleteCohp.from_file( + filename=f"{TEST_DIR}/COHPCAR.lobster.NaSi.gz", fmt="LOBSTER", structure_file=f"{TEST_DIR}/POSCAR.NaSi.gz" + ) + plot_label_obj, _summed_cohpcar_NaSi_obj = self.chem_env_w_obj.get_info_cohps_to_neighbors( + obj_cohpcar=obj_cohpcar, + isites=[8], + onlycation_isites=False, + only_bonds_to=["Na"], + ) + assert plot_label_obj == "1 x Na-Si (per bond)" + info = self.chem_env_lobster0_NaSi.get_info_cohps_to_neighbors( - path_to_COHPCAR=f"{TEST_DIR}/COHPCAR.lobster.NaSi.gz", + path_to_cohpcar=f"{TEST_DIR}/COHPCAR.lobster.NaSi.gz", isites=[8], onlycation_isites=False, only_bonds_to=["Si"], @@ -795,14 +822,14 @@ def test_get_info_cohps_to_neighbors(self): assert info == "3 x Si-Si (per bond)" chem_env_lobster1.plot_cohps_of_neighbors( - path_to_COHPCAR=cohpcar_lobster_mp_190, + path_to_cohpcar=cohpcar_lobster_mp_190, isites=[0], only_bonds_to=["O"], summed_spin_channels=True, ) chem_env_lobster1.plot_cohps_of_neighbors( - path_to_COHPCAR=cohpcar_lobster_mp_190, + path_to_cohpcar=cohpcar_lobster_mp_190, isites=[0], only_bonds_to=["O"], summed_spin_channels=True, @@ -814,7 +841,7 @@ def test_get_info_cohps_to_neighbors(self): with pytest.raises(ValueError, match=expected_msg): # icohplist and cohpcar do not fit together self.chem_env_lobster1.get_info_cohps_to_neighbors( - path_to_COHPCAR=cohpcar_lobster_mp_190, + path_to_cohpcar=cohpcar_lobster_mp_190, isites=[0], only_bonds_to=None, per_bond=False, @@ -823,7 +850,7 @@ def test_get_info_cohps_to_neighbors(self): with pytest.raises(ValueError, match=expected_msg): # icohplist and cohpcar do not fit together self.chem_env_lobster2.get_info_cohps_to_neighbors( - path_to_COHPCAR=cohpcar_lobster_mp_190, + path_to_cohpcar=cohpcar_lobster_mp_190, isites=[0], only_bonds_to=None, per_bond=False,