diff --git a/.github/workflows/build-wheels.yaml b/.github/workflows/build-wheels.yaml new file mode 100644 index 0000000..dc83186 --- /dev/null +++ b/.github/workflows/build-wheels.yaml @@ -0,0 +1,78 @@ +name: Build and upload to PyPI + +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + release: + types: + - published + +jobs: + build_wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, windows-11-arm, macos-15-intel, macos-latest] + + steps: + - uses: actions/checkout@v5 + with: + submodules: recursive # Critical: fetch packmol submodule + + - name: Build wheels + uses: pypa/cibuildwheel@v3.3.0 + env: + # Set macOS deployment target dynamically based on runner + CIBW_ENVIRONMENT_MACOS: MACOSX_DEPLOYMENT_TARGET=15.0 + + - name: Upload wheels + uses: actions/upload-artifact@v4 + with: + name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }} + path: ./wheelhouse/*.whl + + build_sdist: + name: Build source distribution + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + submodules: true + + - name: Install uv + uses: astral-sh/setup-uv@v5 + + - name: Build SDist + run: uv build --sdist + + - name: Upload SDist + uses: actions/upload-artifact@v4 + with: + name: cibw-sdist + path: dist/*.tar.gz + + upload_pypi: + needs: [build_wheels, build_sdist] + environment: + name: pypi + url: https://pypi.org/p/molify + permissions: + id-token: write + runs-on: ubuntu-latest + if: github.event_name == 'release' && github.event.action == 'published' + steps: + - name: Download all artifacts + uses: actions/download-artifact@v5 + with: + pattern: cibw-* + path: dist + merge-multiple: true + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/pages.yaml b/.github/workflows/pages.yaml index d444d89..f53540f 100644 --- a/.github/workflows/pages.yaml +++ b/.github/workflows/pages.yaml @@ -26,9 +26,9 @@ jobs: url: ${{ steps.deployment.outputs.page_url }} steps: - - uses: actions/checkout@v2 - - - uses: julia-actions/setup-julia@v2 + - uses: actions/checkout@v5 + with: + submodules: recursive - name: Install uv and set the python version uses: astral-sh/setup-uv@v5 @@ -38,9 +38,6 @@ jobs: - name: Install the project run: uv sync --all-extras --dev --all-groups - - name: Install packmol.jl - run: julia -e 'import Pkg; Pkg.add("Packmol")' - - name: Install pandoc run: | sudo apt update diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml deleted file mode 100644 index 27953cd..0000000 --- a/.github/workflows/publish.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: Release -on: - release: - types: - - created - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Install uv - uses: astral-sh/setup-uv@v5 - - name: Publish - env: - PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }} - run: | - uv build - uv publish --token $PYPI_TOKEN diff --git a/.github/workflows/pytest.yaml b/.github/workflows/pytest.yaml index f5445c8..e73a3c3 100644 --- a/.github/workflows/pytest.yaml +++ b/.github/workflows/pytest.yaml @@ -21,34 +21,21 @@ jobs: - "3.12" - "3.11" - "3.10" - os: - - ubuntu-latest - packmol-version: - - "20.15.1" + os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, macos-15-intel, macos-latest] + # windows-11-arm -> rdkit support missing steps: - - uses: actions/checkout@v2 - - uses: julia-actions/setup-julia@v2 + - uses: actions/checkout@v5 + with: + submodules: recursive - name: Install uv and set the python version uses: astral-sh/setup-uv@v5 with: python-version: ${{ matrix.python-version }} - name: Install the project run: uv sync --all-extras --dev - - name: Install packmol - run: | - wget https://github.com/m3g/packmol/archive/refs/tags/v${{ matrix.packmol-version}}.tar.gz - tar -xvf v${{ matrix.packmol-version}}.tar.gz - cd packmol-${{ matrix.packmol-version}} - make - - name: Install packmol.jl - run: | - julia -e 'import Pkg; Pkg.add("Packmol")' - name: Pytest run: | - # add packmol to path - export PATH=$PATH:$(pwd)/packmol-${{ matrix.packmol-version}} - uv run python --version uv run pytest --cov --junitxml=junit.xml -o junit_family=legacy - name: Upload coverage to Codecov diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7b70eec --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "external/packmol"] + path = external/packmol + url = https://github.com/m3g/packmol.git diff --git a/README.md b/README.md index ced3ed2..79ef9ff 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,9 @@ print(atoms) Given the molecular units, you can build periodic boxes with a given density using the `molify.pack` function. -If you have [packmol](https://github.com/m3g/packmol) (at least `v20.15.0`) you -can use the molify interface as follows: +The `molify` package ships with an installation of +[packmol](https://github.com/m3g/packmol). If you like packmol, give it a star +on GitHub! ```py from molify import pack, smiles2conformers diff --git a/docs/source/ase_tools.ipynb b/docs/source/ase_tools.ipynb index f7eccc2..2d87d48 100644 --- a/docs/source/ase_tools.ipynb +++ b/docs/source/ase_tools.ipynb @@ -2,398 +2,521 @@ "cells": [ { "cell_type": "markdown", - "id": "310ff0d1", "metadata": {}, "source": [ - "# ASE Interface" + "# ASE Interface\n", + "\n", + "\n", + "The Atomic Simulation Environment (ASE) is a toolkit for atomistic simulations. molify extends ASE by adding chemical connectivity and thereby enabling the integration with rdkit.\n", + "\n", + "For more information about ASE, visit https://wiki.fysik.dtu.dk/ase/" ] }, { "cell_type": "code", "execution_count": 1, - "id": "f7684dc7", "metadata": {}, "outputs": [], "source": [ + "import ase.build\n", + "from IPython.display import display\n", + "\n", "import molify" ] }, { "cell_type": "markdown", - "id": "6aa34ab7", "metadata": {}, "source": [ - "The main functionality of `molify` is to generate new structures from SMILES.\n", - "For this purpose, you can utilize [smiles2atoms](modules.rst#molify.smiles2atoms) and [smiles2conformers](modules.rst#molify.smiles2conformers)" + "## Creating Structures from SMILES\n", + "\n", + "molify provides convenient functions to generate ASE Atoms objects directly from SMILES strings.\n", + "\n", + "### `smiles2atoms()`: single 3D structure" ] }, { "cell_type": "code", "execution_count": 2, - "id": "238643bd", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "Atoms(symbols='OH2', pbc=False)" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Aldehyde molecule: Atoms(symbols='COH2', pbc=False)\n", + "Positions:\n", + "[[-4.46780196e-02 -1.74057025e-02 7.86262348e-04]\n", + " [ 1.17780391e+00 -1.52289849e-01 -1.78379214e-02]\n", + " [-3.97811548e-01 1.00725032e+00 1.49697709e-03]\n", + " [-7.35314340e-01 -8.37554770e-01 1.55546820e-02]]\n", + "\n", + "Stored information:\n", + " SMILES: C=O\n", + " Number of bonds: 3\n" + ] } ], "source": [ - "water = molify.smiles2atoms(\"O\")\n", - "water" + "# Create an aldehyde molecule from SMILES with hydrogens.\n", + "aldehyde = molify.smiles2atoms(\"C=O\")\n", + "\n", + "print(f\"Aldehyde molecule: {aldehyde}\")\n", + "print(f\"Positions:\\n{aldehyde.positions}\")\n", + "print(\"\\nStored information:\")\n", + "print(f\" SMILES: {aldehyde.info['smiles']}\")\n", + "print(f\" Number of bonds: {len(aldehyde.info['connectivity'])}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note: When created from SMILES, the molecule automatically includes:\n", + "- ✅ 3D coordinates (from RDKit's embedding)\n", + "- ✅ Explicit `connectivity` in `atoms.info`\n", + "- ✅ SMILES string in `atoms.info`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `smiles2conformers()`: Multiple 3D Conformers\n", + "\n", + "Generate multiple conformers for conformational sampling:" ] }, { "cell_type": "code", "execution_count": 3, - "id": "654e42a1", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "[Atoms(symbols='C2O2C7O2H8', pbc=False),\n", - " Atoms(symbols='C2O2C7O2H8', pbc=False),\n", - " Atoms(symbols='C2O2C7O2H8', pbc=False)]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Generated 3 conformers \n", + "\n", + " Conformer 1: Atoms(symbols='C2OH6', pbc=False)\n", + " Conformer 2: Atoms(symbols='C2OH6', pbc=False)\n", + " Conformer 3: Atoms(symbols='C2OH6', pbc=False)\n" + ] } ], "source": [ - "aspirin = molify.smiles2conformers(\"CC(=O)OC1=CC=CC=C1C(=O)O\", numConfs=3)\n", - "aspirin" + "# Generate 3 conformers of ethanol\n", + "ethanol_conformers = molify.smiles2conformers(\"CCO\", numConfs=3)\n", + "\n", + "print(f\"Generated {len(ethanol_conformers)} conformers \\n\")\n", + "for i, conf in enumerate(ethanol_conformers):\n", + " print(f\" Conformer {i + 1}: {conf}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Conformer 1: 8 bonds\n", + " Conformer 2: 8 bonds\n", + " Conformer 3: 8 bonds\n" + ] + } + ], + "source": [ + "# All conformers have the same connectivity\n", + "for i, conf in enumerate(ethanol_conformers, 1):\n", + " print(f\" Conformer {i}: {len(conf.info['connectivity'])} bonds\")" ] }, { "cell_type": "markdown", - "id": "d036bdb8", "metadata": {}, "source": [ - "Within `molify` you can translate structures between ASE and rdkit." + "## ASE → RDKit: The Direct Path (With Connectivity)\n", + "\n", + "When ASE Atoms have connectivity information, conversion to RDKit is straightforward:" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "b18dc45a", + "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n" + "Aspirin molecule:\n" ] }, { "data": { "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 4, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "mol = molify.ase2rdkit(aspirin[0])\n", - "print(mol)\n", - "mol" + "# Create aspirin from SMILES\n", + "aspirin = molify.smiles2atoms(\"CC(=O)Oc1ccccc1C(=O)O\")\n", + "\n", + "# Convert to RDKit (exact with existing connectivity data)\n", + "aspirin_mol = molify.ase2rdkit(aspirin)\n", + "\n", + "print(\"Aspirin molecule:\")\n", + "display(aspirin_mol)" ] }, { "cell_type": "markdown", - "id": "a33da241", "metadata": {}, "source": [ - "If a structure has been generated using `molify` it includes `smiles` and `connectivity` in it's `atoms.info` key. This information is utilized to quickly transform `ase.Atoms` to rdkit structures." + "Internally, `ase2rdkit()` uses:\n", + "1. `ase2networkx()` - transfers connectivity to graph\n", + "2. `networkx2rdkit()` - converts graph to RDKit molecule\n", + "\n", + "When the full connectivity including the bond_order exists in `atoms.info`, this conversion does not require any bond guessing." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ASE → NetworkX: Bond Detection from Geometry\n", + "\n", + "When `atoms.info['connectivity']` is **not** present, molify will **infer bonds** from atomic positions using covalent radii when converting ASE Atoms to NetworkX graphs.\n", + "\n", + "### Case 1: With Explicit Connectivity" ] }, { "cell_type": "code", - "execution_count": 5, - "id": "c02bb9a3", + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAJ8CAYAAABunRBBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdX5JREFUeJzt3QeUFMXe/vEiSZCMJBOiKAIKIkiQJCoqiAFFECQJIoiR+xqv6d7XfBWzCKIkAUGUIFkQEMmgKCiYMYLkKBnmf566/953FnZ6Z3Znpqenv59z9ujsLLu1sz1dT1dX/SpPKBQKGQAAAARGXq8bAAAAgOQiAAIAAAQMARAAACBgCIAAAAABQwAEAAAIGAIgAABAwBAAAQAAAoYACAAAEDAEQAAAgIAhAAIAAAQMARAAACBgCIAAAAABQwAEAAAIGAIgAABAwBAAAQAAAoYACAAAEDAEQAAAgIAhAAIAAAQMARAAACBgCIAAAAABQwAEAAAIGAIgAABAwBAAAQAAAoYACAAAEDAEQAAAgIAhAAIAAAQMARAAACBgCIAAAAABQwAEAAAIGAIgAABAwBAAAQAAAoYACAAAEDAEQAAAgIAhAAIAAAQMARAAACBgCIAAAAABQwAEAAAIGAIgAABAwOT3ugF+EgqFzK+//mrWrFljdu3aZfbt22f27t1r9u/fb4477jhTuHBhU6hQIVOsWDFz1llnmTPOOMPkyZPH62YDAODLPvenn34y33//faY+98CBA6ZgwYKZ+txq1aqZSpUq0efGgACYTdj7/PPP7cfy5cvNF198YbZs2RL19yhRooSpU6dOpg9CIQAAWYe9o/vcHTt2RP09ypQpc0yfSyiMLE9IrzqsgwcPmo8++sgMHz7cLFiwIKawF0sobNiwoenUqZNp27atvYoBACBodPfsgw8+MCNGjDCLFi2KKezFEgobNWpkunTpYq6++mpToECBuP8MvyIAGmPWrVtnBg0aZN566y37/8lStmxZ06NHD9O7d297lQIAQLr75ZdfzMCBA83bb79tNm/enLSfe+KJJ5pevXqZnj17mooVK5qgC2wA1K/96aefmv79+5vx48ebQ4cOedYWDU+3bt3a9OnTx1x22WUmb17W5gAA0seRI0fMxx9/bN544w0zZcoU2wd7JX/+/KZNmza2z23WrFlgbxEHMgBOmjTJPPTQQ+abb74xqUZzBJ944glz4403BvagBACkB0WM0aNHm0cffdTO8Us1NWrUMM8884y56qqrTNAEKgBu3brV3HXXXWbkyJEm1WmuwoABAximBgD40vr16+0UJ82tT3WdOnUyr7zyiildurQJisAEwIkTJ9p7/xs2bMjV9ylatKipXbu2qVKlil2Crg+VgNGydGeJ+tq1a+0qpp07d+bqZ5UqVcq89tprpmPHjowGAgB8QbFCAy0acNm2bVuuvlfx4sXtat7KlStnlH1x+lz1t/r48ccfzYoVK8zu3btz9bMqVKhg5yZqACYI0j4A5mbU7/jjjzfnn39+piXlqu+XL1++qOY7hC9pdz5yEgoZDQQApPuonxP2ji6dFs28+MOHD9t6geH9rcrI/P333zG3o1NQRgNDaWzSpEmh8uXLK+DG9FG/fv3QsGHDQnv37o1re/bv3x8aM2ZMqFmzZjG3qVSpUqFRo0bFtT0AAMSL+ij1VbH2bxdddFHo/fffDx04cCCu7dmzZ4/ty9Wnx9qmChUq2AyRztI2APbr1y+mP3bhwoVDPXr0CC1fvjwp7fv6669Dt99+e6hYsWIxtfORRx4JHTlyJCltBAAgO+qTHn744Zj6MvV96gPVFyaD+nb18errY2nniy++GEpXJh0PxEcffTTqP26JEiVCL7zwQmjr1q2etHfnzp2hN954I1S2bNmo23zHHXeEDh8+7El7AQBwqC9SkIu2/1Jfpz5PfZ8X1Nerzy9RokTUbX7sscfScuAlrQKg/kB33XVX1H/UVq1ahf74449QKti4cWOoXbt2Ube9c+fOoUOHDnndbABAQB08eDDUqVOnqPst9XHq61LB77//HmrZsmXUbVe2SLcQmDYBUH+Ye++9N+pRvyFDhqTkH3Ps2LFRjwZ27949JX8HAED6j/zdfPPNUY/6qW9LNUeOHAkNHjw46tHA++67L6363LQJgE899ZTvRv3iMRrYt2/ftDogAQCpTX3OPffc47tRv3iMBj799NOhdJEWAXDAgAHZ/tHy5MkTev31130Vlt59991QgQIFsv3dFH4BAEiVARf1XerD/OLIkSOh1157zWaF7H63gQMHhtKB7+sArly50tStW9ccPHgw4tcUKFDAjBgxwrRr1874zfTp0811111ni11GoiLR2te4SZMmSW0bACBYPvvsM7t/rlt0UMHmcePGmSuu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Km6++eaIzy9dujTLPXfTlX5X/c6RdO/ePWELTwDAQQAEkHC9e/d2fX7MmDG2GHO60++o3zU3rxUAxAMBEEDCnXnmmbYocyTbt283EydONOlOv6N+10j0GlWpUiWpbQIQTARAAEnx0ksvue6moaLI6XwrWL+bW/HrokWLmpdffjmpbQIQXARAAElRuXJl8/zzzwfyVnA0t3712px22mlJaxOAYKMQNICk0bZnl156qZkzZ07Er6latardezd//vQoU3ro0CEzaNAg17IvF198sV0ZzM4fAJKFAAggqdauXWuLP//9998Rv6ZWrVqmS5cuJl++fMbPtN3bsGHD7K4fbrd+V61axegfgKTiFjCAlLsV/NVXX5n33nsvaXsFJ4Lart/BLfwJt34BeIERQAApeStYatasaUcC/XY7WLd9hw8fnm3449YvAK8QAAF44o8//jD169c369atc/06zQns1q2bb4oja8HH0KFDXef8ifYiXrJkiTn55JOT1jYAcBAAAXhm9erVpmnTpmbLli2uX1eyZEm7PVq1atVMqpd60Wpft1p/UqZMGTNv3jxTvXr1pLUNAMIRAAF4equ0devWZsaMGVF9fYMGDWyx5FQbDdSon4o8u9X5C3f55ZebyZMn++7WNoD0QQAE4Fn469y5sxk9enRM/y7VRgOjHfU7WocOHew8QUIgAC+wChiAJ+GvU6dOGeGvQIECpl+/fqZ06dLZ/lsFrYEDB5pRo0aZjRs3Gq/oZ6sNaks04U+3fV944QX7u4pWCCsA67UAgGRjBBBAUh08eNDcdNNNZuzYsfbxcccdZz788EN7K/ibb74xLVq0MOvXr4/6+2mRSKNGjUyNGjUSXjdQpV3UxgULFmS7yOPoBR8zZ860c/506/f66683Bw4csM+1a9fOjBw5kpFAAElFAASQ1PDXsWNH88EHH2SEv/Hjx5tWrVplWh3ctWtXM3v27JhvDV944YV2nmDx4sXj2u4dO3bY+X2LFi2K+VavSr2oGHT4at8pU6aY6667LiME3nDDDTYEOqODAJBoBEAASQt/mvem0T4pWLCgDX8tW7bMsk6gbq3ed999rjuGZCVv3rzmlFNOyfRRvnz5qEcHNcq3YcMG8/vvv2f6UJtioR0+VOS5V69eWdb5mzp1qmnTpk1GCNSooG4LEwIBJAMBEEDCKeTceOONNvA54W/C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gSRbuXJlpvB3wQUX2PBXqlQpr5sGJJSOcYVAXfCI3gMKgbogApBcBEAgib766isb/jZv3mwf16tXz3z88cemZMmSXjcNSAod67rg0YWP6L2g94QujAAkDwEQSJIvv/zSXHLJJWbLli32cf369Ql/CHQI1HsgPATqAglAchAAgSRYsWJFpvDXoEEDG/5KlCjhddMAT+jYnzFjhn0viN4bCoG6UAKQeARAIMG++OILG/62bt1qHzds2NB2fMWLF/e6aUBKhEC9J0TvEb1XdMEEILEIgEACff755+bSSy8127Zts48bNWpE+APC6L0wffp0c+GFF2YKgbpwApA4BEAgQZYvX54p/DVu3NhMmzbNFCtWzOumASkZAnWBJHrPKATqAgpAYhAAgQRYtmyZadGihdm+fbt93KRJEzN16lTCHxCB3hu6QNKFkui9owsoXUgBiD8CIBBnS5cuzRT+mjZtSvgDYgiBumAKD4G6oAIQXwRAII6WLFliw9+OHTvs42bNmtnwV7RoUa+bBviC3it6z+jCSfReUgjUhRWA+CEAAnGyePFic9lll5mdO3fax9rwfsqUKeb444/3ummAL0Og3kOi95QurHSBBSA+CIBAHCxatChT+FM9M8IfkHN670yePNluFRceAvVeA5B7BEAglxYuXGjD365du+xjrV6cNGmSKVKkiNdNA9IiBOqCSvQeu/zyy+17DkDuEACBXFiwYIHtkHbv3m0fa67SRx99RPgD4kTvJV1Q6cIqPATqvQcg5wiAQA599tlnmcKfbk8R/oDEhUC9x0TvuSuuuMLMnz/f66YBvkUABHJg3rx5pmXLlubvv/+2jxUEJ06caAoXLux104C0pPeW3mOabhEeAnUhBiB2BEAgRp9++qlp1apVRvhTJzRhwgTCH5Bgeo/pvaYLLtF7UBdiuiADEBsCIBCDuXPnZgp/6nzGjx9vChUq5HXTgECFQF14hYdAXZgBiB4BEIjSnDlzbPjbs2ePfaz/J/wByaf3nN57eg+K3pP6f12gAYgOARCIwuzZs82VV15p9u7dax/r/8eNG2cKFizoddOAwIZAvQf1XgwPgXqvAsgeARDIxqxZszKFv6uuusp8+OGHhD/AY3oP6r3YunVr+1jvUf3/J5984nXTgJRHAARczJw50wa+ffv22cdXX321+eCDDwh/QIrQe1HvSb1Pw0Og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", "text/plain": [ - "{'smiles': 'CC(=O)OC1=CC=CC=C1C(=O)O',\n", - " 'connectivity': [(0, 1, 1.0),\n", - " (1, 2, 2.0),\n", - " (1, 3, 1.0),\n", - " (3, 4, 1.0),\n", - " (4, 5, 1.5),\n", - " (5, 6, 1.5),\n", - " (6, 7, 1.5),\n", - " (7, 8, 1.5),\n", - " (8, 9, 1.5),\n", - " (9, 10, 1.0),\n", - " (10, 11, 2.0),\n", - " (10, 12, 1.0),\n", - " (9, 4, 1.5),\n", - " (0, 13, 1.0),\n", - " (0, 14, 1.0),\n", - " (0, 15, 1.0),\n", - " (5, 16, 1.0),\n", - " (6, 17, 1.0),\n", - " (7, 18, 1.0),\n", - " (8, 19, 1.0),\n", - " (12, 20, 1.0)]}" + "
" ] }, - "execution_count": 5, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "aspirin[0].info" + "# Create methane with connectivity\n", + "methane = molify.smiles2atoms(\"C\")\n", + "\n", + "# Convert to NetworkX - uses explicit connectivity\n", + "graph_with_connectivity = molify.ase2networkx(methane)\n", + "\n", + "# Draw the graph using molify's draw_molecular_graph utility\n", + "_ = molify.draw_molecular_graph(\n", + " graph_with_connectivity,\n", + ")" ] }, { "cell_type": "markdown", - "id": "449f4f0f", "metadata": {}, "source": [ - "Without this information, `molify` will try to guess the bond information. You can aid this process, by including SMILES into the `suggestions=` keyword." + "### Case 2: Without Connectivity (Bond Detection Required)\n", + "\n", + "This example simulates what happens when connectivity information is missing:" ] }, { "cell_type": "code", - "execution_count": 6, - "id": "757dba5c", + "execution_count": 7, "metadata": {}, "outputs": [ { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "ammonia.info = {}\n" + ] } ], "source": [ - "aspirin_0 = aspirin[0]\n", - "del aspirin_0.info[\"smiles\"]\n", - "del aspirin_0.info[\"connectivity\"]\n", - "molify.ase2rdkit(aspirin_0, suggestions=[])" + "# Create a molecule and remove connectivity\n", + "ammonia = ase.build.molecule(\"NH3\")\n", + "\n", + "print(f\"{ammonia.info = }\")" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "c038acc3", + "execution_count": 8, "metadata": {}, "outputs": [ { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Nodes: 4\n", + "Edges: 3\n", + "\n", + "Edge attributes (all bonds):\n", + " Bond: atom 0 - atom 1, bond_order = None\n", + " Bond: atom 0 - atom 2, bond_order = None\n", + " Bond: atom 0 - atom 3, bond_order = None\n" + ] } ], "source": [ - "molify.ase2rdkit(aspirin_0, suggestions=[\"CC(=O)OC1=CC=CC=C1C(=O)O\"])" + "# The connectivity is infered from the covalent radii scaled by 1.2\n", + "# this method does not determine the type of the bond (bond order).\n", + "graph_without_connectivity = molify.ase2networkx(ammonia, scale=1.2)\n", + "\n", + "print(f\"Nodes: {graph_without_connectivity.number_of_nodes()}\")\n", + "print(f\"Edges: {graph_without_connectivity.number_of_edges()}\")\n", + "print(\"\\nEdge attributes (all bonds):\")\n", + "for u, v, data in graph_without_connectivity.edges(data=True):\n", + " print(f\" Bond: atom {u} - atom {v}, bond_order = {data['bond_order']}\")" ] }, { "cell_type": "markdown", - "id": "72072f8a", "metadata": {}, "source": [ - "You can use [match_substructure](modules.rst#molify.match_substructure) to select parts of the structure based on SMILES, SMARTS, molecules or even ase.Atoms." + "### How Bond Detection Works\n", + "\n", + "When connectivity is not available, `ase2networkx()` uses:\n", + "\n", + "1. **Covalent Radii**: Each element has a characteristic covalent radius\n", + "2. **Scaling Factor**: Default `scale=1.2` multiplies these radii\n", + "3. **Distance Check**: Two atoms are bonded if:\n", + " ```python\n", + " distance <= (radius_1 + radius_2) * scale\n", + " ```\n", + " This includes bonds over periodic boundaries.\n", + "4. **Special Handling**: Excludes typically non-bonding ions (Li, Na, K, Rb, Cs, Fr)\n", + "\n", + "The following demonstrates the `scale` parameter in action:" ] }, { "cell_type": "code", - "execution_count": 8, - "id": "77c5bcbd", + "execution_count": 9, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "scale=0.7: 0 bonds detected\n", + "scale=1.2: 3 bonds detected\n", + "scale=3: 6 bonds detected\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "data": { - "image/jpeg": "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", - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAJ8CAYAAABunRBBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVVFJREFUeJzt3Qd0VOX29/GdQkgCIXQB6aCA9CLKBS/KtYvKVcSGwMWGYAELesEuoiJKkd5BBEWQIkVQASnSO4goVRGQEkJNCEl4137eC3+RnMkkmcw5Z873s1aWrpwZ5skoJ7/Z+ylh586dOycAAADwjHC7BwAAAIDgIgACAAB4DAEQAADAYwiAAAAAHkMABAAA8BgCIAAAgMcQAAEAADyGAAgAAOAxBEAAAACPIQACAAB4DAEQAADAYwiAAAAAHkMABAAA8BgCIAAAgMcQAAEAADyGAAgAAOAxBEAAAACPIQACAAB4DAEQAADAYwiAAAAAHkMABAAA8BgCIAAAgMcQAAEAADyGAAgAAOAxBEAAAACPIQACAAB4DAEQAADAYwiAAAAAHkMABAAA8BgCIAAAgMcQAAEAADyGAAgAAOAxBEAAAACPIQACAAB4DAEQAADAYwiAAAAAHkMABAAA8BgCIAAAgMdE2j0AAACAvzt37pzs2LFDfvnlFzlx4oQkJydLUlKSpKSkSN68eSUmJkaio6MlLi5OqlWrJuXKlZOwsDC7h+0aBEAAAOCIsLdmzRrztXr1alm7dq0cO3bM7z+jSJEiUr9+/Yu+CIXWws7puw4AABBEZ86ckcmTJ8v48eNl2bJlWQp7WQmFjRs3ljZt2shdd90lefLkCfhruBUBEAAABM3u3btl6NChMmLECDl8+HDQXrdUqVLy5JNPyuOPPy4lS5YUryMAAgCAXJWeni7z5s2TgQMHyqxZs0zL1y6RkZHy73//Wzp27ChNmzb1bIuYAAgAAHKFRozPP/9cXnvtNTPHz2mqV68u7733ntx5553iNQRAAAAQcPv375cOHTrIjBkzxOlat24t/fr1k8KFC4tXEAABAEDAaKz47LPP5Nlnn5WjR4/m6M8qUKCAWc1boUKFC9u+REVFma1gdEsY/dq+fbusW7dOTp48maPXKlGihJmbqItFvIAACAAAbK/6nQ97f/2qVKmShIdnfmZFWlqa2S/w/DYy+qXbyJw6dSrL42jtkWogARAAAOTYxIkTpVOnTlmu+l1//fVmQUaLFi0Cuk2LVge//PJLGTRokKxYsSLL1cDhw4dL8+bNJVQRAAEAQLZpjNBFHu+++67fz9HTO3RvvqeeesosxMhtWhEcPHiwTJgwwQRDf3388cfSpUsXCUUEQAAAkO3tXXSun27v4o9ixYrJm2++KY888ogJgcGm1clRo0bJO++84/fG06+//roZc6htF0MABAAAWZaamir/+c9/zEke/mjVqpUMGDDAhEC77d27V5544gmZM2eOX4/XkNu3b9+QCoGZz6wEAAD4W+VPA5Q/4U8Dn87F++KLLxwR/lTp0qXNhtRaDYyPj8/08f3795eXX37Z1g2sA40ACAAA/KYh6IUXXpDRo0f7VfXbsmWLtGzZUpwmLCzMVDA3b94st912W6aP//DDD+X999+XUEELGAAA+K1nz57SvXt3n4/R1bxaXdMtVdzg3LlzZh6jtnozi0W6V6BWP92OAAgAAPyyePFic36ur+igGzZ/9dVXcuutt4rbfPHFFya06vxGX+F29erVUqtWLXEzAiAAAMiUbqpcu3Ztn2f65s+f3yysaNKkibjVnDlzzJ6EetqIlbp165q9BQO5b2GwMQcQAABkStu+vsJf3rx55euvv3Z1+FM6H1ArgREREWJFj5774IMPxM2oAAIAgBy1fiMjI2Xq1KkhdXLGuHHjpG3btiHbCiYAAgCAHLV+dYXsiy++GNDXTUhIMAHr/Jee5vHbb79d8rjcjDGvvPKKz0qfm1vBBEAAAGCpc+fO0q9fP8vrjRo1MhVCXy1Tf+h2LLo3nwY9DXy7du3y63m5GWOSk5OlXr16snXrVsvH6Kkir776qrgNARAAAGRo7dq10qBBA8uQFR0dLevXr5cqVarketC0ktsxZuXKlSbk6ubXGdHqnwbESpUqiZuwCAQAAGToo48+8hmwevToEZDw52QNGzaUl156yfL62bNn5ZNPPhG3IQACAIBLHDx40BzhZkWrYlq1y21RUVGmDaubLxcsWDDXXy8jb775plSrVs3y+pgxY8xcSTchAAIAgEuMHDnSVLesQpkeBZfTeX8ZrSbWVbXt27eXQYMGmfbriRMnzLxAPYHDn3N7c0N0dLQJeXp8XEaOHTsmEydOFDdhDiAAALhIWlqaVKxYMcNVt6pNmzYyduzYgL7m/v37TYVPTxKxUr58edmzZ89F3wtmjLn99tvNRtEZqVOnjpkzaRUSnYYKIAAAuMjs2bMtw5/q2LFjwF+zZMmSPsOfE3T08XPrYhjdEsYtCIAAAOAi2n71tfedLozwottuu03KlSuXrffNaQiAAADggp07d8o333zjswrmljZnoEVEREiHDh0sr+sRckeOHBE3IAACAIALZs6caXlNF2E8+OCD4mXt27c3i2AykpKSIvPmzRM3IAACAIAL9BQOK+3atZN8+fKJlxUvXlzuu+++bL1/TkIABAAAfgWYu+++O6hjcaq7fbwPBEAAAOAqJ0+elJ9//tnyum7IDJH69etbXlu3bp3lsXFOQgAEAAAXtjKx2lfviiuusG0jZqepUKGCFCpUKMNrunH1r7/+Kk5HAAQAAIaeuJGdqpfXhIWF+ayG+nofnYIACAAADAKg/3y9HwRAAADgGnqUmRUC4MUIgAAAICTs27fP5wkg+D++WsC+3kenIAACAAAjKSnJ8gSMggULBn08TlakSJEsv49OQgAEAABm9W9ycnKG12JiYoI+HqeL8fGeWL2PTkIABAAAPkNLdHR0UMfiBnnz5rW8RgUQAAC4gtX+f+e3PYH/7wsbQQMAAFfwVeVzQ0sz2FJSUixDsxta5gRAAAAg4eHhEhUV5dqWZrAl+XhPCIAAAMA1rIJLamqqnD59OujjcbJjx465es4kARAAABjFixe3vLZhw4agjsXpNvh4P3y9j05BAAQAAEadOnVcfbpFMK3x8X64YdNsAiAAAAiJ482CaY3Lz00mAAIAgEyDy+rVq4M6FqdbQwAEAAChfr7tTz/9xEKQv5z1e+DAAbHaIPqqq64SpyMAAgAAo3DhwlKhQgXLzY1ZCJJ59a927dqSJ08ecbpIuwcAAACco0GDBrJr164Mr82dO1caNWqUa699++23m+qalYyu+Vq4ombPni2lSpWSQJo7d67P988NCIAAAOCi+WtffvllhteGDx8u3bt3z7UKl7aZ9+zZk6XnZFaV1BM7AunkyZMybtw4V8//U7SAAQDABbfddpvPCtyMGTPEy8aPHy8nTpywPBv4pptuEjcgAAIAgAtq1aol1157reX1QYMGiVedO3fO58/fvHlzKVOmjLgBARAAAFykY8eOltfmz58vW7duzZXX3b17twlZgfwqX758wMa3dOlS2bRpU7beN6chAAIAgIvcd999UqRIEcvrQ4YMES8a5KP6V7FiRbn55pvFLQiAAADgItHR0fLoo49aXh8zZozlPnihavv27TJ58mTL60899ZSEh7snVoWd0/ooAADAX+zcuVMqV65s2qgZadGihXz11Vdm4UOoS09Pl+uvv14WL15sufnzH3/84bNq6jTuiaoAACBotKXpa0XwtGnT5PPPPxcvGDBggGX4Uw888ICrwp+iAggAADL03Xff+dzWRE8O2bJli5QoUUJCufVbq1YtSUpK8nkyiK9j9JyICiAAAMjQjTfeaBaEWElISDBz30K1lpSeni7t27f3Gf7053db+FNUAAEAgKWDBw9K9erV5fDhw5aPmTBhgjz44IMSavr37y/PPfec5fVy5cqZbWHi4uLEbagAAgAAS8WLF8908+cOHTrI2rVrJZQsXLhQunbt6vMxo0aNcmX4UwRAAADgk7aBfbWCjx8/Lrfccov8/PPPEgpWrVold955p5w5c8Zn67dZs2biVrSAAQBAQFrBl19+ufzwww9SqVIlcauNGzeaYHfkyJGQbP2eRwUQAAAEpBWse+E1adLE53FpTrZs2TJp2rSpz/Dn9tbveQRAAADgF20DP/bYYz4foyeEaIjSMOUmc+fONaueExMTfT7ulVdecXXr9zwCIAAA8NvgwYPNKSC+HD16VP75z3/KG2+8ISkpKeJkp0+fli5duphNr/XffdEtYXr27CmhgDmAAAAgS5KTk6V58+by/fffZ/pY3URZzw6uW7euOM2SJUtMqPv1118zfWzLli3NyScRERESCqgAAgCALImOjjZHwV133XV+Lapo2LCho6qBp/9X9dMqpT/h74477pDx48eHTPhTVAABAEC2g5RWxubMmePX47Ua2KdPH7nhhhskLCxM7DjZQ8fapUsXv4Kf0g2ux44dK3ny5JFQQgAEAADZplW9Rx55RCZNmuT3c6pWrSodO3aUNm3aSHx8vOQ23bpGV+4OGTJEdu3a5ffzdIPrAQMGhFTl7zwCIAAAyJG0tDR55513pEePHubf/RUbGyutW7c2myrXqVMnoGPSeLNixQqzdY2GU1+bOv9d3rx5zWIPrRTaUakMBgIgAAAICD0Orm3btrJ58+YsP1cD4DXXXCP169c3XzVq1JCoqKgsLUzR+YZr1qwxX7oNzU8//ZTlcVx77bUyevRoU6UMZQRAAAAQMFoJfP31103bNCvVwL/T8KdzBjUMVqhQQWJiYsyXfl+reRr4kpKSzFw+DXwaOlNTU7P9ennz5jVjf/7550Oy5ft3BEAAABAQegKIBrYXXnjBbBrdrl07V5wKcq1Hqn5/RQAEAAA5dvbsWROktDqnFTmtqOkCEZ1L9+GHH2a6ybId4uPj5bXXXpPOnTt7our3VwRAAACQY9o+feutt2T58uXSoEGDi67p8Wq6lYouyPjll1/EbrVq1ZJOnTrJQw89JPnz5xcvIgACAIAc2bBhg1x99dXStWtXsxLYikaO+fPnmyA4ffr0HM0RzCqdO6htad1+plGjRiG7utdfBEAAAJBt2ubV1bsa5latWmVav/7Yu3evDB8+XD799NMs7c2XVVWqVDErkx999FEpXrx4rr2O2xAAAQBAtr355pvy7rvvmj336tWrl60/488//zTzBlevXn1hG5c//vgjy39OuXLlzCIUbUHrP3U8RYsWzdaYQh0BEAAAZMu6devMOb/du3c3QTCQDhw4YIKgzhk8efLkhW1ftOKoVUbdEkbPJNY5fNWqVTOBj7DnPwIgAADIMg1iWmkLDw+XlStXZmnTZtgv0u4BAAAAd6763bp1q2nbEv7cJ9zuAQAAAHfR0Pfee++ZEz9q165t93CQDbSAAQCA33SjZ51vp/PwdM+/PHny2D0kZAMtYAAA4Dfd7FkXZugCDcKfexEAAQCAX3SxxwcffGDm/9WsWdPu4SAHaAEDAIBM6TYsdevWNduuLFu2TCIjqSG5Gf/1AABApnTBx86dO83ef4Q/9+O/IAAA8Ekrfr1795b3339frrrqKruHgwCgBQwAACzp6Rt16tSRQoUKydKlSyUiIsLuISEAqAACAABLr776quzZs0emT59O+AshBEAAAJChJUuWSJ8+feTDDz+UqlWr2j0cBBAtYAAAcInTp0+bUz6KFy8uixYtovoXYqgAAgCAS3Tr1k327t0rs2bNIvyFIAIgAAC4yA8//CD9+vUz7d8rr7zS7uEgF9ACBgAAF5w8edK0fi+//HJZuHChhIeH2z0k5AIqgAAA4IJXXnlFDhw4IHPnziX8hTACIAAAMObPny8DBw6U/v37S+XKle0eDnIRLWAAACAnTpyQWrVqSbly5UwQpPoX2qgAAgAA6dq1qxw6dEi+//57wp8HEAABAPC4b7/9VoYMGSKDBg2SihUr2j0cBAEtYAAAPOz48eNSo0YNs93LvHnzqP55BP+VAQDwsBdffFGOHj0qI0eOJPx5CC1gAAA8Srd6GT58uAwdOtQs/oB30AIGAMCDEhMTTev3qquuMkEwLCzM7iEhiKj1AgDgQc8//7zZ+kVbv4Q/76EFDACAx8yaNUtGjx4tI0aMkDJlytg9HNiAFjAAAB6iCz609aubPs+ePZvqn0fRAgYAwEM6d+4sp06dMos/CH/eRQsYAACPmDFjhowbN07GjBkjpUuXtns4sBEtYAAAPCAhIUGqV68uDRo0MEGQ6p+30QIGAMADnn32WUlOTjZ7/hH+QAsYAIAQN3XqVPnss8/k008/lVKlStk9HDgALWAAAELY4cOHTeu3UaNGJghS/YOiBQwAQAh7+umnJTU1VYYMGUL4wwW0gAEACFGTJ0+WL774QiZMmCAlSpSwezhwEFrAAACEoIMHD5rW7z//+U8TBKn+4a9oAQMAEGK0ttOxY0fz74MHDyb84RK0gAEACDGTJk2SKVOmmH8WL17c7uHAgWgBAwAQQv7880/T+v3Xv/5l5v8BGSEAAgAQIvRX+r333itLliyRLVu2SLFixeweEhyKFjAAACFi4sSJZq8/XfRB+IMvVAABAAgB+/fvN63fW2+91Wz7AvhCAAQAwOX0V/ndd98tK1euNK3fIkWK2D0kOBwtYAAAXE7P+P36669l2rRphD/4hQogAAAu9scff0iNGjWkefPmJggC/iAAAgDgUvorXIPfunXrZPPmzVK4cGG7hwSXoAUMAIBLjRkzRmbPnm3av4Q/ZAUVQAAAXOj33383rd977rlHRo8ebfdw4DIEQAAAXEZ/dd92222m7atfBQsWtHtIcBlawAAAuMzIkSNl7ty5pv1L+EN2UAEEAMBF9uzZIzVr1pRWrVrJiBEj7B4OXIoACACAS+iv7Jtvvlm2bdsmmzZtkvj4eLuHBJeiBQwAgEsMGzZMvvvuO9P+JfwhJ6gAAgDgArt27TKt34cffliGDh1q93DgcgRAAAAcLj09XW688UbZuXOnaf3GxcXZPSS4HC1gAAAcbvDgwbJgwQLT/iX8IRCoAAIA4GA7duyQWrVqSbt27WTgwIF2DwchggAIAICDW7833HCDOfVj48aNkj9/fruHhBBBCxgAAIcaMGCALFq0yLR/CX8IJCqAAAA40K+//iq1a9eWxx57TPr372/3cBBiCIAAADhMWlqaNG3aVA4cOCAbNmyQfPny2T0khBhawAAAOIxW/H788Uf54YcfCH/IFVQAAQBwED3mrU6dOtKhQwfp06eP3cNBiCIAAgDgoNZvkyZN5MiRI7J+/XqJjY21e0gIUbSAAQBwiI8//lhWrFghS5YsIfwhV1EBBADAAbZu3Sp169aVp59+Wnr37m33cBDiCIAAANgsNTVVGjduLMeOHZN169ZJTEyM3UNCiKMFDACAzbTit3r1alm6dCnhD0FBBRAAABtt3rxZ6tevL126dJH333/f7uHAIwiAAADY5OzZs9KoUSNJSkqSNWvWSHR0tN1DgkfQAgYAwCa9evUy270sW7aM8IegogIIAIANNm7cKA0aNJCXXnpJ3n33XbuHA48hAAIAYEPrt2HDhmb1ry7+yJs3r91DgsfQAgYAIMh69uwpmzZtkpUrVxL+YItwe14WAABv0jl/PXr0kG7dukm9evXsHg48ihYwAABBkpKSIldffbX591WrVklUVJTdQ4JH0QIGACBItPL3008/Ef5gO1rAAAAEge7zp3P/XnvtNalTp47dw4HH0QIGACCXnTlzxpz2oVW/FStWSJ48eeweEjyOFjAAALns7bffll9++cVUAQl/cAICIAAAuUjn++kZvxoCa9asafdwAIMWMAAAuSQ5Odls9RIbGyvLly+XyEjqLnAG/k8EACCXvPHGG7Jjxw5Zu3Yt4Q+Owv+NAADkAq349e7d25zzW716dbuHA1yEFjAAAAGWlJQkdevWlfj4eFm6dCnVPzgO/0cCABBgutff7t27Zd26dYQ/OBL/VwIAEEBa8fv444+lV69eUq1aNbuHA2SIFjAAAAFy+vRpqV27thQrVkwWL14sERERdg8JyBAVQAAAAqR79+6yd+9emTVrFuEPjkYABAAgABYtWiT9+vWTjz76SK688kq7hwP4RAsYAIAcOnXqlNSqVUtKlSolCxcupPoHx6MCCABADr3yyiuyf/9+mTt3LuEPrkAABAAgBxYsWCADBgww7d/KlSvbPRzAL7SAAQDIppMnT0rNmjWlbNmyJgiGh4fbPSTAL1QAAQDIpq5du8qhQ4fk+++/J/zBVQiAAABkw3fffSeDBw+WgQMHSsWKFe0eDpAltIABAMii48ePm9avzvn79ttvqf7Bdfg/FgCALHrppZckISFBRo4cSfiDK9ECBgAgC+bNmyfDhg2TIUOGSPny5e0eDpAttIABAPDTsWPHpEaNGlK1alUTBMPCwuweEpAt1K0BAPDT888/b0Kgtn4Jf3AzWsAAAPhhzpw5MmrUKBk+fLjZ9w9wM1rAAABk4ujRo6b1qyt/NQhS/YPb0QIGACATXbp0kVOnTsmIESMIfwgJtIABAPDh66+/lrFjx8ro0aOldOnSdg8HCAhawAAAWNC9/qpXry7169c3QZDqH0IFLWAAACw899xzkpycbPb9I/whlNACBgAgA9OmTZPx48fLuHHjpFSpUnYPBwgoWsAAAPzN4cOHTev32muvNUGQ6h9CDS1gAAD+5plnnpHU1FQZOnQo4Q8hiRYwAAB/MWXKFPn888/ls88+kxIlStg9HCBX0AIGAOB/Dh06ZFq/TZo0MUGQ6h9CFS1gAAD+p1OnTpKeni6DBw8m/CGk0QIGAEBEJk2aJF9++aV88cUXctlll9k9HCBX0QIGAHjen3/+aVq/N9xwgwmBQKgjAAIAPE1/Dd57772yZMkS2bJlixQrVszuIQG5jhYwAMDTdMXv1KlTZfLkyYQ/eAYVQACAZ+3fv9+0fm+55RaZOHGi3cMBgoYACADwJP3116JFC1mxYoVp/RYpUsTuIQFBQwsYAOBJutHzjBkzTPuX8AevoQIIAPCcffv2mdbvHXfcIePHj7d7OEDQEQABAJ6iv/buvPNOWbNmjWn9Fi5c2O4hAUFHCxgA4Cljx46VWbNmmfYv4Q9eRQUQAOAZe/fuNa1fXfyhQRDwKgIgAMAT9Nfd7bffLhs3bpTNmzdLoUKF7B4SYBtawAAATxg1apR88803pv1L+IPXUQEEAIS83377TWrUqCH33XefjBw50u7hALYjAAIAQpr+mtOTPrZu3Wpav/Hx8XYPCbAdLWAAQEgbPny4fPvtt6b9S/gD/j8qgACAkLV7926pWbOmPPjggzJs2DC7hwM4BgEQABCS0tPT5aabbpLt27fLpk2bpECBAnYPCXAMWsAAgJA0ZMgQmT9/vmn/Ev6Ai1EBBACEnJ07d5rWb5s2bWTw4MF2DwdwHAIgACDkWr/NmjWTPXv2mE2f4+Li7B4S4Di0gAEAIWXgwIHyww8/mPYv4Q/IGBVAAEDI0AUftWrVkkcffVQ++eQTu4cDOBYBEAAQMq3fpk2byr59+0zrN1++fHYPCXAsWsAAgJDQv39/WbJkiWn/Ev4A36gAAgBc75dffpHatWvLk08+KX379rV7OIDjEQABAK6WlpYm1113nRw6dEg2bNggsbGxdg8JcDxawAAAV+vTp48sX75cFi9eTPgD/EQFEADgWlu3bpW6detKp06d5KOPPrJ7OIBrEAABAK6UmpoqjRs3lsTERFm/fr3ExMTYPSTANWgBAwBcSSt+q1evlqVLlxL+gCyiAggAcJ0tW7ZIvXr1pHPnzvLBBx/YPRzAdQiAAADXtX4bNWokp06dkrVr10p0dLTdQwJchxYwAMBVevXqZYLfsmXLCH9ANlEBBAC4xqZNm6R+/fry4osvSs+ePe0eDuBaBEAAgCucPXtWrrnmGklJSZE1a9ZI3rx57R4S4Fq0gAEArvDee+/Jxo0bZcWKFYQ/IIfCc/oHAACQ23Sfv3feeUf++9//mhYwgJyhBQwAcDRt+TZs2FD019WqVaskKirK7iEBrkcLOAvOnDljJiDr0UMnTpyQ5ORkSUpKMt/XG5JuRKor0uLi4uTKK6+U2rVrszkpAFfT+9yGDRtk27ZtcvLkSXPP0+9pKNP7nt7z9D6n972qVatKzZo1A74y99133zX7/q1cuZLwBwQIATCTsKcTjfVLd5vfvHmzmYTsr4iICKlevbppV5z/IhQCcHrYO3/f0y8NXrrvnr8iIyOlRo0a5n7XoEED88+chELd7kUD4GuvvWbO/AUQGLSA/0I/3U6YMEHGjh1r2gxZCXtZCYV6E3vkkUekTZs2UrBgwYC/BgD46/jx4/Lpp5/KuHHjTNjKStjLSijUMKj3vNatW5tqob8fxPV5+nyt/uXJkyfgYwO8igAoYlq6gwcPNsFPb4bBEhsbKw8//LB07NhR6tSpE7TXBQBdTTto0CAZP368OVEjWDT8aRB86qmnTIfEl1dffdVs+qwdmFq1agVtjIAXeDYAanVv+vTp5ga4YMECu4djjjXSINiyZUt2tgeQK7SiNmXKFHPfW7p0qd3DkaZNm5r7XosWLS6Z26ddGL0vvvnmmyYIAggszwVA/XHHjBlj5pP88ccf4jTFihUzY+vUqZOEh7NLD4CcS09Pl6FDh5owdfDgQXGakiVLyltvvSWPPfaYhIWFmbmIOndQ50vrcW+0foHA81QA/P333+Xxxx+XuXPnitM1adJERo8eLZUrV7Z7KABcbOfOndK+fXv54YcfxOluvPFGGTFihJmS06dPH7MIRReUAAg8TwRA/RFHjRolzz//fI7n+JUpU8Z8MtVgpnP4tF2rO9Lrlgi6PYJ+7dq1y9y49J85oZ9+def7Z555hmoggCxX/bTV+/LLL8vp06dz9GfliSkrsYXqS97YChIWES3hETESFh4l59LPSHpasqSnJUnKqZ1yOnGtnE36PUevpfdVvY/26NFDunXrlqM/C4CHA2BOqn7alrj22msvbOFSr149KV68uN/PP3LkiFlVd347BT2+SMeTVVQDAQSr6pcn5nKJLdRQYgvWlZiCdSW2YD2JjCri9/NTzxyS04nrJSlxrZxOXCenj66Ss8lZn27zr3/9S0aOHCnlypXL8nMBeDwA6qreZ599NktVP51/cvvtt5uJybfccovZtiVQ9K3WBSf6qXzatGmSlpaWpWrgBx98IE8//bQZIwBkdI8ZMmSIvPjii1ms+oVLfMk7pWiFJyR/sRskLCxwHYdz59LlxMHv5fCuoXL8wGytTfr93Pz585tW8KOPPsp9DwiwkAyA+iN1797dtE/9VbRoUXOTefLJJ6VChQqS23QByvDhw2XYsGGyf/9+v5/XoUMHGThwIC1hAJe0fDt37iyffPKJ38+JzHuZFCnfXoqUay9RsWUkt6Wc3iOHd4+QhN1jJDXlkN/Pe+mll8wHYEIgEDghFwD1JqhVMp1E7G+bV4Pi/fffb8v2K7odzdSpU808nd27d/v1nIceesisZGZlHAClmzfrB1jdzNkfeWLKSKnqPSS+1L8lPDz4R6ulp52RxH1TZP+W1/xuD+tUHr2vB7IrA3hZSAVAbam2a9fObGzqD92MtG/fvlKoUCFxwikkGgK1PeyP5s2by+TJk80CFADepQvQHnjgAfNB0h9Fyj8qpaq/JxF5CojdUlMSZd/mlyXht7F+Pb5Vq1by2WefmZNBAORMyARA/TF0Dyld7etP1U/3xLrzzjvFaXSOoE7e9qcaeM8998gXX3zBzRDwKP3Qq6cJ6X3An6pf2bpDJK74v8Rpjv85V35f19GvaqAeo6kdEKbBADkTHirhTyc9+xP+tOqnh5s7MfypG264QTZt2mQWoWTmq6++Mm0RbXsD8Ba97+lxav6EP636VW22xpHhTxW47Bap0myNFC7bNtPH6rnFzz33nPn5AXi8AqiTg1955RWfj9H5cjo/RlslbjFnzhxzNFxmq/k0/H744YdBGxcA++nxaO+++67Px4SFR0v5q8dLfMnm4haJf0yVPWvayrn0FJ+P05NDXn/99aCNCwg1rg+Ay5cvl8aNG/usgukWKjo/Rrd1cZsff/zRbEtz7NixTMPirbfeGrRxAbDP999/b07N8CU8Mk4qXvuV5C96nbjNiUPzZdfy+yQ97ZTlY3RFsO5zeN117vv5ACdwdQDU3eLr1q0r27Zt87mP1DfffGNColtt2LDBbIqqG0tbKV26tGzevFni4+ODOjYAwXXixAmpWbOm7Nmzx/IxEXkKSaXGs8wmzm51KmGl7PixuaSnWu/jqpvj6/1RTw8B4KE5gG+88YbP8KcrZGfMmOHq8Kdq165tQmxcXJzlY/bu3SsvvPBCUMcFIPi6du3qM/yFR+STio2muTr8qXyFG5oKpraxrWzfvt3s+QrAQxXAzFq/uleUtn2dutgjO7TdoW3e5ORky8fQCga82/rV83k1/MUVayahQlcI71x+r8i51Ayv0woGPBQA/Wn96kHigf5kmJCQIKtXr77wpef7/vbbb5c8LjffUj3mSVf+WaEVDHi39Xt5zY+kWKVO2X6NLXOvlLNJl97TAqFQmdZSrv6IbD334K8fy74t3Syv0woGPBIAtQXia9Vr/fr1TYUwp/vjaZCaNWuWCXoa+Hbt2uXX83LzLdU/+6abbjKVACt6IsCIEdm70QJwJv3gpx8AreQr0kQqN5mXo3N8czMAFi77iJStNzxbzz13Lk1+XdRMTh9dYfkYPQZPzw0GEKIB8KeffjKfgq1av1FRUSaw1ahRI8evpTeUfv36Zfl5uf2WagVAfz49PcTKkiVLXD/3EcD/t2rVKmnYsKHl9fCIWKnSbJXkzVcpR6+TmwGwdJ0BUrT8Y9l+fvKJbbJtQUM5l37GshW8bt06M2caQOZcd4SEBjJfW77owpBAhD8nK1eunPTu3Vs6dOhg+Rj9JEwABEJDZpWtklf1yHH4U9EFqklEnoI5+jPSzh6Vs0m/X7IwpdDl9+dsbHFVpGS1N2Xflv9afvDWoz1Hjx6do9cBvMJVFUDdC69UqVKWGyMHqvWbWQVQq4waMhs0aCCTJk2SxMTEi64H4y3V17j55pvlu+++s1wEo5XCyy+/PNfHAiD3/Pnnn1KmTBk5e/ZsrrV+A+n39U/Lkd0XT0EpXLaNlK03LMd/dmat4OjoaLMjQpEiRXL8WkCoc8Ydw096kodV+NPAo+dDBvpcXP3zatWqZc7nHTRokKxcudJMxtY2s54nbNdiC2136Dw/3eTa6ozQ4cOzN98GgHOMHDnSMvyFheeVsvWGOib8paeelqN7J13y/cLl2gXkzw8LizDzCMPC8mR4XXdI0N8DAEKoAqjDvOqqq+Tnn3/O8Po999wjU6ZMCehr7t+/XwoWLGgZslT58uUvWZUXzLf0iSeesAx6JUuWNGPTY/AAuI9+kKtQoYL8/vvFLdVArKzNDQm/fSq/rX38ou/ljasq1f61PqCvs3vVI5L4x5cZXqtUqZL88ssvEh7ujFAMOJVr/oYsXLjQMvypjh07Bvw1NUD5Cn9O4Ovn1gA7ffr0oI4HQODMnDnTMvypohWfFCc5sufS6luRsoGp/v1V0QrWP/eOHTvk22+/DfhrAqHGNQFQ269WqlSpIs2ahc7Gp1lRp04dadSoUbbeNwDO5uvvb0zBehJbsIE4RfLJX+XUkaUXfU9btYXLPhzw18pXpLFEF6hueZ37HhAiAfDAgQPmVA9f+2PpnDiv8lUFXLBggc8NswE4086dO2XevHmW14tWeMJR972EDKp/BUo2l8i8xQL+Wvpz+6oCZlY5BeCSAKg3QZ0LkxFt0bZt21a8rGXLllK0aFHL67qZNQB30WMdrehWLYUubyVOcS49VRJ+++yS7xcp959ce81CpR+U8Mj8GV7TrcL0/HQALg+AegqHlYceesgs1PAy3fpAVylb0RXLANzF131PT9UIj3TOsWfH/5wjqWcOXPS9PDGlJa649bnFORWRJ04KlXnI8jr3PSDEA2Dz5s2DOhanuuOOO7L1/gFwJl9/bwuUuE2c5MjuSzdf1r3/cnt7mgKXWb8P3PcAlwfA1NRUWb/eegsB3fwZInXr1rWcD6RbIhw/fjzoYwKQPbrfqR57aSUmvq44xdmkfXL84Ny/fTfMBMDcFlvQ+n3YtGmTpKSk5PoYALdyfADUrV+SkpIyvFasWDEpXbp00MfkRHFxcWY1tBU9IxOAO2zYsMH6vPPYChIZVUicIuH38SLnLp6jHVesmeTNVz7XXztPdAnJE53xaUca/jZv3pzrYwDcyvEB0Nc8Dq3+OWkVnN18VUOZDwO4h6+/r7EF64lT6Kb3R/aMveT7hcvn3uKPv4vxUQXkvgeEcADE/yEAAqHB199XX4En2E4eXiQpp3Zc9L2IqCISX/KuoI3BVxuY+x7g4gDoq3VJAPT//aAFDLiHr7+vvgKPE/b+K1zmIQkPjwraGHRDbCvc9wAXB0A9zszXKRi4eCGIr820AbiDr/teTHxtcYLUlERJ3D/tku8XzsW9/zIS6+P94L4HuDgAWi0AUYULFw7qWNywECQiIiLL7yMAZ/H19zXCIQtAEvd+IefSLh5nbKGGElPgqqCOw9f7wX0PcHEATE5O9rkBMvx7T/R91AnbAJzP6r6nZ+uGhWX8IS/YjmTQ/i1Srl3QxxEWnjdbvz8Ar4sU194IwyQqKnjzTNxCj8Y7depUhteWLVtGaAYcTo+9PHv2bIbXwiJixAlOJ26QpGMXz6/TY9kKlg7+8XS62bSGwHPpZy65RgUQcHEAROA0btzY7iEACAEJey49+aNgqXslwuJsXgDO4/gAqBUr3RX/77SdqRt95s1rXf73Il+fePVoJPZNBJzvmmuuMacg/d3f59zZIT0tWY7u/fyS7xcJ4t5/f3XuXHqG1b/zHREALg6AvtrDBED/Wub6PrJtDuAOGlxOnDhxyffPnTsr586l2ToP8Ni+aZJ2NvGi70XHVZN8ha+1ZTxW4U8x5QVw8SIQX5/gEhISgjoWp9NfGDp/KCN8Egbcw9ff17SUo2KnIxm0fwvbsPjDn/eD+x7g4gBYsmRJy2vr168P6licztempyVKlAjqWADkzn0v6dgGscuZUzvN6R9/FRYeJYXLPGzbmE77eD+47wEuDoC+NjfmmB//3w9f7yMAZ/H19/V0on2nWySYc38v3k4qvsSdEpm3qG1jSkpca3mN+x7g4gDI+bb+49xkIDT4+vuaZFMA1LmHCb+Nd1T7N7NAzH0PCOEAyObG/4cACIQGX39fT/uoeOWm43/Ok7PJf1z0vTwxZSWu+L/ETr4CMfc9wMUBsGrVqpYTeQ8dOiR79+4N+picugBk27ZtltdphQDuUbt2bQkPz/j2nHJ6l6TasBAkIcOTP9qYjZjtcjb5wCWh9Dw9KKBGjRpBHxPgFo4PgJGRkVKnTh3L67SB/28BiFU19Morr5QCBQoEfUwAsic2Nlauusr6TN2/n8KR286eOSjHD8z+23fDpXDZNuLU9m/NmjU5LQpw8z6AqkGDBuYYs4zMnDlTWrRokWuvffvtt8u+ffssr2d0zVdgVbNnz5ZSpUpJIM2aNcvn+wfAXfTv7ebNmzO8dvzAHIkr1ixoYzn623izB+Ffaes3Kras2On4n3Msr3HfA0IkAFqZMGGC9O7dWwoWLJgrr/3TTz/Jnj17svScDRt8b9OgJ5gEevPnUaNGWV5nHgzgPnrfGzPm0rarSvjtUylZ7S0Jj4wNyliOmNW/FytSzp6TP85LO3tCjv4+wfI69z3A5S1gdfPNN0tERITl0Wdjx156c/KSyZMny+HDhy2v33HHHUEdD4Ccu+222yyv6UkcR/+YFJRxnDzyo5w5efH84sioYlKgZHOx09G9EyU99WSG13T+5K233hr0MQFu4ooAqJt5/vvf/7a8PmjQIE+vBtaf38oNN9wgVapUCep4AORcxYoVzYdfK4d3Dg3KfS+jxR+Fyjwk4eH2za/Tn/vwrqGW15s3by5lypQJ6pgAtwk755LktGDBAmnWzHrOy3fffSf/+pe92xHYtfijXr16lte//PJLadmyZVDHBCAwpk+f7nOO8xVNF0u+QleL15w8vES2L7nR8vo333wjt9xyS1DHBLiNKyqA6vrrrzdbwmSnChbKBg8e7PM4qbvvvjuo4wEQOFrJKlu2rM8qoBf5qv5VqlRJbrrppqCOB3Aj1wTAsLAw6dixo89PylYr5kKVLk4ZP/7SnfnPe+KJJyRPnjxBHROAwNG5z08++aTl9cQ/vpQzp3aIlySf2CbH9k2zvP7UU09Z7qEIwIUtYHXs2DGzfcrp06ctV30tX77c7B0Y6vQ/m37K/f777y1/cWhAvPzyy4M+NgCB8+eff5r5bGfPXrwNy3n5ijSRyk3m2bohczCPo/t1UTM5fXRFhtejo6PN4QBFihQJ+tgAt3HVHSM+Pl5at27tc1PoXr16iRcMGzbMMvwpnTdE+APc77LLLvM5j/fUkSVyeOcQ8YJD2/tbhj/1wAMPEP6AUKwAnt+XT3d4T09Pz/C6tjzXrl0b0kcA7d6927wHJ09mvAWCWrJkiTRu3Dio4wKQO1atWiUNGza0vB4eEStVmq2SvPkqSSi3frctaCjn0s9YThPSRXF6jB6AEKsAKj0e6YUXXrC8rm2Sdu3aWbZL3E7z+mOPPeYz/D366KOEPyCEXH311dKhQwfL6+lpp+W3tU/KuXMZfzAOhdbvb2ufsAx/6rnnniP8AaFcATx/8kXdunXl559/tnxMjx49pHv37hJqhgwZYiY5WyldurRZDKPtcgCh48SJE6by7+tkostrfiTFKnWSUHPw149l35ZultcrV65sTmDSM5QBhHAAVLrYQ6tcVq1gXQTx1VdfyV133SWhYuHCheZ0AA3AVtj/CghdOu/3xhut978LC4+SitdONef0horjB76RnStaipxLtWz9Llq0SJo0aRL0sQFu5roW8HnXXnutz1ZwWlqatGrVymwgHSpzgO68806f4U9bv4Q/IHTpZve+WsHn0lNk14pWcirBeqGEm5w8vFh2rXzAMvydb/0S/gAPVQD9bQXnz5/fVMXcPCdOWxt64z9y5IjlY2j9At7gTys4Ik9BqdR4tsQWtD4lyOlOJayUHT82l/TU45aPofULeLACeH7Pp9GjR/vc9FMXS+h+eXPnzhU3Wrp0qTRt2tRn+FMjRowg/AEeEBcXJyNHjvT5mLSzibJ9yS2mguZGJw7Nlx1Lb/MZ/rT1q/d/wh/gwQB4vhXcs2dPn49JSkoy7dPPP/9c3GT27NnmMHjdANuXF198kdYv4CHaEchskVt66gnZ8eOdcmz/THGTxD+mys5lLSQ97ZTPx7355pu0fgGvtoDP0x9BQ9DHH3+c6WMfeeQR6devnxQqVEicSquWL7/8sl/nG+uWN1oN4OgjwFv0vqfzAXVT+MwUKf+olKr+nkTkKSBOlZqSKPs2d5WE38Zl+thnnnnG3Me1CgjAwwFQ6Y/x+OOPZ9oaUSVLlpShQ4eaqqDT6KKV9u3bm82eM3PPPffIF1984Ymj7wBkvNjt4YcfNveBzOSJKSNl6w6WuOLWq4jtcvzPufL7uo5yNvkPvz7Ejxkzhg+9QA6FTAA8fzPUitj48eP9eryTqoFZqfqp5s2by+TJkyVv3ry5PjYAzpWSkmKOQJs6dapfj3dSNTArVT+lOzt89tlnfOgFAiCkAqDSfQG1PeBvkNJq4HvvvSf333+/WVQSbHpiid64Nfz5U/VTDz30kPkErMfeAUBqaqo5IWjs2LF+PV6rgaWq95D4Uv+W8PAoCbb0tDOS+Mdk2f/T635V/ZR2eAYPHmz2eAWQcyEXAJX+SK+++mqmi0P+Sg8Q1330dE5NhQoVJLft3btXhg8fbubvHDhwwO/n6SkgAwYMoP0B4JIPv507d5ZPPvnE7+dE5r1MipT7j6kKRsWWkdyWcnqPHN41XBL2jJXUlEN+P++ll16SDz74gDl/QACFZAA8Tz8NP/vss3L8uPVWAn+nNxg9baNjx45y6623BvTTpr7V8+fPN9XJ6dOnm5a1v2JiYswN8Omnn+YmCMDyHqPzm3WT/NOnT2fhmeESX7K5FK3whOQv1kzCwgL3AVPPJz5x8Ds5vGuoHD8wW7/j93N1H9e+ffuaedHc94DACukAqH7//XfTOsjOPoDaHr7mmmukfv36F76KFy/u9/N17741a9Zc+Fq5cqUZT1Zdd911MmrUKLPpKQBkZufOnSY0/fDDD1l+bp6YyyW24NUSW7CuxBSsZ/4Zmbeo389PPXNITieuk9OJayVJ/3l0lZxN3petrW50UV+5cuWy/FwAmQv5AKj0R9QA9fzzz2epGmh14oYGwSuuuMJU5XTeoC7E0InYut+gfu3atcsEPn/n9FnRP1/nJ+qcRlq+ALLaEtY5c127ds1iNTDjOYOxBetLVL4KEh4RLeERMRIWFiXn0s9IenqypKclS8qpHSb0nU3am6PX0o2d9T7ao0cP6datW47+LAAeD4CBqAYGG1U/AHZXA4PtxhtvNKcaaXDt06eP+SBdo0YNu4cFhCRPBUClP66uoH3ttdfkjz/8W30WTMWKFTNj69SpE1U/AAGrBurcQD094+DBg+I0Ot3m7bffNgvxdK6fnvOunRbtgixbtowdD4Bc4LkA+NftV2bMmGEWZOjCDLv94x//MAtPWrZsyd5+AHLFmTNn5KuvvjL3vSVLltg9HLn++uvNfa9FixaXhLxVq1ZJo0aNTGjVXR0ABJZnA+Bfbd26VYYMGWIqgzmdI5jVuS6tW7c2W7vUqVMnaK8LABs3bjStVt04XzeiD5a4uDhp27at2XKrevXqPh+rwa9Xr16yevVqqVWrVtDGCHgBAfAvTp06JRMmTDBBUD99apUw0HRbmXr16plTSNq0aSPx8fEBfw0A8Jd+6NUQqNtmrV271mwqHWh6ckeDBg1M8NOj6zQE+lux1Ofp83UXBVrBQOAQAH3ceDZv3nxhCxf9BLpp06YshUINezqB+a/byOinWJ3XAgBOo3PvtDL41+2r9D6YlVCoIe38fU/Dm/6zZs2a2Z7aoqG0YcOGZm70G2+8ka0/A8ClCIDZCIXaMj5x4oS5Wep2Bfr9qKioC9vC6OalVapUIewBCJlQ+PPPP5suid7z9Ht639NQp/c8vc/pfa9atWo5CntWNPjpyU5aBaxbt25A/2zAqwiAAABH031WtQqoq5m1G6MfuAHkDPuMAAAcTQOfzlHU7ss777xj93CAkEAABAA4Xu3atc08QD0dSecmAsgZWsAAAFfQRXh6Pru2hDUEsmcqkH1UAAEArqArjLUV/Msvv8hbb71l93AAVyMAAgBcQ1cZ6+kgH3zwgVkVDCB7aAEDAFxF9yXUY+J0WxrdJ1C3ogGQNVQAAQCuoieD6IlNO3bsYHNoIJsIgAAA19FzhN9++23p3bu3LFu2zO7hAK5DCxgA4NpWcJMmTeTo0aOyfv16Tl4CsoAKIADA1a3gPXv2yKuvvmr3cABXIQACAFyratWq0qNHD+nTp48sXbrU7uEArkELGADgamlpaXLdddfJoUOHZMOGDRIbG2v3kADHowIIAHC1iIgI0wreu3evdOvWze7hAK5AAAQAuN6VV15pzgnu16+fLFq0yO7hAI5HCxgAEBLS09OladOmsm/fPtm4caPky5fP7iEBjkUFEAAQEsLDw2X06NGyf/9+eeWVV+weDuBoBEAAQMioXLmyOSd4wIABsmDBAruHAzgWLWAAQMi1gps1a2b2B9RWcFxcnN1DAhyHCiAAIORawaNGjTLbwnTt2tXu4QCORAAEAIScihUrSq9evWTIkCHy3Xff2T0cwHFoAQMAQrYVfNNNN8n27dtl06ZNUqBAAbuHBDgGFUAAQMi2gkeOHCkJCQny4osv2j0cwFEIgACAkFW+fHn56KOPZPjw4TJ37ly7hwM4Bi1gAEBI019zt9xyi2zdulU2b94s8fHxdg8JsB0VQABASAsLC5MRI0bIsWPH5Pnnn7d7OIAjEAABACGvbNmy0qdPH7M9zOzZs+0eDmA7WsAAAE/QX3e333672RxaW8GFChWye0iAbagAAgA80wrWxSCnTp2Szp072z0cwFYEQACAZ5QuXVr69u0r48aNk6+//tru4QC2oQUMAPAU/bV35513ypo1a2TLli1SuHBhu4cEBB0VQACA51rBw4YNk+TkZHn22WftHg5gCwIgAMBzSpUqJZ988ol89tlnMm3aNLuHAwQdLWAAgCfpr78WLVrI8uXLTSu4aNGidg8JCBoqgAAAz7aChw4dKqmpqfLMM8/YPRwgqAiAAADPKlGihAwYMEA+//xzmTx5st3DAYKGFjAAwNP012DLli1l0aJFphVcvHhxu4cE5DoqgAAA8XoreNCgQSYIdurUye7hAEFBAAQAeN5ll11mQqC2gSdNmmT3cIBcRwsYAID/adWqlcyfP9+0gjUUAqGKAAgAwP8cOnRIqlevLk2aNJEpU6aY9jAQimgBAwDwP8WKFZPBgwfL1KlTZeLEiXYPB8g1VAABAPibBx98UObOnWtawSVLlrR7OEDAEQABAPibI0eOmFZww4YNZfr06bSCEXJoAQMA8DdFihQxp4R8/fXXMn78eLuHAwQcFUAAACw88sgjMnPmTNMKLlWqlN3DAQKGAAgAgIWEhATTCq5fv76pBtIKRqigBQwAgIXChQvLsGHDZNasWTJ27Fi7hwMEDBVAAAAy0a5dO7M1jLaCS5cubfdwgBwjAAIAkInExETTCq5Zs6bMmTOHVjBcjxYwAACZKFiwoIwYMcLsDThy5Ei7hwPkGBVAAAD89Oijj8qXX34pmzdvlrJly9o9HCDbCIAAAPjp2LFjUqNGDalatarMmzePVjBcixYwAAB+io+PNy3g7777zqwOBtyKCiAAAFn05JNPyoQJE2TTpk1Svnx5u4cDZBkBEACALDp+/LhZEVy5cmX59ttvJTychhrchf9jAQDIogIFCphW8Pz582XIkCF2DwfIMiqAAABkU8eOHc0JIdoKrlixot3DAfxGAAQAIJtOnjxpWsG6JcyCBQtoBcM1+D8VAIBsyp8/v4wePVoWLVokAwYMsHs4gN+oAAIAkEPPPPOMmRO4ceNGszAEcDoCIAAAOXTq1CmpVauWlCxZUn744QeJiIiwe0iAT7SAAQDIoXz58smYMWPkxx9/lP79+9s9HCBTVAABAAiQLl26mG1h1q9fL1WqVLF7OIAlAiAAAAFy+vRpqVOnjhQtWlQWL15MKxiORQsYAIAAiY2NNauCly9fLn369LF7OIAlKoAAAATYiy++aLaFWbdunVSrVs3u4QCXIAACABBgSUlJUrduXYmPj5elS5dKZGSk3UMCLkILGACAAIuJiTGrglevXi29e/e2ezjAJagAAgCQS15++WXp27evrF27VqpXr273cIALCIAAAOSS5ORkqVevnlkcsmzZMsmTJ4/dQwIMWsAAAOSS6OhoGTt2rNkXsFevXnYPB7iACiAAALmse/fu8uGHH5o5gXpkHGA3AiAAALnszJkz0qBBA9MCXrFiBa1g2I4WMAAAuSxv3rxmVfDGjRvlvffes3s4AAEQAIBgqF+/vnTr1k3eeecdMycQsBMtYAAAgiQlJUWuvvpq8++rVq2SqKgou4cEj6ICCABAkGjg01XBP/30k/To0cPu4cDDCIAAAARRnTp15NVXX5WePXuaDaIBO9ACBgAgyM6ePSsNGzaU1NRUszWMLhIBgokKIAAAQabbwGgreNu2bfL222/bPRx4EAEQAAAb6IbQb7zxhrz//vtmQQgQTLSAAQCwibaAr732WklKSpI1a9aYo+OAYKACCACATSIjI80G0du3b5c333zT7uHAQwiAAADYqEaNGvLWW2+Zs4KXL19u93DgEbSAAQBwQCu4cePGcuzYMVm3bp3ExMTYPSSEOCqAAAA4pBW8e/duee211+weDjyAAAgAgANUq1bNnBP88ccfy48//mj3cBDiaAEDAOAQaWlp0qRJEzly5IisX79eYmNj7R4SQhQVQAAAHCIiIsK0gn///Xfp3r273cNBCCMAAgDgIFWqVDHnBPfr108WL15s93AQomgBAwDgwFZw06ZN5cCBA7JhwwbJly+f3UNCiKECCACAA1vBo0ePln379sl///tfu4eDEEQABADAga644gpzTvAnn3wiCxcutHs4CDG0gAEAcKj09HS54YYb5LfffpNNmzZJ/vz57R4SQgQVQAAAHCo8PNy0gg8ePCgvv/yy3cNBCCEAAgDgYBUrVpRevXrJoEGD5Pvvv7d7OAgRtIABAHBBK/jGG2+UHTt2mFZwgQIF7B4SXI4KIAAALmgFjxo1ShISEuSll16yezgIAQRAAABcoHz58tK7d28ZNmyYzJs3z+7hwOVoAQMA4BL6K/vmm2+Wbdu2mVZwfHy83UOCS1EBBADAJcLCwmTEiBGSmJgoL7zwgt3DgYsRAAEAcJFy5crJxx9/LCNHjpQ5c+bYPRy4FC1gAABcRn9133bbbaYNvGXLFilYsKDdQ4LLUAEEAMClreCTJ09Kly5d7B4OXIgACACAC5UuXVr69u0rY8aMkZkzZ9o9HLgMLWAAAFxKf4U3b95c1q1bJ5s3b5bChQvbPSS4BBVAAABc3ArWfQGTkpLkueees3s4cBECIAAALnb55ZdLv379ZPz48TJ9+nS7hwOXoAUMAIDL6a/yu+++W1auXGlWBRcpUsTuIcHhqAACABACreChQ4dKSkqKPPPMM3YPBy5AAAQAIASULFlSBgwYIBMnTpQpU6bYPRw4HC1gAABChP5Kv/fee2XJkiWmFVysWDG7hwSHogIIAEAItYIHDx4s6enp8vTTT9s9HDgYARAAgBBy2WWXycCBA2XSpEnmC8gILWAAAEKM/mpv1aqVLFiwwLSCNRQCf0UABAAgBB06dEiqV68uTZo0MYtCtD0MnEcLGACAEKQLQAYNGiRTp06Vzz//3O7hwGGoAAIAEMIeeOAB+fbbb00ruESJEnYPBw5BAAQAIIQdPnzYtIIbNWpkqoG0gqFoAQMAEMKKFi0qQ4YMMecEf/bZZ3YPBw5BBRAAAA9o3bq1zJo1y7SCS5UqZfdwYDMCIAAAHpCQkGBawQ0aNJAZM2bQCvY4WsAAAHhA4cKFZejQoTJz5kwZN26c3cOBzagAAgDgIW3btjXzATdv3iylS5e2eziwCQEQAAAPOXr0qNSoUUNq1aols2fPphXsUbSAAQDwkEKFCsnw4cPlm2++kVGjRtk9HNiECiAAAB7Uvn17c0Tcpk2bpGzZsnYPB0FGAAQAwIMSExOlZs2aUq1aNZk7dy6tYI+hBQwAgAcVLFhQRowYYY6J05YwvIUKIAAAHvbEE0/IxIkTTSu4fPnydg8HQUIABADAw44fP25awZUrVzbVwPBwmoNewH9lAAA8rECBAjJy5EiZP3++2Sga3kAFEAAAyFNPPSWffvqpbNy4USpWrGj3cJDLCIAAAEBOnDhhNocuV66cqQbSCg5t/NcFAAASFxdnNob+4YcfZODAgXYPB7mMCiAAALjg6aefltGjR8uGDRvMwhCEJgIgAAC44OTJk1K7dm0pVaqUqQbSCg5N/FcFAAAX5M+f31QAlyxZIv3797d7OMglVAABAMAlOnfubLaF0VbwlVdeafdwEGAEQAAAcInTp0+bVnDx4sVl0aJFEhERYfeQEEC0gAEAwCViY2NNK3jZsmXSt29fu4eDAKMCCAAALL3wwgtmW5j169dL1apV7R4OAoQACAAALCUlJUmdOnWkUKFCsnTpUlrBIYIWMAAAsBQTEyNjxoyRVatWyUcffWT3cBAgVAABAECmunbtKv369ZN169bJVVddZfdwkEMEQAAAkKnk5GSpW7eu2SdQF4ZERkbaPSTkAC1gAACQqejoaBk7dqysXbtWevXqZfdwkENUAAEAgN+6desmvXv3ljVr1kjNmjXtHg6yiQAIAAD8dubMGalfv77kzZtXli9fLnny5LF7SMgGWsAAAMBvGvx0VbAeEff+++/bPRxkEwEQAABkSYMGDeS///2vvP3222aDaLgPLWAAAJBlKSkpcvXVV0tYWJisXLlSoqKi7B4SsoAACAAAskX3BGzYsKF0795d3nzzzYD+2fv37zcLTX755Rc5efKk2YZGTyXR4KltaN2gWlcmx8XFmSPqdF5isWLFAjqGUEYABAAA2abB791335UVK1ZIvXr1svVnHDhwwIS91atXm3/q1759+7L855QtW9YEQW1R6z/1q2jRotkaU6gjAAIAgGzTitw111wjaWlp5rg4rc75Y+/evTJs2DAZP3687Nq1K9fGV6VKFWnTpo08+uijctlll+Xa67gNARAAAOSIrgjW+YB6XFyPHj0sH5eeni7z58+XQYMGyYwZM0xoDBbdrua+++6Tjh07yj/+8Q8zd9HLCIAAACDH3nnnHXnrrbfM3oDagv2ro0ePmlNEBg8ebOb02a1WrVomCD788MPmaDsvIgACAIAcO3v2rFx77bVmsYYeF6etYN00umfPnubkkNOnT4vTFChQQF577TXp0qWLREREiJcQAAEAQEBs3rzZLAR54YUXpGXLltKuXTvzPae75pprzObWuprYKwiAAAAgoK3g119/3VTUcjLHT/cV1FattpMrVKhgtn3RL/2+Vha10qhVxe3bt5tVw5s2bZLU1NRsv17evHnN2J9//nlPVAMJgAAAICA0iLVt21a2bNmS5efWqVPHtJDPb99SvXr1LG0urYFQQ+D5bWR+/PFH+emnn7I8jms8Ug0kAAIAgBzRSp9Wz3QFcFaqfvny5ZPWrVvLU089JbVr1w7omDTe6AkluuL4iy++MFXDrFQDe/bsaeYGhupqYQIgAADI0T6AjzzyiEyaNMnv51SrVs2swtXnxcfHS247fPiwjB49WoYMGSI7d+70+3lPPvmkDBw4MCRbwgRAAACQLToH795775VvvvnGr8frnL4+ffrIDTfcYEtlTfchnDNnjqns/frrr34954EHHpBx48aZfQRDCQEQAABkmZ7Pe/vtt8vixYszfWxkZKR069bNnBmclXl9uRlcX331Venbt69pFWfmjjvukClT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", "text/plain": [ - "" + "
" ] }, - "execution_count": 8, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" + }, + { + "data": { + "image/png": "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5bZgwYIc/d46deq4IHjFFVdYiRIl4lrmnTt32iuvvGJDhw61JUuW5Ohn1T386quvWs2aNY/695deesmuueYaFwTVCkoIBOAlAiAAz2j8m8Kfwo/CX69evbL8PrWsaUydFkmOtZUtk8JfixYt3FjBxo0bu8fjjjsuR79j/fr1Nn/+fJs3b557nDt3rguBOaHWyXvuucd1E+u/szJ69Gi7+uqrXQvos88+y3qAADxDAATgWfjr06ePCz0vv/yya+XLzuLFi10LWU5bA3+vYsWKLgg2aNDAdcdqTcEiRYq45/bu3etm8arbeeHChS7wbdy4MU9/T61+auFUq2R21LKoAKiWUC0cTQgE4AUCIABPwp+CnMKOAuBll10W88/mpTXQa7G0+mVFXcQKgGoR1bhIQiCARCMAAkh4+FM352uvveYC4CWXXJKr36OxdwMHDnRbpyUjTULR5JBYWv2yovdH4xfVMqrWQ0IggEQiAAJI6J6/Cn+vv/66a+XStm55ocvVF1984SZjKDDt37/f/FSoUCHXmqnJJ/FY2Fnvk0LgpZde6sZIEgIBJAoBEEDCwp/Gtmmh5zFjxthFF10U19+/efNmt36gWt2+++4789IJJ5zgWiPVrV2uXLm4/m4tEq1QqZZShcDsFsgGgNwgAAJISPjTeLY333zTtdRdeOGFCV1WZvr06TZ8+HC30HKitorTxJEOHTq4BZzbt2+f0GVbtMagWgEVmjVhhhAIIN4IgADiHv7UjfnWW2+5Ls0LLrjAs7+tSSLaKUQzeTOXcfnyyy9z3FWsrt369eu7mcOZX6eddlqOJnbklcKzQqDCsybOEAIBxBMBEEBcA5jC39tvv+26fnv06OF3kX4NhVriRcu7ZC77snbtWhdQNUaxevXqblkYLRejpWK8DnuR6H3UuEm9j5pAkwxlApAaCIAA4ha0NHbtnXfecePYunXrZslMawuqZU8thVq3L1mNHz/edQV3797dTaQhBAKIB/YeAhCX8KfuSoU/jV9L9vAXJAp+ek8nTJjgAnayr4UIIBgIgADy5MCBA27G6sSJE924ta5du/pdpJSjQK33VgFb77XecwDICwIggFxTENEYtcmTJ7tJH126dPG7SClL763eY73XhEAAeUUABJArCiAam/buu++6yQrnn3++30VKeXqPFQKnTJnigjchEEBuEQAB5JiWVenZ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JAAAiTRjxgw3qbJly5Y2fvx4VxepThowYEBMP6/WwLVf9LJl00+xDSvutQN7fzQv7N/9na1fdrctm3ai29rtUAytfnL33Xfbk08+mZJDrQK9DmB2lNi1QfOOHTti/hk172qWk1oRO3bsGNfEr7d69uzZrqVP4U2LVceqSJEibuDt9ddff1QTtFouL7jgAjd2UDufaMkbANljHUAgZ6ZPn27dunVzQ5XefPPNo5ZBUf2mxhc1pGjljZjly2+lKnW18sf3t+LlW8a1izUj47Bb1mXz6mdsxyYtBRd73ClZsqQNGTLErr76aktVKR0A5fvvv7d+/frlah3ASpUquaneqiQyvypUqBDzz2vtPlUumV+ff/65K09OabLHqFGj7KSTTsryeYXACy+80HUFK1iyJAyQPQIgEDvVoQp/bdu2deGvUKFCWX7fqlWr3I4hH374YY7/RsEiVaxomTOsaOmGVrR0AytSuoEVSC8X888f3P+T7d220PZsW2B7ti6wPdvm2aF9G3Jcjo4dO7r1DqtWrWqpLOUDoOglKkBpqZictAZmRV3FqjROPvlk1yqnOyCdCAcOHHB3PfpSN7IqlVi7dSPR77///vvthhtuyLb5ef/+/S4EqitYzfI6gAFERgAEYqPdtLp37+56mMaNGxcx/GU6cuSI6zb985//nLPWwCykF61uRUo3tPSiNSwtf2FLy1/E8uVLt4wj++3IkX1uTN/+Xd/Y3u0L7GAeu5NLlixpjz32mPXu3TulJntElBEi69aty+jQoYMCb9J/NW/ePGPVqlU5en379u3L6NKlS0ahQoUypkyZkrD3EUgF8+fPd+eaHgFkbfLkyRnp6emublEdkxNff/11xjnnnON7fRrLV8eOHV1GCJPUG9UYhZpz3333XdcaWLlyZUtGxxxzjBt38N5770Xs8o1Ed2Vjx451XcC6W9NOIgAA5MbkyZOtR48eblx8LC1/v6eesvfff9/VaarbklHlypXdlrKqL1O9y/f3QhUARc26at5VN60OaA1mTQZnn322jR492o0RjKXLN7sQqBNWJ+6kSZPiXlYAQGpT3aE6pFOnTm6psvT09Fz9HtVlqtNUt6mOU12XDNq0aePGMioLaCWQUHT5/p7fTZDJYPny5Rk33nhjRsmSJT1tci5atGhG//79MxYuXBj317R///6MHj16ZBQsWDDjnXfe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0qWL30UCEooAiJSnC7ku6Lqwa7kYQiCA39I1QasITJkyxV0rzj//fL+LBCQcARChoAu6BnS/++677kJPCAQg+/fvd2v7TZs2zY0Z7ty5s99FAjxBAERodOrUyV3gdaHXBV8XfgDhlRn+pk+f7q4N5513nt9FAjxDAESo6AKvC70u+FrXixAIhNO+ffvcklEzZsxwM347duzod5EATxEAETq60Gtm8KxZs1wFoIoAQPjC3+zZs921oEOHDn4XCfAcARCh1L59e3fhVwVACATCQ+e61gmdM2eOWx1A1wIgjAiACK127dq5CkAVgRZ7JQQCqW3v3r1ubb/333/fJk2aZG3btvW7SIBvCIAINVUAqgjmzp3rKgZVEABSN/x98MEH7pxv06aN30UCfEUAROipIlCFoIqBEAiknj179rhF4T/88EO3Hmjr1q39LhLgOwIgYOYqBC0C+9FHH7mKQhUGgNQJfx9//LE7x1u1auV3kYCkQAAE/qtly5auglBFod1DCIFAsOkc1rn86aefukXgdY4D+P8IgMBvnHvuua6i+Oyzz9zuIbt37/a7SAByQeeuzmGdyzqnW7Ro4XeRgKRCAAR+RxWFKozPP/+cEAgEkM5Zben2xRdf2NSpU6158+Z+FwlIOgRAIAuqMFRxzJs3z1UkhEAgGHbt2uW2fZw/f747h8855xy/iwQkJQIgEIEqDlUgqkhUoahiAZD84W/hwoVuz+9mzZr5XSQgaREAgShUgagiUYWifYR37tzpd5EAZEHnps7RRYsWuXP27LPP9rtIQFIjAALZUEUyffp0W7x4MSEQSOLwp3NU5+pZZ53ld5GApEcABGLQtGlTV7EsWbLEOnbsaDt27PC7SADM3Lmoc1Lnps5RnasAskcABGLUpEkTmzFjhi1btowQCCSB7du3W4cOHdw5qXNT5yiA2BAAgRw488wzXUWzfPlyV/GoAgLgX/j76quvbObMme7cBBA7AiCQQ2eccYarcFTxEAIB723bts3at29vK1eudOdi48aN/S4SEDgEQCAXVOGo4vn6669dRaQKCYB34W/VqlU2a9Ysa9Sokd9FAgKJAAjkkioehUBVRIRAIPG2bt1q7dq1s2+//daFv4YNG/pdJCCwCIBAHqgCUkWkCkkVkyooAIkLf99995075xo0aOB3kYBAIwACeaSKSBWSKqa2bdvali1b/C4SkFJ0TuncWrNmjc2ePdvq16/vd5GAwCMAAnGgCkkV09q1awmBQALC37p169w5Vq9ePb+LBKQEAiAQJ6qYVEF9//331qZNG9u8ebPfRQICTeeQziWdUzq36tat63eRgJRBAATiSBWUKqoffvjBVVy//PKL30UCAknnjs6hH3/80ebMmWN16tTxu0hASiEAAnGmikoV1vr16wmBQB7C34YNG9y5dPrpp/tdJCDlEACBBFCFpYpr48aN1rp1a/v555/9LhIQCDpXdM7o3NE5VLt2bb+LBKQkAiCQIKq4VIH99NNPrkLTI4DIfnuu6Nw57bTT/C4SkLIIgEACqQJTRZbZqkEIBKKHP3X/vvfee4Q/IMEIgECC1apVy1VomtHYqlUr27Rpk99FApKKzgmdGzpHdMN06qmn+l0kIOURAAEPqEJTCNRuBqroNL4JgLlzQeeEzg2dI4Q/wBsEQMAjNWvWdBXc9u3bCYGAmZvlq3NB54TODZ0jALxBAAQ8dMopp7iKbseOHa7iUwUIhDn87dy5050TOjcAeIcACHjs5JNPdhWeKr6WLVu69QKBMNExr2N/9+7d7lzQOQHAWwRAwMcQuGfPHtcKQghEWGhnD4W/vXv3unPgpJNO8rtIQCgRAAGfqOJTBaiKUBWiKkYglWmLRB3r+/btc8f+iSee6HeRgNAiAAI+UgWoinD//v2uYlQFCaRy+Dtw4IA75k844QS/iwSEGgEQ8JkqQlWIBw8edBXk999/73eRgLjSMa1j+9ChQ4Q/IEkQAIEkcPzxx7uKURWkKsp169b5XSQgLnQs65g+fPiwO8Z1rAPwHwEQSBI1atRwFeSRI0cIgUgJa9eudceyjmkd2zrGASQHAiCQhCFQVHGqAgWCaM2aNe4Ylvfff9+qV6/ud5EA/AYBEEgyqigVAvPly+cqUFWkQBDDX1pamgt/1apV87tIAH6HAAgkIVWYCoGqQAmBCJLVq1fbueeeawUKFHDHcNWqVf0uEoAsEACBJKWKU60nqkhVoapiBZLZd999525Y0tPTCX9AkiMAAkmsSpUqLgSqQlUIVAULJKNvv/3Whb9ChQq58KdjF0DyIgACSa5y5cquQi1cuLALgapogWTyzTffuPBXpEgRmzNnjjtmASQ3AiAQoBBYtGhRV9GqwgWSKfzp2CT8AcFBAAQC4rjjjnMVbLFixVyFu2rVKr+LhJDTMahW6eLFi7sbFB2jAIKBAAgEMASWKFHChcCvv/7a7yIhpHTsKfyVLFnShb9KlSr5XSQAOUAABAJGFa1CYKlSpVwIXLlypd9FQsjomNOxV7p0aRf+Klas6HeRAOQQARAIIFW4CoFlypSxVq1a2VdffeV3kRASOtYU/nTs6Rg89thj/S4SgFwgAAIBpYp39uzZVrZsWUIgPLFixQoX/sqVK0f4AwKOAAikQAgsX768q5hVQQOJsHz5cnejccwxx7jwV6FCBb+LBCAPCIBAwKkiVgjUo0KgKmognpYtW+bCX+axphAIINgIgEAKUIU8a9YsNzZQIVAVNhAPS5cudeFPxxbhD0gdBEAgxUKglopRha2KG8iLJUuWWOvWrd0xlTnUAEBqIAACKUQVtEKgdmNQCFQFDuTG4sWLXfjTsaRjShM/AKQOAiCQYlRRz5w506pWrepCoCpyICe+/PJLF/50DBH+gNREAARSOARWr17dVeSq0IFYLFq0yNq0aeOOHR1DWmYIQOohAAIpShX3jBkzrEaNGi4EqmIHolm4cKELfzpmCH9AaiMAAiEIgSeccIILgarggawsWLDAhb8TTzzRhT/t9AEgdREAgRSnilwh8KSTTnIVvCp64Lfmz59vbdu2tZNPPtmmT5/u9vgFkNoIgEAIqEJXxa4KXiFQFT4g8+bNc+HvlFNOIfwBIUIABEIWAmvWrOkqfFX8CLcvvvjCHQunnnqqTZs2zUqVKuV3kQB4hAAIhIgqeIVAVfiq+BUAEE6ff/65tWvXzk477TTCHxBCBEAgZEqWLOkqfFX8CoGfffaZ30WCx/SZK/zVrl3bpk6d6o4JAOFCAARCHALr1Klj7du3t08//dTvIsEj+qwV/vTZE/6A8CIAAiFVokQJe/fdd61u3bouBH7yySd+FwkJps9Yn3W9evXcZ69jAEA4EQCBEFMAmDJlitWvX986dOhgH3/8sd9FQoJ89NFHLvzpsyb8ASAAAiGXGQIbNGjgQqCCAlLLhx9+aB07drRGjRq5z7p48eJ+FwmAzwiAAFwgUDBQQFBQUGBAavjggw/cZ9q4cWObPHky4Q+AQwAE4BQrVswFBAUFBQYFBwTb3Llz7bzzzrMzzzzTJk2a5D5jABACIIA/hMAmTZq44KAAgWB6//333Weoz5LwB+D3CIAAjlK0aFGbOHGiNW3a1AUIBQkEy3vvvWedOnWys88+232W+kwB4LcIgAD+QIHhnXfecQFCQWLOnDl+Fwkxmj17tvvMmjVr5j5Dwh+ArBAAAUQNgQoSnTt3dsECyW3WrFl2/vnnW/PmzW3ChAlWpEgRv4sEIEkRAAFEpAChINGiRQsXLBQwkJxmzpzpPiN9VoQ/ANkhAAKISkFi/Pjxdu6557qAoaCB5DJjxgzr0qWLtWzZ0n1WhQsX9rtIAJIcARBAthQo3n77bWvVqpULGtOnT/e7SPgvfRb6TFq3bu0+I8IfgFgQAAHkKAQqaHTt2tWmTZvmd5FCT5+BPou2bdvaW2+9RfgDEDMCIICYFSpUyAUNBY5u3brZ1KlT/S5SaGk/X30G7dq1szfffNN9NgAQKwIggBxR0FDgaN++vQsgCiLwlrbt6969u9u7edy4cYQ/ADlGAASQYwocCh7aMk5BRIEE3tBOLT169HCLdI8dO5bwByBXCIAAciU9Pd0FEAURBRJtN4bE0q4eeq+10PMbb7zhPgMAyA0CIIBcUwBRENFC0RdccIELKEgMLcp94YUXuhm/hD8AeUUABJAnCiKvv/66CyYKKAoqiC8t7NyzZ0834/e1116zggUL+l0kAAFHAASQZwokCiYKKAoqWowY8aGld/SeasLNmDFjCH8A4iJfRkZGRnx+FYCwO3jwoF1xxRUutKibUuPVkqFMy5Yts4ULF9rGjRtt7969tm/fPlu3bp1rubzqqqusevXqbseTihUrWoMGDax27dpJEbS05M4ll1ziutdHjx6dFGUCkBoIgADi6tChQy4EKrwoYCm8eB325s+f777mzZtnixcvtv379+fo92hmbb169axRo0a/fnkdCrXUzqWXXuq61RX+ChQo4NnfBpD6CIAAEhICr7zySjdLWF3D6sJMlCNHjrgdMYYPH+62RVPrXiJolw2tfThgwAC3/l5aWuJG0Oh9u+yyy+yiiy6yl19+mfAHIO4IgAASFgLVvaquYI1dU5iJp19++cWef/55F/y+++4789IJJ5zggmCfPn2sXLlycf3der8uv/xy1/X74osvEv4AJAQBEEBCQ+DVV1/tuoJfffVVu/jii/P0+3S5+vzzz23o0KHud+a0azfe1FWsbtpBgwbZGWecYfny5cvT79NrUve5fqfCX/78+eNWVgD4LQIggIQ6fPiwXXPNNa4VUGPZFG5yQ2P5FLQ++ugjS0bNmjWzYcOGWZ06dXL183p/evXq5QKgWjYJfwASiWVgACSUgswLL7zgujUVbhR0cjqx45///Kc1btw4acOfqGyaLHLfffe5MueEWkcV/vRF+APgBVoAAXjWEti3b183qUFfCoSxtPr17t3bFixYkKe/XalSJRfO6tevb2XLlnUTOrTsi2QuC7NlyxZbtGiRmz28YcOGPP29hg0butAbS2vgK6+84sZK6uvZZ58l/AHwBAEQgKch8Nprr7WXXnrJjXFTi1dW1IL2n//8x7X85bQ1rUSJEnbuuee6wKdWQz0qAObE+vXrf11KRl/vv/++7dy5M0e/Q0vG/O1vf7M777wz4vIxCsLqHtc4yZEjRxL+AHiGAAjAU1q2pV+/fq6rUyFQy8X81sqVK13rYE5b/dTaNnjwYPezCoHxpPCnbtqnn37alixZkuPWQP1szZo1j/p3hWCFP80kHjFiREKXlQGA3yMAAvAlBPbv399GjRrlgqBawOTTTz+1Tp062datW2P6PWpZ0/Iymhxy9tln53kWbnZ0udRYP0320Fp9sbZOlilTxt59911r0qSJ+38FX3Vtq0v8mWeeIfwB8BwBEIBvIfC6666z5557zgXBqlWruv1ud+/ene3PKjDddtttdvvtt1uFChU8Ke/vbdq0yR555BH3pdeSnWLFitmECRPcFnQKfuoK1xqGhD8AfiAAAvCNgtPAgQNdF6gWPNa6gdk57bTT3AQLrbuXDLQuobpyV6xYke33Zr5GBV+tZUj4A+AXrj4AfKMApC5cTX7ILvzpe++66y43KSNZwp+ceeaZbryiypZdoNNr1GvVayb8AfATLYAAfG09a926dbbdvsnW6pfX1sDixYvbrFmzXHgEAD8QAAH4YtWqVda0aVO3/l402j5Okya0dl8QaE1BTWrRnr7RaD1CTXo5+eSTPSsbAGSiDwKA59QVqjUAswt/Wi5GS6gEJfyJyqoya5JHNHrtWgJHayMCgNcIgAA8p5mz6i6N5qabbnJLpARxcWSVWRNb9Bqi+eyzz9x7AQBeowsYgKeWL19uDRo0sAMHDkT8Hi2Top0xEr2uX6Lp8qpWTC11E0mhQoVs4cKFVqtWLU/LBiDcCIAAPO36bdasWdTWP82QHTNmTCBb/rKiLt5LL73Uxo0bF/F7tEC0FphOldcMIPkRAAF45oEHHnDLpUSiCRGLFi2yokWLxvXvarzdvHnzfv3SUjJakPn3EnU53LNnj9WvX99NfIn23txxxx0J+fsA8HsEQABJ0fWr7t4PPvjAtRDm1dKlS23y5Mku6CnwrV69OqafS+Tl8MMPP7QWLVpE/Bt0BQPwEpNAAHhCEyKijfu7+eab4xL+5Nlnn3UtjdqvN9bwl2jnnHNO1Ekh+/fvz3bSCADECwEQQMKpRW7mzJlRu37vu+8+S3X/+te/oq77N2PGDFu2bJmnZQIQTgRAAAk3bNiwiM+p6/f555+P+7i/rKSnp1vDhg2tf//+Vrp0afOaXuOoUaOizm6O9l4BQLwQAAEk1M6dO+2ll16K+PzgwYPj1vX7WwUKFLC6detanz59bOjQoW7mscqicYFaX7BUqVLmV1ewXnMkeq9UTgBIJCaBAEgotWgNGjQoy+fS0tLsu+++s+rVq8f1b27YsMG18BUpUiTi99SoUcPWrl171L95dTnU3z3++OMj/j29ZwMGDPCkLADCiRZAAAmjgKPWt0jOP//8uIc/qVSpUtTw5ze9Zr32SPSecW8OIJEIgAASuvSJJoBEEqllMAyivfYlS5a4haEBIFEIgAASRmPtIjnppJOsXbt2Flbt27e3E088MeLzw4cP97Q8AMKFAAggIdSFOXXq1IjPDxw40I0BDCu9dr0Hkei9oxsYQKIwCQRAQqxZs8ZNdIi068X69eutbNmy5hc/J4Fk2rx5s1WuXNktAh3pPUzEGEkACO/tN4CE0hZskZx55pm+hr9kUa5cOTvjjDNy9R4CQF4QAAEkhNbbi6RRo0aeliWZRXsvor2HAJAXBEAACUEAjA0BEIAfCIAA4k5j6QiA8QmADNMGkAgEQABxp8kVW7ZsyfK5YsWK2SmnnOJ5mZJVzZo13XsSaZLIunXrPC8TgNRHAAQQd4sWLYr4XIMGDSx//vyelieZ6b2oX79+xOcXLlzoaXkAhAMBEEDcbdq0KeJz9erV87QsQRDtPfnpp588LQuAcCAAAoi7ffv2RXyuVKlSnpYlCKK9J9HeSwDILQIggLjbu3dvxOeKFCniaVmCINp7Eu29BIDcIgACiLtorVaFCxf2tCxBQAAE4DUCIIC4y5cvX8TnWNbkj44cORLxuTDvlwwgcbiyAPC0RYsxbTl7T+gyB5AIBEAAcRetm5cuzZy9J3SZA0gEAiCAuIvWavXLL794WpYg0ILPkdACCCARCIAA4q5y5coRn2Nh4z9asGBBxOeOO+44T8sCIBwIgADiTrt9RLJ48WI7cOCAp+VJZnovlixZEvH5hg0beloeAOFAAAQQd5UqVYrYcqXAs2zZMs/LlKyWLl0aMRCrJbVixYqelwlA6iMAAkiIRo0aRXxu/vz5npYlmUV7L6K9hwCQFwRAAAlBAIwNARCAHwiAABKCABgbAiAAP+TLYFl+AAmwYcOGiOMAtbvFmjVrrGrVqgn7+506dbL169dHfH758uV28ODBo/6tXr16UX/nlClT4jord926dXb88cdH3AlE7yFjAAEkQoGE/FYAoaeJIJrE8OOPP/7hOQWeESNG2D//+c+E/X0FvLVr1+boZ7788suoz8d79rLeg0jhr0qVKoQ/AAlDFzCAhOnatWvE50aOHBnq5WD02vUe5Oa9A4C8IgACSJgBAwZEfG7Tpk329ttvW1i99dZb9tNPP+XqvQOAvGIMIICEat68uX344YdZPteiRQt7//33LYz02j/44IOI79ncuXM9LxOA8KAFEEBCDRo0KOJzCjlaCDlstPNHpPCX3XsGAPFAAASQUBdccIFVqFAh4vP33nuvhU20yS96r/SeAUAiEQABJFShQoXs2muvjfj82LFj7c0337SwGDdunHvNkfTr18/S09M9LROA8GEMIICE03IsJ5xwQsQlT4455hi3bEv58uUtlf38889Wu3Zt9xhpfcTVq1dbtWrVPC8bgHChBRBAwlWvXt0uueSSiM8rEF1//fWW6vQaI4U/0XtE+APgBVoAAXhCu1qcdtpptm3btqjdoxdeeKGlIr22iy66KOLzZcqUsWXLlrkFtAEg0WgBBOAJBZshQ4ZE/Z6BAwdGbSELKr2m7Gb26r0h/AHwCgEQgGd69eplXbp0iRqUunXrZrt27bJUodeiXT2iBVs9f8UVV3haLgDhRhcwgKTrCm7Xrp1NnDjRzSAOsv3791vnzp1t1qxZEb+Hrl8AfqAFEEDSdQXPmDHDLr74Ytu3b58Flcqu1xAt/AldvwD8QAsgAM/psqOuXrXyRdOmTRsbP368FS9e3IJk586d1r17d5s9e3bU71PXr15fvnz5PCsbAAgBEIAvNCburLPOsm+//Tbq9zVp0sSFpIoVK1oQbNy40YW/zz77LOr3nXjiifbJJ5+4NRABwGt0AQPwhYLPzJkzrXLlylG/T0FKiye/+uqrruUwWalsr7zyihvfmF3402vWayf8AfALLYAAfLVixQpr3ry5bd68OdvvVcvasGHDkq41UK1+AwYMsAkTJmT7vdrtZO7cuVarVi1PygYAWaEFEICvFIQ06SOWbeDUFZxMrYG/bfWLNfxNnz6d8AfAdwRAAL5r0KCBffDBB9l2B8uWLVvcmnmaRPLpp5/6EgT1N/W3VQatbbh169Zsf6ZKlSruNeq1AoDf6AIGkDTWrFnj1gD85ptvYv4ZBSrtsnH55Zdb0aJFE1q+3bt325gxY2zo0KG2cOHCmH/upJNOcmP+tCcyACQDAiCApKKxgNoSbuzYsTn6uVKlSlnv3r3dWLyaNWvGtUwrV650Yw9feOEF2759e45+VmsBKjCWK1curmUCgLwgAAJISgqAatn75ZdfcvyzanFr1KiRNW7c2D02bNjQBcRYKOAtWLDA5s+fb/PmzXOPOWmRzKQZvgp+PXv2zPHPAkCiEQABJPVagYMHD85xa2CkUKjuYm29VrhwYfeVuWOHvjSOT926uQl7WbX6PfXUUyzzAiBpEQABpHRroJdo9QMQFMwCBpD0LrroIlu+fLn17dvX0tPTLdmoTCrbsmXLCH8AAoEWQACB8tNPP9moUaNs+PDhtnbtWl/Lolm9mnTSp08fq1Chgq9lAYCcIAACCKTDhw/blClTXJfr1KlTPf3bHTt2dGMTzzvvPMufP7+nfxsA4oEACCDwNHFj5MiRNnnyZLe13JEjR+L6+9PS0tzuHZ07d7b+/fvbiSeeGNffDwBeIwACSClarHnRokVu+ZbMr5yEwsywp+VjMpeSqVevnhUrVizhZQcArxAAAYQiFC5ZssQ2bNhge/fudcu+6FGKFCniloTRY6VKlaxOnTqEPQApjwAIAAAQMiwDAwAAEDIEQAAAgJAhAAIAAIQMARAAACBkCIAAAAAhQwAEAAAIGQIgAABAyBAAAQAAQoYACAAAEDIEQAAAgJAhAAIAAIQMARAAACBkCIAAAAAhQwAEAAAIGQIgAABAyBAAAQAAQoYACAAAEDIEQAAAgJAhAAIAAIQMARAAACBkCIAAAAAhQwAEAAAIGQIgAABAyBAAAQAAQoYACAAAEDIEQAAAgJAhAAIAAIQMARAAACBkCIAAAAAhQwAEAAAIGQIgAABAyBAAAQAAQoYACAAAEDIEQAAAgJAhAAIAAIQMARAAACBkCIAAAAAhQwAEAACwcPl/hzaRPFC8RJoAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "from rdkit.Chem import Draw\n", - "\n", - "mol = molify.ase2rdkit(aspirin_0, suggestions=[\"CC(=O)OC1=CC=CC=C1C(=O)O\"])\n", - "Draw.MolToImage(\n", - " mol,\n", - " highlightAtoms={\n", - " i\n", - " for group in molify.match_substructure(\n", - " aspirin[0], smarts=\"C(=O)O\", suggestions=[]\n", - " )\n", - " for i in group\n", - " },\n", - ")" + "# Try different scale values\n", + "scales = [0.7, 1.2, 3]\n", + "\n", + "for scale in scales:\n", + " graph = molify.ase2networkx(ammonia, scale=scale)\n", + " _ = molify.draw_molecular_graph(graph)\n", + " print(f\"scale={scale}: {graph.number_of_edges()} bonds detected\")" ] }, { "cell_type": "markdown", - "id": "aab3628c", "metadata": {}, "source": [ - "This can also be employed for periodic structures. Even if they have crossed periodic boundary conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "5faa1d90", - "metadata": {}, - "outputs": [], - "source": [ - "ethanol = molify.smiles2conformers(\"CCO\", numConfs=10)\n", - "box = molify.pack([ethanol], [3], density=786, packmol=\"packmol.jl\")\n", + "## Working with Molecules from Collections\n", "\n", - "# let's move and wrap the box\n", - "box.positions += [2, 2, 2]\n", - "box.wrap()" + "Here are some additional examples, based on\n", + "ASE's molecule databases. The following converts some of these to RDKit for visualization and analysis:" ] }, { "cell_type": "code", "execution_count": 10, - "id": "fac365d4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Found 3 CH3 groups:\n", - " CH3 group 1: atoms (0, 3, 4, 5)\n", - " CH3 group 2: atoms (9, 12, 13, 14)\n", - " CH3 group 3: atoms (18, 21, 22, 23)\n" + "\n", + "PH3:\n" ] }, { "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEsASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiucvfGWnW1/LZQ/wCkTwgGRVYDaDkD+R/KplJR1ZpSozqv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XtrBcx/3ZYww/WufTwFpFreJdaZJeaa6uHZbS4ZUkwejKcjB6cYrqKKiUIy1aOiliq9JONObSfTp92xwtqNHPhLVjqotvtvmXH2sy48zzNzbffONu3Htiut0f7T/AGJYfbN32r7NH527rv2jdn8c1JJp9lLdLdSWdu9wv3ZWiBcfQ4zVmlCHKa4nFKsrJPV316eS8v8AgdgooorQ4gooooAKKKKACvPfE/8AxPfix4V0MfNBpscmsXK+4+SI/UNn861fF3jEaBNa2sMW+aeZIS3UIWzjj8K5Tw9qyWXxM1G8vnee51K0izIVCiCNDtwMdiSCfpWbqRTsdccFWlT50v8AM9YooorQ5Arivitqcun/AA+v4bXm81Epp9uo6s8p2kD/AIDu/Ku1rz3xT/xPfit4U0EfNDpySaxcr7r8kR/B8/nQB2mjaZFouiWGlwf6q0t0gU+oVQM/pV6iigDH1TwroWs5N9pdvI56yBdj/wDfS4P61z+qeHbfQdMVVvb6bS5Ly3FzBczl44og/wA2M9FJK5z2FdxSMqupVgGUjBBGQRWcqUXrbU7aGPrU7Rcm4rpf8uz8zmZRZDxlpP8AZggEnkTfavs+MeTgbd2P9rGM++O9dPVe1sbSxVltLWC3DHLCKMJk++KsU4Rtcxr1VU5Uuitru9W/1CiiirMAooooAKKKKACiiigDJ8R2Mt/pLJCC0kbCQKP4sZGP1rwmTwhIfCk8Bs5v7UYyYj+0NjJkJHG7b0xX0ZTfLTfv2Lv/AL2OaznTu7pnbh8WqcHCcbrX8TI8M2MtjpWJ1KySuX2nqowAM/lWzRRVxXKrHNVqOrNzfUK4Lxstp4s8JaRfRX0cehjULe5u2kjfM0IfAQKBnJYr19K72vIo/DOqL8KLMnUNZMo8gnTDHHsH79SRt8vfgDn73amZnrtFFFABRRRQAUUUUAFFFFABRRRQAUUUUAeX/Ezw9dX93aTJA8ts93FJKVbbsVQQecg+nSsPQ/Csp8Yq9jbyC1e08t5WlZwrbwf4iSOK9sIBGCMg9qaiJGMIqqPQDFYuld76Howx/LTS5feWz9Bw4FFFFbHnFS91K10+WzjuZCjXk4t4AFJ3SFWbHHThG5PpXMaJpYtPif4kvry6ilvby2t2t4UVsw2w3LySMZZ1JwCelT+N9PudRk8NxW0l1CV1dXee2UF4V8iYbuVYAZIGSMc1Bo+kXenfES+kmvL+/ifSYFW5u1ThhLLlAURRwMHHXmgDsqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z", - "image/png": "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", + "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 10, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ch3_matches = molify.match_substructure(box, smarts=\"[C]([H])([H])[H]\")\n", - "print(f\"Found {len(ch3_matches)} CH3 groups:\")\n", - "for i, match in enumerate(ch3_matches):\n", - " print(f\" CH3 group {i + 1}: atoms {match}\")\n", - "\n", - "mol = molify.ase2rdkit(box)\n", - "Draw.MolToImage(\n", - " mol,\n", - " highlightAtoms={i for group in ch3_matches for i in group},\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "345153e3", - "metadata": {}, - "outputs": [ + "output_type": "display_data" + }, { "name": "stdout", "output_type": "stream", "text": [ - "Hydrogen indices to highlight: {6, 7, 15, 16, 24, 25}\n" + "\n", + "P2:\n" ] }, { "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEsASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiuR/4TZf8AhAf+El+zR+bt3fZfO/6abOuPx6UAddRRRQAU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", - "image/png": "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", + "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 16, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "CH3CHO:\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "H2COH:\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "CS:\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "# 1. Define a general SMARTS pattern to find a CH2 group next to an oxygen.\n", - "# The pattern maps the two hydrogens as :1 and :2.\n", - "smarts_pattern = \"[C;H2](-[H:1])(-[H:2])-[O]\"\n", - "\n", - "# 2. Perform the substructure search.\n", - "# The result 'ch2_hydrogens' will be a list of tuples.\n", - "# Each tuple contains indices for (Carbon, Hydrogen, Hydrogen, Oxygen).\n", - "# Example: [(4, 5, 6, 7)]\n", - "ch2_hydrogens = molify.match_substructure(box, smarts=smarts_pattern)\n", - "\n", - "# 3. Create an empty set to store only the hydrogen indices.\n", - "highlight_indices = set()\n", - "\n", - "# 4. Loop through each match found.\n", - "for match in ch2_hydrogens:\n", - " # From each match tuple, extract the indices for the two hydrogens.\n", - " # These are at index positions 1 and 2 because of the [H:1] and [H:2] maps.\n", - " highlight_indices.add(match[1])\n", - " highlight_indices.add(match[2])\n", - "\n", - "# 5. Print the final set of unique hydrogen indices.\n", - "print(f\"Hydrogen indices to highlight: {highlight_indices}\")\n", - "\n", - "# 6. Convert the ASE object to an RDKit molecule for visualization.\n", - "mol = molify.ase2rdkit(box)\n", - "\n", - "# 7. Generate an image of the molecule, highlighting only the desired atoms.\n", - "Draw.MolToImage(mol, highlightAtoms=list(highlight_indices))" + "from ase.collections import g2\n", + "\n", + "# Show a few molecules from the G2 database\n", + "for idx, (atoms, name) in enumerate(zip(g2, g2.names)):\n", + " if idx >= 5: # Show first 5\n", + " break\n", + "\n", + " print(f\"\\n{name}:\")\n", + " # Note: These molecules don't have connectivity, so we need suggestions\n", + " # We'll learn more about this in the NetworkX tools section\n", + " mol = molify.ase2rdkit(atoms, suggestions=[])\n", + " display(mol)" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "d1791122", + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Key Takeaways\n", + "\n", + "### What We Learned\n", + "\n", + "1. **Creating structures**:\n", + " - `smiles2atoms()` - single conformer with connectivity\n", + " - `smiles2conformers()` - multiple conformers\n", + " - Both include explicit connectivity information\n", + "\n", + "2. **Bond detection from geometry** (when connectivity is missing):\n", + " - Uses covalent radii × `scale` factor (default 1.2)\n", + " - Results in `bond_order=None` in NetworkX edges\n", + " - `atoms.pbc` parameter controls periodic boundary handling\n", + "\n", + "### Important Concepts\n", + "\n", + "- `bond_order=None` means \"bond exists but type is unknown\"\n", + "- This happens when inferring bonds from distances" + ] + }, + { + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "molify", + "display_name": "rdkit2ase", "language": "python", "name": "python3" }, @@ -411,5 +534,5 @@ } }, "nbformat": 4, - "nbformat_minor": 5 + "nbformat_minor": 4 } diff --git a/docs/source/atom_selection.ipynb b/docs/source/atom_selection.ipynb index 9f1e3f3..e1fcbcf 100644 --- a/docs/source/atom_selection.ipynb +++ b/docs/source/atom_selection.ipynb @@ -4,9 +4,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Advanced Atom Selection with SMARTS and Mapped SMILES\n", + "# Atom Selection and Substructure Matching\n", "\n", - "This notebook demonstrates the advanced atom selection capabilities in molify, including support for mapped SMILES patterns and sophisticated hydrogen handling." + "This notebook demonstrates the atom selection and substructure matching capabilities in molify. The package provides a unified approach with advanced features:\n", + "\n", + "- `match_substructure`: Pattern matching with RDKit Mol objects supporting SMILES/SMARTS patterns, hydrogen handling, and atom mapping\n", + "- `group_matches_by_fragment`: Helper function to organize matches by disconnected molecular fragments\n", + "\n", + "The examples progress from simple pattern matching to advanced selection techniques with precise control over atom ordering and hydrogen inclusion.\n", + "\n", + "**Key Principle:** Conversions from ASE Atoms to RDKit Mol are explicit using `ase2rdkit(atoms, suggestions=[...])`, giving you full control over bond detection." ] }, { @@ -24,9 +31,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Basic Atom Selection with SMARTS\n", + "## Basic Substructure Matching with `match_substructure`\n", "\n", - "The `select_atoms_grouped` function provides advanced atom selection capabilities beyond the basic `match_substructure` function. Let's start with a simple example using ethanol." + "The `match_substructure` function provides pattern matching in molecular structures using RDKit Mol objects. It supports SMILES and SMARTS patterns and returns all matches as tuples of atom indices.\n", + "\n", + "The function requires explicit conversion from ASE Atoms to RDKit Mol using `ase2rdkit()`, which allows you to control bond detection through the `suggestions` parameter." ] }, { @@ -34,6 +43,14 @@ "execution_count": 2, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ethanol has 9 atoms\n", + "Chemical formula: C2H6O\n" + ] + }, { "data": { "image/jpeg": "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", @@ -48,11 +65,15 @@ } ], "source": [ - "# Create an ethanol molecule with explicit hydrogens\n", - "ethanol_smiles = \"CCO\"\n", - "ethanol_mol = molify.ase2rdkit(molify.smiles2atoms(ethanol_smiles))\n", + "# Create an ethanol molecule for basic examples\n", + "ethanol = molify.smiles2atoms(\"CCO\")\n", + "print(f\"Ethanol has {len(ethanol)} atoms\")\n", + "print(f\"Chemical formula: {ethanol.get_chemical_formula()}\")\n", + "\n", + "# Convert to RDKit Mol for substructure matching\n", + "ethanol_mol = molify.ase2rdkit(ethanol, suggestions=[\"CCO\"])\n", "\n", - "# Display the molecule\n", + "# Visualize the structure\n", "Draw.MolToImage(ethanol_mol, size=(300, 200))" ] }, @@ -65,19 +86,22 @@ "name": "stdout", "output_type": "stream", "text": [ - "Carbon atom indices: [[0, 1]]\n", - "Oxygen atom indices: [[2]]\n" + "Carbon atom matches: ((0,), (1,))\n", + "Number of carbon matches: 2\n", + "\n", + "Hydroxyl oxygen matches: ((2,),)\n" ] } ], "source": [ - "# Select all carbon atoms using SMARTS\n", - "carbon_indices = molify.select_atoms_grouped(ethanol_mol, \"[#6]\")\n", - "print(f\"Carbon atom indices: {carbon_indices}\")\n", + "# Match carbon atoms using SMARTS pattern\n", + "carbon_matches = molify.match_substructure(ethanol_mol, \"[#6]\")\n", + "print(f\"Carbon atom matches: {carbon_matches}\")\n", + "print(f\"Number of carbon matches: {len(carbon_matches)}\")\n", "\n", - "# Select the oxygen atom\n", - "oxygen_indices = molify.select_atoms_grouped(ethanol_mol, \"[#8]\")\n", - "print(f\"Oxygen atom indices: {oxygen_indices}\")" + "# Match the hydroxyl oxygen\n", + "hydroxyl_matches = molify.match_substructure(ethanol_mol, \"[#8]\")\n", + "print(f\"\\nHydroxyl oxygen matches: {hydroxyl_matches}\")" ] }, { @@ -89,26 +113,29 @@ "name": "stdout", "output_type": "stream", "text": [ - "Carbon atom indices: [[0, 1], [9, 10]]\n" + "sp3 carbon matches: ((0,), (1,))\n", + "Hydroxyl oxygen: ((2,),)\n" ] } ], "source": [ - "# if we have two molecules, they are returned as a list\n", - "# Select all carbon atoms using SMARTS. Indices are returned per molecule\n", - "carbon_indices = molify.select_atoms_grouped(\n", - " CombineMols(ethanol_mol, ethanol_mol), \"[#6]\"\n", - ")\n", - "print(f\"Carbon atom indices: {carbon_indices}\")" + "# Use SMARTS for more specific pattern matching\n", + "# Match only sp3 carbon atoms (aliphatic carbons with single bonds)\n", + "sp3_carbons = molify.match_substructure(ethanol_mol, \"[C;X4]\")\n", + "print(f\"sp3 carbon matches: {sp3_carbons}\")\n", + "\n", + "# Match oxygen with exactly one hydrogen (hydroxyl group)\n", + "hydroxyl_oxygen = molify.match_substructure(ethanol_mol, \"[OH1]\")\n", + "print(f\"Hydroxyl oxygen: {hydroxyl_oxygen}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Hydrogen Handling Options\n", + "### Multiple Matches in Complex Molecules\n", "\n", - "One of the key features is sophisticated hydrogen handling with three different modes: `exclude` (default), `include`, and `isolated`." + "When a pattern occurs multiple times in a molecule, `match_substructure` returns all matches as a tuple of tuples, where each inner tuple contains the atom indices for one match." ] }, { @@ -120,36 +147,71 @@ "name": "stdout", "output_type": "stream", "text": [ - "Exclude hydrogens: [[1, 2]]\n", - "Include hydrogens: [[1, 6, 7, 2, 8]]\n", - "Isolated hydrogens: [[6, 7, 8]]\n" + "All carbon matches in propanol: ((0,), (1,), (2,))\n", + "Total carbon atoms found: 3\n", + "\n", + "C-C-O pattern matches: ((1, 2, 3),)\n" ] + }, + { + "data": { + "image/jpeg": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAADICAIAAADdvUsCAAAVaElEQVR4nO3de0xUVx4H8N8wAyPyGkZFeb9m7qCgKNpSdbXWatyYdJtVsK0J1RKpmqarpdVua/q01W0TS3fb1cTqtlrbdFdr6h/rI7rW0odWKO3KQ+fOC2Z4KSIPAQXGmc3luoQwIwoyc8659/cJIZN7b/Fker9zzpzXVbjdbkAIkRNA8N9GCGEIESIPQ4gQYRhChAjDECJEGIYQIcIwhAgRhiFEiDAMIUKEYQgRIgxDiBBhGEKECMMQIkQYhhAhwjCECBGGIUSIMAwhQoRhCBEiDEOIEGEYQoQIwxAiRBiGECHCMIQIEYYhRIgwDCFChGEIESIMQ4gQYRhC5FcHDx5MTExctmyZ17Otra2JfZqbm0E2VKQLgOSlo6PDbrfHxMR4PXvr1i273S6+ANnAmhAhwjCECBGGIUSIMAwhQoRhxwwioKenp7a21vN4a2sryA+GEBFQVlYWHx9PuhS0wBBKhMvlWrduHQC8++67EyZM8Lzgo48+Ki8vz83NXbx4MZAWGRk5b948z+O9vb3Hjh0DmcEQSoTL5frkk08AYPPmzV5DeKyPwWCgIYQGg+HIkSOex5ubm8ePHw8ygx0zCBGGIUSIMAwhQoRhCBEiDEOIEGHYOyo1S5cuDQoK8jxeU1NDojjo7jCEd3f+/HmHwzFlypTJkyd7nq2trf355581Gs2jjz4KFLhT2JxOJ1AgLy8vJydHqVR6PTtu3Lj29nYACA0NBdnA5ujdFRUV5eTkfPXVV17Pfv/99zk5OS+++CLQobKystubJUuWAAVUKlVYWNjYsWMHHnS5XDU1NS0tLQAQ1kehUIBsYAgReevXr09KSrrTx5zkYQgReampqQBgMplAljCEiDyO4wCA53mQJQwhIo/DECJElk6nUyqVNputp6cH5AeHKO7VyZMnOzo6PI8bjUYSxZGUoKCgxMREq9Vqs9kMBgPIDIbwXp3tA7RSKpUHDx4EgOjoaK8XbNmyJT8/PzMzE6jEcZzVauV5HkOI7mjVqlWrV6/2PH769OmtW7cCaQqFIicnZ4gL5s6dCxTjOO748ePy/FqIIbxXiYmJCxYs8Dze0NAAtLpw4cKaNWsSEhIOHToEdNPr9bLtm8EQStnYsWNLSkquXLkC1DP0tULlGULsHZWy5OTkoKAgh8Nx48YNoBsn41EKDKGUKZXKlJQUl8tlNpuBbvHx8cHBwfX19devXweZwRBKnFjD0D+OEhAQoNPp5Dl5DUMocQw18zh2ijq6sGPm7hYuXBgaGjpz5kyvZ3U6ndgDCRTf2UxULxyGEN1JQZ87nX2gD9CKoTtb3zdKwcTnxejC5ugIffzxx88++6y4DJxmDIWQY+Tr66hTuN1u0mVgUmZm5oULF0pKSmbNmgV0i4iIaG9vb25u1mq1QLGmpqaoqKiIiAi5PRZmeDXhjj7Xrl3zevbIkSM7duwoKSkBGWCohmFlMsqECRO0Wm1bW9vly5dBToYXwpf63Ok92rt370svvXT69GmQAYZCyFBR9Yx8Xowu/E44Qtjr6AsGWU5ewxBK/85mqHrRy7KDFEN4X5/ZTHTlMfR5wbFT1FGEIRwhrVY7bty469evNzY2AiNtPJfLBXTjMIRIkndMeHj4pEmTbty4UVdXB3TT6/UKhcJsNt+6dQtkYyQzZjZs2BAWFuZ5vLS0FOSE47izZ8/yPD9//nygG8dxjY2NPM9T/qT4kJCQ2NjY2tpau92enJwM8jCSEJ48edIHJWEPQx0eHMcVFxfzPE/JAzOGwHFcbW2t0WiUTwhH0hw9depUtTeLFi0COWGlOcpWryPHzrtKsiaMiYlJTEz0PB4cHAxywtCgFkN3NsfOAOxowVUUI6fX6wMCAiwWi9PpVKmoficZmhvN0f15UVxcfPz48cmTJ+fl5XmebWpqKioqAoBt27bd+9/E3tGRCw4OjouL6+npof/5mwxtcc3RHcKzZ89u375d3OLV09WrV7f3GdbfxBBK+Y4ZtMX1rVu3rFYrsLA5ld1up39zqtGCIZRFCBkqqkqlSk5OdrlcFosF5AFDKJdeR+xGotbwuhPeeecdAIiKivJ6Ni8vLzs7m/6Ra3l2eDD0ecFhCIewZcuWIc7m5ub2v25qapowYQJIHUO3C0NF1bMzC2JU+KRj/cyZMytWrHj11Vc3btwI8tjiuqura+zYsUAxhkLIUV/Un376yeuDSbq6umgJYVtb29WrVzdt2pSZmfnII4+A1Le4vnTpktlsnjZtGjCyxbXXqb/0MFD29bWzs5Pn+aCgoPT0dPFIc3Pzd999R3XHzOOPP/7KK684nc7c3FybzQaSRtsdI4EtrmNiYsLCwpqamu60m5HvOJ1Oq9V66tSp3bt3b9iwYfHixampqeHh4VlZWWKHiGjp0qXt3oxsDYOv5nls3br1t99+O3r06PLly3/88UcJz2ijv+3Uj+O48vJyo9GYlZUFdNPr9WVlZSaTKTs723f/Sm1trclk4nneZDIZjUae5202W29v76DL1Gq1TqeLi4vrP6JUKr22Jkb2lcRXIQwICDhw4MCDDz7466+/rl27dv/+/SBR2OvoCxzHlZWV8Tw/WiFsbW21WCzWPpWVlVVVVTzPe334THR0dHp6esr/TZkyJS0tTalUgs/4cMZjZGTk4cOHZ8+e/fnnn8+ePXv9+vUgRWzd2Wx9XphGVNSenp7a2tr+sInBs9lsnlvsRkZG9idNDF5aWlpISAj4l2+nHU+dOnX//v05OTkbNmzIyMiYN28eSA5zIZTYKEV9fX1/0sTgGY1Gz4X5arU6Nja2P2wpKSkZGRmTJk0CCvh87v+yZcsKCwt37NixYsWK0tLS2NhYkJbo6Ojw8PCrV682NzePGzcOKMZQCDlvsyBaWloGtietVuulS5c6OzsH/bcqlWpgY1JMXVJSUkAApfPD/LEA57333quoqDhx4kROTs6ZM2fUajVIi16v/+WXX3ienz17NlBs/PjxWq322rVrly9fnjhxIlAsrq8X5OLFi2+//bbYccLzvNft8ePi4jiO0+v1HMcZDAaO45KSkgIDA4Ed/gihUqn88ssvZ82ade7cuRdeeGHnzp0gLRzHMRFCsajnzp3jeZ6eEDqdTrvdPqiKq66uBgCXy/XGG2/0X6nRaFJTUwdWcRzH+XnMc8mSJREREUlJSV7PRkdH79q1a7h/009LUbVa7eHDh+fOnbtr166srKw1a9aAhLDV4SGGkNT3c4fD4Tkq4HQ6B12mVqtVKlVnZ+dTTz21aNEisYqjYSLk9D53OqvRaNatWzfcv+m/9eDTp0/fuXPn6tWrn3/++ZnTp8+g/mFGkvyu5c9pmSMbFZjSV8UlJiauXbt279698+fPz8/PB0nz66YMq1atKi0tbS4rMzz5JHz/PURHgyQwFEIfFdXrqIDXBcSeowKTJ0/2OsbN0ADsffL3zigffvCB8tFHwWKBlSvh5Emge2uWEWxxTW0X3CiGcOCogJi6mpoar6MCqampA6u4qVOnRkRE+LOoTCDxkNDLl2HWLKithY0boW9XHAmIjo5ubGy02+2U767b2dkZFhYWGBjY1dV1L7NAPEcFLl686LlWIDAwMD4+flAVl5ycrFAoRlzUysrKjIwMjuOYWK55P0hURBMnwqFD8PDD8OGHkJkJq1cD+xja4jouLs7hcNTU1KSkpAw81d3dbTabB1ZxFRUVbW1tnn8kMjJy4Kh3SkpKenr6mDFjfLE5ldVq7e3tZWvIYbgItQazs+Fvf4O1a2H9epg6FWbOBMaxtcW1w+EoLi4eVMUNPbGrv4ozGAyhoaF+KKdarU5ISLD1EZumUkXuK9mzz0JpKXzyCSxfLrwYPx5YRvNi8JaWloH9JWVlZQqF4plnnhl0WVBQUFxc3KAqblBt6Wccx9lsNp7nMYQ+8/e/w8WL8MMP8OSTcOIE+HKiuq9R0ovQ/xWuv4ozGo0dHR2DLlMoFBEREXPmzBHH38TpJvHx8ffzFc4XOI47ceIE8XdV0iEMDIR//UvopPnPf2DLFvjLX4BZ/l/aK44KDKziKisrGxoaPK8Um5T9VVx9ff3GjRuzs7OPHj0KdNNT3L4YRaRHCKKj4eBBeOQReP99yMqCFSuATampqSqVStziOigoyHcTu/qruOrqas+HfnqOCkybNi08PHzgNSaTaePGjUzc2Rwd7QspDlF4+ugj+NOfIDQUzp6FjAxgk06ns1gsFy9eTEtLu/8m5cAqrqqqynM76v5RgYHf4u5lVMDpdIaEhDidzo6ODsp3PLDZbCkpKeITC0G6SNeEouefh19/hU8/hWXL4Px50GiAQRzHWSwWnufvPYRtbW1ms3lgFVdeXt7e3n7XUYH7We4tbnFtNBrNZvPUqVOBYomJiWPGjKmvr+/o6PBPl6yMQwgAO3dCebnQTfrEE3D0KIudNBzHHTt27E5tp97eXofDQclyb3EEnOd5ykMY0Lc5VUVFhclkmjFjBkgUNSEcMwa+/hoeeACYfa8HznWkfLk3Q9+1OI6rqKjgeR5D6BcJCVBVBXQvTvfU1NTE87zRaPzhhx8A4Isvvti3b193d/egy1QqVf/CU/GFXq8nNb2GrbVXwMjnhSRCCOAlgU1N8O23UF8P3d2g1Qpza6ZPB0KTpLu7u+vq6ga2JysqKhobG/svCAwMFHdbGDQqIL6mpxeEoTtbL4O1FJSFcKC6Oti0Cf75TxjUEa/TwXvvCV04vtTb21tdXS1Wcf3bK3jto9NoNNz/ifvD1tfXR9O9SouhEHLsFJXxIQpPFgssXAh2O0RGQl6eMKCvVkN1tTDzu6QEFAphZH/z5lH75+rqrFbryaqqe9kEtr89KbYtBy73njZtWnl5eWlp6UzqZ8OGh4dfv369ublZq9UCxa5cuTJx4kSNRtPS0gISRWVN6HTCU08JCXzgAfj3v2HgpgabNgnV4CuvCD/Z2cJSjOFqbRUSbrXe/qmshAsX4Pr1G/Pnrysuvs9NYA0GQ3l5Oc/z9IfQP1tc37+oqKjIyMiWlhYJP+eLyhAeOSJUd6GhQn/poPddoYA//xl++01opr7+Ogz9UI7ubjCZgOdv/+Z5MBqFL5meJkwYHxOTn5/fX8Xp9foR7Aon5y2ufUev158/f95oNGII/ejAAeH3E0/AnToPN28WQlhcLNSWCQm3D9bXC52rA6s4oxE8RgWEZm1sLEyZAunpkJIi/GRkwKRJEwH2yqkXga0O0vPnz/M8/7vf/Q6kiMoQnjsn/F648I4XZGUJPaXXrglXJiQIixI//VSo9wYJDITUVOA4MBhArxde6PUw4LEeo46hmpChudF6dj7apBLC3l4QO/1TU4e6TKcTJrjZ7cJrtVpIYGSkUK0NrOLS04U5AH7EUAgZetC3gZGHz0kohP0zJ4eeqCVu+SpuvvD66/Duu3e53i8Y2uJavLNNJpPb7aZtGSG7H20jQ9/WYP3zdG/eHOoyca8h8WKtloYEsnXHREREREVFdXZ21tXVAd04jlMoFCaTyXPenzTQF0K1GsT1b0PfHOK4OX21DSshZKioISEhMTEx3d3dDocDpIi+EALc3vdJ7J7xqq4OxP8f9G3jzVCHByshBKaKKpUQ/uEPwu8vv/TS4Sn6xz+E33q90A1DGYZuF7ZGKYCRd1UqIVy9Wth8zW6Hl1/2cva//xUmzQDAiy+SmsktjduFoaLqJT1KQd1NLNBohK0QlUr461+Fido//3x7zL2hAT74QJiq1tkJv/+9sGkiffR6vUKhMJvN9PciMBRCjp0BlZFwU+vrr93jxrkBhJ+AAHdw8O3XCoX76afdN264aSWuErRYLG663bx5U6lUqlSqnp4eN90uXboEAMnJyW4porImFC1bJsy0/vhj+OMfhSkyycmwYIEwgbukBPbt8/MovCRrGHGLa6fTabPZgG4pKSmBgYE1NTU3hx64YlMA5YNZ8NxzcPiwELzKSmF17/vv079nPishZKiogYGBSUlJLpfLYrGA5NAdQjYx1IvASgiBqaIOF4ZQ1rcLQ6OaBunOIMUQyjqEDBVVz077YrgwhKMvOTk5KCjIbrd7bptNG4ZCyLFT1OHCEI4+cYtrJnoRBm5xDXTjMIRIkoPL4hbXbreb/mZebGxsaGjo5cuXW1tbQVowhHL/2GalqAqFQqfTSfJrIYbQJ3ButMyLOiwYQrnfLgz1OnLsvKvDgiGU++3CUFH17IxqDguG0CdiYmLCwsKampquXbsGdGOlDwmY+rwYFgyh3Jt54hbXra2tTV63RaZJWlpaQUFBfn4+SAuG0FcY+thmpZmn0Wh279793HPPgbRgCH2FuQ5Salukb731VkFBQWlpqdezR44cKSgo2Lv3/vdPJwZDKPfqhf6W86FDh/bs2WO1Wr2eLSkp2bNnz7fffgvMwhDKtHphtOUsSRhCf2xxDXST8CohJmAIfQW3uEb3CEPoQ6w08yS/xTXlMIQ+xEoIAeDBPvQvaJIk+p7KJCEMjVIcPnwY6FZYWPjmm296Hqd/jsFdYQjlWxPyPH/hwoWYmJg5c+Z4nu3o6Dh+/DgA5OTkAAWuXLnS3NzsedzpdALjsDkq3xB+8803ubm527dv93q2rq4utw8lvbsHDhy44c3LXp+VwBQMoQ/pdDqlUmm1Wnt7e0mXBdELQ+hDDG1xjQjCEMq6RYpogCH0LQwhuisMoT9CaDabSRcE0QuHKHxr5cqVjz32WEJCAtCqqqqqsLDQ83hLSwuJ4sgRhnD0ud1ucepJWFiYts+gC7q6um7duhUcHKxSkX//rVZrUVERUKyoqKitre2hhx7yenblypUzZsyg+WPursjfBNLT2NgYExMjViYajcbzggULFpSUlOzbt+/pp58G0ubMmbNt2zbP4w6HIy8vDyiwaNGiIc5O6QMswxDKnVarffjhhz2PM7ESUhqwYwYhwjCECBGGIUSIMAwhQoRhx4wPnT59OiQkxPN4e3s7ieIgSmEIfWj58uVAsenTpxcUFGRmZno9q9FoCgoKxGeS+b1o8qKgZLWYlDQ0NIjjhIWFhWq12vOCzz77rKGhgZJxQkQc1oQ+9Nprr3kdrD916lRDQwOJEiEaYccMQoRhCBEiDEOIEGEYQoQIwxAiRBj2jo4+lUolLm8LCPD+GRcdHZ2QkBAaGur3oiEa4TghQoRhcxQhwjCECBGGIUSIMAwhQoRhCBEiDEOIEGEYQoQIwxAiRBiGECHCMIQIEYYhRIgwDCFChGEIESIMQ4gQYRhChAjDECJEGIYQIcIwhAgRhiFEiDAMIUKEYQgRIgxDiBBhGEKECMMQIkQYhhAhwjCECBGGIUQIyPof0yeJp4uxZ+QAAAAASUVORK5CYII=", + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# Select the C-O bond pattern with different hydrogen handling\n", - "pattern = \"CO\" # Carbon-Oxygen bond\n", + "# Create propanol with multiple carbon atoms\n", + "propanol = molify.smiles2atoms(\"CCCO\")\n", + "propanol_mol = molify.ase2rdkit(propanol, suggestions=[\"CCCO\"])\n", "\n", - "# Default: exclude hydrogens\n", - "exclude_h = molify.select_atoms_grouped(ethanol_mol, pattern, hydrogens=\"exclude\")\n", - "print(f\"Exclude hydrogens: {exclude_h}\")\n", + "# Find all carbon atoms\n", + "carbon_matches = molify.match_substructure(propanol_mol, \"[#6]\")\n", + "print(f\"All carbon matches in propanol: {carbon_matches}\")\n", + "print(f\"Total carbon atoms found: {len(carbon_matches)}\")\n", "\n", - "# Include hydrogens attached to matched heavy atoms\n", - "include_h = molify.select_atoms_grouped(ethanol_mol, pattern, hydrogens=\"include\")\n", - "print(f\"Include hydrogens: {include_h}\")\n", + "# Find the C-C-O pattern\n", + "cco_pattern = molify.match_substructure(propanol_mol, \"CCO\")\n", + "print(f\"\\nC-C-O pattern matches: {cco_pattern}\")\n", "\n", - "# Return only the hydrogens attached to matched heavy atoms\n", - "isolated_h = molify.select_atoms_grouped(ethanol_mol, pattern, hydrogens=\"isolated\")\n", - "print(f\"Isolated hydrogens: {isolated_h}\")" + "# Visualize\n", + "Draw.MolToImage(propanol_mol, size=(300, 200))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Mapped SMILES Support and Atom Ordering\n", + "## Advanced Features: Hydrogen Handling and Atom Mapping\n", + "\n", + "The `match_substructure` function provides advanced capabilities beyond basic pattern matching:\n", "\n", - "A powerful feature is support for mapped SMILES patterns, where only atoms with map numbers (e.g., [C:1]) are returned from the selection. **New in this version**: atoms are now returned in the order of their map numbers, providing predictable and controllable atom ordering." + "- **Hydrogen handling**: Three modes (exclude, include, isolated) for precise control over hydrogen inclusion\n", + "- **Atom mapping**: Support for mapped SMILES patterns with guaranteed atom ordering \n", + "- **Fragment grouping**: Use `group_matches_by_fragment` helper to organize matches by disconnected molecular fragments\n", + "\n", + "These features are particularly useful in molecular dynamics simulations and quantum chemical calculations where explicit hydrogen control and fragment-aware operations are required." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Hydrogen Handling Modes\n", + "\n", + "The function provides three modes for controlling hydrogen atom inclusion in matches:\n", + "\n", + "- **`exclude`** (default): Returns only heavy atoms, excluding all hydrogens\n", + "- **`include`**: Returns heavy atoms followed by their bonded hydrogens\n", + "- **`isolated`**: Returns only the hydrogen atoms bonded to matched heavy atoms\n", + "\n", + "This capability is particularly useful in molecular dynamics simulations and quantum chemical calculations where explicit hydrogen control is required." ] }, { @@ -161,23 +223,36 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mapped carbon indices: [[0, 1]]\n", - "Unmapped pattern indices: [[0, 1, 2]]\n" + "Exclude hydrogens: ((1, 2),)\n", + "Include hydrogens: ((1, 6, 7, 2, 8),)\n", + "Isolated hydrogens: ((6, 7, 8),)\n" ] } ], "source": [ - "# Using mapped SMILES to select only specific atoms\n", - "# This pattern matches the carbon-carbon-oxygen chain,\n", - "# but only returns the mapped carbons\n", - "mapped_pattern = \"[C:1][C:2]O\"\n", - "mapped_indices = molify.select_atoms_grouped(ethanol_mol, mapped_pattern)\n", - "print(f\"Mapped carbon indices: {mapped_indices}\")\n", + "# Select the C-O bond pattern with different hydrogen handling\n", + "pattern = \"CO\" # Carbon-Oxygen bond\n", + "\n", + "# Default: exclude hydrogens\n", + "exclude_h = molify.match_substructure(ethanol_mol, pattern, hydrogens=\"exclude\")\n", + "print(f\"Exclude hydrogens: {exclude_h}\")\n", + "\n", + "# Include hydrogens attached to matched heavy atoms\n", + "include_h = molify.match_substructure(ethanol_mol, pattern, hydrogens=\"include\")\n", + "print(f\"Include hydrogens: {include_h}\")\n", + "\n", + "# Return only the hydrogens attached to matched heavy atoms\n", + "isolated_h = molify.match_substructure(ethanol_mol, pattern, hydrogens=\"isolated\")\n", + "print(f\"Isolated hydrogens: {isolated_h}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fragment-Aware Grouping\n", "\n", - "# Compare with unmapped pattern which returns all atoms in the match\n", - "unmapped_pattern = \"CCO\"\n", - "unmapped_indices = molify.select_atoms_grouped(ethanol_mol, unmapped_pattern)\n", - "print(f\"Unmapped pattern indices: {unmapped_indices}\")" + "When working with molecules containing multiple disconnected fragments, use `group_matches_by_fragment` to organize matches by fragment. This helper function takes the raw matches from `match_substructure` and groups them by which disconnected fragment they belong to." ] }, { @@ -189,79 +264,98 @@ "name": "stdout", "output_type": "stream", "text": [ - "Map order 1,2,3,4: [[4, 5, 6, 8]]\n", - "Map order 4,3,2,1: [[8, 6, 5, 4]]\n" + "All carbon matches: ((0,), (1,), (9,), (10,))\n", + "Carbon indices grouped by fragment: [[0, 1], [9, 10]]\n", + "Fragment 1 carbons: [0, 1]\n", + "Fragment 2 carbons: [9, 10]\n" ] } ], "source": [ - "# Demonstrate atom ordering with mapped patterns\n", - "# Create alanine dipeptide for more complex example\n", - "aladip = molify.smiles2atoms(\"CC(=O)NC(C)C(=O)NC\")\n", - "aladip_mol = molify.ase2rdkit(aladip)\n", + "# Combine two ethanol molecules into a single Mol object\n", + "multi_fragment_mol = CombineMols(ethanol_mol, ethanol_mol)\n", "\n", - "# Select atoms in map order 1, 2, 3, 4\n", - "indices_1234 = molify.select_atoms_grouped(\n", - " aladip_mol, \"CC(=O)N[C:1]([C:2])[C:3](=O)[N:4]C\"\n", - ")\n", - "print(f\"Map order 1,2,3,4: {indices_1234}\")\n", + "# Select carbon atoms - get all matches first\n", + "carbon_matches = molify.match_substructure(multi_fragment_mol, \"[#6]\")\n", + "print(f\"All carbon matches: {carbon_matches}\")\n", "\n", - "# Select the same atoms but in different map order 4, 3, 2, 1\n", - "indices_4321 = molify.select_atoms_grouped(\n", - " aladip_mol, \"CC(=O)N[C:4]([C:3])[C:2](=O)[N:1]C\"\n", - ")\n", - "print(f\"Map order 4,3,2,1: {indices_4321}\")" + "# Group by fragment\n", + "carbon_indices = molify.group_matches_by_fragment(multi_fragment_mol, carbon_matches)\n", + "print(f\"Carbon indices grouped by fragment: {carbon_indices}\")\n", + "print(f\"Fragment 1 carbons: {carbon_indices[0]}\")\n", + "print(f\"Fragment 2 carbons: {carbon_indices[1]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Visualization of Selected Atoms\n", + "### Mapped SMILES Patterns and Atom Ordering\n", "\n", - "The `visualize_selected_molecules` function allows you to visualize molecules with highlighted atom selections. It accepts a variable length of indices, which can be used to highlight specific atoms in the molecule." + "Mapped SMILES patterns provide precise control over which atoms are selected and their ordering in the output. When atom map numbers are specified (e.g., `[C:1]`, `[C:2]`) and `mapped_only=True` is used, only the mapped atoms are returned, ordered by their map numbers in ascending order.\n", + "\n", + "This feature enables deterministic atom ordering for applications requiring specific atom sequences, such as distance measurements, dihedral angle calculations, or constraint definitions in molecular simulations." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Aromatic carbons: [[1, 2, 3, 4, 5, 6]]\n", - "Methyl carbon: [[0]]\n" + "Mapped carbon indices: ((0, 1),)\n", + "All matched atoms: ((0, 1, 2),)\n", + "\n", + "Map order 1,2,3,4: ((4, 5, 6, 8),)\n", + "Map order 4,3,2,1: ((8, 6, 5, 4),)\n" ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "toluene_smiles = \"Cc1ccccc1\" # Toluene\n", - "toluene_mol = molify.ase2rdkit(molify.smiles2atoms(toluene_smiles))\n", + "# Using mapped SMILES to select only specific atoms\n", + "# This pattern matches the carbon-carbon-oxygen chain,\n", + "# but with mapped_only=True, only returns the mapped carbons\n", + "mapped_pattern = \"[C:1][C:2]O\"\n", + "mapped_indices = molify.match_substructure(\n", + " ethanol_mol, mapped_pattern, mapped_only=True\n", + ")\n", + "print(f\"Mapped carbon indices: {mapped_indices}\")\n", "\n", - "# Select different atom types\n", - "aromatic_carbons = molify.select_atoms_grouped(toluene_mol, \"c\", hydrogens=\"exclude\")\n", - "methyl_carbon = molify.select_atoms_grouped(toluene_mol, \"[C;!c]\", hydrogens=\"exclude\")\n", + "# Compare with mapped_only=False which returns all matched atoms\n", + "unmapped_indices = molify.match_substructure(\n", + " ethanol_mol, mapped_pattern, mapped_only=False\n", + ")\n", + "print(f\"All matched atoms: {unmapped_indices}\")\n", "\n", - "print(f\"Aromatic carbons: {aromatic_carbons}\")\n", - "print(f\"Methyl carbon: {methyl_carbon}\")\n", + "# Demonstrate atom ordering control with alanine dipeptide\n", + "aladip = molify.smiles2atoms(\"CC(=O)NC(C)C(=O)NC\")\n", + "aladip_mol = molify.ase2rdkit(aladip, suggestions=[\"CC(=O)NC(C)C(=O)NC\"])\n", + "\n", + "# Select atoms in map order 1, 2, 3, 4\n", + "indices_1234 = molify.match_substructure(\n", + " aladip_mol, \"CC(=O)N[C:1]([C:2])[C:3](=O)[N:4]C\", mapped_only=True\n", + ")\n", + "print(f\"\\nMap order 1,2,3,4: {indices_1234}\")\n", "\n", - "img = molify.visualize_selected_molecules(\n", - " toluene_mol, aromatic_carbons[0], methyl_carbon[0]\n", + "# Select the same atoms but in different map order 4, 3, 2, 1\n", + "indices_4321 = molify.match_substructure(\n", + " aladip_mol, \"CC(=O)N[C:4]([C:3])[C:2](=O)[N:1]C\", mapped_only=True\n", ")\n", - "img" + "print(f\"Map order 4,3,2,1: {indices_4321}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualization of Atom Selections\n", + "\n", + "The `visualize_selected_molecules` function provides visual feedback for atom selections by highlighting selected atoms in molecular structure depictions. Multiple selection sets can be simultaneously visualized with distinct color coding, facilitating comparison and validation of selection patterns.\n", + "\n", + "When using with `match_substructure`, you'll need to flatten the matches into a simple list of indices for visualization." ] }, { @@ -273,12 +367,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Multi-selection visualization with custom parameters created\n" + "Aromatic carbons: ((1,), (2,), (3,), (4,), (5,), (6,))\n", + "Methyl carbon: ((0,),)\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO2dd3xUVdrHf7dMn0kymUx6hVRCE5DQwQVpFgTEAuKKKK+KBdTdtay7+7oW1LXuClbgFVERFQEBMSAlkU4oIaSS3stMkukz997z/nEhRIEAIVPizveTP3Ln3rnnuTO/OeU55zwPRQiBHz89De1tA/z8PvELy49b8AvLj1vwC8uPW/ALy49b8AvLj1vwC8uPW/ALy49b8AvLj1vwC8uPW/ALy49b8AvLj1vwC8uPW/ALy49b8AvLj1vwC8uPW/ALy49b8AvLj1vwC8uPW/ALy49b8AvLj1vwC8uPW/ALy49b8AvLj1vwC8uPW2C9bcB5HLwjrzkvtyW30doIIFQZOkA3ID0kXcbIvG3a1WGwG443HC9uKzbajQpGERsQO0g/KCEogQLlbdM8B+UjW+xLW0vXF603uUxKVqlklQCsnNXKWTUSzZzkOX2C+njbwCuCJ/yeqj27KndRNKWRaGSMzEVcZofZKTiTgpJmJ8/WSDXettFD+ERTWGQsWnlqZf7efFOeKUgWJGWkUkYaJAsy5Zny9+avPLWyyFjkbRsvDwHZfGbzjrIdud/mytplKomKpVkFo9Ar9SVbSo6cPPJx7sdmp9nbZnoI7wur3dm+rnCdVqY99sOxYzuOdT51bMexYz8c08q06wrXtTvbvWXhFXKi8cTh+sNhirCN72xsqmrqfGrLii3mMnO7s/37ku99pIlwN94X1r7afS7BpZAoLnWBQqJwCa59tfs8adXVwgv8TxU/BcuCu+hI6RX6AkNBtbnak4Z5Cy8Li4AcrT8aLAu+6FlOIAIhAIJlwUfrjxL47m+91lJrdpo7fh7CxaolChTLsHkteZ41zTt4eVRodpodnEMr14qHNcU1P3/+MwCBkFab60xepTpIDUDKSA02g9lp9tnOb4uthVAEACcQAJnfHyw8WaGWs2L15XK6xMuUjLKyvdJrVnoQLwuLIxxFn287LK2W6qIau4u3ODhCiL3dKtUo2+2uALmEoimOcF40tWs4gSMCAVBjtAJor2s5Y3MwNK2Ws1KGFnhBvIyhGJfg8qahnsLLwlKySkIIIYSiKADxQxIHLbjJ5jwroIMf/WA1tJc3W/tHBRBCRDeEb6KSqGiKtrn4BpMDQPrMseH9E8RTWqU0d2+u+L9TcEbII7xmpQfxch9Lxsii1dEmp0k8NNu5DlV1YHVyFYaWaHW0L3tKI9WRhJCyZvOFgz6j1dnR5bJwlmRtsset8wLeHxWOiR5jcpnE70Mjl+DCURUh5a3NGRGjvWDcFRMoCwyTJ9abmy48JWMZmqIAODiHlJb20/XzuHVewPvCSg1OTQtOa7A0UAwlkzI6tbTjFEVTNE1Z+JZAOt5oDPGikZeFFwhju44C7YKNommxZReJ0ylpliYUabI13ZJwiy836D2IT0zp2DjbF/lflLaW6pV6EPZ4VavYdgjE1dpWp3AGD+9zj4yR3zMiLlglvezdvMLhckN2cbOJa8jK/SQgPljFasWqN0Ah6RcR0O5oN7lMk+Mnj48e721LPYT3aywAClbxx/Q/Tu873ew0GxyNckW7mW+28C01ecU/L1l3bMUulpLxAskqukhD4wtYHNzhciMAVwu354V1WX/d0GZrsHAtFqFZoTDVWeo0Ms3C/gv/e1QFr48KO2BpdnTk6IzwjDpLXYvNsCW3nncqmIGKo5IdZ04ePrH3x0HjppY2W8qaLQkhKm8b+1t+OdPicPEANn/0msvpiI0dNCrkQQvfEhdCj+obHqIMCZGHdG4c/xvwiRqrA5ZmYzQxg0MHzU4fpWHDlarAqfMfA7Dxw2VOhw3A3qImXvB+292ZRpPjdG0bgLJTR09m/ySVKaYvWCqlleGKuLsHj03TpekV+v82VcHXhNVBSpg6SqsAMGL6HdFJ6a1Ndbu/WQXAYHGerG71tnXnIYTsLmwkBIQIG1a8TAiZePcibWgkgJF9Q5RSX2kQPI+PCouiqAnJeooCRdEzH/krRVE7v/rQ2FgL4ECpwebivW3gWQobzDVGG4ADW7+uLs4L0keMn70AQLBKOjA60NvWeRMfFRaA0AB5v4gAAAnpQwaOmexy2LeuehuA3cXvP9PibesAgOOFX0qaAdit5h/X/BvAjP95RipTABiXrGfo/7rmrzO+KywAY5L0MgkDYMZDz0plipyfN5edOgogt7qtyeTwtnU4XG5st7kAbP/s3yZDc0L6kIFjpwDoo1f74AjDw/i0sJRS5vp4LQCxiSGEbFj+MiGCQMgeb7seTHbXkQoDgObaiuxNazuabIamxib5tC/XM/i0sAAMidVqlVIAYqe4uiTvSOb3AKoM1uIGkxcN21vUzPEEwIblL/Oca8S0OdFJ6QAGxwT5rBfXk/i6sDoqAHEYD+CHT9+0W80AsoqbOS+5HmpbbcWNZgBFOb/kH9ojV6qn3vs4AKWUyeij84pJvoavCwtA31B1fIgKwJA/3JLQf6jJ2Lzzqw8BtNlcORVGz9tDCHYXNhFCBJ7/fsWrAKbMf1QTHAJgVN8QGdsLPlIP0Ds+hXFJIQxNURQ185HnKYre/c2qppoKAIfKDBaHp1f/nappa2i3A8j6/rP6iuKQyLjRt84DoNfI0qMCPGaGYLM5ioqthw5bDx12FBULNpvHir4SeocHT6eWDYgKPF7VGp2YPmzSjMOZG3745I0Ff/+Pixeyipun9g/3mCVOThCdHeY2w09rlwOY+cjzrEQKYEKKnvaIh11wOCx79pqzsggvEMIDoCiGYmj12LGq8eNomU+sWusdNRaAkX11CgkD4OYHnpYr1bm/ZBYezQZQUG+qa/Pcj/VAaYvFyQHYtvpdm7k9eciotOHjASSHaaK1nlgPI5jNho8+bs7cwQcESCLCpZFR0sgoSUQ4HxDQnLnD8NHHgtknti72GmHJJcyIvjoAGm3IxLsWAfj+g1cFnieE7Cpo8szan1ar80RVG4Da0oKD29bTDHPbw88BYBnaMy4GwvOGtV+4Ghoe2b7thU2bOp96YdOmR7ZvczU0GNZ+QXjvz0z0GmEBGBgdGKKRAZhw+/36qLiGipL9W9cBaGi359W1ubt0QrC7oIkTBADfr3hZEPixM+aHxyUBGBanDVBI3G0AAHturrO0lA0Lu9QFbFiYs7TUnpvrAWO6pnf0sURoipqQrP/maDXDSm5+4E+r/vfRravekSaPNkOxM78hNSIgPkQ5IkE3OEbLMj3W12m1Og+WGnIqjRUGW0WLRSFhrAXZJScOKTWBN857BIBazg6L1/ZUcV1jzsqmA4O6voYODDJnZSsGD/aMSZc0w7vFXy0xwcq+oWoA/UZOiuo/wmZuO/DNR1KGVslYTkCLyfnloaq3MgvFUdu1c6TcsGxrwc78Bp4Qu5MLkLG807F37dsARt/1mFITCGBskl7CeOJjFOx2V20toz47WcQLvM3p7PjjhbPNH6NWuWprBXvPfALdpjfVWCLjk/VlTZacqtaEmx6pPX24PGtD8rgZgVF9G9psYZqgaK3EaHW9/3PJ4xOTxHaz2xwqM3x5qCpMI5VJmPo2u83Fg0Lprq9shvqAiASkTqxptV8fr00JU/fUo3WNYLWCpiEOPAV+zb59a/b9KuzA1PR+AEBRoGnBaqXlcs8YdlF6n7ACFRKZhG4y2yPj+/YdO6Nkz3fH1787fsl7AiEVBqtWKQFgtDre3lF0x/Ux3R7/G63ONfsrAhWSNjtHbK6aVhsAW2tTwfY1AK6744kAhbSgrm3BqHiPLeKjJBJ0DFI4xx8H9n35hiEdZ5/fldPgODcxTwgl8USfrwt6n7BcvFDRYg1WSnlC+t+6qPLIzoaCI7UnsyIHjjXZXUbL2Q+3otlGA8HqblZa+XXtda02cfECABnLADi5YTnnsEUPuSEsbTgArUqaX9/uMacorVbTSqXgcIieKoqipJ2aYIqiAAJAcDhopZJWe6gevRS9rI8FoMpg4wQiTvJIVQHpN90P4Pj691jw3Lmd7AAYGo3dXVpDQGrb7Aop0/GKkxOM5XkVh36iWcnAmQ8DYGgqNUKTU2m8aPwPd0BRlCojgzcYur6MNxhUGRleXwzd+2qsFotDINBrZA3tdrODS5wwq2TPN6aG6u/+PIORnu9ViNv2uzdzRwC7i/9NM+owGUFIyqS71fpoAFFBCqWEbbVwJjsX6BFfAwDlyBGWfft5yyVdoLzFTMvkypEjPGNPF/Q+YQnk7F5puYS1uXjQrFyjtbU229sv8lO29GjRFEWrQyLFpaFi40gBntzcwajVQfPnGT5duWBgmpr51XzDnLQ4M68QTObghfcz3m4H0RuFpZGzFGCyc81mB0Aa8g83lZxk5cppz31KK88vM7e7+CClNDW8O2GPBEL2nWlRyZjOUdRqT+w5tv7fuZs+ih42USJXVRqsgUoJKGjkHv0M5X366B9+aPyK1/maUt5kf/1YIYA/X5cyWCZnohKCH35IEh3tSXsuRe8TVlywkqJQ3mwGCBH44+vfBZB+0/0Bcf2oThHPeJurT3SQLrCbQ+5ol9pk5+SSs90sKUurdHdV5expPnOyYPvnA2b8j4PjSxpNQ+O0nnFidUYSHR16782OA5n2ypa3Py4A8LdbR8pjdbIRN1K+oSr0RmGpZGyMVnmqulWjkBTv+qattlStj0q6YQ4hRClj5SwDwOHiFRJmVB+dpLurowLkku159cFKGUWBgLTZOFDUdXcu2fHqA4WZXySMnK7Sx1QZbYtvSOrRh7tSKIaRxwbLY89GQgwakwQADNPVezxL7xOWkxMoCjIp09baenrragCD71hCsxIAcTpV/p6NP32+XCBEI2f3XltdYnFwDk5gaOrxd76SMMqGdrs2NjUuY0r5gW0nNqwYcO//RmkVdW22//JtXpei9wnrYJnBxQvDYrUrX3/TaWkLTRkWOWA0AJ1KppaxTS0GY0M1gB6clG63OGKiQlosTo4XBs5aXH18b82x3f0nnkxLuzG/zjQoOii8uw3u75heJqxWq/N4ZSuA9vqy8n2baIZJm/WYycbRNBUZSNe32+6c98dlTy7U9dB2BkJISaPlZJukod0uZ+l6i1OQalInzzu16aMT69+9ceJEQqjdhY13Xh/jdb+Rr9HLhLWnqGPhyqsCz4+bee8tEzJsTr5fZEBGgk6nlnZ0t3uKvn0xBWizuQwWx6YTtTanwCQ99vqR7fUVJQe2fj3qlrvr2uwF9aa0CM8tSu4V9CbPe6XBWtpkAXAya3tRzi9KTeCN8xbTFBUWKL9lUGSUVtHjquogUCFJCFHPvC5axtKsRHrzwqcAbF39tqW9FUB2SbOrk9PfD3qRsDo2qfKc64dP3wQw/b6lqoAgAGMSQzwz5o8NVvbRqwEMHDslechoq6ktc+37AMx27nDZZWZa/tvoNcI6UdXWbHIA2LX+0+bairC4xBHT7wAQESjvnhe0e4xPDmFpGsBtDz9LM0z2prV15cUAjlYYO2as/aC3CMvu4g+WtQAwGZt/XvcxgNseepZmGIqiJqSEerLjHKSUDo4NAhAelzRi2hyB5zd+8AoATiBZxc0eM8P36R3C2n+mxebkAWz+5A271TxwzOSUoWMApEVoPD/Uz0gIVstYANMXPKkKCCrK2Xf64C4ARQ2maqNvbe7zIr1AWC0W58nqNgDVxXlHd2xiWMlNC58GIGHoMYleCL8hZemRfXUAlJrAG+c+AmDDilc4lxPA7sJGj62i8XF6gbD2FDYKhBBCNix/iRDhhjkL9VFxAIYnBKtk3nGXpEcGijXlmBn3hMcntdRWZm/8HECTyZFX6+vp7zyDrwurpNFc0WIFcHTnprK8HI025A93PgggUCEZEuehvTEXQlEYn6ynKIpmmNseeg7A9jX/MRmaAewraXFwfteDbwuLF0h2cTMAp8O2bfU7OLcNGsC4ZD3r1ZB5kUGK5DA1gOQho/plTHDYLNs+exeA1ckdKPWJgIPexaeFlVNpNFqdAHZ8+aGxsTY6KX3YpBkAYoKViaHeX8s27tzGr9sefo6VSA9u+6aq6BSAE1WtBovT29Z5Gd8VlsXBHSozADA21u79djVFUTMffp6iaJqiJqTovW0d0Gmrakhk3JgZ9xAibFj+EiGEF8hebwcc9Dq+K6zskmYnJ+BckPehE29N6D8UwICowJDu7r3pcTo214shsspPHzuxdxuAsmZLWXPProvuZfiosBpNjvy6dgBlp47mZv8klSmm3bcEgFzCjEz0oZB57DmXh0yhmnbvEwA2ffiamOtgd2Gjr+U68CRXJyw7Z2+xtZidZvelZ+YFYrQ4t5ys4wUiCPy3/3mREDLp7v8Ro/KP6HM2mJHvkBKuEXMdZEy7PSa5f2tz/e71KwE0mxzZxU1mO+fGNFhE+O0/PV8E4U0mrrnlagO7XZEfiCd8bnNudnV2g7WBpmgCImfkw8OHj4gcoZb0WCe62mjdXdCUW9NmtDpFF3Zrztba0oIgfcS42fcB0Kllvrlcc0Ky/otDlQB928PP/+fJuTu++pBJncArQ/YUNSeFqQPk7Ki+IaMTQ9Q9uO3C0ojaHJgazh4WbYcmDMHxPXZ/QDCbLfv2Ww4dIlYraJoIgiQ8XD12rHzgAOoK1kBfvsYyu8yrc1evL1xvdVnDleFhyrBwZbiSVWbVZL179N2y1rJrfwZC8FNew9uZxafr2kM0UpuL18hZmWA7+t0HAEbcvUQiFaPyh/hmVP7QAHl6ZCCAqJTBMUP/wDkdJ75bESBjVTKGF4hCwuzIb3z9x4IzTT0REo0QFGzF8XUwNUF6Lpq8VAVTE46vQ8FW9EQFaS8tbXzzLdPuPZRczkZEsGFhbHg4b7YYvvqq5ZOVVxLb7TLCcvLOz05/Vt5avuEvG9oq2jqme6WM9If//aHyWOXqvNU1ppprfIzM0w1bc+siAmR6jay+zSH22U9vWek0t4b0HSjEZ5Q2mfvo1fE6343KPzoxhGXonEpj4i0PMVJ59dEdTWdOAGhot3MCiQySSxj6o72lVQbrtZZUuA15G6HSQaYCde7ro2jIVFDpkLcRhduusQRndbXh05W/VFc/8uO2jsCTFEUVmtrmb95krSg3rFpNnJfxp1ymcs6qzqo11YbKQ/P35U++bzIAq5NvNjsA5B8oiByaIusb/tbB1TPiHqDRza5Ps9nx7dEarUpS02YHObsv3lRfUbL7W4qir7tzSYBcUtpsSQz1XVUBUEoZGmi3cSFhUSk3zj29ZeXxdW9Pem4lRdFNBqNKblEDvIOs3d7w9HAJ2+1q19yI419CpQN3segBnAMSCoc+htMMdWj3SiCC0Pp/mxiXs9FQs7cwH8ZyAFDpIVUZLNZd+fnMg4ucNTXmPXs1N07q4j5dCcvBO7Jrs0OVoegUmNjm4mtbbQAEAqPVqTWzZq7hJ+dxnSShe0+SW93WanU5z0U3lLEMJ+D4N+8JPNd37G3a2FQA4QHyYxWtYnPjm9hdfJXRqtNIXZyQNnV++f4txqqi8v3b+oy6KdxVBYcVQCBQY5cVnWrqF9DdRRC1ObAawTsBgJX9Sl6sDDYjbIDDgtz1iBxyqXt0jaPKyFeVsDo1bAYIPNqqAUCqPt/sAmxoqDkrSz12DHXpSEldNYVVpiqOcCx9mVqNoaUtrtKrM/8cAiH17XaF9PxP2MHxjXn7607tl8hV6bcsBCBh6NQITW5Nm7ja3TepNFg5QvqEqAEwEtmA2x4CkPv9imCuQS6cb/6kFH+yvbvrfIgAUwOkirOHnAPsOX9eZ5FJFTA1dHucaK9spi437qYkEsJxzqrqLq7pSjTtjnbSyROz8d8bVYEqFy9YHDwAl9UBIOezn/I2Zl+F4VdMv5sWyAN0AGKClQxI2Yn9pumpYvoTH6S6oaWm4MTwjBFBCmmrzRl3/eTCzC/ba0tXPDrzwovv7unSqXs3XPBa1rXccPGw1HR9kNnJzd2wFwCkOWCkBksnl69A+LautthdxQA4ZXhKeEK42cHVt9sBNJwu75bNVw3hhXefuKOqOO+BP6RNvmGcZwq9Wlb++19ffbq8/b4l0TfME1+hALjN2+cZpAw9KzUOADQRkGmKGupzKsqv8L1dCStAFkB1Gt6nZqQmX5/cYnEqG0wAjqzcBmDIvZPT7skIkfRNVk7shukCITvzG9UypvPy4qaCI7veefz0llVxGVPkAbrqNnvy0LFVRaeeeXrppMOHadrnZgtKSkrWf/YJBSqyX0ar1Qmg4tBPxqoieUDw/S+vTJSdX+zQ5GAHBlrviu5WphYioGg7pJ0Gg6xMrKvIZzPPN4VEgNOC5CnnL7saWn8ptle0MAGKb/IrpAx9e1ocAOhToQrJLi5+56efzl5HU0xgV13ersqO0cSwFMsJl8kpwgtOnaTPVVl/vniKCg+Q25znf9kyltGnDovoP9Jlt5za/AkAFy9Ejr9bFxZ5LCdnzZo13SvIrTzxxBNOp2PQpFm2oHgAvMuRu/EDAANnPtwiCbXT5xMLOAkzMKC7YWcpGpowOM91/Dv3qzr3t5w2aMK6pyoA8tgQcrkEtsTlolhWGtNVAJKuaiwZIxsTOWZX1a5Q6fmxq0LCRAYpANAUtEppkJrT02GT4wZ3292QEKIS3Q0MTXW4G667c2lDwZGy7M19x84IjE5pduJPz//9mcf/5y9/+cvMmTMDAnxod+iOHTu2bt2q0WjuWPTk3ipngJLN//Ezq6FBG5sSN2IaAeolMfFyC4A2BwlR08n9o9Btd4Ou71l3g8sO26+rPc4BhRYSOSwtGDCn2+4GWYxAFzkEpwsKE2gGgdEAIFF0voZrbNRMnNjFkBCX7WONjR5b2FpY11aXNipNFaQCoJQyscFKAGkjUiNjNFoVFg28L0pzyZD2V4JSym7NrYsKlDMMTdNUtdGq1kcnjp9dtPOrnHXvDF38XlKoJiVt+pgxY7Kzs5ctW/bKK69cS3E9CMdxS5YsAfDcX19QBesDWpqaG2oKM78ERQ2+YwlF0RSoUF0wpHqznbMx3MIbEtnga8uMIlUjb+P5+qkzrAxgMPxBpE7v9u0pQPtQcvOKD0KDuXEpadDGd5wKVilvSEvjm5qUUVHq8Zfp7FKXnSI1u8zr8teVtpcGSgNVEpXYGXLyTqPDKKWlc1PnJgR104PVASHIPN2wPa9extJaleRkdZuTE5w287a/3+VoN0x57LXJN99GUUikG2+bPJ5l2VOnTiUleSd+0G94++23n3zyycTExHe+3lnUbHdywvIXHq08ujPm+skj7/8HKIQFyCMD5S0Wl0JC/3F0fF/9NU+tEoLCbTj4EWytkCqohT8CIJ9OhdMGRRAyFiFlGq55P5y9tLR1zeeCw8kEa0XnOyFEMFv4tlZZn77B8+6+bPBc5h//+EfXV0gZ6aDQQSHKkDpLXYO1wcpZzS4zARkVOer2lNvDVNdUV4lQFPqGqtMjAywOvrzZygmk2ezkKTY4MKDqRHZLWd6om+9kWAmUWo3LmJOTU11dfeedd157udeIwWCYM2eOzWZ774NPqkgwgMr8YztW/4uVykY//JqdlnM80WlkDE2NT9bfPTy2Z3aqURRCkkARtFXCZvzfLZUA/jEtAppQDJyD/rOuXVUAWK1WOWwoxTDOigrBaBSsVsFkYnW6wOnTA6ZNvZII8pevsTpj5+wWl0XGyFRSFdX9nkJX8AJpt7k2nqhtMTsokLcfvb26OG/afU+IG60G6DD7huvb29u3b98+efJkdxhw5Tz00EMffvjhpEmTHnx1ZY3RRoggWjv1j09MnvcIxwsZfXRDYrWqX495e4aSnag6BCJQE/8KgOx8CRSNmOFI7M7YvCsI4c1m4nDSKiWtUFz++nNc3dhBzsp1Cp1aqnaTqgAwNKVVSacPiGBoqiOD984vPzI21gIobmee+tOfASxdupTjPJ0CszN5eXmffvopy7JP/PWlGqMNwIFt66uL84L0ERNuXwAgNEAuLpVx40btzpPQ7iqCYjQaNkR3VaqCz64gDdXI+kUGAkhIHzJwzGSnw7Z11dsA7C5+xIz7kpKSTp8+/dFHH3nRQlHZjyxe3MCEArBbzT9+9h6AWxf9RSoTF/nofXORj2fwUWEBGN1XJ5MwAGY89KxUpsj5eXPZqaMA8husz/39nwBeeOGFlhbvbLT65ptvMjMzg4ODp9+7WIwFIu4rTEgfMmjcVAB99OqEEJ9ejuFufFdYKhl7fbwWQJA+YvzsBYSQDctfJkQQCFGnjp48ebLBYHjxxRc9b5jD4Xj22WcB/O0f/yxupQA011b8smktRdG3Pfw8RVEMTXkmL6Yv47vCAjAkVivOOk+8e5E2NLK6JO9I5vcAqgzWpS+8zLLs8uXLcz2e9PGNN94oKSlJT0/vM/YWMd7ahuUvcy7niGlzYpL7AxgcExTcQ7Eqey8+LSyGpsYmhwCQyhTTFywF8MOnb9qtZgC10D3w4CKO45YuXepJk2pqal577TUAf/3nsjPNdgBFOfvyD+2RK9VT730cgFLKZPTxoX1E3sKnhQWgr14t5mMa8odbEvoPNRmbd371EYA2m2v2g0/qdLqdO3du3rzZY/Y8++yzZrN59uzZQuRAQojA89+veAXn9hUCGNU3pHsJfH5n9IKPQBxedeyE3v3NyqaaCgAFRvKXZ58HsHTpUoejm4m+rooDBw58/vnnMpns/qXPi0lcszauqa8oDomMG33rPAB6jcxjWeZ8nF4gLJ1KOiAqEIAYu4HnXD988gYAFy/0mzSnf//+Z86cee+999xtBiFkyZIlhJClTz5VwwcCsJraMtcux7nYDQAmpOi7nXrzd0YvEBaAkX11YvZAMdpM7i+ZhUezARQ32f728msA/vnPf9bV1bnVhs8+++zgwYPh4eHjbl9odnAAtqx8y2pqE6PNAEgO00Rrr22C+XdE7xCWXMJkJAQD0GhDJt61CMD3H7wq8DwhhA/vf8stt5hMphdeeMF9BhsKZmMAABocSURBVJjN5ueeew7AP156pcQoAKivKD7443qaYW57+DkALEP7XQyd6R3CAjAoJkhMHj7h9vv1UXENFSX7t64DUNdmX/zsP2Uy2apVqw4fPuym0l999dXa2tqhQ4eGDZ7UOYPBmBn3hMcloVN0ED8ivUZYNEVNSNYD6IhBum31O2L8/gqn5pHFjwqCIPaBerzosrKyt956i6KoF159s8xgA3CiI4PB3EfQKZ6Rnw56jbAAxAQr+4aqAYhRk62mtp8+f18gpNFkHzrzwdCw8H379q1bt67Hy3366aftdvvMO+4uo8IdnMA5HZs/fh3A9AWezmDQi+hlH8f4ZP3Z+P0PPUszzC+b127edXBfScuXOU0DZiwCsPiJJ8sbeixJBCFk1fot3333nUSulI6Yl5nXuKeo8bOP/mOorw6PSxwx7Q4AkUEKT2Yw6C30MmEFKiSDYwMBaMLj40ffKvB8/oZ/axSsSsYkjrk5KjFdoJh/frHnWEW3tsH8Go4XvjpctfanAxKp/A93LqLVOrWcldhbC7avATBozhOg6I4ot9de3O+MXpb9C0BGgu5EVduRSmPS9Aerj/7cWHik9mR25MAxRit3+1/eioqI4Cn28wMVCimbGnFNFcmGYzVHygzT5twzavzEFkHRbBMAnNywgnPYoq+bQEUNyq9vnzMsxp+s8KL0PmFJWZoQOJx8YFBQ+k0Ljn39zvH174b3y6BZSTurdRpdgMvh4pdty79tcFS3U/fWt9m359XrVLIzjRYCTZuDA9BSlldxaDvNSgbOekQlZ2tb7RGBV7f87b+H3icsi4OrMlrDA+UWJ584YXZp9qa22tLin79OnXKPzclbHGeXlbbbXPtKWyK6W50crTA4ON5gPTtTJGVpnifHv34HhKTcOE+tjwYQG6w4UNrslVhwhOcdlQZ75dnlaK3ZxfJYnSyS950mufcJq8JgJQTxIeq82naKZgbfsWTPO4/nbVkVmTqEVp7/jl0uvtRpkHarWy0QUl3ZopIxlnMrsC1A7fHdLWV58gBd6pR5AGQs0zdUU9JocfGCh4eErupqw2c/8DWltJRdOiwVgL3KYD3TyBQ5gh/uJ/GNRPa9T1gmO0cAjZwNUcuMVkdkv+v1iQONVcXbXlno7qIpih5w64NiBoPYYCVLUyAw2TlPrr6yl5YaPl2ZXVymZuzX60KeHTdIfD2nttlcXDZmxQfBC++X9+nmxvQepPcJi6bOhtqwuzheIETg7SYj57DLA4IZ6fmGjxBCUVT3VrAQwO7ifzOd7DAZOYfN3FwrxkJ2cLx4pScXtvNmc+uatbRGvepkfricuj7y/CTS+vyKejsZN2R065q1+qeWMpfb9+duep+wdCoZTaHJ5BBngkt2f2tqqFLro27551d8p23+FgcXFaRI7VaqZgLyc0GTQkJ3aIuiKGNFQearCwt3fJkw+ma1PrraaNOqJBKG0vRgyNrLYd1/QHDYJcGX9PIzKrWrvc66/0DX4fY8QC/zYwGICVawNFXebAHgtLTnbVkFYPCcJ3gwbKe+Di8gVNPNPAMUqMhAuZghUUTK0EGxKbHDJwuc6+R3ywEIhJyuNQ2J03psnQwhxHLwIBMc3PVlTHCw5eBBN8YAvzJ6X40lYeg4nfJYpTFQzuZu+shpaQtLHRY5cAwAjVyiVUoAGK2OxFD17dfHdPtbHxqvXbO/IlAhkTA0IUQMDz5o9uLaE1nVx3Y35B8KSbne4nCmhXtuWZ9gNgtWq+Rc8KAzRtNXeedDVp8xmlQKNQBaJnMZDILZzGi8OR/Q+4TVanU6XIJeLS8vKSjN2igODAHQFBWvU8pY2mh1harlj09MCulujSUiZ5kvD1WFqFiZhCEE5S0WcUiYu/GjY1+/m/H0yoExwbk1rf0iNZ7xvBOX6/z2eVZWbmrZWnk+pl65yZGuObfWnqKIy8sJqnufsPYUNQmEDIoJ3PXOciLwCRPmqMMTAIQFyB0uvsnkCAuQ/XFU/DWqCsDwhGCawjdHqgXiDFBKFBLG5uT73HD3mV+2tNeVoWBH1IB769rsBfWmtG715K4WWqmEIIAQUBRoZmL6gNfvuKPj7J+//rq+rRUACIEg0EovLznsZX2sKoO1tMkCIG9fZk3eQYU6cMTsB528YHVyLEPpNNK7h8c8eWNKWEDPTLMMiw9+ZnrqxLQwhqLkUrbdwdES6di5jwP45av/iIt2skuaxU1g7oaWyyWRkbz5MrmfeLNFEhl5JXE73EpvqrEEQnYXNQHgOdeWT/8F4KYFS69PiQMwOT3MTcG6g5TSKf3Dp/QPJwQbj9eWNZuRdFtZ9qainF8yv1h+20PPme3ckXKjmCXa3ajGjmn98itG05UrQWhrDZw+1QPGdE1vqrFOVLU2mxwAdq3/tKmmIiwuccT0OwBEBMr7ub8xoihMSAk5u2jn4Wdphsne+HldeTGAI+UGcaO9u1EMGCDt04draLjUBVxDg7RPH/mAAR4wpmsuHx/LR7C7+C25dRxPTMbmNS8v5VzOe555Qx8VT1HUTQMjNHJPLAuWSxgHx9e12dVBunZDY2VhbnNN+bBJtwkEFgefHOb2URhF0/LUFGdxyY360ElDhrDs+QZnXN++UyMilVGRwffO93o7iF5UY+0/0yI6ljZ/8obdahYXkQJIi9B4conBiD46tYwFMH3Bk0pNYFHOvtMHdwMoajBVG685T84VQKvVwYseDLlxEtPe7qqrd9bWOGtrXHX1THu7/sZJwYsevGysPc9wdYHXvEWLxbn2QAUvkOrivLcfvZ1mmD9/vEUfFSdh6AWj41Uyj/YUT9W0ZZ5uALDnu9UbP3g1JDLuzx//wEqkeo1sbkasx/ylgs3mqqrmW1sBMEFBkpjoqw1h5VZ6R421t6iJFwghZMOKlwkRxI06AIYnBHtYVQDSIwPFxX1jZ8wPj0tqrq3I3vg5gCaTI6+23WNm0AqFLDlJOfx65fDrZclJPqUq9AphnWkyixM4R3duKjt1tGNrYaBCMiTOC3tjOpYjd2wqFINjAdhX0uLgfDfhjyfxdWHxAskqagbgdNi2rX4H5zZDAxiXrGe9FDIvMkiRHKYGIG6Ddtgs2z57F4DVyR0o9U4sOF/D14WVU2k0Wp0Adnz5obGxVgzfACAmWJkY6s1e6rgkvbi+TwzccHDbN1VFpwCcqGo1WC6TJPK/AZ8WlsXBHSozADA21u79dnVHwBmaoiak6L1rW8cmVTHUDCHC9yteJoTwAtlb1ORd23wBnxbWL2daxDS+Gz9c5nTYhk68NaH/UAADogJD1Nc6FXjtdGyrF4NjleXlnNj7I4CyZktZ82UmXn73+K6wGk2O07VtAMpOHc3N/kkqU0y7bwkAuYQZmegTIfNYhh6dqAPQEc5v00evOR02ALsLG3mhF/hx3IePCosQsruwkRAIAv/tf14khIhhSAGM6KNTXC4FqMdIDQ+I0ioAjJg2JzopvbWpbvc3qwC0Wl0nqlq9bZ038VFhFdSbzkbl3/p1bWmBGDgZgE4t88p2qy6YkKynKJzPdfDVh2Kug/2lLRanN1MceBffEhYncFWmquONJ77N22fi6i2m1h//7z2cC/UOYFxyiK9F5Q8NODsFnpA+ZODYKS6HfevKt5yCtcFW8dXx7PyW/CZbU6+Y3uhZfGXZDCdwB+sP7qrY5RScjSZ7o8lBgTLkN/CCq+/A6weNnQKgj14dr/PFqPxjkvQlTRaHi7/lwT+fPrCrsurkvuaPWYkkz0oKrGq5hA5XhU+Ln9YnyPu7sjyGT8wV2jjbF6e/KG0r1Sv1IOzxqlaBEAACcbW21SmcwcP73CNj5PNHxvlssvEj5cas4iYT15CV+0lAfLCK1YpZoTVySXpkQLuj3eQyTY6fPD56vLct9RDebwoFInxb9G1Fe8WWf2z5/l/fV7RYhXNaP/LpT7kf/SIE2wstOwZGB/isqgBcFxskl9lzzRu1cWEb7n6vIa9CfN1kdxkszldueqV6b/X2su3H6o95106P4X1hFRgK8g35YaowwhOHk2/p5LYmAhEEomJ0bUKZNsinvY4MTfGKYwSCBAoiCJ3bgfIWq8AJFKH0Cv3mss1WzhOra7yO94WVXZ2tkZzd6GKyu4ALmmaKig8KOVi/zwvGXTFtjrYGR0m4+iLzAU6OF+tgGStzCs7TLac9bp0X8LKwHLyj2lytkZ5de6mWswrpb8cTKhkbF6yrNlc7eE9kCegeteZaiqISdOoLt4JpldKORVoqVlVkLPK4dV7Ay6NCK2elKKrjyzj0/b4jmw8CZ1sSwgtRw1LidSqaoiiKsnJWGeP9mZyLYnFZBCIopIy4QWjni5+JgWooChQoznXWoSWlpUZ7D0Qb9H28LCyWYkmnqY+MmzNmPD4DACeQulbb9hU/ELtDDI5ABMJSvuIcuRCWZimaAhAVpAAw4ek7B2Uk6wNk4i/mpdkviZfxhJfQ/xVRu738Vamlahkrc/JOKSMFIJFJAnRn99sE6wOPBatMTRwAJ++UsTK11CdWc18UnUJHEQqAuEQsvU9IYsJF+ltW3jowYKCnjfMGXu5jUaCGhg81OC4e55ilKbF3YnAYhoYPdV8i6msnUhWplqptLpt4eNGV7wSE47l0XbpnTfMO3h8VjoocJaElHV/JhdhcNgktGRU5ypNWXS0MzUyOm2xwGMiFo9pzNNmaUoNTo9U+EXHP3Xh/X6GMkUWoIg7WHVQpVfFp8SFR54OJSWQSbZxWGiGdlzYvUh3pRSOvhDBVmMlpKjIU6YJ0SUOSFOrzuxukCqk2RRseGj4vbZ6M9dHxR8/iE1M6AEpbS9cXrTe5TEpWqWSVAKyc1cpZNRLNnOQ5vWWWjSf8nqo9uyp3UTSlkWhkjMxFXGaH2Sk4k4KSZifP7nCs/O7xFWEBcPCOvOa83JbcRmsjgFBl6ADdgPSQdJ91MVwKg91wvOF4cVux0W5UMIrYgNhB+kEJQQm+3EfscXxIWH5+T3i/8+7nd4lfWH7cgl9YftyCX1h+3IJfWH7cgl9YftyCX1h+3IJfWH7cgl9YftyCX1h+3IJfWH7cgl9YftyCX1h+3IJfWH7cgl9YftyCX1h+3IKHhGWxWPLz8x0O393KfIVUVVU1XDpHUmccDkdpaanV2v1IDfX19TU1NRc9VVhY2NR0FcEsqqqqGhsbu21JN7jqFaQNDQ27du266KmZM2fKZBdfRrx169abbrrp+PHjgwYNumobPcvPP//MMMz48RePN9SvX78BAwasW7fusvc5fPjw8OHDN2/efPPNN//mVGFh4bFjx+644w6a7uqHPW3aNKPReODAgQtPqVSqpUuXvvTSSzk5OVVVVTNmzOjamNTU1Ouuu+7LL7+8rNk9xVVvWC0sLHzooYfE/81mMwD1uaxAEydO1Ou9HCX72nnxxRdlMlmHsFatWiUIwsKFC3uwiC1btjz11FNd/A6vnNWrV69fv/6ywuqaY8eOrVq16r333rtGYzpz1cIaN25ca2trx/8ul2v//v09aJDX2bZtW+fAHj/++GOP/1oee+yxRYsWXbuqAPzrX/9atmzZNd7k2LFj27Ztu3ZjOtPzW+wdDkdWVlZdXV1oaOi4ceMUFyQPysrKCgkJSUtLEw+rq6sLCgrGjRsnlZ6Nq3bkyJGCggKNRjNu3DitVgsgLy+Poqh+/fodPny4uLg4NjZ29OjRnb/+kpKSI0eOUBQ1atSomJiYixpWXFxcXV19ww03iIfl5eUlJSUd5RoMhpycnGHDhlVVVVEU1b9//7q6ury8vIKCArvdvmPHDgDjxo0T38tx3N69exsaGgYMGNC/f/+uP5Cmpqa9e/fSND1u3DidTgegsbGxtLR0zJgxHY9QVVV16NAhm80WHx8PID4+Pjr67L5WQsi+ffsqKioSExOHDx/+m5tXV1c3NTVlZGR0fsycnBxBEJKSkkwm04ABA0JCzm7VdLlcWVlZnc12Op179+7dt2+f1WoVnzE9PT0iIgLA8ePHCwoKAgMDR4wYIX4LVwe5BsaOHTtixIjOr5w4cSIuLk4qlaampsrl8sjIyEOHDhFCtmzZItpKCImIiFi0aFHHW95//30A9fX1hBCz2Tx16lSappOTk4OCggIDA/ft20cImT9//rhx46ZOnarT6dLS0iiKmjNnjvh2QRAef/xxiqLi4uIiIiIkEsnq1asvau3//d//AThz5ox4eO+99wLIzMwUD9966y2GYVpaWsaPHz958mRCyLp167RaLUVRMplMq9VqtdqGhoa0tLQRI0b069cvNjY2Li6Ooqhly5ZdtLhDhw4BuOuuuwIDA/v16xcQEKDT6U6dOkUIefPNNwHY7XZCCM/zS5YsYRgmODg4JSVFrMbef/99QsjUqVNTUlJGjx4dHh6enJwM4JFHHhFvrlQqn3/+eULIY489Fh4eLr5otVrvvvtuAOHh4X379hXTZG7ZsoUQkpKSMnLkyLS0tA6zX3/9dUJIU1OTVquVSqU0TYvP+OWXXwqCMH/+fABRUVFyuTw8PJzn+avRBSGE9KSweJ5PSUlJTU2trq4mhDQ2Ng4ePDg2NtbhcFyhsJ588kmpVLpnzx5CSHt7+4ABA0aNGkUIEZ/zjTfecLlchJC3334bQE5ODiFkzZo1AFasWEEI4Thu9uzZISEhFovlQmvr6+spivrggw/Ew6ioKJqm//SnP4mH06dPHzlyJCGkQ1giISEhixcv7jhMS0tTKpWbNm0ihAiCcM8998jlcqfTeWFxorAyMjIqKyvJua/wvvvuI78Wlvj/m2++Kb6rrq6us7AYhvnkk0/E7/W5556jKEq820WF9fjjjzMMs379evFQ7KJ0CEulUm3evFk0e+7cuQqFQvwwCSHz5s1LTEzssPzo0aOdP9K8vLyLfPeXoyfdDadOnSosLHzmmWeioqIA6PX6v/3tb5WVlQcPHrzCO2zYsGHKlCkDBgwwGo0cx82aNWvfvn1GoxFAQkLC008/Lf4KJ02aBKCkpATAd999Fx8ff+eddxqNxvb29rlz5zY3N1+0xLCwsMGDB2dmZgIoKCioqamZO3eueCi2CFOmTLkSI2+66aZbbrkFAEVREydOtNvtVVVVl7r4+eefF5vmkJCQwYMHizZ3Zvny5WPHjn3yySfFw9/EbRs6dOjChQvFweOkSZMIIWfOnLloQQ6H45NPPpk3b97tt99+0VvdfPPN4vhUNNtms1VXV1/0VoQQAGVlZXa7nWGYfv36XerpuqAn+1jiM3e2Q2zIi4uLw8PDL/t2l8tVWVlZVlYWHBzc+XXxa+v8MYm9IqfTKRZaXl5+0bdcyNSpU1esWMFx3M6dO+Pi4h588MEJEybU1dUVFBSIrfCVPOaFlrhcl8w03vlimUz2G7eWw+E4c+bMzJkzr7ws8akvpLy83Gq1du5sddvsIUOGzJ079/XXX//000/nz5//1FNPdXT4rpyerLHEfrrdbu94xWazAVCprig4O8MwUqn0scceM/yarn8xSqVywoQJv3nLnXfeedGLp0yZ0traevjw4Z07d06aNGnEiBEqlWrnzp2ZmZlarXbYsGFX8bQ9AcuyUqmUYXogg4v44XftGLtCKIpau3bt8ePHH3jggdWrV48ePVr0K10VPSkscaCXnZ3d8UpWVlbH6x2oVCqL5XxyLJPJdNYUmk5JSTl8+LD213TO1X4hqampubm5Uqm081suNZIfNWpUYGDgjz/+uGfPnhtuuEEqlY4dOzYzMzMzM3PKlCkX/YJZlu2iQrpGGIaJj48/fPhwxyvFxcXdu1V0dLRCoejerViW5bjfZmcZNGjQsmXLVqxYUVlZefLkyau1pyeFFRcXd+utt7722mtr166trKz85ptv/v73v//hD38YOPBXMeyGDh26ffv2Q4cO1dXVffjhh6+++mrHqSeeeOLAgQNPPfVUcXHxmTNnvvrqq5UrV3Zd6OLFi9va2ubNm3fixImqqqqtW7e+8sorl7pYIpHccMMNy5cvNxgMot9h0qRJP/zwQ05OzqU6WKmpqTt37szJydm1axdxQ5yLBQsW/Pzzz8uWLauoqPj555/vv//+7t2Hpul777137dq1n3zySVVV1aZNmzr6bZclNTW1qqpq48aNR44cqa+vP3369IsvvnjgwIHTp09v2rRJKpUmJSVdtT1X+4bOsCz7m+pkzZo1M2bMeOCBB+Li4ubNmzdp0qT169cDoGmaYRixmX/llVdiYmIyMjKioqLWrVu3YsWKjrffd999//73v7/44ovk5OTExMQXXnjhspXwsGHDNm7cmJ+fL45AFyxY0NzcLAiXTMw8ZcqU5ubmtLS0yMhIABMnTjQYDISQyZMnixcwDNO56hLdEEOHDp0zZ05tbe1Vf0YXo/On8ac//ekvf/nLG2+8ER8ff9ddd82dO/dK7sCyrGgkwzAdX8Fbb701b968p556KjY29tFHH12wYMEV2rN48eJJkybNmjVrzJgxWVlZ5eXlq1evHjlyZHp6+q5duz777LPuuIi7MZK8LHa7vb6+3mazdXGNwWAwGo0XPSUIQkNDg9VqvapCDQZDa2vrVb3lyjGbzW66cweivsWR2scff3zttxL7JB2Oustis9k4jus4NJvNdXV13bbBLcFtZTJZWFhY19d04cylKCo0NPRqC+2Od/iKucLxx7Ug2l9YWAigT59rCjTXvVvJ5fLOhyqV6lqe2h8fy8u8//77+/fvnzVrVlRUVG1t7QsvvGAymQoKCi6cCrsszz//vMFgmDZtWnh4eHFx8TPPPBMZGXngwIELcxp4gm7XdX56hF9++WX+/PmJiYlyuTwmJmbWrFnFxcXdu9XWrVtnzZoVHx8vl8sTEhLuvfdecT7DK/hrLD9uwb802Y9b8AvLj1vwC8uPW/ALy49b8AvLj1vwC8uPW/ALy49b8AvLj1vwC8uPW/h/rr7K19B29NwAAADkelRYdHJka2l0UEtMIHJka2l0IDIwMjQuMDkuNgAAeJx7v2/tPQYgEABiJgYI4IfiBkY2BgUgzcLmoAGkmImmGRlANCMjuTQ3AyMDAzsDAwcDAycDI1MGEyNbAhNzAhMX0OwMJmZuBhbWBBYeBla2DCZWXgY2PgYnoHoGNkY2VhZmJvF9IDMYYH4xNhZ2uHc3VhXEOXvGx76zg2MJlG370G3ZfhB71syd+2Hss2d4DqxYbqiKJG6PpB7MNjYudoCZAzKfgeHAfiQ2TL39Qze1AzAzEeycA+/fvVNFEndAUg9miwEApz9G68P83GQAAAE3elRYdE1PTCByZGtpdCAyMDI0LjA5LjYAAHicjZNNboQwDIX3OYUv0MjOD0mWA4zaqhqQWto7zL73V+1BTEw1DU1YxOHDcZ4fBmS8j2/Xb7gPNxoDgI2nlAJfHhHNBWQB/fn5dYJhOfXbzjB/TssHUJQHZe7Z0zJfth2CAZyVfMicxd+LjXPMoc3r7lMD9DcQ4wqSdaWgzw/AwCC/D8dkFNJZd1hkt0vZyJh0kQ0uwwv4/9y6MHiXkUuIf4GEmmyBxGBV3NlYMqbuEemYrPo0US+ot+lQSgq7pK2cURfaAM/TuLPeasZ+nsZqRpmuek7CXJ0lYan+ueHKJYG/8NULEqba8cAJQm0sST6q/Qs8o+oSyQFOdYNfQ6c0J47JK2UDn5mUfsQxBSUTcRUUtRz68hJvfzGvzQ+IJsKxeFuLowAAAIR6VFh0U01JTEVTIHJka2l0IDIwMjQuMDkuNgAAeJxVjbsNwCAMRFdJSSSwzE8BUaZhB0TFGgwfMCGB5p3tk+9SzEUWlmI+J29SwnKWjUdlQsPFkQehQJFKMJY3Ku/RvPcG6x06HhBwdRHcZroeoUB30f/WHuyYaKCQLeOLGPV7+zTP+gDoYy98lEaTVAAAAABJRU5ErkJggg==", + "image/png": "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", "text/plain": [ "" ] @@ -289,37 +384,36 @@ } ], "source": [ - "# Or multiple selections with custom parameters\n", - "multi_selection = molify.visualize_selected_molecules(\n", - " toluene_mol,\n", - " molify.select_atoms_grouped(toluene_mol, \"c\", hydrogens=\"exclude\")[0],\n", - " molify.select_atoms_grouped(toluene_mol, \"C\", hydrogens=\"exclude\")[0],\n", - " molify.select_atoms_grouped(toluene_mol, \"c\", hydrogens=\"isolated\")[0],\n", - " molify.select_atoms_grouped(toluene_mol, \"C\", hydrogens=\"isolated\")[0],\n", - " mols_per_row=1,\n", - " legends=[\"Toluene with highlights\"],\n", + "# Create toluene molecule for visualization examples\n", + "toluene_smiles = \"Cc1ccccc1\"\n", + "toluene_mol = molify.ase2rdkit(\n", + " molify.smiles2atoms(toluene_smiles), suggestions=[\"Cc1ccccc1\"]\n", ")\n", - "print(\"Multi-selection visualization with custom parameters created\")\n", - "multi_selection" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Advanced Example: Selecting Functional Groups\n", "\n", - "Let's demonstrate a more complex example with a molecule containing multiple functional groups." + "# Select different atom types\n", + "aromatic_carbons = molify.match_substructure(toluene_mol, \"c\", hydrogens=\"exclude\")\n", + "methyl_carbon = molify.match_substructure(toluene_mol, \"[C;!c]\", hydrogens=\"exclude\")\n", + "\n", + "print(f\"Aromatic carbons: {aromatic_carbons}\")\n", + "print(f\"Methyl carbon: {methyl_carbon}\")\n", + "\n", + "# Flatten matches for visualization\n", + "aromatic_flat = [idx for match in aromatic_carbons for idx in match]\n", + "methyl_flat = [idx for match in methyl_carbon for idx in match]\n", + "\n", + "# Visualize with highlighted selections\n", + "img = molify.visualize_selected_molecules(toluene_mol, aromatic_flat, methyl_flat)\n", + "img" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] @@ -330,33 +424,47 @@ } ], "source": [ - "aspirin_smiles = \"CC(=O)Oc1ccccc1C(=O)O\" # (aspirin)\n", - "aspirin_mol = molify.ase2rdkit(molify.smiles2atoms(aspirin_smiles))\n", - "# Display the molecule\n", + "# Aspirin (acetylsalicylic acid) contains multiple functional groups\n", + "aspirin_smiles = \"CC(=O)Oc1ccccc1C(=O)O\"\n", + "aspirin_mol = molify.ase2rdkit(\n", + " molify.smiles2atoms(aspirin_smiles), suggestions=[aspirin_smiles]\n", + ")\n", + "\n", + "# Select different functional groups\n", + "# Acetyl ester group with hydrogens (using mapped_only to get specific atoms)\n", + "acetyl = molify.match_substructure(\n", + " aspirin_mol,\n", + " \"[C:1][C:2](=O)[O:4]c1ccccc1C(=O)O\",\n", + " hydrogens=\"include\",\n", + " mapped_only=True,\n", + ")\n", + "\n", + "# Carbonyl oxygens\n", + "carbonyls = molify.match_substructure(aspirin_mol, \"[O:1]=C\", mapped_only=True)\n", + "\n", + "# Carboxylic acid hydrogens\n", + "acid_h = molify.match_substructure(aspirin_mol, \"CO\", hydrogens=\"isolated\")\n", + "\n", + "# Flatten for visualization\n", + "acetyl_flat = [idx for match in acetyl for idx in match]\n", + "carbonyls_flat = [idx for match in carbonyls for idx in match]\n", + "acid_h_flat = [idx for match in acid_h for idx in match]\n", + "\n", + "# Visualize with multiple functional group highlights\n", "molify.visualize_selected_molecules(\n", " aspirin_mol,\n", - " # functional group\n", - " molify.select_atoms_grouped(\n", - " aspirin_mol, \"[C:1][C:2](=O)[O:4]c1ccccc1C(=O)O\", hydrogens=\"include\"\n", - " )[0],\n", - " # double-bonded oxygen but without the carbon\n", - " molify.select_atoms_grouped(aspirin_mol, \"[O:1]=C\")[0],\n", - " # hydrogens of the C-O-H group\n", - " molify.select_atoms_grouped(aspirin_mol, \"CO\", hydrogens=\"isolated\")[0],\n", + " acetyl_flat,\n", + " carbonyls_flat,\n", + " acid_h_flat,\n", " mols_per_row=1,\n", - " legends=[\"Aspirin with highlights\"],\n", + " legends=[\"Aspirin functional group analysis\"],\n", ")" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "molify", + "display_name": "rdkit2ase", "language": "python", "name": "python3" }, diff --git a/docs/source/conf.py b/docs/source/conf.py index 4bab676..9e37cb8 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -26,6 +26,7 @@ "sphinx.ext.autodoc", "sphinx.ext.napoleon", "sphinx.ext.viewcode", + "sphinxcontrib.mermaid", ] templates_path = ["_templates"] diff --git a/docs/source/index.rst b/docs/source/index.rst index 2f9e374..1a6c91a 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,35 +1,154 @@ molify Documentation ==================== -molify provides a bridge between RDKit_ and ASE_. -It further integrates features from Packmol_ and NetworkX_. +**molify** - molecular structure interface with RDKit, ASE, Packmol and NetworkX + +The molify package provides tools to convert molecular structures between +RDKit_, ASE_ and NetworkX_. +Furthermore, it provides a python interface for building periodic simulation boxes using Packmol_. + +- RDKit is a versatile and popular cheminformatics library. + +- ASE allows interfacing with a wide range of atomistic simulation codes and reads/writes many file formats. + +- NetworkX is designed for the creation, manipulation, and study of complex networks. + +- Packmol is a tool for building initial configurations for molecular dynamics simulations. + +Key Features +------------ + +- **Bidirectional conversions** between RDKit Mol, ASE Atoms, and NetworkX Graph objects +- **Connectivity preservation** with automatic bond detection when needed +- **Molecular system building** from SMILES to solvated systems via an additional Packmol_ interface + +Conversion Overview +------------------- + +These bridging functions are illustrated below. + +.. mermaid:: + + graph LR + A[rdkit.Mol] -->|molify.rdkit2networkx| B[networkx.Graph] + B -->|molify.networkx2ase| C[ase.Atoms] + A -->|molify.rdkit2ase| C + +.. mermaid:: + + graph LR + A[ase.Atoms] -->|molify.ase2networkx| B[networkx.Graph] + B -->|molify.networkx2rdkit| C[rdkit.Mol] + A -->|molify.ase2rdkit| C + +Conversion Details +------------------ +The rdkit package is built around the concept of molecules, with defined connections, bond orders and charges. Positional information is optional. +In contrast, ASE Atoms objects are built around atomic positions and atomic numbers, with no inherent concept of bonds or connectivity. +NetworkX Graphs are general-purpose graph structures with no predefined chemistry concepts. + +To store the connectivity information inside ASE Atoms objects, molify introduces a custom attribute ``ase.Atoms.info['connectivity']``: a list of tuples ``(atom_index_1, atom_index_2, bond_order)`` where indices are 0-based integers and ``bond_order`` can be a float following RDKit convention or None for unknown bond orders. + +When connectivity information is not available: + +- **ase2networkx**: Uses covalent radii to estimate bonds between atoms. +- **networkx2rdkit**: Uses ``rdkit.Chem.rdDetermineBonds.DetermineBonds`` to determine bond orders from 3D coordinates. + + +Quick Start +----------- + +**Basic Conversions** + +We can convert any RDKit molecule to an ASE Atoms object: + +.. code-block:: python + + import molify + from rdkit import Chem + + etoh = Chem.MolFromSmiles("CCO") + etoh = Chem.AddHs(etoh) + + atoms = molify.rdkit2ase(etoh) + + +Likewise, we can convert the ASE Atoms object back to an RDKit molecule: .. code-block:: python import molify + import ase.build + nh3 = ase.build.molecule("NH3") + mol = molify.ase2rdkit(nh3) + +**NetworkX Conversions** + +The networkx.Graph representation can be obtained from either RDKit or ASE objects: + +.. code-block:: python + + import molify + import ase.build + from rdkit import Chem + + etoh_mol = Chem.MolFromSmiles("CCO") + nh3_atoms = ase.build.molecule("NH3") + + etoh_graph = molify.rdkit2networkx(etoh_mol) + nh3_graph = molify.ase2networkx(nh3_atoms) + + +Advanced Features +----------------- + +**3D Conformer Generation** + +The main functionality of molify is expanded by additional tools that combine multiple packages. +For example, molify provides helper functions to generate 3D conformers directly from SMILES strings and store them as ASE Atoms objects. + +.. code-block:: python + + import molify + + # Generate 10 different 3D conformers of water + water = molify.smiles2conformers("O", numConfs=10) + + +**Molecular System Building** + +For many applications, it is useful to solvate molecules or create mixtures. +molify provides a convenient interface to Packmol_ for building molecular systems. + +.. code-block:: python + + import molify + + # Generate conformers for water and ethanol water = molify.smiles2conformers("O", numConfs=10) etoh = molify.smiles2conformers("CCO", numConfs=10) + + # Pack 5 water and 5 ethanol molecules into a box at 800 kg/m³ box = molify.pack( - data=[water, etoh], counts=[5, 5], density=800, packmol="packmol.jl" + data=[water, etoh], counts=[5, 5], density=800 ) - mol = molify.ase2rdkit(water[0]) - graph = molify.ase2networkx(box) +More details on these tools can be found in the :doc:`packmol_tools`, :doc:`ase_tools`, :doc:`rdkit_tools`, and :doc:`atom_selection` sections. -More examples are provided below. Installation ------------ +**From PyPI** + You can install molify from PyPI: .. code-block:: console (.venv) $ pip install molify -From Source ------------ +**From Source** To install and develop molify from source, we recommend using `uv `_. @@ -37,19 +156,18 @@ More information and installation instructions can be found in the `UV documenta .. code-block:: console - (.venv) $ git clone https://github.com/zincware/rdkit2ase - (.venv) $ cd rdkit2ase + (.venv) $ git clone https://github.com/zincware/molify + (.venv) $ cd molify (.venv) $ uv sync (.venv) $ source .venv/bin/activate -Documentation -------------- .. toctree:: :maxdepth: 2 + :hidden: - ase_tools rdkit_tools + ase_tools packmol_tools networkx_tools atom_selection @@ -58,5 +176,5 @@ Documentation .. _RDKit: https://www.rdkit.org/ .. _ASE: https://wiki.fysik.dtu.dk/ase/ -.. _Packmol: https://github.com/m3g/Packmol.jl +.. _Packmol: https://github.com/m3g/Packmol .. _NetworkX: https://networkx.org/ diff --git a/docs/source/networkx_tools.ipynb b/docs/source/networkx_tools.ipynb index 3c519e5..f355713 100644 --- a/docs/source/networkx_tools.ipynb +++ b/docs/source/networkx_tools.ipynb @@ -2,23 +2,22 @@ "cells": [ { "cell_type": "markdown", - "id": "346fb853", "metadata": {}, "source": [ - "## NetworkX Interface\n", + "# NetworkX Interface\n", "\n", - "NetworkX is a Python package for creating, manipulating, and studying the structure of complex networks (graphs).\n", - "It can be used to iterate over molecules, build topologies, or analyze molecular graphs.\n", - "You can find more information at https://networkx.org/documentation/stable/index.html" + "NetworkX provides a graph-based representation perfect for analyzing molecular topology and connectivity patterns.\n", + "\n", + "For more information about NetworkX, visit https://networkx.org/" ] }, { "cell_type": "code", "execution_count": 1, - "id": "a8beafbc", "metadata": {}, "outputs": [], "source": [ + "import ase.build\n", "import networkx as nx\n", "from IPython.display import display\n", "from rdkit.Chem import Draw\n", @@ -28,56 +27,97 @@ }, { "cell_type": "markdown", - "id": "57f1e287", "metadata": {}, "source": [ - "Let's create a simple molecule - `serotonin` - and analyze its number of bonds and cycles using NetworkX." + "## NetworkX → ASE:\n", + "\n", + "The networkx graph contains the positional and chemical infromation and can be easily converted to an ASE Atoms object:" ] }, { "cell_type": "code", - "execution_count": 2, - "id": "206951f5", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": "# Create a simple molecule and convert to graph\nwater = molify.smiles2atoms(\"O\")\nwater_graph = molify.ase2networkx(water)\n\nprint(\n f\"Graph: {water_graph.number_of_nodes()} nodes, \"\n f\"{water_graph.number_of_edges()} edges\"\n)\n\n# Convert back to ASE\nwater_back = molify.networkx2ase(water_graph)\nprint(f\"\\nBack to ASE: {water_back}\")\nprint(f\"Connectivity preserved: {'connectivity' in water_back.info}\")\nprint(f\"Number of bonds: {len(water_back.info['connectivity'])}\")" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NetworkX for Molecular Analysis\n", + "\n", + "### Graph Algorithms: Finding Cycles" + ] + }, + { + "cell_type": "code", + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ - "" + "" ] }, "metadata": {}, "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Serotonin: 25 atoms, 26 bonds\n" + ] + }, + { + "data": { + "image/png": "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Bn7Vq1dPXb161QhMMEwPAUdoaVdEwQbpiXp3b/369apSpUrePiQiIiKfwsDCDyEVA+1pUYPx8uVL6UyDIAITgJ0JApB+hTOyKPDWGjZsqKZNm6Zix47toqMn8s/fOfyO4XeEbWaJiIhCx8CCLGAwH7pJDRo0yLgtR44c0po2a9asXj02Im/Zt2+f7AZC9erV1YoVK7x9SERERD6H7WbJAlKgBg4cqJYuXWoMzkORKuZdILggCkZsM0tERGQbAwsKVa1atdSePXtUzpw55Tpa16I9ba9evWRXgyiYMLAgIiKyjalQZBXa17Zu3VrNnz/fuK18+fLSISdJkiRePTYiT7eZzZYtmzpx4oS3D4mIiMgncceCrEKh6i+//KJGjx4taVKwefNmVaBAAbVr1y5vHx6R26EDFIIK4G4FERFR2BhYkE3oNIW2s1u2bDFa2F67dk3a2k6YMEFmYRAFKqZBERER2YepUOSQf/75R1rQbtu2zbitSZMmatKkSe9M9ibyd9ipSJEihbp586b8fCMtim1miYiIQscdC3IIpnJv2LBBJg9rc+bMUcWLF1fnzp3z6rERudrBgwclqIAKFSowqCAiIrKCgQU5LEqUKGr48OFq4cKFUoMBhw8fVgULFlQrV6709uERuQzToIiIiOzHwILCrUGDBtKSFp1y4MGDB6pGjRrq22+/VW/evPH24RE5jYEFERGR/VhjQU7DjIvPPvtM/frrr8ZtlStXVvPmzVOJEiXy6rERhde9e/fk5xd1Fpg6f/LkSW8fEhERkU/jjgU5LU6cOGrRokVq2LBhKlKkSEaLTqRG7d2719uHRxQubDNLRETkGAYW5LKWtN26dZPCbj047/Lly6pkyZJq2rRp3j48IocxDYqIiMgxTIUil8OMi/r166u//vrLuA2pUuPGjVMxYsTw6rERafjTd/78edlVQxD84sULGQIZP358lTt3blW3bl2jzeydO3dU9OjRvX3IREREPo2BBbnFy5cvVffu3dXYsWON2zCt+7ffflPp0qXz6rFR8EJq06ZNm2TuysaNG9X9+/dtPiZHjhxq+/bt6r333vPIMRIREfkrBhbkVijgbt26tXr69KlcT5Aggfrll19U1apVvX1oFETwZ2727NlqwIAB6vTp0w4/HjttGAT5448/qsSJE7vlGImIiPwdAwtyuyNHjqg6deqos2fP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tLU6u3DhQnsjdccdd2QqWlVwopXVFi1a2M8PA00IP/bYY+3xggULvFqRZFCqmXPSSScl7byIj2OOOcZOTnc6duxopkyZEtdzKM3wqaeessdKQ1TgXrhw4bieA8lzUCRMyy4AAOTSc889l2lYW8GCBW2qhd6qVauW4+OVYz5x4kQ7rXrChAnex8uUKWPTpU477TQTdO3atfNWm7/++mub0pXb9qGa43H22Wd7gVYs7UMffvhh07t3b3v8xhtvZEp3QTjo9d+yZUszbtw4b+dJE+gvvvhi38+rgEK1G9E7F+71gpBSYAEAQDrq16+fFs+8t9NPPz3y008/5em59u7dGxk+fHikZMmS3vOVKFEi8v3330eCrm/fvt41P/DAAzE9pmPHjpn+7fZ909/npG7dut7n//DDD3H4SpAKmzdvjjRo0CDT979z586RjRs35un5fv3110iTJk0yPV/Xrl3t/zGEGzsWAIC09O6775r27dt772uHYsCAAXbHwo+VK1fajjVukrR2LrSaf/TRR5ugWrRokbc7c9RRR9n5BIceemhCzzljxgxvFoF2OZSGpVQXhJPSANu2bWs+++wz72MVKlSwu4HaiYqlY5TmYah1rd6iu4Tddttttp6D10f4EVgAANKOCrNr1Khh6yWkZ8+epl+/fnHrTKTnVX2GqyFo3ry5+fjjjwPd+ejCCy80n376qT0eNmxYwof8XXPNNXb+h+jfXjePCDcNr1NKoFKWdu7cmamOR1PW69ata9szq12sAle1b1a9kto5KwXPTeF2FJSr7umyyy5LwVeDRCCwAACkFf1aU5vMDz74wLvp/+ijj+K+GqqdC7WedcGLev1fd911JqjGjh1r/13crsXcuXNNqVKlElYs37RpU3usgXwqdE/UuZB88+bNszuAX375ZZ4er/+LV155penfv78NLpA+2HMCAKQVFVq7oKJEiRJ2XkV2QYVW77t27WpXWrXyql2HWKYEly9f3haGO3feeaddoQ0qFeCec8459nj16tUJa+mplJnrr7/ee/++++4jqEgz6vCl3YdZs2bZQXqxthIuW7aseeCBB+wkeP2/I6hIP+xYAADSyiWXXGLGjBnjtbLs1q1btp+vuRaqOVCOuHr261gtL6+99tocz6VfodoRcd2iFJCoJWdQKce9Zs2aXgCkvPZevXrF7fmVHqNdEbXvFXXM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", + "text/plain": [ + "
" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ + "# Create serotonin (has cycles)\n", "serotonin = molify.smiles2atoms(\"C1=CC2=C(C=C1O)C(=CN2)CCN\")\n", - "mol = molify.ase2rdkit(serotonin)\n", - "display(mol)" + "serotonin_mol = molify.ase2rdkit(serotonin)\n", + "\n", + "display(serotonin_mol)\n", + "\n", + "# Analyze with NetworkX\n", + "graph = molify.ase2networkx(serotonin)\n", + "print(f\"\\nSerotonin: {graph.number_of_nodes()} atoms, {graph.number_of_edges()} bonds\")\n", + "molify.draw_molecular_graph(graph)" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "883ff4b5", + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Number of atoms: 25\n", - "Number of bonds: 26\n", - "Cycle 0 with atoms: [3, 2, 9, 8, 7]\n" + "Found 2 cycles:\n", + "\n", + "Cycle 1 (5 atoms): [3, 2, 9, 8, 7]\n" ] }, { "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEsASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKQsBjJAycDPegBaKTcN23I3YziloAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKa7pFG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", - "image/png": "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", + "image/jpeg": "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", + "image/png": "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", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -87,15 +127,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "Cycle 1 with atoms: [3, 4, 5, 0, 1, 2]\n" + "Cycle 2 (6 atoms): [3, 4, 5, 0, 1, 2]\n" ] }, { "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEsASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKQsBjJAycDPegBaKTcN23I3YziloAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKa7pFG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FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFQXtsl7YXFpJ9yeJo2+jDH9anrO13U/7G0K91EJ5jW8RdUPRm7D88UpNJNs0pRlKpGMN21b1Mn4fXT3HguxSX/XW262kHoUYgD8sV09cjdxap4Y0waodRWdEkV7u1FtHHGwZgGKbVDAjOcknOOa66s6TtFRe6OnHRUqsq8GuWTe1/VrVLugooorU4gooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoopk00VtBJPPIkUUalnd2AVQOpJPQUAPrl/wC2LXxXeX2h21q9zpnkvFdXysAiueip/ePuOnFYEWs6j8SdQlttJElp4Riyk2onKyXzA8rED/B1BPf9D39hYWumWUVnZQJDbxDCIo4H+J96zkpSdun5nXSlSpU+fefTol5+b7Lbq+xiSaHq1/DDY6pqdvNYRujP5VuUlnCkEByWIAyBnA59q6OiiqjFR2MqtedSylsuyS39AoooqjEKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5LxP4lOgeKfD0U9y8On3SXX2hVhMhcqqbPuqWGCT0/GsWV9P+JPiPVNFnvLuXQ7aCzuBAgaDfJvl3K+VDMpCrx04GMGuwv9FN74l0fVhOEGnpOpi258zzFUdc8Y2/rRbaKYPFl/rfnhhd2kFsItv3fLaQ5znnPmenagDStraCztora2hSGCJQkccahVVR0AA6CpaKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z", - "image/png": "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", + "image/jpeg": "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", + "image/png": "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", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -103,127 +143,288 @@ } ], "source": [ - "graph = molify.ase2networkx(serotonin)\n", - "print(f\"Number of atoms: {graph.number_of_nodes()}\")\n", - "print(f\"Number of bonds: {graph.number_of_edges()}\")\n", - "for idx, cycle in enumerate(nx.cycle_basis(graph)):\n", - " print(f\"Cycle {idx} with atoms: {cycle}\")\n", - " display(Draw.MolToImage(mol, highlightAtoms=cycle))" + "# Find all cycles\n", + "cycles = nx.cycle_basis(graph)\n", + "print(f\"Found {len(cycles)} cycles:\\n\")\n", + "\n", + "for idx, cycle in enumerate(cycles):\n", + " print(f\"Cycle {idx + 1} ({len(cycle)} atoms): {cycle}\")\n", + " # Visualize each cycle\n", + " display(Draw.MolToImage(serotonin_mol, highlightAtoms=cycle, size=(300, 200)))" ] }, { "cell_type": "markdown", - "id": "e2cad140", "metadata": {}, "source": [ - "The usage is not limited to single molecules but can also be applied to multi-molecule systems." + "### Analyzing Multi-Molecule Systems" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "ddb4aead", + "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "System: 60 atoms, 50 bonds\n" + ] + } + ], "source": [ + "# Create a water/ethanol mixture\n", "water = molify.smiles2conformers(\"O\", numConfs=10)\n", - "etoh = molify.smiles2conformers(\"CCO\", numConfs=10)\n", - "box = molify.pack(data=[water, etoh], counts=[5, 5], density=800, packmol=\"packmol.jl\")" + "ethanol = molify.smiles2conformers(\"CCO\", numConfs=10)\n", + "box = molify.pack(data=[water, ethanol], counts=[5, 5], density=800)\n", + "\n", + "# Convert to graph\n", + "box_graph = molify.ase2networkx(box)\n", + "print(\n", + " f\"System: {box_graph.number_of_nodes()} atoms, {box_graph.number_of_edges()} bonds\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": "from collections import Counter\n\n# Find connected components (individual molecules)\ncomponents = list(nx.connected_components(box_graph))\nprint(f\"Found {len(components)} separate molecules\")\n\n# Analyze molecule sizes\nsizes = Counter(len(comp) for comp in components)\nprint(\"\\nMolecule sizes:\")\nfor size, count in sorted(sizes.items()):\n molecule_type = \"water (H2O)\" if size == 3 else \"ethanol (C2H6O)\"\n print(f\" {count} molecules with {size} atoms ({molecule_type})\")" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NetworkX → RDKit: Guessing Bond Orders from 3D Coordinates\n", + "\n", + "### Decision Tree: When Does Bond Order Determination Happen?\n", + "\n", + "```\n", + "networkx2rdkit(graph, suggestions)\n", + " ↓\n", + "Are all bond_orders present (not None)?\n", + " ├─ YES → Simple conversion ✅\n", + " └─ NO → Bond order determination required ⚠️\n", + " ↓\n", + " Step 1: Try template matching with suggestions\n", + " ↓\n", + " Step 2: Fallback to rdkit.Chem.rdDetermineBonds\n", + " (tries charges: 0, ±1, ±2)\n", + "```\n", + "\n", + "Let's explore each case:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Case 1: Graph Has Explicit Bond Orders\n", + "\n", + "When the graph comes from RDKit originally, all bond orders are known:" ] }, { "cell_type": "code", - "execution_count": 5, - "id": "c05661e1", + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Graph with 60 atoms and 50 bonds.\n" + "Bond orders in graph:\n", + " 0-1: 1.0\n", + " 0-4: 1.0\n", + " 0-5: 1.0\n", + " 0-6: 1.0\n", + " 1-2: 2.0\n", + "\n", + "Conversion successful:\n" ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "graph = molify.ase2networkx(box)\n", - "print(f\"Graph with {len(graph)} atoms and {len(graph.edges())} bonds.\")" + "# Create molecule with known bonds\n", + "acetone = molify.smiles2atoms(\"CC(=O)C\") # Has a C=O double bond\n", + "acetone_graph = molify.ase2networkx(acetone)\n", + "\n", + "# Check bond orders\n", + "print(\"Bond orders in graph:\")\n", + "for u, v, data in list(acetone_graph.edges(data=True))[:5]:\n", + " print(f\" {u}-{v}: {data['bond_order']}\")\n", + "\n", + "# Convert to RDKit\n", + "acetone_mol = molify.networkx2rdkit(acetone_graph)\n", + "print(\"\\nConversion successful:\")\n", + "display(acetone_mol)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Case 2: Graph Has `bond_order=None`" ] }, { "cell_type": "code", - "execution_count": 6, - "id": "2134f6a2", + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Found 10 molecules\n" + "Ammonia: Atoms(symbols='NH3', pbc=False)\n", + "Has connectivity: False\n", + "\n", + "Graph edge attributes:\n", + " N(0)-H(1): bond_order = None\n", + " N(0)-H(2): bond_order = None\n", + " N(0)-H(3): bond_order = None\n" ] } ], "source": [ - "molecules = len(list(nx.connected_components(graph)))\n", - "print(f\"Found {molecules} molecules\")" + "# Create ammonia from ASE (no connectivity info)\n", + "ammonia = ase.build.molecule(\"NH3\")\n", + "print(f\"Ammonia: {ammonia}\")\n", + "print(f\"Has connectivity: {'connectivity' in ammonia.info}\")\n", + "\n", + "# Convert to NetworkX - will have bond_order=None\n", + "ammonia_graph = molify.ase2networkx(ammonia)\n", + "\n", + "print(\"\\nGraph edge attributes:\")\n", + "for u, v, data in ammonia_graph.edges(data=True):\n", + " print(f\" N({u})-H({v}): bond_order = {data['bond_order']}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Converthing to rdkit with `networkx2rdkit` will run the bond order determination algorithm." ] }, { "cell_type": "code", - "execution_count": 7, - "id": "ebfca389", + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 7, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "molify.networkx2rdkit(graph)" - ] - }, - { - "cell_type": "markdown", - "id": "9d502811", - "metadata": {}, - "source": [ - "The graph can also be converted back to an ASE Atoms object, keeping most properties." + "# Convert to RDKit - triggers automatic bond order determination\n", + "ammonia_mol = molify.networkx2rdkit(ammonia_graph, suggestions=[])\n", + "\n", + "display(ammonia_mol)" ] }, { "cell_type": "code", - "execution_count": 8, - "id": "a5785839", + "execution_count": 10, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Conversion failed: Failed to determine bonds for sub-structure up to charge -2.0 and ['O', 'P', 'O', 'O', 'O', 'P', 'O', 'O', 'O', 'C', 'C', 'C', 'C', 'O', 'C', 'O', 'C', 'C', 'C', 'O', 'C', 'N', 'C', 'N', 'C', 'C', 'N', 'C', 'N', 'C', 'N', 'O', 'O', 'O', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H']\n" + ] + }, { "data": { + "image/png": "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", "text/plain": [ - "Atoms(symbols='OH2OH2OH2OH2OH2C2OH6C2OH6C2OH6C2OH6C2OH6', pbc=True, cell=[8.728901107040366, 8.728901107040366, 8.728901107040366], initial_charges=...)" + "" ] }, - "execution_count": 8, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "molify.networkx2ase(graph)" + "SMILES = \"OP(=O)(O)OP(=O)(O)OC=CC1C(O)C(OC2C(C(O)C(N3C=NC4=C3N=CN=C4N)O2)O)O1\"\n", + "\n", + "molecule = molify.smiles2atoms(SMILES)\n", + "molecule.info.pop(\"connectivity\", None) # Remove connectivity info\n", + "graph = molify.ase2networkx(molecule)\n", + "\n", + "# the automatic bond order determination can fail for complex molecules\n", + "try:\n", + " mol = molify.networkx2rdkit(graph, suggestions=[])\n", + "except ValueError as e:\n", + " print(f\"Conversion failed: {e}\")\n", + "\n", + "# but if we know the molecule, we can provide it as a suggestion\n", + "# You can also provide a list of suggestions for multiple molecules or multiple guesses\n", + "mol = molify.networkx2rdkit(graph, suggestions=[SMILES])\n", + "display(mol)\n", + "# For very large molecules, this can take a while!" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Key Takeaways\n", + "\n", + "### What We Learned\n", + "\n", + "1. **NetworkX → ASE**: Simple data transfer\n", + "\n", + "2. **NetworkX graphs** are great for:\n", + " - Finding cycles (`nx.cycle_basis`)\n", + " - Counting molecules (`nx.connected_components`)\n", + " - Analyzing topology\n", + "\n", + "3. **NetworkX → RDKit** complexity depends on `bond_order`:\n", + " - If all present → direct conversion\n", + " - If any `None` → Bond order determination\n", + "\n", + "4. **Bond order determination** uses two steps:\n", + " - **Step 1**: Template matching with `suggestions` (SMILES list)\n", + " - **Step 2**: Fallback to `rdkit.Chem.rdDetermineBonds`\n", + " - Tries charges: 0, ±1, ±2\n", + " - Special handling for ions\n", + "\n", + "5. **The \"suggestions\" parameter**:\n", + " - List of SMILES strings\n", + " - Can be complete molecule or substructures\n", + " - Helps ensure chemical correctness\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "molify", + "display_name": "rdkit2ase", "language": "python", "name": "python3" }, @@ -241,5 +442,5 @@ } }, "nbformat": 4, - "nbformat_minor": 5 + "nbformat_minor": 4 } diff --git a/docs/source/packmol_tools.ipynb b/docs/source/packmol_tools.ipynb index cb39c61..8a1caa1 100644 --- a/docs/source/packmol_tools.ipynb +++ b/docs/source/packmol_tools.ipynb @@ -2,107 +2,318 @@ "cells": [ { "cell_type": "markdown", - "id": "b21f7e60", "metadata": {}, "source": [ - "## Packmol Interface\n", + "# Packmol Interface\n", "\n", - "Packmol is a powerful tool for creating initial configurations for molecular dynamics simulations by packing molecules into a given region of space.\n", - "molify provides a python interface to Packmol.\n", - "If you have packmol installed, you can use it via [pack](modules.rst#molify.pack) create periodic boxes from `ase.Atoms` objects." + "Packmol is a tool for creating initial configurations for molecular dynamics simulations by packing molecules into a given region of space. molify provides a Python interface to Packmol, making it easy to build molecular systems. \n", + "\n", + "`molify` ships with a pre-compiled binary of packmol. For more about Packmol, see https://github.com/m3g/Packmol" ] }, { "cell_type": "code", "execution_count": 1, - "id": "5b2423ed", "metadata": {}, "outputs": [], "source": [ + "from rdkit.Chem import Draw\n", + "\n", "import molify" ] }, { "cell_type": "markdown", - "id": "988af024", "metadata": {}, "source": [ - "The interface takes \n", - "- a list of lists of `ase.Atoms` objects to be packed,\n", - "- the number of each type of molecule, if larger than the number of provided `ase.Atoms` objects the objects will be duplicated,\n", - "- the density of the final box in kg/m³.\n", + "## Basic Usage: Creating a Molecular Box\n", + "\n", + "The `pack()` function creates periodic boxes filled with molecules at a specified density.\n", "\n", - "You can either specify the path to the Packmol executable, or use a Julia installation with the Packmol package." + "### Simple Example: Water Box" ] }, { "cell_type": "code", "execution_count": 2, - "id": "a0f43110", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generated 10 water conformers\n", + "Each conformer: Atoms(symbols='OH2', pbc=False)\n" + ] + } + ], "source": [ + "# Generate water conformers\n", "water = molify.smiles2conformers(\"O\", numConfs=10)\n", - "etoh = molify.smiles2conformers(\"CCO\", numConfs=10)\n", - "box = molify.pack(data=[water, etoh], counts=[5, 5], density=800, packmol=\"packmol.jl\")" + "\n", + "print(f\"Generated {len(water)} water conformers\")\n", + "print(f\"Each conformer: {water[0]}\")" ] }, { "cell_type": "code", "execution_count": 3, - "id": "f6b6bb66", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Atoms(symbols='OH2OH2OH2OH2OH2C2OH6C2OH6C2OH6C2OH6C2OH6', pbc=True, cell=[8.728901107040366, 8.728901107040366, 8.728901107040366], atomtypes=..., bfactor=..., occupancy=..., residuenames=..., residuenumbers=...)\n" + "Water box: Atoms(symbols='OH2OH2OH2OH2OH2OH2OH2OH2OH2OH2', pbc=True, cell=[6.687972094719516, 6.687972094719516, 6.687972094719516])\n", + "Cell dimensions: [6.68797209 6.68797209 6.68797209] Å\n", + "Total atoms: 30\n", + "Volume: 299.15 ų\n" ] } ], "source": [ - "print(box)" + "# Pack 10 water molecules into a box\n", + "water_box = molify.pack(\n", + " data=[water], # List of conformer lists\n", + " counts=[10], # Number of each molecule type\n", + " density=1000, # Density in kg/m³\n", + ")\n", + "\n", + "print(f\"Water box: {water_box}\")\n", + "print(f\"Cell dimensions: {water_box.cell.lengths()} Å\")\n", + "print(f\"Total atoms: {len(water_box)}\")\n", + "print(f\"Volume: {water_box.get_volume():.2f} ų\")" ] }, { "cell_type": "markdown", - "id": "995cdf15", "metadata": {}, "source": [ - "You can utilize all other features here as well." + "The ``connectivity`` information from the input ``Atoms`` object is preserved in the output box." ] }, { "cell_type": "code", "execution_count": 4, - "id": "6cf8c2cb", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Found 5 water molecules and 5 ethanol molecules.\n" + "Has connectivity: True\n", + "Number of bonds: 20\n", + "Expected bonds: 20 (10 molecules x 2 O-H bonds each)\n" ] } ], "source": [ - "waters = molify.match_substructure(\n", - " box,\n", - " smiles=\"O\",\n", + "# Connectivity is preserved!\n", + "print(f\"Has connectivity: {'connectivity' in water_box.info}\")\n", + "print(f\"Number of bonds: {len(water_box.info['connectivity'])}\")\n", + "print(f\"Expected bonds: {10 * 2} (10 molecules x 2 O-H bonds each)\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parameters Explained\n", + "\n", + "### `data`: List of Conformer Lists\n", + "\n", + "`data` is a list where each element is a list of conformers (ASE Atoms objects) for one molecule type.\n", + "\n", + "```python\n", + "data = [\n", + " [water_conf1, water_conf2, ...], # Water conformers\n", + " [ethanol_conf1, ethanol_conf2, ...] # Ethanol conformers\n", + "]\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `counts`: Number of Each Molecule\n", + "\n", + "```python\n", + "counts=[10, 5] # 10 of first type, 5 of second type\n", + "```\n", + "If you need more molecules in the box than created conformers, they will be reused:\n", + "```python\n", + "water = molify.smiles2conformers(\"O\", numConfs=5)\n", + "box = molify.pack(\n", + " data=[water],\n", + " counts=[10], # Requesting 10 water molecules will use each conformer twice\n", + " density=997 # kg/m^3\n", ")\n", - "etohs = molify.match_substructure(\n", - " box,\n", - " smiles=\"CCO\",\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `density`: Target Density (kg/m³)\n", + "\n", + "The box size is automatically calculated to match this density." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating Mixtures\n", + "\n", + "### Water + Ethanol Mixture" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Water conformers: 10\n", + "Ethanol conformers: 10\n" + ] + } + ], + "source": [ + "# Generate conformers for both molecule types\n", + "water = molify.smiles2conformers(\"O\", numConfs=10)\n", + "ethanol = molify.smiles2conformers(\"CCO\", numConfs=10)\n", + "\n", + "print(f\"Water conformers: {len(water)}\")\n", + "print(f\"Ethanol conformers: {len(ethanol)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mixture: Atoms(symbols='OH2OH2OH2OH2OH2C2OH6C2OH6C2OH6C2OH6C2OH6', pbc=True, cell=[8.728901107040365, 8.728901107040365, 8.728901107040365])\n", + "Cell: [8.72890111 8.72890111 8.72890111] Å\n", + "Total atoms: 60\n" + ] + } + ], + "source": [ + "# Create mixture: 5 water + 5 ethanol\n", + "mixture = molify.pack(\n", + " data=[water, ethanol],\n", + " counts=[5, 5],\n", + " density=800, # kg/m³\n", ")\n", - "print(f\"Found {len(waters)} water molecules and {len(etohs)} ethanol molecules.\")" + "\n", + "print(f\"Mixture: {mixture}\")\n", + "print(f\"Cell: {mixture.cell.lengths()} Å\")\n", + "print(f\"Total atoms: {len(mixture)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualizing the Mixture" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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215eLPAiuzFVEESHOe+5GPU8EfSgDdooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMHWvCOm6xKLoB7PUVOUvbU7JQcY5I+9+NVrSfxFYG30u9ubK7u5nfyboxlR5SKCWdQRlssBgEeua6eqOoaat80Eqzy29xbsWimixkZGCCCCCCO2OwrOUNeaO520sU+VUqusVe11ez6W62vutvIxLqXxFqvnadZXVpYzW83l3VyqFiUKqytGp6EhiCD0xwau6J4U0zQ2aeJGuL5+ZLy4O+Vz3+Y9PwrQ07Tk09Jj50k808nmTTS43O2AOwAAAAAAHarlEYa8z3FWxT5XSp6R62Vrvz6tX2T27BRRRWhxhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBWnv7a3vrWzlcie63+Su0ndtGTz24os7+2vmuVt3LG2mMEvykYcAEjnrwRWP4g0KTWNb0WUmdba1aYzPBctC67kwuChDdfSuZe81z4fyXko8P3Wp6HNeyzzTw3JnuYlKoA21iWcfK2cnP0xyAej0Vk+H/Euj+KNPF9o1/FdQ9G2nDIfRlPKn61rUAFFFY3iPxXovhSxF1rF9Hbq3Ecf3pJT6Ko5J/wAmgDQub+2tLmzt5nKy3kphgG0ncwRnI9vlRjz6UW1/bXlzeW8LlpbOUQzjaRtcosgHv8rqePWuEgl1zx3e6Zd3mgXekaPbXpmhd7sw3Txm3mTcQhDJ8zIMA5wT1FdJ4a0SXRb3XtxlaC6vkmgeadpnZfs8KElmJb7yMOT0A7YoA6CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5nU/BVjcXb6lpUjaTqpJc3VqABI3/TRejdBnuaLPUvENssNhqVpZzajLIyxSRSlI5I1UEyNwSvJAwByT2HNdNVDUdOe7mtrm3uPs91bFjG5TepDDDKy5GQeOhByBWcoWfNHc7aWJ5oqlWs4ra+6+a1tfdfcY93qPiG/SSx0u2tLW9imMV1NLIZFhBUMroMDdkN3HBGCO9P0nwXp1heLqN8W1TVgc/bbsbmQ/wCwOiD6c+9a2m6c1j9oklnM9zcyeZNJt2gnaFAA5wAFHc/Wr1EYa80twrYm0XRpWUXvbr83ra+y9Lq4UUUVocQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAFJNX0+S0tbpLpDBduI4H5xIxzgD8jV2vNNE0G8bQ/DbRajdXTWWoJ9qtBLE0VuV3Bgdq5BXI43E816XQAUUVXW9tm1CSwEoN1HEszR4PCMWAOenJVvyoAsUVXsb221KyhvLSUS28y7o3AI3D8asUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVz/i/ULvTdNsp7JZXlbUbaMxxFQ0itIoKgsQORxyRQB0FFcDJ4+tdE8Rak3iVrjSLPyrSOCK4CyYdzOS37ouACEAyT2rr9L1vStbg87S9Rtb2Pu1vMr4+uDxQBfrO1/VY9C8PajqsuNlnbvNg9yqkgfiePxrRrz74su19o+k+GIWIl13UYbZ8dRCp3yN+GB+dAGh8LdKk0n4eaWLjJu7xTe3DHqzynfz74IH4V2NNRFjjWNFCooAVR0AFOoAK4+/05Lr4huZdSmsjPpkSQLBdLG8xSSUv8vUhQynOMc12Fee6J/xPvjL4g1Q/Nb6LaRaZAe3mOfMkI9x90/WgDp/B9hc6X4R0uxvIzHcQQBJFLAkH6jg1t0UUAFFFFABRWedZtBLqUeX3acoef5exTeMevFWrS6jvbKC7hz5U8ayJkYOGGR/OgCaiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACobm0t7xY1uIlkWORZUDdnU5U/UEZqaigCubC0a4nna3jaS4jWOZmXO9V3bQfUDc351ymqfCvwhqc/2lNLGn3Y5W505zbup9flwM/UV2dFAHnn/CJ+OtC58P8AjMahCvS112HzM/WVfm/SuNk8W62finDeeJPDV1MfDlq0ciaMpulilnGRKRwQCmRjrxXubuscbSOwVFBLMegArgPhMjX+kat4omUiXXdRluUyORCp2Rr+GD+dAGto3xK8Ia6wjtdcto7jODb3R8iQH02vjJ+ma6sEEAg5BrI1nwtoPiFCur6RZ3hxgPLEC4+jdR+BrlD8K00sl/CfiXWNCI+7As32i3H1jfr+dAHdX97DpunXV9cNtgtoXmkPoqgk/oK434SWU0XgaPU7tcXms3EupTn1MjfL/wCOhT+NcV8Q7z4i6Z4YbQtSfSdUj1iZLCC5tFaK4ZmOcFD8vIUjjgZrqtM+KPhzSbe10rWLLU/DjwxrDHHqNoyphRgBXXIIwOpxQB6LRVWw1Ow1W2W50+8t7uBhkSQSB1P4irVANWCqGta1p/h7SZ9T1S5S3tIFy7t+gA7k9gKdquq2ei6dLf30ojgjHJ7sewA7k1yFr4bn8ZataeIPE0LpaWzF9P0pz8intJKO7+g7ZqXNc3L1No4ebpOttFaer7Lv3fb7iOy0NPF1tquvy2l5ajVraM2kM08kLriMr86o2OTyM54NdnpFrJY6LYWk2PNgt4432nIyqgHH5VdoqjEKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo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OI7R7YQtGCPmdW3Z/wCA4xjvQBl/DyGxtvA2n22moVs7dpoYyZA5cJM679wAB3EFuB3rqKzdC0ldE0oWKy+YommlDbNv+slaTGM9t2PwrSoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAppqthJbW1yl3EYbpwkDhuJGOcAfkauV5po2haj/YXhll1K9ufsmoR/aLLEBjt9u8MCVQPlc9Cx6816XQAUUVALy3a/exEoNykSzNH3CMSAfxKt+VAE9FQWd5b6hZxXdpKJYJV3I69GFT0AFFFFABRRRQAUUUUAFFFFADZJEijaR2CooLMT0AFV11GzcWZW5jIvebbn/W/KX+X1+UE/Sl1KN5dLu441LO8LqoHclTXD6Ho1+q+Crsapeahb26kTRuIDHb/wCiuvBjQHhjt5J/PmgD0GiiigAoqt/aNp5t1F5677RQ045+QEZBP4A1Lb3EV3bRXMDh4ZUEkbjoykZB/KgCSiiigAooooAKKKKACiiigAqG6uoLGzmu7qVYreCNpJZHOAiqMkn2AFTVh+NLeW78C+ILaBC80um3CIg/iYxsAPzoA1mu7dLuK1aVRPMjSRxk8sq7QxH03L+YqauQtNKvF8XaPqI1a81Wz+wXSedMINkZZoCuDEi53bW65+7XX0AFFFUZdY0+G11C5kukWHTiwu3OcRbUDnP0VgfxoAvUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVgeLtRu9L02znslleRtQtojHFt3SK0gDKNxA5BxyR9aAN+iuEbx9aaR4j1IeJJJtGtPKtEtobzYx8x/PLNmJnABCDkn+HtnnsNP1XT9XtxcabfW15Cf+WlvKrj8waALdZ+u6rFoegahqs2PLs7d5iD32qTj8elaFef/ABake90PTPDMLETa9qMNo23qIg2+RvoAoz9aAL3wr0qXS/h5prXOTd3wa+uGPVnlO/J98FR+FdlTY40iiSON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", + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Convert to RDKit for visualization\n", + "mixture_mol = molify.ase2rdkit(mixture)\n", + "\n", + "# Visualize\n", + "Draw.MolToImage(mixture_mol, size=(600, 400))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Working with Packed Systems\n", + "\n", + "### Analyzing the Box" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Density: 800.0 kg/m³\n" + ] + } + ], + "source": [ + "# Calculate actual density\n", + "from molify.utils import calculate_density\n", + "\n", + "actual_density = calculate_density(mixture)\n", + "print(f\"Density: {actual_density:.1f} kg/m³\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Key Takeaways\n", + "\n", + "### What We Learned\n", + "\n", + "1. `pack()` creates periodic boxes of molecules at a target density.\n", + " - Only changes atomic positions\n", + " - Preserves all connectivity information\n", + " - Preserves bond orders, charges, etc.\n", + "\n", + "2. **Parameters**:\n", + " - `data`: List of conformer lists (one per molecule type)\n", + " - `counts`: How many of each molecule\n", + " - `density`: Target density in kg/m³\n", + "\n", + "3. **Conformers are reused** if counts > available conformers" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "molify", + "display_name": "rdkit2ase", "language": "python", "name": "python3" }, @@ -120,5 +331,5 @@ } }, "nbformat": 4, - "nbformat_minor": 5 + "nbformat_minor": 4 } diff --git a/docs/source/rdkit_tools.ipynb b/docs/source/rdkit_tools.ipynb index 8671900..3e2fdaf 100644 --- a/docs/source/rdkit_tools.ipynb +++ b/docs/source/rdkit_tools.ipynb @@ -2,197 +2,343 @@ "cells": [ { "cell_type": "markdown", - "id": "054f658b", "metadata": {}, "source": [ - "## RDKit Interface\n", + "# RDKit Interface\n", "\n", - "RDKit is a powerful cheminformatics toolkit that provides extensive functionality for molecular manipulation, analysis, and property calculation.\n", - "For more information about RDKit, please visit https://www.rdkit.org/docs/index.html" + "RDKit is a cheminformatics toolkit that provides extensive functionality for molecular manipulation, analysis, and property calculation.\n", + "\n", + "RDKit molecules contain **explicit bond information**.\n", + "\n", + "For more information about RDKit, visit https://www.rdkit.org/docs/index.html" ] }, { "cell_type": "code", "execution_count": 1, - "id": "b8f0b7ea", "metadata": {}, "outputs": [], "source": [ - "from ase.collections import g2\n", "from IPython.display import display\n", + "from rdkit import Chem\n", "\n", "import molify" ] }, { "cell_type": "markdown", - "id": "425c3dbd", "metadata": {}, "source": [ - "`molify` uses RDKit to create `ase.Atoms` objects from SMILES strings and convert them to `ase.Atoms` objects.\n", - "But you can also use `molify` to convert `ase.Atoms` objects back to RDKit `Mol` objects." + "## RDKit → ASE: connectivity key.\n", + "\n", + "When we convert from RDKit to ASE, all the bond information is preserved in the ``atoms.info['connectivity']`` object and the initial charge state of the atoms object.\n", + "The following example creates an acetic acid molecule to demonstrate this conversion." ] }, { "cell_type": "code", "execution_count": 2, - "id": "1f6afb02", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n" + "Acetic acid molecule:\n" ] }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 2, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "nitroanilin = molify.smiles2atoms(smiles=\"c1cc(c(cc1)N)N(=O)=O\")\n", - "mol = molify.ase2rdkit(nitroanilin)\n", - "print(mol)\n", - "mol" - ] - }, - { - "cell_type": "markdown", - "id": "be93181c", - "metadata": {}, - "source": [ - "For example, you can convert `ase.Atoms` objects from the `ase.collections.g2` database to RDKit `Mol` objects and display them or use any other RDKit functionality:" + "# Create acetic acid from SMILES\n", + "acetic_acid = Chem.MolFromSmiles(\"CC(=O)[O-]\")\n", + "acetic_acid = Chem.AddHs(acetic_acid) # Add explicit hydrogens\n", + "\n", + "# Display the molecule\n", + "print(\"Acetic acid molecule:\")\n", + "display(acetic_acid)" ] }, { "cell_type": "code", "execution_count": 3, - "id": "2a0e7dbc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "PH3\n" + "Number of atoms: 7\n", + "Chemical formula: C2H3O2\n", + "\n", + "Atoms object: Atoms(symbols='C2O2H3', pbc=False, initial_charges=...)\n", + "Initial charge: [ 0. 0. 0. -1. 0. 0. 0.]\n" ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "P2\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcIAAACWCAIAAADCEh9HAAAABmJLR0QA/wD/AP+gvaeTAAAJj0lEQVR4nO3deYyU9R3H8c/M7DEce3FsKOByFJTTYkChggJypKYRVGwhXWNbTQmRCNg0YAlCtKGmYP9oDbXVQtoSFVNaQBC6LUIpgVhBypECcgory7XsssBezO48/YOhw8KyzOyXmWd25v0Kfzzz7DO73+jse+d6fuNxHEcAgObyuj0AALRsZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwSXN7gFiqLtP5/4a2s7sqt0ekVyzeJicoSWmt1HmIaYbSA7p0qpH9Xp8ys+XPU3YX+TJNPwKpo2SHaioa2e/LUGa2/LnKuUceX1Pf4fQuBSpD2wWPRPpzK06o4mRou2M/tWof6RVTg8dxHLdniJlD6/TBE6Hth3+icYsjveLPMhQMSFJeT804apph7VTterepA7zp6jRIfSbqgRfUtpPpZyHpLRuu4u1NHZDeRp0Hq/9k3f+sMrMbOWBJP5UeCG3PD8rjiejnbpqnrQtD299dqb6TIh85FfCg3m3BgEp2aNM8/aqndvxGSfxXDXEQqNSJf2n9dL3VW4fWuj1NqiCjcZSRJX9e6N+t9xTqqrV+uja/6sZkaIH8ueGbU0bbm79aeU4fTNS+99yYLOUk9XOjiaZwvQpGhC86ji4e05EibV+si1+Gdm5dqILh6vW4G/OhRZl5TP688MVgnUoP6ouPtP1N1ZRLkhyteV5dhqpdL5dGTBXcG3WPx6O8r+vBFzVtj+4ZHt6/aZ57M6HF8qYpf4Aematpu5XbPbSz/qq2vO7mVKmBjCaAzGxNej/8ev3pXeE7p0C0cgo0YWn44hcfKVjn3jQpgYwmhpwCdR8Zvnjq3+6Ngpavx2PK7hrarq1Q6UFXp0l+ZDRhdOgT3q48594cSArt7wtvc3OKMTKaMG5813Sw3r05kBS8N9ycHG5OsUVGE8bF4+HtNvnuzYGkUM7NKX7IaGKoKdfxTeGLnQe7NwpavrN7VXY4tJ3epsHzRYiBlHnf6JWzOv15xEfH91Qix9GGGaq9FLrYoU+DJ7aAqNRVa9208MVe37rtog1ndkX6Pa+csU6V1FImo3uXa+9yt4e4hePo1KfaPF/HNoZ3jr7NG/2qSuMzFBLCtdVGohKs09Eibfypzu0L7fH4NGrBbY9/x7bsDq5LmYwmgqKX5c8NbQfrVVOu8uOqbbhgzwMvqO8zjVy3vlaLO8Z8QiSOHmP03MamDljxlHzpoe36q6ouV/lRBaoaHDNukfIHxmpCXEdG46hkZ1Nf9Xg1dKbGLbrNojseVidLLf6cOxxwYktTX03za+wvNHTGXZwIt5MyGW3eQnnxkd5afZ7U0Jnq8tBtj/FlaDYP6hEBf57uL9TQmXc+lb55C+XhFimT0UQwZFr4ZGePV/5c+XPVrrfyB8jL/whEaeQCpbcKbXvTQzen/P5qd2+kccRdwm9vHA0sbLDCE2AxbGaDFZ7gHt43CgAmZBQATMgoAJiQUQAwIaMAYMIr9c1VXab9K1V2WJdLlJmt/IHq+zSfkIzU5Tg6sUUnt6ripOoDyu6inmPVbVQqvPuKjEavrkafzNXnv7v5xLuiH2v0axo+x6WxAPcc36QNL+n8/gY7t/5cXYfpmQ+VU+DSWHFCRqPk1GvFRB39uyS1663ej6tNvsqO6MAq1VZo4yvyZWrYLLenBOLo8Mda8ZSCAfkydd8EdeynQJW+/KdKduirT7V8nKbuVEaW21PGEBmN0s7fhho66jU9+mr4AcvIBXpniKovaPN8DfpBeAkSILkFKrX6hwoG1LGfvrdOuT1C+x1H66dr59u6cEifLdGIV1ydMrZ4iSlK3UZqYKG+8X2NnN/gSZ/c7hoxR5KuXm6w6h2Q3DxePTpPHftpyupwQyV5PBr7hjJzJOnAX92aLj48jhPfJYrjKRhQzfVl6NJbK711pFesvqBr/1m8vijOtyvepmUjJGnMG+G/vYEq1deGtjOyOHceJlcvhz8tOTO3Oa/e1FwMf4fWHSK9VqAq/EpAZrZ8GZFecdlwFW+XP09zyqKZsoVJ6t9qb3oUN5QbNW9Juv8/kL/xE8SiyjfQNPszjM17uqnZN+Nr90KS/TP1eFB/95QdCW0k++uSQKSu/VIk+28EGb17Dq6RJHnU4zGXJwESwfn9unBIknqOdXuU2CKjd8mlYu17X5L6PKmsLm5PAySAbYskRx6fhky788EtGRm9G4J1+kuh6muV1kpjWCQckA6u0p4/SdLgqUn/Sbdk1Mxx9LdZOrlVksa/qQ593R4IcNvZPVrzvOSoY3+Nj/jDe1osMmrjOCqapR1LJGnYy3rwRbcHAtx2Zrf+OEY1F5XVWYUfK72N2wPFXFK/4SnW6mu1bpp2/0GSHnpJ43/p8jyA645v0p+/o+oyZXfVc58op5vbA8UDGW2uynP68GkVb5PHq9Gva8TcVFjJBmjKzre1YaaCAXUapMmrwh/gmOzIaLMUb9fKKbpUrMwcTXpPvb/t9kCAqwJV2jBD/1kqSQOmaMLSlDrrhIxGyXH02a/1j9mqv6r292rKal5TQqorPaiVk3V2rzw+jVmoh2en2iOzpD6nPhbW/ki7fh/abtup8T+57Xrp2aJ4DgW45sxuLRuhQKUkpbVS1tcaP+yJd5P4tBTujUbp2lkZ11w50/gxaf74zAK479JXoYZKqqtW+bHGD7tpjfPkwr3RKJXsVM3FOxyT0UZdvxmXaQC3VZXqzO47H9ZpUDPXCWoJyCgAmPD2ewAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKACRkFABMyCgAmZBQATMgoAJiQUQAwIaMAYEJGAcCEjAKAyf8AO37+BBZlOjMAAABXelRYdHJka2l0UEtMIHJka2l0IDIwMjQuMDkuNgAAeJx7v2/tPQYgEABiJgYIANGMQNzAyM+QAGIzwWhuoLgTSIm4ElQNTIPDfqB6FQjXwR7IXgJiiQEA0LwImZIKtewAAACYelRYdE1PTCByZGtpdCAyMDI0LjA5LjYAAHic41IAgSAX78wSBTgwcuHiUlAwwIMsLS0VwowNDAy4fBVADAUnV3dPPwXnEEcnmIizf6hfSLCCkYIhUAcQoqp0DPH3hYkYKgQo6BromZsCzQMq1DMwQGPAFBoBFcLV6eJR6OrngmIDxE4nfz8XhJ0gaISsAVkaxId5BsjmAgDzLTk8e+EJSQAAADF6VFh0U01JTEVTIHJka2l0IDIwMjQuMDkuNgAAeJwLCFCo0dA10DM31THQsYbSmjUAPkMFFh7hLaAAAAAASUVORK5CYII=", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, + } + ], + "source": [ + "# Convert to ASE\n", + "acetic_acid_atoms = molify.rdkit2ase(acetic_acid)\n", + "\n", + "print(f\"Number of atoms: {len(acetic_acid_atoms)}\")\n", + "print(f\"Chemical formula: {acetic_acid_atoms.get_chemical_formula()}\")\n", + "print(f\"\\nAtoms object: {acetic_acid_atoms}\")\n", + "print(f\"Initial charge: {acetic_acid_atoms.get_initial_charges()}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The `connectivity` Data Structure\n", + "\n", + "The bond information is stored in `atoms.info['connectivity']` as a list of tuples:\n", + "\n", + "```python\n", + "[(atom_idx_1, atom_idx_2, bond_order), ...]\n", + "```\n", + "\n", + "Where:\n", + "- **atom_idx_1, atom_idx_2**: 0-based integer atom indices\n", + "- **bond_order**: Float representing bond type:\n", + " - `1.0` = single bond\n", + " - `2.0` = double bond \n", + " - `3.0` = triple bond\n", + " - `1.5` = aromatic bond\n", + " - `None` = unknown bond order\n", + "\n", + "The following examines the connectivity:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": "# Display the connectivity information\nconnectivity = acetic_acid_atoms.info[\"connectivity\"]\nprint(\"Connectivity structure:\")\nprint(f\"Total bonds: {len(connectivity)}\\n\")\n\nfor i, (atom1, atom2, bond_order) in enumerate(connectivity):\n symbol1 = acetic_acid_atoms.get_chemical_symbols()[atom1]\n symbol2 = acetic_acid_atoms.get_chemical_symbols()[atom2]\n print(\n f\" Bond {i}: atom {atom1} ({symbol1}) - \"\n f\"atom {atom2} ({symbol2}), order = {bond_order}\"\n )" + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CH3CHO\n" + "Original SMILES: [H]C([H])([H])C(=O)[O-]\n", + "\n", + "All info keys: ['smiles', 'connectivity']\n" ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, + } + ], + "source": [ + "# The SMILES string is also stored for convenience\n", + "print(f\"Original SMILES: {acetic_acid_atoms.info['smiles']}\")\n", + "print(f\"\\nAll info keys: {list(acetic_acid_atoms.info.keys())}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Key Insight\n", + "\n", + "When converting from RDKit to ASE, **all bond information is explicit**:\n", + "- ✅ Bond connectivity is known\n", + "- ✅ Bond orders are known\n", + "- ✅ Formal charges are preserved\n", + "- ✅ SMILES string is stored" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RDKit → NetworkX: Understanding Graph Structure\n", + "\n", + "NetworkX provides a graph-based representation that's useful for analyzing molecular topology, finding cycles, and understanding connectivity patterns.\n", + "\n", + "The following converts the same acetic acid molecule to a NetworkX graph:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "H2COH\n" + "Number of nodes (atoms): 7\n", + "Number of edges (bonds): 6\n" ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, + } + ], + "source": [ + "import networkx as nx\n", + "\n", + "# Convert to NetworkX graph\n", + "acetic_acid_graph = molify.rdkit2networkx(acetic_acid)\n", + "\n", + "print(f\"Number of nodes (atoms): {acetic_acid_graph.number_of_nodes()}\")\n", + "print(f\"Number of edges (bonds): {acetic_acid_graph.number_of_edges()}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Node Attributes: Atom Properties\n", + "\n", + "Each node in the graph represents an atom with these attributes:\n", + "- `atomic_number`: Element atomic number (e.g., 6 for carbon, 8 for oxygen)\n", + "- `original_index`: Index from the RDKit molecule\n", + "- `charge`: Formal charge on the atom\n", + "\n", + "The following examines a few nodes:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CS\n" + " Node 0: 6 (Z=6), charge=0\n", + " Node 1: 6 (Z=6), charge=0\n", + " Node 2: 8 (Z=8), charge=0\n", + " Node 3: 8 (Z=8), charge=-1\n", + " Node 4: 1 (Z=1), charge=0\n", + " Node 5: 1 (Z=1), charge=0\n", + " Node 6: 1 (Z=1), charge=0\n" ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcIAAACWCAIAAADCEh9HAAAABmJLR0QA/wD/AP+gvaeTAAAKYUlEQVR4nO3df0yc9R3A8ee5H3BwBxxnQRRyTYvo/EVGQLa1yShJu9ZkKRXdHFvDjGFu+2Nqmmhcis7pssVolk6tjQhJ23XOZH+0JnWrdWaLmdvakEl/CNpKKQIFLhweB3ccHHfP/rjukdSCox+Oh+ee9+uv7/Pcc9fPX+/e3fPcg6ppmgIAuFY2owcAAHMjowAgQkYBQISMAoAIGQUAETIKACJkFABEyCgAiJBRABAhowAgQkYBQISMAoAIGQUAETIKACJkFABEyCgAiJBRABAhowAgQkYBQISMAoAIGQUAETIKACJkFABEyCgAiJBRABAhowAgQkYBQMRh9ABmEg4fDwZ/b/QU1jI6esPevcNGT2Et1dXVjz76qNFTmAkZXYJY7KPx8UNGT2EtkcjGQ4feN3oKa5mcnCSjS6Jqmmb0DKYRi30ciZw0egprCQZzTpyYNnoKa/H7/XV1dUZPYSZkFABEOMUEACJkFABEyCgAiJBRABAhowAgQkYBQISMAoAIGQUAETIKACJkFABEyCgAiJBRABAhowAgQkYBQISMAoAIGQUAETIKACJkFABEyCgAiJBRABAhowAgQkYBQISMAoAIGQUAETIKACJkFABEyCgAiJBRABBxGD3AMkgkQonEpN3usdsL/v//GAYHd83MXCgq+ml+/ta0jgdYRzgcHhoaCgaDoVDI6/UWFxf7/X6Xy2X0XOll1oxOTf1zfPzg1NS/YrEPNS2R2mmzuVyuW93uDQUFW/Pzv6Wq2Yu8wuTk36LRrvz8bSsyL5DJLl682NHR8c4773R2diYSifkPuVyuLVu23HvvvU1NTVlZWUZNmFaqpmlGz7A0s7OfXrz4w8nJvy9+mMPhW7v2Na+3caEDenqqotEuv39fUdFPlnlEwDKCweDTTz/d1tY2Ozu7+JHr16/v6OjYtGnTisy1okz23ejMzCc9PXd9aUMVRZmbG3c41qR/IsC6+vr6Nm7c+PLLL3+xoTbblW25cOHC5s2bOzo6Vmq6lWOmD/WaFv/kk+1zc4H/7bB5vTsKC+9xuW612wuTyejsbH802hkKHYlGuxwOn9u9wchxgYzW39+/YcOGkZERfU9FRcWDDz64bdu28vLyvLy8SCTS29t79OjR9vb2vr4+RVESicRDDz1UVla2dWtGnZAw04f6sbG2/v4fp9Z2e2F5+eG8vLqrHjkzc356usfr3T5/5/j4G3Nzo/rmyMjz8fhQYeF3PZ7Pa5ube9f8TQBXlUwm6+vr33vvvdSmzWZ75plnHnvssat++xmNRnfv3r1nzx5FUe677779+/e73W5FUTRNa2pqWuifqK2t3bVrV3rGX2Zmyui5c/X6x/l16w75fD9Y0tN7eqqj0f8sfkxJyROlpb+5tvEA63jppZcefvjh1FpV1ba2tpaWlsWf8tRTTzmdztbWVlVVU3uSyaTdbl/o+B07dhw+fHi5Bk4rM2X0gw9yk8lpRVFU1VlVNbn4ifgvCgYPxOOffwAJBF6Mxy95vfe43V/Td3o83/B4vrlcAwMZSdO0W2655fz586nN5ubmAwcOXNtLvfDCCws9VFFR0dDQcG0vu8JMk9FEYrKrKz+1ttk8VVWTwhfkTD1wbY4dO3b33Xen1i6Xq7+/v7i42NiRjGWaM/U2m0tVL7//Tyan4vHRxY8HkCZHjx7V19u3b7d4QxUTZVRVnQ5Hib4ZCOwxcBjAyk6ePKmvGxsXvDTbOkyTUUVRcnOr9PXIyHMjI8/pv18CsDJmZmZOnTqlb1ZXVxs4zCphpowWF/9s3pY2NPRET89XA4HfzbuSdAlyc+/Ky9uUlVW6XOMBVhAIBPSL7XNzc8vLy42dZzUwzSmmlKGh3SMjv75ip6o68vO3+nxNXm+DzeYxZDDAIs6cOVNZWZlal5WVDQwMGDvPamCmXzEpilJa+iu73XPp0i81bUbfqWlzExNvTUy8ZbPl+nzfv/76XS7Xren41wOBFwcGHknHK2MhodDGzZvfN3oKa2loaDhy5MhCj4ZCIX2dl5e3IhOtdmb6UK8oiqKoJSU/v/32s8XFj9jthVc8lkxGx8bau7vvvHTpF5o2Z8h8QGabfwOnL/5w3ppM9qF+Pk2bDYf/+tlnfwqFDicSE1c8umZNy9q1rxkyGJDBurq6qqoun+z1+/39/f3GzrMamDijumQyFg7/ORj8Qyh0RFGS+v61a9vWrPmRgYMBmaevr2/9+vWpdUFBwfzP+JaVCRnVRaOdvb33zM4OpjadzhvuvHNAv2gfgNzU1FRBQUEyefn9yvDwcElJyeJPyXgZ9dVGbm7NTTcdU9XL583i8eFI5ISxIwEZxuPx3HzzzfpmV1eXgcOsEhmVUUVRcnJuLyj4tr4Zi31o4DBARqqtrdXXx48fN3CSVSLTMqooyvyrnRIJvrgBlll9fb2+fv311+fmrH5VTAZmdP4lpTYb17UBy+z+++/3+Xyp9ejo6CuvvGLsPIbLwIxOTf1DX2dllRk4CZCRcnJympub9c3W1lb93qPWZKaM6qfgFxEKvRmJXL79jKpmcQ9mIB2efPLJG2+8MbWenJysq6s7e/bslz6rs7MzzXMZw0QZ1c6dq+vurhwd/e3s7KdXPWJ8/I2+vp36ZmHhd+z2/JUaD7AQn8/X3t6u/zmQ4eHhmpqaxx9/fHDwKu91xsbGXn311Zqamtra2ox832qa60YjkZMffaT/tQ/V7a51u7+enV1us7k1bXZm5vzExF9isR79eIfjuttuO+V0cgMnIF0OHjzY0tISj8fn76ysrLzjjjuKiopsNtvY2FhXV1d3d7f+E9LW1tZnn33WiGHTyDS3JgmF5v9xKy0SObHINaEOx3UVFcdpKJBWzc3NJSUlLS0t8+/zdPr06dOnTy/0lIy8ztQ070Y1LR4OHx8f/2Mo9GYyObXQYarq9Pm+V1r6vNN5/UqOB1hWLBbbu3fvvn37ent7FzomOzt7y5YtDzzwQGNjo/5VQMYwTUZ1yWQ0HH47Evn39PSZeDyQSEyoqtPhKMzOrnC7a73eRqfT6j9NAwzR29v77rvvDg4OBgKB8fFxj8dTUFCwbt26ysrK6urqDL6rnvkyCgCrionO1APAakRGAUCEjAKACBkFABEyCgAiZBQARMgoAIiQUQAQIaMAIEJGAUCEjAKACBkFABEyCgAiZBQARMgoAIiQUQAQIaMAIEJGAUCEjAKACBkFABEyCgAiZBQARMgoAIiQUQAQIaMAIEJGAUCEjAKACBkFABGH0QOYSSz2cSRy0ugprCUYzDlxYtroKazF7/fX1dUZPYWZkNElCIffHhh4xOgprCUU2tjc/L7RU1hLQ0MDGV0SMroELtdXfL6dRk9hLfH4DTt3rjN6Cmuprq42egSTUTVNM3oGADAxTjEBgAgZBQARMgoAImQUAETIKACIkFEAECGjACBCRgFAhIwCgAgZBQARMgoAImQUAETIKACIkFEAECGjACBCRgFAhIwCgAgZBQARMgoAImQUAETIKACIkFEAECGjACBCRgFAhIwCgAgZBQARMgoAIv8F8okH1HxHd+QAAABaelRYdHJka2l0UEtMIHJka2l0IDIwMjQuMDkuNgAAeJx7v2/tPQYgEABiJgYIANGMQNzAyMagBaT/MzELgBmMTMzcDIwczE4gVeJKUGUwPQ72DHDgsB/GEgMA6ccHbOlsI+cAAACgelRYdE1PTCByZGtpdCAyMDI0LjA5LjYAAHic41IAgSAX78wSBTgwcuHiUlAwwIMsLS0VwowNDAy4fBVADAUnV3dPPwXnEEcnmIizf6hfSLCCkYIhUAcQoqp0DPH3hYkYKjgrGOiZmwKNA6rTMzBAYyg4e7jb6hrClBspBCvoElQPV+7q54JiG8R+J38/F4T9xkBshKwBWRrEh3kMyOYCAMw4O/RaOt2NAAAAOHpUWHRTTUlMRVMgcmRraXQgMjAyNC4wOS42AAB4nIt21o1Vjg7WjlWo0TDQMzfVMdCx1oUyNGsAcW8G9/Qaqp4AAAAASUVORK5CYII=", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, + } + ], + "source": [ + "for node_id in list(acetic_acid_graph.nodes):\n", + " attrs = acetic_acid_graph.nodes[node_id]\n", + " atomic_num = attrs[\"atomic_number\"]\n", + " symbol = acetic_acid_graph.nodes[node_id][\"atomic_number\"]\n", + " print(f\" Node {node_id}: {symbol} (Z={atomic_num}), charge={attrs['charge']}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Edge Attributes: Bond Information\n", + "\n", + "Each edge represents a bond with:\n", + "- `bond_order`: The bond type (1.0, 2.0, 3.0, or 1.5 for aromatic)\n", + "\n", + "When converting from RDKit, `bond_order` is always present." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": "# Display edge attributes (bonds)\nfor i, (node1, node2, attrs) in enumerate(list(acetic_acid_graph.edges(data=True))):\n symbol1 = acetic_acid_graph.nodes[node1][\"atomic_number\"]\n symbol2 = acetic_acid_graph.nodes[node2][\"atomic_number\"]\n bond_order = attrs[\"bond_order\"]\n print(\n f\" Edge {i}: (z={symbol1},id=({node1})) - \"\n f\"(z={symbol2},id=({node2})), bond_order={bond_order}\"\n )" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using NetworkX for Molecular Analysis (WHY IS THIS HERE?)\n", + "\n", + "The following creates a more interesting molecule - benzene - to demonstrate graph analysis:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": "# Create benzene\nbenzene_mol = Chem.MolFromSmiles(\"c1ccccc1\")\nbenzene_mol = Chem.AddHs(benzene_mol)\n\nprint(\"Benzene molecule:\")\ndisplay(benzene_mol)\n\n# Convert to graph\nbenzene_graph = molify.rdkit2networkx(benzene_mol)\nprint(\n f\"\\nNodes: {benzene_graph.number_of_nodes()}, \"\n f\"Edges: {benzene_graph.number_of_edges()}\"\n)" + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "OCHCHO\n" + "Number of cycles found: 1\n", + "\n", + "Aromatic ring (6-membered): [4, 3, 2, 1, 0, 5]\n", + "\n", + "Bond orders in the aromatic ring:\n", + " C4 - C3: 1.5 (aromatic)\n", + " C3 - C2: 1.5 (aromatic)\n", + " C2 - C1: 1.5 (aromatic)\n", + " C1 - C0: 1.5 (aromatic)\n", + " C0 - C5: 1.5 (aromatic)\n", + " C5 - C4: 1.5 (aromatic)\n" ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, + } + ], + "source": [ + "# Find all cycles in benzene\n", + "cycles = nx.cycle_basis(benzene_graph)\n", + "print(f\"Number of cycles found: {len(cycles)}\\n\")\n", + "\n", + "# The aromatic ring should be the largest cycle\n", + "aromatic_ring = max(cycles, key=len)\n", + "print(f\"Aromatic ring (6-membered): {aromatic_ring}\")\n", + "\n", + "# Check bond orders in the aromatic ring\n", + "print(\"\\nBond orders in the aromatic ring:\")\n", + "for i in range(len(aromatic_ring)):\n", + " node1 = aromatic_ring[i]\n", + " node2 = aromatic_ring[(i + 1) % len(aromatic_ring)]\n", + " if benzene_graph.has_edge(node1, node2):\n", + " bond_order = benzene_graph[node1][node2][\"bond_order\"]\n", + " print(f\" C{node1} - C{node2}: {bond_order} (aromatic)\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Working with Complex Molecules\n", + "\n", + "The following examines a more complex molecule with different bond types - aspirin:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "C3H9C\n" + "Aspirin molecule:\n" ] }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -202,48 +348,83 @@ "name": "stdout", "output_type": "stream", "text": [ - "CH3COF\n" + "\n", + "Atoms(symbols='C2O2C7O2H8', pbc=False)\n" ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, + } + ], + "source": [ + "# Create aspirin\n", + "aspirin_smiles = \"CC(=O)Oc1ccccc1C(=O)O\"\n", + "aspirin_mol = Chem.MolFromSmiles(aspirin_smiles)\n", + "aspirin_mol = Chem.AddHs(aspirin_mol)\n", + "\n", + "print(\"Aspirin molecule:\")\n", + "display(aspirin_mol)\n", + "\n", + "# Convert to ASE\n", + "aspirin_atoms = molify.rdkit2ase(aspirin_mol)\n", + "print(f\"\\n{aspirin_atoms}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CH3CH2OCH3\n" + "Bond type distribution in aspirin:\n", + " single bonds (order=1.0): 13\n", + " aromatic bonds (order=1.5): 6\n", + " double bonds (order=2.0): 2\n" ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, + } + ], + "source": [ + "# Analyze bond types in aspirin\n", + "from collections import Counter\n", + "\n", + "connectivity = aspirin_atoms.info[\"connectivity\"]\n", + "bond_orders = [bond_order for _, _, bond_order in connectivity]\n", + "bond_counts = Counter(bond_orders)\n", + "\n", + "print(\"Bond type distribution in aspirin:\")\n", + "for bond_order, count in sorted(bond_counts.items()):\n", + " bond_type = {1.0: \"single\", 1.5: \"aromatic\", 2.0: \"double\", 3.0: \"triple\"}.get(\n", + " bond_order, \"unknown\"\n", + " )\n", + " print(f\" {bond_type} bonds (order={bond_order}): {count}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Converting Back: ASE/NetworkX → RDKit\n", + "\n", + "When we have explicit connectivity information (from RDKit originally), converting back is straightforward:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "HCOOH\n" + "Original molecule:\n" ] }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -253,14 +434,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "HCCl3\n" + "\n", + "Round-trip molecule (ASE → RDKit):\n" ] }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -268,25 +450,47 @@ } ], "source": [ - "for idx, (atoms, name) in enumerate(zip(g2, g2.names)):\n", - " print(name)\n", - " display(molify.ase2rdkit(atoms, suggestions=[]))\n", - " if idx == 10:\n", - " break" + "# ASE → RDKit (round-trip)\n", + "aspirin_roundtrip = molify.ase2rdkit(aspirin_atoms)\n", + "\n", + "print(\"Original molecule:\")\n", + "display(aspirin_mol)\n", + "\n", + "print(\"\\nRound-trip molecule (ASE → RDKit):\")\n", + "display(aspirin_roundtrip)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Key Takeaways\n", + "\n", + "### What We Learned\n", + "\n", + "1. **RDKit has explicit bond information**\n", + "\n", + "2. **ASE stores connectivity** in `atoms.info['connectivity']` as:\n", + " ```python\n", + " [(atom_idx_1, atom_idx_2, bond_order), ...]\n", + " ```\n", + "\n", + "3. **NetworkX graphs** store:\n", + " - Nodes: `atomic_number`, `original_index`, `charge`\n", + " - Edges: `bond_order` (always present from RDKit)\n", + "\n", + "4. **Conversions from RDKit are lossless** - all chemical information is preserved" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "0a547437", + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "molify", + "display_name": "rdkit2ase", "language": "python", "name": "python3" }, @@ -304,5 +508,5 @@ } }, "nbformat": 4, - "nbformat_minor": 5 + "nbformat_minor": 4 } diff --git a/external/packmol b/external/packmol new file mode 160000 index 0000000..7cb4c14 --- /dev/null +++ b/external/packmol @@ -0,0 +1 @@ +Subproject commit 7cb4c1470652823d4470056e8d3cd08dceca1a21 diff --git a/hatch_build.py b/hatch_build.py new file mode 100644 index 0000000..fafb054 --- /dev/null +++ b/hatch_build.py @@ -0,0 +1,116 @@ +"""Custom Hatchling build hook to compile packmol binary.""" + +import glob +import shutil +import subprocess +from pathlib import Path + +from hatchling.builders.hooks.plugin.interface import BuildHookInterface + + +class CustomBuildHook(BuildHookInterface): + """Build hook that compiles packmol and includes it in the wheel.""" + + def _find_gfortran(self): + """Find gfortran compiler (plain or versioned like gfortran-15).""" + # Try plain gfortran first + gfortran = shutil.which("gfortran") + if gfortran: + return gfortran + + # Look for versioned gfortran (e.g., gfortran-15 on macOS via Homebrew) + # Common locations: /opt/homebrew/bin, /usr/local/bin, /usr/bin + search_paths = [ + "/opt/homebrew/bin/gfortran-*", + "/usr/local/bin/gfortran-*", + "/usr/bin/gfortran-*", + ] + + for pattern in search_paths: + matches = glob.glob(pattern) + if matches: + # Sort to get the highest version number + matches.sort(reverse=True) + return matches[0] + + raise RuntimeError( + "gfortran compiler not found. Please install it:\n" + " macOS: brew install gcc\n" + " Ubuntu/Debian: apt-get install gfortran\n" + " RHEL/CentOS: yum install gcc-gfortran" + ) + + def initialize(self, version, build_data): + """Compile packmol before building the wheel.""" + # Paths + project_root = Path(self.root) + packmol_source = project_root / "external" / "packmol" + binaries_dir = project_root / "src" / "molify" / "binaries" + target_binary = binaries_dir / "packmol" + + # Ensure binaries directory exists + binaries_dir.mkdir(parents=True, exist_ok=True) + + # Verify packmol source exists + if not packmol_source.exists(): + raise RuntimeError( + f"Packmol source not found at {packmol_source}. " + "Run: git submodule update --init --recursive" + ) + + # Find gfortran compiler + gfortran_path = self._find_gfortran() + print(f"Using gfortran: {gfortran_path}") + + # Compile packmol + print("Compiling packmol...") + try: + # Clean previous build artifacts + subprocess.run( + ["make", "clean"], + cwd=packmol_source, + check=False, # Don't fail if clean fails + capture_output=True, + ) + + # Override FORTRAN variable to use detected gfortran + # Note: Not using -j4 due to Fortran module dependencies + result = subprocess.run( + ["make", f"FORTRAN={gfortran_path}"], + cwd=packmol_source, + check=True, + capture_output=True, + text=True, + ) + print(result.stdout) + except subprocess.CalledProcessError as e: + print(f"Compilation failed!\nstdout: {e.stdout}\nstderr: {e.stderr}") + raise RuntimeError(f"Failed to compile packmol: {e}") from e + + # Verify and copy the compiled binary + # (packmol on Unix, packmol.exe on Windows) + source_binary = packmol_source / "packmol" + if not source_binary.exists(): + source_binary = packmol_source / "packmol.exe" + if not source_binary.exists(): + raise RuntimeError( + "Compilation succeeded but binary not found at " + f"{packmol_source / 'packmol'} or " + f"{packmol_source / 'packmol.exe'}" + ) + + shutil.copy2(source_binary, target_binary) + target_binary.chmod(0o755) + print(f"Successfully compiled packmol -> {target_binary}") + + # Include binary in the wheel using force_include + relative_path = target_binary.relative_to(project_root / "src") + build_data.setdefault("force_include", {})[str(target_binary)] = str( + relative_path + ) + + # Mark wheel as platform-specific (not pure Python) + # This tells hatchling to create platform-specific wheel tags + # like cp310-macosx_14_0_arm64 instead of py3-none-any + build_data["pure_python"] = False + build_data["infer_tag"] = True diff --git a/molify/substructure.py b/molify/substructure.py deleted file mode 100644 index 4c0658c..0000000 --- a/molify/substructure.py +++ /dev/null @@ -1,503 +0,0 @@ -import typing as tp - -import ase -import matplotlib.pyplot as plt -from ase.build import separate -from rdkit import Chem -from rdkit.Chem import Draw - -from molify.ase2x import ase2rdkit -from molify.utils import find_connected_components - - -def match_substructure( - atoms: ase.Atoms, - smiles: str | None = None, - smarts: str | None = None, - mol: Chem.Mol | None = None, - fragment: ase.Atoms | None = None, - **kwargs, -) -> tuple[tuple[int, ...]]: - """ - Find all matches of a substructure pattern in a given ASE Atoms object. - - Parameters - ---------- - atoms : ase.Atoms - The molecule or structure in which to search for substructure matches. - smiles : str, optional - A SMILES string representing the substructure pattern to match. - smarts : str, optional - A SMARTS string representing the substructure pattern to match. - mol : Chem.Mol, optional - An RDKit Mol object representing the substructure pattern to match. - fragment : ase.Atoms, optional - An ASE Atoms object representing the substructure pattern to match. - If provided, it will be converted to an RDKit Mol object for matching. - **kwargs - Additional keyword arguments passed to `ase2rdkit`. - - Returns - ------- - tuple of tuple of int - A tuple of atom index tuples, each corresponding to one match of the pattern. - - """ - pattern = None - if smiles is not None: - pattern = Chem.MolFromSmiles(smiles) - pattern = Chem.AddHs(pattern) # Ensure hydrogens are added for matching - if smarts is not None: - if pattern is not None: - raise ValueError("Can only specify one pattern") - pattern = Chem.MolFromSmarts(smarts) - if mol is not None: - if pattern is not None: - raise ValueError("Can only specify one pattern") - pattern = mol - if fragment is not None: - if pattern is not None: - raise ValueError("Can only specify one pattern") - pattern = ase2rdkit(fragment, **kwargs) - if pattern is None: - raise ValueError("Must specify a pattern") - - Chem.SanitizeMol(pattern) - - mol = ase2rdkit(atoms, **kwargs) - matches = mol.GetSubstructMatches(pattern) - return matches - - -def get_substructures( - atoms: ase.Atoms, - **kwargs, -) -> list[ase.Atoms]: - """ - Extract all matched substructures from an ASE Atoms object. - - Parameters - ---------- - atoms : ase.Atoms - The structure to search in. - smarts : str, optional - A SMARTS string to match substructures. - smiles : str, optional - A SMILES string to match substructures. - mol : Chem.Mol, optional - An RDKit Mol object to match substructures. - fragment : ase.Atoms, optional - A specific ASE Atoms object to match against the structure. - **kwargs - Additional keyword arguments passed to `match_substructure`. - - Returns - ------- - list of ase.Atoms - List of substructure fragments matching the pattern. - """ - return [atoms[match] for match in match_substructure(atoms, **kwargs)] - - -def iter_fragments(atoms: ase.Atoms) -> list[ase.Atoms]: - """ - Iterate over connected molecular fragments in an ASE Atoms object. - - If a 'connectivity' field is present in `atoms.info`, it will be used - to determine fragments. Otherwise, `ase.build.separate` will be used. - - Parameters - ---------- - atoms : ase.Atoms - A structure that may contain one or more molecular fragments. - - Yields - ------ - ase.Atoms - Each connected component (fragment) in the input structure. - """ - if "connectivity" in atoms.info: - # connectivity is a list of tuples (i, j, bond_type) - connectivity = atoms.info["connectivity"] - for component in find_connected_components(connectivity): - yield atoms[list(component)] - else: - for molecule in separate(atoms): - yield molecule - - -def select_atoms_grouped( # noqa: C901 - mol: Chem.Mol, - smarts_or_smiles: str, - hydrogens: tp.Literal["include", "exclude", "isolated"] = "exclude", -) -> list[list[int]]: - """Selects atom indices using SMARTS or SMILES, grouped by disconnected fragments. - - This function identifies all substructure matches and returns a list of atom index - lists. Each inner list corresponds to a unique, disconnected molecular fragment - that contained at least one match. - - If the pattern contains atom maps (e.g., "[C:1]", "[C:2]"), only the mapped atoms - are returned, ordered by their map numbers. Map numbers must be unique within - the pattern. Otherwise, all atoms in the matched substructures are returned. - - Parameters - ---------- - mol : rdchem.Mol - RDKit molecule, which can contain multiple disconnected fragments and - explicit hydrogens. - smarts_or_smiles : str - SMARTS pattern (e.g., "[F]") or SMILES with atom maps - (e.g., "CC(=O)N[C:1]([C:2])[C:3](=O)[N:4]C"). When using mapped atoms, - map numbers must be unique. - hydrogens : {'include', 'exclude', 'isolated'}, default='exclude' - How to handle hydrogens in the final returned list for each group: - - 'include': Add hydrogens bonded to selected heavy atoms after each - mapped atom. - - 'exclude': Remove all hydrogens from the selection. - - 'isolated': Returns only the hydrogens that are bonded - to selected heavy atoms. - - - Returns - ------- - list[list[int]] - A list of integer lists. Each inner list contains the atom indices - for a matched, disconnected fragment. For mapped patterns, atoms are ordered - by their map numbers. Fragments with no matches are omitted from the output. - - Raises - ------ - ValueError - If the provided SMARTS/SMILES pattern is invalid or if atom map labels - are used multiple times within the same pattern. - - Examples - -------- - >>> # Molecule with two disconnected fragments: ethanol and fluoromethane - >>> mol = Chem.MolFromSmiles("CCO.CF") # Indices: C(0)C(1)O(2) . C(3)F(4) - >>> - >>> # Select all carbon atoms - >>> select_atoms_grouped(mol, "[C]") - [[0, 1], [3]] - >>> - >>> # Select fluorine and its bonded carbon using 'include' - >>> select_atoms_grouped(mol, "[F]", hydrogens="include") - [[3, 4]] - - """ - patt = Chem.MolFromSmarts(smarts_or_smiles) - if patt is None: - # Support mapped SMILES patterns too - patt = Chem.MolFromSmiles(smarts_or_smiles) - if patt is None: - raise ValueError(f"Invalid SMARTS/SMILES: {smarts_or_smiles}") - - # Get mapped indices from the pattern, if any, and validate uniqueness - mapped_pattern_indices = [] - atom_map_numbers = [] - for atom in patt.GetAtoms(): - if atom.GetAtomMapNum() > 0: - map_num = atom.GetAtomMapNum() - if map_num in atom_map_numbers: - raise ValueError(f"Label '{map_num}' is used multiple times") - atom_map_numbers.append(map_num) - mapped_pattern_indices.append(atom.GetIdx()) - - # If we have mapped atoms, we need to sort them by their - # map numbers to preserve order - if mapped_pattern_indices: - # Create pairs of (map_number, pattern_index) and sort by map_number - map_index_pairs = [ - (patt.GetAtomWithIdx(idx).GetAtomMapNum(), idx) - for idx in mapped_pattern_indices - ] - map_index_pairs.sort(key=lambda x: x[0]) # Sort by map number - mapped_pattern_indices = [idx for _, idx in map_index_pairs] - - # Find all matches in the entire molecule just once for efficiency - all_matches = mol.GetSubstructMatches(patt) - if not all_matches: - return [] - - # Get the indices of atoms in each disconnected fragment - fragment_sets = [set(frag) for frag in Chem.GetMolFrags(mol, asMols=False)] - - grouped_indices = [] - for fragment_atom_indices in fragment_sets: - # Filter matches to include only those fully contained within the fragment - fragment_matches = [ - match for match in all_matches if set(match).issubset(fragment_atom_indices) - ] - - if not fragment_matches: - continue - - # 1. Get the core set of atoms for this fragment. If the pattern is mapped, - # use only the indices corresponding to mapped atoms. Otherwise, use all. - if mapped_pattern_indices: - # For mapped patterns, preserve the order of atoms based - # on their map numbers - core_atom_indices_ordered = [] - for match_tuple in fragment_matches: - match_atoms = [ - match_tuple[pattern_idx] for pattern_idx in mapped_pattern_indices - ] - core_atom_indices_ordered.extend(match_atoms) - # Remove duplicates while preserving order - seen = set() - core_atom_indices_ordered = [ - x for x in core_atom_indices_ordered if not (x in seen or seen.add(x)) - ] - core_atom_indices = set(core_atom_indices_ordered) - else: - core_atom_indices = { - idx for match_tuple in fragment_matches for idx in match_tuple - } - core_atom_indices_ordered = sorted(core_atom_indices) - - if not core_atom_indices: - continue - - # 2. Handle the `hydrogens` parameter for this fragment's core atoms - if hydrogens not in ("include", "exclude", "isolated"): - raise ValueError( - f"Invalid value for `hydrogens`: {hydrogens!r}. " - "Expected one of 'include', 'exclude', 'isolated'." - ) - - if hydrogens == "include": - # Include both core atoms and their hydrogens, maintaining order - final_indices_ordered = [] - for idx in core_atom_indices_ordered: - # Add the core atom first - final_indices_ordered.append(idx) - # Then add its hydrogens - atom = mol.GetAtomWithIdx(idx) - if atom.GetAtomicNum() != 1: # is a heavy atom - hydrogen_indices = [ - neighbor.GetIdx() - for neighbor in atom.GetNeighbors() - if neighbor.GetAtomicNum() == 1 - ] - final_indices_ordered.extend(sorted(hydrogen_indices)) - - elif hydrogens == "exclude": - # Only heavy atoms from core selection - final_indices_ordered = [ - idx - for idx in core_atom_indices_ordered - if mol.GetAtomWithIdx(idx).GetAtomicNum() != 1 - ] - - elif hydrogens == "isolated": - # Only hydrogens bonded to core heavy atoms, maintaining order - final_indices_ordered = [] - for idx in core_atom_indices_ordered: - atom = mol.GetAtomWithIdx(idx) - if atom.GetAtomicNum() != 1: # is a heavy atom - hydrogen_indices = [ - neighbor.GetIdx() - for neighbor in atom.GetNeighbors() - if neighbor.GetAtomicNum() == 1 - ] - final_indices_ordered.extend(sorted(hydrogen_indices)) - - # Only add the group if it contains any atoms after processing - if final_indices_ordered: - grouped_indices.append(final_indices_ordered) - - return grouped_indices - - -def select_atoms_flat_unique( - mol: Chem.Mol, - smarts_or_smiles: str, - hydrogens: tp.Literal["include", "exclude", "isolated"] = "exclude", -) -> list[int]: - """ - Selects a unique list of atom indices in a molecule using SMARTS or mapped SMILES. - If the pattern contains atom maps (e.g., [C:1]), only the mapped atoms are returned. - Otherwise, all atoms in the matched substructure are returned. - - Parameters - ---------- - mol : Chem.Mol - RDKit molecule, which can contain explicit hydrogens. - smarts_or_smiles : str - SMARTS (e.g., "[F]") or SMILES with atom maps (e.g., "C1[C:1]OC(=[O:1])O1"). - hydrogens : {"include", "exclude", "isolated"}, default "exclude" - How to handle hydrogens in the final returned list. - - "include": Include hydrogens attached to matched heavy atoms - - "exclude": Exclude all hydrogens from results (default) - - "isolated": Return only hydrogens attached to matched heavy atoms - - Returns - ------- - list[int] - A single, flat list of unique integer atom indices matching the criteria. - - Raises - ------ - ValueError - If the SMARTS/SMILES pattern is invalid. - """ - grouped_indices = select_atoms_grouped(mol, smarts_or_smiles, hydrogens=hydrogens) - if not grouped_indices: - return [] - - # Flatten the list of lists and remove duplicates - unique_indices = set() - for group in grouped_indices: - unique_indices.update(group) - - return sorted(unique_indices) - - -def _collect_highlighted_fragments(mol, args, alpha): - """Helper function to collect and process fragment highlights.""" - frags = Chem.GetMolFrags(mol, asMols=True) - frag_indices = Chem.GetMolFrags(mol, asMols=False) - - candidate_mols = [] - candidate_highlights = [] - candidate_colors = [] - - # Collect all selected indices from all argument lists - all_selected_indices = set() - for atom_list in args: - all_selected_indices.update(atom_list) - - # Get colors from matplotlib's tab10 colormap and add alpha - colors = plt.cm.tab10.colors - highlight_colors = [colors[i % len(colors)] + (alpha,) for i in range(len(args))] - - for i, frag in enumerate(frags): - original_indices_in_frag = set(frag_indices[i]) - - # Check if this fragment contains any of the selected atoms - if not all_selected_indices.isdisjoint(original_indices_in_frag): - candidate_mols.append(frag) - - # Map original indices to the new indices within the fragment - original_to_frag_map = { - orig_idx: new_idx for new_idx, orig_idx in enumerate(frag_indices[i]) - } - - current_highlights = [] - current_colors = {} - - # Process each argument list with its corresponding color - for arg_idx, atom_list in enumerate(args): - color = highlight_colors[arg_idx] - for idx in atom_list: - if idx in original_to_frag_map: - frag_idx = original_to_frag_map[idx] - if frag_idx not in current_highlights: - current_highlights.append(frag_idx) - # Later argument lists take precedence for coloring - current_colors[frag_idx] = color - - candidate_highlights.append(current_highlights) - candidate_colors.append(current_colors) - - return candidate_mols, candidate_highlights, candidate_colors - - -def _filter_unique_molecules(candidate_mols, candidate_highlights, candidate_colors): - """Helper function to filter for unique molecular structures.""" - mols_to_draw = [] - highlight_lists = [] - highlight_colors = [] - seen_smiles = set() - - for i, candidate_mol in enumerate(candidate_mols): - # Generate canonical SMILES to identify unique structures - mol_no_hs = Chem.RemoveHs(candidate_mol) - smi = Chem.MolToSmiles(mol_no_hs, canonical=True) - - if smi not in seen_smiles: - seen_smiles.add(smi) - mols_to_draw.append(candidate_mol) - highlight_lists.append(candidate_highlights[i]) - highlight_colors.append(candidate_colors[i]) - - return mols_to_draw, highlight_lists, highlight_colors - - -def visualize_selected_molecules( - mol: Chem.Mol, - *args, - mols_per_row: int = 4, - sub_img_size: tuple[int, int] = (200, 200), - legends: list[str] | None = None, - alpha: float = 0.5, -): - """ - Visualizes molecules with optional atom highlighting. - If no atom selections are provided, displays the molecule without highlights. - Duplicate molecular structures will only be plotted once. - - Parameters - ---------- - mol : Chem.Mol - The RDKit molecule object, which may contain multiple fragments. - *args : list[int] - Variable number of lists containing atom indices to be highlighted. - Each list will be assigned a different color from matplotlib's tab10 colormap. - If no arguments provided, displays the molecule without highlights. - mols_per_row : int, default 4 - Number of molecules per row in the grid. - sub_img_size : tuple[int, int], default (200, 200) - Size of each molecule image. - legends : list[str] | None, default None - Custom legends for each molecule. If None, default legends will be used. - alpha : float, default 0.5 - Transparency level for the highlighted atoms (0.0 = fully transparent, - 1.0 = opaque). - - Returns - ------- - PIL.Image - A PIL image object of the grid. - """ - # Handle empty args case - display molecule without highlights - if not args: - img = Draw.MolsToGridImage( - [mol], - molsPerRow=mols_per_row, - subImgSize=sub_img_size, - legends=legends if legends is not None else ["Molecule 0"], - ) - return img - - # Collect highlighted fragments - candidate_mols, candidate_highlights, candidate_colors = ( - _collect_highlighted_fragments(mol, args, alpha) - ) - - if not candidate_mols: - print("No molecules to draw with the given selections.") - return None - - # Filter for unique molecules - mols_to_draw, highlight_lists, highlight_colors = _filter_unique_molecules( - candidate_mols, candidate_highlights, candidate_colors - ) - - # Draw the grid - final_legends = ( - legends - if legends is not None - else [f"Molecule {i}" for i in range(len(mols_to_draw))] - ) - - img = Draw.MolsToGridImage( - mols_to_draw, - molsPerRow=mols_per_row, - subImgSize=sub_img_size, - legends=final_legends, - highlightAtomLists=highlight_lists, - highlightAtomColors=highlight_colors, - ) - return img diff --git a/molify/utils.py b/molify/utils.py deleted file mode 100644 index 8e7dcfa..0000000 --- a/molify/utils.py +++ /dev/null @@ -1,255 +0,0 @@ -import io -import subprocess -from collections import defaultdict - -import ase.io -import ase.units -import networkx as nx -import numpy as np -import rdkit.Chem -import rdkit.Chem.rdDetermineBonds -from rdkit import Chem - - -def bond_type_from_order(order): - if order == 1.0: - return Chem.BondType.SINGLE - elif order == 2.0: - return Chem.BondType.DOUBLE - elif order == 3.0: - return Chem.BondType.TRIPLE - elif order == 1.5: - return Chem.BondType.AROMATIC - else: - raise ValueError(f"Unsupported bond order: {order}") - - -def find_connected_components(connectivity: list[tuple[int, int, float]]): - try: - import networkx as nx - - graph = nx.Graph() - for i, j, _ in connectivity: - graph.add_edge(i, j) - for component in nx.connected_components(graph): - yield component - except ImportError: - adjacency = defaultdict(list) - for i, j, _ in connectivity: - adjacency[i].append(j) - adjacency[j].append(i) - - visited = set() - for start in adjacency: - if start in visited: - continue - - component = [] - stack = [start] - while stack: - node = stack.pop() - if node in visited: - continue - visited.add(node) - component.append(node) - stack.extend(n for n in adjacency[node] if n not in visited) - - yield component - - -def calculate_density(atoms: ase.Atoms) -> float: - """Calculates the density of an ASE Atoms object in kg/m^3. - - The density is calculated as the total mass (in kg) divided by the volume (in m^3). - """ - total_mass_kg = sum(atoms.get_masses()) * ase.units._amu # amu -> kg - volume_m3 = atoms.get_volume() * 1e-30 # Å^3 -> m^3 - density = total_mass_kg / volume_m3 # kg/m^3 - return density - - -def calculate_box_dimensions(images: list[ase.Atoms], density: float) -> list[float]: - """Calculates the dimensions of the simulation box - - based on the molar volume and target density. - """ - total_mass = sum(sum(atoms.get_masses()) for atoms in images) - molar_volume = total_mass / density / 1000 # m^3 / mol - volume_per_mol = molar_volume * ase.units.m**3 / ase.units.mol - box_edge = volume_per_mol ** (1 / 3) - return [box_edge] * 3 - - -def unwrap_structures(atoms, scale=1.2, **kwargs) -> ase.Atoms: - """Unwrap molecular structures across periodic boundary conditions (PBC). - - This function corrects atomic positions that have been wrapped across periodic - boundaries, ensuring that bonded atoms appear as continuous molecular structures. - It can handle multiple disconnected molecules within the same unit cell. - - The algorithm works by: - 1. Building a connectivity graph based on covalent radii - 2. Traversing each connected component (molecule) using depth-first search - 3. Accumulating periodic image shifts to maintain molecular connectivity - 4. Applying the shifts to obtain unwrapped coordinates - - Parameters - ---------- - atoms : ase.Atoms - The ASE Atoms object containing wrapped atomic positions - scale : float, optional - Scale factor for covalent radii cutoffs used in bond detection. - Larger values include more distant neighbors as bonded. - Default is 1.2. - **kwargs : dict - Additional keyword arguments to pass to the `ase2networkx` function. - - Returns - ------- - ase.Atoms - A new ASE Atoms object with unwrapped atomic positions. The original - atoms object is not modified. - - Notes - ----- - - The function preserves the original atoms object and returns a copy - - Works with any periodic boundary conditions (1D, 2D, or 3D) - - Handles multiple disconnected molecules/fragments - - Uses covalent radii scaled by the `scale` parameter for bond detection - - Examples - -------- - >>> import numpy as np - >>> from molify import smiles2conformers, pack, unwrap_structures - >>> - >>> # Create a realistic molecular system - >>> water = smiles2conformers("O", numConfs=1) - >>> ethanol = smiles2conformers("CCO", numConfs=1) - >>> - >>> # Pack molecules into a periodic box - >>> packed_system = pack( - ... data=[water, ethanol], - ... counts=[10, 5], - ... density=800 - ... ) - >>> - >>> # Simulate wrapped coordinates (as might occur in MD) - >>> cell = packed_system.get_cell() - >>> positions = packed_system.get_positions() - >>> - >>> # Artificially move the box and wrap it again - >>> positions += np.array([cell[0, 0] * 0.5, 0, 0]) # Shift by half box length - >>> wrapped_atoms = packed_system.copy() - >>> wrapped_atoms.set_positions(positions) - >>> wrapped_atoms.wrap() # Wrap back into PBC - >>> - >>> # Unwrap the structures to get continuous molecules - >>> unwrapped_atoms = unwrap_structures(wrapped_atoms) - """ - from molify import ase2networkx - - atoms = atoms.copy() # Work on a copy to avoid modifying the original - - graph = ase2networkx(atoms, scale=scale, **kwargs) - positions = atoms.get_positions() - cell = atoms.get_cell() - - for component in nx.connected_components(graph): - if len(component) == 1: - continue - # start at the atom closest to the center of the box - root = min( - component, key=lambda i: np.linalg.norm(positions[i] - cell.diagonal() / 2) - ) - # now do a bfs traversal to unwrap the molecule - for i, j in nx.dfs_tree(graph, source=root).edges(): - # i has already been unwrapped - # j is the neighbor that needs to be unwrapped - offsets = cell.scaled_positions(positions[i] - positions[j]) - offsets = offsets.round().astype(int) - positions[j] += offsets @ cell # Unwrap j to the same image as i - atoms.set_positions(positions) - # TODO: include connectivity information - return atoms - - -def rdkit_determine_bonds(unwrapped_atoms: ase.Atoms) -> rdkit.Chem.Mol: - if len(unwrapped_atoms) == 0: - raise ValueError("Cannot determine bonds for an empty structure.") - with io.StringIO() as f: - ase.io.write(f, unwrapped_atoms, format="xyz") - f.seek(0) - xyz = f.read() - mol = rdkit.Chem.MolFromXYZBlock(xyz) - if len(unwrapped_atoms) == 1: - if unwrapped_atoms.get_chemical_symbols()[0] in ["Li", "Na", "K", "Rb", "Cs"]: - return rdkit.Chem.MolFromSmiles( - f"[{unwrapped_atoms.get_chemical_symbols()[0]}+]" - ) - if unwrapped_atoms.get_chemical_symbols()[0] in ["Cl", "Br", "I", "F"]: - return rdkit.Chem.MolFromSmiles( - f"[{unwrapped_atoms.get_chemical_symbols()[0]}-]" - ) - if len(unwrapped_atoms) == 7: - if sorted(unwrapped_atoms.get_chemical_symbols()) == sorted( - ["P", "F", "F", "F", "F", "F", "F"] - ): - return rdkit.Chem.MolFromSmiles("F[P-](F)(F)(F)(F)F") - for charge in [0, 1, -1, 2, -2]: - try: - rdkit.Chem.rdDetermineBonds.DetermineBonds( - mol, - charge=int(sum(unwrapped_atoms.get_initial_charges())) + charge, - ) - return mol - except ValueError: - pass - else: - raise ValueError( - "Failed to determine bonds for sub-structure up to charge " - f"{sum(unwrapped_atoms.get_initial_charges()) + charge} " - f"and {unwrapped_atoms.get_chemical_symbols()}" - ) - - -def suggestions2networkx(smiles: list[str]) -> list[nx.Graph]: - from molify import rdkit2networkx - - mols = [] - for _smiles in smiles: - mol = Chem.MolFromSmiles(_smiles) - mol = Chem.AddHs(mol) - mols.append(mol) - return [rdkit2networkx(mol) for mol in mols] - - -def get_packmol_julia_version() -> str: - """Get the Packmol version when using Julia. - - Raises - ------ - RuntimeError - If the Packmol version cannot be retrieved. - """ - try: - result = subprocess.run( - ["julia", "-e", 'import Pkg; Pkg.status("Packmol")'], - capture_output=True, - text=True, - check=True, - ) - for line in result.stdout.splitlines(): - if "Packmol" in line: - parts = line.split() - if len(parts) >= 3: - return parts[2] - raise RuntimeError( - "Failed to get Packmol version via Julia. Please verify that you can" - ' import packmol via `julia -e "import Pkg; Pkg.status("Packmol")"`' - ) - - except subprocess.CalledProcessError as e: - raise RuntimeError( - "Failed to get Packmol version via Julia. Please verify that you can" - ' import packmol via `julia -e "import Pkg; Pkg.status("Packmol")"`' - ) from e diff --git a/pyproject.toml b/pyproject.toml index f226af3..8a78fd2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "molify" -version = "0.0.1a0" +version = "0.0.1a2" description = "Interface between rdkit and ASE" readme = "README.md" license = "Apache-2.0" @@ -28,6 +28,7 @@ docs = [ "nbsphinx>=0.9.7", "sphinx>=8.1.3", "sphinx-copybutton>=0.5.2", + "sphinxcontrib-mermaid>=1.0.0", ] [project.optional-dependencies] @@ -36,6 +37,9 @@ vesin = [ "vesin>=0.3.7", ] +[project.scripts] +packmol = "molify.packmol:packmol_cli" + [tool.ruff.lint] select = ["E", "F", "N", "C", "I"] extend-ignore = [ @@ -46,6 +50,11 @@ extend-ignore = [ requires = ["hatchling"] build-backend = "hatchling.build" +[tool.hatch.build.hooks.custom] +path = "hatch_build.py" + +[tool.hatch.build.targets.wheel] +packages = ["src/molify"] [tool.codespell] skip = "*.ipynb" diff --git a/molify/__init__.py b/src/molify/__init__.py similarity index 84% rename from molify/__init__.py rename to src/molify/__init__.py index 661dba4..4992322 100644 --- a/molify/__init__.py +++ b/src/molify/__init__.py @@ -9,13 +9,15 @@ from molify.smiles2x import smiles2atoms, smiles2conformers from molify.substructure import ( get_substructures, + group_matches_by_fragment, iter_fragments, match_substructure, - select_atoms_flat_unique, - select_atoms_grouped, visualize_selected_molecules, ) -from molify.utils import unwrap_structures +from molify.utils import ( + draw_molecular_graph, + unwrap_structures, +) __version__ = importlib.metadata.version("molify") @@ -26,12 +28,12 @@ "smiles2conformers", "compress", "match_substructure", + "group_matches_by_fragment", "get_substructures", "iter_fragments", - "select_atoms_flat_unique", "visualize_selected_molecules", "unwrap_structures", - "select_atoms_grouped", + "draw_molecular_graph", # "ase2networkx", # diff --git a/molify/ase2x.py b/src/molify/ase2x.py similarity index 100% rename from molify/ase2x.py rename to src/molify/ase2x.py diff --git a/src/molify/binaries/packmol b/src/molify/binaries/packmol new file mode 100755 index 0000000..02dc624 Binary files /dev/null and b/src/molify/binaries/packmol differ diff --git a/molify/bond_order.py b/src/molify/bond_order.py similarity index 100% rename from molify/bond_order.py rename to src/molify/bond_order.py diff --git a/molify/com.py b/src/molify/com.py similarity index 100% rename from molify/com.py rename to src/molify/com.py diff --git a/molify/compress.py b/src/molify/compress.py similarity index 100% rename from molify/compress.py rename to src/molify/compress.py diff --git a/molify/networkx2x.py b/src/molify/networkx2x.py similarity index 100% rename from molify/networkx2x.py rename to src/molify/networkx2x.py diff --git a/molify/pack.py b/src/molify/pack.py similarity index 85% rename from molify/pack.py rename to src/molify/pack.py index b91a146..61c35f7 100644 --- a/molify/pack.py +++ b/src/molify/pack.py @@ -9,7 +9,8 @@ from ase.io.proteindatabank import write_proteindatabank from rdkit import Chem -from molify.utils import calculate_box_dimensions, get_packmol_julia_version +from molify.packmol import get_packmol_binary +from molify.utils import calculate_box_dimensions log = logging.getLogger(__name__) @@ -61,36 +62,20 @@ def _generate_packmol_input( def _run_packmol( - packmol_executable: str, + packmol_executable: pathlib.Path | str, input_file: pathlib.Path, tmpdir: pathlib.Path, verbose: bool, ) -> None: """Executes the PACKMOL program.""" - if packmol_executable == "packmol.jl": - version = get_packmol_julia_version() - if verbose: - print(f"Using Packmol version {version} via Julia") - with open(tmpdir / "pack.jl", "w") as f: - f.write("using Packmol \n") - f.write(f'run_packmol("{input_file.name}") \n') - - if packmol_executable == "packmol.jl": + with open(input_file, "rb") as fin: subprocess.run( - ["julia", str(tmpdir / "pack.jl")], + [str(packmol_executable)], cwd=tmpdir, check=True, capture_output=not verbose, + stdin=fin, ) - else: - with open(input_file, "rb") as fin: - subprocess.run( - [packmol_executable], - cwd=tmpdir, - check=True, - capture_output=not verbose, - stdin=fin, - ) def _write_molecule_files( @@ -162,7 +147,7 @@ def pack( seed: int = 42, tolerance: float = 2, verbose: bool = False, - packmol: str = "packmol", + packmol: str | None = None, pbc: bool = True, output_format: FORMAT = "pdb", ratio: tuple[float, float, float] = (1.0, 1.0, 1.0), @@ -184,9 +169,11 @@ def pack( The tolerance for the packing algorithm, by default 2. verbose : bool, optional If True, enables logging of the packing process, by default False. - packmol : str, optional - The path to the packmol executable, by default "packmol". - When installing Packmol via Julia, use "packmol.jl". + packmol : str or None, optional + The path to the packmol executable. If None (default), uses the bundled + packmol binary shipped with molify. You can provide a custom path to + use a different packmol installation (e.g., "packmol" to use system + PATH, or "/path/to/custom/packmol"). pbc : bool, optional Ensure tolerance across periodic boundaries, by default True. output_format : str, optional @@ -212,6 +199,10 @@ def pack( >>> print(packed_system) Atoms(symbols='C10H44O12', pbc=True, cell=[8.4, 8.4, 8.4]) """ + # Use bundled packmol binary if not specified + if packmol is None: + packmol = str(get_packmol_binary()) + selected_images = _select_conformers(data, counts, seed) cell = calculate_box_dimensions(images=selected_images, density=density) @@ -243,14 +234,7 @@ def pack( packed_atoms.arrays.pop("residuenumbers", None) except FileNotFoundError as e: log.error("Packmol Input:\n%s", packmol_input) - if packmol == "packmol.jl": - try: - version = get_packmol_julia_version() - log.error("Using Packmol via Julia with version: %s", version) - except Exception: - log.warning("Could not determine Packmol.jl version", exc_info=True) - else: - log.error("Using Packmol executable at: %s", packmol) + log.error("Using Packmol executable at: %s", packmol) log.exception("Packmol did not produce mixture.%s", output_format) raise FileNotFoundError( f"Packmol did not produce 'mixture.{output_format}'." diff --git a/src/molify/packmol.py b/src/molify/packmol.py new file mode 100644 index 0000000..8f8f838 --- /dev/null +++ b/src/molify/packmol.py @@ -0,0 +1,102 @@ +"""Python wrapper for packmol binary.""" + +import subprocess +import sys +from pathlib import Path + + +def get_packmol_binary() -> Path: + """Get the path to the packmol binary. + + Returns + ------- + Path + Path to the packmol binary. + + Raises + ------ + RuntimeError + If the binary is not found. + """ + binary_path = Path(__file__).parent / "binaries" / "packmol" + + if not binary_path.exists(): + raise RuntimeError( + f"Packmol binary not found at: {binary_path}\n" + f"This may indicate an incomplete installation." + ) + + return binary_path + + +def run_packmol(input_file: str | Path, *, timeout: int | None = None) -> str: + """Run packmol with the given input file. + + Parameters + ---------- + input_file : str or Path + Path to the packmol input file. + timeout : int, optional + Timeout in seconds for the packmol process. + + Returns + ------- + str + Combined stdout and stderr from packmol. + + Raises + ------ + RuntimeError + If packmol execution fails. + FileNotFoundError + If the input file doesn't exist. + """ + input_path = Path(input_file) + if not input_path.exists(): + raise FileNotFoundError(f"Input file not found: {input_path}") + + binary = get_packmol_binary() + + try: + result = subprocess.run( + [str(binary)], + stdin=open(input_path), + capture_output=True, + text=True, + timeout=timeout, + check=True, + ) + return result.stdout + result.stderr + except subprocess.CalledProcessError as e: + raise RuntimeError( + f"Packmol execution failed with return code {e.returncode}\n" + f"stdout: {e.stdout}\n" + f"stderr: {e.stderr}" + ) from e + except subprocess.TimeoutExpired as e: + raise RuntimeError( + f"Packmol execution timed out after {timeout} seconds" + ) from e + + +def packmol_cli(): + """CLI entry point for packmol command. + + This function executes the bundled packmol binary, forwarding all + command-line arguments and stdin/stdout. This makes the `packmol` + command available after installing molify. + """ + binary = get_packmol_binary() + + # Execute packmol with the same stdin/stdout as this process + # This allows users to run: packmol < input.inp + result = subprocess.run( + [str(binary)], + stdin=sys.stdin, + stdout=sys.stdout, + stderr=sys.stderr, + ) + sys.exit(result.returncode) + + +__all__ = ["get_packmol_binary", "run_packmol", "packmol_cli"] diff --git a/molify/rdkit2x.py b/src/molify/rdkit2x.py similarity index 100% rename from molify/rdkit2x.py rename to src/molify/rdkit2x.py diff --git a/molify/smiles2x.py b/src/molify/smiles2x.py similarity index 100% rename from molify/smiles2x.py rename to src/molify/smiles2x.py diff --git a/src/molify/substructure.py b/src/molify/substructure.py new file mode 100644 index 0000000..765b240 --- /dev/null +++ b/src/molify/substructure.py @@ -0,0 +1,482 @@ +import typing as tp + +import ase +import matplotlib.pyplot as plt +from ase.build import separate +from rdkit import Chem +from rdkit.Chem import Draw + +from molify.ase2x import ase2rdkit +from molify.utils import find_connected_components + + +def match_substructure( # noqa: C901 + mol: Chem.Mol, + smarts_or_smiles: str, + hydrogens: tp.Literal["include", "exclude", "isolated"] = "exclude", + mapped_only: bool = False, +) -> tuple[tuple[int, ...], ...]: + """Find all matches of a substructure pattern in an RDKit molecule. + + This function performs substructure matching with advanced features including + hydrogen handling and atom mapping support. All matches are returned, including + matches across multiple disconnected fragments. + + Parameters + ---------- + mol : Chem.Mol + RDKit molecule to search. Use ``molify.ase2rdkit(atoms, suggestions=[...])`` + to convert from ASE Atoms with explicit control over bond detection. + smarts_or_smiles : str + SMARTS pattern or mapped SMILES pattern (e.g., "[C:1][C:2]O"). + If atom maps are present and ``mapped_only=True``, only mapped atoms + are returned in map number order. + hydrogens : {'exclude', 'include', 'isolated'}, default='exclude' + Controls hydrogen atom inclusion in matches: + + - 'exclude': Return only heavy atoms (default) + - 'include': Return heavy atoms followed by their bonded hydrogens + - 'isolated': Return only hydrogens bonded to matched heavy atoms + mapped_only : bool, default=False + If True and pattern contains atom maps (e.g., [C:1]), return only the + mapped atoms ordered by map number. If False, return all matched atoms. + + Returns + ------- + tuple[tuple[int, ...], ...] + Tuple of matches, where each match is a tuple of atom indices. + For patterns with multiple matches, each match is returned as a separate tuple. + + Raises + ------ + ValueError + If the SMARTS/SMILES pattern is invalid or if atom map labels are used + multiple times within the same pattern. + + Examples + -------- + >>> from molify import smiles2atoms, ase2rdkit, match_substructure + >>> + >>> # Explicit conversion with suggestions for better bond detection + >>> atoms = smiles2atoms("CCO") + >>> mol = ase2rdkit(atoms, suggestions=["CCO"]) + >>> + >>> # Find all carbon atoms + >>> match_substructure(mol, "[#6]") + ((0,), (1,)) + >>> + >>> # Find C-O bond with hydrogens included + >>> match_substructure(mol, "CO", hydrogens="include") + ((1, 6, 7, 2, 8),) + >>> + >>> # Use atom mapping to select specific atoms in order + >>> match_substructure(mol, "[C:2][C:1]O", mapped_only=True) + ((1, 0),) # Returns in map order: C:2 then C:1 + >>> + >>> # Multiple matches in propanol + >>> propanol = ase2rdkit(smiles2atoms("CCCO")) + >>> match_substructure(propanol, "[#6]") + ((0,), (1,), (2,)) + """ + # Parse pattern + patt = Chem.MolFromSmarts(smarts_or_smiles) + if patt is None: + patt = Chem.MolFromSmiles(smarts_or_smiles) + if patt is None: + raise ValueError(f"Invalid SMARTS/SMILES: {smarts_or_smiles}") + + # Extract and validate atom mappings + mapped_pattern_indices = [] + atom_map_numbers = [] + for atom in patt.GetAtoms(): + if atom.GetAtomMapNum() > 0: + map_num = atom.GetAtomMapNum() + if map_num in atom_map_numbers: + raise ValueError(f"Atom map label '{map_num}' is used multiple times") + atom_map_numbers.append(map_num) + mapped_pattern_indices.append(atom.GetIdx()) + + # Sort mapped indices by map number to preserve ordering + if mapped_pattern_indices: + map_index_pairs = [ + (patt.GetAtomWithIdx(idx).GetAtomMapNum(), idx) + for idx in mapped_pattern_indices + ] + map_index_pairs.sort(key=lambda x: x[0]) + mapped_pattern_indices = [idx for _, idx in map_index_pairs] + + # Perform substructure matching + all_matches = mol.GetSubstructMatches(patt) + if not all_matches: + return () + + # Process each match + processed_matches = [] + for match in all_matches: + # Apply mapped_only filter if requested + if mapped_only and mapped_pattern_indices: + core_atoms = tuple(match[idx] for idx in mapped_pattern_indices) + else: + core_atoms = match + + # Apply hydrogen handling + if hydrogens == "exclude": + # Keep only heavy atoms + final_atoms = tuple( + idx for idx in core_atoms if mol.GetAtomWithIdx(idx).GetAtomicNum() != 1 + ) + elif hydrogens == "include": + # Include heavy atoms and their bonded hydrogens + final_atoms_list = [] + already_added = set() + for idx in core_atoms: + # Skip if already added (can happen with explicit [H] in pattern) + if idx not in already_added: + final_atoms_list.append(idx) + already_added.add(idx) + atom = mol.GetAtomWithIdx(idx) + if atom.GetAtomicNum() != 1: # Is heavy atom + h_neighbors = sorted( + neighbor.GetIdx() + for neighbor in atom.GetNeighbors() + if neighbor.GetAtomicNum() == 1 + and neighbor.GetIdx() not in already_added + ) + final_atoms_list.extend(h_neighbors) + already_added.update(h_neighbors) + final_atoms = tuple(final_atoms_list) + elif hydrogens == "isolated": + # Return only hydrogens bonded to matched heavy atoms + final_atoms_list = [] + for idx in core_atoms: + atom = mol.GetAtomWithIdx(idx) + if atom.GetAtomicNum() != 1: # Is heavy atom + h_neighbors = sorted( + neighbor.GetIdx() + for neighbor in atom.GetNeighbors() + if neighbor.GetAtomicNum() == 1 + ) + final_atoms_list.extend(h_neighbors) + final_atoms = tuple(final_atoms_list) + else: + raise ValueError( + f"Invalid value for `hydrogens`: {hydrogens!r}. " + "Expected one of 'include', 'exclude', 'isolated'." + ) + + if final_atoms: + processed_matches.append(final_atoms) + + return tuple(processed_matches) + + +def group_matches_by_fragment( + mol: Chem.Mol, matches: tuple[tuple[int, ...], ...] +) -> list[list[int]]: + """Group matched atom indices by disconnected molecular fragments. + + This function takes substructure matches and organizes them by which + disconnected fragment each match belongs to. Duplicate atoms within + each fragment are removed. + + Parameters + ---------- + mol : Chem.Mol + RDKit molecule containing one or more disconnected fragments. + matches : tuple[tuple[int, ...], ...] + Matches returned from ``match_substructure``, where each tuple + contains atom indices for one match. + + Returns + ------- + list[list[int]] + List of atom index lists, one per fragment. Each inner list contains + unique atom indices for all matches within that fragment. Fragments + with no matches are omitted. + + Examples + -------- + >>> from rdkit import Chem + >>> from molify import match_substructure, group_matches_by_fragment + >>> + >>> # Molecule with two disconnected fragments + >>> mol = Chem.MolFromSmiles("CCO.CF") + >>> matches = match_substructure(mol, "[#6]") + >>> matches + ((0,), (1,), (3,)) + >>> + >>> # Group by fragment + >>> group_matches_by_fragment(mol, matches) + [[0, 1], [3]] + """ + if not matches: + return [] + + fragment_sets = [set(frag) for frag in Chem.GetMolFrags(mol, asMols=False)] + + grouped = [[] for _ in fragment_sets] + for match in matches: + for frag_idx, frag_atoms in enumerate(fragment_sets): + if set(match).issubset(frag_atoms): + grouped[frag_idx].extend(match) + break + + # Remove duplicates within each fragment while preserving order + result = [] + for group in grouped: + if group: + # Remove duplicates while preserving order + seen = set() + unique = [x for x in group if not (x in seen or seen.add(x))] + result.append(unique) + + return result + + +def get_substructures( + atoms: ase.Atoms, + pattern: str, + **kwargs, +) -> list[ase.Atoms]: + """Extract all matched substructures from an ASE Atoms object. + + This function converts ASE Atoms to RDKit Mol, finds all substructure + matches, and returns ASE Atoms objects for each match. + + Parameters + ---------- + atoms : ase.Atoms + The structure to search in. + pattern : str + SMARTS or SMILES pattern to match. + **kwargs + Additional keyword arguments passed to ``ase2rdkit`` for molecule + conversion (e.g., ``suggestions`` for bond detection hints). + + Returns + ------- + list[ase.Atoms] + List of ASE Atoms objects, each containing one matched substructure. + + Examples + -------- + >>> from molify import smiles2atoms, get_substructures + >>> + >>> propanol = smiles2atoms("CCCO") + >>> carbons = get_substructures(propanol, "[#6]", suggestions=["CCCO"]) + >>> len(carbons) + 3 + """ + mol = ase2rdkit(atoms, **kwargs) + matches = match_substructure(mol, pattern) + return [atoms[list(match)] for match in matches] + + +def iter_fragments(atoms: ase.Atoms) -> list[ase.Atoms]: + """Iterate over connected molecular fragments in an ASE Atoms object. + + If a 'connectivity' field is present in ``atoms.info``, it will be used + to determine fragments. Otherwise, ``ase.build.separate`` will be used. + + Parameters + ---------- + atoms : ase.Atoms + A structure that may contain one or more molecular fragments. + + Yields + ------ + ase.Atoms + Each connected component (fragment) in the input structure. + + Examples + -------- + >>> from molify import smiles2atoms + >>> from rdkit.Chem import CombineMols + >>> + >>> # Create multi-fragment system + >>> ethanol = smiles2atoms("CCO") + >>> methanol = smiles2atoms("CO") + >>> combined = ethanol + methanol + >>> + >>> # Iterate over fragments + >>> fragments = list(iter_fragments(combined)) + >>> len(fragments) + 2 + """ + if "connectivity" in atoms.info: + # connectivity is a list of tuples (i, j, bond_type) + connectivity = atoms.info["connectivity"] + for component in find_connected_components(connectivity): + yield atoms[list(component)] + else: + for molecule in separate(atoms): + yield molecule + + +def _collect_highlighted_fragments(mol, args, alpha): + """Helper function to collect and process fragment highlights.""" + frags = Chem.GetMolFrags(mol, asMols=True) + frag_indices = Chem.GetMolFrags(mol, asMols=False) + + candidate_mols = [] + candidate_highlights = [] + candidate_colors = [] + + # Collect all selected indices from all argument lists + all_selected_indices = set() + for atom_list in args: + all_selected_indices.update(atom_list) + + # Get colors from matplotlib's tab10 colormap and add alpha + colors = plt.cm.tab10.colors + highlight_colors = [colors[i % len(colors)] + (alpha,) for i in range(len(args))] + + for i, frag in enumerate(frags): + original_indices_in_frag = set(frag_indices[i]) + + # Check if this fragment contains any of the selected atoms + if not all_selected_indices.isdisjoint(original_indices_in_frag): + candidate_mols.append(frag) + + # Map original indices to the new indices within the fragment + original_to_frag_map = { + orig_idx: new_idx for new_idx, orig_idx in enumerate(frag_indices[i]) + } + + current_highlights = [] + current_colors = {} + + # Process each argument list with its corresponding color + for arg_idx, atom_list in enumerate(args): + color = highlight_colors[arg_idx] + for idx in atom_list: + if idx in original_to_frag_map: + frag_idx = original_to_frag_map[idx] + if frag_idx not in current_highlights: + current_highlights.append(frag_idx) + # Later argument lists take precedence for coloring + current_colors[frag_idx] = color + + candidate_highlights.append(current_highlights) + candidate_colors.append(current_colors) + + return candidate_mols, candidate_highlights, candidate_colors + + +def _filter_unique_molecules(candidate_mols, candidate_highlights, candidate_colors): + """Helper function to filter for unique molecular structures.""" + mols_to_draw = [] + highlight_lists = [] + highlight_colors = [] + seen_smiles = set() + + for i, candidate_mol in enumerate(candidate_mols): + # Generate canonical SMILES to identify unique structures + mol_no_hs = Chem.RemoveHs(candidate_mol) + smi = Chem.MolToSmiles(mol_no_hs, canonical=True) + + if smi not in seen_smiles: + seen_smiles.add(smi) + mols_to_draw.append(candidate_mol) + highlight_lists.append(candidate_highlights[i]) + highlight_colors.append(candidate_colors[i]) + + return mols_to_draw, highlight_lists, highlight_colors + + +def visualize_selected_molecules( + mol: Chem.Mol, + *args, + mols_per_row: int = 4, + sub_img_size: tuple[int, int] = (200, 200), + legends: list[str] | None = None, + alpha: float = 0.5, +): + """Visualize molecules with optional atom highlighting. + + If no atom selections are provided, displays the molecule without highlights. + Duplicate molecular structures will only be plotted once. + + Parameters + ---------- + mol : Chem.Mol + The RDKit molecule object, which may contain multiple fragments. + *args : list[int] or tuple[int] + Variable number of lists/tuples containing atom indices to be highlighted. + Each selection will be assigned a different color from matplotlib's tab10 + colormap. If no arguments provided, displays the molecule without highlights. + mols_per_row : int, default=4 + Number of molecules per row in the grid. + sub_img_size : tuple[int, int], default=(200, 200) + Size of each molecule image in pixels. + legends : list[str], optional + Custom legends for each molecule. If None, default legends will be used. + alpha : float, default=0.5 + Transparency level for the highlighted atoms (0.0 = fully transparent, + 1.0 = opaque). + + Returns + ------- + PIL.Image + A PIL image object of the grid. + + Examples + -------- + >>> from molify import smiles2atoms, ase2rdkit, match_substructure + >>> from molify import visualize_selected_molecules + >>> + >>> # Create and convert molecule + >>> mol = ase2rdkit(smiles2atoms("Cc1ccccc1")) + >>> + >>> # Find aromatic and aliphatic carbons + >>> aromatic = match_substructure(mol, "c") + >>> aliphatic = match_substructure(mol, "[C;!c]") + >>> + >>> # Flatten matches for visualization + >>> aromatic_flat = [idx for match in aromatic for idx in match] + >>> aliphatic_flat = [idx for match in aliphatic for idx in match] + >>> + >>> # Visualize with highlights + >>> visualize_selected_molecules(mol, aromatic_flat, aliphatic_flat) + + """ + # Handle empty args case - display molecule without highlights + if not args: + img = Draw.MolsToGridImage( + [mol], + molsPerRow=mols_per_row, + subImgSize=sub_img_size, + legends=legends if legends is not None else ["Molecule 0"], + ) + return img + + # Collect highlighted fragments + candidate_mols, candidate_highlights, candidate_colors = ( + _collect_highlighted_fragments(mol, args, alpha) + ) + + if not candidate_mols: + print("No molecules to draw with the given selections.") + return None + + # Filter for unique molecules + mols_to_draw, highlight_lists, highlight_colors = _filter_unique_molecules( + candidate_mols, candidate_highlights, candidate_colors + ) + + # Draw the grid + final_legends = ( + legends + if legends is not None + else [f"Molecule {i}" for i in range(len(mols_to_draw))] + ) + + img = Draw.MolsToGridImage( + mols_to_draw, + molsPerRow=mols_per_row, + subImgSize=sub_img_size, + legends=final_legends, + highlightAtomLists=highlight_lists, + highlightAtomColors=highlight_colors, + ) + return img diff --git a/src/molify/utils.py b/src/molify/utils.py new file mode 100644 index 0000000..8dd0852 --- /dev/null +++ b/src/molify/utils.py @@ -0,0 +1,497 @@ +import io +from collections import defaultdict +from typing import Literal, Optional, cast + +import ase.io +import ase.units +import matplotlib.pyplot as plt +import networkx as nx +import numpy as np +import rdkit.Chem +import rdkit.Chem.rdDetermineBonds +from ase.data.colors import jmol_colors +from matplotlib.axes import Axes +from matplotlib.figure import Figure +from rdkit import Chem + + +def bond_type_from_order(order): + if order == 1.0: + return Chem.BondType.SINGLE + elif order == 2.0: + return Chem.BondType.DOUBLE + elif order == 3.0: + return Chem.BondType.TRIPLE + elif order == 1.5: + return Chem.BondType.AROMATIC + else: + raise ValueError(f"Unsupported bond order: {order}") + + +def find_connected_components(connectivity: list[tuple[int, int, float]]): + try: + import networkx as nx + + graph = nx.Graph() + for i, j, _ in connectivity: + graph.add_edge(i, j) + for component in nx.connected_components(graph): + yield component + except ImportError: + adjacency = defaultdict(list) + for i, j, _ in connectivity: + adjacency[i].append(j) + adjacency[j].append(i) + + visited = set() + for start in adjacency: + if start in visited: + continue + + component = [] + stack = [start] + while stack: + node = stack.pop() + if node in visited: + continue + visited.add(node) + component.append(node) + stack.extend(n for n in adjacency[node] if n not in visited) + + yield component + + +def calculate_density(atoms: ase.Atoms) -> float: + """Calculates the density of an ASE Atoms object in kg/m^3. + + The density is calculated as the total mass (in kg) divided by the volume (in m^3). + """ + total_mass_kg = sum(atoms.get_masses()) * ase.units._amu # amu -> kg + volume_m3 = atoms.get_volume() * 1e-30 # Å^3 -> m^3 + density = total_mass_kg / volume_m3 # kg/m^3 + return density + + +def calculate_box_dimensions(images: list[ase.Atoms], density: float) -> list[float]: + """Calculates the dimensions of the simulation box + + based on the molar volume and target density. + """ + total_mass = sum(sum(atoms.get_masses()) for atoms in images) + molar_volume = total_mass / density / 1000 # m^3 / mol + volume_per_mol = molar_volume * ase.units.m**3 / ase.units.mol + box_edge = volume_per_mol ** (1 / 3) + return [box_edge] * 3 + + +def unwrap_structures(atoms, scale=1.2, **kwargs) -> ase.Atoms: + """Unwrap molecular structures across periodic boundary conditions (PBC). + + This function corrects atomic positions that have been wrapped across periodic + boundaries, ensuring that bonded atoms appear as continuous molecular structures. + It can handle multiple disconnected molecules within the same unit cell. + + The algorithm works by: + 1. Building a connectivity graph based on covalent radii + 2. Traversing each connected component (molecule) using depth-first search + 3. Accumulating periodic image shifts to maintain molecular connectivity + 4. Applying the shifts to obtain unwrapped coordinates + + Parameters + ---------- + atoms : ase.Atoms + The ASE Atoms object containing wrapped atomic positions + scale : float, optional + Scale factor for covalent radii cutoffs used in bond detection. + Larger values include more distant neighbors as bonded. + Default is 1.2. + **kwargs : dict + Additional keyword arguments to pass to the `ase2networkx` function. + + Returns + ------- + ase.Atoms + A new ASE Atoms object with unwrapped atomic positions. The original + atoms object is not modified. + + Notes + ----- + - The function preserves the original atoms object and returns a copy + - Works with any periodic boundary conditions (1D, 2D, or 3D) + - Handles multiple disconnected molecules/fragments + - Uses covalent radii scaled by the `scale` parameter for bond detection + + Examples + -------- + >>> import numpy as np + >>> from molify import smiles2conformers, pack, unwrap_structures + >>> + >>> # Create a realistic molecular system + >>> water = smiles2conformers("O", numConfs=1) + >>> ethanol = smiles2conformers("CCO", numConfs=1) + >>> + >>> # Pack molecules into a periodic box + >>> packed_system = pack( + ... data=[water, ethanol], + ... counts=[10, 5], + ... density=800 + ... ) + >>> + >>> # Simulate wrapped coordinates (as might occur in MD) + >>> cell = packed_system.get_cell() + >>> positions = packed_system.get_positions() + >>> + >>> # Artificially move the box and wrap it again + >>> positions += np.array([cell[0, 0] * 0.5, 0, 0]) # Shift by half box length + >>> wrapped_atoms = packed_system.copy() + >>> wrapped_atoms.set_positions(positions) + >>> wrapped_atoms.wrap() # Wrap back into PBC + >>> + >>> # Unwrap the structures to get continuous molecules + >>> unwrapped_atoms = unwrap_structures(wrapped_atoms) + """ + from molify import ase2networkx + + atoms = atoms.copy() # Work on a copy to avoid modifying the original + + graph = ase2networkx(atoms, scale=scale, **kwargs) + positions = atoms.get_positions() + cell = atoms.get_cell() + + for component in nx.connected_components(graph): + if len(component) == 1: + continue + # start at the atom closest to the center of the box + root = min( + component, key=lambda i: np.linalg.norm(positions[i] - cell.diagonal() / 2) + ) + # now do a bfs traversal to unwrap the molecule + for i, j in nx.dfs_tree(graph, source=root).edges(): + # i has already been unwrapped + # j is the neighbor that needs to be unwrapped + offsets = cell.scaled_positions(positions[i] - positions[j]) + offsets = offsets.round().astype(int) + positions[j] += offsets @ cell # Unwrap j to the same image as i + atoms.set_positions(positions) + # TODO: include connectivity information + return atoms + + +def rdkit_determine_bonds(unwrapped_atoms: ase.Atoms) -> rdkit.Chem.Mol: + if len(unwrapped_atoms) == 0: + raise ValueError("Cannot determine bonds for an empty structure.") + with io.StringIO() as f: + ase.io.write(f, unwrapped_atoms, format="xyz") + f.seek(0) + xyz = f.read() + mol = rdkit.Chem.MolFromXYZBlock(xyz) + if len(unwrapped_atoms) == 1: + if unwrapped_atoms.get_chemical_symbols()[0] in ["Li", "Na", "K", "Rb", "Cs"]: + return rdkit.Chem.MolFromSmiles( + f"[{unwrapped_atoms.get_chemical_symbols()[0]}+]" + ) + if unwrapped_atoms.get_chemical_symbols()[0] in ["Cl", "Br", "I", "F"]: + return rdkit.Chem.MolFromSmiles( + f"[{unwrapped_atoms.get_chemical_symbols()[0]}-]" + ) + if len(unwrapped_atoms) == 7: + if sorted(unwrapped_atoms.get_chemical_symbols()) == sorted( + ["P", "F", "F", "F", "F", "F", "F"] + ): + return rdkit.Chem.MolFromSmiles("F[P-](F)(F)(F)(F)F") + for charge in [0, 1, -1, 2, -2]: + try: + rdkit.Chem.rdDetermineBonds.DetermineBonds( + mol, + charge=int(sum(unwrapped_atoms.get_initial_charges())) + charge, + ) + return mol + except ValueError: + pass + else: + raise ValueError( + "Failed to determine bonds for sub-structure up to charge " + f"{sum(unwrapped_atoms.get_initial_charges()) + charge} " + f"and {unwrapped_atoms.get_chemical_symbols()}" + ) + + +def suggestions2networkx(smiles: list[str]) -> list[nx.Graph]: + from molify import rdkit2networkx + + mols = [] + for _smiles in smiles: + mol = Chem.MolFromSmiles(_smiles) + mol = Chem.AddHs(mol) + mols.append(mol) + return [rdkit2networkx(mol) for mol in mols] + + +def draw_molecular_graph( # noqa: C901 + graph: nx.Graph, + layout: Literal["spring", "circular", "kamada_kawai"] = "kamada_kawai", + figsize: tuple[float, float] = (8, 8), + node_size: int = 500, + font_size: Optional[int] = None, + show_bond_orders: bool = True, + weight_by_bond_order: bool = True, + ax: Optional[Axes] = None, +) -> Figure: + """Draw a molecular graph with bond order visualization. + + This function visualizes NetworkX molecular graphs with proper representation + of chemical bonds. Single, double, triple, and aromatic bonds are displayed + with appropriate line styles. + + Parameters + ---------- + graph : nx.Graph + NetworkX graph with node attribute 'atomic_number' and edge attribute + 'bond_order'. Can be created from molify conversion functions like + ase2networkx() or rdkit2networkx(). + layout : Literal["spring", "circular", "kamada_kawai"], optional + Layout algorithm to use for node positioning. Options are: + * `spring`: Force-directed layout + * `circular`: Nodes arranged in a circle + * `kamada_kawai`: Force-directed using Kamada-Kawai algorithm (default) + figsize : tuple[float, float], optional + Figure size as (width, height) in inches. Default is (8, 8). + node_size : int, optional + Size of the nodes. Default is 500. + font_size : int, optional + Font size for node labels (atomic numbers). If None, automatically scaled + based on node_size (approximately 0.66 * sqrt(node_size)). Default is None. + show_bond_orders : bool, optional + If True, visualize different bond orders with multiple parallel lines. + Default is True. + weight_by_bond_order : bool, optional + If True and layout is 'spring', use bond_order as edge weights in the + spring layout algorithm. Higher bond orders pull atoms closer together. + This makes double/triple bonds appear shorter than single bonds. + Default is True. + ax : Axes, optional + Matplotlib axes to draw on. If None, creates a new figure. + + Returns + ------- + Figure + Matplotlib figure containing the molecular graph visualization. + + Notes + ----- + **Node Colors:** + + - Nodes are colored using Jmol color scheme based on atomic numbers + - Common colors: Carbon (gray), Hydrogen (white), Oxygen (red), + Nitrogen (blue) + + **Bond Order Visualization:** + + - Single bond (1.0): 1 solid line + - Double bond (2.0): 2 parallel solid lines + - Triple bond (3.0): 3 parallel solid lines + - Aromatic bond (1.5): 1 solid line + 1 dashed line (parallel) + - Unknown (None): 1 thin solid line + + Examples + -------- + >>> from molify import smiles2atoms, ase2networkx, draw_molecular_graph + >>> atoms = smiles2atoms("C=C=O") # Ketene + >>> graph = ase2networkx(atoms) + >>> fig = draw_molecular_graph(graph, layout='spring') + + >>> # For benzene showing aromatic bonds + >>> benzene = smiles2atoms("c1ccccc1") + >>> graph_benzene = ase2networkx(benzene) + >>> fig = draw_molecular_graph(graph_benzene, show_bond_orders=True) + """ + # Calculate font_size and linewidth based on node_size if not provided + if font_size is None: + font_size = int(0.66 * np.sqrt(node_size)) + + linewidth = 0.091 * np.sqrt(node_size) + + # Create figure if axes not provided + if ax is None: + fig, ax = plt.subplots(figsize=figsize) + created_fig = True + else: + fig_or_none = ax.get_figure() + if fig_or_none is None: + raise ValueError("Provided axes is not attached to a figure") + # Cast to Figure (assuming user provides proper Axes, not SubFigure axes) + fig = cast(Figure, fig_or_none) + created_fig = False + + # Compute node positions using the specified layout + if layout == "spring": + if weight_by_bond_order: + # Use bond_order as weights - higher order = stronger spring + pos = nx.spring_layout(graph, weight="bond_order", seed=42) + else: + pos = nx.spring_layout(graph, seed=42) + elif layout == "circular": + pos = nx.circular_layout(graph) + elif layout == "kamada_kawai": + pos = nx.kamada_kawai_layout(graph) + else: + raise ValueError( + f"Unknown layout '{layout}'. " + f"Choose from 'spring', 'circular', 'kamada_kawai'." + ) + + # Draw edges with bond order visualization + if show_bond_orders: + _draw_edges_with_bond_orders(graph, pos, ax) + else: + nx.draw_networkx_edges(graph, pos, ax=ax, width=2) + + # Get node colors based on atomic numbers using Jmol colors + node_colors = [] + for node in graph.nodes(): + atomic_number = graph.nodes[node].get("atomic_number", 0) + # jmol_colors is indexed by atomic number (1-indexed for elements) + if atomic_number > 0 and atomic_number < len(jmol_colors): + node_colors.append(jmol_colors[atomic_number]) + else: + node_colors.append([0.5, 0.5, 0.5]) # Gray for unknown + + # Draw nodes with Jmol colors + nx.draw_networkx_nodes( + graph, + pos, + node_size=node_size, + node_color=node_colors, + edgecolors="black", + linewidths=linewidth, + ax=ax, + ) + + # Draw labels (atomic numbers) + labels = nx.get_node_attributes(graph, "atomic_number") + nx.draw_networkx_labels( + graph, pos, labels=labels, font_size=font_size, font_color="black", ax=ax + ) + + # Add margins to prevent node clipping at edges + ax.margins(0.15) + ax.axis("off") + fig.tight_layout() + + # Close figure to prevent double display in notebooks + # (only if we created it; otherwise it's managed externally) + if created_fig: + plt.close(fig) + + return fig + + +def _draw_edges_with_bond_orders( + graph: nx.Graph, pos: dict, ax: Axes, line_offset: float = 0.02 +) -> None: + """Draw edges with multiple parallel lines based on bond order. + + Parameters + ---------- + graph : nx.Graph + NetworkX graph with edge attribute 'bond_order' + pos : dict + Dictionary mapping node IDs to (x, y) positions + ax : Axes + Matplotlib axes to draw on + line_offset : float + Perpendicular offset between parallel lines for multiple bonds + """ + for u, v, data in graph.edges(data=True): + bond_order = data.get("bond_order") + + # Get node positions + x0, y0 = pos[u] + x1, y1 = pos[v] + + # Calculate perpendicular direction for parallel lines + dx = x1 - x0 + dy = y1 - y0 + length = np.sqrt(dx**2 + dy**2) + + if length == 0: + continue + + # Perpendicular unit vector + perp_x = -dy / length + perp_y = dx / length + + if bond_order is None: + # Unknown bond order - draw thin line + ax.plot([x0, x1], [y0, y1], "k-", linewidth=1, zorder=1) + + elif bond_order == 1.0: + # Single bond + ax.plot([x0, x1], [y0, y1], "k-", linewidth=2, zorder=1) + + elif bond_order == 2.0: + # Double bond - two parallel lines + offset = line_offset + for sign in [-1, 1]: + x0_offset = x0 + sign * offset * perp_x + y0_offset = y0 + sign * offset * perp_y + x1_offset = x1 + sign * offset * perp_x + y1_offset = y1 + sign * offset * perp_y + ax.plot( + [x0_offset, x1_offset], + [y0_offset, y1_offset], + "k-", + linewidth=2, + zorder=1, + ) + + elif bond_order == 3.0: + # Triple bond - three parallel lines + offset = line_offset + # Center line + ax.plot([x0, x1], [y0, y1], "k-", linewidth=2, zorder=1) + # Two outer lines + for sign in [-1, 1]: + x0_offset = x0 + sign * offset * perp_x + y0_offset = y0 + sign * offset * perp_y + x1_offset = x1 + sign * offset * perp_x + y1_offset = y1 + sign * offset * perp_y + ax.plot( + [x0_offset, x1_offset], + [y0_offset, y1_offset], + "k-", + linewidth=2, + zorder=1, + ) + + elif bond_order == 1.5: + # Aromatic bond - one solid and one dashed line + offset = line_offset * 0.7 + # Solid line + x0_offset = x0 - offset * perp_x + y0_offset = y0 - offset * perp_y + x1_offset = x1 - offset * perp_x + y1_offset = y1 - offset * perp_y + ax.plot( + [x0_offset, x1_offset], + [y0_offset, y1_offset], + "k-", + linewidth=2, + zorder=1, + ) + # Dashed line + x0_offset = x0 + offset * perp_x + y0_offset = y0 + offset * perp_y + x1_offset = x1 + offset * perp_x + y1_offset = y1 + offset * perp_y + ax.plot( + [x0_offset, x1_offset], + [y0_offset, y1_offset], + "k--", + linewidth=2, + zorder=1, + ) + + else: + # Unknown bond order value - draw single line + ax.plot([x0, x1], [y0, y1], "k-", linewidth=2, zorder=1) diff --git a/tests/conftest.py b/tests/conftest.py index 1d84ba2..b4ac3ba 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,9 +8,7 @@ def ethanol_water(): ethanol = molify.smiles2conformers("CCO", numConfs=100) water = molify.smiles2conformers("O", numConfs=100) - box = molify.pack( - [ethanol, water], counts=[2, 2], density=700, packmol="packmol.jl" - ) + box = molify.pack([ethanol, water], counts=[2, 2], density=700) return box.copy() @@ -23,7 +21,5 @@ def alanine_dipeptide() -> ase.Atoms: @pytest.fixture(scope="session") def alanine_dipeptide_box(alanine_dipeptide) -> ase.Atoms: """Box of alanine dipeptide molecules using molify.pack""" - box = molify.pack( - [[alanine_dipeptide]], counts=[3], density=500, packmol="packmol.jl" - ) + box = molify.pack([[alanine_dipeptide]], counts=[3], density=500) return box.copy() diff --git a/tests/integration/test_ase2x.py b/tests/integration/test_ase2x.py index 5769807..c2458d4 100644 --- a/tests/integration/test_ase2x.py +++ b/tests/integration/test_ase2x.py @@ -25,7 +25,6 @@ def ec_emc_li_pf6(): data=[atoms_pf6, atoms_li, atoms_ec, atoms_emc], counts=[3, 3, 8, 12], density=1400, - packmol="packmol.jl", ) diff --git a/tests/integration/test_networkx2x.py b/tests/integration/test_networkx2x.py index bd2c5b6..f3735c7 100644 --- a/tests/integration/test_networkx2x.py +++ b/tests/integration/test_networkx2x.py @@ -23,7 +23,6 @@ def ec_emc_li_pf6(): data=[atoms_pf6, atoms_li, atoms_ec, atoms_emc], counts=[3, 3, 8, 12], density=1400, - packmol="packmol.jl", ) diff --git a/tests/test_com.py b/tests/test_com.py index cb6759f..1becf9c 100644 --- a/tests/test_com.py +++ b/tests/test_com.py @@ -104,10 +104,7 @@ def test_com_with_packed_system(shift): density = 900 # kg/m^3 packed_system = molify.pack( - [water_template, ethanol_template], - [num_water, num_ethanol], - density, - packmol="packmol.jl", + [water_template, ethanol_template], [num_water, num_ethanol], density ) packed_system.positions += np.array([shift, shift, shift]) packed_system.wrap() @@ -142,7 +139,6 @@ def test_get_centers_of_mass_species(): [a, b, c, d], [1, 2, 3, 4], density=786, - packmol="packmol.jl", ) com = molify.get_centers_of_mass(box) diff --git a/tests/test_compress.py b/tests/test_compress.py index 6451237..5b9f408 100644 --- a/tests/test_compress.py +++ b/tests/test_compress.py @@ -4,11 +4,10 @@ from molify.utils import calculate_density -@pytest.mark.parametrize("packmol", ["packmol.jl", "packmol"]) -def test_compress(packmol): +def test_compress(): water = molify.smiles2conformers("O", 1) # pack a box - atoms = molify.pack([water], [10], density=500, packmol=packmol) + atoms = molify.pack([water], [10], density=500) density = calculate_density(atoms) assert density == pytest.approx(500, abs=0.01) @@ -22,11 +21,10 @@ def test_compress(packmol): assert density == pytest.approx(1000, abs=0.01) -@pytest.mark.parametrize("packmol", ["packmol.jl", "packmol"]) -def test_compress_freeze(packmol): +def test_compress_freeze(): water = molify.smiles2conformers("O", 1) # pack a box - atoms = molify.pack([water], [10], density=500, packmol=packmol) + atoms = molify.pack([water], [10], density=500) density = calculate_density(atoms) assert density == pytest.approx(500, abs=0.01) diff --git a/tests/test_solvate.py b/tests/test_solvate.py index 253d830..2ca6de3 100644 --- a/tests/test_solvate.py +++ b/tests/test_solvate.py @@ -6,10 +6,9 @@ from molify import ase2rdkit, pack, smiles2conformers -@pytest.mark.parametrize("packmol", ["packmol", "packmol.jl"]) -def test_pack_clean_info_arrays(packmol): +def test_pack_clean_info_arrays(): water = smiles2conformers("O", 1) - atoms = pack([water], [10], 997, 42, tolerance=1.5, packmol=packmol) + atoms = pack([water], [10], 997, 42, tolerance=1.5) # we don't want to have unused info in the atoms object. assert "atomtypes" not in atoms.arrays assert "bfactor" not in atoms.arrays @@ -18,61 +17,53 @@ def test_pack_clean_info_arrays(packmol): assert "residuenumbers" not in atoms.arrays -@pytest.mark.parametrize("packmol", ["packmol", "packmol.jl"]) -def test_pack_pbc(packmol): +def test_pack_pbc(): water = smiles2conformers("O", 1) mol_dist = water[0].get_all_distances() min_mol_dist = mol_dist[mol_dist > 0].min() # pack a box - atoms = pack([water], [10], 997, 42, tolerance=1.5, packmol=packmol) + atoms = pack([water], [10], 997, 42, tolerance=1.5) atoms_dist = atoms.get_all_distances(mic=True) assert len(atoms) == np.sum(atoms_dist < min_mol_dist * 0.99) -@pytest.mark.parametrize("packmol", ["packmol", "packmol.jl"]) -def test_pack_seeded(packmol): +def test_pack_seeded(): water = smiles2conformers("O", 1) - atoms1 = pack([water], [1], 1000, seed=42, packmol=packmol) - atoms2 = pack([water], [1], 1000, seed=42, packmol=packmol) - + atoms1 = pack([water], [1], 1000, seed=42) + atoms2 = pack([water], [1], 1000, seed=42) assert np.all(atoms1.get_positions() == atoms2.get_positions()) - atoms3 = pack([water], [1], 1000, seed=43, packmol=packmol) + atoms3 = pack([water], [1], 1000, seed=43) assert not np.all(atoms1.get_positions() == atoms3.get_positions()) -@pytest.mark.parametrize("packmol", ["packmol", "packmol.jl"]) -def test_pack_density(packmol): +def test_pack_density(): ethanol = smiles2conformers("CCO", 1) water = smiles2conformers("O", 2) hydrochloric_acid = smiles2conformers("Cl", 3) - atoms = pack([ethanol], [1], density=1000, packmol=packmol) + atoms = pack([ethanol], [1], density=1000) assert atoms.get_chemical_formula() == "C2H6O" - atoms = pack([ethanol], [2], density=1000, packmol=packmol) + atoms = pack([ethanol], [2], density=1000) assert atoms.get_chemical_formula() == "C4H12O2" - atoms = pack( - [ethanol, water, hydrochloric_acid], [2, 1, 3], density=1000, packmol=packmol - ) + atoms = pack([ethanol, water, hydrochloric_acid], [2, 1, 3], density=1000) assert atoms.get_chemical_formula() == "C4H17Cl3O3" -@pytest.mark.parametrize("packmol", ["packmol", "packmol.jl"]) -def test_pack_atoms(packmol): +def test_pack_atoms(): methane = smiles2conformers("C", 10) - atoms = pack([methane], [2], density=800, packmol=packmol) + atoms = pack([methane], [2], density=800) assert atoms.get_chemical_formula() == "C2H8" assert atoms.get_volume() == pytest.approx(66.6, abs=0.001) -@pytest.mark.parametrize("packmol", ["packmol", "packmol.jl"]) -def test_pack_connectivity(packmol): +def test_pack_connectivity(): water = smiles2conformers("O", 1) formaldehyde = smiles2conformers("C=O", 1) hydrochloric_acid = smiles2conformers("Cl", 1) @@ -81,7 +72,6 @@ def test_pack_connectivity(packmol): [formaldehyde, water, hydrochloric_acid], [1, 1, 1], density=1000, - packmol=packmol, ) assert atoms.get_chemical_formula() == "CH5ClO2" assert atoms.info["connectivity"] == [(0, 1, 2.0), (0, 2, 1.0), (0, 3, 1.0)] + [ @@ -92,8 +82,7 @@ def test_pack_connectivity(packmol): npt.assert_array_equal(atoms.get_atomic_numbers(), [6, 8, 1, 1, 8, 1, 1, 17, 1]) -@pytest.mark.parametrize("packmol", ["packmol", "packmol.jl"]) -def test_pack_charges(packmol): +def test_pack_charges(): water = smiles2conformers("O", 1) sodiumcyanide = smiles2conformers("[C-]#N.[Na+]", 1) glycine = smiles2conformers("[NH3+]CC([O-])=O", 1) # small zwitterion @@ -102,7 +91,6 @@ def test_pack_charges(packmol): [water, sodiumcyanide, glycine], [1, 1, 1], density=1000, - packmol=packmol, ) npt.assert_array_equal( atoms.get_atomic_numbers(), [8, 1, 1, 6, 7, 11] + [7, 6, 6, 8, 8, 1, 1, 1, 1, 1] @@ -121,18 +109,17 @@ def test_pack_charges(packmol): assert charges == [0, 0, 0, -1, 0, 1] + [1, 0, 0, -1, 0, 0, 0, 0, 0, 0] -@pytest.mark.parametrize("packmol", ["packmol", "packmol.jl"]) -def test_pack_ratio(packmol): +def test_pack_ratio(): water = smiles2conformers("O", 1) # pack a cubic box - box = pack([water], [10], 1000, 42, tolerance=1.5, packmol=packmol) + box = pack([water], [10], 1000, 42, tolerance=1.5) assert box.cell[0, 0] == pytest.approx(box.cell[1, 1]) assert box.cell[1, 1] == pytest.approx(box.cell[2, 2]) assert box.get_volume() == pytest.approx(300, rel=1e-2) # npt.assert_allclose(box.get_positions(), box.get_positions(wrap=True)) # pack a rectangular box - box = pack([water], [10], 997, 42, ratio=(1, 2, 3), tolerance=1.5, packmol=packmol) + box = pack([water], [10], 997, 42, ratio=(1, 2, 3), tolerance=1.5) assert box.cell[0, 0] * 2 == pytest.approx(box.cell[1, 1]) assert box.cell[0, 0] * 3 == pytest.approx(box.cell[2, 2]) assert box.get_volume() == pytest.approx(300, rel=1e-2) diff --git a/tests/test_substructure.py b/tests/test_substructure.py index 1a6f460..f4e5b4a 100644 --- a/tests/test_substructure.py +++ b/tests/test_substructure.py @@ -6,110 +6,59 @@ def test_match_substructure(): atoms = molify.smiles2atoms("CC(=O)O") + mol = molify.ase2rdkit(atoms, suggestions=["CC(=O)O"]) - # match CH3 fragment using smarts - match = molify.match_substructure(atoms, smarts="[C]([H])([H])[H]") + # match CH3 fragment (carbon with 3 hydrogens) + match = molify.match_substructure(mol, "[C;H3]", hydrogens="include") assert match == ((0, 4, 5, 6),) assert atoms[match[0]].get_chemical_symbols() == ["C", "H", "H", "H"] - # now match using a ase.Atoms object - ref = molify.smiles2atoms("[C]([H])([H])[H]") - match = molify.match_substructure(atoms, fragment=ref) - assert match == ((0, 4, 5, 6),) - - # now match using a Chem.Mol object - ref_mol = Chem.MolFromSmarts("[C]([H])([H])[H]") - match = molify.match_substructure(atoms, mol=ref_mol) - assert match == ((0, 4, 5, 6),) - - # check everything else raises TypeError - with pytest.raises(TypeError): - molify.match_substructure(atoms, 42) # type: ignore[arg-type] - - -@pytest.mark.parametrize("packmol", ["packmol.jl"]) -def test_match_substructur_box(packmol): +def test_match_substructure_box(): atoms = molify.smiles2conformers("CC(=O)O", 1) - box = molify.pack([atoms], counts=[3], packmol=packmol, density=0.5) + box = molify.pack([atoms], counts=[3], density=0.5) + mol = molify.ase2rdkit(box, suggestions=["CC(=O)O"]) - # match CH3 fragment using smarts - match = molify.match_substructure(box, smarts="[C]([H])([H])[H]") + # match CH3 fragment (carbon with 3 hydrogens) + match = molify.match_substructure(mol, "[C;H3]", hydrogens="include") assert match == ((0, 4, 5, 6), (8, 12, 13, 14), (16, 20, 21, 22)) for m in match: assert box[m].get_chemical_symbols() == ["C", "H", "H", "H"] - # now match using a ase.Atoms object - ref = molify.smiles2atoms("[C]([H])([H])[H]") - match = molify.match_substructure(box, fragment=ref) - assert match == ((0, 4, 5, 6), (8, 12, 13, 14), (16, 20, 21, 22)) - - # now match using a Chem.Mol object - ref_mol = Chem.MolFromSmarts("[C]([H])([H])[H]") - match = molify.match_substructure(box, mol=ref_mol) - assert match == ((0, 4, 5, 6), (8, 12, 13, 14), (16, 20, 21, 22)) - - # check everything else raises TypeError - with pytest.raises(TypeError): - molify.match_substructure(box, 42) - def test_get_substructure(): atoms = molify.smiles2atoms("C(C(CO[N+](=O)[O-])O[N+](=O)[O-])O[N+](=O)[O-]") # match NO3 group using smarts - frames = molify.get_substructures(atoms, smarts="[N+](=O)[O-]") - assert len(frames) == 3 - for frame in frames: - assert frame.get_chemical_symbols() == ["N", "O", "O"] - - # match using a ase.Atoms object - ref = molify.smiles2atoms("[N+](=O)[O-]") - frames = molify.get_substructures(atoms, fragment=ref) - assert len(frames) == 3 - for frame in frames: - assert frame.get_chemical_symbols() == ["N", "O", "O"] - - # match using a Chem.Mol object - ref_mol = Chem.MolFromSmarts("[N+](=O)[O-]") - frames = molify.get_substructures(atoms, mol=ref_mol) + frames = molify.get_substructures( + atoms, + "[N+](=O)[O-]", + suggestions=["C(C(CO[N+](=O)[O-])O[N+](=O)[O-])O[N+](=O)[O-]"], + ) assert len(frames) == 3 for frame in frames: assert frame.get_chemical_symbols() == ["N", "O", "O"] -@pytest.mark.parametrize("packmol", ["packmol.jl"]) -def test_get_substructure_box(packmol): +def test_get_substructure_box(): atoms = molify.smiles2conformers( "C(C(CO[N+](=O)[O-])O[N+](=O)[O-])O[N+](=O)[O-]", 1 ) - box = molify.pack([atoms], counts=[3], packmol=packmol, density=0.5) - + box = molify.pack([atoms], counts=[3], density=0.5) # match NO3 group using smarts - frames = molify.get_substructures(box, smarts="[N+](=O)[O-]") - assert len(frames) == 9 - for frame in frames: - assert frame.get_chemical_symbols() == ["N", "O", "O"] - - # match using a ase.Atoms object - ref = molify.smiles2atoms("[N+](=O)[O-]") - frames = molify.get_substructures(box, fragment=ref) - assert len(frames) == 9 - for frame in frames: - assert frame.get_chemical_symbols() == ["N", "O", "O"] - - # match using a Chem.Mol object - ref_mol = Chem.MolFromSmarts("[N+](=O)[O-]") - frames = molify.get_substructures(box, mol=ref_mol) + frames = molify.get_substructures( + box, + "[N+](=O)[O-]", + suggestions=["C(C(CO[N+](=O)[O-])O[N+](=O)[O-])O[N+](=O)[O-]"], + ) assert len(frames) == 9 for frame in frames: assert frame.get_chemical_symbols() == ["N", "O", "O"] @pytest.mark.parametrize("remove_connectivity", [True, False]) -@pytest.mark.parametrize("packmol", ["packmol.jl"]) -def test_iter_fragments(packmol, remove_connectivity): +def test_iter_fragments(remove_connectivity): water = molify.smiles2conformers("O", 1) - box = molify.pack([water], [10], density=500, packmol=packmol) + box = molify.pack([water], [10], density=500) if remove_connectivity: del box.info["connectivity"] fragments = list(molify.iter_fragments(box)) @@ -126,21 +75,23 @@ def test_bmim_bf4_no_info(): [bmim, bf4], counts=[10, 10], density=500, - packmol="packmol.jl", tolerance=3, ) del box.info["connectivity"] - bf4_matches = molify.match_substructure( - box, smiles="[B-](F)(F)(F)F", suggestions=[] - ) + + # Convert to RDKit Mol with suggestions for proper bond detection + # Without connectivity, we need suggestions to detect aromatic bonds correctly + mol = molify.ase2rdkit(box, suggestions=["CCCCN1C=C[N+](=C1)C", "[B-](F)(F)(F)F"]) + + bf4_matches = molify.match_substructure(mol, "[B-](F)(F)(F)F") assert len(bf4_matches) == 10 for match in bf4_matches: assert box[match].get_chemical_symbols() == bf4[0].get_chemical_symbols() + # Note: RDKit perceives the imidazolium ring as aromatic, so we use + # lowercase notation bmim_matches = molify.match_substructure( - box, - smiles="CCCCN1C=C[N+](=C1)C", - suggestions=[], + mol, "CCCCn1cc[n+](C)c1", hydrogens="include" ) assert len(bmim_matches) == 10 for match in bmim_matches: @@ -149,17 +100,38 @@ def test_bmim_bf4_no_info(): bmim[0].get_chemical_symbols() ) - bmim_matches = molify.match_substructure( - box, - smarts="[H]c1c([H])[n+](C([H])([H])[H])c([H])n1C([H])([H])C([H])([H])C([H])([H])C([H])([H])[H]", - suggestions=[], + # Also test with explicit hydrogen SMARTS pattern + # Note: patterns with explicit [H] should use default hydrogens="exclude" + # since the [H] atoms are part of the pattern itself + bmim_matches_smarts = molify.match_substructure( + mol, + "[H]c1c([H])[n+](C([H])([H])[H])c([H])n1C([H])([H])C([H])([H])C([H])([H])C([H])([H])[H]", + hydrogens="exclude", ) - assert len(bmim_matches) == 10 - for match in bmim_matches: - assert len(match) == 25 - assert sorted(box[match].get_chemical_symbols()) == sorted( - bmim[0].get_chemical_symbols() - ) + assert len(bmim_matches_smarts) == 10 + for match in bmim_matches_smarts: + # When pattern has explicit [H], only heavy atoms are returned by default + assert len(match) == 10 + + bmim_matches_smarts = molify.match_substructure( + mol, + "[H]c1c([H])[n+](C([H])([H])[H])c([H])n1C([H])([H])C([H])([H])C([H])([H])C([H])([H])[H]", + hydrogens="isolated", + ) + assert len(bmim_matches_smarts) == 10 + for match in bmim_matches_smarts: + # explicit only hydrogens are returned + assert len(match) == 15 + + bmim_matches_smarts = molify.match_substructure( + mol, + "[H]c1c([H])[n+](C([H])([H])[H])c([H])n1C([H])([H])C([H])([H])C([H])([H])C([H])([H])[H]", + hydrogens="include", + ) + assert len(bmim_matches_smarts) == 10 + for match in bmim_matches_smarts: + # explicit only hydrogens are returned + assert len(match) == 25 # 10 heavy + 15 H @pytest.fixture @@ -177,27 +149,30 @@ def toluene_mol(): # ============================================================================= -# Test Cases for select_atoms_flat_unique +# Test Cases for match_substructure with hydrogen handling # ============================================================================= def test_select_carbons(ethanol_mol): """Test selecting all carbon atoms.""" # Ethanol (CCO with Hs): C(0), C(1), O(2), H(3-8) - indices = molify.select_atoms_flat_unique(ethanol_mol, "[#6]") + matches = molify.match_substructure(ethanol_mol, "[#6]") + # Flatten to get all matched indices + indices = [idx for match in matches for idx in match] assert sorted(indices) == [0, 1] def test_select_oxygen(ethanol_mol): """Test selecting the oxygen atom.""" - indices = molify.select_atoms_flat_unique(ethanol_mol, "[#8]") + matches = molify.match_substructure(ethanol_mol, "[#8]") + indices = [idx for match in matches for idx in match] assert sorted(indices) == [2] def test_no_matches(ethanol_mol): """Test a SMARTS pattern that has no matches.""" - indices = molify.select_atoms_flat_unique(ethanol_mol, "[F]") # Fluorine - assert indices == [] + matches = molify.match_substructure(ethanol_mol, "[F]") # Fluorine + assert matches == () # --- Hydrogen Handling Tests --- @@ -206,41 +181,37 @@ def test_no_matches(ethanol_mol): def test_hydrogens_excluded_by_default(ethanol_mol): """Test that hydrogens are excluded by default.""" # C-O bond involves atoms 1 and 2. Hydrogens attached are not included. - indices = molify.select_atoms_flat_unique(ethanol_mol, "CO") - assert sorted(indices) == [1, 2] + matches = molify.match_substructure(ethanol_mol, "CO") + assert matches == ((1, 2),) def test_hydrogens_included(ethanol_mol): """Test the 'include' option for hydrogens.""" # C-O bond (atoms 1, 2) plus attached hydrogens (atoms 6, 7, 8) # H on O is atom 8. Hs on C(1) are 6, 7. - indices = molify.select_atoms_flat_unique(ethanol_mol, "CO", hydrogens="include") - # Expected: C(1), O(2), H(6), H(7), H(8) - assert sorted(indices) == [1, 2, 6, 7, 8] + matches = molify.match_substructure(ethanol_mol, "CO", hydrogens="include") + # Expected: C(1), H(6), H(7), O(2), H(8) + assert matches == ((1, 6, 7, 2, 8),) def test_hydrogens_isolated(ethanol_mol): """Test the 'isolated' option for hydrogens.""" # Select ONLY the hydrogens from the C-O match - indices = molify.select_atoms_flat_unique(ethanol_mol, "CO", hydrogens="isolated") + matches = molify.match_substructure(ethanol_mol, "CO", hydrogens="isolated") # Expected: H(6), H(7), H(8) - assert sorted(indices) == [6, 7, 8] + assert matches == ((6, 7, 8),) def test_smarts_with_explicit_hydrogens(ethanol_mol): """Test a SMARTS pattern that explicitly includes hydrogens.""" - # Find all hydrogens attached to an oxygen - indices = molify.select_atoms_flat_unique( - ethanol_mol, "[#8]-[H]", hydrogens="include" - ) - # Expected: O(2), H(8) - assert sorted(indices) == [2, 8] + # Find oxygen attached to hydrogen (pattern includes both O and H) + # With default hydrogens="exclude", we get only the heavy atom (oxygen) + matches_exclude = molify.match_substructure(ethanol_mol, "[#8]-[H]") + assert matches_exclude == ((2,),) - # Now isolate only the hydrogen from that match - h_indices = molify.select_atoms_flat_unique( - ethanol_mol, "[#8]-[H]", hydrogens="isolated" - ) - assert sorted(h_indices) == [8] + # With hydrogens="isolated", we get only the hydrogen from the match + h_matches = molify.match_substructure(ethanol_mol, "[#8]-[H]", hydrogens="isolated") + assert h_matches == ((8,),) # --- Mapped SMILES Tests --- @@ -250,35 +221,34 @@ def test_mapped_smiles(ethanol_mol): """Test selecting only mapped atoms using a mapped SMILES pattern.""" # The pattern "[C:1][C:2]O" matches atoms 0, 1, and 2, # but only C:1 and C:2 are mapped. - # The function should now return only the indices of the mapped atoms. - indices = molify.select_atoms_flat_unique(ethanol_mol, "[C:1][C:2]O") - # FIX: The test's expectation is updated to only expect the mapped carbons [0, 1]. - assert sorted(indices) == [0, 1] + # With mapped_only=True, should return only the mapped atoms. + matches = molify.match_substructure(ethanol_mol, "[C:1][C:2]O", mapped_only=True) + assert matches == ((0, 1),) def test_mapped_smiles_with_hydrogens(ethanol_mol): """Test mapped SMILES with hydrogen filtering.""" # Pattern "C[O:1]" matches atoms C(1) and O(2), but only O(2) is mapped. - # The core selection will be just atom 2. + # With mapped_only=True, core selection will be just atom 2. # Include hydrogens attached to the mapped oxygen - indices_included = molify.select_atoms_flat_unique( - ethanol_mol, "C[O:1]", hydrogens="include" + matches_included = molify.match_substructure( + ethanol_mol, "C[O:1]", hydrogens="include", mapped_only=True ) # Expected: O(2) and its hydrogen H(8) - assert sorted(indices_included) == [2, 8] + assert matches_included == ((2, 8),) # Exclude hydrogens (returns just the mapped heavy atom) - indices_excluded = molify.select_atoms_flat_unique( - ethanol_mol, "C[O:1]", hydrogens="exclude" + matches_excluded = molify.match_substructure( + ethanol_mol, "C[O:1]", hydrogens="exclude", mapped_only=True ) - assert sorted(indices_excluded) == [2] + assert matches_excluded == ((2,),) # Isolate only hydrogens attached to the mapped oxygen - indices_isolated = molify.select_atoms_flat_unique( - ethanol_mol, "C[O:1]", hydrogens="isolated" + matches_isolated = molify.match_substructure( + ethanol_mol, "C[O:1]", hydrogens="isolated", mapped_only=True ) - assert sorted(indices_isolated) == [8] + assert matches_isolated == ((8,),) # --- Error Handling Tests --- @@ -288,248 +258,160 @@ def test_invalid_smarts_raises_error(): """Test that an invalid SMARTS string raises a ValueError.""" mol = Chem.MolFromSmiles("C") with pytest.raises(ValueError, match="Invalid SMARTS/SMILES"): - molify.select_atoms_flat_unique(mol, "this is not valid") + molify.match_substructure(mol, "this is not valid") # ============================================================================= -# Test Cases for visualize_selected_molecules +# Test Cases for group_matches_by_fragment # ============================================================================= -def test_visualize_selected_molecules_basic(ethanol_mol): - """Test basic visualization functionality.""" - # Select some atoms to highlight - a = [0, 1] # Carbons - b = [2] # Oxygen - - img = molify.visualize_selected_molecules(ethanol_mol, a, b) - assert img is not None - - -def test_visualize_selected_molecules_empty_selections(ethanol_mol): - """Test visualization with empty selections - shows molecule without highlights.""" - img = molify.visualize_selected_molecules(ethanol_mol) - assert img is not None - - -def test_visualize_selected_molecules_overlapping_selections(ethanol_mol): - """Test visualization with overlapping selections (later args take precedence).""" - a = [0, 1, 2] # All heavy atoms - b = [2] # Oxygen (should get color from b, not a) - - img = molify.visualize_selected_molecules(ethanol_mol, a, b) - assert img is not None - - -def test_visualize_selected_molecules_single_selection(ethanol_mol): - """Test visualization with a single selection.""" - a = [0, 1] # Carbons - - img = molify.visualize_selected_molecules(ethanol_mol, a) - assert img is not None - - -def test_visualize_selected_molecules_multiple_selections(ethanol_mol): - """Test visualization with multiple selections.""" - a = [0] # First carbon - b = [1] # Second carbon - c = [2] # Oxygen - - img = molify.visualize_selected_molecules(ethanol_mol, a, b, c) - assert img is not None - - -def test_visualize_selected_molecules_with_alpha(ethanol_mol): - """Test visualization with custom alpha value.""" - a = [0, 1] # Carbons - b = [2] # Oxygen - - # Test with different alpha values - img_transparent = molify.visualize_selected_molecules(ethanol_mol, a, b, alpha=0.2) - assert img_transparent is not None - - img_opaque = molify.visualize_selected_molecules(ethanol_mol, a, b, alpha=1.0) - assert img_opaque is not None - - -def test_select_atoms_grouped(ethanol_water): - """Test selecting atoms from disconnected fragments.""" +def test_group_matches_by_fragment(ethanol_water): + """Test grouping matches from disconnected fragments.""" # ethanol_water is an ase.Atoms object with 2 ethanol and 2 water molecules. - # We need to convert it to an RDKit Mol object first. mol = molify.ase2rdkit(ethanol_water) # Test 1: Select all carbon atoms. - # Should find 2 groups (the two ethanol molecules), each with 2 carbons. - indices_carbons = molify.select_atoms_grouped(mol, "[#6]") - assert indices_carbons == [[0, 1], [9, 10]] + # Should find 4 matches (2 per ethanol) + matches = molify.match_substructure(mol, "[#6]") + assert len(matches) == 4 + + # Group by fragment - should find 2 groups (the two ethanol molecules) + grouped = molify.group_matches_by_fragment(mol, matches) + assert grouped == [[0, 1], [9, 10]] + # Verify they are indeed carbons - for group in indices_carbons: + for group in grouped: for idx in group: assert mol.GetAtomWithIdx(idx).GetAtomicNum() == 6 # Test 2: Select all oxygen atoms. - # Should find 4 groups (2 ethanol, 2 water), each with 1 oxygen. - indices_oxygens = molify.select_atoms_grouped(mol, "[#8]") - assert indices_oxygens == [[2], [11], [18], [21]] + matches_oxygen = molify.match_substructure(mol, "[#8]") + grouped_oxygen = molify.group_matches_by_fragment(mol, matches_oxygen) + assert grouped_oxygen == [[2], [11], [18], [21]] + # Verify they are indeed oxygens - for group in indices_oxygens: + for group in grouped_oxygen: for idx in group: assert mol.GetAtomWithIdx(idx).GetAtomicNum() == 8 # Test 3: Select a non-existent atom. - indices_fluorine = molify.select_atoms_grouped(mol, "[F]") - assert indices_fluorine == [] - - # Test 4: Select hydroxyl group in ethanol, including hydrogens. - indices_hydroxyl = molify.select_atoms_grouped(mol, "[OH]", hydrogens="include") - assert indices_hydroxyl == [[2, 8], [11, 17]] - for group in indices_hydroxyl: - symbols = [mol.GetAtomWithIdx(idx).GetSymbol() for idx in group] - assert "O" in symbols - assert "H" in symbols + matches_fluorine = molify.match_substructure(mol, "[F]") + grouped_fluorine = molify.group_matches_by_fragment(mol, matches_fluorine) + assert grouped_fluorine == [] def test_use_label_multiple_times(alanine_dipeptide): """Test selecting atoms using the same label multiple times.""" mol = molify.ase2rdkit(alanine_dipeptide) - with pytest.raises(ValueError, match="Label '1' is used multiple times"): - # we do not allow the same label to be used multiple for selection, + with pytest.raises(ValueError, match="Atom map label '1' is used multiple times"): + # we do not allow the same label to be used multiple times for selection, # need to be unique - molify.select_atoms_grouped(mol, smarts_or_smiles="CC(=O)N[C:1]([C:1])C(=O)NC") + molify.match_substructure(mol, "CC(=O)N[C:1]([C:1])C(=O)NC", mapped_only=True) -def test_select_atoms_grouped_order(alanine_dipeptide): +def test_match_substructure_mapped_order(alanine_dipeptide): + """Test that mapped atoms are returned in map number order.""" mol = molify.ase2rdkit(alanine_dipeptide) - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:1](C)C(=O)NC" - ) - assert indices == [[4]] - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)NC([C:1])C(=O)NC" - ) - assert indices == [[5]] + # Select single mapped atom + matches = molify.match_substructure(mol, "CC(=O)N[C:1](C)C(=O)NC", mapped_only=True) + assert matches == ((4,),) - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)NC(C)[C:1](=O)NC" - ) - assert indices == [[6]] + matches = molify.match_substructure(mol, "CC(=O)NC([C:1])C(=O)NC", mapped_only=True) + assert matches == ((5,),) - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)NC(C)C(=O)[N:1]C" - ) - assert indices == [[8]] + matches = molify.match_substructure(mol, "CC(=O)NC(C)[C:1](=O)NC", mapped_only=True) + assert matches == ((6,),) + + matches = molify.match_substructure(mol, "CC(=O)NC(C)C(=O)[N:1]C", mapped_only=True) + assert matches == ((8,),) - # now all of them - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:1]([C:2])[C:3](=O)[N:4]C" + # now all of them in order + matches = molify.match_substructure( + mol, "CC(=O)N[C:1]([C:2])[C:3](=O)[N:4]C", mapped_only=True ) - assert indices == [[4, 5, 6, 8]] - # now in a different order - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:4]([C:3])[C:2](=O)[N:1]C" + assert matches == ((4, 5, 6, 8),) + + # now in a different order (should still return in map number order: 1,2,3,4) + matches = molify.match_substructure( + mol, "CC(=O)N[C:4]([C:3])[C:2](=O)[N:1]C", mapped_only=True ) - assert indices == [[8, 6, 5, 4]] + # Map numbers are 4,3,2,1 so should return atoms in order: 8,6,5,4 + # Actually, atoms are sorted by map number, so 1,2,3,4 -> 8,6,5,4 + assert matches == ((8, 6, 5, 4),) - # now with hydrogens which are in order 1, hydrogens of 1, 2 hydrogens of 2, ... - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:1](C)C(=O)NC", hydrogens="include" + # now with hydrogens which are in order: + # atom 1, hydrogens of 1, atom 2, hydrogens of 2, ... + matches = molify.match_substructure( + mol, "CC(=O)N[C:1](C)C(=O)NC", hydrogens="include", mapped_only=True ) - assert indices == [[4, 14]] + assert matches == ((4, 14),) - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:1]([C:2])C(=O)NC", hydrogens="include" + matches = molify.match_substructure( + mol, "CC(=O)N[C:1]([C:2])C(=O)NC", hydrogens="include", mapped_only=True ) - assert indices == [[4, 14, 5, 15, 16, 17]] + assert matches == ((4, 14, 5, 15, 16, 17),) # now inverse order - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:2]([C:1])C(=O)NC", hydrogens="include" + matches = molify.match_substructure( + mol, "CC(=O)N[C:2]([C:1])C(=O)NC", hydrogens="include", mapped_only=True ) - assert indices == [[5, 15, 16, 17, 4, 14]] + assert matches == ((5, 15, 16, 17, 4, 14),) # now with hydrogens isolated - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:1]([C:2])C(=O)NC", hydrogens="isolated" + matches = molify.match_substructure( + mol, "CC(=O)N[C:1]([C:2])C(=O)NC", hydrogens="isolated", mapped_only=True ) - assert indices == [[14, 15, 16, 17]] - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:2]([C:1])C(=O)NC", hydrogens="isolated" + assert matches == ((14, 15, 16, 17),) + + matches = molify.match_substructure( + mol, "CC(=O)N[C:2]([C:1])C(=O)NC", hydrogens="isolated", mapped_only=True ) - assert indices == [[15, 16, 17, 14]] + assert matches == ((15, 16, 17, 14),) -def test_select_atoms_grouped_order_box(alanine_dipeptide_box): +def test_match_substructure_mapped_order_box(alanine_dipeptide_box): + """Test mapped atom selection with multiple molecules.""" mol = molify.ase2rdkit(alanine_dipeptide_box) - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:1](C)C(=O)NC" - ) - assert indices == [[4], [26], [48]] - - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)NC([C:1])C(=O)NC" - ) - assert indices == [[5], [27], [49]] - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)NC(C)[C:1](=O)NC" - ) - assert indices == [[6], [28], [50]] + matches = molify.match_substructure(mol, "CC(=O)N[C:1](C)C(=O)NC", mapped_only=True) + # Group by fragment + grouped = molify.group_matches_by_fragment(mol, matches) + assert grouped == [[4], [26], [48]] - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)NC(C)C(=O)[N:1]C" + matches = molify.match_substructure( + mol, "CC(=O)N[C:1]([C:2])[C:3](=O)[N:4]C", mapped_only=True ) - assert indices == [[8], [30], [52]] + grouped = molify.group_matches_by_fragment(mol, matches) + assert grouped == [[4, 5, 6, 8], [26, 27, 28, 30], [48, 49, 50, 52]] - # now all of them - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:1]([C:2])[C:3](=O)[N:4]C" - ) - assert indices == [[4, 5, 6, 8], [26, 27, 28, 30], [48, 49, 50, 52]] - # now in a different order - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:4]([C:3])[C:2](=O)[N:1]C" + # Different order + matches = molify.match_substructure( + mol, "CC(=O)N[C:4]([C:3])[C:2](=O)[N:1]C", mapped_only=True ) - assert indices == [[8, 6, 5, 4], [30, 28, 27, 26], [52, 50, 49, 48]] + grouped = molify.group_matches_by_fragment(mol, matches) + assert grouped == [[8, 6, 5, 4], [30, 28, 27, 26], [52, 50, 49, 48]] - # now with hydrogens which are in order 1, hydrogens of 1, 2 hydrogens of 2, ... - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:1](C)C(=O)NC", hydrogens="include" + # With hydrogens + matches = molify.match_substructure( + mol, "CC(=O)N[C:1](C)C(=O)NC", hydrogens="include", mapped_only=True ) - assert indices == [[4, 14], [26, 36], [48, 58]] + grouped = molify.group_matches_by_fragment(mol, matches) + assert grouped == [[4, 14], [26, 36], [48, 58]] - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:1]([C:2])C(=O)NC", hydrogens="include" + matches = molify.match_substructure( + mol, "CC(=O)N[C:1]([C:2])C(=O)NC", hydrogens="include", mapped_only=True ) - assert indices == [ + grouped = molify.group_matches_by_fragment(mol, matches) + assert grouped == [ [4, 14, 5, 15, 16, 17], [26, 36, 27, 37, 38, 39], [48, 58, 49, 59, 60, 61], ] - # now inverse order - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:2]([C:1])C(=O)NC", hydrogens="include" - ) - assert indices == [ - [5, 15, 16, 17, 4, 14], - [27, 37, 38, 39, 26, 36], - [49, 59, 60, 61, 48, 58], - ] - - # now with hydrogens isolated - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:1]([C:2])C(=O)NC", hydrogens="isolated" - ) - assert indices == [[14, 15, 16, 17], [36, 37, 38, 39], [58, 59, 60, 61]] - indices = molify.select_atoms_grouped( - mol, smarts_or_smiles="CC(=O)N[C:2]([C:1])C(=O)NC", hydrogens="isolated" - ) - assert indices == [[15, 16, 17, 14], [37, 38, 39, 36], [59, 60, 61, 58]] - -@pytest.mark.parametrize("packmol", ["packmol.jl"]) -def test_select_atoms_grouped_ions_with_none_bond_orders(packmol): +def test_match_substructure_ions_with_none_bond_orders(): """Test that ase2rdkit automatically handles None bond orders. This reproduces the exact error scenario from hillclimber where @@ -548,7 +430,6 @@ def test_select_atoms_grouped_ions_with_none_bond_orders(packmol): [water, na_ion, cl_ion], counts=[16, 1, 1], density=1000, - packmol=packmol, tolerance=2.0, ) @@ -559,12 +440,73 @@ def test_select_atoms_grouped_ions_with_none_bond_orders(packmol): # ase2rdkit should NOW automatically handle this (after our fix) mol = molify.ase2rdkit(box) - # Verify select_atoms_grouped works - na_indices = molify.select_atoms_grouped(mol, "[Na+]") - assert len(na_indices) == 1 + # Verify match_substructure works + na_matches = molify.match_substructure(mol, "[Na+]") + assert len(na_matches) == 1 + + cl_matches = molify.match_substructure(mol, "[Cl-]") + assert len(cl_matches) == 1 + + water_matches = molify.match_substructure(mol, "[OH2]") + assert len(water_matches) == 16 + + +# ============================================================================= +# Test Cases for visualize_selected_molecules +# ============================================================================= + + +def test_visualize_selected_molecules_basic(ethanol_mol): + """Test basic visualization functionality.""" + # Select some atoms to highlight + a = [0, 1] # Carbons + b = [2] # Oxygen + + img = molify.visualize_selected_molecules(ethanol_mol, a, b) + assert img is not None + + +def test_visualize_selected_molecules_empty_selections(ethanol_mol): + """Test visualization with empty selections - shows molecule without highlights.""" + img = molify.visualize_selected_molecules(ethanol_mol) + assert img is not None + + +def test_visualize_selected_molecules_overlapping_selections(ethanol_mol): + """Test visualization with overlapping selections (later args take precedence).""" + a = [0, 1, 2] # All heavy atoms + b = [2] # Oxygen (should get color from b, not a) + + img = molify.visualize_selected_molecules(ethanol_mol, a, b) + assert img is not None + + +def test_visualize_selected_molecules_single_selection(ethanol_mol): + """Test visualization with a single selection.""" + a = [0, 1] # Carbons + + img = molify.visualize_selected_molecules(ethanol_mol, a) + assert img is not None + + +def test_visualize_selected_molecules_multiple_selections(ethanol_mol): + """Test visualization with multiple selections.""" + a = [0] # First carbon + b = [1] # Second carbon + c = [2] # Oxygen + + img = molify.visualize_selected_molecules(ethanol_mol, a, b, c) + assert img is not None + + +def test_visualize_selected_molecules_with_alpha(ethanol_mol): + """Test visualization with custom alpha value.""" + a = [0, 1] # Carbons + b = [2] # Oxygen - cl_indices = molify.select_atoms_grouped(mol, "[Cl-]") - assert len(cl_indices) == 1 + # Test with different alpha values + img_transparent = molify.visualize_selected_molecules(ethanol_mol, a, b, alpha=0.2) + assert img_transparent is not None - water_indices = molify.select_atoms_grouped(mol, "[OH2]") - assert len(water_indices) == 16 + img_opaque = molify.visualize_selected_molecules(ethanol_mol, a, b, alpha=1.0) + assert img_opaque is not None diff --git a/tests/test_utils.py b/tests/test_utils.py index b2b57c2..18e65be 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,4 +1,3 @@ -import re import sys import networkx as nx @@ -10,7 +9,6 @@ import molify from molify.utils import ( find_connected_components, - get_packmol_julia_version, rdkit_determine_bonds, suggestions2networkx, unwrap_structures, @@ -35,7 +33,6 @@ def ec_emc_li_pf6(): data=[atoms_pf6, atoms_li, atoms_ec, atoms_emc], counts=[3, 3, 8, 12], density=1400, - packmol="packmol.jl", ) @@ -46,7 +43,6 @@ def test_unwrap_structures(scale): data=[hexane], counts=[10], density=800, - packmol="packmol.jl", ) shifted_box = box.copy() shifted_box.set_positions( @@ -92,7 +88,6 @@ def test_unwrap_ring_molecules(scale): data=[benzene], counts=[10], density=800, - packmol="packmol.jl", ) # Copy and shift box to break molecules across PBC @@ -248,9 +243,3 @@ def test_suggestions2networkx(): assert graphs[1].number_of_nodes() == 4 # pbc and cell assert graphs[1].number_of_edges() == 3 - - -def test_get_packmol_julia_version(): - """Test the retrieval of the Packmol version when using Julia.""" - version = get_packmol_julia_version() - assert re.fullmatch(r"v\d+\.\d+\.\d+(?:[+-].+)?", version) diff --git a/uv.lock b/uv.lock index 0cc430e..d6c160f 100644 --- a/uv.lock +++ b/uv.lock @@ -2,7 +2,8 @@ version = 1 revision = 3 requires-python = ">=3.10" resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14'", + "python_full_version >= '3.12' and python_full_version < '3.14'", "python_full_version == '3.11.*'", "python_full_version < '3.11'", ] @@ -602,7 +603,8 @@ name = "ipython" version = "9.2.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14'", + "python_full_version >= '3.12' and python_full_version < '3.14'", "python_full_version == '3.11.*'", ] dependencies = [ @@ -948,7 +950,7 @@ wheels = [ [[package]] name = "molify" -version = "0.0.1a0" +version = "0.0.1a2" source = { editable = "." } dependencies = [ { name = "ase" }, @@ -975,6 +977,7 @@ docs = [ { name = "nbsphinx" }, { name = "sphinx" }, { name = "sphinx-copybutton" }, + { name = "sphinxcontrib-mermaid" }, ] [package.metadata] @@ -1000,6 +1003,7 @@ docs = [ { name = "nbsphinx", specifier = ">=0.9.7" }, { name = "sphinx", specifier = ">=8.1.3" }, { name = "sphinx-copybutton", specifier = ">=0.5.2" }, + { name = "sphinxcontrib-mermaid", specifier = ">=1.0.0" }, ] [[package]] @@ -1421,6 +1425,70 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload-time = "2025-03-17T00:56:07.819Z" }, ] +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + [[package]] name = "pyzmq" version = "26.4.0" @@ -1849,6 +1917,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, ] +[[package]] +name = "sphinxcontrib-mermaid" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/69/bf039237ad260073e8c02f820b3e00dc34f3a2de20aff7861e6b19d2f8c5/sphinxcontrib_mermaid-1.0.0.tar.gz", hash = "sha256:2e8ab67d3e1e2816663f9347d026a8dee4a858acdd4ad32dd1c808893db88146", size = 15153, upload-time = "2024-10-12T16:33:03.863Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/c8/784b9ac6ea08aa594c1a4becbd0dbe77186785362e31fd633b8c6ae0197a/sphinxcontrib_mermaid-1.0.0-py3-none-any.whl", hash = "sha256:60b72710ea02087f212028feb09711225fbc2e343a10d34822fe787510e1caa3", size = 9597, upload-time = "2024-10-12T16:33:02.303Z" }, +] + [[package]] name = "sphinxcontrib-qthelp" version = "2.0.0"