Skip to content

Instantly share code, notes, and snippets.

@j-wags
Last active October 13, 2022 09:50
Show Gist options
  • Save j-wags/9de19462450f45f7ec7116fbd212193e to your computer and use it in GitHub Desktop.
Save j-wags/9de19462450f45f7ec7116fbd212193e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "8ba104a0",
"metadata": {},
"source": [
"[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gist/j-wags/9de19462450f45f7ec7116fbd212193e/HEAD)\n",
"\n",
"Handle imports"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "1fb4e51f",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"LICENSE: Could not open license file specified by OE_LICENSE environment variable \"/Users/jeffreywagner/oe_license.txt\"\n",
"LICENSE: Could not open license file \"oe_license.txt\" in local directory\n",
"LICENSE: N.B. OE_DIR environment variable is not set\n",
"LICENSE: No product keys!\n",
"LICENSE: No product keys!\n",
"LICENSE: No product keys!\n",
"Warning: Unable to load toolkit 'OpenEye Toolkit'. The Open Force Field Toolkit does not require the OpenEye Toolkits, and can use RDKit/AmberTools instead. However, if you have a valid license for the OpenEye Toolkits, consider installing them for faster performance and additional file format support: https://docs.eyesopen.com/toolkits/python/quickstart-python/linuxosx.html OpenEye offers free Toolkit licenses for academics: https://www.eyesopen.com/academic-licensing\n",
"LICENSE: No product keys!\n"
]
}
],
"source": [
"from rdkit import Chem\n",
"\n",
"from openff.toolkit import Molecule, ForceField, Topology\n",
"from openff.units import unit\n",
"from openff.units.openmm import from_openmm\n",
"from io import StringIO\n",
"from pdbfixer import PDBFixer\n",
"import openmm.unit as omm_unit"
]
},
{
"cell_type": "markdown",
"id": "9a3e3115",
"metadata": {},
"source": [
"Make an RDKit Molecule, and turn that into an OpenFF Molecukle"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "aa44f8b6",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "45f687a7dae64309b54d3faf150d6e9d",
"version_major": 2,
"version_minor": 0
},
"text/plain": []
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d48888c150024a5d999a603b4c728d16",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"NGLWidget()"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"rdmol = Chem.MolFromSmiles('CC(=O)NC1=CC=C(C=C1)O')\n",
"\n",
"offmol = Molecule.from_rdkit(rdmol)\n",
"offmol.generate_conformers()\n",
"offmol.conformers[0] += [15, 15, 15] * unit.angstrom\n",
"\n",
"offmol"
]
},
{
"cell_type": "markdown",
"id": "2d8cdd4a",
"metadata": {},
"source": [
"Make another RDKit Molecule using a simple chemical reaction "
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "0c720116",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<rdkit.Chem.rdchem.Mol at 0x17e79fdd0>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rxn = Chem.rdChemReactions.ReactionFromSmarts(\n",
" '[C:1]=[O]' \n",
" + '>>'\n",
" + '[C:1]=[S]'\n",
")\n",
"products = rxn.RunReactants([rdmol])\n",
"\n",
"product = products[0][0]\n",
"Chem.SanitizeMol(product)\n",
"product\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "9a01d06c",
"metadata": {},
"source": [
"Convert the product of the chemical reaction to an OpenFF Molecule"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "9d69b8b7",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0924e1e1cf1a4cc58b896bda0d7ba7a3",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"NGLWidget()"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"product_offmol = Molecule.from_rdkit(product)\n",
"product_offmol.generate_conformers()\n",
"# Offset so the visualization will be nicer\n",
"product_offmol.conformers[0] += [7, 7, 7] * unit.angstrom\n",
"product_offmol"
]
},
{
"cell_type": "markdown",
"id": "f79f3ebe",
"metadata": {},
"source": [
"Load a molecule from SDF file containing several different elements and a net charge (we also cover Br and I but I but they make the AM1 calculation take too long)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "1ea09360",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "06c750dccb654c7e86dd6f1b72b876fe",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"NGLWidget()"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"chonpsfcl = Molecule.from_file('CHONPSFCl.sdf')\n",
"chonpsfcl"
]
},
{
"cell_type": "markdown",
"id": "f42b27bc",
"metadata": {},
"source": [
"Make and solvate a box containing both molecules using OpenMM"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "56aa8fd6",
"metadata": {},
"outputs": [],
"source": [
"offtop = Topology.from_molecules([offmol, product_offmol, chonpsfcl])\n",
"offtop.box_vectors = ([2., 2., 2.,] * unit.nanometer)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "ceed4c72",
"metadata": {},
"outputs": [],
"source": [
"with StringIO() as f:\n",
" offtop.to_file(f)\n",
" f.seek(0)\n",
" fixer = PDBFixer(pdbfile=f)\n",
"\n",
"fixer.addSolvent(\n",
" boxVectors=offtop.box_vectors.to_openmm(),\n",
" positiveIon='Na+',\n",
" negativeIon='Cl-',\n",
" ionicStrength=1.0 * omm_unit.molar,\n",
")\n",
"\n",
"solvated_topology = Topology.from_openmm(\n",
" fixer.topology,\n",
" unique_molecules={\n",
" *offtop.molecules,\n",
" Molecule.from_smiles(\"O\"),\n",
" Molecule.from_smiles(\"[Na+]\"),\n",
" Molecule.from_smiles(\"[Cl-]\"),\n",
" },\n",
")\n",
"solvated_topology.set_positions(from_openmm(fixer.positions))\n"
]
},
{
"cell_type": "markdown",
"id": "e2de8288",
"metadata": {},
"source": [
"Apply the Sage force field to the molecules in the topology"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "e466d18f",
"metadata": {},
"outputs": [],
"source": [
"ff = ForceField('openff-2.0.0.offxml')\n",
"\n",
"interchange = ff.create_interchange(solvated_topology)\n",
"omm_system = interchange.to_openmm()\n",
"omm_top = interchange.to_openmm_topology()"
]
},
{
"cell_type": "markdown",
"id": "fb6eda86",
"metadata": {},
"source": [
"Generic OpenMM simulation setup + execution"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "2b03a24d",
"metadata": {},
"outputs": [],
"source": [
"import openmm\n",
"\n",
"# Construct and configure a Langevin integrator at 300 K with an appropriate friction constant and time-step\n",
"integrator = openmm.LangevinIntegrator(\n",
" 300 * openmm.unit.kelvin,\n",
" 1 / openmm.unit.picosecond,\n",
" 0.002 * openmm.unit.picoseconds,\n",
")\n",
"\n",
"# Combine the topology, system, integrator and initial positions into a simulation\n",
"simulation = openmm.app.Simulation(omm_top, omm_system, integrator)\n",
"simulation.context.setPositions(solvated_topology.get_positions().to_openmm())\n",
"\n",
"# Add a reporter to record the structure every 10 steps\n",
"dcd_reporter = openmm.app.DCDReporter(\"trajectory.dcd\", 10)\n",
"simulation.reporters.append(dcd_reporter)\n",
"\n",
"simulation.context.setVelocitiesToTemperature(300 * openmm.unit.kelvin)\n",
"simulation.runForClockTime(.25 * openmm.unit.minute)"
]
},
{
"cell_type": "markdown",
"id": "5b5c3ffb",
"metadata": {},
"source": [
"Visualize simulation using NglView"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "337106c1",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "191e4fbcbad94cd896fa75476a9276e3",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"NGLWidget(max_frame=327)"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import mdtraj, nglview\n",
"trajectory: mdtraj.Trajectory = mdtraj.load(\n",
" \"trajectory.dcd\", \n",
" top=mdtraj.Topology.from_openmm(omm_top)\n",
")\n",
"\n",
"view = nglview.show_mdtraj(trajectory)\n",
"view.add_ball_and_stick()\n",
"\n",
"view"
]
},
{
"cell_type": "markdown",
"id": "f109c556",
"metadata": {},
"source": [
"Next steps:\n",
"\n",
"* Try simulating your own inputs - I (Jeff Wagner) will be on Discord if you have any questions - I'd love to hear about more use cases! (warning: pub o' clock is in about ~3 hours...)\n",
"* If you'd like more help, please use our [Issue Tracker](https://github.com/openforcefield/openff-toolkit/issues)\n",
"* I'll be at the hackathon tomorrow!\n",
"* To install and run locally - \n",
" * Download [this gist](https://gist.github.com/j-wags/9de19462450f45f7ec7116fbd212193e)\n",
" * build the environment `conda env create -n openff -f environment.yaml` \n",
" * Activate the environment `conda activate openff` \n",
" * Open the notebook `jupyter-notebook`\n",
"* or see our [installation guide](https://docs.openforcefield.org/projects/toolkit/en/stable/installation.html)\n",
"\n",
"Other OpenFF examples:\n",
"* [The OpenFF Toolkit Showcase](https://github.com/openforcefield/openff-toolkit/tree/main/examples/toolkit_showcase)\n",
"* [Automatic torsion parameter generation using BespokeFit](https://docs.openforcefield.org/projects/bespokefit/en/latest/getting-started/quick-start.html)\n",
"* Generating parameters for a [post-translationally modified protein](https://gist.github.com/Yoshanuikabundi/66007cb9966b1455a259baaf7cd7e7c3#file-readme-md)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a0ad7f6e",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

Jeff's Open Force Field live demo at the 2022 RDKit UGM

Binder

RDKit 3D
17 17 0 0 0 0 0 0 0 0999 V2000
-0.3177 10.4177 17.5788 C 0 0 1 0 0 0 0 0 0 0 0 0
-0.5570 11.2140 16.4984 F 0 0 0 0 0 0 0 0 0 0 0 0
0.8675 9.5430 17.4816 C 0 0 1 0 0 0 0 0 0 0 0 0
1.5103 9.6872 15.8097 Cl 0 0 0 0 0 0 0 0 0 0 0 0
0.6584 8.4683 17.6295 H 0 0 0 0 0 0 0 0 0 0 0 0
1.9338 9.9747 18.4138 C 0 0 2 0 0 0 0 0 0 0 0 0
2.8354 8.9536 18.6789 O 0 0 0 0 0 0 0 0 0 0 0 0
4.3739 9.4940 18.2485 P 0 0 2 0 0 5 0 0 0 0 0 0
5.3764 8.3805 18.1686 O 0 0 0 0 0 0 0 0 0 0 0 0
4.8879 10.6567 19.3632 O 0 0 0 0 0 1 0 0 0 0 0 0
4.2192 10.2478 16.7242 O 0 0 0 0 0 0 0 0 0 0 0 0
1.3437 10.3522 19.6783 N 0 0 0 0 0 0 0 0 0 0 0 0
0.0186 11.3987 19.0897 S 0 0 0 0 0 0 0 0 0 0 0 0
-1.2070 9.7765 17.8498 H 0 0 0 0 0 0 0 0 0 0 0 0
2.4797 10.8317 18.0037 H 0 0 0 0 0 0 0 0 0 0 0 0
4.6995 11.0984 16.7034 H 0 0 0 0 0 0 0 0 0 0 0 0
0.8773 9.5051 20.0798 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
1 3 1 0
3 4 1 0
3 5 1 1
3 6 1 0
6 7 1 0
7 8 1 0
8 9 2 0
8 10 1 1
8 11 1 0
6 12 1 0
12 13 1 0
13 1 1 0
1 14 1 1
6 15 1 6
11 16 1 0
12 17 1 0
M CHG 1 10 -1
M END
$$$$
channels:
- jaimergp/label/unsupported-cudatoolkit-shim
- conda-forge
dependencies:
# Runtime
- python >=3.8
- jupyter
- openff-toolkit =0.11.1
- pdbfixer
- nglview
- ipywidgets < 8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment