Jeff's Open Force Field live demo at the 2022 RDKit UGM
Last active
October 13, 2022 09:50
-
-
Save j-wags/9de19462450f45f7ec7116fbd212193e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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": "iVBORw0KGgoAAAANSUhEUgAAAcIAAACWCAIAAADCEh9HAAAABmJLR0QA/wD/AP+gvaeTAAAfP0lEQVR4nO3de1RTZ7o/8CcJhEu4iEAE8UKxirVoVbyBEEjYwFhrO73odNrfaU+njnamqzPnnLVm9Nhf7Zq2tvR0zXS62k5rxzk9TmfV1namZ9RSIJsA4eqPuy1eqgJSlEuDgUBIIMnevz82Rqqw2ZBk7+zk+Sz/0Nc3yQOtX9797L3fLaFpGhBCCM2VVOgCEEJI3DBGEULIJRijCCHkEoxRhBByCcYoQgi5JEDoAvzF+Hg3RQ3LZFGBgXFC14IQcieMUc+y2w3Xrr1oNH5qtw8wI1JpSHg4ER39f6KidglbG0LILTBGPchmu3b+fPr4+BUACAiIkcsXORwj4+NdQ0MnpVI5xihCvgFj1IO6u38zPn5FKlUkJh6NinoIQAIAFDU6NPRlQIBS6OoQQu4hwbuYPISmbS0tkRRlSUg4FBd3QOhyEEKegmfqPcVuv05RFgAICloudC0IIQ/CGPWUgID5zLfXZCoWuhaEkAdhjHqKRBIYEZEDAAbDX65c+fnY2GWhK0IIeQT2Rj3Iaj134YLKbjcAAIAkLCw9Ovpn8+fvkkrDBK4MIeQ+GKOeZbNd6+19/fr1Y3b798yITBauVP5HfPwLEolM2NoQQm6BMcoHmraZTEXXrx8bHDxBUWYAWLDgPxYt+r3QdSGE3ABjlFd2+/ft7T8ZHi6TSAJSUi7L5UuErggh5Co8xcSrgIDYxMSjAEDT9pGRaqHLQQi5AcYo3+TyBIkkCACcd9kjhEQNY5Rvo6MtND0GAHJ5gtC1IITcAGPUU2ja1t7+6ODgP5h7mRhW67ednU8BgEw2LzxcI1x1CCG3wa1JPGV4uNRo/NRo/FQqVQQHrwgIWGC391os39C0HUC6ZMmfZLJIoWtECLkBnqn3FIdj0Gj87Pr1YyMjlTRtvzEsCQvLXLjwpfDwLCGLQwi5D8aoOw0MfCiXJ4WFbZVIbi7zKcoyNvat3T4ok4UFBd2Ji1CEfAzGqNtQlLW1dT5Fjd1zT19AQIzQ5SCeWCyWwcHB+Ph4oQtBgsHeqNuMjFRSlCU0dANmqM+jKKq5uZkkSZIkq6qqCIIYGRk5duxYXBw+aMsfYYy6jcmkBYCICIJljt0+YDbXhodn4+4kYtTR0UGSpFar1el0AwPOh2tJa2trBwYGcnNzdTpdbGyssEUi/mGMus3wMAkAERG5LHNMpuKOjscjI7ffeecpvupCLhkZGamrq2MWno2Njc7xpKQkgiAIgtBoNBRF5eTkfP311yqVqqysDNek/gZj1D3sdsPoaKtUGqxQpLFMY1as4eE5fNWF5sJut7e2tjLRWVFRYbPZmPGwsLAtW7Yw6Zmamjr5JaWlpUySqtVqTFJ/gzHqHiYTCUCFhamk0hCWacPDpTDTgT8SSnt7OxOdxcXFJpOJGQwICEhNTWWiMysrKzAwcMrXxsbGYpL6LYxR9+ByRG+1nhsf/y4wcEFISApfdaEZ9PX16fV6kiQLCwu7u7ud485j9vz8/IiICC5vhUnqtzBG3cNkKgWA8HC2ZabJRAJAeHgu86RlJBSz2VxbW8ssPJuampzX/MXFxWVmZhIEsX379oSEuex4gEnqnzBG3cBq/XZ8vDMgICY0dA3LtBsrVjyiF4DD4WhpaWGiU6/Xj4+PM+MKhSItLY1ZeK5fv14icfUnHCapH8IYdYNJR/TTbvVC0/bh4QrA80v8crY7tVrt4OAgMyiTyZztTpVKJZfL3fuhmKT+BmPUDW4crbMtM83m0w7HUHDwKrl8EV91+an+/v6KigqSJIuKirq6upzjznZnXl5eZKRnb8nFJPUrGKOuomnH8HA5AEREsG18h0f0HjU6OlpTU3N7u1OpVGZlZREEsW3btsWLF/NZEiap/8AYddXoaL3DYQwOTpbLE1mmcbnHCc3K5HZnZWXl2NgYMx4aGpqenu7GduecYZL6CYxRV924op4tHx2OYbP5/0kkAWFhuD+eq5ztTpIkjUYjMzi53ZmZmRkUFCRskU6YpP4AY9RVTGOU/YrRkZFymraFhWXIZJyuQES3MBgMZWVlJEmWlJR0dnY6x53tToIgoqKihCuQDSapz8MYdQlFmc3m0xKJjH0b5htRi0f0s2CxWKqrq5lVZ3NzM0VRzHhMTIxarWbOFCUmJgpaIwCAw+GQyWTsczBJfRvGqEuGh8tpekyhSJPJ5rFMu3Hgz7ZiRZO9+eabBw4csFqtzB9DQkKYC+Nzc3PvueceAdudtzh+/Pgrr7xSUlIyYyxikvowjFGXcDmit9muWq3nZLJwhWIjX3WJ2+uvv3706NGxsTFnuzMjIyM4OFjoum5ls9lefvnlb775Jj8/v7S0NCZmhn1mMUl9Fo1c0NaW0tAAw8N6ljkGw4cNDXDp0v28VSV2KpUKAD766COhC5lZX19fSkoKANx11109PT1cXtLf37969WoAWLlyJceXIC+HD1ieO5ut12Jpk8nCFYotLNO4XJyPnMxm8+nTp2Uy2X333Sd0LTNTKpWlpaUpKSnnzp3TaDS9vb0zvoRZk65evfr8+fNqtZrLS5CXwxidO5NJC0CHhWVJJFNvngYAAPTwsA5mOvBHThUVFWNjY5s2bZo3j63d7D0wSTm5dAmefx4yMmDpUoiJgZUr4YEH4PBhsFh+MO2llyArC15+edr3OXQIsrLgxRc9Xe+sYIzOHZcbkyyWb2y2nsDAhODglXzVJW5arRYAcnPF9FMHk5QNTcMLL8CqVfDqq1BdDV1dMDAAFy7AiRPwzDOwfDno9Tcnnz0Lej2cPTvtu507B3o9tLXxUDh3GKNzx2WZeePmpTyeahI/kiQBgCBE1gPBJJ3Wv/0bvPIK2Gxw//2g08HwMFAUdHfDkSOwZAlcvQr5+VBVJXSVLsEYnaO2trZf/SrwzJkdwcF3sUzDW+lnpbe3t62tTaFQbN68WehaZg2TdApFRfD22wAAL74I//wnqNUQFgYSCSQkwNNPQ1MTrFkDViv8y7/cenQvKhijc6TVasvLO8rLo1j2YKbp8eHhSgBJeDjbriXISavV0jSdnZ3t9s3r+IFJeqvXXweahvT0qbuZ0dHwt7+BVAqdnXDsGO/FuQ3G6BxxOfYcGamhqJGQkNWBgXh5ICfMd1VcjdFbYJLe1NcH5eUAAL/8JUx3x8Tq1aBWAwB8+ilvdbkdxuhc2O32yspKiUTCHqMfflhVXLx1dHQXb4WJnU6nAxE2Rm+BSTqhrm7iNyoV27TsbACA06fhxvaGooN3Mc1FbW2tyWRKSUmJj49nmfbxx6dOnz69fv3/5a0wUWtra+vu7o6Li1u1apXQtbiKSdKcnJxvvvlGo9HodDp/vFuUeURgUBCw7/S6fDkAwNAQ3HgaK3z9NbzwwtSTW1vdWKC7YIzOBZcj+sHBwYaGBrlcnpmZyVdd4sZ8V/Py8lhumXc4HOPj4yEhbE+x9hKYpDA0BAAQFjbDNOeTCG485QXa2rztkiZ2GKNzweXaRp1O53A4VCqVQqHgqy5x4/LDqbKyctu2bU8++eT777/PV11z5+9Jyuz6euPpgdO6sQENhIZO/GbDBnjqqakn/8//QH29W6pzI4zRWTOZTMwyU8Xa8RHp9Y9Csdvter1+xnazVqu1Wq3h4eG8FeYi/0pSioLmZiBJyMyE9HSIjgYAGBmB0dGbEXm7/n4AAKn05rL0zjvhl7+cenJNjRfGKJ5imjWdTmez2bZs2RLGerTCrFgxRjli2s133303e7tZjD+cfP+MU08PfPYZ7N0LixbBhg2wfz988gkAwJo1AAA0DWfOsL28uRkAYNUqEOdVboAxOgdc/iVfuXLl0qVL8+bNS01N5asucePYbm5sbJTL5RkZGXzV5R4+mKRGI/z97/CLX8Dy5bBwIezaBR98AD09kJQEe/YAs63MmjUTC9J//GPa97Hb4Z//BADQiPnaaqG3mBKf5ORkAKitrWWZ8+c//xkAHn74Yd6qEru0tDQAOHXqFMuczz//HADUajVvVbmX6HfVs9nohga6oIAmCDowkAaY+BUWRhMEXVBANzTc+pLf/IYGoMPD6a6uqd/zD3+gAWiJhG5ro2ma/slPaAD60UenreHxx2kA2sv+ZWGMzs53330HAJGRkTabjWXarl27AOC9997jrTBRM5lMgYGBcrl8eHiYZdozzzwDAK+++ipvhbmdKJP08mX68GF65046IuJmdAYE0Kmp9L59tFZLj49P+9qBAXrhQhqAvusu+ttvb/3b//7viTh+9tmJEXHGKJ5imp2SkhIAUKvVAQHTfusoiiorKwOR343DJ6bdrFKpfL7dLJozTn19oNcDSUJh4cTln4ykJCAIIAjIz4cIDs9nnD8f/v532L4dzp2D1athxw7YvBnCwuDaNfjyS2hqAgDIz4f/+i9PfSH8EDrHReanP/0pALz77rsscxobGwEgMTGRt6rE7tlnnwWAl156iWUO80DQqKgou93OW2Ee4p1r0qGhofGTJ+nnnqNXrry56gSgFy+mn3qK/vhjuq9vjm998SL9wAM/eE/mV2QkfejQDxaz4lyNYozOAkVRzELgwoULLNMKCgoAYM+ePbwVJnZc2s0ffPABADzyyCO8VeVRXpKkdru9oaGhoKCAIAi5XN67adNEwCkUN9udFOWWz6KvXqX/9jf60CH6wAH6zTfp4mLaYrl1TmsrXVREt7ZO+yZnztBFRXRLi3tKchOM0Vlobm4GgCVLlrBPY446jx8/zk9VYjerdvP777/PW2GeJmCSnj179q233tqxY8fkK3ADAwNP/Ou/0r/7HV1dTbP+t0C3wBidhTfeeAMAnn76aZY5FoslJCREKpV+//33vBUman/5y18A4Mc//jHLHIfDERsbCwCXL1/mrTAe8JmkfX19x48f37Nnz5IlSya39ZKSkvbs2XP8+HGj0TjXr8PfYYzOQn5+PgAcO3aMZQ5zDio1NZW3qsSOS7u5oaHBV9vNHk1Ss9ms1Wr37duXmpo6eacCpVK5c+fOw4cPX7lyxU1fh1/DGOVqbGxMoVBIJJI+1kb7b3/7WwDYv38/b4WJGsd282uvvebD7Wb3JunkdmcQc1c7AACEhoYSBFFQUNDQ0EC5q92JaJrGGOWutLQUANauXcs+bd26dQBAkiQ/VYkdx3ZzTk6Ob7ebXU/Sy5cvHz58eOfOnfPnz3dGp0wmS01N3bdvH7MXgae/Cr+F141yxWVj9oGBgdbW1uDg4PT0dL7qEjcu31Wr1VpTUyOVStXMNum+aG7Xk5IkqdFo2trakpOTTc7NOgFWrFhBEARBEGq1WizPqRY1jFGuuNz0TZIkRVEqlUoUG2J6A46b41kslg0bNsTExPBVlwDmkKRKpVKn0y1fvjwoKCg6Olqj0RAEkZeXl5iYyEvJaALGKCdGo7GpqSk4OJh9Uwwx7j8koPHx8aqqKolEomHdlsIHHtDEkVKpJElSrVafO3fuoYceqq6uZtnBmjE4OGgymaKjo3t7e1nurEMehd93Trq7u1NSUmJiYkJZtk0EYPqn/vAP3i2qqqrMZvO6deuUSiXLNB+4B5S7BQsWlJeX79ix49ChQzNmKNz45uTl5WGGCgi/9ZysXr26paXFZrMxf+zq6iJJUqVSRUVFRTNbgQFcvHixo6MjJiZmDbPNIpoJl8W7wWBg2s3MFlD+QKlU1tXVcclQwAMg74AxypXZbK6trSVJkiTJpqYmmqbXr19vNpt1Ot3ChQth0qJJKsVdXDnhssz0z3Yzxwx1OBwVFRUAwN4VQZ6GMcrGZrPV1dVptVqSJOvr6+12OzM+b968jIyMtra2jo4OgiCYswFXr14NCAjAdQFHRqOxubkZ282uqK+vNxqNycnJeE5JWBijU2hvb2dWnSUlJUPM0w0BAgICUlNTmetIsrKyAgMDjUZjbm5uY2Njdna2Tqc7dOjQ/v37Oa4jUGlpqcPhyM7OxnbznPlV19ibYYxO6O/vr6ioIEnyq6++YjbLYCQlJTHRmZeXF+l85BYAAERFRWm1WiZJmStUmKN7xAWXCLh48WJnZye2m6fjP9cweDm/jtHR0dGamprJ7U5mfMGCBSqViiCIbdu2LV68mOUdMEnnjEsEOB9kje3m25nN5tOnT8tksqysLKFr8Xd+F6MOh6OlpYWJzsrKyrGxMWY8NDQ0PT2dWXiuX7+e+7E5JukcdHZ2tre3R0dHM/fOTgcboyzKy8vHxsbS0tLwPiXB+UuMOtudJEkajUZmkLnjmInOzMzMyfs4zAom6WwVFxcDgEajYVlmOhyO8vJywNPQ08Ajeu/hyzFqMBjKysqYM0XMIygYznYnQRBRUVFu+SxM0lnhEgHMaegVK1bgaegp4VLde/hajFoslurqambV2dzcTFEUMx4bG5udnU0QRH5+/tKlSz3x0ZikHFEUxSwzZ7xiFHC1NY3e3t62tjaFQrF582aha0E+EaMURTU3NzPRWVVVZbVamfGQkJCtW7cyq85169bxcJoCk5SLxsZGg8GwbNmyO+64g2UarrZYaLVamqbVarVcLhe6FiTmGO3p6amqqjp58mRhYeHAwAAzKJVKne3OjIyM4OBgnqvCJJ0Rl2Wm2Wyuq6vD09DTwZ8xXkVkMToyMlJXV8csPJnnGDOc7U6NRuO8yV0omKTsuERARUUFcxraXc1rH6PT6QBj1GuIIEbtdntraysTnRUVFc79QcLDwzdv3kwQxI4dO1atWiVskbfAJJ2OxWKpqamRyWTsezDjaotFW1tbd3d3XFyct/1v77e8N0adlygVFxc7d/aefEdmdna2N28Ohkk6Jb1eb7VaN23aNPlZF7fD2xxZMD9j8vLy8M5jL+FdMdTX16fX60mSLCws7O7udo47j9nz8/MjIiIErHBWMElvx2WZ2dfXh6ehWeBS3dt4V4xu377d2fGMi4vLzMwkCGL79u0JCQnCFjZnmKS34LLMZE5DZ2dnz/mGCB9mt9v1ej3gXQnexLti9MEHH1y0aFFubi5BEMnJyUKX4x5RUVFFRUUEQbS2tubm5ul0jQsW+Gk6GAyGr7/+mrnvlmUaHtGzqK2tNZlMKSkp4l1b+B7vitHnn39e6BI8IiYmpqysLC8vPzT0SFZWkE4H/rkk1Wq1zB7M7MtM5jQ0Xng/JTyi90K4cQ5PoqKivvqqamhozYULQBDQ2yt0QULgEgFnz57F09AscKnuhTBG+RMTIy8rg9RUOHcOsrPh2jWhC+LdrDbHw9PQtxseHm5oaAgMDMzMzBS6FnQTxiivoqJAq4XUVLhwATQa/0rSCxcudHV1KZXK1atXs0zDW+lZ6HQ6m82WlpYmoutV/AHGKN/8NkmdR6Psy8ylS5cmJCTk5OTwVZeYYGPUO2GMCsA/k5TjMvOdd97p7u7288vCpuPseAhdCPoBifPJGYhnRiPk5kJjIyQng8+fu7fb7TExMUNDQ11dXezPZUHT6e7uXrx4cWRkpMFg8Ob79/wQrkYF41dr0vr6+qGhoZUrV2KGzllJSQkAqNVqzFBvgzEqJP9JUjwadR02Rr0WxqjAfD5Jx8bGdDrd0aNHAQBPHM0ZTdNlZWWAP4q8Esao8HwySdvb2z/44INdu3YplcqcnJyOjg6FQvHFF184H+uCZuXMmTO9vb1LlixZsWKF0LWgW2GTxSswScqccdJoxHrG6bvvviNJUqvVlpaW9vf3M4MSiWTt2rUrVqw4ceLE0aNHQ0ND3333Xby0frawK+LNMEa9hUiT1Gw219bWMjvDNjU1OS/8uH2DLr1ef++997733ns2m+3w4cM8PBrLl2Bj1JvhBU/eRRRXQTkcjpaWFiY69Xr9+Pg4M65QKNLS0pidYVNTU29/IZOkZrN59+7dmKTcjY+Pz58/f3R0tLe3V6lUCl0OuhXGqNfx2iR1Po9Aq9UODg4ygzKZbO3atUx0qlSqGR9UiUk6BzqdLicnZ+3atc3NzULXgqaAB/Vex6uO7vv7+ysqKkiSLCoq6urqco47n0eQl5cXGRnJ/Q1VKlVhYeG999575MgRAMAk5QL3GfByuBr1UgYDEAS0tsJdd0F9PSgU/H202QwVFUCSQJJ0T0+cwTBxsig+Pp4gCGZT7fj4eFc+Ateks7Jp06b6+vri4uK8vDyha0FTwBj1XszR/f33w8GDcOIEfPklAMDPfgZTPqDo4EHo64PHHoO5Pdfd4YCWFiY6obISxsYmxjWaPSEh15j0vPvuu+f6pUwBk5Qjo9EYGxsbGBg4MDAQGhoqdDloKjTyYqOjE785eJAGoAHo5GTaap1i5ooVNAD9pz/N7v0vX6YPH6Z37qSjoibeH4CWyejUVHrfPlqrnfqz3KWiokKhUADA7t27HQ6HBz9JzD777DMAyMnJEboQNC3sjXq1kJBbRy5cgD/8Af7zP+f+ngYDlJUBSUJJCXR23hxPSgKCmPgVFTX39+cO+6Rc4KVO3g9jVEwSEuDqVXjlFXj0Ubjjjlm80GKB6uqJY/bmZnDeSRQTA2o1EATk5UFiogcqngkm6YzwqSHeD2NUTNatg40b4X//F37xCygqmnl+ezucPAmnTkFVFVitE4MhIbB168Sqc906EDy1MElZdHZ2tre3R0dHr1+/Xuha0LQwRkWmoAAKC6G4GD7/HB55ZOo5n3wCX3wBOh0YDBMjUils2DARnVu3QnAwb/Vygkk6HWZzPI1Gg98Qb4b/bUQmORl+9SsAgOeeg6GhqeecOAHHj4PBAPHxsHMnHD0K/f1QXw+vvQY5OV6XoQwmSRUKxZEjR/bu3Ys7mDCwMSoKGKPi88ILEBcHvb1w8ODUE37+c3j/fbh0Ca5dg+PH4YknIDqa3xLnBJP0FhRFMZvjYYx6OYxR8YmIgDfeAAB45x04fXqKCWo17N0Ly5bxXJcbYJJO1tTUZDAYli1blpSUJHQtiA3GqCg9/jhkZwNFwXPPgY9FDSapE56jFwuMUVGSSODddyEwEOrr4ehRoatxN59M0p6eno8++ujJJ5/cs2cPx5dgY1QsMEbFatUq+Pd/BwA4cACGh4Wuxt18I0lHR0dJkty/f/+GDRsSEhKeeOKJv/71r5988onNZpvxtVartaamRiaTaTQaHkpFrsALnkTsxRfh+HHo7ITXXxe6FA8Q6VVQkzdjraysHLuxPUFoaGh6ejqzLRaXR3vq9Xqr1bpx48b58+d7uGTkKoxREQsNhd//Hh5+GN58c4rbRn2AiJLUuRkrSZJGo5EZlMlkqampTHRmZmYGBQVxf0PcHE9EMEbF7aGHYPt2+PJLGB0VuhTP8OYkNRgMZWVlJEmWlJR0TtqewLkZK0EQUXPdngDPL4kIxqjovfUWlJbevNfT93hVkloslurqambV2dzc7GzaxsbGZmdnEwSRn5+/dOlSFz/FYDCcOXOG6QO4XDLyOIxR0Vu2DPbtg9/9Tug6PEnYJKUoqrm5mYnOqqoq640fWSEhIVu3bmVWnevWrXNjSVqtlqKo2fYBkFAwRsUhNxdCQ6e9on7/flAogKJgyxZ+y+IR/0na09Oj1WpPnTql0+kGBgaYQalU6mx3ZmRkBHvm1lq81ElccPd7JCae3jN/ZGSkrq6OWXg2NjY6x53tzpycHB5Ond9xxx2dnZ0tLS333HOPpz8LuYHQ+0YjTnbvppcvpw8enHbCM8/Qy5fTBw7wWJNA3L5nvs1ma2hoKCgoIAgiMDDQ+U8jPDycIIg//vGPly9fdv1TOGpvb3/55ZcBQKlUUhTF2+ciV+BBvTh0d8PFi9DXN+2Eq1fh4kXo7eWxJoG46+jeeYlScXGxyWRiBgMCApzH7NnZ2Vwu8HTd7UvgjRs3/vrXv5ZIJDx8OnIdxigSH9eT1OFwbNy48fr168wfncfsP/rRj8LDw91f8W3GxsZqamqc0elwOJjx+fPnazSaHTt2PP744zyUgdwCYxSJkotJKpPJHnvssdHRUabdqVQqPVbpD8y4BM7KyprcWECigDGKxMrFJH377bc9VtoP9PX16fV6kiQLCwu7u7ud484lcH5+fkREBD/FIE/AGEUi5lVX5k9mNptra2uZhWdTUxN943qYuLi4zMxMgiC2b9+ekJAgbJHIXTBGkbh5T5JO3pREr9ePj48z4wqFIi0tjVl4rl+/Hk8c+R6MUTGpqIDdu6f+q9ZWfkvxJsImqbPdqdVqBwcHmcHJm5KoVCq5XM5bPYh/GKNicv48nD8vdBFeieck7e/vr6ioIEmyqKioq6vLOe5sd+bl5UVGRnquAORVMEbFJD8f9u6d+q9eew3q6/mtxst4OklHR0edlyhNbncqlcqsrCzmYqklS5a48RORWGCMikliIjz44NR/9eGH/JbildyepFz2YMZ2J8IYRT7FLUnqbHeWlpY6L9F3ZQ9m5NswRpGvmVuSOvdg1mq1HR0dznG37MGMfBvGKPJBHJN0uj2YY2Ji1Go1c6YoMTGRz8qRGGGMIt/EkqTMMfvJkydJkuRhD2bk8zBGkc+anKRms1mtVpeWlpaWlhoMBmaCcw/m3NzcrVu3emgPZuTzMEaRL1OpVF988cUDDzxQVFR07NgxZjA+Pj4jI4MgiPvuu2/hwoXCVoh8AO5+Lw4dHWAyQUwMTHcfdmcnDA1BdDQsWsRvZWJQXl5+/fr1jz/+mDlmv/POO4WuCPkUjFGEEHIJ9tERQsglGKMIIeQSjFGEEHIJxihCCLkEYxQhhFzy/wFyW4iOQuutIwAAAPt6VFh0cmRraXRQS0wgcmRraXQgMjAyMi4wMy4zAAB4nHu/b+09BiDgZYAARiDmhuIGRjYGDSDNzCIAoZnYGBJAapjZGTLAfEY2B4gCNgewADMjXgZELQdEMyMjNwOjBhMTiK3AzKLAwprBxMaSwMqewMGWwcTOmcHEyZHAyaUgwsjGwsbByc4q3gd1HxhwNwgbHfh65aEtiHPYSvJA/aTj9iA2T3r7gRUBfftAbM/kO/vP+RTvB7FTd3Tvu/OSH8xmMntj28KQDFZvtdrTfsmO82DxCRYn7HcbLgaLp6nyO2izzwOLK/9Td1AriLYDsWNjmhz+2EmB1YgBAJZ9NlgF9mYRAAABUnpUWHRNT0wgcmRraXQgMjAyMi4wMy4zAAB4nH1S0WrDMAx8z1foBxqss2xZj21TxhhNYO32D3vf/zOpo3MLZo4TZPly+O48UYz35e3rm/4GlmkiSv9MM6PPnFKazhQFHU4vrysdr/vDvXPcPtbrhZhjpniesfvrdr53mI60w6wNIg6cmROqeZFuo/8KugQwm4BBPJdiXNoAmINRZmTOMNqlGapWRpRCK+14VrC2FEgrKRsPkCU4gwnN970qFVwxQFZHhoqSs3rRWlXoAKc3nDZVV+uHqEDDiLA50NVWAaoXULFSBjhzHFx1re6KEyJLMRkAOd2QFeKH832wwEaMHt5GMifNqrFfEwpGjKd1ecr0N+XDti49ZcTbs2SPiXtiflNIeiy+oNK99wXVbrC4eaX7KN5q3S1xJ7SbIt7iR+0SH3vQyNFgfhTzePRY3y+319MPRCqZ9vgBjxQAAAEXelRYdFNNSUxFUyByZGtpdCAyMDIyLjAzLjMAAHicZY/LagMxDEV/pcsEHGE9LNkeugoUumkL/YAwOKEEJpmQhtJFPr4aunN20uH66Hq7XT1/rt8attZW7+vW8Om+2ggQI3PYRCCzkkoYNgSWSSREQIyk/4iLEAaElAqqEwQjtLw8LClyQWeLg7KPPiUlVArDIknM5rac1cjC4BIVYpeRSXEZgZLk4hFCoZLCIBCN3R5BIyWSJUOsqsEPE8vSM3pNM6/nSIkyhXUYb/Pp4zpfaoTrYWy33QJ2x/0vxIowT/vdabycZ0DfugBWgtM8vZ5/Dtfv43x+mcYvkMp9jqv0SGrqUaraI63WI6v5oUaspWe54sN/yv0PxkyCvDxcZ70AAAAASUVORK5CYII=\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 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
$$$$ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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