Skip to content

Instantly share code, notes, and snippets.

@iwatobipen
Created December 31, 2022 08:19
Show Gist options
  • Save iwatobipen/e60cf772d4e9614d295f4c0120ae1c56 to your computer and use it in GitHub Desktop.
Save iwatobipen/e60cf772d4e9614d295f4c0120ae1c56 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "0a375ab0",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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AAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4A6ZqciQAAHphJREFUAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMI7gAAAAAAMoDgDgAAAAAgAwjuAAAAAAAygOAOAAAAACADCO4AAAAAADKA4A4AAAAAIAMSB/e0tLS//vorJCRE2mbBeEJCQv7666+0tDRzDwQAAAAAXsdCwraSkpIcHR3j4+OJyNnZ2dvbu3///rVq1ZKwC5DK7du3d+/e7efnd/z4cSIqUaJEZGRkiRIlzD0uAAAAAHg5BTNL0tD9+/c7dep06dIlhUJhYWGh0WjE440aNerdu3fv3r3r1KkjSUdgiKtXr+7YsWPHjh3nz58Xj6jVaq1Wy8z169fft29fhQoVzDtCAAAAAHgpaYJ7ZGRkx44dIyMj69Sps2vXrqpVqwYFBQUGBu7atSsuLk58jZOTk5eXl7e3t7u7u0KhMLxTyL/Lly/7+fn5+flduXJFPGJvb9++fXsvL69evXrFxsb26tXr4sWLVatW3bdvX+3atc07WgAAAAB4kQTBPTQ01MvLKy4urlmzZoGBgaVLl9b/VVZW1smTJ/38/LZt2xYTEyMerFq1avfu3ZHgTUDk9T/++OPatWvikZIlS3bp0sXb27tjx46WlpZElJmZaWlpmZCQ0L179+Dg4BIlSgQEBLi7u5t14AAAAACQl6HBPSgoqHfv3snJyV27dv3jjz9UKtWYMWPGjx/fqFGj3F+mT/Dbt2+/f/++eLBy5cqenp5eXl6enp4WFlKutn+X6XS6EydOBAYG7tixIyIiQjxYunRpT09Pb2/vTp06qdVqysn0W7ZsGTFixJQpU4goIyNj4MCB27dvL1KkyNatW728vMz5NAAAAADgeQYF9w0bNowYMUKj0QwZMuTXX39NSUnp2bPnoUOHateuHR4erlKpXvwWnU537ty5gICATZs2vSZWwpt61aVRz549u3bt2rp1awsLi6ysrGPHju3YsWPXrl3R0dHia7y8vAICAvSNjBs3bsWKFSqVavny5SNHjjTPkwEAAACAFxQ8uC9evHjSpEnMPG3atHnz5sXExHTu3PncuXMODg5//fVXnhn3l3rNQo4OHTpYWVkVbGDvFH1e37p1a2xsrHiwWrVq3bp10y9G0n+Nn5/fgwcPxNdUqVKlR48e3t7eLVq0UCqfqwr6ww8/TJ8+XaFQfP3117NnzzbxMwIAAACAlypIcGfmKVOmLFy4UKVSLVmy5LPPPouKiurYsWNERETt2rX37dtXtWrVN2rw/PnzO3fu3LFjh37rpEql6tOnz+bNm990bO+UAQMGbNu2LSsrS3zq7Ozcu3fvXr16iaumjIyM4ODggICA12T6V7W8du3akSNHarXasWPH/vzzz3mSPQAAAACY3hsH98zMzMGDB2/dutXKymrDhg19+vQ5ffq0l5fXw4cPmzZtGhgYWKZMmQKPJioqKiAgYN26daJY4YYNGwYNGlTg1t5uv//+++DBg4nIyclp0KBBffr0cXZ2JqL09PSgoCA/Pz9/f//ExETxxc7Ozl27dvXy8vLw8Mhn+3v27Onfv39aWlqPHj02b95sY2NjpCcCAAAAAPnxZltCnz592rt373/++cfe3n7Pnj0ffPDB/v37e/XqlZyc3L59+507d9ra2hoyGicnp4kTJ06cONHFxeXcuXNRUVGGtPZ2i4yMJCIXF5czZ84QUWpqakBAgJ+f3+7du5OTk8XXiGOw+vbtW4Ai+t27dz948KCXl9fu3bs7d+68e/fu4sWLS/sUAAAAACD/3iC4x8TEeHp6nj9/3sHBYe/evQ0bNvz999+HDx+u0WgGDx68evVqCfeVjho1avTo0SKbwkuJf5xRo0YR0Z07d2rVqpWenk5ECoWiefPmvXr16t27t6OjoyFduLm5HT16tFOnTocPH3Z3d9+3b1+lSpUkGTwAAAAAvKn8LpWJjIzs1KlTREREnTp19u3bV6VKlcWLF3/xxRc6nW7ChAm+vr6SVGTv1q3b8ePHb926FRER4eLiUrNmTf2+VcijZs2aN27cOHfunFjRXq9ePXt7e29v7969e0sbr+/fv+/p6YnjmQAAAADMK1/B/fTp0126dNEfsVSqVKmpU6cuWLBAoVDMnz9/8uTJUo3Gzc3t1KlTBw8ebNmypb29fWpqalxcXKlSpaRq/60RHx9funRpGxubxMREUQI/IyPDeHV4EhISunXrduzYsZIlS/r7++N4JgAAAADT++9qIUFBQR9++GFcXFzXrl0PHjxYrFixAQMGLFiwwMrKasuWLRKmdiJq2rQpEYWGhlpYWDRu3JiZxQJuyOP06dPM7Orqqj+4yqjVM0uUKPH/7d1tVNRl/sfx7wwIJISEcisiN4KGkqaEoKSZmusq5UKcNXex+9TqjLv7IDtn80/ttnvKdgvdWjet02qabAoWltYqukmmo5gKKKviQN4LaoqINzBz/R/82FnW4iaYG3/xfh0fDMNvrus745PPXHyv67dp06YHH3zw/Pnz991336effuq8uQAAAPC92gnuy5cvnzJlyqVLlx5++OGCggKbzXb//ffn5eX5+fmtW7fu5z//uWOrsQd3+2Oz2ezYKX4ctI9F+4hcw9vbOy8vb9asWQ0NDQ888MDSpUtdNjUAAACk7eD+0ksvPfLII42NjfPmzXvvvffOnj07ZsyYzz//PCwsrLi4eOLEiQ6vRkuiO3bssD/etWuXw2f5EdA+FlcGdxHx8PD429/+9sorr1it1lmzZv3mN79x5ewAAADdXKs97g899FBeXp7RaHzzzTdb3mIpNjb2888/j42NdUY1SqmgoKBz584dP378+vXrMTExwcHB9psHwS40NPTMmTNVVVVRUVGun33x4sXPPvuszWabPn36qlWrXF8AAABAN9TqivumTZtEZPr06XPmzCktLU1JSamsrNQ2jzoptYuIwWBISkoSkZ07d0ZHR4eEhNTU1FRXVztpOp2qqqo6c+ZMcHCwW1K7iMyZM+fxxx/38PCgkQkAAMBlWg3ukZGRIjJy5EgRiYqK6tu378SJE//5z386+4yXlm3ud911l/0x7LQPRPuvcaXKysoXX3xx69atIpKSkmK1Wl3cqwMAANCdtRrcZ8yYISIVFRUi4u/vv3HjxvXr1996663OLojg3q6WH44rFRUVvfTSS9q21JYbiAEAAOACrd45VVvQtYfmPn36uKYgbd5du3ZZrdYbaoDGXSvuLcO6u2oAAADotlrdnNrQ0NCrVy+DwXDhwoWePXu6sqbo6Ojq6ury8vKwsLAbbjOEpqYmd92aKjExsby83Gw2JyYm9urVSyl14cIFX19fV9YAAADQbbXaKtOzZ88hQ4Y0Njbu2bPHlQVJi8X+wMDAAQMGNDQ0lJeXu7iG/3HpkphMkpoqqakyb55cueLGWsrKyi5fvhwXF+fi1H7p0qWKigovL6+hQ4fu3r27sbExMTGR1A4AAOAybZ3j3rIpwpVatrbfFN0ys2eLr68UF8vWrWKzyZNPurEWd/WolJSUWK3WYcOGeXt70+AOAADgejdjcG8Z1t2/P/Xbb2XjRvnd78TTU3r0kD/8QT77TC5ccFc57tqZ+t3vUQR3AAAAV2oruLtrtXv48OGenp5lZWUNDQ3uX3H/5hvp31969Gj+0ctLoqLEfUfLszMVAACge2oruCckJPj7+1sslpqaGpcVJP/bXq/1Zuzfv7+urs6VNfxXYOCN6+vffiuu7S+3a9lo7uKptXstJScn19bWVlVV3XrrrYMGDXJxDQAAAN1ZW8HdaDQOHz5cRHbt2uWqeprZF9q9vb3vuOMOm8329ddfu7gGEZH6eomIEE9PKSlpfsZsFh8f6dtX6utdX07LRnNXznvypC0m5v8mTnw6Li5u584+UVEHs7LWeHh4uLIGAACAbq6t4C7u65Zx//7Uq1dl7lwZPlwaGuSddyQ7W+bOlblz5ZFH5J135OpVSU6WmTOlocGVRbmrR8VsNhYXP2U0vmUwGMxmQ3V1fHDwfS6uAQAAoJtr53D0bro/9cABmT5dysrE21t27JAJE2TXLtm7V0Tkj38UX1/ZtEksFqmokL17JS9PEhJcU5f7dqaKiGibUVs+BgAAgMu0s+JuD+6t3afJSVq217t6xX35cklOlrIyGThQtm+XCRNERPz8JC1N0tJEO7l8wgTZvVuGDJGyMhkxQhYudE1pN6y4b9261VXziogkJ4tSzU1DBHcAAAAXaye4R0REhIeHnz9/vrKy0jUFaYxG4/Lly/fs2dO7d+/4+Pjbbrvt2LFje7U1b+e5eFEeekgeflguX5bsbCkpkTvvbPXiwYNl504xmeTqVfnVryQjQ86fd2p1+/btO378eEBAQFxcnIi89dZbY8eOnTt3rs1mc+q8NltzWL/rLjl8WM6dk7Aw6dvXqXMCAADgRu0Ed3Fft8wDDzwwbNgwDw+P8vJym80WERExYsSItLS0V1991SnfIsxmGT5c8vLE319WrpTly8XPr52X3HKLLFwo+fly222ydq0MGyZOWAI/duzYkiVL0tPTk5KS+vXrZ7PZtHvZhoWF+fj4LFq0aObMmY2NjQ6f166iQurqJCpKQkKal95TUpw3GwAAAL7fzRvcNUVFRWlpaRcvXjQajV5eXtu2bXv++efj4+NTUlJee+01i8XS9SmsVuuZN96QtDSxWCQ1VfbtkxkzfsDrMzLk668lNVWOHZPx4yvfeMNqtXa9KovF8tprr6WkpPTv33/WrFmffPKJp6enwWCoq6sbN25cUVFRRkbG+vXr/f39V65cOXnyZOcdl0mDOwAAwE1BtaeoqEhEUlJS2r3S4fLz8318fETkF7/4xbVr1xoaGgoLC7Ozs/39/e31JyQk5OTk7N+/v3NTHDt2bMyYMQl9+lhDQpTJpK5f72StjY0qJ6cmODgsJCQlJcVisXRumCNHjuTm5o4ePdpgMGhv8JZbbpk6deqyZcsuXrzY2Nj42GOPiYiXl9cHH3yglCotLe3bt6+IJCUlnTlzppPFt2n2bCWi/vQnpZQaOVKJqM2bnTEPAAAA2tJ+cK+rqzMajd7e3levXnVBQXaLFi0yGo0iYjKZrFZry19duXJFS/C9evWyJ/iYmBiTyVRcXGyz2To4xdq1awMDA0UkPDx8zxdfdL3mki++CA8PF5HAwMC1a9d2/IXl5eU5OTkjRoywv52ePXtqef3SpUstr7TZbPPmzRMRg8GwYMECpZTFYomPj9c+gUOHDnX9Xdxg+HAlorZuVdeuKW9vZTSqixcdPgkAAADa0X5wV0olJCTIf86WcQGbzZaTk6Nl05ycnDaubGpqKi4uNplMISEh9sgbFRXVboK/cuWKyWTSVrXvu+++U6dOOar42tra9PR0rZLs7OzLly+3cbGW11vegjQwMDA7O7uwsLDtr0m5ubktv9WcPXs2NTVVREJCQnbv3u2o96LZsEHNn6/q65XZrETU4MGOHR4AAAAd0qHg/uijj4rIm2++qf1YU1NTW1vrpIIaGxufeOIJEfH09Hz33Xc7+Cp7gtcWvDX9+vUzmUwbN25sbGxsefGBAweGDh0qIt7e3rm5uR1foe+4ZcuW9ezZU0Ruv/32ffv2tfyV1WotKSnJyckZMGCAvdQ+ffpoef16h3t1VqxY4eXlJSK//OUvr1+/Xl9fP3nyZBHx8/PbsGGDw9+RUspmUwcPqq++csbYAAAAaEeHgvvixYtFZObMmdqP8+fPNxqNo0ePzs3NPX78uAOrqa+v/+lPfyoivr6+69ev78QIVqu1uLh43rx5rcXiZcuW+fr6isigQYP27NnjwOJvUF5enpiYKCI+Pj65ubmtfbV46qmnCgsLb/hq0UFFRUVau/+ECRPq6uq+2wHvKEFByv6Xj9/+Vr31lgPHBgAAQId0KLjv3r1bRAYOHKj9aDKZvL29teipJfjXX3+9urq6i6WcO3du1KhRItK7d+/t27d3cTSbzWY2m5977rnY2Fh7UPb7zwmPTzzxRNtNLA5x+fJl7a8HLacWkdjY2Oeee85sNnd9sb+kpERrE9I2p7bsMnr11Vcd8i6UUsHBatgwdfCgUgR3AAAAN+lQcL9+/bqnp6eIfPTRR9ozly9f1raHtsyj2gEvFRUVnaijqqpq4MCBIhIdHX1QS4iOo7WSJyQkBAQE9OjRY+nSpY4dv23Lli3r0aNHQEBAJ7bPdoTFYtFuyRQTE3P48GGl1MKFC1vb19s5wcHq00/V+PFKEdwBAADcpEPBXSkVGRnZMp0fOHBAe76NIxpLSko6OHhZWZl2pmFiYuKJEyc68z46Zty4cSLy97//XSlVU1OzZMkSs9nsjInMZvOSJUtqamqUUu+9956I3Hvvvc6YSHP69GntRJrQ0FBtc+qaNWu0kzS1DvhOj3zokLLZVHCwUkqlp6sVKwjuAAAA7tHR4G6xWKKiorTucM2QIUNycnJKS0u1C7QjGp966qng4GD7NR1ZY968ebN2quO999570ckHDb799tsikp6erpT6/e9/LyKPP/64MybSes1ffvllpdTUqVNFZMmSJc6YyK6+vv4nP/mJ1pPz2WefqRYd8OPHj6+rq/tBo5WXq1deUaNHKxFlNjcH96oqNWCAmjuX4A4AAOAGHQ3umqtXr27cuNFkMrVM59HR0S3TuX0XZmhoqP2a/v37f2+CLygo0BaGMzMzr1y54sh39n1qa2s9PT29vb0vXrz473//W+un79zG0DY0NTUFBQWJyIEDB+rq6nx8fDw8PJx0d6SWrl27NmPGDG1z6qpVq5RSpaWl2l7YDt6eadcu9fzzKj5eiTT/CwxU//hHc3BXSr38surVi+AOAADgBj8suNvZ03lYWJg9nUdGRmrpXOurbmpqKioqeuaZZ+znqBgMhpa3FG3jFkvOM3bsWBHRDl25/fbbRWTTpk2OnWLjxo1av5BS6oMPPhCRe+65x7FTtOa7t2eqrKzUtucuXrz4e19itaqSEpWTo+Li/pvXe/dW2dmqsFBdu6aU+m9wv3ZNDRpEcAcAAHCDTgZ3O+34RZPJFBERYU/wQUFBLU8lt1qtX3755a9//etp06Zpr+r4LZYcbtGiRdoCv1LqhRdeEJE5c+Y4dorZs2eLyPz585VSmZmZIvKXv/zFsVO07YbbM50+ffr111+/4Rr7f1xkZHTv3lYtrwcFNed1R/8RAgAAAF1lUEqJg+zfv3/16tWrVq06dOiQ9kxgYOCUKVOysrImTZqk3S1IRJqamubMmfPOO+94enq+/fbbWju4y5w4cSIyMtLHx6empubw4cN33nlnSEjIiRMnPDw8HDK+zWaLiIg4derU3r174+LigoODGxoavvnmm379+jlk/A5auXLlo48+2tjYmJ2d/e677/bo0UN7vrGxcfPmzfn5+R999FFtba325LRppQMGJGZmysiRYjC4skwAAAB0lCODu52W4D/88MOKigrtmYCAgPT09KlTpw4dOvTpp5/evHmzr6/v6tWrtZt9utioUaO2b9+en5+fkZERFxdXWVlZXFyclpbmkMGLi4vHjBkTExNz5MiR/Pz8Bx98cNSoUdu2bXPI4D9IUVFRRkZGXV3d3XffvWLFikOHDq1bty4vL6+mpka7IDo6Oj09PSsra/To0QYCOwAAwM3N0xmDDh48ePDgwS+++GJ5eXlBQUF+fn5paen777///vvvaxf06dNnw4YNSUlJzpi9XZmZmfbgnpGRsWDBgvz8fEcF9/z8fBHJysqyP9a6ZVxv/PjxRUVFkydPLi4ujomJsVqt2vN33HFHZmZmZmbm4MGD3VIYAAAAOsEpK+7fVV1d/fHHHy9cuLCqqsrPz6+wsFA7Ut0tqqurY2Ji/Pz8ampqSktLR44cGRERcfTo0a6vOislqakzzOZVZrN56NDkCRNe3LHjlUOHKqKjox1SeSds2bLl/vvvF5HIyMisrKzp06cPGjTIXcUAAACg01wU3O1OnjwZFhbm9saMpKSk3bt3r1u3bsqUKVFRUUePHjWbzcnJyV0cdudOGTlSxo6t27Ll1vXrDVOnytixTf/6l1P+rNFxSqlTp07Zz/YBAACAHhldPF94eLjbU7v8p30lPz/fYDD87Gc/k/+0tXTRmjUiIsOH+xsMBu3xpEluTu0iYjAYSO0AAAB65+oV95vE4cOH4+PjAwICzpw5Yzabx4wZEx0dbbFYujjsgAFy5Ih8+aUkJ0toqJw/LxUVQmcKAAAAus7VK+43ibi4uCFDhly4cOGLL74YPXp0WFhYVVXVvn37ujLmnj1y5IiEhkpqqmzZIufPS2IiqR0AAACO0U2Du7ToljEajdOmTZMud8tor87IEKOx+bGbjpMBAADAjxDBPb+pqUl7/OGHH3ZlwIICbVix2aSwsPkxAAAA4BDdN7gnJiYOGjTo7Nmz27Ztu+eee4KCgg4ePGi/Y9QPdeCAVFRInz4yZoxs3SqnT0tcnAwZ4tiSAQAA0H113+AuIvbzZDw8PLTDzjvdLaO9bto08fRsfpyV5agyAQAAgO4d3LUOmYKCAqWUvXOmc0M9/LD8+c/y2GOilHz8sTa44woFAABAt9dNj4O0i42NtVgsX3311YgRI0JCQi5dunT06NGunHp+/bosXSrbtsnKlXITHFgPAACAH4luveIuIvbzZLy8vAoKCjp9h9H9+2XGDKmrEy8veeYZCQqS+npH1woAAIBurLsHd3uHjFJq3LhxQUFBnRunpkY++UReeKH5xw0b5No1R9UIAAAAiKe7C3Cz1NTU8PDw6urqv/71r5MmTWrtMqOxr812S2u/9fAQEZk0SbZtk5ISSUpyRqUAAADo1rp7cDcYDL179z558uSzzz7bxmXDhhXt3Xtva78NDJQ1a8TDQ3JzZc4c2bHDCYUCAACge+vuwV1EVq9enZmZWV9f7+nZ6qcRGtozNrbVEW67rfnB3XdLQoIsWeLoEgEAANDtEdxl4MCB5eXlXRxky5bmBwsWyN13szMVAAAADtbdN6c6XEiIzJ0rp065uw4AAAD8uLDi7hgDB8qTTzY/nj1bfHzEz8+tBQEAAODHpbvfgAkAAADQBVplAAAAAB0guAMAAAA6QHAHAAAAdIDgDgAAAOgAwR0AAADQAYI7AAAAoAMEdwAAAEAHCO4AAACADhDcAQAAAB0guAMAAAA6QHAHAAAAdIDgDgAAAOgAwR0AAADQAYI7AAAAoAMEdwAAAEAHCO4AAACADhDcAQAAAB0guAMAAAA6QHAHAAAAdIDgDgAAAOgAwR0AAADQAYI7AAAAoAMEdwAAAEAHCO4AAACADhDcAQAAAB0guAMAAAA6QHAHAAAAdIDgDgAAAOgAwR0AAADQAYI7AAAAoAMEdwAAAEAHCO4AAACADhDcAQAAAB0guAMAAAA6QHAHAAAAdIDgDgAAAOgAwR0AAADQAYI7AAAAoAMEdwAAAEAHCO4AAACADhDcAQAAAB0guAMAAAA6QHAHAAAAdIDgDgAAAOgAwR0AAADQAYI7AAAAoAMEdwAAAEAHCO4AAACADhDcAQAAAB0guAMAAAA6QHAHAAAAdIDgDgAAAOgAwR0AAADQAYI7AAAAoAMEdwAAAEAHCO4AAACADhDcAQAAAB0guAMAAAA6QHAHAAAAdIDgDgAAAOgAwR0AAADQAYI7AAAAoAMEdwAAAEAHCO4AAACADhDcAQAAAB34f2iq0i9D0DtoAAAAuHpUWHRyZGtpdFBLTCByZGtpdCAyMDIyLjA5LjMAAHice79v7T0GIOBlgABGIOaE4gZGNocMIM3MTCRDA8RgYWOA0BwQmolDQQtI/2dm5GZgzGBiZEpgYs5gYmZJYGHNYGJlU2Bj12Bi41BgZUgQYWRjYGVhZmIUL4O6BAw4Q0Ov7nvotmw/iBMa+nU/jL16ldYBoCtVkcTtIWywenuImlV2DAwHlkLYr4BiDUshalQdEOrBbLCZYgAtrjDKA3hsNwAAAQN6VFh0TU9MIHJka2l0IDIwMjIuMDkuMwAAeJyFkttugzAMhu/zFH4BIjsJAV/0gkPVTVtB2mjfofd9f81mYga1ozaW4vA5h99xoPbVf9zu8Gehdw4Adz5mhmtERHcGHUB7PL0P0E1Nu8x042WYvoHFUX1LNtN4XmYIOijQJ8o5V1CQD8wYa0CPs1ltUJI8vyajksHnPJP2/wFMmyV3Viw3p9wBs4Do42xa8e/WlYDk69dgDSMEX87k3s685p6pA93b6VAQXJvPAy1Vx6HftOO3Qe049NagJBGsC0kimtRJwwRVL002SSCbOCRRmQRBoraLkqRs90lasD7o+liaLy9Oxu4HtMWG4etYmSsAAAB3elRYdFNNSUxFUyByZGtpdCAyMDIyLjA5LjMAAHic87d11oj2143VTDZMBgFDhRoNIz1TC2NjYx1DPSNLSwMTHWtDPRDfWMdAxxompwuXNNAzNobJ6hromRiamZmZI/QCFVoaoooY6ZmB1RggySLMQ5gBF9OsAQDvSyMC3v+mYAAAAN16VFh0cmRraXRQS0wxIHJka2l0IDIwMjIuMDkuMwAAeJx7v2/tPQYg4GWAAEYg5gZiHiBuYGRzyADSzMxEMjRADBYYzQ6hmdkTtID0f2YmuACU5mZgzGBiZEpgYs5gYmZJYGHNYGJlU2Bjz2Bi50jg4Ezg5AIKMCRwsSWIMLExsLIwMzGysrNxcXKI90FdCgbcO0/M2P/Qbdl+ECcmRecAgh1zgIHhgRqSuD2IDVUPZj9WeryPgWHHMhDb3bwdKKayHMSWFPphfy5kNliNeVi4AwODAzJ7P5IaMFsMANC2N4pupi26AAABL3pUWHRNT0wxIHJka2l0IDIwMjIuMDkuMwAAeJyFkktuhDAMhvecwhcgshMnIYtZ8BhNq3ZAauncofveX7WngoR2lAaM8vjs2P5pQMfb9PL5BfuwU9MAYOVNKcHNIWJzBZ3AcL48zzCu/bDtjMvHvL4DEZAVH3mObL8u122HYISWDCUXbNCZTQldB2jwPrKvVdKa8D/plHSG+U7m8z8gH0JWIvpDlhUwKIjb1W3l7igkGfTBRa6CHcwCJteht3o1OW/9Ay4J54wLLBHlOPpf8WB8upxaglv/erJ7+7H0ah+47SSVebSVRM7zdJD4R/RhmacsOovZrCyLuSwfq2WR9PFZCllAyA0nsZi7ymJd7h2LpdwiFiMsqmf9EBVVssbc15qbbMayuLIUXW//vsybby9xn8TYOY88AAAAi3pUWHRTTUlMRVMxIHJka2l0IDIwMjIuMDkuMwAAeJxdjkEOwzAIBL/SYyIZBCwmtfKUqifufkEe37pRHKm33dGgJTUzF0rrr07v3m3N1MexENgdgSJlJ+NoIytba+Jfoqx/RH6+xThQlhrYztjwlDpERUXZwQgPL8JbvRud9bJp6nOJ7qnrnYnW4wM05Cnyw5bP2wAAAOV6VFh0cmRraXRQS0wyIHJka2l0IDIwMjIuMDkuMwAAeJx7v2/tPQYg4GWAAEYg5oLiBkY2hwwgzcxMJEMDxGBhY4DQHBCaCUazMSSALGDmZmDMYGJkSmBizmBiZklgYc1gYmVTYGPXYGLjUODgZGBlSBBhZGNgZWFmYhRvgroJDLisp2ju14lctB/EiezmPCB6czeYraXpcuC7Tv8+EHvDAvkDzYd67UHs018a9uc6LQez50zavTfS87MtiJ0zeZP934uL7EDs+CW/7R2dboHVtD0Xdti4KQ5s5kXeYoe7m7TBbDEAhtA2dIv027kAAAE/elRYdE1PTDIgcmRraXQgMjAyMi4wOS4zAAB4nH2SUW7DMAiG33MKLlALbAzmsU2qaZqaSFu3O+y999egVedWs2YbydhfMPxkghjvy9v3BX5HXqYJAP9ZZgZfBRGnE8QGDseX1xXm8/5wP5m3z/X8AYSxrvOZ3Z+30/2EYIYdJpHM1GBHKUsrLIAJr6N/m4PMidjIPSdZtEoekCXIklAqUo7oWU0YByTfYrL54wUoESp7fX/BGiD5sbJ60qmgKNUBKLd60Ki25vdETW2UpDrocaxSZr8u1BDbgGuwOWdSrbJvFCuxDjhzLnsYQpTIoIkZ8QD0nsxQkppqKO7aK4qNnj6uy1Ovbt07bOvSu+c5Qe4tYrfS+8BhXeyYtUvqDkgXjty0y5PdWleB3LVeLIU91sQR4THzxzzDv/+hvp9+AO7Ljxich+LiAAAAoXpUWHRTTUlMRVMyIHJka2l0IDIwMjIuMDkuMwAAeJwljcsNw0AIBVvJ0ZEI4rHLT1ZOLsBFuA0XH9bhOMzAcR7b93xfuNbgdW+DoyKUPsIe4pW0Kw9AsFB6FSbt4FEGJelViuQi5VZG4BCD0d62FCxzWUBGaUOwSMxobYgHmijPmsgmkFjdYHH7v9Mon4+DWRjU+fQwf6676+qaqecwet8/rg0qacUo5JYAAAC4elRYdHJka2l0UEtMMyByZGtpdCAyMDIyLjA5LjMAAHice79v7T0GIOBlgABGIOaE4gZGNocMIM3MTCRDA8RgYWOA0BwQmomDAayAkZGbgTGDiZEpgYk5g4mZJYGFNYOJlU2BjV2DiY1DgZUhQYSRjYGVhZmJUbwM6hIw4AwNvbrvoduy/SBOaOjX/TD26lVaB4CuVEUSt4ewwertIWpW2TEwHFgKYb8CijUshahRdUCoB7PBZooBAJr5L+oLW9CBAAAA83pUWHRNT0wzIHJka2l0IDIwMjIuMDkuMwAAeJyFktsOgjAMQN/3Ff0Bl+7CoI9yiTEGSBT9B9/9/9hisBDjaGmyjtOtlxkQubaX5wu+4ltjADDzERE8AiKaHmQBdXc6D9BMx3rZacb7MN2AWFF0Sx6nsV92HDRwQBtdSqmEg7OeCEMFaHEWjfVCOkv7ZBDS25RmUv//gHFzZObEYpNlBkwMog2zSMTfq0sGna32wQpG8LaYydzNtOZy3emGdjOBz0zqcWh1JpHNa+MjW9DuRjHtoWihnWIHkvbDsZVatWertDbHLmkJUQLWia7TEn95ZLw2b4Jqg+PqWuyaAAAAdHpUWHRTTUlMRVMzIHJka2l0IDIwMjIuMDkuMwAAeJxVjFEOgCAMQ6/iJyRj2RhOCeHLA3AIrsHhFRNA+9e+tiVfptjKtYu3Zjzup4gAo4+RAiTG7gUI0mBuQkKRQR1hYFU91vYpRv4nHvXt0Ieuv/UxM9tuW2ciHf+kyeEAAAE4elRYdHJka2l0UEtMNCByZGtpdCAyMDIyLjA5LjMAAHice79v7T0GIOBlgABGIOYHYgEgbmBkc8gA0szMWBjsDhpgBpIMWICFjQFCc0BoJnYGsAImhALchmIyuBkYM5gYmRKYmDOYmFkSWFgzmFjZFNjYNZjYOBQ4OBU4uTKYuLgTuHkymHh4E3j5gNIMCXycCSJMbAysLCBbubh5ePk4xfdBPQcG/LdOyhyYHbZ4P5jzp+qAZdIJMPsG/9wDf5jvgxQz9HX0Hth4vdoexH5+z+ZA2fdFYHZP2e/9DzYK2YHY7R5/9qW13wWzV//8snsj31uwmuYrf+wO1hmBzeye+due5/wFsJnpH2wc/l45Ahb3m9jrEH9yPpg9Q2Kuw0FpfbA5/bzVDptaloHNibot4yBS2QhmiwEAJBdWY1CY4okAAAGeelRYdE1PTDQgcmRraXQgMjAyMi4wOS4zAAB4nH2TS27jMAyG9z4FLxCDT1FcNklRDAZ1gJlM79B974+SLlK5gDByKEj2R4n8ySxQ48/19/sHfA++LgsA/ucXEfAmiLi8Qi3g/Pzya4PL/en8eHO5/dvuf4EMqKVPPj/Zp/vt9fGG4AInXlWjM8KJVvaGnQBX3Mfw5SJlDaYmVqQ1S68JKUXqGnlOVzjhqmLmPiEVtiKVOSjye3TJ6yegfYUZRoSZVkYpND2xFUhrNDWz/E4qbDPQC8zQgl0r3eSa6wTscCsQ0dVbXt2NkWYCRSZTB0rHKI8Wzjq7mrJEUDFaY9mDQO8yS5uqPJU2k8uuubjblKzylJIS3fc6aheRGSk7GRhsXAo5Ic4SJ02wCs6OkvFm06XLDLQ9SjXsvSeY8uRyAj5v1x/N99WO59t2He2oaTx6TtNkNJaWje6px0aP5Aba6ARK81FvTuujqpTbGLWjsmOJtCaiQym0JuKD5FoTyUFarYn0oKHWRHYQSyu2730rwg53l0pHTWr/+HvnevkEgPTI/IBeEL4AAADRelRYdFNNSUxFUzQgcmRraXQgMjAyMi4wOS4zAAB4nB2QOw4CMQxEr0K5SN7I/48iKno4BD0n4PDYm8p6E8+M/H48j9eHPvPo3sN3htvvOHEhhoajAa00RoLdUItDCXoQ9lDYgySxoEWvYA3YtMrNeZBipMDmVcYUcNIyiTDYupSlaghrigwpLLb2piDE9pZVzNH5gq2MixpmNUAim0KTpOaz04Wss8+JIuo/HELZYJK413FVSvhFCrO16SdmMWuTRS5XQze7jFQr+WrYd0i4//6Rqz6yNT7mWgAAASp6VFh0cmRraXRQS0w1IHJka2l0IDIwMjIuMDkuMwAAeJx7v2/tPQYg4GWAAEYgFgRiYSBuYGRzyADSzMxEMjRADBYYzQGhmdDF4RrYIQLMeMzEUMLNwJjBxMiUwMScwcTMksDCmsHEyqbAxp7AzpHAwanAyZXBxMWdwM2TwcTDm8DLl8HEwZ/BxC+QwMqQwMeZIMCWwSTCzMbAysLMxMjKzibAz8HGxc3Dy8cpfg3qeTAQlPAvOGDG37UfxFE8t/TApRJZMPvzifUHGNWj7EFsfdmeA3N63oLZJm9tDpwz3wRmT/yucWBd4sy9IPa5kNn7L17l3A8x1mPZsv3r7aDi9jBxoHoHmHqgvQ5I9jog2euAZK8Dkr0OMHsZGBzsbVt/Q+1y2A9jiwEAh/RY29+VzOoAAAGIelRYdE1PTDUgcmRraXQgMjAyMi4wOS4zAAB4nI1U22rDMAx9z1foB2p8bMmXxzUpY4wmsHX7h73v/5mUrrULYYsdCVscy5LPIQPZeJtev77pPsI0DET+j6/WSp/Rez+cyRZ0PD2/zDReno63yLh8zJd3QiZUPaPzEft0Wc63CGikQ3RZuIRCBzifixQ95vw62tlgSHEoYAQ6eJcgPvEGMl6RXGMoGnZFAqRsANmA7KJemSJBgVJkK6MYMLgqqLkoMNaguTeA6QpM7AFvRfrMpcYNZDYkXECUIIaUWBhbjRda1ky/YRc5BtkCVk25K6OWNtKuKmH87KJHOZlpFz0wfvbQA+NnDz2QtZ//6UHSIr22s4a1nZp0uZly5WcX9DRPD5K+ivy4zFMTOauFpmRWi02ubNZEaVOa9HRDqQkMarmpiNVKkwqr1SYImPW8szmg45fNIXQ8sjnEji82B+6IYXOQjgG2q1L30mwOuXtRtvLveytWz3XlVYvk1p29bP+Otr/9aHQ9/ABG9eI3kM0lEwAAALB6VFh0U01JTEVTNSByZGtpdCAyMDIyLjA5LjMAAHicbY9LDsMwCESv0mUi2YivA8px2LcXyOGLs2udFeIxDExSZm49Od+zSJVM2T+8Z9Lr2rqBhrA3BDcm83Z2BTncRqNC5laEIYzCi0iwyE2GIlHrCHioxw0JmMRkQhNXimIIh7WaxCijn+ZB/eQqtaMucw3rrVIZkJPeqkGGQyf6T7GEWDJgqUWFp2Vfr/T1zH59AY0KRbHnB7a6AAAAAElFTkSuQmCC\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from rdkit import Chem\n",
"from rdkit.Chem import Draw\n",
"from rdkit.Chem.Draw import IPythonConsole\n",
"from rdkit.Chem import rdChemReactions\n",
"from rdkit.Chem import EnumerateHeterocycles\n",
"from espsim import EmbedAlignScore\n",
"from espsim.helpers import mlCharges\n",
"from rdkit.Chem import rdMolAlign\n",
"from rdkit.Chem import rdMolDescriptors\n",
"from espsim import ConstrainedEmbedMultipleConfs\n",
"import espsim\n",
"import py3Dmol\n",
"import copy\n",
"from rdkit.Chem import AllChem\n",
"from rdkit.Chem import DataStructs\n",
"\n",
"smiles_list = ['c1ccccc1(C(=O)[O-])',\n",
" 'c1ccccc1c2n[n-]nn2',\n",
" 'c1ccccc1(C(=O)OC)',\n",
" 'c1ccccc1(C(=O)O)',\n",
" 'c1ccncc1C(=O)Nc2ccccc2',\n",
" 'c1ccccc1c3oc(c2cnccc2)nc3']\n",
"\n",
"mols = [Chem.MolFromSmiles(smi) for smi in smiles_list]\n",
"Draw.MolsToGridImage(mols, molsPerRow=5)\n",
"mol_3d = []\n",
"for m in mols:\n",
" m = Chem.AddHs(m)\n",
" AllChem.EmbedMolecule(m)\n",
" AllChem.MMFFOptimizeMolecule(m)\n",
" mol_3d.append(m)\n",
" \n",
"Draw.MolsToGridImage(mols, molsPerRow=5)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "fc1b1970",
"metadata": {},
"outputs": [],
"source": [
"def draw(ms,p=None, confIds=None):\n",
" if p is None:\n",
" p = py3Dmol.view(width=400, height=400)\n",
" if confIds is None:\n",
" confIds = [-1]*len(ms)\n",
" p.removeAllModels()\n",
" for i,m in enumerate(ms):\n",
" mb=Chem.MolToMolBlock(m, confId=confIds[i])\n",
" p.addModel(mb, 'sdf')\n",
" p.setStyle({'model':i},{'stick':{'radius':0.15}})\n",
" p.setBackgroundColor('white')#'0xeeeeee')\n",
" p.zoomTo()\n",
" return p.show()\n",
"\n",
"def align(prbMol, refMol, prbCrippen=None, refCrippen=None, i=-1, j=-1):\n",
" if prbCrippen == None:\n",
" prbCrippen = rdMolDescriptors._CalcCrippenContribs(prbMol)\n",
" if refCrippen == None:\n",
" refCrippen = rdMolDescriptors._CalcCrippenContribs(refMol)\n",
" alignment= rdMolAlign.GetCrippenO3A(prbMol, refMol, prbCrippen, refCrippen, i, j)\n",
" alignment.Align()\n",
" \n",
"def get2Dsim(prbMol, refMol):\n",
" prbMol = Chem.RemoveHs(prbMol)\n",
" refMol = Chem.RemoveHs(refMol)\n",
" prbFp = AllChem.GetMorganFingerprint(prbMol, 2)\n",
" refFp = AllChem.GetMorganFingerprint(refMol, 2)\n",
" return DataStructs.TanimotoSimilarity(prbFp, refFp)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "19a13e31",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"application/3dmoljs_load.v0": "<div id=\"3dmolviewer_16724738985805385\" style=\"position: relative; width: 400px; height: 400px\">\n <p id=\"3dmolwarning_16724738985805385\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n </div>\n<script>\n\nvar loadScriptAsync = function(uri){\n return new Promise((resolve, reject) => {\n var tag = document.createElement('script');\n tag.src = uri;\n tag.async = true;\n tag.onload = () => {\n resolve();\n };\n var firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n});\n};\n\nif(typeof $3Dmolpromise === 'undefined') {\n$3Dmolpromise = null;\n $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n}\n\nvar viewer_16724738985805385 = null;\nvar warn = document.getElementById(\"3dmolwarning_16724738985805385\");\nif(warn) {\n warn.parentNode.removeChild(warn);\n}\n$3Dmolpromise.then(function() {\nviewer_16724738985805385 = $3Dmol.createViewer($(\"#3dmolviewer_16724738985805385\"),{backgroundColor:\"white\"});\nviewer_16724738985805385.zoomTo();\n\tviewer_16724738985805385.removeAllModels();\n\tviewer_16724738985805385.addModel(\"\\n RDKit 3D\\n\\n 14 14 0 0 0 0 0 0 0 0999 V2000\\n 0.2216 -1.1886 -0.1248 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.1662 -1.2749 0.0120 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.9225 -0.1177 0.1895 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.2916 1.1245 0.2303 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0964 1.2081 0.0934 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.8763 0.0536 -0.0864 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.3835 0.1459 -0.2350 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.9013 1.3069 -0.1894 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.0189 -0.9446 -0.3943 O 0 0 0 0 0 1 0 0 0 0 0 0\\n 0.8130 -2.0925 -0.2636 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.6484 -2.2467 -0.0211 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.0004 -0.1836 0.2958 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.8719 2.0312 0.3682 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.5899 2.1783 0.1252 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 6 1 1 0\\n 1 10 1 0\\n 2 11 1 0\\n 3 12 1 0\\n 4 13 1 0\\n 5 14 1 0\\nM CHG 1 9 -1\\nM END\\n\",\"sdf\");\n\tviewer_16724738985805385.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724738985805385.addModel(\"\\n RDKit 3D\\n\\n 16 17 0 0 0 0 0 0 0 0999 V2000\\n -0.3944 -1.2121 -0.0293 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.7900 -1.2517 -0.0357 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5212 -0.0746 -0.2042 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.8594 1.1437 -0.3665 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.4639 1.1867 -0.3605 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2701 0.0080 -0.1918 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.8548 0.0549 -0.1848 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.5808 1.1906 -0.3352 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.8704 0.7836 -0.2681 N 0 0 0 0 0 2 0 0 0 0 0 0\\n 3.9092 -0.5534 -0.0834 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.6453 -1.0360 -0.0276 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.1779 -2.1277 0.1018 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3018 -2.2012 0.0909 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.6068 -0.1067 -0.2090 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.4253 2.0613 -0.4979 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0545 2.1346 -0.4868 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 8 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 6 1 1 0\\n 11 7 1 0\\n 1 12 1 0\\n 2 13 1 0\\n 3 14 1 0\\n 4 15 1 0\\n 5 16 1 0\\nM CHG 1 9 -1\\nM END\\n\",\"sdf\");\n\tviewer_16724738985805385.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724738985805385.setBackgroundColor(\"white\");\n\tviewer_16724738985805385.zoomTo();\nviewer_16724738985805385.render();\n});\n</script>",
"text/html": [
"<div id=\"3dmolviewer_16724738985805385\" style=\"position: relative; width: 400px; height: 400px\">\n",
" <p id=\"3dmolwarning_16724738985805385\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n",
" <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n",
" </div>\n",
"<script>\n",
"\n",
"var loadScriptAsync = function(uri){\n",
" return new Promise((resolve, reject) => {\n",
" var tag = document.createElement('script');\n",
" tag.src = uri;\n",
" tag.async = true;\n",
" tag.onload = () => {\n",
" resolve();\n",
" };\n",
" var firstScriptTag = document.getElementsByTagName('script')[0];\n",
" firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n",
"});\n",
"};\n",
"\n",
"if(typeof $3Dmolpromise === 'undefined') {\n",
"$3Dmolpromise = null;\n",
" $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n",
"}\n",
"\n",
"var viewer_16724738985805385 = null;\n",
"var warn = document.getElementById(\"3dmolwarning_16724738985805385\");\n",
"if(warn) {\n",
" warn.parentNode.removeChild(warn);\n",
"}\n",
"$3Dmolpromise.then(function() {\n",
"viewer_16724738985805385 = $3Dmol.createViewer($(\"#3dmolviewer_16724738985805385\"),{backgroundColor:\"white\"});\n",
"viewer_16724738985805385.zoomTo();\n",
"\tviewer_16724738985805385.removeAllModels();\n",
"\tviewer_16724738985805385.addModel(\"\\n RDKit 3D\\n\\n 14 14 0 0 0 0 0 0 0 0999 V2000\\n 0.2216 -1.1886 -0.1248 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.1662 -1.2749 0.0120 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.9225 -0.1177 0.1895 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.2916 1.1245 0.2303 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0964 1.2081 0.0934 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.8763 0.0536 -0.0864 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.3835 0.1459 -0.2350 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.9013 1.3069 -0.1894 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.0189 -0.9446 -0.3943 O 0 0 0 0 0 1 0 0 0 0 0 0\\n 0.8130 -2.0925 -0.2636 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.6484 -2.2467 -0.0211 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.0004 -0.1836 0.2958 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.8719 2.0312 0.3682 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.5899 2.1783 0.1252 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 6 1 1 0\\n 1 10 1 0\\n 2 11 1 0\\n 3 12 1 0\\n 4 13 1 0\\n 5 14 1 0\\nM CHG 1 9 -1\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724738985805385.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724738985805385.addModel(\"\\n RDKit 3D\\n\\n 16 17 0 0 0 0 0 0 0 0999 V2000\\n -0.3944 -1.2121 -0.0293 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.7900 -1.2517 -0.0357 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5212 -0.0746 -0.2042 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.8594 1.1437 -0.3665 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.4639 1.1867 -0.3605 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2701 0.0080 -0.1918 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.8548 0.0549 -0.1848 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.5808 1.1906 -0.3352 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.8704 0.7836 -0.2681 N 0 0 0 0 0 2 0 0 0 0 0 0\\n 3.9092 -0.5534 -0.0834 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.6453 -1.0360 -0.0276 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.1779 -2.1277 0.1018 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3018 -2.2012 0.0909 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.6068 -0.1067 -0.2090 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.4253 2.0613 -0.4979 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0545 2.1346 -0.4868 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 8 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 6 1 1 0\\n 11 7 1 0\\n 1 12 1 0\\n 2 13 1 0\\n 3 14 1 0\\n 4 15 1 0\\n 5 16 1 0\\nM CHG 1 9 -1\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724738985805385.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724738985805385.setBackgroundColor(\"white\");\n",
"\tviewer_16724738985805385.zoomTo();\n",
"viewer_16724738985805385.render();\n",
"});\n",
"</script>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"prbmol = copy.deepcopy(mol_3d[0])\n",
"refmol = copy.deepcopy(mol_3d[1])\n",
"draw([prbmol,refmol])"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "f54d999b",
"metadata": {},
"outputs": [
{
"data": {
"application/3dmoljs_load.v0": "<div id=\"3dmolviewer_16724738985888789\" style=\"position: relative; width: 400px; height: 400px\">\n <p id=\"3dmolwarning_16724738985888789\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n </div>\n<script>\n\nvar loadScriptAsync = function(uri){\n return new Promise((resolve, reject) => {\n var tag = document.createElement('script');\n tag.src = uri;\n tag.async = true;\n tag.onload = () => {\n resolve();\n };\n var firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n});\n};\n\nif(typeof $3Dmolpromise === 'undefined') {\n$3Dmolpromise = null;\n $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n}\n\nvar viewer_16724738985888789 = null;\nvar warn = document.getElementById(\"3dmolwarning_16724738985888789\");\nif(warn) {\n warn.parentNode.removeChild(warn);\n}\n$3Dmolpromise.then(function() {\nviewer_16724738985888789 = $3Dmol.createViewer($(\"#3dmolviewer_16724738985888789\"),{backgroundColor:\"white\"});\nviewer_16724738985888789.zoomTo();\n\tviewer_16724738985888789.removeAllModels();\n\tviewer_16724738985888789.addModel(\"\\n RDKit 3D\\n\\n 14 14 0 0 0 0 0 0 0 0999 V2000\\n -0.3832 1.1857 -0.3597 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.7801 1.1588 -0.3679 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.4550 -0.0500 -0.2070 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.7337 -1.2306 -0.0381 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.3368 -1.2011 -0.0303 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.3620 0.0069 -0.1909 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.8789 0.0376 -0.1822 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.4811 -1.0718 -0.0241 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.4375 1.1704 -0.3336 O 0 0 0 0 0 1 0 0 0 0 0 0\\n 0.1446 2.1299 -0.4854 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3330 2.0834 -0.5002 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5399 -0.0720 -0.2132 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.2502 -2.1768 0.0880 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2273 -2.1232 0.1016 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 6 1 1 0\\n 1 10 1 0\\n 2 11 1 0\\n 3 12 1 0\\n 4 13 1 0\\n 5 14 1 0\\nM CHG 1 9 -1\\nM END\\n\",\"sdf\");\n\tviewer_16724738985888789.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724738985888789.addModel(\"\\n RDKit 3D\\n\\n 16 17 0 0 0 0 0 0 0 0999 V2000\\n -0.3944 -1.2121 -0.0293 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.7900 -1.2517 -0.0357 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5212 -0.0746 -0.2042 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.8594 1.1437 -0.3665 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.4639 1.1867 -0.3605 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2701 0.0080 -0.1918 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.8548 0.0549 -0.1848 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.5808 1.1906 -0.3352 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.8704 0.7836 -0.2681 N 0 0 0 0 0 2 0 0 0 0 0 0\\n 3.9092 -0.5534 -0.0834 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.6453 -1.0360 -0.0276 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.1779 -2.1277 0.1018 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3018 -2.2012 0.0909 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.6068 -0.1067 -0.2090 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.4253 2.0613 -0.4979 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0545 2.1346 -0.4868 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 8 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 6 1 1 0\\n 11 7 1 0\\n 1 12 1 0\\n 2 13 1 0\\n 3 14 1 0\\n 4 15 1 0\\n 5 16 1 0\\nM CHG 1 9 -1\\nM END\\n\",\"sdf\");\n\tviewer_16724738985888789.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724738985888789.setBackgroundColor(\"white\");\n\tviewer_16724738985888789.zoomTo();\nviewer_16724738985888789.render();\n});\n</script>",
"text/html": [
"<div id=\"3dmolviewer_16724738985888789\" style=\"position: relative; width: 400px; height: 400px\">\n",
" <p id=\"3dmolwarning_16724738985888789\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n",
" <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n",
" </div>\n",
"<script>\n",
"\n",
"var loadScriptAsync = function(uri){\n",
" return new Promise((resolve, reject) => {\n",
" var tag = document.createElement('script');\n",
" tag.src = uri;\n",
" tag.async = true;\n",
" tag.onload = () => {\n",
" resolve();\n",
" };\n",
" var firstScriptTag = document.getElementsByTagName('script')[0];\n",
" firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n",
"});\n",
"};\n",
"\n",
"if(typeof $3Dmolpromise === 'undefined') {\n",
"$3Dmolpromise = null;\n",
" $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n",
"}\n",
"\n",
"var viewer_16724738985888789 = null;\n",
"var warn = document.getElementById(\"3dmolwarning_16724738985888789\");\n",
"if(warn) {\n",
" warn.parentNode.removeChild(warn);\n",
"}\n",
"$3Dmolpromise.then(function() {\n",
"viewer_16724738985888789 = $3Dmol.createViewer($(\"#3dmolviewer_16724738985888789\"),{backgroundColor:\"white\"});\n",
"viewer_16724738985888789.zoomTo();\n",
"\tviewer_16724738985888789.removeAllModels();\n",
"\tviewer_16724738985888789.addModel(\"\\n RDKit 3D\\n\\n 14 14 0 0 0 0 0 0 0 0999 V2000\\n -0.3832 1.1857 -0.3597 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.7801 1.1588 -0.3679 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.4550 -0.0500 -0.2070 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.7337 -1.2306 -0.0381 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.3368 -1.2011 -0.0303 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.3620 0.0069 -0.1909 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.8789 0.0376 -0.1822 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.4811 -1.0718 -0.0241 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.4375 1.1704 -0.3336 O 0 0 0 0 0 1 0 0 0 0 0 0\\n 0.1446 2.1299 -0.4854 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3330 2.0834 -0.5002 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5399 -0.0720 -0.2132 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.2502 -2.1768 0.0880 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2273 -2.1232 0.1016 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 6 1 1 0\\n 1 10 1 0\\n 2 11 1 0\\n 3 12 1 0\\n 4 13 1 0\\n 5 14 1 0\\nM CHG 1 9 -1\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724738985888789.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724738985888789.addModel(\"\\n RDKit 3D\\n\\n 16 17 0 0 0 0 0 0 0 0999 V2000\\n -0.3944 -1.2121 -0.0293 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.7900 -1.2517 -0.0357 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5212 -0.0746 -0.2042 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.8594 1.1437 -0.3665 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.4639 1.1867 -0.3605 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2701 0.0080 -0.1918 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.8548 0.0549 -0.1848 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.5808 1.1906 -0.3352 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.8704 0.7836 -0.2681 N 0 0 0 0 0 2 0 0 0 0 0 0\\n 3.9092 -0.5534 -0.0834 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.6453 -1.0360 -0.0276 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.1779 -2.1277 0.1018 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3018 -2.2012 0.0909 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.6068 -0.1067 -0.2090 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.4253 2.0613 -0.4979 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0545 2.1346 -0.4868 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 8 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 6 1 1 0\\n 11 7 1 0\\n 1 12 1 0\\n 2 13 1 0\\n 3 14 1 0\\n 4 15 1 0\\n 5 16 1 0\\nM CHG 1 9 -1\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724738985888789.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724738985888789.setBackgroundColor(\"white\");\n",
"\tviewer_16724738985888789.zoomTo();\n",
"viewer_16724738985888789.render();\n",
"});\n",
"</script>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"align(prbmol, refmol)\n",
"draw([prbmol,refmol])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "fc6ce7cd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ECFP4 TC:0.32 SHAPESIM_1:0.85 ESPSIM_1:1.00\n",
"ECFP4 TC:0.32 SHAPESIM_1:0.85 ESPSIM_1:1.00\n",
"ECFP4 TC:0.32 SHAPESIM_1:0.85 ESPSIM_1:0.99\n"
]
}
],
"source": [
"spapesim_1, espsim_1 = EmbedAlignScore(prbmol,refmol, refNumConfs=50)\n",
"spapesim_2, espsim_2 = EmbedAlignScore(prbmol,refmol, getBestESP=True)\n",
"spapesim_3, espsim_3 = EmbedAlignScore(prbmol,refmol, getBestESP=True, partialCharges='ml', refNumConfs=10)\n",
"sim2d = get2Dsim(prbmol, refmol)\n",
"\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_1[0]:.2f} ESPSIM_1:{espsim_1[0]:.2f}\")\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_2[0]:.2f} ESPSIM_1:{espsim_2[0]:.2f}\")\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_3[0]:.2f} ESPSIM_1:{espsim_3[0]:.2f}\")\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "15f066e6",
"metadata": {},
"outputs": [
{
"data": {
"application/3dmoljs_load.v0": "<div id=\"3dmolviewer_16724739132879486\" style=\"position: relative; width: 400px; height: 400px\">\n <p id=\"3dmolwarning_16724739132879486\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n </div>\n<script>\n\nvar loadScriptAsync = function(uri){\n return new Promise((resolve, reject) => {\n var tag = document.createElement('script');\n tag.src = uri;\n tag.async = true;\n tag.onload = () => {\n resolve();\n };\n var firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n});\n};\n\nif(typeof $3Dmolpromise === 'undefined') {\n$3Dmolpromise = null;\n $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n}\n\nvar viewer_16724739132879486 = null;\nvar warn = document.getElementById(\"3dmolwarning_16724739132879486\");\nif(warn) {\n warn.parentNode.removeChild(warn);\n}\n$3Dmolpromise.then(function() {\nviewer_16724739132879486 = $3Dmol.createViewer($(\"#3dmolviewer_16724739132879486\"),{backgroundColor:\"white\"});\nviewer_16724739132879486.zoomTo();\n\tviewer_16724739132879486.removeAllModels();\n\tviewer_16724739132879486.addModel(\"\\n RDKit 3D\\n\\n 14 14 0 0 0 0 0 0 0 0999 V2000\\n -0.6591 0.8183 0.7304 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.0247 1.0401 0.9261 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.9615 0.2717 0.2373 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5332 -0.7174 -0.6464 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.1671 -0.9373 -0.8404 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.2072 -0.1737 -0.1557 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2760 -0.4135 -0.3673 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.6048 -1.3299 -1.1861 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0821 0.3193 0.2895 O 0 0 0 0 0 1 0 0 0 0 0 0\\n 0.0733 1.4183 1.2684 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3484 1.8127 1.6162 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.0222 0.4432 0.3886 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.2551 -1.3209 -1.1873 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8319 -1.7100 -1.5306 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 6 1 1 0\\n 1 10 1 0\\n 2 11 1 0\\n 3 12 1 0\\n 4 13 1 0\\n 5 14 1 0\\nM CHG 1 9 -1\\nM END\\n\",\"sdf\");\n\tviewer_16724739132879486.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724739132879486.addModel(\"\\n RDKit 3D\\n\\n 18 18 0 0 0 0 0 0 0 0999 V2000\\n -1.1536 -0.9419 -0.8444 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5161 -0.7128 -0.6422 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.9316 0.2796 0.2444 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.9880 1.0442 0.9298 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.6237 0.8180 0.7302 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.1980 -0.1781 -0.1597 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2410 -0.4634 -0.4120 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.6331 -1.3259 -1.1824 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0300 0.3588 0.3247 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.4288 0.1427 0.1342 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8394 -1.7192 -1.5388 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.2518 -1.3089 -1.1766 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.9928 0.4576 0.4015 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3144 1.8177 1.6209 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0946 1.4256 1.2748 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7072 0.3283 -0.9079 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7046 -0.8728 0.4353 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.9701 0.8505 0.7681 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 9 10 1 0\\n 6 1 1 0\\n 1 11 1 0\\n 2 12 1 0\\n 3 13 1 0\\n 4 14 1 0\\n 5 15 1 0\\n 10 16 1 0\\n 10 17 1 0\\n 10 18 1 0\\nM END\\n\",\"sdf\");\n\tviewer_16724739132879486.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724739132879486.setBackgroundColor(\"white\");\n\tviewer_16724739132879486.zoomTo();\nviewer_16724739132879486.render();\n});\n</script>",
"text/html": [
"<div id=\"3dmolviewer_16724739132879486\" style=\"position: relative; width: 400px; height: 400px\">\n",
" <p id=\"3dmolwarning_16724739132879486\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n",
" <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n",
" </div>\n",
"<script>\n",
"\n",
"var loadScriptAsync = function(uri){\n",
" return new Promise((resolve, reject) => {\n",
" var tag = document.createElement('script');\n",
" tag.src = uri;\n",
" tag.async = true;\n",
" tag.onload = () => {\n",
" resolve();\n",
" };\n",
" var firstScriptTag = document.getElementsByTagName('script')[0];\n",
" firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n",
"});\n",
"};\n",
"\n",
"if(typeof $3Dmolpromise === 'undefined') {\n",
"$3Dmolpromise = null;\n",
" $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n",
"}\n",
"\n",
"var viewer_16724739132879486 = null;\n",
"var warn = document.getElementById(\"3dmolwarning_16724739132879486\");\n",
"if(warn) {\n",
" warn.parentNode.removeChild(warn);\n",
"}\n",
"$3Dmolpromise.then(function() {\n",
"viewer_16724739132879486 = $3Dmol.createViewer($(\"#3dmolviewer_16724739132879486\"),{backgroundColor:\"white\"});\n",
"viewer_16724739132879486.zoomTo();\n",
"\tviewer_16724739132879486.removeAllModels();\n",
"\tviewer_16724739132879486.addModel(\"\\n RDKit 3D\\n\\n 14 14 0 0 0 0 0 0 0 0999 V2000\\n -0.6591 0.8183 0.7304 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.0247 1.0401 0.9261 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.9615 0.2717 0.2373 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5332 -0.7174 -0.6464 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.1671 -0.9373 -0.8404 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.2072 -0.1737 -0.1557 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2760 -0.4135 -0.3673 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.6048 -1.3299 -1.1861 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0821 0.3193 0.2895 O 0 0 0 0 0 1 0 0 0 0 0 0\\n 0.0733 1.4183 1.2684 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3484 1.8127 1.6162 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.0222 0.4432 0.3886 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.2551 -1.3209 -1.1873 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8319 -1.7100 -1.5306 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 6 1 1 0\\n 1 10 1 0\\n 2 11 1 0\\n 3 12 1 0\\n 4 13 1 0\\n 5 14 1 0\\nM CHG 1 9 -1\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724739132879486.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724739132879486.addModel(\"\\n RDKit 3D\\n\\n 18 18 0 0 0 0 0 0 0 0999 V2000\\n -1.1536 -0.9419 -0.8444 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5161 -0.7128 -0.6422 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.9316 0.2796 0.2444 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.9880 1.0442 0.9298 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.6237 0.8180 0.7302 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.1980 -0.1781 -0.1597 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2410 -0.4634 -0.4120 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.6331 -1.3259 -1.1824 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0300 0.3588 0.3247 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.4288 0.1427 0.1342 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8394 -1.7192 -1.5388 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.2518 -1.3089 -1.1766 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.9928 0.4576 0.4015 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3144 1.8177 1.6209 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0946 1.4256 1.2748 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7072 0.3283 -0.9079 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7046 -0.8728 0.4353 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.9701 0.8505 0.7681 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 9 10 1 0\\n 6 1 1 0\\n 1 11 1 0\\n 2 12 1 0\\n 3 13 1 0\\n 4 14 1 0\\n 5 15 1 0\\n 10 16 1 0\\n 10 17 1 0\\n 10 18 1 0\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724739132879486.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724739132879486.setBackgroundColor(\"white\");\n",
"\tviewer_16724739132879486.zoomTo();\n",
"viewer_16724739132879486.render();\n",
"});\n",
"</script>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"prbmol = copy.deepcopy(mol_3d[0])\n",
"refmol = copy.deepcopy(mol_3d[2])\n",
"align(prbmol, refmol)\n",
"draw([prbmol,refmol])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "bd217af8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ECFP4 TC:0.61 SHAPESIM_1:0.88 ESPSIM_1:0.22\n",
"ECFP4 TC:0.61 SHAPESIM_1:0.88 ESPSIM_1:0.22\n",
"ECFP4 TC:0.61 SHAPESIM_1:0.88 ESPSIM_1:0.44\n"
]
}
],
"source": [
"spapesim_1, espsim_1 = EmbedAlignScore(prbmol,refmol, refNumConfs=50)\n",
"spapesim_2, espsim_2 = EmbedAlignScore(prbmol,refmol, getBestESP=True)\n",
"spapesim_3, espsim_3 = EmbedAlignScore(prbmol,refmol, getBestESP=True, partialCharges='ml', refNumConfs=10)\n",
"sim2d = get2Dsim(prbmol, refmol)\n",
"\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_1[0]:.2f} ESPSIM_1:{espsim_1[0]:.2f}\")\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_2[0]:.2f} ESPSIM_1:{espsim_2[0]:.2f}\")\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_3[0]:.2f} ESPSIM_1:{espsim_3[0]:.2f}\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "61671f42",
"metadata": {},
"outputs": [
{
"data": {
"application/3dmoljs_load.v0": "<div id=\"3dmolviewer_16724739283199413\" style=\"position: relative; width: 400px; height: 400px\">\n <p id=\"3dmolwarning_16724739283199413\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n </div>\n<script>\n\nvar loadScriptAsync = function(uri){\n return new Promise((resolve, reject) => {\n var tag = document.createElement('script');\n tag.src = uri;\n tag.async = true;\n tag.onload = () => {\n resolve();\n };\n var firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n});\n};\n\nif(typeof $3Dmolpromise === 'undefined') {\n$3Dmolpromise = null;\n $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n}\n\nvar viewer_16724739283199413 = null;\nvar warn = document.getElementById(\"3dmolwarning_16724739283199413\");\nif(warn) {\n warn.parentNode.removeChild(warn);\n}\n$3Dmolpromise.then(function() {\nviewer_16724739283199413 = $3Dmol.createViewer($(\"#3dmolviewer_16724739283199413\"),{backgroundColor:\"white\"});\nviewer_16724739283199413.zoomTo();\n\tviewer_16724739283199413.removeAllModels();\n\tviewer_16724739283199413.addModel(\"\\n RDKit 3D\\n\\n 15 15 0 0 0 0 0 0 0 0999 V2000\\n -0.6261 0.8173 0.7296 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.9895 1.0450 0.9306 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.9344 0.2809 0.2455 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5209 -0.7124 -0.6419 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.1591 -0.9432 -0.8456 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.2058 -0.1791 -0.1605 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2290 -0.4593 -0.4083 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.6712 -1.3051 -1.1637 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0483 0.3352 0.3036 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0986 1.4207 1.2705 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3141 1.8189 1.6219 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.9952 0.4600 0.4037 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.2582 -1.3074 -1.1752 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8439 -1.7200 -1.5396 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.9450 0.0395 0.0410 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 6 1 1 0\\n 1 10 1 0\\n 2 11 1 0\\n 3 12 1 0\\n 4 13 1 0\\n 5 14 1 0\\n 9 15 1 0\\nM END\\n\",\"sdf\");\n\tviewer_16724739283199413.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724739283199413.addModel(\"\\n RDKit 3D\\n\\n 18 18 0 0 0 0 0 0 0 0999 V2000\\n -1.1536 -0.9419 -0.8444 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5161 -0.7128 -0.6422 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.9316 0.2796 0.2444 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.9880 1.0442 0.9298 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.6237 0.8180 0.7302 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.1980 -0.1781 -0.1597 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2410 -0.4634 -0.4120 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.6331 -1.3259 -1.1824 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0300 0.3588 0.3247 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.4288 0.1427 0.1342 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8394 -1.7192 -1.5388 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.2518 -1.3089 -1.1766 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.9928 0.4576 0.4015 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3144 1.8177 1.6209 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0946 1.4256 1.2748 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7072 0.3283 -0.9079 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7046 -0.8728 0.4353 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.9701 0.8505 0.7681 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 9 10 1 0\\n 6 1 1 0\\n 1 11 1 0\\n 2 12 1 0\\n 3 13 1 0\\n 4 14 1 0\\n 5 15 1 0\\n 10 16 1 0\\n 10 17 1 0\\n 10 18 1 0\\nM END\\n\",\"sdf\");\n\tviewer_16724739283199413.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724739283199413.setBackgroundColor(\"white\");\n\tviewer_16724739283199413.zoomTo();\nviewer_16724739283199413.render();\n});\n</script>",
"text/html": [
"<div id=\"3dmolviewer_16724739283199413\" style=\"position: relative; width: 400px; height: 400px\">\n",
" <p id=\"3dmolwarning_16724739283199413\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n",
" <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n",
" </div>\n",
"<script>\n",
"\n",
"var loadScriptAsync = function(uri){\n",
" return new Promise((resolve, reject) => {\n",
" var tag = document.createElement('script');\n",
" tag.src = uri;\n",
" tag.async = true;\n",
" tag.onload = () => {\n",
" resolve();\n",
" };\n",
" var firstScriptTag = document.getElementsByTagName('script')[0];\n",
" firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n",
"});\n",
"};\n",
"\n",
"if(typeof $3Dmolpromise === 'undefined') {\n",
"$3Dmolpromise = null;\n",
" $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n",
"}\n",
"\n",
"var viewer_16724739283199413 = null;\n",
"var warn = document.getElementById(\"3dmolwarning_16724739283199413\");\n",
"if(warn) {\n",
" warn.parentNode.removeChild(warn);\n",
"}\n",
"$3Dmolpromise.then(function() {\n",
"viewer_16724739283199413 = $3Dmol.createViewer($(\"#3dmolviewer_16724739283199413\"),{backgroundColor:\"white\"});\n",
"viewer_16724739283199413.zoomTo();\n",
"\tviewer_16724739283199413.removeAllModels();\n",
"\tviewer_16724739283199413.addModel(\"\\n RDKit 3D\\n\\n 15 15 0 0 0 0 0 0 0 0999 V2000\\n -0.6261 0.8173 0.7296 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.9895 1.0450 0.9306 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.9344 0.2809 0.2455 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5209 -0.7124 -0.6419 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.1591 -0.9432 -0.8456 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.2058 -0.1791 -0.1605 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2290 -0.4593 -0.4083 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.6712 -1.3051 -1.1637 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0483 0.3352 0.3036 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0986 1.4207 1.2705 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3141 1.8189 1.6219 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.9952 0.4600 0.4037 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.2582 -1.3074 -1.1752 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8439 -1.7200 -1.5396 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.9450 0.0395 0.0410 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 6 1 1 0\\n 1 10 1 0\\n 2 11 1 0\\n 3 12 1 0\\n 4 13 1 0\\n 5 14 1 0\\n 9 15 1 0\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724739283199413.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724739283199413.addModel(\"\\n RDKit 3D\\n\\n 18 18 0 0 0 0 0 0 0 0999 V2000\\n -1.1536 -0.9419 -0.8444 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5161 -0.7128 -0.6422 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.9316 0.2796 0.2444 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.9880 1.0442 0.9298 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.6237 0.8180 0.7302 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.1980 -0.1781 -0.1597 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2410 -0.4634 -0.4120 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.6331 -1.3259 -1.1824 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0300 0.3588 0.3247 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.4288 0.1427 0.1342 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8394 -1.7192 -1.5388 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.2518 -1.3089 -1.1766 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.9928 0.4576 0.4015 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.3144 1.8177 1.6209 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0946 1.4256 1.2748 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7072 0.3283 -0.9079 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7046 -0.8728 0.4353 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.9701 0.8505 0.7681 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 9 10 1 0\\n 6 1 1 0\\n 1 11 1 0\\n 2 12 1 0\\n 3 13 1 0\\n 4 14 1 0\\n 5 15 1 0\\n 10 16 1 0\\n 10 17 1 0\\n 10 18 1 0\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724739283199413.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724739283199413.setBackgroundColor(\"white\");\n",
"\tviewer_16724739283199413.zoomTo();\n",
"viewer_16724739283199413.render();\n",
"});\n",
"</script>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#compare neutral benzoic acid and benzoic acid methylate\n",
"prbmol = copy.deepcopy(mol_3d[3])\n",
"refmol = copy.deepcopy(mol_3d[2])\n",
"align(prbmol, refmol)\n",
"draw([prbmol,refmol])"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "963fad74",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ECFP4 TC:0.61 SHAPESIM_1:0.89 ESPSIM_1:0.85\n",
"ECFP4 TC:0.61 SHAPESIM_1:0.88 ESPSIM_1:0.88\n",
"ECFP4 TC:0.61 SHAPESIM_1:0.88 ESPSIM_1:0.96\n"
]
}
],
"source": [
"spapesim_1, espsim_1 = EmbedAlignScore(prbmol,refmol, refNumConfs=50)\n",
"spapesim_2, espsim_2 = EmbedAlignScore(prbmol,refmol, getBestESP=True)\n",
"spapesim_3, espsim_3 = EmbedAlignScore(prbmol,refmol, getBestESP=True, partialCharges='ml', refNumConfs=10)\n",
"sim2d = get2Dsim(prbmol, refmol)\n",
"\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_1[0]:.2f} ESPSIM_1:{espsim_1[0]:.2f}\")\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_2[0]:.2f} ESPSIM_1:{espsim_2[0]:.2f}\")\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_3[0]:.2f} ESPSIM_1:{espsim_3[0]:.2f}\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "11e562e3",
"metadata": {},
"outputs": [
{
"data": {
"application/3dmoljs_load.v0": "<div id=\"3dmolviewer_16724739436625526\" style=\"position: relative; width: 400px; height: 400px\">\n <p id=\"3dmolwarning_16724739436625526\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n </div>\n<script>\n\nvar loadScriptAsync = function(uri){\n return new Promise((resolve, reject) => {\n var tag = document.createElement('script');\n tag.src = uri;\n tag.async = true;\n tag.onload = () => {\n resolve();\n };\n var firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n});\n};\n\nif(typeof $3Dmolpromise === 'undefined') {\n$3Dmolpromise = null;\n $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n}\n\nvar viewer_16724739436625526 = null;\nvar warn = document.getElementById(\"3dmolwarning_16724739436625526\");\nif(warn) {\n warn.parentNode.removeChild(warn);\n}\n$3Dmolpromise.then(function() {\nviewer_16724739436625526 = $3Dmol.createViewer($(\"#3dmolviewer_16724739436625526\"),{backgroundColor:\"white\"});\nviewer_16724739436625526.zoomTo();\n\tviewer_16724739436625526.removeAllModels();\n\tviewer_16724739436625526.addModel(\"\\n RDKit 3D\\n\\n 25 26 0 0 0 0 0 0 0 0999 V2000\\n 3.1046 -0.4565 0.9135 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.3750 -0.6919 0.3928 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.5820 -0.4724 -0.9603 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.6228 -0.0328 -1.8059 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.3995 0.1992 -1.2700 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0861 -0.0181 0.0653 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.7311 0.2374 0.6088 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.6473 0.6721 1.7509 O 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.3138 -0.0892 -0.2377 N 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.6936 0.0924 0.0007 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5800 -0.3989 -0.9675 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.9611 -0.2540 -0.8106 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.4697 0.3865 0.3156 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5969 0.8817 1.2812 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.2144 0.7367 1.1241 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.9090 -0.6133 1.9719 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.1838 -1.0354 1.0286 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.5555 -0.6436 -1.4123 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.6730 0.5940 -1.9741 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.0876 -0.5792 -1.0936 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.2116 -0.9033 -1.8567 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.6385 -0.6411 -1.5673 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -5.5430 0.5013 0.4418 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.9876 1.3849 2.1622 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.5718 1.1435 1.8985 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 11 12 1 0\\n 12 13 2 0\\n 13 14 1 0\\n 14 15 2 0\\n 6 1 1 0\\n 15 10 1 0\\n 1 16 1 0\\n 2 17 1 0\\n 3 18 1 0\\n 5 19 1 0\\n 9 20 1 0\\n 11 21 1 0\\n 12 22 1 0\\n 13 23 1 0\\n 14 24 1 0\\n 15 25 1 0\\nM END\\n\",\"sdf\");\n\tviewer_16724739436625526.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724739436625526.addModel(\"\\n RDKit 3D\\n\\n 27 29 0 0 0 0 0 0 0 0999 V2000\\n -2.2752 -1.1732 -0.0687 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5240 -1.7964 0.0119 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.6879 -1.0481 -0.1415 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.6041 0.3220 -0.3752 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.3546 0.9447 -0.4556 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.1708 0.2065 -0.3036 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8734 0.8636 -0.3889 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2413 0.0799 -0.2305 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2961 0.9455 -0.3568 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.6281 0.3770 -0.2308 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7494 1.1932 -0.3472 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.0319 0.7590 -0.2454 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.2077 -0.5587 -0.0152 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.1644 -1.4596 0.1175 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.8587 -0.9821 0.0077 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.9420 2.1965 -0.5794 N 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.4299 2.1510 -0.6007 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.3817 -1.7813 0.0549 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5850 -2.8663 0.1944 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -5.6591 -1.5322 -0.0789 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -5.5116 0.9085 -0.4953 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.3241 2.0159 -0.6391 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.6482 2.2608 -0.5329 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 6.2419 -0.8820 0.0624 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.3616 -2.5098 0.3022 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0287 -1.6769 0.1094 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.0182 3.0423 -0.7664 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 1 0\\n 8 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 11 12 1 0\\n 12 13 2 0\\n 13 14 1 0\\n 14 15 2 0\\n 9 16 2 0\\n 16 17 1 0\\n 6 1 1 0\\n 15 10 1 0\\n 17 7 2 0\\n 1 18 1 0\\n 2 19 1 0\\n 3 20 1 0\\n 4 21 1 0\\n 5 22 1 0\\n 11 23 1 0\\n 13 24 1 0\\n 14 25 1 0\\n 15 26 1 0\\n 17 27 1 0\\nM END\\n\",\"sdf\");\n\tviewer_16724739436625526.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724739436625526.setBackgroundColor(\"white\");\n\tviewer_16724739436625526.zoomTo();\nviewer_16724739436625526.render();\n});\n</script>",
"text/html": [
"<div id=\"3dmolviewer_16724739436625526\" style=\"position: relative; width: 400px; height: 400px\">\n",
" <p id=\"3dmolwarning_16724739436625526\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n",
" <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n",
" </div>\n",
"<script>\n",
"\n",
"var loadScriptAsync = function(uri){\n",
" return new Promise((resolve, reject) => {\n",
" var tag = document.createElement('script');\n",
" tag.src = uri;\n",
" tag.async = true;\n",
" tag.onload = () => {\n",
" resolve();\n",
" };\n",
" var firstScriptTag = document.getElementsByTagName('script')[0];\n",
" firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n",
"});\n",
"};\n",
"\n",
"if(typeof $3Dmolpromise === 'undefined') {\n",
"$3Dmolpromise = null;\n",
" $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n",
"}\n",
"\n",
"var viewer_16724739436625526 = null;\n",
"var warn = document.getElementById(\"3dmolwarning_16724739436625526\");\n",
"if(warn) {\n",
" warn.parentNode.removeChild(warn);\n",
"}\n",
"$3Dmolpromise.then(function() {\n",
"viewer_16724739436625526 = $3Dmol.createViewer($(\"#3dmolviewer_16724739436625526\"),{backgroundColor:\"white\"});\n",
"viewer_16724739436625526.zoomTo();\n",
"\tviewer_16724739436625526.removeAllModels();\n",
"\tviewer_16724739436625526.addModel(\"\\n RDKit 3D\\n\\n 25 26 0 0 0 0 0 0 0 0999 V2000\\n 3.1046 -0.4565 0.9135 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.3750 -0.6919 0.3928 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.5820 -0.4724 -0.9603 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.6228 -0.0328 -1.8059 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.3995 0.1992 -1.2700 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0861 -0.0181 0.0653 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.7311 0.2374 0.6088 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.6473 0.6721 1.7509 O 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.3138 -0.0892 -0.2377 N 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.6936 0.0924 0.0007 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.5800 -0.3989 -0.9675 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.9611 -0.2540 -0.8106 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.4697 0.3865 0.3156 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5969 0.8817 1.2812 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.2144 0.7367 1.1241 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.9090 -0.6133 1.9719 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.1838 -1.0354 1.0286 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.5555 -0.6436 -1.4123 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.6730 0.5940 -1.9741 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.0876 -0.5792 -1.0936 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.2116 -0.9033 -1.8567 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.6385 -0.6411 -1.5673 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -5.5430 0.5013 0.4418 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.9876 1.3849 2.1622 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.5718 1.1435 1.8985 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 11 12 1 0\\n 12 13 2 0\\n 13 14 1 0\\n 14 15 2 0\\n 6 1 1 0\\n 15 10 1 0\\n 1 16 1 0\\n 2 17 1 0\\n 3 18 1 0\\n 5 19 1 0\\n 9 20 1 0\\n 11 21 1 0\\n 12 22 1 0\\n 13 23 1 0\\n 14 24 1 0\\n 15 25 1 0\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724739436625526.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724739436625526.addModel(\"\\n RDKit 3D\\n\\n 27 29 0 0 0 0 0 0 0 0999 V2000\\n -2.2752 -1.1732 -0.0687 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5240 -1.7964 0.0119 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.6879 -1.0481 -0.1415 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.6041 0.3220 -0.3752 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.3546 0.9447 -0.4556 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.1708 0.2065 -0.3036 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8734 0.8636 -0.3889 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2413 0.0799 -0.2305 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2961 0.9455 -0.3568 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.6281 0.3770 -0.2308 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7494 1.1932 -0.3472 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.0319 0.7590 -0.2454 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.2077 -0.5587 -0.0152 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.1644 -1.4596 0.1175 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.8587 -0.9821 0.0077 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.9420 2.1965 -0.5794 N 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.4299 2.1510 -0.6007 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.3817 -1.7813 0.0549 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5850 -2.8663 0.1944 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -5.6591 -1.5322 -0.0789 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -5.5116 0.9085 -0.4953 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.3241 2.0159 -0.6391 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.6482 2.2608 -0.5329 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 6.2419 -0.8820 0.0624 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.3616 -2.5098 0.3022 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0287 -1.6769 0.1094 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.0182 3.0423 -0.7664 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 1 0\\n 8 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 11 12 1 0\\n 12 13 2 0\\n 13 14 1 0\\n 14 15 2 0\\n 9 16 2 0\\n 16 17 1 0\\n 6 1 1 0\\n 15 10 1 0\\n 17 7 2 0\\n 1 18 1 0\\n 2 19 1 0\\n 3 20 1 0\\n 4 21 1 0\\n 5 22 1 0\\n 11 23 1 0\\n 13 24 1 0\\n 14 25 1 0\\n 15 26 1 0\\n 17 27 1 0\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724739436625526.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724739436625526.setBackgroundColor(\"white\");\n",
"\tviewer_16724739436625526.zoomTo();\n",
"viewer_16724739436625526.render();\n",
"});\n",
"</script>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"prbmol = copy.deepcopy(mol_3d[-2])\n",
"refmol = copy.deepcopy(mol_3d[-1])\n",
"draw([prbmol,refmol])"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "d9a8fe97",
"metadata": {},
"outputs": [
{
"data": {
"application/3dmoljs_load.v0": "<div id=\"3dmolviewer_16724739436743813\" style=\"position: relative; width: 400px; height: 400px\">\n <p id=\"3dmolwarning_16724739436743813\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n </div>\n<script>\n\nvar loadScriptAsync = function(uri){\n return new Promise((resolve, reject) => {\n var tag = document.createElement('script');\n tag.src = uri;\n tag.async = true;\n tag.onload = () => {\n resolve();\n };\n var firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n});\n};\n\nif(typeof $3Dmolpromise === 'undefined') {\n$3Dmolpromise = null;\n $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n}\n\nvar viewer_16724739436743813 = null;\nvar warn = document.getElementById(\"3dmolwarning_16724739436743813\");\nif(warn) {\n warn.parentNode.removeChild(warn);\n}\n$3Dmolpromise.then(function() {\nviewer_16724739436743813 = $3Dmol.createViewer($(\"#3dmolviewer_16724739436743813\"),{backgroundColor:\"white\"});\nviewer_16724739436743813.zoomTo();\n\tviewer_16724739436743813.removeAllModels();\n\tviewer_16724739436743813.addModel(\"\\n RDKit 3D\\n\\n 25 26 0 0 0 0 0 0 0 0999 V2000\\n -2.2565 0.3912 -0.0701 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.4219 1.0963 -0.3619 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.3608 2.1025 -1.3137 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.2350 2.4348 -1.9849 N 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.1189 1.7247 -1.6894 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.0722 0.7196 -0.7323 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.1733 -0.0251 -0.4312 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0738 -1.2138 -0.1524 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.3323 0.7305 -0.4589 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.6534 0.2739 -0.2595 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.6685 1.2403 -0.2431 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.0035 0.8708 -0.0579 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.3371 -0.4699 0.1103 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.3362 -1.4379 0.0914 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.9998 -1.0681 -0.0941 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.2703 -0.4080 0.6675 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.3551 0.8638 0.1395 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.2434 2.6809 -1.5738 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.2503 1.9936 -2.2834 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2356 1.7328 -0.5586 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.4376 2.2944 -0.3717 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.7814 1.6297 -0.0449 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 6.3740 -0.7617 0.2548 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.5903 -2.4871 0.2200 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.2540 -1.8565 -0.1081 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 11 12 1 0\\n 12 13 2 0\\n 13 14 1 0\\n 14 15 2 0\\n 6 1 1 0\\n 15 10 1 0\\n 1 16 1 0\\n 2 17 1 0\\n 3 18 1 0\\n 5 19 1 0\\n 9 20 1 0\\n 11 21 1 0\\n 12 22 1 0\\n 13 23 1 0\\n 14 24 1 0\\n 15 25 1 0\\nM END\\n\",\"sdf\");\n\tviewer_16724739436743813.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724739436743813.addModel(\"\\n RDKit 3D\\n\\n 27 29 0 0 0 0 0 0 0 0999 V2000\\n -2.2752 -1.1732 -0.0687 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5240 -1.7964 0.0119 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.6879 -1.0481 -0.1415 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.6041 0.3220 -0.3752 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.3546 0.9447 -0.4556 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.1708 0.2065 -0.3036 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8734 0.8636 -0.3889 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2413 0.0799 -0.2305 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2961 0.9455 -0.3568 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.6281 0.3770 -0.2308 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7494 1.1932 -0.3472 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.0319 0.7590 -0.2454 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.2077 -0.5587 -0.0152 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.1644 -1.4596 0.1175 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.8587 -0.9821 0.0077 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.9420 2.1965 -0.5794 N 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.4299 2.1510 -0.6007 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.3817 -1.7813 0.0549 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5850 -2.8663 0.1944 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -5.6591 -1.5322 -0.0789 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -5.5116 0.9085 -0.4953 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.3241 2.0159 -0.6391 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.6482 2.2608 -0.5329 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 6.2419 -0.8820 0.0624 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.3616 -2.5098 0.3022 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0287 -1.6769 0.1094 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.0182 3.0423 -0.7664 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 1 0\\n 8 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 11 12 1 0\\n 12 13 2 0\\n 13 14 1 0\\n 14 15 2 0\\n 9 16 2 0\\n 16 17 1 0\\n 6 1 1 0\\n 15 10 1 0\\n 17 7 2 0\\n 1 18 1 0\\n 2 19 1 0\\n 3 20 1 0\\n 4 21 1 0\\n 5 22 1 0\\n 11 23 1 0\\n 13 24 1 0\\n 14 25 1 0\\n 15 26 1 0\\n 17 27 1 0\\nM END\\n\",\"sdf\");\n\tviewer_16724739436743813.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n\tviewer_16724739436743813.setBackgroundColor(\"white\");\n\tviewer_16724739436743813.zoomTo();\nviewer_16724739436743813.render();\n});\n</script>",
"text/html": [
"<div id=\"3dmolviewer_16724739436743813\" style=\"position: relative; width: 400px; height: 400px\">\n",
" <p id=\"3dmolwarning_16724739436743813\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension: <br>\n",
" <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n",
" </div>\n",
"<script>\n",
"\n",
"var loadScriptAsync = function(uri){\n",
" return new Promise((resolve, reject) => {\n",
" var tag = document.createElement('script');\n",
" tag.src = uri;\n",
" tag.async = true;\n",
" tag.onload = () => {\n",
" resolve();\n",
" };\n",
" var firstScriptTag = document.getElementsByTagName('script')[0];\n",
" firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n",
"});\n",
"};\n",
"\n",
"if(typeof $3Dmolpromise === 'undefined') {\n",
"$3Dmolpromise = null;\n",
" $3Dmolpromise = loadScriptAsync('https://cdn.jsdelivr.net/npm/3dmol@latest/build/3Dmol-min.min.js');\n",
"}\n",
"\n",
"var viewer_16724739436743813 = null;\n",
"var warn = document.getElementById(\"3dmolwarning_16724739436743813\");\n",
"if(warn) {\n",
" warn.parentNode.removeChild(warn);\n",
"}\n",
"$3Dmolpromise.then(function() {\n",
"viewer_16724739436743813 = $3Dmol.createViewer($(\"#3dmolviewer_16724739436743813\"),{backgroundColor:\"white\"});\n",
"viewer_16724739436743813.zoomTo();\n",
"\tviewer_16724739436743813.removeAllModels();\n",
"\tviewer_16724739436743813.addModel(\"\\n RDKit 3D\\n\\n 25 26 0 0 0 0 0 0 0 0999 V2000\\n -2.2565 0.3912 -0.0701 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.4219 1.0963 -0.3619 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.3608 2.1025 -1.3137 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.2350 2.4348 -1.9849 N 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.1189 1.7247 -1.6894 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.0722 0.7196 -0.7323 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.1733 -0.0251 -0.4312 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.0738 -1.2138 -0.1524 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.3323 0.7305 -0.4589 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.6534 0.2739 -0.2595 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.6685 1.2403 -0.2431 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.0035 0.8708 -0.0579 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.3371 -0.4699 0.1103 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.3362 -1.4379 0.0914 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.9998 -1.0681 -0.0941 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.2703 -0.4080 0.6675 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.3551 0.8638 0.1395 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.2434 2.6809 -1.5738 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.2503 1.9936 -2.2834 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2356 1.7328 -0.5586 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.4376 2.2944 -0.3717 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.7814 1.6297 -0.0449 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 6.3740 -0.7617 0.2548 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.5903 -2.4871 0.2200 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.2540 -1.8565 -0.1081 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 2 0\\n 7 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 11 12 1 0\\n 12 13 2 0\\n 13 14 1 0\\n 14 15 2 0\\n 6 1 1 0\\n 15 10 1 0\\n 1 16 1 0\\n 2 17 1 0\\n 3 18 1 0\\n 5 19 1 0\\n 9 20 1 0\\n 11 21 1 0\\n 12 22 1 0\\n 13 23 1 0\\n 14 24 1 0\\n 15 25 1 0\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724739436743813.setStyle({\"model\": 0},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724739436743813.addModel(\"\\n RDKit 3D\\n\\n 27 29 0 0 0 0 0 0 0 0999 V2000\\n -2.2752 -1.1732 -0.0687 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5240 -1.7964 0.0119 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.6879 -1.0481 -0.1415 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -4.6041 0.3220 -0.3752 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.3546 0.9447 -0.4556 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -2.1708 0.2065 -0.3036 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.8734 0.8636 -0.3889 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.2413 0.0799 -0.2305 O 0 0 0 0 0 0 0 0 0 0 0 0\\n 1.2961 0.9455 -0.3568 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.6281 0.3770 -0.2308 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.7494 1.1932 -0.3472 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.0319 0.7590 -0.2454 N 0 0 0 0 0 0 0 0 0 0 0 0\\n 5.2077 -0.5587 -0.0152 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.1644 -1.4596 0.1175 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.8587 -0.9821 0.0077 C 0 0 0 0 0 0 0 0 0 0 0 0\\n 0.9420 2.1965 -0.5794 N 0 0 0 0 0 0 0 0 0 0 0 0\\n -0.4299 2.1510 -0.6007 C 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.3817 -1.7813 0.0549 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.5850 -2.8663 0.1944 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -5.6591 -1.5322 -0.0789 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -5.5116 0.9085 -0.4953 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -3.3241 2.0159 -0.6391 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 3.6482 2.2608 -0.5329 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 6.2419 -0.8820 0.0624 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 4.3616 -2.5098 0.3022 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 2.0287 -1.6769 0.1094 H 0 0 0 0 0 0 0 0 0 0 0 0\\n -1.0182 3.0423 -0.7664 H 0 0 0 0 0 0 0 0 0 0 0 0\\n 1 2 2 0\\n 2 3 1 0\\n 3 4 2 0\\n 4 5 1 0\\n 5 6 2 0\\n 6 7 1 0\\n 7 8 1 0\\n 8 9 1 0\\n 9 10 1 0\\n 10 11 2 0\\n 11 12 1 0\\n 12 13 2 0\\n 13 14 1 0\\n 14 15 2 0\\n 9 16 2 0\\n 16 17 1 0\\n 6 1 1 0\\n 15 10 1 0\\n 17 7 2 0\\n 1 18 1 0\\n 2 19 1 0\\n 3 20 1 0\\n 4 21 1 0\\n 5 22 1 0\\n 11 23 1 0\\n 13 24 1 0\\n 14 25 1 0\\n 15 26 1 0\\n 17 27 1 0\\nM END\\n\",\"sdf\");\n",
"\tviewer_16724739436743813.setStyle({\"model\": 1},{\"stick\": {\"radius\": 0.15}});\n",
"\tviewer_16724739436743813.setBackgroundColor(\"white\");\n",
"\tviewer_16724739436743813.zoomTo();\n",
"viewer_16724739436743813.render();\n",
"});\n",
"</script>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"align(prbmol, refmol)\n",
"draw([prbmol,refmol])"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "b09c90d8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ECFP4 TC:0.42 SHAPESIM_1:0.79 ESPSIM_1:0.40\n",
"ECFP4 TC:0.42 SHAPESIM_1:0.79 ESPSIM_1:0.62\n",
"ECFP4 TC:0.42 SHAPESIM_1:0.79 ESPSIM_1:0.80\n"
]
}
],
"source": [
"spapesim_1, espsim_1 = EmbedAlignScore(prbmol,refmol, refNumConfs=50)\n",
"spapesim_2, espsim_2 = EmbedAlignScore(prbmol,refmol, getBestESP=True)\n",
"spapesim_3, espsim_3 = EmbedAlignScore(prbmol,refmol, getBestESP=True, partialCharges='ml', refNumConfs=10)\n",
"sim2d = get2Dsim(prbmol, refmol)\n",
"\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_1[0]:.2f} ESPSIM_1:{espsim_1[0]:.2f}\")\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_2[0]:.2f} ESPSIM_1:{espsim_2[0]:.2f}\")\n",
"print(f\"ECFP4 TC:{sim2d:.2f} SHAPESIM_1:{spapesim_3[0]:.2f} ESPSIM_1:{espsim_3[0]:.2f}\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ef69fb63",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment