Source code for pymatgen.analysis.chemenv.connectivity.connectivity_finder
"""
Module implementing connectivity finding.
"""
import logging
import numpy as np
from pymatgen.analysis.chemenv.connectivity.structure_connectivity import (
StructureConnectivity,
)
__author__ = "David Waroquiers"
__copyright__ = "Copyright 2012, The Materials Project"
__credits__ = "Geoffroy Hautier"
__version__ = "1.0"
__maintainer__ = "David Waroquiers"
__email__ = "david.waroquiers@gmail.com"
__date__ = "June 25, 2019"
[docs]class ConnectivityFinder:
"""
Main class used to find the structure connectivity of a structure
"""
def __init__(self, multiple_environments_choice=None):
"""
Constructor for the ConnectivityFinder.
:param multiple_environments_choice: defines the procedure to apply when
the environment of a given site is described as a "mix" of more than one
coordination environments.
"""
self.setup_parameters(multiple_environments_choice=multiple_environments_choice)
[docs] def get_structure_connectivity(self, light_structure_environments):
"""
Get the structure connectivity from the coordination environments provided
as an input.
:param light_structure_environments: LightStructureEnvironments with the
relevant coordination environments in the structure
:return: a StructureConnectivity object describing the connectivity of
the environments in the structure
"""
logging.info("Setup of structure connectivity graph")
structure_connectivity = StructureConnectivity(light_structure_environments)
structure_connectivity.add_sites()
for isite, site in enumerate(light_structure_environments.structure):
site_neighbors_sets = light_structure_environments.neighbors_sets[isite]
if site_neighbors_sets is None:
continue
if len(site_neighbors_sets) > 1:
if self.multiple_environments_choice is None:
raise ValueError(
"Local environment of site {:d} is a mix and " "nothing is asked about it".format(isite)
)
if self.multiple_environments_choice == "TAKE_HIGHEST_FRACTION":
imax = np.argmax(
[ee["ce_fraction"] for ee in light_structure_environments.coordination_environments[isite]]
)
print("IMAX {:d}".format(imax))
site_neighbors_set = site_neighbors_sets[imax]
else:
raise RuntimeError("Should not be here")
else:
site_neighbors_set = site_neighbors_sets[0]
structure_connectivity.add_bonds(isite, site_neighbors_set)
return structure_connectivity
[docs] def setup_parameters(self, multiple_environments_choice):
"""
Setup of the parameters for the connectivity finder.
"""
if multiple_environments_choice is not None:
if multiple_environments_choice not in ["TAKE_HIGHEST_FRACTION"]:
raise ValueError(
'Option "{}" for multiple_environments_choice is '
"not allowed".format(multiple_environments_choice)
)
self.multiple_environments_choice = multiple_environments_choice