Source code for pymatgen.analysis.chemenv.utils.defs_utils
# coding: utf-8
# Copyright (c) Pymatgen Development Team.
# Distributed under the terms of the MIT License.
"""
This module contains the definition of some objects used in the chemenv package.
"""
__author__ = "David Waroquiers"
__copyright__ = "Copyright 2012, The Materials Project"
__credits__ = "Geoffroy Hautier"
__version__ = "2.0"
__maintainer__ = "David Waroquiers"
__email__ = "david.waroquiers@gmail.com"
__date__ = "Feb 20, 2016"
from pymatgen.analysis.chemenv.utils.coordination_geometry_utils import is_anion_cation_bond
STATS_ENV_PAPER = 'David Waroquiers, Xavier Gonze, Gian-Marco Rignanese, Cathrin Welker-Nieuwoudt, Frank Rosowski,\n' \
'Michael Goebel, Stephan Schenk, Peter Degelmann, Rute Andre, Robert Glaum, and Geoffroy Hautier,\n' \
'"Statistical analysis of coordination environments in oxides",\n' \
'Chem. Mater., 2017, 29 (19), pp 8346-8360,\n' \
'DOI: 10.1021/acs.chemmater.7b02766\n'
[docs]def chemenv_citations():
out = ''
out += '\nIf you use the ChemEnv tool for your research, please consider citing the following reference(s) :\n'
out += '==================================================================================================\n'
out += STATS_ENV_PAPER
return out
[docs]class AdditionalConditions():
NO_ADDITIONAL_CONDITION = 0
ONLY_ANION_CATION_BONDS = 1
NO_ELEMENT_TO_SAME_ELEMENT_BONDS = 2
ONLY_ANION_CATION_BONDS_AND_NO_ELEMENT_TO_SAME_ELEMENT_BONDS = 3
ONLY_ELEMENT_TO_OXYGEN_BONDS = 4
# Short versions
NONE = NO_ADDITIONAL_CONDITION
NO_AC = NO_ADDITIONAL_CONDITION
ONLY_ACB = ONLY_ANION_CATION_BONDS
NO_E2SEB = NO_ELEMENT_TO_SAME_ELEMENT_BONDS
ONLY_ACB_AND_NO_E2SEB = ONLY_ANION_CATION_BONDS_AND_NO_ELEMENT_TO_SAME_ELEMENT_BONDS
ONLY_E2OB = ONLY_ELEMENT_TO_OXYGEN_BONDS
# Dictionary mapping of integer for the condition and its "description"
CONDITION_DESCRIPTION = {NO_ADDITIONAL_CONDITION: 'No additional condition',
ONLY_ANION_CATION_BONDS: 'Only anion-cation bonds',
NO_ELEMENT_TO_SAME_ELEMENT_BONDS: 'No element-element bonds (same elements)',
ONLY_ANION_CATION_BONDS_AND_NO_ELEMENT_TO_SAME_ELEMENT_BONDS: 'Only anion-cation bonds and'
' no element-element bonds'
' (same elements)',
ONLY_ELEMENT_TO_OXYGEN_BONDS: 'Only element-oxygen bonds'}
ALL = [NONE, ONLY_ACB, NO_E2SEB, ONLY_ACB_AND_NO_E2SEB, ONLY_E2OB]
[docs] def check_condition(self, condition, structure, parameters):
if condition == self.NONE:
return True
elif condition == self.ONLY_ACB:
valences = parameters['valences']
ii = parameters['site_index']
jj = parameters['neighbor_index']
return is_anion_cation_bond(valences, ii, jj)
elif condition == self.NO_E2SEB:
ii = parameters['site_index']
jj = parameters['neighbor_index']
elmts_ii = [sp.symbol for sp in structure[ii].species]
elmts_jj = [sp.symbol for sp in structure[jj].species]
return len(set(elmts_ii) & set(elmts_jj)) == 0
elif condition == self.ONLY_ACB_AND_NO_E2SEB:
valences = parameters['valences']
ii = parameters['site_index']
jj = parameters['neighbor_index']
elmts_ii = [sp.symbol for sp in structure[ii].species]
elmts_jj = [sp.symbol for sp in structure[jj].species]
return len(set(elmts_ii) & set(elmts_jj)) == 0 and is_anion_cation_bond(valences, ii, jj)
elif condition == self.ONLY_E2OB:
ii = parameters['site_index']
jj = parameters['neighbor_index']
elmts_ii = [sp.symbol for sp in structure[ii].species]
elmts_jj = [sp.symbol for sp in structure[jj].species]
return ('O' in elmts_jj and 'O' not in elmts_ii) or ('O' in elmts_ii and 'O' not in elmts_jj)