def featurize(self, comp): """ Args: comp: (Composition) pymatgen Composition object Returns: HOMO_character: (str) orbital symbol ('s', 'p', 'd', or 'f') HOMO_element: (str) symbol of element for H**O HOMO_energy: (float in eV) absolute energy of H**O LUMO_character: (str) orbital symbol ('s', 'p', 'd', or 'f') LUMO_element: (str) symbol of element for LUMO LUMO_energy: (float in eV) absolute energy of LUMO gap_AO: (float in eV) the estimated bandgap from H**O and LUMO energeis """ integer_comp, factor = comp.get_integer_formula_and_factor() # warning message if composition is dilute and truncated if not (len(Composition(comp).elements) == len( Composition(integer_comp).elements)): warn('AtomicOrbitals: {} truncated to {}'.format( comp, integer_comp)) homo_lumo = MolecularOrbitals(integer_comp).band_edges feat = collections.OrderedDict() for edge in ['H**O', 'LUMO']: if homo_lumo[edge] is not None: feat['{}_character'.format(edge)] = homo_lumo[edge][1][-1] feat['{}_element'.format(edge)] = homo_lumo[edge][0] feat['{}_energy'.format(edge)] = homo_lumo[edge][2] else: #if LUMO is None feat['{}_character'.format(edge)] = 'na' feat['{}_element'.format(edge)] = 'na' #unclear what this value should be. Arbitrarily set to 0. Don't want NaN for modeling feat['{}_energy'.format(edge)] = 0 feat['gap_AO'] = feat['LUMO_energy'] - feat['HOMO_energy'] return list(feat.values())
def featurize(self, comp): """ Args: comp: (Composition) pymatgen Composition object Returns: HOMO_character: (str) orbital symbol ('s', 'p', 'd', or 'f') HOMO_element: (str) symbol of element for H**O HOMO_energy: (float in eV) absolute energy of H**O LUMO_character: (str) orbital symbol ('s', 'p', 'd', or 'f') LUMO_element: (str) symbol of element for LUMO LUMO_energy: (float in eV) absolute energy of LUMO gap_AO: (float in eV) the estimated bandgap from H**O and LUMO energeis """ # NOTE comprhys: factor is unused # integer_comp, factor = comp.get_integer_formula_and_factor() integer_comp, _ = comp.get_integer_formula_and_factor() # warning message if composition is dilute and truncated if not (len(Composition(comp).elements) == len( Composition(integer_comp).elements)): warn(f"AtomicOrbitals: {comp} truncated to {integer_comp}") homo_lumo = MolecularOrbitals(integer_comp).band_edges feat = collections.OrderedDict() for edge in ['H**O', 'LUMO']: feat[f"{edge}_character"] = homo_lumo[edge][1][-1] feat[f"{edge}_element"] = homo_lumo[edge][0] feat[f"{edge}_energy"] = homo_lumo[edge][2] feat['gap_AO'] = feat['LUMO_energy'] - feat['HOMO_energy'] return list(feat.values())
def test_fractional_compositions(self): self.assertRaises(ValueError, lambda: MolecularOrbitals('Na0.5Cl0.5'))
# coding: utf-8 # Copyright (c) Pymatgen Development Team. # Distributed under the terms of the MIT License. from __future__ import division, unicode_literals import unittest from pymatgen.util.testing import PymatgenTest from pymatgen.core.molecular_orbitals import MolecularOrbitals test_case = MolecularOrbitals('NaCl') class MolecularOrbitalTestCase(PymatgenTest): def test_max_electronegativity(self): test_elec_neg = 2.23 self.assertEqual(test_elec_neg, test_case.max_electronegativity()) def test_aos_as_list(self): test_list = [['Cl', '1s', -100.369229], ['Na', '1s', -37.719975], ['Cl', '2s', -9.187993], ['Cl', '2p', -7.039982], ['Na', '2s', -2.063401], ['Na', '2p', -1.060636], ['Cl', '3s', -0.754458], ['Cl', '3p', -0.32038], ['Na', '3s', -0.103415]] self.assertEqual(test_list, test_case.aos_as_list()) def test_obtain_band_edges(self): test_edges = {'H**O': ['Cl', '3p', -0.32038], 'LUMO': ['Na', '3s', -0.103415],
# Copyright (c) Pymatgen Development Team. # Distributed under the terms of the MIT License. import unittest from pymatgen.core.molecular_orbitals import MolecularOrbitals from pymatgen.util.testing import PymatgenTest test_case = MolecularOrbitals("NaCl") class MolecularOrbitalTestCase(PymatgenTest): def test_max_electronegativity(self): test_elec_neg = 2.23 self.assertEqual(test_elec_neg, test_case.max_electronegativity()) def test_aos_as_list(self): test_list = [ ["Cl", "1s", -100.369229], ["Na", "1s", -37.719975], ["Cl", "2s", -9.187993], ["Cl", "2p", -7.039982], ["Na", "2s", -2.063401], ["Na", "2p", -1.060636], ["Cl", "3s", -0.754458], ["Cl", "3p", -0.32038], ["Na", "3s", -0.103415], ] self.assertEqual(test_list, test_case.aos_as_list()) def test_obtain_band_edges(self):