From b4d6931f85283e3019e1a7fa7529600827a0772f Mon Sep 17 00:00:00 2001 From: chrisjonesbsu Date: Tue, 18 May 2021 08:47:30 -0600 Subject: [PATCH 1/4] add example notebook for the new polymers pr --- polymers/polymers-example.ipynb | 1364 +++++++++++++++++++++++++++++++ 1 file changed, 1364 insertions(+) create mode 100644 polymers/polymers-example.ipynb diff --git a/polymers/polymers-example.ipynb b/polymers/polymers-example.ipynb new file mode 100644 index 0000000..0df18cf --- /dev/null +++ b/polymers/polymers-example.ipynb @@ -0,0 +1,1364 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import mbuild as mb\n", + "from mbuild.lib.recipes.polymer import Polymer" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The basic process for creating a polymer in mBuild\n", + "\n", + "The `Polymer` class exists in mBuild's library of recipes `mbuild/lib/recipes/polymer.py`\n", + "\n", + "In order to create polymers, mbuild Compounds of the monomer(s) and any end groups must first be created, and the necesasry mbuild Ports added to the correct atoms with the desired orientations. The compounds in mBuild's library contain structures that are essentially ready to go for building polymers. However, the ultimate goal of mBuild's polymer tool is to make it easier to build polymers from nearly any structures that are given to it whether in the form of a file or SMILES string.\n", + "\n", + "There are multiple ways to input the needed information to build a polymer. When creating a polymer instance, monomer and end group compounds can be directly passed in. This approach can be used when the compounds already contain the needed ports, there will be examples below.\n", + "\n", + "The other, much more flexible, option is to use the `add_monomer` and `add_end_groups` methods on a `Polymer` instnace.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Quick example of the API and workflow\n", + "comp = mb.load('CC', smiles=True) # mBuild compound of the monomer unit\n", + "chain = Polymer()\n", + "\n", + "chain.add_monomer(compound=comp,\n", + " indices=[2, -2],\n", + " separation=.15,\n", + " replace=True)\n", + "\n", + "chain.add_end_groups(mb.load('C(=O)O', # Capping off this polymer with Carboxylic acid groups\n", + " smiles=True,\n", + " name='acid'), \n", + " index=3,\n", + " separation=0.15)\n", + "\n", + "chain.build(n=7, sequence='A') # After monomers and end groups are added, call the build function\n", + "chain.visualize(show_ports=True).show()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Doing the same thing, but this time without adding an end group\n", + "# Now, the chain is capped with hydrogens (default behavior)\n", + "\n", + "comp = mb.load('CC', smiles=True) # mBuild compound of the monomer unit\n", + "chain = Polymer()\n", + "\n", + "chain.add_monomer(compound=comp,\n", + " indices=[2, -2],\n", + " separation=.15,\n", + " replace=True)\n", + "\n", + "chain.build(n=10, sequence='A')\n", + "chain.visualize(show_ports=True).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Flexibility with end groups\n", + "- You can only add one end group, while the other is capped off with hydrogen.\n", + "- You can add 2 different end groups, labeled by 'head' and 'tail'\n", + "- Or you can leave the ends open with an available port" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Creating and adding 2 different end groups.\n", + "# The add_end_groups() function has a duplicate parameter (defaulted to True)\n", + "# When this is true, calling add_end_group will create 2 of the same compound\n", + "# and the polymer is capped off with each.\n", + "# If you want different end groups, change Duplicate to False and call the add_end_groups() function twice\n", + "\n", + "comp = mb.load('CC', smiles=True) # mBuild compound of the monomer unit\n", + "chain = Polymer()\n", + "\n", + "chain.add_monomer(compound=comp,\n", + " indices=[2, -2],\n", + " separation=.15,\n", + " replace=True)\n", + "\n", + "chain.add_end_groups(mb.load('C(=O)O',smiles=True), # Capping off this polymer with Carboxylic acid groups\n", + " index=3,\n", + " separation=0.15,\n", + " duplicate=False) # Change duplicate to false\n", + "\n", + "chain.add_end_groups(mb.load('N', smiles=True),\n", + " index=-1, separation=0.13,\n", + " duplicate=False, label=\"tail\") # label this one tail\n", + "\n", + "chain.build(n=10, sequence='A')\n", + "chain.visualize(show_ports=True).show()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# If you only add one end group, you can still have the other end capped off with hydrogen\n", + "comp = mb.load('CC', smiles=True) # mBuild compound of the monomer unit\n", + "chain = Polymer()\n", + "\n", + "chain.add_monomer(compound=comp,\n", + " indices=[2, -2],\n", + " separation=.15)\n", + "\n", + "chain.add_end_groups(mb.load('C(=O)O',smiles=True), # Capping off this polymer with Carboxylic acid groups\n", + " index=3,\n", + " separation=0.15,\n", + " duplicate=False) # Change duplicate to false\n", + "\n", + "chain.build(n=10, sequence='A')\n", + "chain.visualize(show_ports=True).show()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#Or to leave the ends of the polymer open with ports, change the add_hydrogens parameter in build() to False\n", + "# This would still work when adding only one end group, then leaving the other end open.\n", + "\n", + "comp = mb.load('CC', smiles=True) # mBuild compound of the monomer unit\n", + "chain = Polymer()\n", + "chain.add_monomer(compound=comp,\n", + " indices=[2, -2],\n", + " separation=.15,\n", + " replace=True)\n", + "\n", + "chain.build(n=10, sequence='A', add_hydrogens=False)\n", + "chain.visualize(show_ports=True).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Here's an example with a more complicated monomer and a little more detail into what's going on \n", + "\n", + "SMILES strings for Poly-ether-ether-ketone (PEEK) \n", + "\n", + "One has para linkages, the other has meta \n", + "\n", + "Goal is to build up a polymer with alternating PARA-META monomers \n", + "\n", + "Also, just for fun, adding carboxylic acid end groups (ca)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "peek_para = mb.load(\"Oc1ccc(Oc2ccc(C(=O)c3ccccc3)cc2)cc1\", smiles=True)\n", + "peek_meta = mb.load(\"Oc1cc(Oc2ccc(C(=O)c3ccccc3)cc2)ccc1\", smiles=True)\n", + "peek_polymer = Polymer()\n", + "\n", + "peek_polymer.add_monomer(compound=peek_para,\n", + " indices = [22, 29],\n", + " separation = 0.1376,\n", + " replace=True\n", + " )\n", + "\n", + "peek_polymer.add_monomer(compound=peek_meta,\n", + " indices = [22, 28],\n", + " separation = 0.1376,\n", + " replace=True\n", + " )\n", + "\n", + "peek_polymer.build(n=3, sequence=\"AB\")\n", + "peek_polymer.visualize().show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## A look at what is actually happening with each of the class methods \n", + "\n", + "The `add_monomer` and `add_end_group` functions are handling the creation of ports. \n", + "\n", + "The key is in the `bond_indices` and `replace` parameters.\n", + "`bond_indices` points to the hydrogen atoms that are occupying the polymer bonding site and \n", + "`replace` says to remove those atoms, and replace them with a port\n", + "\n", + "When the port is created, it defaults to using the orientation that already existed between the hydrogen atom and the atom it was bonded to. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before passing the compound into add_monomer()\n" + ] + }, + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "After passing the compound into add_monomer()\n" + ] + }, + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "peek_para = mb.load(\"Oc1ccc(Oc2ccc(C(=O)c3ccccc3)cc2)cc1\",smiles=True)\n", + "print('Before passing the compound into add_monomer()')\n", + "peek_para.visualize(show_ports=True).show()\n", + "\n", + "peek_polymer = Polymer()\n", + "\n", + "peek_polymer.add_monomer(compound=peek_para,\n", + " indices = [22, 29],\n", + " separation = 0.1376,\n", + " replace=True\n", + " )\n", + "print('After passing the compound into add_monomer()')\n", + "peek_polymer.monomers[0].visualize(show_ports=True).show()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before passing the compound into add_end_groups()\n" + ] + }, + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "After passing the compound into add_end_groups()\n" + ] + }, + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Same thing with the end group\n", + "ca = mb.load('C(=O)O', smiles=True)\n", + "print('Before passing the compound into add_end_groups()')\n", + "ca.visualize(show_ports=True).show()\n", + "\n", + "peek_polymer.add_end_groups(ca,\n", + " index=3,\n", + " separation=0.13,\n", + " replace=True)\n", + "\n", + "# ca[3] is the hydrogen bonded to the carbon atom\n", + "\n", + "print('After passing the compound into add_end_groups()')\n", + "peek_polymer.end_groups[0].visualize(show_ports=True).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Not using the add_monomer and add_end_group functions\n", + "- So far, the examples call these functions everytime to create a polymer, but they are optional\n", + "- These functions basically handle the creation of ports.\n", + "- If you have a compound where the ports already exist, or you want to add them yourself you can pass them into the polymer class instance, and go straight to the build() function.\n", + "- However, you can use both approaches for the same polymer. Passing in compounds when initializing a polymer, and then adding to self.monomers or self.end_groups with the add functions." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from mbuild.lib.moieties.ch2 import CH2\n", + "\n", + "chain = Polymer(monomers=[CH2()])\n", + "chain.build(n=10, add_hydrogens=True)\n", + "chain.visualize().show()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# You can combine passing in compounds, and using the available \n", + "# add_end_group and add_monomer functions\n", + "\n", + "chain = Polymer(monomers=[CH2()])\n", + "chain.add_monomer(mb.load('c1ccccc1', smiles=True), indices=[-1, -4])\n", + "chain.add_end_groups(mb.load('C(=O)O',smiles=True), # Capping off this polymer with Carboxylic acid groups\n", + " index=3,\n", + " separation=0.15,\n", + " duplicate=False)\n", + "chain.build(n=5,sequence='AB', add_hydrogens=True)\n", + "chain.visualize().show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Some more use case examples\n", + "\n", + "- Creating regio-regular backbone\n", + "- Creating a poly disperse system\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "p3ht = mb.load('c1cscc1', smiles=True)\n", + "p3ht_flip = mb.load('c1cscc1', smiles=True)\n", + "p3ht_flip.rotate(np.pi, [0,0,1])\n", + "chain = Polymer()\n", + "chain.add_monomer(\n", + " compound=p3ht,\n", + " indices=[6, 7],\n", + " separation=.15,\n", + " replace=True\n", + ")\n", + "chain.add_monomer(\n", + " compound=p3ht_flip,\n", + " indices=[7, 6],\n", + " separation=.15,\n", + " replace=True\n", + ")\n", + "chain.build(n=5, sequence='AB')\n", + "chain.visualize(show_ports=True).show()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "import random" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AAAAAABBBA\n" + ] + }, + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#Regiorandom\n", + "chain = Polymer()\n", + "chain.add_monomer(\n", + " compound=p3ht,\n", + " indices=[6, 7],\n", + " separation=.15,\n", + " replace=True\n", + ")\n", + "chain.add_monomer(\n", + " compound=p3ht_flip,\n", + " indices=[7, 6],\n", + " separation=.15,\n", + " replace=True\n", + ")\n", + "seq = \"\".join([random.choice(\"AB\") for i in range(10)])\n", + "chain.build(n=1, sequence=seq)\n", + "print(seq)\n", + "chain.visualize(show_ports=True).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Initializing a polydisperse system" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "polymer_lengths = [5, 10, 15, 20, 25, 30]\n", + "num_polymers = [3, 5, 6, 5, 3, 2]\n", + "polymers = []\n", + "\n", + "ethane = mb.load('CC', smiles=True)\n", + "\n", + "for length in polymer_lengths:\n", + " chain = Polymer()\n", + " chain.add_monomer(\n", + " compound=ethane,\n", + " indices=[2, -2],\n", + " separation=.15,\n", + " replace=True\n", + " )\n", + " \n", + " chain.add_end_groups(\n", + " mb.load('C(=O)O',\n", + " smiles=True,\n", + " name='acid'), \n", + " index=3,\n", + " separation=0.15\n", + " )\n", + " chain.build(n=length)\n", + " polymers.append(chain)\n", + "\n", + "system = mb.fill_box(polymers, num_polymers, density=50)\n", + "system.visualize().show()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "width = 1 # the width of the bars\n", + "\n", + "fig, ax = plt.subplots()\n", + "rects1 = ax.bar(polymer_lengths, num_polymers, width)\n", + "ax.set_xlabel(\"polymer length (# monomers)\")\n", + "ax.set_ylabel(\"# polymers\")\n", + "ax.set_title(\"Polydispersity profile\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using replace=False instead\n", + "So far, all of the examples above used `replace=True` and the `bonding_indices` were the indices of hydrgogens that were being replaced by ports and removed to make room for the monomer-monomer bond.\n", + "\n", + "I imagine this would be the most common work-flow for going straight from a SMILES string or compound file to a polymer, but it's possible use `replace=False`. In this case, the atoms indicated in `bonding_indices` are the atoms forming the monomer-monomer bond.\n", + "\n", + "Below is an example using the `ch2.pdb` file in the `moieties` directory. In this case, we don't want to replace/remove any hydrogens, but add onto the carbon atom" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Reproducing the alkane chain\n", + "\n", + "### NOTE: \n", + "With the latest changes, this method of building up an alkane isn't really needed, but it still shows the ability to use the add_monomer() and add_end_groups() functions with Replace=False\n", + "\n", + "There currently exists a recipe that produces a simple alkane chain. Below I'll use the new `polymer.py` functionality to re-create the same alkane chain." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ch2 = CH2()\n", + "chain = Polymer(monomers=[ch2])\n", + "chain.build(n=7, sequence='A')\n", + "\n", + "chain.visualize(show_ports=True).show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# It's super easy to throw different end groups on there\n", + "\n", + "chain = Polymer(monomers=[ch2])\n", + "\n", + "chain.add_end_groups(mb.load('c1ccccc1', smiles=True),\n", + " index=-1,\n", + " separation=0.15,\n", + " replace=True)\n", + "chain.build(n=8, sequence='A')\n", + "\n", + "chain.visualize().show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From c86906731fedcd399d22e1437df55bd5c599a9d9 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 18 May 2021 10:31:45 -0600 Subject: [PATCH 2/4] fix a few notes in the last example --- polymers/polymers-example.ipynb | 512 ++++++++++++++++++++------------ 1 file changed, 319 insertions(+), 193 deletions(-) diff --git a/polymers/polymers-example.ipynb b/polymers/polymers-example.ipynb index 0df18cf..85f449f 100644 --- a/polymers/polymers-example.ipynb +++ b/polymers/polymers-example.ipynb @@ -33,12 +33,20 @@ "execution_count": 2, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -105,12 +113,20 @@ "execution_count": 3, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -183,12 +199,20 @@ "execution_count": 4, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -263,12 +287,20 @@ "execution_count": 5, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -333,12 +365,20 @@ "execution_count": 6, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -415,12 +455,20 @@ "execution_count": 7, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -510,12 +558,20 @@ "Before passing the compound into add_monomer()\n" ] }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -565,10 +621,10 @@ }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -638,12 +694,20 @@ "Before passing the compound into add_end_groups()\n" ] }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -693,10 +757,10 @@ }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -771,12 +835,20 @@ "execution_count": 10, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -831,12 +903,20 @@ "execution_count": 11, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -907,12 +987,20 @@ "execution_count": 12, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -977,31 +1065,48 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + } + ], "source": [ "import random" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 14, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "AAAAAABBBA\n" + "AABABABABB\n" ] }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -1073,15 +1178,23 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -1155,12 +1268,20 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 19, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1173,7 +1294,6 @@ ], "source": [ "width = 1 # the width of the bars\n", - "\n", "fig, ax = plt.subplots()\n", "rects1 = ax.bar(polymer_lengths, num_polymers, width)\n", "ax.set_xlabel(\"polymer length (# monomers)\")\n", @@ -1182,48 +1302,46 @@ "plt.show()" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using replace=False instead\n", - "So far, all of the examples above used `replace=True` and the `bonding_indices` were the indices of hydrgogens that were being replaced by ports and removed to make room for the monomer-monomer bond.\n", + "So far, most of the examples above used `replace=True` and the `bonding_indices` were the indices of hydrgogens that were being replaced by ports and removed to make room for the monomer-monomer bond.\n", "\n", "I imagine this would be the most common work-flow for going straight from a SMILES string or compound file to a polymer, but it's possible use `replace=False`. In this case, the atoms indicated in `bonding_indices` are the atoms forming the monomer-monomer bond.\n", "\n", - "Below is an example using the `ch2.pdb` file in the `moieties` directory. In this case, we don't want to replace/remove any hydrogens, but add onto the carbon atom" + "Below is an example using the `ch2` moiety in the mBuild's Library. In this case, we don't want to replace/remove any hydrogens, but add onto the carbon atom" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Reproducing the alkane chain\n", - "\n", - "### NOTE: \n", - "With the latest changes, this method of building up an alkane isn't really needed, but it still shows the ability to use the add_monomer() and add_end_groups() functions with Replace=False\n", + "# Reproducing the alkane chain recipe\n", "\n", "There currently exists a recipe that produces a simple alkane chain. Below I'll use the new `polymer.py` functionality to re-create the same alkane chain." ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -1275,15 +1393,23 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", + " and should_run_async(code)\n" + ] + }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] From b2aa52dd3897d7b3906aae05345f08b8d3cfb792 Mon Sep 17 00:00:00 2001 From: chrisjonesbsu Date: Tue, 7 Dec 2021 12:01:04 -0700 Subject: [PATCH 3/4] added some more comments and examples --- polymers/polymers-example.ipynb | 703 +++++++++++++++----------------- 1 file changed, 335 insertions(+), 368 deletions(-) diff --git a/polymers/polymers-example.ipynb b/polymers/polymers-example.ipynb index 85f449f..227ac96 100644 --- a/polymers/polymers-example.ipynb +++ b/polymers/polymers-example.ipynb @@ -4,7 +4,17 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: importing 'simtk.openmm' is deprecated. Import 'openmm' instead.\n", + "RDKit WARNING: [11:43:11] Enabling RDKit 2019.09.3 jupyter extensions\n", + "[11:43:11] Enabling RDKit 2019.09.3 jupyter extensions\n" + ] + } + ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", @@ -28,25 +38,32 @@ "The other, much more flexible, option is to use the `add_monomer` and `add_end_groups` methods on a `Polymer` instnace.\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Building a polymer from SMILES\n", + "\n", + "In the example below, we will build up polyethylene, and add carboxylic acid end groups.\n", + "There are two primary bits of input required:\n", + "\n", + "1. A SMILES string of the monomer structure (and end group structure)\n", + "2. The indices of the hydrogen atoms that will be replaced to make room for the monomer-monomer bonding\n", + "\n", + "Step 2 will require a bit of trial and error" + ] + }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -110,23 +128,15 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -184,6 +195,88 @@ "chain.visualize(show_ports=True).show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Selecting the correct values for `indices`\n", + "\n", + "As mentioned earlier, you have to provide information about which atoms on the monomer and end group will form the bonds between repeating monomers, and between the end groups. In this case, you are specificy the index of the hydrogen atoms that will be removed.\n", + "\n", + "Above, we chose `indices = [2, -2]` for the monomer units. What would happen if we chose the \"wrong\" indices?\n", + "\n", + "The cell below shows the incorrect structures that can come about from choosing the wrong indices." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Doing the same thing, but this time without adding an end group\n", + "# Now, the chain is capped with hydrogens (default behavior)\n", + "\n", + "comp = mb.load('CC', smiles=True) # mBuild compound of the monomer unit\n", + "chain = Polymer()\n", + "\n", + "chain.add_monomer(compound=comp,\n", + " indices=[-1, -2],\n", + " separation=.15,\n", + " replace=True)\n", + "\n", + "chain.build(n=10, sequence='A')\n", + "chain.visualize(show_ports=True).show()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -196,23 +289,15 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 11, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -284,23 +370,15 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 12, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -362,23 +441,15 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -445,30 +517,20 @@ "\n", "One has para linkages, the other has meta \n", "\n", - "Goal is to build up a polymer with alternating PARA-META monomers \n", - "\n", - "Also, just for fun, adding carboxylic acid end groups (ca)" + "Goal is to build up a polymer with alternating PARA-META monomers " ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 15, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -548,7 +611,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -558,20 +621,12 @@ "Before passing the compound into add_monomer()\n" ] }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -621,10 +677,10 @@ }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -684,7 +741,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -694,20 +751,12 @@ "Before passing the compound into add_end_groups()\n" ] }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -757,10 +807,10 @@ }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -832,23 +883,15 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 26, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -891,6 +935,8 @@ } ], "source": [ + "# In this example, we're using a CH2 compound from mBuild's library. This compound already has ports created\n", + "# So, we can skip the add_monomer method and go straight to build.\n", "from mbuild.lib.moieties.ch2 import CH2\n", "\n", "chain = Polymer(monomers=[CH2()])\n", @@ -900,23 +946,15 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 19, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -984,23 +1023,15 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 20, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -1065,48 +1097,22 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 21, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - } - ], - "source": [ - "import random" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "name": "stdout", "output_type": "stream", "text": [ - "AABABABABB\n" + "AAABBBABAA\n" ] }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -1149,6 +1156,7 @@ } ], "source": [ + "import random\n", "#Regiorandom\n", "chain = Polymer()\n", "chain.add_monomer(\n", @@ -1178,23 +1186,15 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 22, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -1268,20 +1269,12 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 23, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1302,18 +1295,6 @@ "plt.show()" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using replace=False instead\n", - "So far, most of the examples above used `replace=True` and the `bonding_indices` were the indices of hydrgogens that were being replaced by ports and removed to make room for the monomer-monomer bond.\n", - "\n", - "I imagine this would be the most common work-flow for going straight from a SMILES string or compound file to a polymer, but it's possible use `replace=False`. In this case, the atoms indicated in `bonding_indices` are the atoms forming the monomer-monomer bond.\n", - "\n", - "Below is an example using the `ch2` moiety in the mBuild's Library. In this case, we don't want to replace/remove any hydrogens, but add onto the carbon atom" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1325,23 +1306,15 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 24, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -1393,23 +1367,15 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 25, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/chris/miniconda3/envs/mbuild-dev/lib/python3.8/site-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", - " and should_run_async(code)\n" - ] - }, { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] @@ -1468,7 +1435,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, From 6863dc7d59a2eef66f6836d81cc4c7d9b7ab5ac3 Mon Sep 17 00:00:00 2001 From: chrisjonesbsu Date: Tue, 7 Dec 2021 12:28:27 -0700 Subject: [PATCH 4/4] add a new cell with a nylon example --- polymers/polymers-example.ipynb | 93 ++++++++++++++++++++++++++++----- 1 file changed, 81 insertions(+), 12 deletions(-) diff --git a/polymers/polymers-example.ipynb b/polymers/polymers-example.ipynb index 227ac96..42a3ee5 100644 --- a/polymers/polymers-example.ipynb +++ b/polymers/polymers-example.ipynb @@ -507,6 +507,75 @@ "chain.visualize(show_ports=True).show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Here is an example building up a Nylon polymer" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + " jupyter labextension install jupyterlab_3dmol

\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "nylon = mb.load(\"NCCCCCCNOC(=O)CCCCC(=O)O\", smiles=True)\n", + "chain = Polymer()\n", + "\n", + "chain.add_monomer(compound=nylon, indices=[-23, -1], separation=.15)\n", + "chain.build(n=4, sequence='A')\n", + "chain.visualize().show()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1023,15 +1092,15 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 56, "metadata": {}, "outputs": [ { "data": { - "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", + "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

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

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", + "

\n", + "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ]