Source code for moffragmentor.molecule.nonsbumolecule
# -*- coding: utf-8 -*-
"""Dealing with molecules that not part of a secondary building unit."""
from typing import List, Optional
from pymatgen.analysis.graphs import MoleculeGraph, StructureGraph
from pymatgen.core import Molecule
from ..utils import get_edge_dict, remove_all_nodes_not_in_indices
[docs]class NonSbuMolecule:
"""Class to handle solvent or other non-SBU molecules."""
def __init__(
self,
molecule: Molecule,
molecule_graph: MoleculeGraph,
indices: List[int],
connecting_index: Optional[int] = None,
):
"""Construct a NonSbuMolecule.
Args:
molecule (Molecule): A pymatgen Molecule object.
molecule_graph (MoleculeGraph): A pymatgen MoleculeGraph object.
indices (List[int]): List of indices of the molecule
in the original structure.
connecting_index (int, optional): List of connecting indices
in the original structure. Defaults to None.
"""
self.molecule = molecule
self.molecule_graph = molecule_graph
self.indices = indices
# We store the connecting index to see which atom we would
# need to give the elctron from the bond to the metal,
# it is not used atm but (hopefully) will be
self.connecting_index = connecting_index
@property
def composition(self) -> str:
return self.molecule.composition.alphabetical_formula
def __str__(self):
"""Return string representation of the molecule (the composition)."""
return str(self.composition)
def __len__(self):
"""Return number of atoms in the molecule"""
return len(self.molecule)
[docs] @classmethod
def from_structure_graph_and_indices(
cls, structure_graph: StructureGraph, indices: List[int]
) -> "NonSbuMolecule":
"""Create a a new NonSbuMolecule from a part of a structure graph.
Args:
structure_graph (StructureGraph): Structure graph with structure attribute
indices (List[int]): Indices that label nodes in the structure graph,
indexing the molecule of interest
Returns:
NonSbuMolecule: Instance of NonSbuMolecule
"""
my_graph = structure_graph.__copy__()
remove_all_nodes_not_in_indices(my_graph, indices)
structure = my_graph.structure
sites = []
for site in structure:
sites.append(site)
mol = Molecule.from_sites(sites)
molecule_graph = MoleculeGraph.with_edges(mol, get_edge_dict(my_graph))
return cls(mol, molecule_graph, indices)
[docs] def show_molecule(self):
"""Use nglview to show the molecule."""
import nglview # pylint:disable=import-outside-toplevel
return nglview.show_pymatgen(self.molecule)