diff --git a/docs/releasehistory.rst b/docs/releasehistory.rst index a999b3dc..8ece06e8 100644 --- a/docs/releasehistory.rst +++ b/docs/releasehistory.rst @@ -16,12 +16,14 @@ New features """""""""""" - `PR #88 `_: New method to retrieve atom degrees with RDKit. - `PR #86 `_: New method to check the input PDB prior building the molecule. +- `PR #94 `_: New method for the OPLS OBC parameters. - `PR #92 `_: New parameter to skip the stereochemistry assignment (and the checking from the OpenFF toolkit). Tests added """"""""""" - `PR #88 `_: Adds tests to validate the atom degrees getter. - `PR #86 `_: Adds tests to validate the PDB check up. +- `PR #94 `_: Adds tests to validate the OPLS OBC parameters generator. - `PR #92 `_: New test to check the behaviour of the allow_undefined_stereo parameter. diff --git a/examples/OFF_parameterization/parameterize.ipynb b/examples/OFF_parameterization/parameterize.ipynb index 17a122f3..dbc3b49a 100644 --- a/examples/OFF_parameterization/parameterize.ipynb +++ b/examples/OFF_parameterization/parameterize.ipynb @@ -37,6 +37,23 @@ "from peleffy.solvent import OBC2" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load required files for this test" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from peleffy.utils import get_data_file_path\n", + "bnz_pdb_path = get_data_file_path('ligands/')" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -65,7 +82,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3f9d60a4aabe403fb635f49f41140020", + "model_id": "b433644b2afd4ef5935abe9f8d484b42", "version_major": 2, "version_minor": 0 }, @@ -84,9 +101,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcIAAACWCAIAAADCEh9HAAAABmJLR0QA/wD/AP+gvaeTAAAVMUlEQVR4nO3de1CU9f4H8M8CErOwKt7I0LzBgqyKF0QN6AIpdTwKpjmaeKksS6fYpRVDLDMNR1KGc6a0puMcjx6dTCpxrNAxy6zIBpTElt0VKYiLaws7XNb1YWH398dz4sesNiH7PM+XXd6vv5zv08znvbP28fNc9vvInE4nAQBAb/mwDgAA4NnQRgEA3II2CgDgFrRRAAC3oI0CALgFbRQAwC1oowAAbkEbhR4xmUwqlaq8vLxrpaCgID4+nmEkoXjxRwNpoI1Cj3Acp9PpbDZb14rZbNbr9QwjCcWLPxpIA20UAMAtfqwDgCcpKyvjOI7/s8FgYBtGWF780UBsMvymHnqipqZmzJgxCoXC19eXX+E4Ti6Xm81mtsHc58UfDaSBk3q4C2fOnLH8IS8vj3UcIXnxRwOxoY0CALgFbRQAwC1oo9AjMpns9kUfH5+mpibpwwirubn59kUfH/yvAT2FW0zQS21tbWvXrv3mm28MBoNCoWAdp5daW1sjIiIefPDBf/3rX0FBQazjgEfCP7nQS4GBgfX19Q0NDW+99RbrLL23Y8eOhoaGmpqawMBA1lnAU2Eahd67ePHizJkz/fz8rly5Eh4ezjrOXauqqoqKirLb7cXFxbGxsazjgKfCNAq9N3369FWrVrW3t2dmZrLO0hsZGRkcx61evRo9FNyBaRTcYjKZlEplS0tLUVFRcnIy6zh34ezZs0lJSQqFwmAwjBw5knUc8GCYRsEtISEhWVlZRJSRkWG321nH6anOzk61Wk1E2dnZ6KHgJrRRcFdGRkZ4eLhOp3v//fdZZ+mpvXv3lpeXjx8/nm+mAO7AST0I4Pjx44sWLQoODjYajcOGDWMd5y9YLJbw8PDGxsbjx4+npKSwjgMeD9MoCCA1NTU5OdlisWzbto11lr/22muvNTY2JiYmooeCIDCNgjB0Ol10dLTT6bx06dLkyZNZx/lTOp1u6tSpDoejj+cED4JpFIQRFRW1bt26rls3fRZ/K+zFF19EDwWhYBoFwfT9a46edQ0XPAWmURBMcHDw1q1b6Y/H2lnHcdX1M4E333wTPRQEhDYKQlq/fv3kyZOrqqry8/NZZ3GVl5d39epV/uID6yzgVXBSDwLrm78O8txfW0Hfh2kUBJaYmLhw4cLW1tYtW7awzvL/srKyWlpaUlJS0ENBcJhGQXjXrl1TqVR9Z+ekrp2oysvLlUol6zjgbTCNgvAmTJiQnp7ucDjUajXzf6edTqdarXY4HBqNBj0UxIBpFETB7yrf0NBw+PDhp556imGSw4cPp6WlhYSEGAyGQYMGMUwC3grTKIhCoVDs2LGDiDIzM61WK6sYNptt8+bNRLRz5070UBAJ2iiIZc2aNbGxsXV1dbm5uawy7Ny5s6amZvr06atXr2aVAbweTupBRMXFxXFxcQEBATqdbuzYsRJX/+233yIjI20227lz5xISEiSuDv0HplEQ0Zw5c5YtW2az2V599VXpq2u12ps3by5fvhw9FESFaRTEVVtbGxkZabVav/7664ceekiyut99911CQkJAQEBFRcWYMWMkqwv9EKZRENeoUaM2btxIRGq1urOzU5qiXc9avfrqq+ihIDZMoyA6m80WFRX166+/pqSkxMTESFCxpKSksLBw9OjRer1eLpdLUBH6M7RRkEJGRsbBgwcbGxslqxgSErJixYo9e/ZIVhH6LbRREB3HcZMmTaqsrHz88cenT58uQcXS0tKioqJx48bpdLqAgAAJKkJ/5sc6AHi/3bt3V1ZWqlSqEydO+PlJ8Veus7Nz+vTply9fzsvL4x+/BxAPplEQ1/Xr1yMiIlpaWk6fPj137lzJ6n711VeJiYlBQUEGg+G+++6TrC70Q7hTD+LKzMxsaWlZvHixlD2UiB555JEnnniira0tKytLyrrQD2EaBRGVlpbGxsYOGDDgypUrYWFhElf/5ZdfoqKiOI4rLi6eNWuWxNWh/8C1URCL0+ncsGGDw+HQarV37KEGg6G5uVmQWoMGDYqIiHBZHDduXEZGRk5OzoYNG3788UcfH5x7gSgwjYJYDh48uHr16pCQEKPROHDgwNv/g+Tk5NOnTwtSa968eadOnbp9va2tLSIior6+/uDBgytXrhSkFoALTKMgiq6Lkrm5uXfsoUQUGRlpsVgEKRcZGXnH9aCgoJycnDVr1mRmZqakpPxZEgB3YBoFUWRnZ+fk5MyYMYP52bTT6ZwzZ86FCxeys7P5LVABhIU2CsLrurfzzTffxMfHs45DP/zwwwMPPODv78/kThd4PVx0B+Fptdpbt26tXLmyL/RQIpo9e3ZaWhrHcUz26wOvh2kUBMY/9y6Xy/V6/ejRo1nH+Z+6urrIyMi2tjaJfwUA/QGmURBSZ2enRqMhouzs7L7TQ4koNDSUH0U1Gk1HRwfrOOBVMI2CkPbt27d+/fq+uSdI1w4p+/bte+GFF1jHAe+BNgqCsVgsSqXSbDYXFBQsXryYdZw7KCgoePLJJ4cMGWI0GocOHco6DngJnNSDYLZt22Y2mx955JG+2UOJaMmSJXPnzm1qasKTTyAgTKMgDL1eP2XKFIfDUVpaGh0dzTrOn/r555+nTp1KRGVlZSqVinUc8AaYRkEYGRkZdrv9ueee68s9lIhUKtWzzz7b0dGhVqtZZwEvgWkUBHDy5MkFCxYMHjzYaDQOHz6cdZy/0NTUFB4e3tTUdPLkyfnz57OOAx4P0yi4q729XavVEtHWrVv7fg8loiFDhmzZsoWI1Go1x3Gs44DHQxsFd/3zn/80GAyRkZEbNmxgnaWnXnrpJZVKVVlZ+c4777DOAh4PJ/Xglhs3biiVyubm5s8///zxxx9nHecunDlzZu7cuQqFwmg03nvvvazjgAfDNApuyc7Obm5u/vvf/+5ZPZSIHn300fnz57e2tr7++uuss4BnwzQKvVdWVhYTE+Pj41NeXn775vN9X2Vl5aRJk+x2+4ULF2JiYljHAU+FaRR6T61Wd3Z2vvzyy57YQ4koLCyMf82JWq3GPAG9hmkUeuno0aPLli0bMWKEwWAYPHgw6zi91NLSEhERcf369aNHjy5dupR1HPBImEahN2w2G79h0o4dOzy3hxLRwIEDt23bRkRarfbmzZus44BHQhv1YCaTSaVSlZeXd60UFBRIs1Py22+//euvv06dOvWZZ56RoJyo1q5dGxMT89tvv+3Zs0fsWgy/MhAP2qgH4zhOp9PZbLauFbPZrNfrxa5bV1eXm5tLRPn5+b6+vmKXE5uPj09+fr5MJtu5c2dNTY2otVh9ZSAqtFG4a5mZmVardenSpQ899BDrLMKIi4tbsmSJzWbbvHkz6yzgefCCZY9XVlbW9YtGg8FARMeOHRP1bklgYOA999yza9cu8UpILzc398SJE8ePH5fJZOJV2bt3L93pKwOPhjbq8bRabdeZNcdxcrmcYRiHw3H58mV+J7q+qaysbMqUKWzf+dynvjIQgBM8VnV1NRFduHCha2Xfvn1Dhw4Vu+6KFSuI6Mknn3RZb21tnTZtWmBgYG1trdgZeqe2tjYwMHDatGmtra0uh5YsWUJEaWlpogZg9ZWBqHBtFO7arl27AgMDjx07du7cue7rQUFBEyZMsFqtffY9xps2bbJarWFhYUFBQd3Xv/vuu48//lgul7/11lussoHnQhuFuxYaGrpp0yb641dM3Q/l5eXJ5fLDhw9/++23jNL9qeLi4iNHjgQEBPCPGXRxOBzp6elOpzMrK+v+++9nFQ88F9qoB7vjzRBprvpptdqxY8eWlZXt37+/+/ro0aMzMjKcTmd6errD4ZAgSQ91/eJz48aNY8eO7X7ogw8+KC0t5ZOLHYPhVwYiYnxRATzW0aNHiWj48OEWi6X7utVq5We6AwcOsMp2u3//+99EFBoa2tbW1n29ubmZ3yXvo48+YpUNPB3aKPQe/9woP352d+jQISIKCQlpbm5mEsxFa2vrfffdR0T//e9/XQ5pNBoiiouLczgcTLKBF0Abhd67dOmSr6/vgAED9Hp993WHw8H/wDErK4tVtu74W16zZ8926ZVXr1719/f38fEpKSlhlQ28ANoouOW5554jovnz57usl5SU+Pj4+Pv7G41GJsG6XLt2LSAgQCaTdX/MiPe3v/2NiJ5//nkmwcBroI2CW0wmE7/D0+eff+5yaPXq1US0aNEiJsG6pKamEtGaNWtc1k+fPk1EAwcObGhoYBIMvAbaKLhr9+7dRBQWFsZxXPf169evDxw4kIhOnTrFKtuXX35JREFBQXV1dd3X29vb+a2m9+zZwyobeA20UXBXV0vKy8tzOZSTk0NEUVFRdrtd+mAdHR1Tpkwhop07d7oc4vfECwsLu3XrlvTBwMugjYIATp48eccTZI7jwsPDiejdd9+VPhX/8uTx48fbbLbu6zdu3OAvRHz22WfSpwLvgzYKwuDfDLpu3TqX9Y8//piIhgwZYjabpczT1NQ0bNgwIvrkk09cDj3//PNENHfuXCnzgBdDGwVhVFRUDBgw4I4PD82bN4+IXn75ZSnzvPTSS0SUmJjosl5WVubr6+vn53flyhUp84AXQxsFwajVaiKKj493eTzz559/9vPz8/Pzu3z5sjRJdDrdgAEDfH19f/rpJ5dDDz/8MBFpNBppkkB/gDYKgrFYLMOHDyeiY8eOuRxav349ESUlJUmTJDk5mYg2bNjgsv7RRx/xVxgaGxulSQL9AdooCGnfvn1ENHr0aKvV2n29sbFx6NChRHTixAmxMxQWFhJRcHDw77//3n3dZrPxm5K89957YmeAfgVtFITU0dERHR1NRDt27HA5lJ+fT0QTJkwQ9RkjjuOUSiUR/eMf/3A5tH37diJSqVRMnr4CL4Y2CgI7f/68TCaTy+XV1dXd1+12+6RJk4goNzdXvOr8G6ImTpzY3t7efb22tpbfqvmrr74Srzr0T2ijILzFixcT0cqVK13Wz5w5Q0QKhaK+vl6MuiaTadCgQUT0xRdfuBxKS0sjoiVLlohRF/o5tFEQXnV1tVwul8lk58+fdzm0YMECInr22WfFqPvMM88Q0cKFC13Wi4uLZTJZQEBAVVWVGHWhn0MbBVFkZ2cT0YwZMzo7O7uvG41Gf39/hULhcv/Hfb///rtCobh9TymHwxEbG0tEW7ZsEbYiAE/mdDoF2UUfoLubN29OnDixpqbmwIED/FZPXT788MOEhITQ0FDBi9bV1Z0/f37ZsmXdFw8cOPD000+Hhobq9XqXN9kBCAJtFMRy6NChVatWhYSEGI1Gfqsn6bW1tUVERNTX1x86dIi/PAogOLxLC8SSlpYWFxdnMpn4u+dM5OTk1NfXz549e8WKFawygNfDNAoiKi0tjY2N5X/Azm/1JKWqqiqVSsVxXHFx8axZsySuDv0HplEQ0YwZM9LS0trb2/m3IUlMq9XeunVr1apV6KEgKkyjIC6TyaRUKltaWk6dOsVv9SSNs2fPJiUlBQUFGQwG/rWgACLBNAriCgkJ2bRpExFpNJqOjg5pinZ2dvJvTt68eTN6KIgN0yiIrr29XaVSVVZWPvbYYzNmzJCgYmlpaVFR0bhx43Q6XUBAgAQVoT/zYx0AvJ+/v/+CBQv+85//FBUVFRUVSVM0JCRk0aJF6KEgAUyjIDqbzTZx4sTq6urU1FRpptGSkpLCwsJRo0bp9frAwEAJKkJ/hmkURLdr167q6upp06YVFBT4+vpKUNHhcMyaNaukpGT37t1bt26VoCL0Z5hGQVy1tbWRkZFWq/XcuXMPPvigZHW///77+Pj4gICAioqKMWPGSFYX+iHcqQdxbdy40Wq1Llu2TMoeSkQPPPDA0qVLbTZbVlaWlHWhH8I0CiIqLi6Oi4tjNRLW1tZGRETYbLZz584lJCRIXB36D0yjIBaHw5Genu50OjMzM5mcVo8aNUqr1TqdzvT0dIfDIX0A6CcwjYJY9u/fv3btWra3y7seEti/fz+/qTOA4NBGQRStra0RERENDQ1HjhxZvnw5wyRHjhxZsWLFiBEjjEYj/4oRAGHhpB5EsX379oaGhjlz5rhsoiy95cuXJyQk3LhxIycnh20S8FaYRkF4165d499j/MMPP8ycOZN1HLp06VJMTIyfn195eTn/+mUAAWEaBeFpNBqO455++um+0EOJaNq0aWvWrGlvb9+4cSPrLOCFMI2CwL788stHH31UoVAYDIaRI0eyjvM/N27cUCqVzc3NRUVFycnJrOOAV8E0CkLq6Ojgd6jbsmVL3+mhRDRixAj+OXyNRmO321nHAa+CNgpC2rt3b3l5+YQJE9LT01lncaXRaJRKZUVFxXvvvcc6C3gVnNSDYJqampRKZWNjY2Fh4cKFC1nHuYPCwsLU1NTg4GCj0Ths2DDWccBLYBoFwbz22muNjY1JSUl9s4cSUUpKSnJyssVieeONN1hnAe+BaRSEodPpoqOjiejixYuTJ09mHedPVVRUREdHOxyOS5cu9eWc4EEwjYIw+Fctvfjii328N02cOHHdunWdnZ1qtZp1FvASmEZBAJ9++ukTTzwRHBx89erVoUOHso7zFywWi1KpNJvNn376aWpqKus44PEwjYK72tvb+Xd/bt++ve/3UCIKDg7mt8R/5ZVXbt26xToOeDy0UXDXnj17rl69GhUVtW7dOtZZeoq/+FBVVZWfn886C3g8nNSDW0wmk1KpbGlpOXXq1Lx581jHuQtnz55NSkoKCgoyGAx4lz24A9MouGXTpk0tLS2LFi3yrB5KRImJiampqW1tbdnZ2ayzgGfDNAq9d/HixZkzZ/r5+V25ciU8PJx1nLtWVVUVFRVlt9uLi4tjY2NZxwFPhWkUeqnr5RwZGRme2EOJaPz48Wq12uFwqNVqzBPQa2ij0EtWqzU0NHTkyJGbN29mnaX3srOzR44cef/991utVtZZwFPhpB7c0tTUNGTIENYp3OIFHwHYwjQKPWIymVQqVXl5eddKQUFBfHy8FzQgu91+x4/GMBJ4FrRR6BGO43Q6nc1m61oxm816vZ5hJKF48UcDaaCNAgC4xY91APAkZWVlHMfxfzYYDGzDCMuLPxqIDbeYoEdqamrGjBmjUCh8fX35FY7j5HK52WxmG8x9XvzRQBo4qYe7cObMGcsf8vLyWMcRkhd/NBAb2igAgFvQRgEA3II2Cj0ik8luX/Tx8Ya/P1780UAauMUEAOAW/JMLAOAWtFEAALegjQIAuAVtFADALWijAABuQRsFAHDL/wG4GNjveARngwAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -142,7 +159,7 @@ "source": [ "molecule.parameterize('openff_unconstrained-1.2.0.offxml')\n", "impact = Impact(molecule)\n", - "impact.write('bnzz')" + "impact.to_file('bnzz')" ] }, { @@ -168,7 +185,7 @@ ], "source": [ "solvent = OBC2(molecule)\n", - "solvent.to_json_file('ligandParams.txt')" + "solvent.to_file('ligandParams.txt')" ] }, { @@ -225,9 +242,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -283,7 +300,7 @@ "molecule.parameterize('openff_unconstrained-1.2.0.offxml',\n", " charge_method='gasteiger')\n", "impact = Impact(molecule)\n", - "impact.write('olcz')" + "impact.to_file('olcz')" ] }, { @@ -309,7 +326,7 @@ ], "source": [ "solvent = OBC2(molecule)\n", - "solvent.to_json_file('ligandParams.txt')" + "solvent.to_file('ligandParams.txt')" ] }, { @@ -364,9 +381,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcIAAACWCAIAAADCEh9HAAAABmJLR0QA/wD/AP+gvaeTAAAZ2UlEQVR4nO3de1BTVx4H8BPCI2AERESQqGApEaGgxeITn7hMV3C0wIJWWqVD7PRBp9vZjd1py7SzXbN1rQy77UxYWrVrVzcVVkBXKBUrD8E2rrMQA4gEFSIWEIUEEwjJ2T9um9KACHncV36fv8jj3vsLmK/3nnPuORyMMQIAAGAtF6oLAAAAZoMYBQAAm0CMAgCATSBGAQDAJhCjAABgE4hRAACwCcQoAADYBGIUODWFQrFy5UrzQ5VKFRMTQ2E9gIkgRoFT02q1TU1N5od6vb6xsZHCegATQYwCAIBNXKkuAACKDQ8PZ2ZmEj8PDAxQWwxgIohR4Oy4XG58fDzxs1qtLisro7YewDgcmJoEOLOGhobNmzcPDQ0RD5VKZWRkJHwpwLRA2ygAANgEYhQ4NQ6Hw+FwdDqd+SG19QAmghgFTm3FihVarTY1NXX27NkXL16MiIiAK3owXRCjAKDm5ub+/v7AwECqCwGMBF1MwNnpdDo+n8/lcoeGhtzc3KguBzAPnI0CZ9fa2moymcLCwiBDgXUgRoGza25uRghFRERQXQhgKohR4OxaWloQxCiwAcQocHbE2ejixYupLgQwFcQocHZwUQ9sBD31wKkZjUY+nz88PDw4OMjn86kuBzASnI0Cp6ZSqfR6/fz58yFDgdUgRoFTg/4lYDuIUeDUoH8J2A5iFDg16F8CtoMYBU4NLuqB7SBGgVNrbW1FcFEPbAMxCuyGcYsVd3d3379/38/PLyAggOpaAINBjAK7YdxixdAwCuwCYhQ4L2gYBXYBK4MCe2LWYsUw2gnYBcQosCdmLVYMF/XALuCeemA3j1qsWK/X83g8amubkEAgUKvVKpUqNDSU6loAg0HbKHCsW7duhYeHHzlyhOpCLA0ODt65c4fH4y1YsIDqWgCzQYwCuyEWKx77ECEkk8k6OzuzsrJ++9vfjo6OUledpZaWFoyxUCjkcrlU1wKYDdpGgd0QixWbH5oXKw4KCsrOzj58+PCVK1e++uormgzShIZRYC9wNgocbvfu3efPnw8KCqqurl61apVCoaC6IoRgtBOwH4hRQIbVq1fL5fK4uDiVSrVq1aqioiKqK4LRTsBuIEYBSebNm1ddXb1nzx6tVpuWlrZ//36TyURJJRjjqqqq2tpahND8+fMpqQGwCQx4AmQrKCh47bXXDAbD1q1bv/zySx8fH9IOrVarjx8//ve//729vR0h5O7uvnDhwpKSEri0B7aAGAUUuHjxYlpaWm9vb3h4eElJiaOvrPV6/enTp48cOfLNN98Qp8ALFy587rnnzp8/39jY6O3t/Y9//GPbtm0OrQGwGQaACjdu3IiKikIIeXt7l5aWOugoCoVCLBb7+/sT/9o9PDzS0tJKS0tHR0cxxhqNJjU1FSHE4XByc3NNJpODygDsBjEKKKPRaJ577jmEEJfLlUgkdtzz/fv3pVJpbGys+XRhyZIlEomkt7fX4p0mk0kikbi4uCCE0tPTh4aG7FgGcBIQo4BKY1MsIyPDxhQzGo2VlZWZmZleXl5Eevr6+opEoitXrky+4dmzZ4km2qVLl3Z0dNhSA3BCEKOAemfOnCFSbNmyZTdv3rRiD7dv35ZIJOZb411cXBISEo4dO/bw4cMp7qG1tZVoovX396+qqrKiBuC0IEbBZJqamlasWGF+2N7eHh0d7YgDtbS0CIVCIsUuXLgwxa10Op1MJktISDDfhDp//nyxWGzdGeXAwEBycjJCyNXV1b6NDNNF2q8d2AXEKJhMfX29l5eX+eG1a9cc1y157969LVu2ECmWn58/+ZvlcnlOTs7s2bOJ9OTxeGlpaZWVldPqJqqoqLB4ZnR0VCwWE/sUiUTDw8PT/hj2QOavHdgO/jZgMiR/nx+bYv39/VKpdOnSpea+o9jY2Ly8vHv37k33WAcPHkQI7d69e/yF/4kTJ4jW1TVr1nR3d1v/eawFMcosMDUJeAwyJ7QnuuxjYmJeeumlgoICpVJ56tSpuXPnmkymqqqqgoKCkpKSkZERhJCfn19qauorr7xi9ap5AoHAy8vr+PHjKpWqqKgoMDDQ/FJGRsbixYu3b99eV1e3fPny4uLiuLg4+3zCxxkeHi4vLw8ICGDWOgJODm4GBY9BTGhPWLZsGQlH3Llz57fffhscHFxbW7t8+fKsrCyBQLBly5avvvrKZDJt27bt9OnTd+/elUqltqw8mpGRcenSpZCQkEuXLsXGxl6+fHnsq0uXLpXL5Rs3blSr1evXrz969Kitn+pxlErl/v3758+fv3379v/973/k/9qB9ag+HQYTo0knA4VXlz09PevWrXNzcyOGQwmFwtzc3Fu3btn3KL29vZs2bUIIeXh4fP755xavGgyGnJwc4psiEokMBoN9j44x7u/v/9vf/vb000+bv5LLli3Lz8+Hi3oGgb8NTdGkdYzaMpRKJULI19e3rq7OcUcxGAxjG2RHRkYs3iCVSt3d3RFCiYmJ/f39djmo0WisqakRiUQWQ1zlcjmm+tcOpgv+NjRFhy9Sf39/Q0PDjBkzzM8QuUZaAcSKeFu2bCHhWAUFBURWrlu3rqenx+LV2tpaovE0LCxMoVDYcqDOzk6JRLJo0SIiPc1DXMfeekDtrx1MF/xtaKq+vp7L5e7+CTGekcwC+vr6QkNDJzw7Iw3RmZ6Tk0PO4erq6oisfOKJJ5qamixe7erqeuaZZxBCfD6/uLh4ujvX6/UymSwpKcm8ZolAIBCLxSqVyk7lA8pAFxN9UdjJYDAYUlNTOzo6mpqaqJoVFJE+s7J5bun29vbxc0sHBwdXV1e/8MILWq02JSVl6vOlXrt2bf/+/QKB4De/+c2ZM2fc3NyIIa4Wd14BBqM6x8HEHnVRT86A8JdffhkhFBQUpFarSTjco6xevRohNPWbmuxCr9fv2bMHIcThcMRisdFotHhDXl4ecUaZlJQ0MDDwqP0Q06OM/f+PGOLa19fn4E8AyAYxSlMTxqhSqQwJCRl/7419EYsh83i8y5cvO/RAj0XcpDR2AHxFRcW7775LQmFSqdTV1RUhtHXr1gcPHli8Wl5ePmvWLITQU0891d7ePvYl8/Qonp6eRHrOmjVLJBJdvXrV0TUDqkCM0tSEnQyvv/46QojL5R46dMhBx62rq/Pw8EAIffbZZw46xBTdvXsXIeTr6zv2yddeew0h9Je//IWEAioqKoisFAqFzc3NFq+2tbVFRkYihPz8/CorK/FP06OEhIQQ6Un0HclkMqruKAWkgRhlkrHTyu3cudPuk2Oq1ep58+YhhN566y377tkKFy5cQAitWrVq7JMJCQkIobNnz5JTg3luaT8/v6+//tri1bFTmSxevNg8PUp4ePiBAweobQ8BZIIYZZ6ysjIbp5WbkE6nI3qiExISHDHOfLo+/fRThFBWVtbYJ4ODgxFCFtfRDjX53NImk+nAgQM8Hs/Ly8u66VEAC0CMMpJ108pNbu/evQihkJCQ8VPEU4K4feijjz4yPzMwMMDhcHg8HrEECGlMJtN7771HnGy++eabFq92dHQQf4jBwUEyqwL0AQOeGEkoFF66dGnLli19fX2JiYmFhYU27vDgwYNHjhzh8/llZWXmlYuoRYx2GrtmZ0tLC8ZYKBSah16Sg8PhvP/++6Wlpf7+/jt27LB4taWlBSEUHR09c+ZMMqsC9AExylR+fn7nzp0Ti8UjIyPZ2dn79u0jpj6yQmVl5dtvv83hcD7//HOiKZAOiHiyiFGLZ8iUlJSkUqni4+Mtnid5cCugIYhRBiNa6/75z396enoWFBRs3rz5hx9+mO5OOjo6du3aZTQac3Nz09LSHFGnFbRabVdXl4eHh7njG9EgsCY83xx/1gycDcQo4+3cubOurm7BggXEtHJyuXzq22o0mm3btvX19W3fvv3dd991XJHTRVy/h4eHj71+p2dgUXuODOgAYpQNli1bJpfL169f39XVFR8f/8UXX0xlK4xxVlaWQqGIiIg4duwYMY6KJiZMTHoGFuXnyIByNPrmAFvMmTOnoqLipZde0uv1L7744htvvGE0GiffJDc399SpU35+fqWlpd7e3uTUOUXjE9NgMKhUKhcXlyeffJK6uizdu3evr6/P29ubGG8LnBPEKHt4eHgUFhZKpVI3N7f8/PykpKQHDx486s2nT5/+4x//yOVyjx8/HhYWRmadUzH+FK+trc1gMISGhvJ4POrqskTcXTZ27D1wQhCjbCMSic6fPz937tzy8vK4uDjie26hubn5xRdfxBgfPHjw2WefJb/Ixxp/UU/PhlF6VgVIBjHKQvHx8XK5PDY2tq2tbeXKlSUlJWNf7e/vT05OHhwc3L1795tvvklVkZMwGAzt7e0W1+/0DCyi8QEaRp0cxCg7CQSC2tra3bt3azSaHTt27N+/H2OMEDIajc8//3x7e/vTTz8tlUqpLnNi7e3tBoMhJCTEvMAGomtg0TPcAckgRlmLx+N98cUXEomEw+H8+c9/zsjIGBoaeuutt8rLywMDA0tKSsaGFK1M2PdNz8CiZ1WAZLBOPZsREw9HR0fv2rVLJpPV19d3dna6ubnJZDKBQEB1dY80PpswxtevX0c0Oxt9+PBhZ2enu7u7eWEl4JzgbJT9nn322e+++y4kJOTOnTscDicnJ2f8HY20Mn60U2dnp1arDQwMJCYApYnW1laTyfTkk08SEzwDpwUx6hT4fL5eryfWw8jPzyfmoKOt8Rf19BziTs+qAPkgRtnPYDCkp6ffvXt37dq177zzzujo6KuvvpqZmanT6agubQIY49bWVjRRjNKtCZKeVQHywcUI+73yyis1NTULFy4sLi6eM2dOVFRUVlbW8ePH29vbi4qKgoKCqC7wF7q6ujQaTUBAALEQE4Get4HSsypAPjgbZbn8/PzCwkJPT8+ioqI5c+YghNLT0y9duhQSElJfX798+fLLly9TXeMvTJhN9Lx8pmdVgHwQo2xWU1Pzu9/9jphINDY21vx8TEzM999/v2nTpjt37qxfv55YCpQmJsymxYsXR0VF0eq8b3R09MaNGxwOJzw8nOpaAMUgRlnr1q1bKSkpIyMjb7/9dkZGhsWr/v7+FRUVYrF4eHg4Kytr3759BoOBkjotTNjgKJVKm5qaaDVIS6VSDQ8PL1iwgM/nU10LoBjEKDvpdLqUlJTe3t7ExMQPPvhgwve4urpKJJKCggJ3d/eCgoKEhITe3l6S6xyPKQ2O0L8EzCBGWQhjvHfv3itXrgiFwpMnT06+clF2dnZVVdXcuXOrq6s/SE9HCgVpdY6n0WgaGxsRExocmRL3gAQQoyz04Ycf/utf/5o5c2ZxcbGvr+9j379mzRq5XJ6ycePHKhVatQoVFZFQpIUrV67s27dv3rx5er3e09Pz008/NZlM5JcxddC/BH5G1ZKkwEHKy8u5XK6Li0tZWdn0ttTr8Z49GCHM4WCxGBuNjinwF9Rq9Z/+9CfzTE4cDiciIoK4KSg5OXlgYICEGqwTFxeHEKqurqa6EEA9iFFWaWlp8fHxQQgdOHDAyl1IpdjVFSOEt27FDx7YtbqfjY6OVlZWpqWlmW+jnDdvnlgsbmtrwxhfvHgxICAAIRQeHq5UKh1Ug42I33Nvby/VhQDqQYyyx8DAwJIlSxBCKSkpJpPJ+h1VVOBZszBCWCjEzc32KxBjjJVKpVgsJlISIeTu7p6UlCSTyQwGw9i33b59mxih5e3tXVJSYt8abKdWqxFCs2fPproQQAsQoyxhNBq3bt2KEIqJidFqtbbu7sYNHBWFEcJ+fvjrr+1Q3/37rUePPvPMM+bWpOjo6Ly8vEnO5jQaTWpqKnGln5uba9N/DFbp6ek5fPjwypUrNRqNxUvffPMNQmjt2rUklwToCWKUJX7/+98T50ft7e322aNGg3fswAhhLhdLJFbuxGjENTVYJMIzZjz09PT18fHx8RGJRDU1NVPZ2mQySSQSYsnS9PT0oaEhK8uYjtHR0TNnzqSkpLi7uxOJf/ToUYv3/PWvf0UIZWdnk1APoD+IUTY4deoUh8Nxc3O7cOGCPfdrMmGJBLu4YITwzp344cNpbHvrFn7/fRwaihHCCGEXF5yQcLmoSKfTTbeKs2fPEg2RS5cu7ejomO7mU3f9+vXc3NyFCxcS6eni4pKQkCCTyYaHhy3e+eqrryKEPv74Y8cVAxgEYpTxrl69Ssxj/8knnzjkAKdOYT4fI4Tj4vAPPzzmzXo9lslwUtKP/VQI4eBgLBZj286RW1tbiaFF/v7+VVVVtuxqPJ1OJ5PJEhISzKt7hoeH5+bm3rx581GbbNq0CSH0n//8x76VAIaCGGW2vr6+0NBQhBCx0qejNDbiRYvwsmV4kstqhQKLxdjf/8f09PDAaWm4tBSPjtqlhIGBgeTkZPTTzVd22adcLheJRDNnziTSk8fjpaWlVVZWTt4OW1tb6+3tjRC6fv26XcoATAcxymAjIyMbNmxACK1atUqv1zv2YH19uKsLY4zv3cPp6XjuXOzlhePi8Nmz+NYtvHTpj+mJEF6+HH/yCb5/3+4ljI6OisViIvJEItH4a+0p6u7uzsvLi46ONvd3xcbGSqXSwcHBKW7l4uLi6uq6evXqO3fuWFcDYBOIUQZ7+eWXEUJBQUFqtZq8o0ZF4cRE3NiI79zBhw9jd3d8/jyePx/7+mKRCP/3v44+/okTJ4hGjDVr1nR3d099Q/NgVTc3NyI9AwMDc3JyGhsbJ9lqZGTk3//+d3Jy8tghrnv37g0ODkYICQSC7777zubPBJgNYpSpFAqFq6srj8cj9Wt89SpGCHd2/vzMr3+NX38dKxTY2nNDq6q4SnQEBQcHT+Xjt7S0iMXiuXPnEjnI5XKJvqORkZFJtmpubp5kq97eXqKF1MPD48iRI/b6aICJIEYZ7Pz58ydPniT1kB9+iGNjf/HMZ5/hRYtIrQFjjHFvby/RoMHj8cYPSBqrv7/ffPoZGRl56NChHybtKBsYGDh27NjYHqeIiAiJRDJ+K4PBMLaRYfJQBiwGMcoMTU1NK1asMD9sb2+Pjo6moI59+/COHb945uhRPGcOBZVgbDAYcnJyzClmcR/UWHv27BGJRA0NDZPvkOhxMs8f6u3tnZmZWVlZOflWUqmUGGG6fv36np4eaz4JYDiIUWaor6/38vIyP7x27Ro108ocOoRnzvzF9fvzz+MNGyio5CfmFEtMTOzv77diD2q1WiKRhIWFWfQ4Tf1msLq6usDAQITQE0880dTUZEUNgNEgRpmBLjHa04NnzsTvvPPj/E/ffov5fDzdqaTsrba2lmjBDAsLUygUU9xqeHi4tLR07PQowcHBYrH4xo0bVtTQ1dVFzPnE5/OLioqs2ANgLohRZqivr+dyubt/QoygpKaUmhq8cCH29MQBAXjmTEyP3pXOzk7ihn0+n19cXDz5m69duyYWi4kF/og+ogmnR5kuvV6/Z88eYhIAsVhsJGWmQUAHEKPMUF9f7+7uLv3Je++9R1mMEm7exM3N5MxJOkU6ne6FF16YJMUePHgglUrXrFljvnhfsmSJRCKxb4OmVColTm+3bt36wGEzDQJagRhlBrpc1NNeXl4esWiKedZno9FYU1MjEomI0aYIIV9fX5FIJJfLHVRDRUXFrFmzEEJCobDZ3jMNAhqCryIzQIxO3blz54gUi4iIyMnJGTvVSGJi4smTJx1+xxfGN27ciIyMRAj5+fl9bZeZBgGNwVeRGRoaGmbMmGF+qFQqIUYn0dbWFhERYR4uKhAIxGKxSqUiswaNRrNjxw5i3L69JgEA9MTBGCMAWKe2tjY+Pt7f318mk23YsME8lp5MGOOPPvroD3/4g8lk2rlzZ2FhoblhAbAJrAwK2KmrqwshtG7duo0bN1KSoeinzq6SkhJvb+8TJ06sXbv29u3blFQCHApiFLATfRZATkpKqq2tXbRo0dWrV5cvX37x4kWqKwJ2BjEK2ImI0YiICKoLQQihp5566vvvv09ISOjt7f3Vr35VWFhIdUXAniBGATu1tLQg2sQoQsjPz+/cuXNvvPHGyMhIdnb2oUOHqK4I2A3EKGAho9HY1tbG4XCEQiHVtfzM1dU1Ly/vyy+/FAgEUVFRK1euNL+kUqliYmIorA3YAmIUsFBHR4derxcIBObpmuhj165dbW1tPj4+TU1N5if1en1jYyOFVQFbQIwCFqJVw+h4PB6P6hKAPblSXQAA9ke3htEJDQ8PZ2ZmEj8PDAxQWwywBcQoYCH6jHaaBJfLjY+PJ35Wq9VlZWXU1gOsBjEKWIjmF/UEV1dXkUhE/KxUKj/44ANq6wFWg7ZRwEKtra2I9jEKWANiFLDN3bt379+/7+vrGxAQQHUtj8ThcMbeokrV7arALiBGAdsQV/RLliyhupDJrFixQqvVmh9GRETAJEHMBTEK2IYRDaOATSBGAdsQo51o3k0P2ARiFLANnI0CkkGMAraBGAUkg9nvAatoNBofHx8PDw+tVkusbQeAo8HZKGCVlpYWjLFQKIQMBaSBGAWswojbQAHLQIwCVmHEpCSAZSBGAavA2SggH8QoYBXopgfkg556wB4Gg2HGjBlGo1Gr1Xp6elJdDnAWcDYK2KOtrc1gMISGhkKGAjJBjAL26Onp8fPzg4ZRQDK4qAdso9Pp4GwUkAnORgHjKRSKsYsVd3d3w2LFgEwQo4DxtFotLFYMKAQxCgAANoEl7QAbwGLFgEIQo4ANYLFiQCHoqQeM19DQsHnz5qGhIeKhUqmMjIyEf9iANNA2CgAANoEYBYwHixUDasFFPQAA2ATORgEAwCYQowAAYBOIUQAAsAnEKAAA2ARiFAAAbAIxCgAANvk/pIA2Wu3+xiUAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -438,7 +455,7 @@ "source": [ "molecule.parameterize('openff_unconstrained-1.2.0.offxml')\n", "impact = Impact(molecule)\n", - "impact.write('aniz')" + "impact.to_file('aniz')" ] }, { @@ -464,7 +481,7 @@ ], "source": [ "solvent = OBC2(molecule)\n", - "solvent.to_json_file('ligandParams.txt')" + "solvent.to_file('ligandParams.txt')" ] } ], diff --git a/peleffy/data/ligands/BIA.pdb b/peleffy/data/ligands/BIA.pdb deleted file mode 100644 index bccd685a..00000000 --- a/peleffy/data/ligands/BIA.pdb +++ /dev/null @@ -1,115 +0,0 @@ -HEADER HYDROLASE 16-AUG-14 4W52 -REMARK 4 4W52 COMPLIES WITH FORMAT V. 3.30, -REMARK 888 -REMARK 888 WRITTEN BY MAESTRO (A PRODUCT OF SCHRODINGER, LLC) -TITLE T4 LYSOZYME L99A WITH BENZENE BOUND -EXPDTA X-RAY DIFFRACTION -REMARK 2 RESOLUTION. 1.50 ANGSTROMS -REMARK 3 R VALUE : 0.165000 -REMARK 3 FREE R VALUE : 0.182000 -REMARK 200 TEMPERATURE (KELVIN) : 100.00 -REMARK 200 PH : 7.50 -REMARK 350 BIOMOLECULE: 1 -REMARK 350 APPLY THE FOLLOWING TO CHAINS: A -REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.000000 -REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.000000 -REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.000000 -CRYST1 60.350 60.350 96.610 90.00 90.00 120.00 P 32 2 1 6 -HET BNZ L 1 40 -HETNAM BNZ BENZENE -FORMUL 1 BNZ C6 H6 -MODEL 1 -HETATM 1 C1 BNZ L 1 -32.969 6.196 2.877 0.70 15.06 C -HETATM 2 C2 BNZ L 1 -32.945 7.046 3.973 0.70 12.84 C -HETATM 3 C3 BNZ L 1 -33.719 6.798 5.113 0.70 12.24 C -HETATM 4 C4 BNZ L 1 -34.540 5.680 5.143 0.70 13.09 C -HETATM 5 C5 BNZ L 1 -34.545 4.825 4.044 0.70 12.54 C -HETATM 6 C6 BNZ L 1 -33.787 5.069 2.915 0.70 14.23 C -HETATM 7 C7 BNZ L 1 -33.652 7.760 6.313 1.00 0.00 C -HETATM 8 C8 BNZ L 1 -35.417 3.555 4.060 1.00 0.00 C -HETATM 9 C9 BNZ L 1 -34.087 9.169 5.868 1.00 0.00 C -HETATM 10 C10 BNZ L 1 -35.239 2.794 2.733 1.00 0.00 C -HETATM 11 C11 BNZ L 1 -33.899 11.875 9.244 1.00 0.00 C -HETATM 12 C12 BNZ L 1 -34.313 12.347 7.988 1.00 0.00 C -HETATM 13 C13 BNZ L 1 -34.374 11.470 6.893 1.00 0.00 C -HETATM 14 C14 BNZ L 1 -34.021 10.120 7.054 1.00 0.00 C -HETATM 15 C15 BNZ L 1 -33.607 9.648 8.311 1.00 0.00 C -HETATM 16 C16 BNZ L 1 -33.546 10.525 9.406 1.00 0.00 C -HETATM 17 C17 BNZ L 1 -34.699 13.828 7.811 1.00 0.00 C -HETATM 18 C18 BNZ L 1 -33.495 14.720 8.164 1.00 0.00 C -HETATM 19 H1 BNZ L 1 -32.360 6.413 2.012 1.00 0.00 H -HETATM 20 H2 BNZ L 1 -32.318 7.925 3.961 1.00 0.00 H -HETATM 21 H3 BNZ L 1 -35.158 5.487 6.007 1.00 0.00 H -HETATM 22 H4 BNZ L 1 -33.823 4.399 2.069 1.00 0.00 H -HETATM 23 H5 BNZ L 1 -34.318 7.407 7.101 1.00 0.00 H -HETATM 24 H6 BNZ L 1 -32.631 7.799 6.692 1.00 0.00 H -HETATM 25 H7 BNZ L 1 -33.421 9.523 5.081 1.00 0.00 H -HETATM 26 H8 BNZ L 1 -35.109 9.131 5.490 1.00 0.00 H -HETATM 27 H9 BNZ L 1 -35.113 2.916 4.889 1.00 0.00 H -HETATM 28 H10 BNZ L 1 -36.463 3.834 4.181 1.00 0.00 H -HETATM 29 H11 BNZ L 1 -35.856 1.895 2.744 1.00 0.00 H -HETATM 30 H12 BNZ L 1 -35.543 3.432 1.903 1.00 0.00 H -HETATM 31 H13 BNZ L 1 -34.193 2.514 2.612 1.00 0.00 H -HETATM 32 H14 BNZ L 1 -33.851 12.565 10.104 1.00 0.00 H -HETATM 33 H15 BNZ L 1 -34.699 11.841 5.906 1.00 0.00 H -HETATM 34 H16 BNZ L 1 -33.330 8.587 8.438 1.00 0.00 H -HETATM 35 H17 BNZ L 1 -33.221 10.154 10.393 1.00 0.00 H -HETATM 36 H18 BNZ L 1 -34.991 14.006 6.776 1.00 0.00 H -HETATM 37 H19 BNZ L 1 -35.534 14.067 8.470 1.00 0.00 H -HETATM 38 H20 BNZ L 1 -33.769 15.767 8.039 1.00 0.00 H -HETATM 39 H21 BNZ L 1 -33.202 14.542 9.199 1.00 0.00 H -HETATM 40 H22 BNZ L 1 -32.660 14.481 7.506 1.00 0.00 H -CONECT 1 2 6 19 -CONECT 1 2 -CONECT 2 1 3 20 -CONECT 2 1 -CONECT 3 2 4 7 -CONECT 3 4 -CONECT 4 3 5 21 -CONECT 4 3 -CONECT 5 4 6 8 -CONECT 5 6 -CONECT 6 1 5 22 -CONECT 6 5 -CONECT 19 1 -CONECT 20 2 -CONECT 7 3 23 24 9 -CONECT 21 4 -CONECT 8 5 10 27 28 -CONECT 22 6 -CONECT 23 7 -CONECT 24 7 -CONECT 9 7 25 26 14 -CONECT 25 9 -CONECT 26 9 -CONECT 10 8 29 30 31 -CONECT 27 8 -CONECT 28 8 -CONECT 29 10 -CONECT 30 10 -CONECT 31 10 -CONECT 11 12 16 32 -CONECT 11 12 -CONECT 12 11 13 17 -CONECT 12 11 -CONECT 13 12 14 33 -CONECT 13 14 -CONECT 14 9 13 15 -CONECT 14 13 -CONECT 15 14 16 34 -CONECT 15 16 -CONECT 16 11 15 35 -CONECT 16 15 -CONECT 32 11 -CONECT 17 12 36 37 18 -CONECT 33 13 -CONECT 34 15 -CONECT 35 16 -CONECT 36 17 -CONECT 37 17 -CONECT 18 17 38 39 40 -CONECT 38 18 -CONECT 39 18 -CONECT 40 18 -ENDMDL -END diff --git a/peleffy/data/ligands/LG1.pdb b/peleffy/data/ligands/LG1.pdb deleted file mode 100644 index d017323c..00000000 --- a/peleffy/data/ligands/LG1.pdb +++ /dev/null @@ -1,79 +0,0 @@ -REMARK 4 COMPLIES WITH FORMAT V. 3.0, 1-DEC-2006 -REMARK 888 -REMARK 888 WRITTEN BY MAESTRO (A PRODUCT OF SCHRODINGER, LLC) -TITLE Structure1 -MODEL 1 -HETATM 1 C1 1 1.343 -0.053 0.228 1.00 0.00 C -HETATM 2 C2 1 0.653 1.179 0.246 1.00 0.00 C -HETATM 3 C3 1 -0.754 1.209 0.262 1.00 0.00 C -HETATM 4 C4 1 -1.487 0.006 0.269 1.00 0.00 C -HETATM 5 C5 1 -0.805 -1.228 0.249 1.00 0.00 C -HETATM 6 C6 1 0.602 -1.259 0.228 1.00 0.00 C -HETATM 7 C7 1 2.865 -0.033 0.216 1.00 0.00 C -HETATM 8 C8 1 -3.000 0.036 0.300 1.00 0.00 C -HETATM 9 C9 1 3.542 -1.414 0.188 1.00 0.00 C -HETATM 10 C10 1 7.890 -1.484 0.245 1.00 0.00 C -HETATM 11 C11 1 7.150 -2.677 0.177 1.00 0.00 C -HETATM 12 C12 1 5.741 -2.636 0.155 1.00 0.00 C -HETATM 13 C13 1 5.063 -1.399 0.196 1.00 0.00 C -HETATM 14 C14 1 5.812 -0.201 0.261 1.00 0.00 C -HETATM 15 C15 1 7.222 -0.244 0.286 1.00 0.00 C -HETATM 16 H1 1 1.209 2.107 0.242 1.00 0.00 H -HETATM 17 H2 1 -1.268 2.159 0.273 1.00 0.00 H -HETATM 18 H3 1 -1.359 -2.155 0.256 1.00 0.00 H -HETATM 19 H4 1 1.092 -2.220 0.205 1.00 0.00 H -HETATM 20 H5 1 8.969 -1.515 0.260 1.00 0.00 H -HETATM 21 H6 1 7.660 -3.628 0.143 1.00 0.00 H -HETATM 22 H7 1 5.181 -3.563 0.116 1.00 0.00 H -HETATM 23 H8 1 5.329 0.766 0.290 1.00 0.00 H -HETATM 24 H9 1 7.791 0.671 0.352 1.00 0.00 H -HETATM 25 H10 1 -3.414 -0.971 0.370 1.00 0.00 H -HETATM 26 H11 1 -3.345 0.594 1.173 1.00 0.00 H -HETATM 27 H12 1 -3.399 0.515 -0.594 1.00 0.00 H -HETATM 28 H13 1 2.940 -2.310 0.164 1.00 0.00 H -HETATM 29 H14 1 3.393 0.909 0.226 1.00 0.00 H -CONECT 1 2 6 7 -CONECT 1 2 -CONECT 2 1 3 16 -CONECT 2 1 -CONECT 3 2 4 17 -CONECT 3 4 -CONECT 4 3 5 8 -CONECT 4 3 -CONECT 5 4 6 18 -CONECT 5 6 -CONECT 6 1 5 19 -CONECT 6 5 -CONECT 7 1 9 29 -CONECT 7 9 -CONECT 16 2 -CONECT 17 3 -CONECT 8 4 25 26 27 -CONECT 18 5 -CONECT 19 6 -CONECT 9 7 13 28 -CONECT 9 7 -CONECT 10 11 15 20 -CONECT 10 11 -CONECT 11 10 12 21 -CONECT 11 10 -CONECT 12 11 13 22 -CONECT 12 13 -CONECT 13 9 12 14 -CONECT 13 12 -CONECT 14 13 15 23 -CONECT 14 15 -CONECT 15 10 14 24 -CONECT 15 14 -CONECT 20 10 -CONECT 21 11 -CONECT 22 12 -CONECT 23 14 -CONECT 24 15 -CONECT 25 8 -CONECT 26 8 -CONECT 27 8 -CONECT 28 9 -CONECT 29 7 -ENDMDL -END diff --git a/peleffy/data/ligands/MDB.pdb b/peleffy/data/ligands/MDB.pdb deleted file mode 100644 index d09364a8..00000000 --- a/peleffy/data/ligands/MDB.pdb +++ /dev/null @@ -1,77 +0,0 @@ -HEADER HYDROLASE 16-AUG-14 4W52 -REMARK 4 4W52 COMPLIES WITH FORMAT V. 3.30, -REMARK 888 -REMARK 888 WRITTEN BY MAESTRO (A PRODUCT OF SCHRODINGER, LLC) -TITLE T4 LYSOZYME L99A WITH BENZENE BOUND -EXPDTA X-RAY DIFFRACTION -REMARK 2 RESOLUTION. 1.50 ANGSTROMS -REMARK 3 R VALUE : 0.165000 -REMARK 3 FREE R VALUE : 0.182000 -REMARK 200 TEMPERATURE (KELVIN) : 100.00 -REMARK 200 PH : 7.50 -REMARK 350 BIOMOLECULE: 1 -REMARK 350 APPLY THE FOLLOWING TO CHAINS: A -REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.000000 -REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.000000 -REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.000000 -CRYST1 60.350 60.350 96.610 90.00 90.00 120.00 P 32 2 1 6 -HET BNZ L 1 24 -HETNAM BNZ BENZENE -FORMUL 1 BNZ C6 H6 -MODEL 1 -HETATM 1 C1 BNZ L 1 -32.969 6.196 2.877 0.70 15.06 C -HETATM 2 C2 BNZ L 1 -32.945 7.046 3.973 0.70 12.84 C -HETATM 3 C3 BNZ L 1 -33.719 6.798 5.113 0.70 12.24 C -HETATM 4 C4 BNZ L 1 -34.540 5.680 5.143 0.70 13.09 C -HETATM 5 C5 BNZ L 1 -34.545 4.825 4.044 0.70 12.54 C -HETATM 6 C6 BNZ L 1 -33.787 5.069 2.915 0.70 14.23 C -HETATM 7 C7 BNZ L 1 -33.652 7.760 6.313 1.00 0.00 C -HETATM 8 C8 BNZ L 1 -35.417 3.555 4.060 1.00 0.00 C -HETATM 9 C9 BNZ L 1 -34.087 9.169 5.868 1.00 0.00 C -HETATM 10 C10 BNZ L 1 -35.239 2.794 2.733 1.00 0.00 C -HETATM 11 H1 BNZ L 1 -32.360 6.413 2.012 1.00 0.00 H -HETATM 12 H2 BNZ L 1 -32.318 7.925 3.961 1.00 0.00 H -HETATM 13 H3 BNZ L 1 -35.158 5.487 6.007 1.00 0.00 H -HETATM 14 H4 BNZ L 1 -33.823 4.399 2.069 1.00 0.00 H -HETATM 15 H5 BNZ L 1 -34.318 7.407 7.101 1.00 0.00 H -HETATM 16 H6 BNZ L 1 -32.631 7.799 6.692 1.00 0.00 H -HETATM 17 H7 BNZ L 1 -34.040 9.850 6.718 1.00 0.00 H -HETATM 18 H8 BNZ L 1 -33.421 9.523 5.081 1.00 0.00 H -HETATM 19 H9 BNZ L 1 -35.109 9.131 5.490 1.00 0.00 H -HETATM 20 H10 BNZ L 1 -35.113 2.916 4.889 1.00 0.00 H -HETATM 21 H11 BNZ L 1 -36.463 3.834 4.181 1.00 0.00 H -HETATM 22 H12 BNZ L 1 -35.856 1.895 2.744 1.00 0.00 H -HETATM 23 H13 BNZ L 1 -35.543 3.432 1.903 1.00 0.00 H -HETATM 24 H14 BNZ L 1 -34.193 2.514 2.612 1.00 0.00 H -CONECT 1 2 6 11 -CONECT 1 2 -CONECT 2 1 3 12 -CONECT 2 1 -CONECT 3 2 4 7 -CONECT 3 4 -CONECT 4 3 5 13 -CONECT 4 3 -CONECT 5 4 6 8 -CONECT 5 6 -CONECT 6 1 5 14 -CONECT 6 5 -CONECT 11 1 -CONECT 12 2 -CONECT 7 3 15 16 9 -CONECT 13 4 -CONECT 8 5 10 20 21 -CONECT 14 6 -CONECT 15 7 -CONECT 16 7 -CONECT 9 7 17 18 19 -CONECT 17 9 -CONECT 18 9 -CONECT 19 9 -CONECT 10 8 22 23 24 -CONECT 20 8 -CONECT 21 8 -CONECT 22 10 -CONECT 23 10 -CONECT 24 10 -ENDMDL -END diff --git a/peleffy/data/ligands/SBN.pdb b/peleffy/data/ligands/SBN.pdb deleted file mode 100644 index 2e5993ee..00000000 --- a/peleffy/data/ligands/SBN.pdb +++ /dev/null @@ -1,113 +0,0 @@ -HEADER HYDROLASE 16-AUG-14 4W52 -REMARK 4 4W52 COMPLIES WITH FORMAT V. 3.30, -REMARK 888 -REMARK 888 WRITTEN BY MAESTRO (A PRODUCT OF SCHRODINGER, LLC) -TITLE T4 LYSOZYME L99A WITH BENZENE BOUND -EXPDTA X-RAY DIFFRACTION -REMARK 2 RESOLUTION. 1.50 ANGSTROMS -REMARK 3 R VALUE : 0.165000 -REMARK 3 FREE R VALUE : 0.182000 -REMARK 200 TEMPERATURE (KELVIN) : 100.00 -REMARK 200 PH : 7.50 -REMARK 350 BIOMOLECULE: 1 -REMARK 350 APPLY THE FOLLOWING TO CHAINS: A -REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.000000 -REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.000000 -REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.000000 -CRYST1 60.350 60.350 96.610 90.00 90.00 120.00 P 32 2 1 6 -HET BNZ L 1 38 -HETNAM BNZ BENZENE -FORMUL 1 BNZ C6 H6 -MODEL 1 -HETATM 1 C1 BNZ L 1 -33.582 6.460 2.611 0.70 15.06 C -HETATM 2 C2 BNZ L 1 -33.631 7.357 3.696 0.70 12.84 C -HETATM 3 C3 BNZ L 1 -33.786 6.873 5.012 0.70 12.24 C -HETATM 4 C4 BNZ L 1 -33.919 5.485 5.223 0.70 13.09 C -HETATM 5 C5 BNZ L 1 -33.896 4.576 4.142 0.70 12.54 C -HETATM 6 C6 BNZ L 1 -33.714 5.075 2.831 0.70 14.23 C -HETATM 7 C7 BNZ L 1 -33.872 7.783 6.160 1.00 0.00 C -HETATM 8 C8 BNZ L 1 -34.085 3.091 4.441 1.00 0.00 C -HETATM 9 C9 BNZ L 1 -33.822 9.127 6.080 1.00 0.00 C -HETATM 10 C10 BNZ L 1 -34.100 2.160 3.217 1.00 0.00 C -HETATM 11 C11 BNZ L 1 -33.933 11.924 9.346 1.00 0.00 C -HETATM 12 C12 BNZ L 1 -33.831 12.383 8.017 1.00 0.00 C -HETATM 13 C13 BNZ L 1 -33.789 11.448 6.961 1.00 0.00 C -HETATM 14 C14 BNZ L 1 -33.846 10.061 7.218 1.00 0.00 C -HETATM 15 C15 BNZ L 1 -33.964 9.616 8.554 1.00 0.00 C -HETATM 16 C16 BNZ L 1 -33.997 10.544 9.614 1.00 0.00 C -HETATM 17 C17 BNZ L 1 -33.776 13.874 7.729 1.00 0.00 C -HETATM 18 C18 BNZ L 1 -32.492 14.526 8.257 1.00 0.00 C -HETATM 19 H1 BNZ L 1 -33.446 6.838 1.609 1.00 0.00 H -HETATM 20 H2 BNZ L 1 -33.524 8.414 3.510 1.00 0.00 H -HETATM 21 H3 BNZ L 1 -34.060 5.113 6.226 1.00 0.00 H -HETATM 22 H4 BNZ L 1 -33.681 4.413 1.977 1.00 0.00 H -HETATM 23 H5 BNZ L 1 -33.298 2.771 5.124 1.00 0.00 H -HETATM 24 H6 BNZ L 1 -35.024 2.973 4.985 1.00 0.00 H -HETATM 25 H7 BNZ L 1 -34.259 1.123 3.515 1.00 0.00 H -HETATM 26 H8 BNZ L 1 -34.902 2.426 2.527 1.00 0.00 H -HETATM 27 H9 BNZ L 1 -33.154 2.202 2.677 1.00 0.00 H -HETATM 28 H10 BNZ L 1 -33.962 12.631 10.164 1.00 0.00 H -HETATM 29 H11 BNZ L 1 -33.717 11.794 5.940 1.00 0.00 H -HETATM 30 H12 BNZ L 1 -34.006 8.563 8.787 1.00 0.00 H -HETATM 31 H13 BNZ L 1 -34.070 10.196 10.634 1.00 0.00 H -HETATM 32 H14 BNZ L 1 -33.858 14.046 6.656 1.00 0.00 H -HETATM 33 H15 BNZ L 1 -34.649 14.347 8.181 1.00 0.00 H -HETATM 34 H16 BNZ L 1 -32.467 15.590 8.021 1.00 0.00 H -HETATM 35 H17 BNZ L 1 -32.408 14.428 9.339 1.00 0.00 H -HETATM 36 H18 BNZ L 1 -31.610 14.066 7.812 1.00 0.00 H -HETATM 37 H19 BNZ L 1 -33.748 9.587 5.105 1.00 0.00 H -HETATM 38 H20 BNZ L 1 -33.961 7.304 7.125 1.00 0.00 H -CONECT 1 2 6 19 -CONECT 1 2 -CONECT 2 1 3 20 -CONECT 2 1 -CONECT 3 2 4 7 -CONECT 3 4 -CONECT 4 3 5 21 -CONECT 4 3 -CONECT 5 4 6 8 -CONECT 5 6 -CONECT 6 1 5 22 -CONECT 6 5 -CONECT 19 1 -CONECT 20 2 -CONECT 7 3 9 38 -CONECT 7 9 -CONECT 21 4 -CONECT 8 5 10 23 24 -CONECT 22 6 -CONECT 9 7 14 37 -CONECT 9 7 -CONECT 10 8 25 26 27 -CONECT 23 8 -CONECT 24 8 -CONECT 25 10 -CONECT 26 10 -CONECT 27 10 -CONECT 11 12 16 28 -CONECT 11 12 -CONECT 12 11 13 17 -CONECT 12 11 -CONECT 13 12 14 29 -CONECT 13 14 -CONECT 14 9 13 15 -CONECT 14 13 -CONECT 15 14 16 30 -CONECT 15 16 -CONECT 16 11 15 31 -CONECT 16 15 -CONECT 28 11 -CONECT 17 12 32 33 18 -CONECT 29 13 -CONECT 30 15 -CONECT 31 16 -CONECT 32 17 -CONECT 33 17 -CONECT 18 17 34 35 36 -CONECT 34 18 -CONECT 35 18 -CONECT 36 18 -CONECT 37 9 -CONECT 38 7 -ENDMDL -END diff --git a/peleffy/data/ligands/BNZ.mae b/peleffy/data/ligands/benzene.mae similarity index 100% rename from peleffy/data/ligands/BNZ.mae rename to peleffy/data/ligands/benzene.mae diff --git a/peleffy/data/ligands/BNZ.pdb b/peleffy/data/ligands/benzene.pdb similarity index 100% rename from peleffy/data/ligands/BNZ.pdb rename to peleffy/data/ligands/benzene.pdb diff --git a/peleffy/data/ligands/BNZ_without_connectivity.pdb b/peleffy/data/ligands/benzene_without_connectivity.pdb similarity index 100% rename from peleffy/data/ligands/BNZ_without_connectivity.pdb rename to peleffy/data/ligands/benzene_without_connectivity.pdb diff --git a/peleffy/data/ligands/CO1.pdb b/peleffy/data/ligands/octafluorocyclobutane.pdb similarity index 100% rename from peleffy/data/ligands/CO1.pdb rename to peleffy/data/ligands/octafluorocyclobutane.pdb diff --git a/peleffy/data/ligands/OLC.pdb b/peleffy/data/ligands/oleic_acid.pdb similarity index 100% rename from peleffy/data/ligands/OLC.pdb rename to peleffy/data/ligands/oleic_acid.pdb diff --git a/peleffy/data/ligands/TOL.mae b/peleffy/data/ligands/toluene.mae similarity index 100% rename from peleffy/data/ligands/TOL.mae rename to peleffy/data/ligands/toluene.mae diff --git a/peleffy/data/ligands/TOL.pdb b/peleffy/data/ligands/toluene.pdb similarity index 100% rename from peleffy/data/ligands/TOL.pdb rename to peleffy/data/ligands/toluene.pdb diff --git a/peleffy/data/parameters/OBCparam.json b/peleffy/data/parameters/OBCparam.json new file mode 100644 index 00000000..b893c7dd --- /dev/null +++ b/peleffy/data/parameters/OBCparam.json @@ -0,0 +1,190 @@ +[ + { + "CW": [ + 1.875, + 0.72 + ], + "NC": [ + 1.7063, + 0.79 + ], + "CM": [ + 1.875, + 0.72 + ], + "C*": [ + 1.875, + 0.72 + ], + "H1": [ + 1.25, + 0.85 + ], + "CT": [ + 1.9, + 0.72 + ], + "N2": [ + 1.7063, + 0.79 + ], + "N*": [ + 1.7063, + 0.79 + ], + "CR": [ + 1.875, + 0.72 + ], + "HO": [ + 1.05, + 0.85 + ], + "NB": [ + 1.7063, + 0.79 + ], + "H2": [ + 1.25, + 0.85 + ], + "S": [ + 1.775, + 0.96 + ], + "NA": [ + 1.7063, + 0.79 + ], + "H4": [ + 1.25, + 0.85 + ], + "HC": [ + 1.25, + 0.85 + ], + "C": [ + 1.875, + 0.72 + ], + "OH": [ + 1.535, + 0.85 + ], + "CQ": [ + 1.875, + 0.72 + ], + "CK": [ + 1.875, + 0.72 + ], + "O2": [ + 1.48, + 0.85 + ], + "OS": [ + 1.535, + 0.85 + ], + "SH": [ + 1.775, + 0.96 + ], + "HA": [ + 1.25, + 0.85 + ], + "CB": [ + 1.875, + 0.72 + ], + "H5": [ + 1.25, + 0.85 + ], + "CN": [ + 1.875, + 0.72 + ], + "P": [ + 1.87, + 0.86 + ], + "N3": [ + 1.625, + 0.79 + ], + "HP": [ + 1.25, + 0.85 + ], + "N": [ + 1.7063, + 0.79 + ], + "H": [ + 1.15, + 0.85 + ], + "HS": [ + 1.25, + 0.85 + ], + "CV": [ + 1.875, + 0.72 + ], + "CA": [ + 1.875, + 0.72 + ], + "O": [ + 1.48, + 0.85 + ], + "CC": [ + 1.875, + 0.72 + ] + }, + { + "H": 1.25, + "LI": 1.432, + "C": 1.90, + "N": 1.7063, + "O": 1.535, + "F": 1.47, + "FE": 2.00, + "NE": 1.39, + "NA": 1.992, + "MG": 1.70, + "SI": 1.80, + "P": 1.87, + "S": 1.775, + "CL": 1.735, + "AR": 1.70, + "K": 2.123, + "CA": 1.817, + "BR": 1.90, + "KR": 1.812, + "RB": 2.26, + "I": 2.10, + "XE": 1.967, + "CS": 2.507, + "BA": 2.188, + "PT": 2.0 + }, + { + "H": 0.85, + "C": 0.72, + "N": 0.79, + "O": 0.85, + "F": 0.88, + "P": 0.86, + "S": 0.96, + "PT": 0.80, + "FE": 0.88 + } +] diff --git a/peleffy/data/tests/etlz_OBCParams.txt b/peleffy/data/tests/etlz_OBCParams.txt new file mode 100644 index 00000000..2a86f8d7 --- /dev/null +++ b/peleffy/data/tests/etlz_OBCParams.txt @@ -0,0 +1,6 @@ +LIGZ C1 CM 1.875 0.72 +LIGZ C2 CM 1.875 0.72 +LIGZ H1 HC 1.25 0.85 +LIGZ H2 HC 1.25 0.85 +LIGZ H3 HC 1.25 0.85 +LIGZ H4 HC 1.25 0.85 diff --git a/peleffy/data/tests/malz_OBCParams.txt b/peleffy/data/tests/malz_OBCParams.txt new file mode 100644 index 00000000..26443a5c --- /dev/null +++ b/peleffy/data/tests/malz_OBCParams.txt @@ -0,0 +1,10 @@ +UNLZ H1 HC 1.25 0.85 +UNLZ C2 CT 1.9 0.72 +UNLZ H2 HC 1.25 0.85 +UNLZ C1 CO3 1.875 0.72 +UNLZ O1 O2Z 1.48 0.85 +UNLZ O2 O2Z 1.48 0.85 +UNLZ C3 C 1.875 0.72 +UNLZ O3 OH 1.535 0.85 +UNLZ O4 O 1.48 0.85 +UNLZ H3 HO 1.05 0.85 diff --git a/peleffy/data/tests/metz_OBCParams.txt b/peleffy/data/tests/metz_OBCParams.txt new file mode 100644 index 00000000..72c51793 --- /dev/null +++ b/peleffy/data/tests/metz_OBCParams.txt @@ -0,0 +1,5 @@ +LIGZ C1 CT 1.9 0.72 +LIGZ H1 HC 1.25 0.85 +LIGZ H2 HC 1.25 0.85 +LIGZ H3 HC 1.25 0.85 +LIGZ H4 HC 1.25 0.85 diff --git a/peleffy/forcefield/parameters.py b/peleffy/forcefield/parameters.py index fd6c0184..a8a4b011 100644 --- a/peleffy/forcefield/parameters.py +++ b/peleffy/forcefield/parameters.py @@ -11,6 +11,7 @@ from collections import defaultdict from peleffy.utils import get_data_file_path +from peleffy.utils import Logger class BaseParameterWrapper(dict): @@ -512,6 +513,7 @@ def from_ffld_output(molecule, ffld_output): """ from simtk import unit + from peleffy.utils.toolkits import RDKitToolkitWrapper params = defaultdict(list) @@ -669,9 +671,23 @@ def from_ffld_output(molecule, ffld_output): }) opls_parameters_wrapper = OPLS2005ParameterWrapper(params) - OPLS2005ParameterWrapper._add_solvent_parameters( + OPLS2005ParameterWrapper._add_SGBNP_solvent_parameters( opls_parameters_wrapper) + # Employ RDKit to extract atom degree and parent type lists + wrapper = RDKitToolkitWrapper() + atom_names = wrapper.get_atom_names(molecule) + degree_by_name = dict(zip(atom_names, + wrapper.get_atom_degrees(molecule))) + parent_by_name = dict(zip(atom_names, + wrapper.get_hydrogen_parents(molecule))) + element_by_name = dict(zip(atom_names, + wrapper.get_elements(molecule))) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters( + opls_parameters_wrapper, degree_by_name, + parent_by_name, element_by_name) + return opls_parameters_wrapper @staticmethod @@ -722,9 +738,11 @@ def _find_similar_atom_types(atom_type, tried): return new_atom_type @staticmethod - def _add_solvent_parameters(OPLS_params): + def _add_SGBNP_solvent_parameters(OPLS_params): """ - It add the solvent parameters to the OPLS parameters collection. + It adds the SGBNP solvent parameters (used in the SGBNP solvent + implemented in the OPLS2005 of PELE) to the OPLS parameters + collection. Parameters ---------- @@ -784,6 +802,165 @@ def _add_solvent_parameters(OPLS_params): for label, params in parameters_to_add.items(): OPLS_params.add_parameters(label, params) + @staticmethod + def _add_GBSA_solvent_parameters(OPLS_params, degree_by_name, + parent_by_name, + element_by_name): + """ + It adds the GBSA solvent parameters (used in the OBC solvent + implemented in the OPLS2005 of PELE) to the OPLS parameters + collection. + + Parameters + ---------- + OPLS_params : an OPLS2005ParameterWrapper object + The set of lists of parameters grouped by parameter type. + Thus, the dictionary has the following keys: atom_names, + atom_types, charges, sigmas, and epsilons. The following + solvent parameters will be added to the collection: SGB_radii, + vdW_radii, gammas, alphas + degree_by_name : dict + The dictionary containing the number of bonds for + each atom_name + parent_by_name : dict + The dictionary containing the element of the parent + for hydrogen atoms, keyed by atom name of the child + element_by_name : dict + The dictionary containing the atom elements keyed by + atom name + """ + import re + import json + + def _check_bonds(scale, atom_type, degree, parent): + """ + It checks the number of bonds and the parent atom for + terminal H. Besides, in some especified cases it updates + the scale factor. + + Parameters + ---------- + scale : str + The scale factor of the current atom + atom_type : str + The atom type of the current atom + degree : int + The number of bonds of the current atom + parent : str + The element belonging to the parent atom, in case that the + current atom is a hydrogen atom + """ + + if atom_type == 'H' and parent == 'O': + scale = float(1.05) + if atom_type == 'H' and parent == 'N': + scale = float(1.15) + if atom_type == 'C' and degree == 3: + scale = float(1.875) + if atom_type == 'C' and degree == 2: + scale = float(1.825) + if atom_type == 'N' and degree == 4: + scale = float(1.625) + if atom_type == 'N' and degree == 1: + scale = float(1.60) + if atom_type == 'O' and degree == 1: + scale = float(1.48) + + return scale + + def _find_GBSA_parameters_according_to(atom_name, atom_type, + degree, element, parent): + """ + It computes the HTC radii and the Overlap factor for Heteroatoms. + The parameters have been extracted from Tinker Molecular package. If + one parameter has not been defined in the OBC templates it puts the + default parameter and raises a warning. + + Parameters + ---------- + atom_name : str + Atom name + atom_type : str + Atom type + degree : str + Number of bonds + element : str + The element the atom belongs to + parent : str + The element of the atom's parent (if the atom is a hydrogen) + + Returns + ------- + radius : str + HCT radii + scale : str + Overlap factor + """ + + PARAMS_PATH = get_data_file_path('parameters/OBCparam.json') + + # Get rid of terminal white spaces + atom_name = atom_name.strip() + atom_type = atom_type.strip() + + # Load the dictioaries with the OBC parameters + with open(PARAMS_PATH) as fd: + params_by_type, scale_by_element, \ + radius_by_element = json.load(fd) + + # Assign scale factor and HCT radius using the atom type + if atom_type in params_by_type: + scale, radius = params_by_type[atom_type] + + # Assign scale factor and HCT radius using the atom element + else: + found = True + + # Assign scale factor + if element.upper() in scale_by_element: + scale = scale_by_element[element.upper()] + scale = _check_bonds(scale, element.upper(), + degree, parent) + else: + found = False + + # Assign scale factor + if element.upper() in radius_by_element: + radius = radius_by_element[element.upper()] + else: + found = False + + # Returns scale and HCT radius if found, otherwise it raises a + # warning and returns the default parameters + if not found: + log = Logger() + log.warning('Warning: OBC parameters for ' + + '{} {} '.format(atom_name, atom_type) + + 'NOT found in the template ' + + 'database. Using default parameters') + radius, scale = float(0.80), float(2.0) + + return radius, scale + + # Loop over atom types and names: + radii = list() + scales = list() + for atom_name, atom_type in zip(OPLS_params['atom_names'], + OPLS_params['atom_types']): + atom_name = re.sub('_', ' ', atom_name) + radius, scale = _find_GBSA_parameters_according_to( + atom_name, atom_type, + degree_by_name.get(atom_name), + element_by_name.get(atom_name), + parent_by_name.get(atom_name)) + + radii.append(radius) + scales.append(scale) + + # Assign OBC parameters + OPLS_params['GBSA_radii'] = radii + OPLS_params['GBSA_scales'] = scales + class OpenFFOPLS2005ParameterWrapper(BaseParameterWrapper): """ diff --git a/peleffy/main.py b/peleffy/main.py index d096c047..b9752f1b 100644 --- a/peleffy/main.py +++ b/peleffy/main.py @@ -154,11 +154,11 @@ def run_peleffy(pdb_file, forcefield=DEFAULT_OFF_FORCEFIELD, molecule.parameterize(forcefield, charge_method=charge_method) impact = Impact(molecule) - impact.write(output_handler.get_impact_template_path()) + impact.to_file(output_handler.get_impact_template_path()) if with_solvent: solvent = OBC2(molecule) - solvent.to_json_file(output_handler.get_solvent_template_path()) + solvent.to_file(output_handler.get_solvent_template_path()) log.info(' - All files were generated successfully') log.info('-' * 60) diff --git a/peleffy/solvent/solvent.py b/peleffy/solvent/solvent.py index c3d6aefb..af0da80c 100644 --- a/peleffy/solvent/solvent.py +++ b/peleffy/solvent/solvent.py @@ -5,7 +5,7 @@ from simtk import unit -from peleffy.utils import get_data_file_path, warning_on_one_line +from peleffy.utils import get_data_file_path from peleffy.utils import Logger @@ -15,6 +15,7 @@ class _SolventWrapper(object): """ _ff_file = None _name = None + _compatibility = None def __init__(self, molecule): """ @@ -23,27 +24,90 @@ def __init__(self, molecule): Parameters ---------- molecule : An peleffy.topology.Molecule - A Molecule object to be written as an Impact file + A Molecule object whose solvent template will be generated. + Molecule must be previously parameterized """ + # Check that input molecule is parameterized + molecule.assert_parameterized() + + logger = Logger() + logger.info(' - Loading solvent parameters') + self._molecule = molecule - self._radii = dict.fromkeys([tuple((idx, )) - for idx in range(0, len(molecule.atoms))], - unit.Quantity()) - self._scales = dict.fromkeys([tuple((idx, )) - for idx in range(0, len(molecule.atoms))], - unit.Quantity()) - self._solvent_dielectric = float(0) - self._solute_dielectric = float(0) - self._surface_area_penalty = float(0) - self._solvent_radius = float(0) - self._initialize_from_molecule() + self._radii = dict.fromkeys( + [tuple((idx, )) for idx in range(0, len(molecule.atoms))], + unit.Quantity()) + self._scales = dict.fromkeys( + [tuple((idx, )) for idx in range(0, len(molecule.atoms))], + unit.Quantity()) - def _initialize_from_molecule(self): + @property + def name(self): + """ + The name of the solvent. + + Returns + ------- + name : str + The name of this solvent object. """ - Initializes a SolventWrapper object using an peleffy's Molecule. + return self._name + + @property + def molecule(self): """ - logger = Logger() - logger.info(' - Loading solvent parameters') + The peleffy's Molecule to parameterize. + + Returns + ------- + molecule : an peleffy.topology.Molecule + The peleffy's Molecule object + """ + return self._molecule + + @property + def radii(self): + """ + The dict of radii of the parameterized molecule. + + Returns + ------- + radii : dict[atom indexes: simtk.unit.Quantity] + The radius assigned to each atom of the molecule + """ + return self._radii + + @property + def scales(self): + """ + The dict of scales of the parameterized molecule. + + Returns + ------- + scales : dict[atom indexes: simtk.unit.Quantity] + The scale assigned to each atom of the molecule + """ + return self._scales + + +class _OpenFFCompatibleSolvent(_SolventWrapper): + """ + Implementation of a solvent-template generator compatible with + PELE's OpenFF implementation. + """ + + _compatibility = 'openff' + + def __init__(self, molecule): + """ + It initializes an OpenFFCompatibleSolvent. + + Parameters + ---------- + molecule : An peleffy.topology.Molecule + A Molecule object whose solvent template will be generated + """ + super().__init__(molecule) from peleffy.utils.toolkits import OpenForceFieldToolkitWrapper @@ -56,6 +120,14 @@ def _initialize_from_molecule(self): self._surface_area_penalty = GBSA_handler.surface_area_penalty self._solvent_radius = GBSA_handler.solvent_radius + self._initialize_from_molecule() + + def _initialize_from_molecule(self): + """ + Initializes a OpenFFCompatibleSolvent object using an peleffy's + Molecule. + """ + from peleffy.forcefield import OpenForceField forcefield = OpenForceField(self._ff_file) @@ -66,7 +138,7 @@ def _initialize_from_molecule(self): def to_dict(self): """ - Returns this SolventWrapper object as a dictionary. + Returns this OpenFFCompatibleSolvent object as a dictionary. Returns ------- @@ -101,67 +173,19 @@ def to_dict(self): return data - def to_json_file(self, path): + def to_file(self, path): """ - Writes this SolventWrapper object to a json file. + Writes this OpenFFCompatibleSolvent object to a file. Parameters ---------- path : str - Path to save the json file to + Path to save the output file to """ import json with open(path, 'w') as file: json.dump(self.to_dict(), file, indent=4) - @property - def name(self): - """ - The name of the solvent. - - Returns - ------- - name : str - The name of this solvent object. - """ - return self._name - - @property - def molecule(self): - """ - The peleffy's Molecule to parameterize. - - Returns - ------- - molecule : an peleffy.topology.Molecule - The peleffy's Molecule object - """ - return self._molecule - - @property - def radii(self): - """ - The dict of radii of the parameterized molecule. - - Returns - ------- - radii : dict[atom indexes: simtk.unit.Quantity] - The radius assigned to each atom of the molecule - """ - return self._radii - - @property - def scales(self): - """ - The dict of scales of the parameterized molecule. - - Returns - ------- - scales : dict[atom indexes: simtk.unit.Quantity] - The scale assigned to each atom of the molecule - """ - return self._scales - @property def solvent_dielectric(self): """ @@ -211,7 +235,44 @@ def solvent_radius(self): return self._solvent_radius -class OBC1(_SolventWrapper): +class _OPLS2005CompatibleSolvent(_SolventWrapper): + """ + Implementation of a solvent-template generator compatible with + PELE's OPLS2005 implementation. + """ + + _compatibility = 'opls2005' + + def __init__(self, molecule): + """ + It initializes an OPLS2005CompatibleSolvent. + + Parameters + ---------- + molecule : An peleffy.topology.Molecule + A Molecule object whose solvent template will be generated + """ + super().__init__(molecule) + + self._radii = molecule.parameters['GBSA_radii'] + self._scales = molecule.parameters['GBSA_scales'] + + def to_file(self, path): + """ + Writes this OPLS2005CompatibleSolvent object to a file. + + Parameters + ---------- + path : str + Path to save the output file to + """ + + raise NotImplementedError('A solvent template compatible with ' + + 'PELE\'s OPLS2005 force field cannot ' + + 'be generated yet') + + +class OBC1(_OpenFFCompatibleSolvent): """ Implementation of the OBC1 solvent. """ @@ -226,23 +287,16 @@ def __init__(self, molecule): Parameters ---------- molecule : An peleffy.topology.Molecule - A Molecule object to be written as an Impact file + A Molecule object whose solvent template will be generated """ # Not implemented in PELE - import warnings - warnings.formatwarning = warning_on_one_line - warnings.warn("OBC1 is not implemented in PELE", Warning) + logger = Logger() + logger.warning('OBC1 is not implemented in PELE') super().__init__(molecule) - def _initialize_from_molecule(self): - """ - Initializes the OBC1 solvent using an peleffy's Molecule. - """ - super()._initialize_from_molecule() - -class OBC2(_SolventWrapper): +class OBC2(_OpenFFCompatibleSolvent): """ Implementation of the OBC2 solvent. """ @@ -257,7 +311,7 @@ def __init__(self, molecule): Parameters ---------- molecule : An peleffy.topology.Molecule - A Molecule object to be written as an Impact file + A Molecule object whose solvent template will be generated Examples -------- @@ -269,13 +323,45 @@ def __init__(self, molecule): >>> molecule = Molecule('molecule.pdb') >>> solvent = OBC2(molecule) - >>> solvent.to_json_file('molecule_solv.json') + >>> solvent.to_file('OBC_parameters.txt') + + """ + super().__init__(molecule) + + +class OPLSOBC(_OPLS2005CompatibleSolvent): + """ + It defines a template generator for OBC compatible with the OPLS2005 + force field implemented in PELE. + """ + _name = 'OBC' + + def __init__(self, molecule): + """ + Initializes an OPLSOBC object. + + Parameters + ---------- + molecule : An peleffy.topology.Molecule + A Molecule object whose solvent template will be generated + + Examples + -------- + + Generate the solvent parameters of a molecule + + >>> from peleffy.topology import Molecule + >>> from peleffy.solvent import OPLSOBC + + >>> molecule = Molecule('molecule.pdb') + >>> solvent = OPLSOBC(molecule) + >>> solvent.to_file('OBC_parameters.txt') """ super().__init__(molecule) def _initialize_from_molecule(self): """ - Initializes the OBC2 solvent using an peleffy's Molecule. + Initializes the OPLSOBC solvent using an peleffy's Molecule. """ super()._initialize_from_molecule() diff --git a/peleffy/template/impact.py b/peleffy/template/impact.py index 9fbd0b88..cd42469f 100644 --- a/peleffy/template/impact.py +++ b/peleffy/template/impact.py @@ -104,7 +104,7 @@ def _sort(self): improper.set_atom3_idx(reindexer[improper.atom3_idx]) improper.set_atom4_idx(reindexer[improper.atom4_idx]) - def write(self, path): + def to_file(self, path): """ It writes the Impact template to a file. diff --git a/peleffy/tests/test_forcefields.py b/peleffy/tests/test_forcefields.py index 27e47ee9..403d68d0 100644 --- a/peleffy/tests/test_forcefields.py +++ b/peleffy/tests/test_forcefields.py @@ -241,64 +241,6 @@ def test_parameterizer(self): expected_propers=expected_propers, expected_impropers=expected_impropers) - def test_add_solvent_parameters(self): - """ - It tests the function that adds the solvent parameters to - the OPLSParameters collection. - """ - - from simtk import unit - from peleffy.forcefield import OPLS2005ParameterWrapper - - # Using a standard atom type - params1 = OPLS2005ParameterWrapper( - {'atom_names': [' C1 ', ' H1 ', ' H2 ', ' H3 ', ' H4 '], - 'atom_types': ['CT', 'HC', 'HC', 'HC', 'HC'], - 'charges': [-0.24, 0.06, 0.06, 0.06, 0.06], - 'sigmas': [3.5, 2.5, 2.5, 2.5, 2.5], - 'epsilons': [0.066, 0.03, 0.03, 0.03, 0.03]}) - - # Using a similar atom type - params2 = OPLS2005ParameterWrapper( - {'atom_names': [' C1 ', ' H1 ', ' H2 ', ' H3 ', ' H4 '], - 'atom_types': ['C3M', 'HC', 'HC', 'HC', 'HC'], - 'charges': [-0.24, 0.06, 0.06, 0.06, 0.06], - 'sigmas': [3.5, 2.5, 2.5, 2.5, 2.5], - 'epsilons': [0.066, 0.03, 0.03, 0.03, 0.03]}) - - # Using a default atom type - params3 = OPLS2005ParameterWrapper( - {'atom_names': [' C1 ', ' H1 ', ' H2 ', ' H3 ', ' H4 '], - 'atom_types': ['XX', 'HC', 'HC', 'HC', 'HC'], - 'charges': [-0.24, 0.06, 0.06, 0.06, 0.06], - 'sigmas': [3.5, 2.5, 2.5, 2.5, 2.5], - 'epsilons': [0.066, 0.03, 0.03, 0.03, 0.03]}) - - OPLS2005ParameterWrapper._add_solvent_parameters(params1) - OPLS2005ParameterWrapper._add_solvent_parameters(params2) - OPLS2005ParameterWrapper._add_solvent_parameters(params3) - - assert params1['SGB_radii'][0] == \ - unit.Quantity(1.975, unit.angstrom), 'Unexpected SGB radius' - assert params1['vdW_radii'][0] == \ - unit.Quantity(1.750, unit.angstrom), 'Unexpected vdW radius' - assert params1['gammas'][0] == 0.005000000, 'Unexpected gamma' - assert params1['alphas'][0] == -0.741685710, 'Unexpected alpha' - - assert params2['SGB_radii'][0] == \ - unit.Quantity(2.002, unit.angstrom), 'Unexpected SGB radius' - assert params2['vdW_radii'][0] == \ - unit.Quantity(1.775, unit.angstrom), 'Unexpected vdW radius' - assert params2['gammas'][0] == 0.023028004, 'Unexpected gamma' - assert params2['alphas'][0] == -0.852763146, 'Unexpected alpha' - - assert params3['SGB_radii'][0] == \ - unit.Quantity(1.500, unit.angstrom), 'Unexpected SGB radius' - assert params3['vdW_radii'][0] == \ - unit.Quantity(1.250, unit.angstrom), 'Unexpected vdW radius' - assert params3['gammas'][0] == 0.005000000, 'Unexpected gamma' - assert params3['alphas'][0] == 0.000000000, 'Unexpected alpha' - class TestOpenFFOPLS2005ForceField(object): """ diff --git a/peleffy/tests/test_main.py b/peleffy/tests/test_main.py index df0ee39f..46ad1cc7 100644 --- a/peleffy/tests/test_main.py +++ b/peleffy/tests/test_main.py @@ -22,7 +22,7 @@ def test_peleffy_default_call(self): """ from peleffy.main import run_peleffy - LIGAND_PATH = 'ligands/BNZ.pdb' + LIGAND_PATH = 'ligands/benzene.pdb' ligand_path = get_data_file_path(LIGAND_PATH) with tempfile.TemporaryDirectory() as tmpdir: @@ -35,7 +35,7 @@ def test_peleffy_custom_call(self): """ from peleffy.main import run_peleffy - LIGAND_PATH = 'ligands/BNZ.pdb' + LIGAND_PATH = 'ligands/benzene.pdb' ligand_path = get_data_file_path(LIGAND_PATH) with tempfile.TemporaryDirectory() as tmpdir: @@ -60,7 +60,7 @@ def test_peleffy_argparse(self): assert pytest_wrapped_e.value.code == 2 # Test defaults - parsed_args = parse_args(['BNZ.pdb']) + parsed_args = parse_args(['benzene.pdb']) assert parsed_args.as_datalocal is False, \ 'Unexpected as_datalocal settings were parsed' @@ -74,7 +74,7 @@ def test_peleffy_argparse(self): 'Unexpected include_terminal_rotamers settings were parsed' assert parsed_args.output is None, \ 'Unexpected output settings were parsed' - assert parsed_args.pdb_file == 'BNZ.pdb', \ + assert parsed_args.pdb_file == 'benzene.pdb', \ 'Unexpected pdb_file settings were parsed' assert parsed_args.resolution == 30, \ 'Unexpected resolution settings were parsed' @@ -84,7 +84,7 @@ def test_peleffy_argparse(self): 'Unexpected with_solvent settings were parsed' # Test custom shorts - parsed_args = parse_args(['TOL.pdb', + parsed_args = parse_args(['toluene.pdb', '-f', 'openff_unconstrained-1.0.0.offxml', '-r', '60', '-o', 'my_custom_output', @@ -102,7 +102,7 @@ def test_peleffy_argparse(self): 'Unexpected include_terminal_rotamers settings were parsed' assert parsed_args.output == 'my_custom_output', \ 'Unexpected output settings were parsed' - assert parsed_args.pdb_file == 'TOL.pdb', \ + assert parsed_args.pdb_file == 'toluene.pdb', \ 'Unexpected pdb_file settings were parsed' assert parsed_args.resolution == 60, \ 'Unexpected resolution settings were parsed' @@ -112,7 +112,7 @@ def test_peleffy_argparse(self): 'Unexpected with_solvent settings were parsed' # Test custom longs - parsed_args = parse_args(['MET.pdb', + parsed_args = parse_args(['methane.pdb', '--forcefield', 'openff_unconstrained-1.0.1.offxml', '--resolution', '120', @@ -131,7 +131,7 @@ def test_peleffy_argparse(self): 'Unexpected include_terminal_rotamers settings were parsed' assert parsed_args.output == 'my_custom_output2', \ 'Unexpected output settings were parsed' - assert parsed_args.pdb_file == 'MET.pdb', \ + assert parsed_args.pdb_file == 'methane.pdb', \ 'Unexpected pdb_file settings were parsed' assert parsed_args.resolution == 120, \ 'Unexpected resolution settings were parsed' @@ -142,13 +142,13 @@ def test_peleffy_argparse(self): # Test unexpected charge method with pytest.raises(SystemExit) as pytest_wrapped_e: - parsed_args = parse_args(['TOL.pdb', '-c', 'unexpected']) + parsed_args = parse_args(['toluene.pdb', '-c', 'unexpected']) assert pytest_wrapped_e.type == SystemExit assert pytest_wrapped_e.value.code == 2 # Test as_datalocal argument - parsed_args = parse_args(['MET.pdb', + parsed_args = parse_args(['methane.pdb', '--as_datalocal']) assert parsed_args.as_datalocal is True, \ @@ -163,7 +163,7 @@ def test_peleffy_argparse(self): 'Unexpected include_terminal_rotamers settings were parsed' assert parsed_args.output is None, \ 'Unexpected output settings were parsed' - assert parsed_args.pdb_file == 'MET.pdb', \ + assert parsed_args.pdb_file == 'methane.pdb', \ 'Unexpected pdb_file settings were parsed' assert parsed_args.resolution == 30, \ 'Unexpected resolution settings were parsed' @@ -173,7 +173,7 @@ def test_peleffy_argparse(self): 'Unexpected with_solvent settings were parsed' # Test include_terminal_rotamers argument - parsed_args = parse_args(['MET.pdb', + parsed_args = parse_args(['methane.pdb', '--include_terminal_rotamers']) assert parsed_args.as_datalocal is False, \ @@ -188,7 +188,7 @@ def test_peleffy_argparse(self): 'Unexpected include_terminal_rotamers settings were parsed' assert parsed_args.output is None, \ 'Unexpected output settings were parsed' - assert parsed_args.pdb_file == 'MET.pdb', \ + assert parsed_args.pdb_file == 'methane.pdb', \ 'Unexpected pdb_file settings were parsed' assert parsed_args.resolution == 30, \ 'Unexpected resolution settings were parsed' @@ -198,7 +198,7 @@ def test_peleffy_argparse(self): 'Unexpected with_solvent settings were parsed' # Test silent argument - parsed_args = parse_args(['MET.pdb', + parsed_args = parse_args(['methane.pdb', '-s']) assert parsed_args.as_datalocal is False, \ @@ -213,7 +213,7 @@ def test_peleffy_argparse(self): 'Unexpected include_terminal_rotamers settings were parsed' assert parsed_args.output is None, \ 'Unexpected output settings were parsed' - assert parsed_args.pdb_file == 'MET.pdb', \ + assert parsed_args.pdb_file == 'methane.pdb', \ 'Unexpected pdb_file settings were parsed' assert parsed_args.resolution == 30, \ 'Unexpected resolution settings were parsed' @@ -222,10 +222,11 @@ def test_peleffy_argparse(self): assert parsed_args.with_solvent is False, \ 'Unexpected with_solvent settings were parsed' - parse_args(['MET.pdb', '-s']) == parse_args(['MET.pdb', '--silent']) + parse_args(['methane.pdb', '-s']) == parse_args(['methane.pdb', + '--silent']) # Test debug argument - parsed_args = parse_args(['MET.pdb', + parsed_args = parse_args(['methane.pdb', '-d']) assert parsed_args.as_datalocal is False, \ @@ -240,7 +241,7 @@ def test_peleffy_argparse(self): 'Unexpected include_terminal_rotamers settings were parsed' assert parsed_args.output is None, \ 'Unexpected output settings were parsed' - assert parsed_args.pdb_file == 'MET.pdb', \ + assert parsed_args.pdb_file == 'methane.pdb', \ 'Unexpected pdb_file settings were parsed' assert parsed_args.resolution == 30, \ 'Unexpected resolution settings were parsed' @@ -249,7 +250,8 @@ def test_peleffy_argparse(self): assert parsed_args.with_solvent is False, \ 'Unexpected with_solvent settings were parsed' - parse_args(['MET.pdb', '-d']) == parse_args(['MET.pdb', '--debug']) + parse_args(['methane.pdb', '-d']) == parse_args(['methane.pdb', + '--debug']) def test_peleffy_main(self): """It checks the main function of peleffy.""" @@ -257,28 +259,30 @@ def test_peleffy_main(self): from peleffy.utils import Logger import logging - ligand_path = get_data_file_path('ligands/BNZ.pdb') + ligand_path = get_data_file_path('ligands/benzene.pdb') - # Test default settings - args = parse_args([ligand_path]) - main(args) + with tempfile.TemporaryDirectory() as tmpdir: + with temporary_cd(tmpdir): + # Test default settings + args = parse_args([ligand_path]) + main(args) - logger = Logger() - for handler in logger._logger.handlers: - assert handler.level == logging.INFO + logger = Logger() + for handler in logger._logger.handlers: + assert handler.level == logging.INFO - # Test silent settings - args = parse_args([ligand_path, '--silent']) - main(args) + # Test silent settings + args = parse_args([ligand_path, '--silent']) + main(args) - logger = Logger() - for handler in logger._logger.handlers: - assert handler.level == logging.CRITICAL + logger = Logger() + for handler in logger._logger.handlers: + assert handler.level == logging.CRITICAL - # Test silent settings - args = parse_args([ligand_path, '--debug']) - main(args) + # Test silent settings + args = parse_args([ligand_path, '--debug']) + main(args) - logger = Logger() - for handler in logger._logger.handlers: - assert handler.level == logging.DEBUG + logger = Logger() + for handler in logger._logger.handlers: + assert handler.level == logging.DEBUG diff --git a/peleffy/tests/test_molecule.py b/peleffy/tests/test_molecule.py index 8020f52a..9c30576c 100644 --- a/peleffy/tests/test_molecule.py +++ b/peleffy/tests/test_molecule.py @@ -65,13 +65,13 @@ def test_molecule_name_assignment(self): assert molecule.name == '', 'Unexpected atom name' # Look for the PDB name when a Molecule is loaded from a PDB file - ligand_path = get_data_file_path('ligands/BNZ.pdb') + ligand_path = get_data_file_path('ligands/benzene.pdb') molecule = Molecule(ligand_path) - assert molecule.name == 'BNZ', 'Unexpected atom name' + assert molecule.name == 'benzene', 'Unexpected atom name' # Look for benzene name when a Molecule is loaded from a PDB file # with a custom name - ligand_path = get_data_file_path('ligands/BNZ.pdb') + ligand_path = get_data_file_path('ligands/benzene.pdb') molecule = Molecule(ligand_path, name='benzene') assert molecule.name == 'benzene', 'Unexpected atom name' @@ -94,13 +94,13 @@ def test_molecule_tag_assignment(self): # Look for the PDB residue name as a tag when a Molecule is loaded # from a PDB file - ligand_path = get_data_file_path('ligands/BNZ.pdb') + ligand_path = get_data_file_path('ligands/benzene.pdb') molecule = Molecule(ligand_path) assert molecule.tag == 'BNZ', 'Unexpected atom tag' # Look for BEN tag when a Molecule is loaded from a PDB file with # a custom name - ligand_path = get_data_file_path('ligands/BNZ.pdb') + ligand_path = get_data_file_path('ligands/benzene.pdb') molecule = Molecule(ligand_path, tag='BEN') assert molecule.tag == 'BEN', 'Unexpected atom tag' @@ -126,7 +126,7 @@ def test_PDB_connectivity_template(self): # Initialize a Molecule from a PDB without connectivity and # without a connectivity template ligand_path = get_data_file_path( - 'ligands/BNZ_without_connectivity.pdb') + 'ligands/benzene_without_connectivity.pdb') molecule = Molecule(ligand_path) expected_bond_ids = [(1, 0, False), (2, 1, False), (3, 2, False), @@ -143,10 +143,10 @@ def test_PDB_connectivity_template(self): # Initialize a Molecule from a PDB without connectivity but with # a connectivity template template_path = get_data_file_path( - 'ligands/BNZ.pdb') + 'ligands/benzene.pdb') template = Molecule(template_path) ligand_path = get_data_file_path( - 'ligands/BNZ_without_connectivity.pdb') + 'ligands/benzene_without_connectivity.pdb') molecule = Molecule(ligand_path, connectivity_template=template.rdkit_molecule) @@ -164,10 +164,10 @@ def test_PDB_connectivity_template(self): # Initialize a Molecule from a PDB with connectivity and with # a connectivity template template_path = get_data_file_path( - 'ligands/BNZ.pdb') + 'ligands/benzene.pdb') template = Molecule(template_path) ligand_path = get_data_file_path( - 'ligands/BNZ.pdb') + 'ligands/benzene.pdb') molecule = Molecule(ligand_path, connectivity_template=template.rdkit_molecule) @@ -195,7 +195,7 @@ def check_residue_name(name): if line.startswith('HETATM'): assert line[17:20] == name, 'Unexpected residue name' - ligand_path = get_data_file_path('ligands/BNZ.pdb') + ligand_path = get_data_file_path('ligands/benzene.pdb') # Checking tag assignation from PDB molecule = Molecule(ligand_path) diff --git a/peleffy/tests/test_parameters.py b/peleffy/tests/test_parameters.py index 4e724ada..6b1b5c02 100644 --- a/peleffy/tests/test_parameters.py +++ b/peleffy/tests/test_parameters.py @@ -559,7 +559,8 @@ def test_OPLS_dummy_propers(self): from peleffy.forcefield import OPLS2005ParameterWrapper # Load molecule - molecule = Molecule(get_data_file_path('ligands/CO1.pdb')) + molecule = Molecule( + get_data_file_path('ligands/octafluorocyclobutane.pdb')) oplsff = OPLS2005ForceField('OPLS2005') # Set force field and obtain parameters @@ -583,7 +584,7 @@ class TestCharges(object): """ It wraps all tests that involve charge parameters. """ - LIGAND_PATH = 'ligands/OLC.pdb' + LIGAND_PATH = 'ligands/oleic_acid.pdb' def test_am1bcc_method(self): """It tests the am1bcc method""" @@ -640,3 +641,435 @@ def test_OPLS_method(self): assert partial_charges == unit.Quantity(expected_charge, unit.elementary_charge), \ 'Unexpected partial charge {}'.format(partial_charges) + + +class TestSolventParameters(object): + """ + It holds tests to validate the assignment of solvent parameters. + """ + + def test_add_SGBNP_solvent_parameters(self): + """ + It tests the function that adds the SGBNP solvent parameters to + the OPLSParameters collection. + """ + + from simtk import unit + from peleffy.forcefield import OPLS2005ParameterWrapper + + # Using a standard atom type + params1 = OPLS2005ParameterWrapper( + {'atom_names': [' C1 ', ' H1 ', ' H2 ', ' H3 ', ' H4 '], + 'atom_types': ['CT', 'HC', 'HC', 'HC', 'HC'], + 'charges': [-0.24, 0.06, 0.06, 0.06, 0.06], + 'sigmas': [3.5, 2.5, 2.5, 2.5, 2.5], + 'epsilons': [0.066, 0.03, 0.03, 0.03, 0.03]}) + + # Using a similar atom type + params2 = OPLS2005ParameterWrapper( + {'atom_names': [' C1 ', ' H1 ', ' H2 ', ' H3 ', ' H4 '], + 'atom_types': ['C3M', 'HC', 'HC', 'HC', 'HC'], + 'charges': [-0.24, 0.06, 0.06, 0.06, 0.06], + 'sigmas': [3.5, 2.5, 2.5, 2.5, 2.5], + 'epsilons': [0.066, 0.03, 0.03, 0.03, 0.03]}) + + # Using a default atom type + params3 = OPLS2005ParameterWrapper( + {'atom_names': [' C1 ', ' H1 ', ' H2 ', ' H3 ', ' H4 '], + 'atom_types': ['XX', 'HC', 'HC', 'HC', 'HC'], + 'charges': [-0.24, 0.06, 0.06, 0.06, 0.06], + 'sigmas': [3.5, 2.5, 2.5, 2.5, 2.5], + 'epsilons': [0.066, 0.03, 0.03, 0.03, 0.03]}) + + OPLS2005ParameterWrapper._add_SGBNP_solvent_parameters(params1) + OPLS2005ParameterWrapper._add_SGBNP_solvent_parameters(params2) + OPLS2005ParameterWrapper._add_SGBNP_solvent_parameters(params3) + + assert params1['SGB_radii'][0] == \ + unit.Quantity(1.975, unit.angstrom), 'Unexpected SGB radius' + assert params1['vdW_radii'][0] == \ + unit.Quantity(1.750, unit.angstrom), 'Unexpected vdW radius' + assert params1['gammas'][0] == 0.005000000, 'Unexpected gamma' + assert params1['alphas'][0] == -0.741685710, 'Unexpected alpha' + + assert params2['SGB_radii'][0] == \ + unit.Quantity(2.002, unit.angstrom), 'Unexpected SGB radius' + assert params2['vdW_radii'][0] == \ + unit.Quantity(1.775, unit.angstrom), 'Unexpected vdW radius' + assert params2['gammas'][0] == 0.023028004, 'Unexpected gamma' + assert params2['alphas'][0] == -0.852763146, 'Unexpected alpha' + + assert params3['SGB_radii'][0] == \ + unit.Quantity(1.500, unit.angstrom), 'Unexpected SGB radius' + assert params3['vdW_radii'][0] == \ + unit.Quantity(1.250, unit.angstrom), 'Unexpected vdW radius' + assert params3['gammas'][0] == 0.005000000, 'Unexpected gamma' + assert params3['alphas'][0] == 0.000000000, 'Unexpected alpha' + + def test_GBSA_params_by_type(self): + """ + It tests the params_by_type dictionary in the assignment of the + GBSA parameters. + """ + + from peleffy.forcefield.parameters import OPLS2005ParameterWrapper + + # 1st test + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' C1 '] + OPLS_params['atom_types'] = [' CT'] + degree_by_name = dict(((' C1 ', 4), )) + parent_by_name = dict(((' C1 ', None), )) + element_by_name = dict(((' C1 ', 'C'), )) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters(OPLS_params, + degree_by_name, + parent_by_name, + element_by_name) + + assert OPLS_params['GBSA_radii'] == [0.72], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [1.9], \ + 'Unexpected GBSA scale' + + # 2nd test + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' C1 '] + OPLS_params['atom_types'] = [' CW'] + degree_by_name = dict(((' C1 ', 3), )) + parent_by_name = dict(((' C1 ', None), )) + element_by_name = dict(((' C1 ', 'C'), )) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters(OPLS_params, + degree_by_name, + parent_by_name, + element_by_name) + + assert OPLS_params['GBSA_radii'] == [0.72], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [1.875], \ + 'Unexpected GBSA scale' + + # 3rd test + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' O1 '] + OPLS_params['atom_types'] = [' O '] + degree_by_name = dict(((' O1 ', 1), )) + parent_by_name = dict(((' O1 ', None), )) + element_by_name = dict(((' O1 ', 'O'), )) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters(OPLS_params, + degree_by_name, + parent_by_name, + element_by_name) + + assert OPLS_params['GBSA_radii'] == [0.85], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [1.48], \ + 'Unexpected GBSA scale' + + # 4th test + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' H10'] + OPLS_params['atom_types'] = [' H2'] + degree_by_name = dict(((' H10', 1), )) + parent_by_name = dict(((' H10', 'C'), )) + element_by_name = dict(((' H10', 'H'), )) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters(OPLS_params, + degree_by_name, + parent_by_name, + element_by_name) + + assert OPLS_params['GBSA_radii'] == [0.85], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [1.25], \ + 'Unexpected GBSA scale' + + def test_GBSA_params_by_element(self): + """ + It tests the scale_by_element and radius_by_element dictionaries + in the assignment of the GBSA parameters. + """ + + from peleffy.forcefield.parameters import OPLS2005ParameterWrapper + + # 1st test + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' C1 '] + OPLS_params['atom_types'] = [' C?!'] + degree_by_name = dict(((' C1 ', 3), )) + parent_by_name = dict(((' C1 ', None), )) + element_by_name = dict(((' C1 ', 'C'), )) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters(OPLS_params, + degree_by_name, + parent_by_name, + element_by_name) + + assert OPLS_params['GBSA_radii'] == [0.72], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [1.875], \ + 'Unexpected GBSA scale' + + # 2nd test + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' O1 '] + OPLS_params['atom_types'] = ['O?!'] + degree_by_name = dict(((' O1 ', 2), )) + parent_by_name = dict(((' O1 ', None), )) + element_by_name = dict(((' O1 ', 'O'), )) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters(OPLS_params, + degree_by_name, + parent_by_name, + element_by_name) + + assert OPLS_params['GBSA_radii'] == [0.85], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [1.535], \ + 'Unexpected GBSA scale' + + # 3rd test + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' O1 '] + OPLS_params['atom_types'] = ['O?!'] + degree_by_name = dict(((' O1 ', 1), )) + parent_by_name = dict(((' O1 ', None), )) + element_by_name = dict(((' O1 ', 'O'), )) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters(OPLS_params, + degree_by_name, + parent_by_name, + element_by_name) + + assert OPLS_params['GBSA_radii'] == [0.85], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [1.48], \ + 'Unexpected GBSA scale' + + # 4th test + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' H10'] + OPLS_params['atom_types'] = ['H?!'] + degree_by_name = dict(((' H10', 1), )) + parent_by_name = dict(((' H10', 'C'), )) + element_by_name = dict(((' H10', 'H'), )) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters(OPLS_params, + degree_by_name, + parent_by_name, + element_by_name) + + assert OPLS_params['GBSA_radii'] == [0.85], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [1.25], \ + 'Unexpected GBSA scale' + + # 5th test + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' H10'] + OPLS_params['atom_types'] = ['H?!'] + degree_by_name = dict(((' H10', 1), )) + parent_by_name = dict(((' H10', 'N'), )) + element_by_name = dict(((' H10', 'H'), )) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters(OPLS_params, + degree_by_name, + parent_by_name, + element_by_name) + + assert OPLS_params['GBSA_radii'] == [0.85], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [1.15], \ + 'Unexpected GBSA scale' + + # 6th test + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' H10'] + OPLS_params['atom_types'] = ['H?!'] + degree_by_name = dict(((' H10', 1), )) + parent_by_name = dict(((' H10', 'O'), )) + element_by_name = dict(((' H10', 'H'), )) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters(OPLS_params, + degree_by_name, + parent_by_name, + element_by_name) + + assert OPLS_params['GBSA_radii'] == [0.85], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [1.05], \ + 'Unexpected GBSA scale' + + # 7th test + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' C1 '] + OPLS_params['atom_types'] = [' C?!'] + degree_by_name = dict(((' C1 ', 2), )) + parent_by_name = dict(((' C1 ', None), )) + element_by_name = dict(((' C1 ', 'C'), )) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters(OPLS_params, + degree_by_name, + parent_by_name, + element_by_name) + + assert OPLS_params['GBSA_radii'] == [0.72], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [1.825], \ + 'Unexpected GBSA scale' + + def test_GBSA_default_params(self): + """ + It tests the default parameters of the GBSA implementation. + """ + import io + from peleffy.forcefield.parameters import OPLS2005ParameterWrapper + from peleffy.utils import Logger + + OPLS_params = OPLS2005ParameterWrapper() + + # Create mock molecule containing just one customized atom + OPLS_params['atom_names'] = [' C1 '] + OPLS_params['atom_types'] = [' C?!'] + degree_by_name = dict(((' C1 ', 2), )) + parent_by_name = dict(((' C1 ', None), )) + element_by_name = dict(((' C1 ', '?'), )) + + import logging + + # Force a hard reset of logging library and the logger it manages + from importlib import reload + logging.shutdown() + reload(logging) + + # Initiate logger + log = Logger() + + # Try the default level (INFO) + # Catch logger messages to string buffer + with io.StringIO() as buf: + # Add custom handler to logger + log_handler = logging.StreamHandler(buf) + log._logger.handlers = list() + log._logger.addHandler(log_handler) + + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters( + OPLS_params, degree_by_name, parent_by_name, element_by_name) + + # Get string from buffer + output = buf.getvalue() + + assert output == 'Warning: OBC parameters for ' \ + + 'C1 C?! NOT found in the template database. ' \ + + 'Using default parameters\n' + + assert OPLS_params['GBSA_radii'] == [0.80], \ + 'Unexpected GBSA radii' + assert OPLS_params['GBSA_scales'] == [2.0], \ + 'Unexpected GBSA scale' + + def test_add_GBSA_solvent_parameters(self): + """ + It tests the function that adds the GBSA solvent parameters to + the OPLSParameters collection. + """ + + from peleffy.forcefield import OPLS2005ParameterWrapper + from peleffy.topology import Molecule + from peleffy.utils import get_data_file_path + + def generate_and_compare_GBSA_solvent_parameters(pdb_file, + ffld_file, + reference_txt): + """ + Given a ligand, it tests that the HTC radii and the scale factor + for heteroatoms computed with the function + _add_GBSA_solvent_parameters correspond to the ones + obtained with the original solventOBCParamsGenerator.py script. + + Parameters + ---------- + pdb_file : str + The path to the PDB of the ligand to test + ffld_file : str + The path to the ffld_server's output file + reference_txt : str + The path to reference TXT file obtained + from solventOBCParamsGenerator.py + """ + + # Load the molecule + molecule = Molecule(pdb_file) + + # Set force field and obtain parameters + with open(ffld_file) as f: + ffld_output = f.read() + + # Initializate wrapper for OPLS2005 parameters + wrapper_opls = OPLS2005ParameterWrapper() + parameters = wrapper_opls.from_ffld_output(molecule, ffld_output) + + # Get the radi and scale parameters for each atom name + atom_names = [param.replace('_', '') + for param in parameters['atom_names']] + d_radii = dict(zip(atom_names, parameters['GBSA_radii'])) + d_scale = dict(zip(atom_names, parameters['GBSA_scales'])) + + # Load the reference file obtained from solventOBCParamsGenerator.py + data = open(reference_txt, 'r').readlines() + + # Check that the parameters correspond + for line in data: + params = line.split() + assert float(params[3]) == d_scale.get(params[1]), \ + 'Unexpected GBSA Overlap factor' + assert float(params[4]) == d_radii.get(params[1]), \ + 'Unexpected GBSA radius' + + # For malonate + ffld_file = get_data_file_path('tests/MAL_ffld_output.txt') + pdb_file = get_data_file_path('ligands/malonate.pdb') + reference_txt = get_data_file_path('tests/malz_OBCParams.txt') + generate_and_compare_GBSA_solvent_parameters(pdb_file, + ffld_file, + reference_txt) + + # For methane + ffld_file = get_data_file_path('tests/MET_ffld_output.txt') + pdb_file = get_data_file_path('ligands/methane.pdb') + reference_txt = get_data_file_path('tests/metz_OBCParams.txt') + generate_and_compare_GBSA_solvent_parameters(pdb_file, + ffld_file, + reference_txt) + + # For ethylene + ffld_file = get_data_file_path('tests/ETL_ffld_output.txt') + pdb_file = get_data_file_path('ligands/ethylene.pdb') + reference_txt = get_data_file_path('tests/etlz_OBCParams.txt') + generate_and_compare_GBSA_solvent_parameters(pdb_file, + ffld_file, + reference_txt) diff --git a/peleffy/tests/test_rotamers.py b/peleffy/tests/test_rotamers.py index 51f7162a..94b9d0ca 100644 --- a/peleffy/tests/test_rotamers.py +++ b/peleffy/tests/test_rotamers.py @@ -18,7 +18,7 @@ def test_rotamer_library_builder(self): """ It tests the rotamer library builder. """ - LIGAND_PATH = 'ligands/OLC.pdb' + LIGAND_PATH = 'ligands/oleic_acid.pdb' ligand_path = get_data_file_path(LIGAND_PATH) molecule = Molecule(ligand_path, exclude_terminal_rotamers=False) @@ -88,7 +88,7 @@ def test_terminal_rotamer_filtering(self): It tests the rotamer library builder when the terminal rotatable bonds are ignored. """ - LIGAND_PATH = 'ligands/OLC.pdb' + LIGAND_PATH = 'ligands/oleic_acid.pdb' ligand_path = get_data_file_path(LIGAND_PATH) molecule = Molecule(ligand_path, exclude_terminal_rotamers=True) @@ -156,7 +156,7 @@ def test_rotamer_core_constraint(self): to contain a specific atom. """ - LIGAND_PATH = 'ligands/OLC.pdb' + LIGAND_PATH = 'ligands/oleic_acid.pdb' ligand_path = get_data_file_path(LIGAND_PATH) # Test atom index constraint @@ -365,7 +365,7 @@ def test_rotamer_core_constraint_adjacency(self): the rotamer library builder with core constraints. """ - LIGAND_PATH = 'ligands/OLC.pdb' + LIGAND_PATH = 'ligands/oleic_acid.pdb' ligand_path = get_data_file_path(LIGAND_PATH) # Test adjacent core constraint selection diff --git a/peleffy/tests/test_templates.py b/peleffy/tests/test_templates.py index da47527a..cfa2f2cb 100644 --- a/peleffy/tests/test_templates.py +++ b/peleffy/tests/test_templates.py @@ -4,7 +4,9 @@ import pytest -from peleffy.utils import get_data_file_path +import tempfile + +from peleffy.utils import get_data_file_path, temporary_cd from peleffy.topology import Molecule from peleffy.template import Impact from peleffy.tests.utils import compare_files @@ -19,7 +21,7 @@ def test_input(self): format, peleffy.topology.Molecule and it has been parameterized with a forcefield. """ - LIGAND_PATH = 'ligands/BNZ.pdb' + LIGAND_PATH = 'ligands/benzene.pdb' ligand_path = get_data_file_path(LIGAND_PATH) molecule = Molecule(ligand_path) @@ -87,35 +89,37 @@ def test_writer_OFF(self): TEMPLATE_MATZ = get_data_file_path('tests/malz') TEMPLATE_ETLZ = get_data_file_path('tests/etlz') - # Generates the template for methane - pdb_path = get_data_file_path('ligands/methane.pdb') - m = Molecule(pdb_path) - m.parameterize('openff_unconstrained-1.2.1.offxml') - impact = Impact(m) - impact.write('metz') - - # Compare the reference template and the generated template - compare_files(file1=TEMPLATE_METZ, file2='metz') - - # Generates the template for malonate - pdb_path = get_data_file_path('ligands/malonate.pdb') - m = Molecule(pdb_path) - m.parameterize('openff_unconstrained-1.2.1.offxml') - impact = Impact(m) - impact.write('malz') - - # Compare the reference template and the generated template - compare_files(file1=TEMPLATE_MATZ, file2='malz') - - # Generates the template for ethylene - pdb_path = get_data_file_path('ligands/ethylene.pdb') - m = Molecule(pdb_path, tag='ETL') # Note that in this case we are assigning a tag to the molecule which will be used in the Impact template - m.parameterize('openff_unconstrained-1.2.1.offxml') - impact = Impact(m) - impact.write('etlz') - - # Compare the reference template and the generated template - compare_files(file1=TEMPLATE_ETLZ, file2='etlz') + with tempfile.TemporaryDirectory() as tmpdir: + with temporary_cd(tmpdir): + # Generates the template for methane + pdb_path = get_data_file_path('ligands/methane.pdb') + m = Molecule(pdb_path) + m.parameterize('openff_unconstrained-1.2.1.offxml') + impact = Impact(m) + impact.to_file('metz') + + # Compare the reference template and the generated template + compare_files(file1=TEMPLATE_METZ, file2='metz') + + # Generates the template for malonate + pdb_path = get_data_file_path('ligands/malonate.pdb') + m = Molecule(pdb_path) + m.parameterize('openff_unconstrained-1.2.1.offxml') + impact = Impact(m) + impact.to_file('malz') + + # Compare the reference template and the generated template + compare_files(file1=TEMPLATE_MATZ, file2='malz') + + # Generates the template for ethylene + pdb_path = get_data_file_path('ligands/ethylene.pdb') + m = Molecule(pdb_path, tag='ETL') # Note that in this case we are assigning a tag to the molecule which will be used in the Impact template + m.parameterize('openff_unconstrained-1.2.1.offxml') + impact = Impact(m) + impact.to_file('etlz') + + # Compare the reference template and the generated template + compare_files(file1=TEMPLATE_ETLZ, file2='etlz') def test_writer_OPLS(self): """ @@ -125,30 +129,36 @@ def test_writer_OPLS(self): TEMPLATE_MALZ_OPLS = get_data_file_path('tests/OPLS_malz') TEMPLATE_ETLZ_OPLS = get_data_file_path('tests/OPLS_etlz') - # Generates the template for methane using OPLS - m = self._prepare_molecule_OPLS(pdb_name='ligands/methane.pdb', - ffld_name='tests/MET_ffld_output.txt') - impact = Impact(m) - impact.write('metz') - - # Compare the reference template and the generated template - compare_files(file1=TEMPLATE_METZ_OPLS, file2='metz') - - # Generates the template for malonate - m = self._prepare_molecule_OPLS(pdb_name='ligands/malonate.pdb', - ffld_name='tests/MAL_ffld_output.txt') - impact = Impact(m) - impact.write('malz') - - # Compare the reference template and the generated template - compare_files(file1=TEMPLATE_MALZ_OPLS, file2='malz') - - # Generates the template for ethylene - m = self._prepare_molecule_OPLS(pdb_name='ligands/ethylene.pdb', - ffld_name='tests/ETL_ffld_output.txt', - molecule_tag='ETL') - impact = Impact(m) - impact.write('etlz') - - # Compare the reference template and the generated template - compare_files(file1=TEMPLATE_ETLZ_OPLS, file2='etlz') + with tempfile.TemporaryDirectory() as tmpdir: + with temporary_cd(tmpdir): + + # Generates the template for methane using OPLS + m = self._prepare_molecule_OPLS( + pdb_name='ligands/methane.pdb', + ffld_name='tests/MET_ffld_output.txt') + impact = Impact(m) + impact.to_file('metz') + + # Compare the reference template and the generated template + compare_files(file1=TEMPLATE_METZ_OPLS, file2='metz') + + # Generates the template for malonate + m = self._prepare_molecule_OPLS( + pdb_name='ligands/malonate.pdb', + ffld_name='tests/MAL_ffld_output.txt') + impact = Impact(m) + impact.to_file('malz') + + # Compare the reference template and the generated template + compare_files(file1=TEMPLATE_MALZ_OPLS, file2='malz') + + # Generates the template for ethylene + m = self._prepare_molecule_OPLS( + pdb_name='ligands/ethylene.pdb', + ffld_name='tests/ETL_ffld_output.txt', + molecule_tag='ETL') + impact = Impact(m) + impact.to_file('etlz') + + # Compare the reference template and the generated template + compare_files(file1=TEMPLATE_ETLZ_OPLS, file2='etlz') diff --git a/peleffy/tests/utils.py b/peleffy/tests/utils.py index 3653558a..8a587152 100644 --- a/peleffy/tests/utils.py +++ b/peleffy/tests/utils.py @@ -6,8 +6,9 @@ from simtk import unit -SET_OF_LIGAND_PATHS = ['ligands/BNZ.pdb', 'ligands/TOL.pdb', 'ligands/MDB.pdb', - 'ligands/BIA.pdb', 'ligands/SBN.pdb', 'ligands/OLC.pdb'] +SET_OF_LIGAND_PATHS = ['ligands/benzene.pdb', 'ligands/toluene.pdb', + 'ligands/oleic_acid.pdb', 'ligands/propionic_acid.pdb', + 'ligands/trimethylglycine.pdb', 'ligands/ethylene.pdb'] def apply_PELE_dihedral_equation(proper, x): diff --git a/peleffy/utils/toolkits.py b/peleffy/utils/toolkits.py index dc7ba495..bdfb16ae 100644 --- a/peleffy/utils/toolkits.py +++ b/peleffy/utils/toolkits.py @@ -289,6 +289,71 @@ def get_atom_degrees(self, molecule): return atom_degrees + def get_hydrogen_parents(self, molecule): + """ + It returns the ordered list of the element belonging to the atom + parent for the hydrogen atoms of the molecule. + + Note that this functions sets the element to None when + the child is not a hydrogen atom. + + Parameters + ---------- + molecule : an peleffy.topology.Molecule + The peleffy's Molecule object + + Returns + ------- + atom_parents : list[int] + The list of elements belonging to the atom parent, if the + atom is an hydrogen. The element is set to None when the + child is not a hydrogen atom + """ + rdkit_molecule = molecule.rdkit_molecule + + atom_parents = list() + + for atom in rdkit_molecule.GetAtoms(): + if atom.GetSymbol() == 'H': + bonds = atom.GetBonds() + + assert len(bonds) == 1, \ + 'Hydrogen atom should only have 1 bond' + + if bonds[0].GetBeginAtom().GetSymbol() == 'H': + atom_parents.append(bonds[0].GetEndAtom().GetSymbol()) + + else: + atom_parents.append(bonds[0].GetBeginAtom().GetSymbol()) + + else: + atom_parents.append(None) + + return atom_parents + + def get_elements(self, molecule): + """ + It returns the ordered list of elements of the molecule. + + Parameters + ---------- + molecule : an peleffy.topology.Molecule + The peleffy's Molecule object + + Returns + ------- + elements : list[str] + The list of elements belonging to supplied Molecule object + """ + rdkit_molecule = molecule.rdkit_molecule + + elements = list() + + for atom in rdkit_molecule.GetAtoms(): + elements.append(atom.GetSymbol()) + + return elements + def to_pdb_file(self, molecule, path): """ It writes the RDKit molecule to a PDB file.