from openff.toolkit import Molecule
Note: The content below demonstrates usage of nglview
with openforcefield
. This can be tricky to get working. Install with:
conda install -c conda-forge nglview
And configure for use with Jupyter with:
jupyter-nbextension enable nglview --py --sys-prefix
To use with Jupyterlab, configure with:
jupyter labextension install nglview-js-widgets
jupyter-labextension install @jupyter-widgets/jupyterlab-manager
openff-toolkit
¶PR #560 introduced rich representation for the Molecule
objects. This means you can visualize them in your Jupyter Notebooks.
We have implemented three backends:
There are two ways to invoke the visualization:
Molecule.visualize()
Implicit visualization will try to use nglview
if there are conformers and fall back to rdkit
and openeye
(in that order) if they are not available.
m = Molecule.from_smiles("CCCCOCC")
m
The regular display()
call works on Molecule
objects too.
display(m) # noqa
Explicit visualization works as one would expect:
m.visualize()
This method can take a backend
parameter, which defaults to rdkit
:
m.visualize(backend="rdkit")
openeye
can also be used, if available:
try:
from openeye import oechem
assert oechem.OEChemIsLicensed()
m.visualize(backend="openeye")
except (ImportError, AssertionError):
print('Visualizing with `backend="openeye"` requires the OpenEye Toolkits')
nglview
, if installed, can only be used if conformers have been generated:
try:
m.visualize(backend="nglview") # this will fail because we have no conformers yet
except ValueError as excinfo:
# Catch the exception and print its message
print(str(excinfo))
Visualizing with NGLview requires that the molecule has conformers.
But, once you generate them, it works! You can zoom in/out, rotate and translate the molecule. You can even inspect the different conformers (if available) using the trajectory player:
m.generate_conformers()
m.visualize(backend="nglview")
NGLWidget(max_frame=2)
For example, a benzene ring will not have multiple conformers, so you won't see the trajectory player.
n = Molecule.from_smiles("c1ccccc1")
n.generate_conformers()
n
NGLWidget()
Notice that, once conformers are available, the implicit representation will use nglview
to provide a 3D visualization.