Source code for openff.interchange.components.mbuild
"""Utilities for processing and interfacing with mBuild models."""
from typing import TYPE_CHECKING
from openff.toolkit import Molecule, Topology, unit
from openff.utilities.utilities import has_package, requires_package
if has_package("mbuild") or TYPE_CHECKING:
import mbuild as mb
[docs]@requires_package("mbuild")
def offmol_to_compound(off_mol: "Molecule") -> "mb.Compound":
"""
Convert an OpenFF Molecule into an mBuild Compound.
Examples
--------
.. code-block:: python
>>> from openff.toolkit import Molecule
>>> from openff.interchange.components.mbuild import offmol_to_compound
>>> mol = Molecule.from_smiles("CCO")
>>> compound = offmol_to_compound(mol)
>>> type(compound), compound.n_particles, compound.n_bonds
(<class 'mbuild.compound.Compound'>, 9, 8)
"""
if not off_mol.has_unique_atom_names:
off_mol.generate_unique_atom_names()
if off_mol.n_conformers == 0:
off_mol.generate_conformers(n_conformers=1)
comp = mb.Compound()
comp.name = off_mol.name
for a in off_mol.atoms:
atom_comp = mb.Particle(name=a.symbol)
comp.add(atom_comp, label=a.name)
for b in off_mol.bonds:
comp.add_bond((comp[b.atom1_index], comp[b.atom2_index]))
comp.xyz = off_mol.conformers[0].m_as(unit.nanometer)
return comp
[docs]@requires_package("mbuild")
def offtop_to_compound(off_top: "Topology") -> "mb.Compound":
"""
Convert an OpenFF Topology into an mBuild Compound.
Examples
--------
.. code-block:: python
>>> from openff.toolkit import Molecule, Topology
>>> from openff.interchange.components.mbuild import offtop_to_compound
>>> ethanol = Molecule.from_smiles("CCO")
>>> ethanol.name = "ETH"
>>> methane = Molecule.from_smiles("C")
>>> methane.name = "MET"
>>> top = Topology.from_molecules([ethanol, ethanol, methane, methane])
>>> compound = offtop_to_compound(top)
>>> type(compound), len(compound.children), compound.n_particles, compound.n_bonds
(<class 'mbuild.compound.Compound'>, 4, 28, 24)
"""
return mb.Compound(
subcompounds=[offmol_to_compound(molecule) for molecule in off_top.molecules],
)