{ "cells": [ { "cell_type": "markdown", "id": "14eaa959", "metadata": {}, "source": [ "## Conformer Search\n", "\n", "The goal in Conformer optimization is to find the most stable 3D structure of a molecule \n", "which differ by dihedral angles, bond angles and bond lengths.\n", "We use tensor trains to avoid the exponential complexity of the\n", "conformer search problem.\n", "\n", "A more detailed explanation can be found in our [paper](http://dx.doi.org/10.26434/chemrxiv-2024-jjns1)." ] }, { "cell_type": "markdown", "id": "92a0f518", "metadata": {}, "source": [ "### Representation of a molecule\n", "\n", "The internal representation of a molecule in TQchem is the MolecularSystem class,\n", "which can be initialized from a variety of popular molecule representations.\n", "TQchem supports conversion from:\n", "- rdkit.Mol\n", "- ase.Atoms\n", "- smiles string\n", "- xyz file/xyz block\n", "\n", "For example, below is an example of creating a MolecularSystem object from an xyz block:" ] }, { "cell_type": "code", "execution_count": 1, "id": "22aa403c-e34e-48ee-9862-96ee0875f226", "metadata": {}, "outputs": [ { "data": { "application/3dmoljs_load.v0": "
\n

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n
\n", "text/html": [ "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from tqchem.viewer import plot_3D_molecule\n", "from tqchem.molgraph import molecularSystem\n", "\n", "xyz_block = \"\"\"13\n", "\n", "C -1.044461 -0.825824 0.211330\n", "C -0.285778 0.490479 0.068986\n", "O -0.589226 1.155464 -1.136284\n", "C 1.232755 0.259051 0.185495\n", "O 1.610069 -0.323671 1.406869\n", "H -2.115750 -0.643571 0.208448\n", "H -0.791736 -1.487830 -0.614662\n", "H -0.764530 -1.309872 1.143418\n", "H -0.605130 1.182551 0.857893\n", "H -0.296714 0.606873 -1.873951\n", "H 1.557840 -0.441551 -0.590202\n", "H 1.752598 1.214578 0.025047\n", "H 1.331217 0.249819 2.128887\"\"\"\n", "\n", "initial_molecule = molecularSystem(xyz_block)\n", "plot_3D_molecule(initial_molecule.ase).show()" ] }, { "cell_type": "markdown", "id": "773a5aec", "metadata": {}, "source": [ "### Perform optimization\n", "\n", "Here we run `ttconf` with 2 sweeps and rank 2 for the xyz representation of propylene glycol.\n", "\n", "This could also be done from the command line using:\n", "```bash\n", "tqchem ttconf --xyz propyleneglycol.xyz --rank 2 --n_sweeps 2\n", "```\n", "Or for the smiles string:\n", "```bash\n", "tqchem ttconf CC(CO)O --rank 2 --n_sweeps 2\n", "```" ] }, { "cell_type": "code", "execution_count": 2, "id": "ed0b5c99-b80d-4468-96a9-fd8fad7d6137", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " sweep | index | Objective | Runtime\n", " -----------------------------------------------\n", " 1 | 3 | -506.703733 | 0:00:01.447695\n", " 1 | 2 | -506.736523 | 0:00:03.526279\n", " 1 | 1 | -506.739942 | 0:00:04.336713\n", " 2 | 1 | -506.739942 | 0:00:04.337227\n", " 2 | 2 | -506.739942 | 0:00:07.245324\n", " 2 | 3 | -506.739942 | 0:00:08.255990\n", "energy_best_conformer = -506.7399424741814\n" ] } ], "source": [ "from tqchem.ttconf.factory import ttconf_optimizer\n", "\n", "ttopt = ttconf_optimizer(initial_molecule, filter_type=\"energy\")\n", "\n", "results = ttopt.optimize()\n", "best_conformer_xyz, energy_best_conformer = results.minimum_energy_xyz()\n", "best_conformer = molecularSystem(best_conformer_xyz)\n", "\n", "print(f\"{energy_best_conformer = }\")" ] }, { "cell_type": "markdown", "id": "0fbb7419-b3e1-4652-9112-1257f196fcdc", "metadata": {}, "source": [ "### Visualize the molecule with lowest energy" ] }, { "cell_type": "code", "execution_count": 3, "id": "277eaf19-e871-4925-ad79-a990bf44d40b", "metadata": {}, "outputs": [ { "data": { "application/3dmoljs_load.v0": "
\n

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n
\n", "text/html": [ "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_3D_molecule(best_conformer_xyz).show()" ] }, { "cell_type": "markdown", "id": "83f37e9a-e2ca-4d65-8eb6-6de084a05558", "metadata": {}, "source": [ "### Optimize structure using CREST:\n", "\n", "Although global optimization in TTConf includes local optimization, \n", "it is often useful to perform a \"final\" local optimization of the structure at the end of the global optimization. \n", "Below we perform the optimization of a conformational ensemble with an energy window of 6 kcal/mol from the minimal conformer\n", "using the [CREST](https://crest-lab.github.io/crest-docs/) wrapper built into TQchem:" ] }, { "cell_type": "code", "execution_count": 4, "id": "3908e514-2cb4-45cc-9d16-1a9397c707c5", "metadata": {}, "outputs": [], "source": [ "from tqchem.chem import ase_from_molecule_file_content\n", "from tqchem.ttconf.crest_wrapper import launch_crest\n", "import numpy as np\n", "\n", "xyzs = results.minimum_energy_ensemble(\n", " energy_difference=0.26,\n", " rmsd_cutoff=0.125,\n", ")\n", "ensemble = [ase_from_molecule_file_content(xyz) for xyz in xyzs]\n", "optimized_ensemble, optimized_energies = launch_crest(\n", " ensemble,\n", " optlevel=\"normal\",\n", ")\n", "\n", "best_conformer_crestOpt = np.argmin(optimized_energies)\n", "energy_best_conformer_crestOpt = optimized_energies[best_conformer_crestOpt]\n", "molecule_best_conformer_crestOpt = optimized_ensemble[best_conformer_crestOpt]" ] }, { "cell_type": "markdown", "id": "c62a9cf3-5ec4-4150-805e-fb6b0f5c092d", "metadata": {}, "source": [ "### Compare energies of rdkit and ttconf conformers" ] }, { "cell_type": "code", "execution_count": 5, "id": "6e710d4c-0bca-45ca-a677-ea29d1ba0750", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "E(initial geometry) : -506.7007039\n", "E(TTconf geometry) : -506.7399425\n", "E(TTconf+CREST geometry): -506.7423777\n" ] } ], "source": [ "from tblite.ase import TBLite\n", "\n", "# Energy of initial rdkit conformer\n", "initial_molecule.ase.calc = TBLite(method=\"GFN2-xTB\", verbosity=0)\n", "energy_initial = initial_molecule.ase.get_potential_energy()\n", "\n", "# Energy of the TTconf optimized, but not gradient optimized molecule\n", "best_conformer.ase.calc = TBLite(method=\"GFN2-xTB\", verbosity=0)\n", "energy_best_conformer = best_conformer.ase.get_potential_energy()\n", "\n", "energies = {\n", " \"E(initial geometry) \": energy_initial,\n", " \"E(TTconf geometry) \": energy_best_conformer,\n", " \"E(TTconf+CREST geometry)\": energy_best_conformer_crestOpt,\n", "}\n", "print(\"\\n\".join(f\"{label}: {e:.7f}\" for label, e in energies.items()))" ] }, { "cell_type": "code", "execution_count": 6, "id": "15031846", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TTconf best geometry:\n" ] }, { "data": { "application/3dmoljs_load.v0": "
\n

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n
\n", "text/html": [ "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print(\"TTconf best geometry:\")\n", "plot_3D_molecule(molecule_best_conformer_crestOpt).show()" ] }, { "cell_type": "markdown", "id": "89b400d3", "metadata": {}, "source": [ "### Bond selection\n", "\n", "It is possible to select the bonds that are considered rotatable.\n", "For the bond selection we first investigate the molecular graph and then select the bonds (as tuple of 2 atom IDs) \n", "and corresponding dihedral values (as array)." ] }, { "cell_type": "code", "execution_count": 7, "id": "915eb0c6", "metadata": {}, "outputs": [ { "data": { "image/png": "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X47c3Ny6/0D1DAMlERER6bz9+/dj0KBBsLOzQ0ZGBlauXAmpVIpRo0aV276wsBBffPEFXF1dsXTpUkRHR2P27NlYuXIlevXqhcLCQhgbG2PWrFnYuHFj3X6YeojLk4iIiEjnrV27Fr/++iuAv8/6zsrKgkQiQXp6ernPQZqamuLu3bto1KiR8rX+/fvDxcUF48aNw/bt2zFlyhQEBwcjMDAQb775Zp19lvqII5RERESk0xQKBQoKCuDo6Ajg783OJRJJpffo6+uXCpMv+Pn5AQDu3bsH4O+V446OjsjIyFBz1dqFgZKIiIh02q1bt9CmTRu19HXkyBEAf5+e84KPjw9iY2PV0r+2YqAkIiIinZacnKyWQPngwQMsWLAAPj4+CAgIUL7epk0bJCcnq9y/NmOgJCIiIp1WUlKiPJ+7tjIzMzF8+HAIgoCtW7dCT+//RygjI6MGv8k5AyURERHpNAsLC5W29snKysLgwYPx4MEDHDx4EC1btix1PTc3F+bm5qqWqdUYKImIiEindezYEVeuXKnVvVlZWRg0aBDu3r2LgwcPonPnzmXaXL58GZ06dVK1TK3GQElEREQ6zcnJCY8eParxfS/C5J07d3DgwAF4eXmV2y4hIaHcoNmQcB9KIiIi0nmtW7fGpUuX4OnpCQDYu3cv8vPzlVPhSUlJymMUhw8fDolEgqFDhyI+Ph5Lly6FTCbDuXPnlP05ODigVatWePr0KQwMDGBiYlL3H6oekQiCIIhdBBEREZEmJSUlYdmyZVixYgUAoEWLFkhNTS237d27dwEAbm5uFfY3ffp0rFu3DosWLULXrl0xbNgw9RetRThCSURERDrPw8MD+fn5iI+Ph5eXF1JSUqq8p6oxt3v37uHEiRNYsGCBmqrUXhyhJCIiogbh6dOnmDRpEqKiolSeolYoFBgzZgz+/e9/w93dXU0Vai8uyiEiIqIGwdHRER999BGmTZsGqVRa634UCgXefvttBAUFMUz+DwMlERERNRiDBw/GtGnTMHbsWDx48KDG92dnZ2Pq1Kno0qULZsyYof4CtRSnvImIiKjBuXr1Kv71r39h7NixmDZtGoyNjSttL5fLERERgd9++w3ffPMNevbsWUeVagcGSiIiImqQZDIZ1q1bh7CwMHh6eqJfv37w9vZG48aNAfx93GJsbCzOnDmDU6dOwd/fH/PmzYOpqanIldc/DJRERETUoAmCgPj4eJw9exZxcXF49uwZAMDa2hpdu3aFn58fevToUer8biqNgZKIiIiIVMKoTUREREQqYaAkIiIiIpUwUBIRERGRShgoiYiIiEglDJREREREpBIGSiIiIiJSCQMlEREREamEgZKIiIiIVMJASUREREQqYaAkIiIiIpUwUBIRERGRShgoiYiIiEglDJREREREpBIGSiIiIiJSCQMlEREREamEgZKIiIiIVMJASUREREQqYaAkIiIiIpUwUBIRERGRShgoiYiIiEglDJREREREpBIGSiIiIiJSCQMlEREREamEgZKIiIiIVMJASUREREQqYaAkIiIiIpUwUBIRERGRShgoiYiIiEglDJREREREpBIGSiIiIiJSCQMlEREREamEgZKIiIiIVMJASUREREQqYaAkIiIiIpUwUBIRERGRShgoiYiIiEglDJREREREpBIGSiIiIiJSyf8DyH0bjavthoUAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "\n", "xyz_block = \"\"\"13\n", "\n", "C -1.044461 -0.825824 0.211330\n", "C -0.285778 0.490479 0.068986\n", "O -0.589226 1.155464 -1.136284\n", "C 1.232755 0.259051 0.185495\n", "O 1.610069 -0.323671 1.406869\n", "H -2.115750 -0.643571 0.208448\n", "H -0.791736 -1.487830 -0.614662\n", "H -0.764530 -1.309872 1.143418\n", "H -0.605130 1.182551 0.857893\n", "H -0.296714 0.606873 -1.873951\n", "H 1.557840 -0.441551 -0.590202\n", "H 1.752598 1.214578 0.025047\n", "H 1.331217 0.249819 2.128887\"\"\"\n", "\n", "initial_molecule = molecularSystem(xyz_block)\n", "initial_molecule.draw()" ] }, { "cell_type": "code", "execution_count": 8, "id": "e1165c6f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " sweep | index | Objective | Runtime\n", " -----------------------------------------------\n", " 1 | 1 | -506.704737 | 0:00:00.572068\n", " 2 | 1 | -506.704737 | 0:00:00.572455\n", "energy_one_dihedral = -506.7047367387411\n" ] }, { "data": { "application/3dmoljs_load.v0": "
\n

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n
\n", "text/html": [ "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ttopt = ttconf_optimizer(\n", " initial_molecule,\n", " charge=0,\n", " solvent=None,\n", " method=\"GFN2-xTB\",\n", " ensemble_optimization=True,\n", " set_rotatable_bonds={(0, 1): np.linspace(0, 360, 12, endpoint=False)},\n", ")\n", "\n", "results = ttopt.optimize()\n", "one_dihedral_xyz, energy_one_dihedral = results.minimum_energy_xyz()\n", "one_dihedral = molecularSystem(one_dihedral_xyz)\n", "print(f\"{energy_one_dihedral = }\")\n", "plot_3D_molecule(one_dihedral_xyz).show()" ] }, { "cell_type": "markdown", "id": "4e9f9a39", "metadata": {}, "source": [ "### Ring systems\n", "At the moment, only 5- and 6-rings can be optimized with TTconf as we implemented a different way of treating rings.\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "08e74735", "metadata": {}, "outputs": [ { "data": { "application/3dmoljs_load.v0": "
\n

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n
\n", "text/html": [ "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " sweep | index | Objective | Runtime\n", " -----------------------------------------------\n", " 1 | 4 | -823.571253 | 0:00:02.276078\n", " 1 | 3 | -823.597379 | 0:00:06.952778\n", " 1 | 2 | -823.598813 | 0:00:10.225388\n", " 1 | 1 | -823.649913 | 0:00:11.172686\n", " 2 | 1 | -823.649913 | 0:00:11.173265\n", " 2 | 2 | -823.649955 | 0:00:12.806396\n", " 2 | 3 | -823.749278 | 0:00:16.092978\n", " 2 | 4 | -823.749278 | 0:00:17.347438\n", "energy_best_conformer = -823.7492781160647\n" ] }, { "data": { "application/3dmoljs_load.v0": "
\n

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n
\n", "text/html": [ "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from tqchem.viewer import plot_3D_molecule\n", "\n", "initial_molecule = molecularSystem(\"O1CCCCC1CCO\")\n", "plot_3D_molecule(initial_molecule.ase).show()\n", "\n", "ttopt = ttconf_optimizer(\n", " initial_molecule,\n", " filter_type=\"energy\",\n", " charge=0,\n", " solvent=None,\n", " method=\"GFN2-xTB\",\n", " ensemble_optimization=True,\n", ")\n", "\n", "results = ttopt.optimize()\n", "best_conformer_xyz, energy_best_conformer = results.minimum_energy_xyz()\n", "best_conformer = molecularSystem(best_conformer_xyz)\n", "\n", "print(f\"{energy_best_conformer = }\")\n", "plot_3D_molecule(best_conformer_xyz).show()" ] }, { "cell_type": "markdown", "id": "e6fd5338", "metadata": {}, "source": [ "For bigger rings like a 7-ring the optimization with default parameters will fail." ] }, { "cell_type": "code", "execution_count": 10, "id": "c6da4deb", "metadata": {}, "outputs": [ { "data": { "application/3dmoljs_load.v0": "
\n

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n
\n", "text/html": [ "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Impossible to run calculations for 7-ring with default settings.\n" ] } ], "source": [ "initial_molecule = molecularSystem(\"O1CCC(CCN)CCC1\")\n", "plot_3D_molecule(initial_molecule.ase).show()\n", "\n", "try:\n", " ttopt = ttconf_optimizer(initial_molecule)\n", "except Exception:\n", " print(\"Impossible to run calculations for 7-ring with default settings.\")" ] }, { "cell_type": "markdown", "id": "def15894", "metadata": {}, "source": [ "It is, however, possible to avoid the separate treatment of rings by setting `single_batframe=True`" ] }, { "cell_type": "code", "execution_count": 11, "id": "17c16a68", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " sweep | index | Objective | Runtime\n", " -----------------------------------------------\n", " 1 | 3 | -8.432938 | 0:00:01.895418\n", " 1 | 2 | -14.969960 | 0:00:04.820821\n", " 1 | 1 | -16.708092 | 0:00:06.691786\n", " 2 | 1 | -16.708092 | 0:00:06.692577\n", " 2 | 2 | -16.716360 | 0:00:08.269578\n", " 2 | 3 | -19.317325 | 0:00:09.802838\n", "energy_best_conformer = -892.0589298575549\n" ] }, { "data": { "application/3dmoljs_load.v0": "
\n

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n
\n", "text/html": [ "
\n", "

3Dmol.js failed to load for some reason. Please check your browser console for error messages.

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "initial_molecule = molecularSystem(\"O1CCC(CCN)CCC1\", single_batframe=True)\n", "\n", "ttopt = ttconf_optimizer(\n", " initial_molecule,\n", " charge=0,\n", " filter_type=\"boltzmann energy difference\",\n", " solvent=None,\n", " method=\"GFN2-xTB\",\n", " ensemble_optimization=True,\n", ")\n", "\n", "results = ttopt.optimize()\n", "best_conformer_xyz, energy_best_conformer = results.minimum_energy_xyz()\n", "best_conformer = molecularSystem(best_conformer_xyz)\n", "\n", "print(f\"{energy_best_conformer = }\")\n", "plot_3D_molecule(initial_molecule.ase).show()" ] } ], "metadata": { "kernelspec": { "display_name": "tqchem", "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.12.7" } }, "nbformat": 4, "nbformat_minor": 5 }