From 65a6a27fc2a003b7acffba865c7ae6591813cbbb Mon Sep 17 00:00:00 2001 From: Marti Municoy Date: Tue, 3 Nov 2020 15:21:48 +0100 Subject: [PATCH 01/13] Add preliminar changes to support new OBC for OPLS implementation --- peleffy/forcefield/parameters.py | 40 ++++- peleffy/main.py | 2 +- peleffy/solvent/solvent.py | 250 +++++++++++++++++++++--------- peleffy/tests/test_forcefields.py | 10 +- 4 files changed, 217 insertions(+), 85 deletions(-) diff --git a/peleffy/forcefield/parameters.py b/peleffy/forcefield/parameters.py index 9fccd3f3..6a2744b4 100644 --- a/peleffy/forcefield/parameters.py +++ b/peleffy/forcefield/parameters.py @@ -648,7 +648,9 @@ def from_ffld_output(molecule, ffld_output): }) opls_parameters_wrapper = OPLS2005ParameterWrapper(params) - OPLS2005ParameterWrapper._add_solvent_parameters( + OPLS2005ParameterWrapper._add_SGBNP_solvent_parameters( + opls_parameters_wrapper) + OPLS2005ParameterWrapper._add_GBSA_solvent_parameters( opls_parameters_wrapper) return opls_parameters_wrapper @@ -701,9 +703,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 ---------- @@ -763,6 +767,36 @@ 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): + """ + 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 + """ + return + + raise NotImplementedError() + + # radii = list() + # scales = list() + # Here we can loop over atom types and names: + # for atom_name, atom_type in zip(OPLS_params['atom_names'], OPLS_params['atom_types']): + # radius, scale = find_GBSA_parameters_according_to(atom_name, atom_type) + # radii.append(radius) + # scales.append(scale) + # 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..9ba9c58a 100644 --- a/peleffy/main.py +++ b/peleffy/main.py @@ -158,7 +158,7 @@ def run_peleffy(pdb_file, forcefield=DEFAULT_OFF_FORCEFIELD, 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..c0235393 100644 --- a/peleffy/solvent/solvent.py +++ b/peleffy/solvent/solvent.py @@ -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,12 +287,11 @@ 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) @@ -242,7 +302,7 @@ def _initialize_from_molecule(self): super()._initialize_from_molecule() -class OBC2(_SolventWrapper): +class OBC2(_OpenFFCompatibleSolvent): """ Implementation of the OBC2 solvent. """ @@ -257,7 +317,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,7 +329,7 @@ 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) @@ -279,3 +339,41 @@ def _initialize_from_molecule(self): Initializes the OBC2 solvent using an peleffy's Molecule. """ super()._initialize_from_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 OPLSOBC solvent using an peleffy's Molecule. + """ + super()._initialize_from_molecule() diff --git a/peleffy/tests/test_forcefields.py b/peleffy/tests/test_forcefields.py index 27e47ee9..d17a1003 100644 --- a/peleffy/tests/test_forcefields.py +++ b/peleffy/tests/test_forcefields.py @@ -241,9 +241,9 @@ def test_parameterizer(self): expected_propers=expected_propers, expected_impropers=expected_impropers) - def test_add_solvent_parameters(self): + def test_add_SGBNP_solvent_parameters(self): """ - It tests the function that adds the solvent parameters to + It tests the function that adds the SGBNP solvent parameters to the OPLSParameters collection. """ @@ -274,9 +274,9 @@ def test_add_solvent_parameters(self): '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) + 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' From 5e09bc3dcd019e889ad77dcda650030b0ca6b420 Mon Sep 17 00:00:00 2001 From: Marti Municoy Date: Wed, 4 Nov 2020 12:02:37 +0100 Subject: [PATCH 02/13] Rename PDB files in data --- .../OFF_parameterization/parameterize.ipynb | 43 ++-- peleffy/data/ligands/BIA.pdb | 115 ----------- peleffy/data/ligands/BNZ.mae | 184 ----------------- peleffy/data/ligands/BNZ.pdb | 53 ----- .../data/ligands/BNZ_without_connectivity.pdb | 35 ---- peleffy/data/ligands/CO1.pdb | 18 -- peleffy/data/ligands/LG1.pdb | 79 -------- peleffy/data/ligands/MDB.pdb | 77 ------- peleffy/data/ligands/OLC.pdb | 117 ----------- peleffy/data/ligands/SBN.pdb | 113 ----------- peleffy/data/ligands/TOL.mae | 190 ------------------ peleffy/data/ligands/TOL.pdb | 59 ------ peleffy/main.py | 2 +- peleffy/template/impact.py | 2 +- peleffy/tests/test_main.py | 42 ++-- peleffy/tests/test_molecule.py | 22 +- peleffy/tests/test_parameters.py | 5 +- peleffy/tests/test_rotamers.py | 8 +- peleffy/tests/test_templates.py | 14 +- peleffy/tests/utils.py | 5 +- 20 files changed, 82 insertions(+), 1101 deletions(-) delete mode 100644 peleffy/data/ligands/BIA.pdb delete mode 100644 peleffy/data/ligands/BNZ.mae delete mode 100644 peleffy/data/ligands/BNZ.pdb delete mode 100644 peleffy/data/ligands/BNZ_without_connectivity.pdb delete mode 100644 peleffy/data/ligands/CO1.pdb delete mode 100644 peleffy/data/ligands/LG1.pdb delete mode 100644 peleffy/data/ligands/MDB.pdb delete mode 100644 peleffy/data/ligands/OLC.pdb delete mode 100644 peleffy/data/ligands/SBN.pdb delete mode 100644 peleffy/data/ligands/TOL.mae delete mode 100644 peleffy/data/ligands/TOL.pdb 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": "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\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": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcIAAACWCAIAAADCEh9HAAAABmJLR0QA/wD/AP+gvaeTAAAbBUlEQVR4nO3deVhTV/oH8BPWWEgERRFEq4IEUUdQsVLUYgfcCpUqIILLUOcXZlzoTNunoX06D2Wm9gljW7VjdYKjVasOIgqiOAqMVqSoFNBBZVGWMYAihD2SQJbz++O2mTRgimS5S97Pfznk3vtS6fc5y73nsjDGCAAAwEhZkV0AAADQG8QoAAAYBGIUAAAMAjEKAAAGgRgFAACDQIwCiyaRSB48eKDd0tLS0tDQQFY9gI4gRoFFO3ny5Lp167Rb9u7du337drLqAXQEMQoAAAaBGAUAAIPYkF0AACTr6enJycnRfKytrSWxGEBHEKPA0rW1te3bt0/zsba2dsaMGSTWA2gHYhRYOk9Pz7y8PM3HDz/8sKKigsR6AO3A3CgAABgEYhQAAAwCMQosmr29PYfD0W5hs9kODg5k1QPoiAX7jQJQUFDA4XB+9atfjRo1iuxaAP1AjAKAeDzegwcPKioqZs+eTXYtgH4gRoGlGxgYcHBwwBhLpVI2m012OYB+YG4UWLqHDx8qlcqpU6dChoKRgRgFlq66uhohBLfcgxGDGAWWrqqqCiHk4+NDdiGAriBGgaUjYhR6o2DEIEaBpYNBPTAQrNQDi4Yx5nK5Uqm0o6PD2dmZ7HIALUFvFFg0sVgslUonTJgAGQpGDGIUWDSYGAWGgxgFFg0mRoHhIEaBRYO7nYDhIEaB0UgkktbWVu2WlpaW9vZ2suoZDhjUA8PBSj0wmq1bt3Z1dZ08eVLTEhER4enp+cUXX5BYlX7jx49va2tramqaOHEi2bUAuoLeKLBc7e3tbW1tHA7H3d2d7FoAjUGMAsulmRhlsVhk1wJoDF5pB4zp6dOnV65c0XyUSCSenp4k1qMfTIwCo4AYBcZUUVHx8ccfaz7W1NS88sorJNajH9ztBIwCYhQYU2hoqM4SE4nF/CK42wkYBcyNAssFg3pgFBCjwOTy8vIOHTpEdhW6ZDKZWCy2tbWdNm0a2bUAeoNBPTAaa2tra2trnZaBgYGYmJjOzs47d+7s3r3bxoYqf3I1NTVqtdrHx8fW1pbsWgC9UeVvGjDA3/72N52WM2fOIIQCAwN/+9vf7tu3786dO5mZma6urmRUpwsmRoGxwKAemFxsbGxRUdHkyZOLiormz59fWlpKdkUIwcQoMB6IUWAOc+fOvXHjxsKFC5uamhYvXvztt9+SXRHc7QSMBmIUmIm7u/t33323ZcsWuVy+efPmpKQktVpNSiVqtTovL+/q1asIITc3N1JqAEwCW5MAc0tLS9u+fbtCoVi5cuXJkyednJzMdummpqYTJ06IRKKGhgaEkJ2d3fjx47Ozs+fNm2e2GgDzQIwCEly/fj0yMrK1tXX69Onnzp0z9chaJpOdOXPm8OHD3333HfEH7+npuXbt2oKCgvLycgcHhyNHjkRGRpq0BsBkGAAyiMViog/I4XCys7NNdJXS0tLExMSxY8cSf+1sNjsqKio/P1+tVmOM5XJ5fHw8QojFYgkEApVKZaIyALNBjALSSKVSog/IYrGSk5OJaDOKjo4OkUjk5+en6S7Mmzdvz5497e3tg78sEomIW0dXrVrV1dVlrBqA5YAYBWRSq9VCodDKygohFB0dLZVKDTmbSqXKz8+Pioqys7Mj0tPZ2ZnP59+5c0f/gdeuXRs/fjxCyNvbu7Ky0pAajKKwsPBPf/qTdsv58+c///xzsuoB+kGMAn2OHz8eExOj3fLll1/u2LHDuFe5ePEisdA0Z86choaGEZyhpqYmOTn55ZdfJtLTysoqJCQkIyNjYGBgmGeoq6ubPXs2QojL5ebk5IygBiNKS0vj8XjaLSkpKcHBwWTVA/SDG56APm1tbQ8fPtRuefLkCbHMbUQrV668devWjBkz/vOf/8yfP197x1L9ZDLZ6dOnQ0NDfXx8UlJSHj16xOPxkpOTGxoaiG7p8B/0nDZtWnFx8dq1a3t6et56663U1FQMq69geCBGASV4e3vfvHnzzTffbG9vX758eWpqqv7vl5WVJSQkuLq6RkdHFxQUaNaOqqqqPvnkk8mTJw/norm5udofHR0dT58+LRQKMcZJSUmxsbF9fX0j/5WAxYBn6gFVcLnc7OzslJSUP//5z0lJSXV1dfv27dPMchJaWlpOnTp16NChu3fvEi3z5s3j8/mxsbGOjo4vdLndu3e/++6769atO3z48EsvvUQ0Ekv2s2bNiouLS09Pr66uzsrKmjJlijF+vxfT2NgYGhqq+djQ0DBp0iTzlwGGhexZBTC0jo4OnfUWiUTS19dn5jJ2795tbW3N1WJnZxcWFmbSi6anpxO59uqrrz558gRjrFQqdQbpbm5uiYmJFRUVI75Kbm7u6NGjEUJ+fn6DJ2RramqIXUtcXFyuXLliyK/zQvr7+8VicVpa2sSJE3O0xMbGwtwoZUGMUlRwcHBKSop2C4/HS0tLM3MZu3fvnjNnTouWbdu2mTpGMcZlZWVE58vNzS0uLo5YRkcI2dnZrV279sKFC0ql0vCr6M/K7u7u8PBwhJCNjc3evXsNv5x+lZWVAoFg/PjxwcHBsMRELzA3Cn6BjY2NqxbN+Nek5s6dW15eHhwcLJFI0tPTW1tbZ8yYIRQKGxsbMzMz33jjDZ2NTUfG29v71q1b4eHhEolk2bJlOhOyXC43KytLIBAolcp33nknISFhYGDA8Ivq6OrqOnDgQEBAgK+vb2pqamtra1dXlykuBEwHYhRQlIuLy/79+xUKBZfLLSkp0XTWjHsV7axMSkrSyUpra2uhUPjPf/7zpZdeSktLe/3111taWoxyXbVaXVRUlJCQ4OHhsXXr1tLS0tGjR/P5/OvXr9++fVtnRhhQHCwxUVdzc3NJSYnmo1wuJ7EYUtTV1SGEAgICAgICTHcVIiv9/Py2bNmSlpZ2//79zMzMCRMmaL4QExPj4+MTERHx/fffz58/Pysry5B6mpubjx8/fvDgQeK3s7KyCgoK2rRp04YNGzQ9fX9//9///vfaRy1ZssTDw2PEFwWmRfasAhhacHCwq6vrbC329vbmnBttbGy8d+9efX19YWGhdntlZWVJSYl5avjrX/+KEEpMTDTP5W7fvk3cwD9x4sTBv2NbW1twcDBCiM1mHzly5EVPLpfLMzIywsLCNNMRHh4eAoGgrq7OSOUD0kCMUhS5S0x9fX3z58/ncDjXrl0zzxWH9PbbbyOEDhw4YLYr6s9KhUKxY8cOIgT5fL5CoRjOOe/duycQCFxcXIgD7e3to6KicnJyjLJKBqgAYpSiyI1RYt+jKVOmtLW1meeKQwoMDEQIXb161ZwXVSgUiYmJerJSJBIRc5fLly/v6Oh43nk6OztFItHcuXM1Iz9fX1+hUEjuf1JgChCjFPW8GD158uT169dNeuldu3YhhBwdHe/evWvSC/0iZ2dnhFBLS4um5dKlSx999NGNGzdMfWn9WVlUVES8mM/Ly+vevXvaPyK2R9m4caNmotPJyYnP55eXl5u6ZkAWiFGKGjJGk5OT7e3t7ezsRCKRia6bl5dnY2PDYrEyMjJMdIlhevLkCZFB2o3EmHrXrl1mKEBPVmKMGxsbiYUmDodz9uxZjLFYLBYKhZpHnojtUY4ePWr+hyaAmUGMUtTAwIDO3Fl/f39/f79AINCMN/v7+4170fr6emIK75NPPjHumUeA2KDk1Vdf1W4MCQlBCF24cME8NWiy0tHRkchKbc+ePYuJiSESk8fjsVgs4p/Gy8tr586dTU1N5ikSkA5ilH6I2xgRQkFBQcSzkkbR29s7a9YshNDq1aupsA/8/v37EUJbtmzRbiRu+jHn6rZMJtu0aRN6/g75e/bsYbPZXC5XZ2t9YDkgRmlJ/605I6BWq4mN6H18fLq7uw0/oeEGj997enpYLBabzTbzGjextzRxoxKfz9f5qUQiQQg5ODjAzvkWC55ioiU/P7/S0tLg4ODm5uYlS5YcPXrUwBMmJydnZmY6OzufP3+ey+UapUgDDX6PfHV1NcbY29vbKE+CDh/RD71w4cK4ceOIUby2yspKhNDMmTOJjU6ABYIYpSsXF5f8/PwdO3bI5fLf/OY3CQkJSqVyZKfKzs7+9NNPra2tT5w44eXlZdw6R6yqqgohRGwdot1i6teIPs+KFSvq6+uXLl2q005uVYAKIEZpzMbG5quvviJuzUlLSwsLC+vs7HzRk1RVVW3evBljvGvXrpUrV5qizhGQSqXNzc1sNlt7r0+if6odrGY25JampFcFSAcxSnt8Pv/KlSuurq6XL19esGDB/fv3h39sR0fHm2++2dPTs2HDhj/+8Y+mK/JFVVVVDR6/U7PfR82qgDlBjDJBUFBQaWlpQEBAbW1tYGBgVlbWcI5SqVRxcXG1tbX+/v4ikcjURb6QIbOJmoE1eA4XWBqIUYbw8PAoLCzctGlTb2/v2rVrk5KS1Gq1/kPef//9S5cuubq65uTkmGcX0eEbPFJWKBT19fVWVlbTp08nry5dfX19YrHYzs5u2rRpZNcCSAMxyhxsNvvo0aN79uyxsrJKTU2NiIjo6el53pe//fbbPXv22NraZmRkUHAHtsEdz9raWoVCMXXq1FGjRpFXl66amhq1Wu3l5WVjA3tOWi6IUaZ55513Lly44OTkdP78+cWLFw/5MuTy8vKEhASE0L59+5YsWWL2Gn/Z4JHy4IV7KqDmPAMwM4hRBlqxYsUPP/zg6+tbUVEREBBQUFCg/dOWlpbVq1fLZLLt27fz+XyyitRDoVDU1dXpjN+pGVgwMQoQxChTeXl53bx5MyIior29fcWKFZq3DCkUiujo6KampkWLFn3xxRfkFvk8xPh9ypQp2uN3at5XRM0+MjAziFHGInYeEgqFGOOkpKQNGzbIZLJt27Zdv3795ZdfPnPmDGVf+EOjZXpqVgXMDObFmYx4inHatGnx8fEnTpwoLCxsbGwcNWrUmTNnjP5uOCMaPFLGGNfU1CCEeDweaWUNolKpamtrWSyWt7c32bUAMkFvlPmioqKKi4vd3NyePHnCYrE++uijefPmkV2UPoNHyk1NTVKp1NXVdezYseTVpau+vr6/v3/y5MlDPt0ELAfEqEXgcrn9/f3Exkg7d+48cuQI2RXpM3ikTM0pSGpWBcwPYpT5ZDJZZGRkR0fHsmXLPvjgA7lcHh8fn5CQoFAoyC5tCEOO36k5BUnNqoD5wdwow2GM4+Pjy8rKeDzeqVOnnJycZs+ezefz09LSqqurT58+TbVJ0iHH79RcpqdmVcD8oDfKcJ999tmpU6eIVXsnJyeE0IYNG/7973+7ubkVFhbOnz+/rKyM7Bp/ZsiRMjX7fdSsCpgfxCiTXb58OTk52crK6uTJk76+vpr2wMDA0tLSV155pbGxMTg4ODMzk8QidQyZTTweb+bMmVQLLGLygWpVAfODGGWsmpqadevWqVSqnTt3hoWF6fzU3d392rVr8fHxUqk0Ojp6OFuZmMeQI2WRSHTv3r1JkyaRVNQQHj9+3NXVNXbs2HHjxpFdCyAZxCgz9fT0rFmzpru7e82aNZqXieqwt7c/fPiwSCSysbFJTU0NDw/v7u42c52D0WWkDI+BAg2IUQZSq9WxsbGVlZVz5sw5duyY5sW/Q+Lz+bm5uWPGjLl59ap6/XpUW2u2OgeTSqUVFRWIDvEEdzsBDYhRBvrwww9zc3PHjh179uxZBweHX/x+aGhoSUnJzTfecP7Xv9CCBejyZTMUqaOsrCwhIcHd3X1gYGDUqFFff/01RSYZngd6o+B/SHsnKTCNzMxMFotla2t75cqVFzuytxevXYsRwtbWWCg0TXW6Hj9+nJqaqunTEQ9WEi8Oeeutt3p6esxTxgj8+te/Rgjl5uaSXQggH8Qoo9y+fZvYx/7rr78eyfFqNRYKsZUVRgjHxOBnz4xd4I+USmV+fn5UVJStrS0RoG5ubomJiRUVFRjjy5cvOzs7I4R4PB7xUiYKcnd3RwjV19eTXQggH8Qoc0gkkqlTpyKEiDd9jtyFC3j0aIwQ9vPD//2vcYr7SVVVlUAgcHV1JdLT2to6JCQkIyNjYGBA+2u1tbWzZs1CCI0ZMyYvL8+4NRiuu7ubxWKNGjVKpVKRXQsgH8QoQwwMDAQHByOEAgMD5XK5oaerrsY+Phgh7OKCr141Qn3d3VgkilixQjObNGvWrC+//LK1tfV5R/T29q5Zs4aIWqG5Jhm0dXZ27t+/PygoqLOzU+dHN2/eRAj5+fmZvypAQRCjDPG73/2OGBo3Nzcb54zt7Tg0FCOEbWzw3r0jP09pKebzsaMjRuiD117jcrkbN27Mz88fzqFqtVooFFpZWSGE1q9f/8xkkwzaVCpVQUFBXFycZtPoAwcO6HyH2Ntl/fr1ZqgHUB/EKBN88803CCE2m33r1i1jnlepxAIBRggjhPl83N//Asc2NuK//AV7ev54OIuFly7tSE/v6+t70SrOnz/P5XIRQv7+/v819iSDtqamJqFQ6OnpSaSnlZVVUFCQSCQaHN/ErbgpKSmmKwbQCMQo7X3//ff29vYIoUOHDpnkAseOYTYbW1vjoiKMMe7txd98gwUC/PHH+OJFrFb/7Mv9/TgnB0dFYRubHwN04kQsEODaWkNKqK6uJjZ8Gjdu3FWjTDJokcvlGRkZYWFhxB0CCCEPDw+BQFBXV/e8Q1avXo0QysjIMG4lgKYgRumtubmZWDJ+7733THiZkhL8979jjHF1NfbwwHPn4qQkvHUrnjABh4ZimQxjjO/fxwIBHjfux/S0t8dhYTgjAysURimhvb09NDQUIWRnZ3fw4EGjnPPevXsCgcDFxYVIT3t7+6ioqJycHGJj1ucpLy8ntsX64YcfjFIGoDuIURqTyWQBAQEIoZCQEIWR0uoXLFyIIyL+l4xPnmA3N5ySgk+f/jE9EcL+/virr3B7u9EvrlQqNQ+28vl8ncX94evs7BSJRHPnztWsd/n6+gqFwra2tl88inhxAIvFYrPZ/v7+jx49GlkNgEkgRmmMeNe8p6dnuwkyawgPH2KEcFnZzxo//RRPn457e7GHB+bzcWmpqas4ceIEsfizaNGilpaW4R+oUqny8/M3btyoWTtydnbm8/nl5eX6j7p06VJ0dDQxc4IQGjt2bFxcHLFPiru7+40bNwz+nQC9QYzS2MOHDxcuXHj37l0zXS83F7NYPw7hNbKzMYuFlUpsxjsoy8vLJ0+eTExiDmdkLRaLhULhlClTNGtHISEhR48e1b/eRRxF3Io7+CiJREI8yGRvb/+Pf/zDaL8boCGIURpQqVQLFizQjsunT58uWLDg8ePHZq3j/HlsZYV1htK5uRgh3UbTa21tfe2114j7E44dO6bnm93d3ZqO5PTp03fu3NnU1KTn+zKZLCMjIyQkRLOly6RJkwQCQUNDg843FQqFUSYZAN1BjNKAUqlECBUXF2taxGIxQmjw/9imVVGBEcIPHvysce9e7OFh1jJ+IpfLt2zZgn56j7SedaHNmzdv3rz52rVrap37Cn6utLQ0MTFR8/ISNpsdFRWVn5+v/6jjx48TswSLFy9++vTpyH8fQFsQozRAlRhVqbCnJ3733f+1KBR41iy8fbtZy/g5kUhEPJi/YsWKwY8bDUdHR4dIJPLz89OsOM2bN2/Pnj3Dn3EuKysjpkonTZpUavrZYUA1EKM0QJUYxRjn52M2G/P5+Nw5fOIEXrQIe3pivQvcZlBYWEg8pD99+vT79+8P8yhixSkqKsrOzo5IzzFjxvD5/Dt37oyghubm5oULFyKEHBwcTp8+PYIzAPqCGKUBIkbHjBnj+hPixRUkxCjGuKIC/9//4aAg/PrrODnZFDc2jUBjYyNxKxKHw8nOztb/5ZqamuTkZGKRSs/2KC9KLpe//fbbmkkG2LXEckCM0gARo2fPnm34SXFxMWkxSlUymWzDhg2aFBs8odnX16ezdsTj8ZKTk41776dmkmHlypUjm2QAtAMxSgMUGtRTm/ZWJtHR0VKplGgvLS3l8/kcDodITw6HQ2yPon/taMSuXbtGPObk7e1dWVlpiksASoEYpQGI0Rdy8eJFJycnhNDMmTM/+OADb29vIj1ZLNaSJUuOHDmiiVfTEYvFxCQDl8s9d+6cqS8HyAUxSgMQoy/qwYMHPj4+mq1G3NzcBALBA51btUyst7c3MjKSiO/k5GQT9XwBFUCM0oBarU5PT5dIJJqWvr6+9PR08+y/SVM3btwgHvfMzc3Vv9WI6WhPMqxbtw7+vZiKhTFGADDOmTNnIiMjw8PDc3JyyK3k4sWLsbGx3d3dfn5+WVlZmmdSAWPAC5YBM1HnPfKrVq0qKSnx8fG5c+dOQEDA1atXya4IGBnEKGAmSr1H3tvb+9atW+Hh4RKJZNmyZampqWRXBIwJYhQwE3V6owQul5uVlfXee+8plcrPPvvs/fffX7VqlfYX+Hw+sUUAoB0bsgsAwPgwxg8ePEBUilGEkLW19eeff+7v78/lcktKSlQqlfZPVSqVTgugC4hRwEBisVgqlU6YMMHZ2ZnsWnTFxcUhhEpKSsguBBgNxChgIEpNjD5Pf39/U1OT5mNfX59mX1RALxCjgIGoNjE6pOLiYu3d+aRSaUxMDIn1gBGDJSbAQESMUrw3unTpUokWYrAP6AhiFDAQMaineG8UMAbEKGAgWvRGAWNAjAKmaW9vb2trc3R0nDhxItm1AIsAz9QDpikqKlq8eHFAQACVbyrq7OyUy+Vubm6alra2NoQQ8V4DQC+wUg+YhhZ3Ow2+oRUClL5gUA+YhhZ3OwEmgRgFTEOL3ihgEohRwDTQGwVmBktMgFFkMpmjo6O1tfWzZ8+IN3QCYGrQGwWMUlNTo1arvby8IEOB2UCMAkaBiVFgfhCjgFFgYhSYH8QoYBTojQLzgxgFjAK9UWB+sFIPmEOlUjk6Ovb393d3d3M4HLLLAZYCeqOAORoaGuRyuYeHB2QoMCd4ph4wh4eHx61bt7q6usguBFgWGNQD2tu8ebObm5tQKNS0LF++fOXKlX/4wx9IrApYDhjUA9p79uyZTCbTbpFKpXK5nKx6gKWBGAUAAIPA3ChggoGBAe0pUZVKRWIxwNJAbxQwwcGDBydoofK+94B5IEYBE2zbtk2uJTAwkOyKgAWBGAUAAINAjAIAgEEgRgEAwCBw+z2gvUePHtna2rq7u2taamtruVzu+PHjSawKWA6IUQAAMAgM6gEAwCAQowAAYBCIUQAAMAjEKAAAGARiFAAADPL/hhiILBNRxe0AAAEuelRYdHJka2l0UEtMIHJka2l0IDIwMjAuMDkuMQAAeJx7v2/tPQYg4AFiRgYIEIDiBkY2hQQgzcLMoaABpJmZ2BLANAtbQgaYZiSGwcgA0sRANs0NdBgjkwITcwYTM0sCC2sGEytbAht7BhM7UwIDBwMDJwMDFwMzNwMLDwMrLwMbHwM7P4MIIxsTOxsrC7M4zFMMAg93Wx64qSi/D8RRD7u3X/JSz34Q20hnzb5mFwEw+6bEub0vv2XZg9i9mcvsfbR3gdlTjso63K1iArOvbOBz6D9QAVYvqxtiLy9wEMwOV2s64CbsBVZzwajswDXWlWDxJ52/9ifYNoLFNZkX7Q/KfAdm80w+Yt/4xNoBxFbMLndwe9sKFl/kGOmg6vcVrFf+lrj9qzD7AyC2GAAyiEokRnv0agAAAT56VFh0TU9MIHJka2l0IDIwMjAuMDkuMQAAeJydlE1uxCAMhfc5BRco8g829roZqdJoWqmL3qH73l81IWKo1EpTIpQ8x+HDPAJbatf7fv38SuOifdsSamsJfm3unj4IALb4/ImyA2FTkFGkNAbkyEJ6Tn8h5nZQMFeu0BUC0ER5e5wCmVm5K1GWtVqgVaC9r2O1JUrCzADYVZGy5kuiXFRONwS8rlKIXPrcvOIiBbKRWV8jAeM1d0sGreeMqvnsy8vjFM5W1HstTCBrFMwulfsawU93/0UhldoppqRLlOgr3Cmxo1hsjRK+qPg5o6K8SmEvejqEurZG7Y91pvOMsDV3YwPRcW9BKB5BqHK8akEoGZlQOjKh6siEspGxmRYPnwKEOcARlIQ0jYN3QByYZRoH7+XYcZQewS2ly+u+fQOO2de9r7pR/gAAARZ6VFh0U01JTEVTIHJka2l0IDIwMjAuMDkuMQAAeJxdkL1uAkEMhF8lJUiL5Z+114YyDamSHlFEVyEFgRJKHj72SZFy1/h2rPHn8Z2O54mmzel43v7V99f5MZd/fcr68twIuGlQI8Bu0g4M3ZS8ISiG+WgHAkEsQ9fetbSKjt4YQtS5HXYIhGgiORQ0PCk7AjYdnFNurDGbRIyHtnypiRYqbUNGy08CyLKRUGSMMpFqx2J1QBtzpOG5MiPtMnU315oUxh4zKnRkhjwkg2cHwdmdpEyKlSoXh1CmqjWe19W5zKG99sUg82wJSNSvKCJZxty2z8ft+vF9u+8RLj9v1/vXZbo8gPaylLqUsZS0GiZa6RWNlrjnL7QIdND5sOWjAAAAAElFTkSuQmCC\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/BNZ.mae b/peleffy/data/ligands/BNZ.mae deleted file mode 100644 index 04bae5a6..00000000 --- a/peleffy/data/ligands/BNZ.mae +++ /dev/null @@ -1,184 +0,0 @@ -{ - s_m_m2io_version - ::: - 2.0.0 -} - -f_m_ct { - s_m_title - s_m_entry_id - s_m_entry_name - s_pdb_PDB_TITLE - s_pdb_PDB_ID - r_pdb_PDB_CRYST1_a - r_pdb_PDB_CRYST1_b - r_pdb_PDB_CRYST1_c - r_pdb_PDB_CRYST1_alpha - r_pdb_PDB_CRYST1_beta - r_pdb_PDB_CRYST1_gamma - s_pdb_PDB_CRYST1_Space_Group - i_pdb_PDB_CRYST1_z - s_pdb_PDB_CLASSIFICATION - s_pdb_PDB_DEPOSITION_DATE - s_pdb_PDB_format_version - r_pdb_PDB_R - r_pdb_PDB_Rfree - r_pdb_PDB_RESOLUTION - s_pdb_PDB_EXPDTA - r_pdb_PDB_EXPDTA_TEMPERATURE - r_pdb_PDB_EXPDTA_PH - s_pdb_PDB_REMARK_350_Biomolecule_1_Chains - s_pdb_PDB_REMARK_350_Biomolecule_1_Transformation_1 - s_m_Source_Path - s_m_Source_File - i_m_Source_File_Index - s_ppw_entry_id_backup - b_ppw_prepared - s_ppw_prepared_with_version - b_ppw_assigned_bond_orders - b_ppw_added_hydrogens - b_ppw_treated_metals - b_ppw_created_disulfur - b_ppw_deleted_far_waters - i_psp_model_num - r_psp_Prime_Coulomb - r_psp_Prime_Covalent - r_psp_Prime_Solv_GB - r_psp_Prime_Lipo - s_psp_Prime_Energy_Force_Field - s_psp_Prime_Energy_Solvent_Model - r_psp_Prime_Hbond - r_psp_Prime_Packing - r_psp_Prime_SelfCont - i_m_ct_format - ::: - "4W52 - preprocessed" - 4 - 4w52.1 - "T4 LYSOZYME L99A WITH BENZENE BOUND" - 4W52 - 60.35 - 60.35 - 96.61 - 90 - 90 - 120 - "P 32 2 1" - 6 - HYDROLASE - 16-AUG-14 - 3.30 - 0.165000006556511 - 0.181999996304512 - 1.5 - "X-RAY DIFFRACTION" - 100 - 7.5 - A - "1.000000 0.000000 0.000000 0.000000;0.000000 1.000000 0.000000 0.000000;0.000000 0.000000 1.000000 0.000000" - /home/municoy/builds/PELE/FEPSimulation - 4w52.pdb - 1 - 2 - 1 - 2018-2 - 1 - 1 - 1 - 1 - 1 - 0 - inf - 687.113646057117 - -1117.61415217671 - -410.651549686176 - OPLS3e - VSGB2.1 - -107.883308693242 - -14.5414873816691 - -34.8272744969634 - 2 - m_atom[12] { - # First column is atom index # - i_m_mmod_type - r_m_x_coord - r_m_y_coord - r_m_z_coord - i_m_residue_number - s_m_chain_name - i_m_color - r_m_charge1 - r_m_charge2 - s_m_pdb_residue_name - s_m_pdb_atom_name - i_m_atomic_number - i_m_representation - s_m_color_rgb - s_m_atom_name - s_m_label_format - i_m_label_color - s_m_label_user_text - r_m_pdb_occupancy - r_m_pdb_tfactor - i_m_Hcount - i_m_pdb_convert_problem - i_pdb_PDB_serial - i_ppw_anum - i_ppw_het - i_psp_resnum - s_ppw_CCD_assignment_status - ::: - 1 2 -32.969000 6.196000 2.877000 1 L 10 -0.12885 -0.12885 "BNZ " " C1 " 6 3 1EE11E "C1288" "%UT" 10 "" 0.7 15.06 1 4 1360 1309 3 200 "CCD match" - 2 2 -32.945000 7.046000 3.973000 1 L 10 -0.12885 -0.12885 "BNZ " " C2 " 6 3 1EE11E "C1289" "%UT" 10 "" 0.7 12.84 1 4 1361 1310 3 200 "CCD match" - 3 2 -33.719000 6.798000 5.113000 1 L 10 -0.12885 -0.12885 "BNZ " " C3 " 6 3 1EE11E "C1290" "%UT" 10 "" 0.7 12.24 1 4 1362 1311 3 200 "CCD match" - 4 2 -34.540000 5.680000 5.143000 1 L 10 -0.12885 -0.12885 "BNZ " " C4 " 6 3 1EE11E "C1291" "%UT" 10 "" 0.7 13.09 1 4 1363 1312 3 200 "CCD match" - 5 2 -34.545000 4.825000 4.044000 1 L 10 -0.12885 -0.12885 "BNZ " " C5 " 6 3 1EE11E "C1292" "%UT" 10 "" 0.7 12.54 1 4 1364 1313 3 200 "CCD match" - 6 2 -33.787000 5.069000 2.915000 1 L 10 -0.12885 -0.12885 "BNZ " " C6 " 6 3 1EE11E "C1293" "%UT" 10 "" 0.7 14.23 1 4 1365 1314 3 200 "CCD match" - 7 41 -32.359568 6.412714 2.012114 1 L 21 0.12885 0.12885 "BNZ " " H1 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> - 8 41 -32.318044 7.925305 3.960797 1 L 21 0.12885 0.12885 "BNZ " " H2 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> - 9 41 -33.672323 7.473059 5.954735 1 L 21 0.12885 0.12885 "BNZ " " H3 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> - 10 41 -35.158445 5.487222 6.007154 1 L 21 0.12885 0.12885 "BNZ " " H4 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> - 11 41 -35.156258 3.934698 4.055241 1 L 21 0.12885 0.12885 "BNZ " " H5 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> - 12 41 -33.822915 4.399036 2.068680 1 L 21 0.12885 0.12885 "BNZ " " H6 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> - ::: - } - m_bond[12] { - # First column is bond index # - i_m_from - i_m_to - i_m_order - i_m_from_rep - i_m_to_rep - ::: - 1 1 2 2 3 3 - 2 1 6 1 3 3 - 3 1 7 1 3 3 - 4 2 3 1 3 3 - 5 2 8 1 3 3 - 6 3 4 2 3 3 - 7 3 9 1 3 3 - 8 4 5 1 3 3 - 9 4 10 1 3 3 - 10 5 6 2 3 3 - 11 5 11 1 3 3 - 12 6 12 1 3 3 - ::: - } - m_PDB_SEQRES[1] { - s_pdb_chain_id - s_pdb_SEQRES - ::: - 1 A "MET ASN ILE PHE GLU MET LEU ARG ILE ASP GLU GLY LEU ARG LEU LYS ILE TYR LYS ASP THR GLU GLY TYR TYR THR ILE GLY ILE GLY HIS LEU LEU THR LYS SER PRO SER LEU ASN ALA ALA LYS SER GLU LEU ASP LYS ALA ILE GLY ARG ASN CYS ASN GLY VAL ILE THR LYS ASP GLU ALA GLU LYS LEU PHE ASN GLN ASP VAL ASP ALA ALA VAL ARG GLY ILE LEU ARG ASN ALA LYS LEU LYS PRO VAL TYR ASP SER LEU ASP ALA VAL ARG ARG CYS ALA ALA ILE ASN MET VAL PHE GLN MET GLY GLU THR GLY VAL ALA GLY PHE THR ASN SER LEU ARG MET LEU GLN GLN LYS ARG TRP ASP GLU ALA ALA VAL ASN LEU ALA LYS SER ARG TRP TYR ASN GLN THR PRO ASN ARG ALA LYS ARG VAL ILE THR THR PHE ARG THR GLY THR TRP ASP ALA TYR LYS ASN LEU LEU GLU HIS HIS HIS HIS HIS HIS " - ::: - } - m_PDB_het_residues[2] { - s_pdb_het_id - s_pdb_het_name - s_pdb_het_formula - ::: - 1 BNZ "BENZENE" "C6 H6" - 2 EPE "4-(2-HYDROXYETHYL)-1-PIPERAZINE ETHANESULFONIC ACID" "C8 H18 N2 O4 S" - ::: - } -} - diff --git a/peleffy/data/ligands/BNZ.pdb b/peleffy/data/ligands/BNZ.pdb deleted file mode 100644 index cdcfdcd0..00000000 --- a/peleffy/data/ligands/BNZ.pdb +++ /dev/null @@ -1,53 +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 12 -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 H1 BNZ L 1 -32.360 6.413 2.012 1.00 0.00 H -HETATM 8 H2 BNZ L 1 -32.318 7.925 3.961 1.00 0.00 H -HETATM 9 H3 BNZ L 1 -33.672 7.473 5.955 1.00 0.00 H -HETATM 10 H4 BNZ L 1 -35.158 5.487 6.007 1.00 0.00 H -HETATM 11 H5 BNZ L 1 -35.156 3.935 4.055 1.00 0.00 H -HETATM 12 H6 BNZ L 1 -33.823 4.399 2.069 1.00 0.00 H -CONECT 1 2 6 7 -CONECT 1 2 -CONECT 2 1 3 8 -CONECT 2 1 -CONECT 3 2 4 9 -CONECT 3 4 -CONECT 4 3 5 10 -CONECT 4 3 -CONECT 5 4 6 11 -CONECT 5 6 -CONECT 6 1 5 12 -CONECT 6 5 -CONECT 7 1 -CONECT 8 2 -CONECT 9 3 -CONECT 10 4 -CONECT 11 5 -CONECT 12 6 -ENDMDL -END diff --git a/peleffy/data/ligands/BNZ_without_connectivity.pdb b/peleffy/data/ligands/BNZ_without_connectivity.pdb deleted file mode 100644 index f1714275..00000000 --- a/peleffy/data/ligands/BNZ_without_connectivity.pdb +++ /dev/null @@ -1,35 +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 12 -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 H1 BNZ L 1 -32.360 6.413 2.012 1.00 0.00 H -HETATM 8 H2 BNZ L 1 -32.318 7.925 3.961 1.00 0.00 H -HETATM 9 H3 BNZ L 1 -33.672 7.473 5.955 1.00 0.00 H -HETATM 10 H4 BNZ L 1 -35.158 5.487 6.007 1.00 0.00 H -HETATM 11 H5 BNZ L 1 -35.156 3.935 4.055 1.00 0.00 H -HETATM 12 H6 BNZ L 1 -33.823 4.399 2.069 1.00 0.00 H -ENDMDL -END diff --git a/peleffy/data/ligands/CO1.pdb b/peleffy/data/ligands/CO1.pdb deleted file mode 100644 index da763bc8..00000000 --- a/peleffy/data/ligands/CO1.pdb +++ /dev/null @@ -1,18 +0,0 @@ -HETATM 1 C1 UNK 1 -0.807 -0.654 0.243 1.00 0.00 C -HETATM 2 C2 UNK 1 -0.676 0.799 -0.159 1.00 0.00 C -HETATM 3 C3 UNK 1 0.809 0.672 0.015 1.00 0.00 C -HETATM 4 C4 UNK 1 0.662 -0.820 -0.037 1.00 0.00 C -HETATM 5 F1 UNK 1 1.396 -1.446 0.936 1.00 0.00 F -HETATM 6 F2 UNK 1 0.884 -1.316 -1.322 1.00 0.00 F -HETATM 7 F3 UNK 1 1.581 1.120 -1.035 1.00 0.00 F -HETATM 8 F4 UNK 1 1.291 1.190 1.195 1.00 0.00 F -HETATM 9 F5 UNK 1 -1.318 1.664 0.687 1.00 0.00 F -HETATM 10 F6 UNK 1 -0.984 0.967 -1.487 1.00 0.00 F -HETATM 11 F7 UNK 1 -1.645 -1.355 -0.588 1.00 0.00 F -HETATM 12 F8 UNK 1 -1.192 -0.821 1.553 1.00 0.00 F -CONECT 1 2 4 11 12 -CONECT 2 3 9 10 -CONECT 3 4 7 8 -CONECT 4 5 6 -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/OLC.pdb b/peleffy/data/ligands/OLC.pdb deleted file mode 100644 index f6b63382..00000000 --- a/peleffy/data/ligands/OLC.pdb +++ /dev/null @@ -1,117 +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 MRO_oleic - preprocessed -MODEL 1 -HETATM 1 C2 OLC L 1 4.148 7.353 -18.237 1.00 0.00 C -HETATM 2 C1 OLC L 1 2.819 7.913 -18.760 1.00 0.00 C -HETATM 3 C3 OLC L 1 4.336 5.840 -18.529 1.00 0.00 C -HETATM 4 O1 OLC L 1 1.997 8.332 -17.914 1.00 0.00 O -HETATM 5 O2 OLC L 1 2.619 7.886 -19.995 1.00 0.00 O1- -HETATM 6 C4 OLC L 1 3.226 4.913 -17.967 1.00 0.00 C -HETATM 7 C5 OLC L 1 3.428 3.426 -18.324 1.00 0.00 C -HETATM 8 C6 OLC L 1 2.293 2.492 -17.836 1.00 0.00 C -HETATM 9 C7 OLC L 1 2.536 1.015 -18.229 1.00 0.00 C -HETATM 10 C8 OLC L 1 1.783 -0.056 -17.392 1.00 0.00 C -HETATM 11 C9 OLC L 1 2.501 -1.407 -17.407 1.00 0.00 C -HETATM 12 C10 OLC L 1 2.074 -2.659 -17.133 1.00 0.00 C -HETATM 13 C11 OLC L 1 0.708 -3.141 -16.670 1.00 0.00 C -HETATM 14 C12 OLC L 1 -0.251 -3.573 -17.803 1.00 0.00 C -HETATM 15 C13 OLC L 1 -0.435 -2.432 -18.806 1.00 0.00 C -HETATM 16 C14 OLC L 1 -1.522 -2.562 -19.874 1.00 0.00 C -HETATM 17 C15 OLC L 1 -1.587 -1.234 -20.659 1.00 0.00 C -HETATM 18 C16 OLC L 1 -2.964 -0.881 -21.233 1.00 0.00 C -HETATM 19 C17 OLC L 1 -2.994 0.581 -21.715 1.00 0.00 C -HETATM 20 C18 OLC L 1 -4.370 1.021 -22.222 1.00 0.00 C -HETATM 21 H1 OLC L 1 4.953 7.921 -18.708 1.00 0.00 H -HETATM 22 H2 OLC L 1 4.242 7.560 -17.172 1.00 0.00 H -HETATM 23 H3 OLC L 1 4.417 5.705 -19.610 1.00 0.00 H -HETATM 24 H4 OLC L 1 5.305 5.541 -18.122 1.00 0.00 H -HETATM 25 H5 OLC L 1 3.168 5.041 -16.885 1.00 0.00 H -HETATM 26 H6 OLC L 1 2.260 5.241 -18.354 1.00 0.00 H -HETATM 27 H7 OLC L 1 3.528 3.341 -19.407 1.00 0.00 H -HETATM 28 H8 OLC L 1 4.382 3.100 -17.908 1.00 0.00 H -HETATM 29 H9 OLC L 1 2.207 2.594 -16.755 1.00 0.00 H -HETATM 30 H10 OLC L 1 1.338 2.828 -18.243 1.00 0.00 H -HETATM 31 H11 OLC L 1 2.303 0.878 -19.287 1.00 0.00 H -HETATM 32 H12 OLC L 1 3.609 0.837 -18.162 1.00 0.00 H -HETATM 33 H13 OLC L 1 1.694 0.260 -16.354 1.00 0.00 H -HETATM 34 H14 OLC L 1 0.765 -0.137 -17.754 1.00 0.00 H -HETATM 35 H15 OLC L 1 3.532 -1.332 -17.691 1.00 0.00 H -HETATM 36 H16 OLC L 1 2.801 -3.444 -17.245 1.00 0.00 H -HETATM 37 H17 OLC L 1 0.860 -3.979 -15.988 1.00 0.00 H -HETATM 38 H18 OLC L 1 0.249 -2.379 -16.052 1.00 0.00 H -HETATM 39 H19 OLC L 1 0.119 -4.466 -18.306 1.00 0.00 H -HETATM 40 H20 OLC L 1 -0.682 -1.556 -18.213 1.00 0.00 H -HETATM 41 H21 OLC L 1 -1.314 -3.400 -20.542 1.00 0.00 H -HETATM 42 H22 OLC L 1 -2.477 -2.781 -19.397 1.00 0.00 H -HETATM 43 H23 OLC L 1 -1.295 -0.409 -20.004 1.00 0.00 H -HETATM 44 H24 OLC L 1 -0.835 -1.239 -21.451 1.00 0.00 H -HETATM 45 H25 OLC L 1 -3.211 -1.562 -22.049 1.00 0.00 H -HETATM 46 H26 OLC L 1 -3.725 -1.022 -20.464 1.00 0.00 H -HETATM 47 H27 OLC L 1 -2.697 1.242 -20.897 1.00 0.00 H -HETATM 48 H28 OLC L 1 -2.249 0.727 -22.499 1.00 0.00 H -HETATM 49 H29 OLC L 1 -4.348 2.068 -22.528 1.00 0.00 H -HETATM 50 H30 OLC L 1 -4.680 0.430 -23.084 1.00 0.00 H -HETATM 51 H31 OLC L 1 -5.129 0.919 -21.446 1.00 0.00 H -HETATM 52 H32 OLC L 1 -1.213 -3.839 -17.365 1.00 0.00 H -HETATM 53 H33 OLC L 1 0.515 -2.220 -19.298 1.00 0.00 H -CONECT 1 2 3 21 22 -CONECT 2 1 4 5 -CONECT 2 4 -CONECT 3 1 6 23 24 -CONECT 4 2 -CONECT 4 2 -CONECT 5 2 -CONECT 6 3 7 25 26 -CONECT 7 6 8 27 28 -CONECT 8 7 9 29 30 -CONECT 9 8 10 31 32 -CONECT 10 9 11 33 34 -CONECT 11 10 12 35 -CONECT 11 12 -CONECT 12 11 13 36 -CONECT 12 11 -CONECT 13 12 14 37 38 -CONECT 14 13 15 39 52 -CONECT 15 14 16 40 53 -CONECT 16 15 17 41 42 -CONECT 17 16 18 43 44 -CONECT 18 17 19 45 46 -CONECT 19 18 20 47 48 -CONECT 20 19 49 50 51 -CONECT 21 1 -CONECT 22 1 -CONECT 23 3 -CONECT 24 3 -CONECT 25 6 -CONECT 26 6 -CONECT 27 7 -CONECT 28 7 -CONECT 29 8 -CONECT 30 8 -CONECT 31 9 -CONECT 32 9 -CONECT 33 10 -CONECT 34 10 -CONECT 35 11 -CONECT 36 12 -CONECT 37 13 -CONECT 38 13 -CONECT 39 14 -CONECT 40 15 -CONECT 41 16 -CONECT 42 16 -CONECT 43 17 -CONECT 44 17 -CONECT 45 18 -CONECT 46 18 -CONECT 47 19 -CONECT 48 19 -CONECT 49 20 -CONECT 50 20 -CONECT 51 20 -CONECT 52 14 -CONECT 53 15 -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/TOL.mae b/peleffy/data/ligands/TOL.mae deleted file mode 100644 index 32786bb4..00000000 --- a/peleffy/data/ligands/TOL.mae +++ /dev/null @@ -1,190 +0,0 @@ -{ - s_m_m2io_version - ::: - 2.0.0 -} - -f_m_ct { - s_m_title - s_m_entry_id - s_m_entry_name - s_pdb_PDB_TITLE - s_pdb_PDB_ID - r_pdb_PDB_CRYST1_a - r_pdb_PDB_CRYST1_b - r_pdb_PDB_CRYST1_c - r_pdb_PDB_CRYST1_alpha - r_pdb_PDB_CRYST1_beta - r_pdb_PDB_CRYST1_gamma - s_pdb_PDB_CRYST1_Space_Group - i_pdb_PDB_CRYST1_z - s_pdb_PDB_CLASSIFICATION - s_pdb_PDB_DEPOSITION_DATE - s_pdb_PDB_format_version - r_pdb_PDB_R - r_pdb_PDB_Rfree - r_pdb_PDB_RESOLUTION - s_pdb_PDB_EXPDTA - r_pdb_PDB_EXPDTA_TEMPERATURE - r_pdb_PDB_EXPDTA_PH - s_pdb_PDB_REMARK_350_Biomolecule_1_Chains - s_pdb_PDB_REMARK_350_Biomolecule_1_Transformation_1 - s_m_Source_Path - s_m_Source_File - i_m_Source_File_Index - s_ppw_entry_id_backup - b_ppw_prepared - s_ppw_prepared_with_version - b_ppw_assigned_bond_orders - b_ppw_added_hydrogens - b_ppw_treated_metals - b_ppw_created_disulfur - b_ppw_deleted_far_waters - i_psp_model_num - r_psp_Prime_Coulomb - r_psp_Prime_Covalent - r_psp_Prime_Solv_GB - r_psp_Prime_Lipo - s_psp_Prime_Energy_Force_Field - s_psp_Prime_Energy_Solvent_Model - r_psp_Prime_Hbond - r_psp_Prime_Packing - r_psp_Prime_SelfCont - i_m_ct_format - ::: - "4W52 - preprocessed" - 3 - 4w52.1 - "T4 LYSOZYME L99A WITH BENZENE BOUND" - 4W52 - 60.35 - 60.35 - 96.61 - 90 - 90 - 120 - "P 32 2 1" - 6 - HYDROLASE - 16-AUG-14 - 3.30 - 0.165000006556511 - 0.181999996304512 - 1.5 - "X-RAY DIFFRACTION" - 100 - 7.5 - A - "1.000000 0.000000 0.000000 0.000000;0.000000 1.000000 0.000000 0.000000;0.000000 0.000000 1.000000 0.000000" - /home/municoy/builds/PELE/FEPSimulation - 4w52.pdb - 1 - 2 - 1 - 2018-2 - 1 - 1 - 1 - 1 - 1 - 0 - inf - 687.113646057117 - -1117.61415217671 - -410.651549686176 - OPLS3e - VSGB2.1 - -107.883308693242 - -14.5414873816691 - -34.8272744969634 - 2 - m_atom[15] { - # First column is atom index # - i_m_mmod_type - r_m_x_coord - r_m_y_coord - r_m_z_coord - i_m_residue_number - s_m_chain_name - i_m_color - r_m_charge1 - r_m_charge2 - s_m_pdb_residue_name - s_m_pdb_atom_name - i_m_atomic_number - i_m_representation - s_m_color_rgb - s_m_atom_name - s_m_label_format - i_m_label_color - s_m_label_user_text - r_m_pdb_occupancy - r_m_pdb_tfactor - i_m_Hcount - i_m_pdb_convert_problem - i_pdb_PDB_serial - i_ppw_anum - i_ppw_het - i_psp_resnum - s_ppw_CCD_assignment_status - ::: - 1 2 -32.969000 6.196000 2.877000 1 P 134 -0.12885 -0.12885 "TOL " " C1 " 6 3 96FF2E "C1288" "%UT" 134 "" 0.7 15.06 1 4 1360 1309 3 200 "CCD match" - 2 2 -32.945000 7.046000 3.973000 1 P 134 -0.12885 -0.12885 "TOL " " C2 " 6 3 96FF2E "C1289" "%UT" 134 "" 0.7 12.84 1 4 1361 1310 3 200 "CCD match" - 3 2 -33.719000 6.798000 5.113000 1 P 134 -0.12885 -0.12885 "TOL " " C3 " 6 3 96FF2E "C1290" "%UT" 134 "" 0.7 12.24 1 4 1362 1311 3 200 "CCD match" - 4 2 -34.540000 5.680000 5.143000 1 P 134 -0.12885 -0.12885 "TOL " " C4 " 6 3 96FF2E "C1291" "%UT" 134 "" 0.7 13.09 1 4 1363 1312 3 200 "CCD match" - 5 2 -34.545000 4.825000 4.044000 1 P 134 -0.12885 -0.12885 "TOL " " C5 " 6 3 96FF2E "C1292" "%UT" 134 "" 0.7 12.54 1 4 1364 1313 3 200 "CCD match" - 6 2 -33.787000 5.069000 2.915000 1 P 134 -0.12885 -0.12885 "TOL " " C6 " 6 3 96FF2E "C1293" "%UT" 134 "" 0.7 14.23 1 4 1365 1314 3 200 "CCD match" - 7 3 -32.099995 6.505018 1.643737 1 P 134 0.12885 0.12885 "TOL " " C7 " 6 3 96FF2E "C2625" "" 134 "" <> <> 0 <> <> <> <> 200 <> - 8 41 -32.318044 7.925305 3.960797 1 P 134 0.12885 0.12885 "TOL " " H1 " 1 3 96FF2E "" "" 134 "" <> <> 0 <> <> <> <> 200 <> - 9 41 -33.672323 7.473059 5.954735 1 P 134 0.12885 0.12885 "TOL " " H2 " 1 3 96FF2E "" "" 134 "" <> <> 0 <> <> <> <> 200 <> - 10 41 -35.158445 5.487222 6.007154 1 P 134 0.12885 0.12885 "TOL " " H3 " 1 3 96FF2E "" "" 134 "" <> <> 0 <> <> <> <> 200 <> - 11 41 -35.156258 3.934698 4.055241 1 P 134 0.12885 0.12885 "TOL " " H4 " 1 3 96FF2E "" "" 134 "" <> <> 0 <> <> <> <> 200 <> - 12 41 -33.822915 4.399036 2.068680 1 P 134 0.12885 0.12885 "TOL " " H5 " 1 3 96FF2E "" "" 134 "" <> <> 0 <> <> <> <> 200 <> - 13 41 -32.249950 5.732008 0.890034 1 P 134 0.00000 0.00000 "TOL " " H6 " 1 3 96FF2E "" "" 134 "" <> <> <> <> <> <> <> <> <> - 14 41 -32.384126 7.473364 1.231819 1 P 134 0.00000 0.00000 "TOL " " H7 " 1 3 96FF2E "" "" 134 "" <> <> <> <> <> <> <> <> <> - 15 41 -31.049960 6.528714 1.935224 1 P 134 0.00000 0.00000 "TOL " " H8 " 1 3 96FF2E "" "" 134 "" <> <> <> <> <> <> <> <> <> - ::: - } - m_bond[15] { - # First column is bond index # - i_m_from - i_m_to - i_m_order - i_m_from_rep - i_m_to_rep - ::: - 1 1 2 2 3 3 - 2 1 6 1 3 3 - 3 1 7 1 3 3 - 4 2 3 1 3 3 - 5 2 8 1 3 3 - 6 3 4 2 3 3 - 7 3 9 1 3 3 - 8 4 5 1 3 3 - 9 4 10 1 3 3 - 10 5 6 2 3 3 - 11 5 11 1 3 3 - 12 6 12 1 3 3 - 13 7 13 1 3 3 - 14 7 14 1 3 3 - 15 7 15 1 3 3 - ::: - } - m_PDB_SEQRES[1] { - s_pdb_chain_id - s_pdb_SEQRES - ::: - 1 A "MET ASN ILE PHE GLU MET LEU ARG ILE ASP GLU GLY LEU ARG LEU LYS ILE TYR LYS ASP THR GLU GLY TYR TYR THR ILE GLY ILE GLY HIS LEU LEU THR LYS SER PRO SER LEU ASN ALA ALA LYS SER GLU LEU ASP LYS ALA ILE GLY ARG ASN CYS ASN GLY VAL ILE THR LYS ASP GLU ALA GLU LYS LEU PHE ASN GLN ASP VAL ASP ALA ALA VAL ARG GLY ILE LEU ARG ASN ALA LYS LEU LYS PRO VAL TYR ASP SER LEU ASP ALA VAL ARG ARG CYS ALA ALA ILE ASN MET VAL PHE GLN MET GLY GLU THR GLY VAL ALA GLY PHE THR ASN SER LEU ARG MET LEU GLN GLN LYS ARG TRP ASP GLU ALA ALA VAL ASN LEU ALA LYS SER ARG TRP TYR ASN GLN THR PRO ASN ARG ALA LYS ARG VAL ILE THR THR PHE ARG THR GLY THR TRP ASP ALA TYR LYS ASN LEU LEU GLU HIS HIS HIS HIS HIS HIS " - ::: - } - m_PDB_het_residues[2] { - s_pdb_het_id - s_pdb_het_name - s_pdb_het_formula - ::: - 1 BNZ "BENZENE" "C6 H6" - 2 EPE "4-(2-HYDROXYETHYL)-1-PIPERAZINE ETHANESULFONIC ACID" "C8 H18 N2 O4 S" - ::: - } -} - diff --git a/peleffy/data/ligands/TOL.pdb b/peleffy/data/ligands/TOL.pdb deleted file mode 100644 index a02000d6..00000000 --- a/peleffy/data/ligands/TOL.pdb +++ /dev/null @@ -1,59 +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 15 -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 H1 BNZ L 1 -32.360 6.413 2.012 1.00 0.00 H -HETATM 9 H2 BNZ L 1 -32.318 7.925 3.961 1.00 0.00 H -HETATM 10 H4 BNZ L 1 -35.158 5.487 6.007 1.00 0.00 H -HETATM 11 H5 BNZ L 1 -35.156 3.935 4.055 1.00 0.00 H -HETATM 12 H6 BNZ L 1 -33.823 4.399 2.069 1.00 0.00 H -HETATM 13 H7 BNZ L 1 -34.318 7.407 7.101 1.00 0.00 H -HETATM 14 H8 BNZ L 1 -32.631 7.799 6.692 1.00 0.00 H -HETATM 15 H9 BNZ L 1 -33.960 8.757 5.998 1.00 0.00 H -CONECT 1 2 6 8 -CONECT 1 2 -CONECT 2 1 3 9 -CONECT 2 1 -CONECT 3 2 4 7 -CONECT 3 4 -CONECT 4 3 5 10 -CONECT 4 3 -CONECT 5 4 6 11 -CONECT 5 6 -CONECT 6 1 5 12 -CONECT 6 5 -CONECT 8 1 -CONECT 9 2 -CONECT 7 3 13 14 15 -CONECT 10 4 -CONECT 11 5 -CONECT 12 6 -CONECT 13 7 -CONECT 14 7 -CONECT 15 7 -ENDMDL -END diff --git a/peleffy/main.py b/peleffy/main.py index 9ba9c58a..b9752f1b 100644 --- a/peleffy/main.py +++ b/peleffy/main.py @@ -154,7 +154,7 @@ 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) 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_main.py b/peleffy/tests/test_main.py index df0ee39f..83af1f2a 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,7 +259,7 @@ 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]) diff --git a/peleffy/tests/test_molecule.py b/peleffy/tests/test_molecule.py index ac4b53bd..3891664b 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..47290946 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""" 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..a7eeb231 100644 --- a/peleffy/tests/test_templates.py +++ b/peleffy/tests/test_templates.py @@ -19,7 +19,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) @@ -92,7 +92,7 @@ def test_writer_OFF(self): m = Molecule(pdb_path) m.parameterize('openff_unconstrained-1.2.1.offxml') impact = Impact(m) - impact.write('metz') + impact.to_file('metz') # Compare the reference template and the generated template compare_files(file1=TEMPLATE_METZ, file2='metz') @@ -102,7 +102,7 @@ def test_writer_OFF(self): m = Molecule(pdb_path) m.parameterize('openff_unconstrained-1.2.1.offxml') impact = Impact(m) - impact.write('malz') + impact.to_file('malz') # Compare the reference template and the generated template compare_files(file1=TEMPLATE_MATZ, file2='malz') @@ -112,7 +112,7 @@ def test_writer_OFF(self): 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') + impact.to_file('etlz') # Compare the reference template and the generated template compare_files(file1=TEMPLATE_ETLZ, file2='etlz') @@ -129,7 +129,7 @@ def test_writer_OPLS(self): m = self._prepare_molecule_OPLS(pdb_name='ligands/methane.pdb', ffld_name='tests/MET_ffld_output.txt') impact = Impact(m) - impact.write('metz') + impact.to_file('metz') # Compare the reference template and the generated template compare_files(file1=TEMPLATE_METZ_OPLS, file2='metz') @@ -138,7 +138,7 @@ def test_writer_OPLS(self): m = self._prepare_molecule_OPLS(pdb_name='ligands/malonate.pdb', ffld_name='tests/MAL_ffld_output.txt') impact = Impact(m) - impact.write('malz') + impact.to_file('malz') # Compare the reference template and the generated template compare_files(file1=TEMPLATE_MALZ_OPLS, file2='malz') @@ -148,7 +148,7 @@ def test_writer_OPLS(self): ffld_name='tests/ETL_ffld_output.txt', molecule_tag='ETL') impact = Impact(m) - impact.write('etlz') + 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): From 609359949402ab8374463ed50c6730119993890e Mon Sep 17 00:00:00 2001 From: Marti Municoy Date: Wed, 4 Nov 2020 12:03:29 +0100 Subject: [PATCH 03/13] Add missing PDB files in data --- peleffy/data/ligands/benzene.mae | 184 +++++++++++++++++ peleffy/data/ligands/benzene.pdb | 53 +++++ .../ligands/benzene_without_connectivity.pdb | 35 ++++ .../data/ligands/octafluorocyclobutane.pdb | 18 ++ peleffy/data/ligands/oleic_acid.pdb | 117 +++++++++++ peleffy/data/ligands/toluene.mae | 190 ++++++++++++++++++ peleffy/data/ligands/toluene.pdb | 59 ++++++ 7 files changed, 656 insertions(+) create mode 100644 peleffy/data/ligands/benzene.mae create mode 100644 peleffy/data/ligands/benzene.pdb create mode 100644 peleffy/data/ligands/benzene_without_connectivity.pdb create mode 100644 peleffy/data/ligands/octafluorocyclobutane.pdb create mode 100644 peleffy/data/ligands/oleic_acid.pdb create mode 100644 peleffy/data/ligands/toluene.mae create mode 100644 peleffy/data/ligands/toluene.pdb diff --git a/peleffy/data/ligands/benzene.mae b/peleffy/data/ligands/benzene.mae new file mode 100644 index 00000000..04bae5a6 --- /dev/null +++ b/peleffy/data/ligands/benzene.mae @@ -0,0 +1,184 @@ +{ + s_m_m2io_version + ::: + 2.0.0 +} + +f_m_ct { + s_m_title + s_m_entry_id + s_m_entry_name + s_pdb_PDB_TITLE + s_pdb_PDB_ID + r_pdb_PDB_CRYST1_a + r_pdb_PDB_CRYST1_b + r_pdb_PDB_CRYST1_c + r_pdb_PDB_CRYST1_alpha + r_pdb_PDB_CRYST1_beta + r_pdb_PDB_CRYST1_gamma + s_pdb_PDB_CRYST1_Space_Group + i_pdb_PDB_CRYST1_z + s_pdb_PDB_CLASSIFICATION + s_pdb_PDB_DEPOSITION_DATE + s_pdb_PDB_format_version + r_pdb_PDB_R + r_pdb_PDB_Rfree + r_pdb_PDB_RESOLUTION + s_pdb_PDB_EXPDTA + r_pdb_PDB_EXPDTA_TEMPERATURE + r_pdb_PDB_EXPDTA_PH + s_pdb_PDB_REMARK_350_Biomolecule_1_Chains + s_pdb_PDB_REMARK_350_Biomolecule_1_Transformation_1 + s_m_Source_Path + s_m_Source_File + i_m_Source_File_Index + s_ppw_entry_id_backup + b_ppw_prepared + s_ppw_prepared_with_version + b_ppw_assigned_bond_orders + b_ppw_added_hydrogens + b_ppw_treated_metals + b_ppw_created_disulfur + b_ppw_deleted_far_waters + i_psp_model_num + r_psp_Prime_Coulomb + r_psp_Prime_Covalent + r_psp_Prime_Solv_GB + r_psp_Prime_Lipo + s_psp_Prime_Energy_Force_Field + s_psp_Prime_Energy_Solvent_Model + r_psp_Prime_Hbond + r_psp_Prime_Packing + r_psp_Prime_SelfCont + i_m_ct_format + ::: + "4W52 - preprocessed" + 4 + 4w52.1 + "T4 LYSOZYME L99A WITH BENZENE BOUND" + 4W52 + 60.35 + 60.35 + 96.61 + 90 + 90 + 120 + "P 32 2 1" + 6 + HYDROLASE + 16-AUG-14 + 3.30 + 0.165000006556511 + 0.181999996304512 + 1.5 + "X-RAY DIFFRACTION" + 100 + 7.5 + A + "1.000000 0.000000 0.000000 0.000000;0.000000 1.000000 0.000000 0.000000;0.000000 0.000000 1.000000 0.000000" + /home/municoy/builds/PELE/FEPSimulation + 4w52.pdb + 1 + 2 + 1 + 2018-2 + 1 + 1 + 1 + 1 + 1 + 0 + inf + 687.113646057117 + -1117.61415217671 + -410.651549686176 + OPLS3e + VSGB2.1 + -107.883308693242 + -14.5414873816691 + -34.8272744969634 + 2 + m_atom[12] { + # First column is atom index # + i_m_mmod_type + r_m_x_coord + r_m_y_coord + r_m_z_coord + i_m_residue_number + s_m_chain_name + i_m_color + r_m_charge1 + r_m_charge2 + s_m_pdb_residue_name + s_m_pdb_atom_name + i_m_atomic_number + i_m_representation + s_m_color_rgb + s_m_atom_name + s_m_label_format + i_m_label_color + s_m_label_user_text + r_m_pdb_occupancy + r_m_pdb_tfactor + i_m_Hcount + i_m_pdb_convert_problem + i_pdb_PDB_serial + i_ppw_anum + i_ppw_het + i_psp_resnum + s_ppw_CCD_assignment_status + ::: + 1 2 -32.969000 6.196000 2.877000 1 L 10 -0.12885 -0.12885 "BNZ " " C1 " 6 3 1EE11E "C1288" "%UT" 10 "" 0.7 15.06 1 4 1360 1309 3 200 "CCD match" + 2 2 -32.945000 7.046000 3.973000 1 L 10 -0.12885 -0.12885 "BNZ " " C2 " 6 3 1EE11E "C1289" "%UT" 10 "" 0.7 12.84 1 4 1361 1310 3 200 "CCD match" + 3 2 -33.719000 6.798000 5.113000 1 L 10 -0.12885 -0.12885 "BNZ " " C3 " 6 3 1EE11E "C1290" "%UT" 10 "" 0.7 12.24 1 4 1362 1311 3 200 "CCD match" + 4 2 -34.540000 5.680000 5.143000 1 L 10 -0.12885 -0.12885 "BNZ " " C4 " 6 3 1EE11E "C1291" "%UT" 10 "" 0.7 13.09 1 4 1363 1312 3 200 "CCD match" + 5 2 -34.545000 4.825000 4.044000 1 L 10 -0.12885 -0.12885 "BNZ " " C5 " 6 3 1EE11E "C1292" "%UT" 10 "" 0.7 12.54 1 4 1364 1313 3 200 "CCD match" + 6 2 -33.787000 5.069000 2.915000 1 L 10 -0.12885 -0.12885 "BNZ " " C6 " 6 3 1EE11E "C1293" "%UT" 10 "" 0.7 14.23 1 4 1365 1314 3 200 "CCD match" + 7 41 -32.359568 6.412714 2.012114 1 L 21 0.12885 0.12885 "BNZ " " H1 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> + 8 41 -32.318044 7.925305 3.960797 1 L 21 0.12885 0.12885 "BNZ " " H2 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> + 9 41 -33.672323 7.473059 5.954735 1 L 21 0.12885 0.12885 "BNZ " " H3 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> + 10 41 -35.158445 5.487222 6.007154 1 L 21 0.12885 0.12885 "BNZ " " H4 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> + 11 41 -35.156258 3.934698 4.055241 1 L 21 0.12885 0.12885 "BNZ " " H5 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> + 12 41 -33.822915 4.399036 2.068680 1 L 21 0.12885 0.12885 "BNZ " " H6 " 1 3 FFFFFF "" "" 21 "" <> <> 0 <> <> <> <> 200 <> + ::: + } + m_bond[12] { + # First column is bond index # + i_m_from + i_m_to + i_m_order + i_m_from_rep + i_m_to_rep + ::: + 1 1 2 2 3 3 + 2 1 6 1 3 3 + 3 1 7 1 3 3 + 4 2 3 1 3 3 + 5 2 8 1 3 3 + 6 3 4 2 3 3 + 7 3 9 1 3 3 + 8 4 5 1 3 3 + 9 4 10 1 3 3 + 10 5 6 2 3 3 + 11 5 11 1 3 3 + 12 6 12 1 3 3 + ::: + } + m_PDB_SEQRES[1] { + s_pdb_chain_id + s_pdb_SEQRES + ::: + 1 A "MET ASN ILE PHE GLU MET LEU ARG ILE ASP GLU GLY LEU ARG LEU LYS ILE TYR LYS ASP THR GLU GLY TYR TYR THR ILE GLY ILE GLY HIS LEU LEU THR LYS SER PRO SER LEU ASN ALA ALA LYS SER GLU LEU ASP LYS ALA ILE GLY ARG ASN CYS ASN GLY VAL ILE THR LYS ASP GLU ALA GLU LYS LEU PHE ASN GLN ASP VAL ASP ALA ALA VAL ARG GLY ILE LEU ARG ASN ALA LYS LEU LYS PRO VAL TYR ASP SER LEU ASP ALA VAL ARG ARG CYS ALA ALA ILE ASN MET VAL PHE GLN MET GLY GLU THR GLY VAL ALA GLY PHE THR ASN SER LEU ARG MET LEU GLN GLN LYS ARG TRP ASP GLU ALA ALA VAL ASN LEU ALA LYS SER ARG TRP TYR ASN GLN THR PRO ASN ARG ALA LYS ARG VAL ILE THR THR PHE ARG THR GLY THR TRP ASP ALA TYR LYS ASN LEU LEU GLU HIS HIS HIS HIS HIS HIS " + ::: + } + m_PDB_het_residues[2] { + s_pdb_het_id + s_pdb_het_name + s_pdb_het_formula + ::: + 1 BNZ "BENZENE" "C6 H6" + 2 EPE "4-(2-HYDROXYETHYL)-1-PIPERAZINE ETHANESULFONIC ACID" "C8 H18 N2 O4 S" + ::: + } +} + diff --git a/peleffy/data/ligands/benzene.pdb b/peleffy/data/ligands/benzene.pdb new file mode 100644 index 00000000..cdcfdcd0 --- /dev/null +++ b/peleffy/data/ligands/benzene.pdb @@ -0,0 +1,53 @@ +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 12 +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 H1 BNZ L 1 -32.360 6.413 2.012 1.00 0.00 H +HETATM 8 H2 BNZ L 1 -32.318 7.925 3.961 1.00 0.00 H +HETATM 9 H3 BNZ L 1 -33.672 7.473 5.955 1.00 0.00 H +HETATM 10 H4 BNZ L 1 -35.158 5.487 6.007 1.00 0.00 H +HETATM 11 H5 BNZ L 1 -35.156 3.935 4.055 1.00 0.00 H +HETATM 12 H6 BNZ L 1 -33.823 4.399 2.069 1.00 0.00 H +CONECT 1 2 6 7 +CONECT 1 2 +CONECT 2 1 3 8 +CONECT 2 1 +CONECT 3 2 4 9 +CONECT 3 4 +CONECT 4 3 5 10 +CONECT 4 3 +CONECT 5 4 6 11 +CONECT 5 6 +CONECT 6 1 5 12 +CONECT 6 5 +CONECT 7 1 +CONECT 8 2 +CONECT 9 3 +CONECT 10 4 +CONECT 11 5 +CONECT 12 6 +ENDMDL +END diff --git a/peleffy/data/ligands/benzene_without_connectivity.pdb b/peleffy/data/ligands/benzene_without_connectivity.pdb new file mode 100644 index 00000000..f1714275 --- /dev/null +++ b/peleffy/data/ligands/benzene_without_connectivity.pdb @@ -0,0 +1,35 @@ +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 12 +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 H1 BNZ L 1 -32.360 6.413 2.012 1.00 0.00 H +HETATM 8 H2 BNZ L 1 -32.318 7.925 3.961 1.00 0.00 H +HETATM 9 H3 BNZ L 1 -33.672 7.473 5.955 1.00 0.00 H +HETATM 10 H4 BNZ L 1 -35.158 5.487 6.007 1.00 0.00 H +HETATM 11 H5 BNZ L 1 -35.156 3.935 4.055 1.00 0.00 H +HETATM 12 H6 BNZ L 1 -33.823 4.399 2.069 1.00 0.00 H +ENDMDL +END diff --git a/peleffy/data/ligands/octafluorocyclobutane.pdb b/peleffy/data/ligands/octafluorocyclobutane.pdb new file mode 100644 index 00000000..da763bc8 --- /dev/null +++ b/peleffy/data/ligands/octafluorocyclobutane.pdb @@ -0,0 +1,18 @@ +HETATM 1 C1 UNK 1 -0.807 -0.654 0.243 1.00 0.00 C +HETATM 2 C2 UNK 1 -0.676 0.799 -0.159 1.00 0.00 C +HETATM 3 C3 UNK 1 0.809 0.672 0.015 1.00 0.00 C +HETATM 4 C4 UNK 1 0.662 -0.820 -0.037 1.00 0.00 C +HETATM 5 F1 UNK 1 1.396 -1.446 0.936 1.00 0.00 F +HETATM 6 F2 UNK 1 0.884 -1.316 -1.322 1.00 0.00 F +HETATM 7 F3 UNK 1 1.581 1.120 -1.035 1.00 0.00 F +HETATM 8 F4 UNK 1 1.291 1.190 1.195 1.00 0.00 F +HETATM 9 F5 UNK 1 -1.318 1.664 0.687 1.00 0.00 F +HETATM 10 F6 UNK 1 -0.984 0.967 -1.487 1.00 0.00 F +HETATM 11 F7 UNK 1 -1.645 -1.355 -0.588 1.00 0.00 F +HETATM 12 F8 UNK 1 -1.192 -0.821 1.553 1.00 0.00 F +CONECT 1 2 4 11 12 +CONECT 2 3 9 10 +CONECT 3 4 7 8 +CONECT 4 5 6 +END + diff --git a/peleffy/data/ligands/oleic_acid.pdb b/peleffy/data/ligands/oleic_acid.pdb new file mode 100644 index 00000000..f6b63382 --- /dev/null +++ b/peleffy/data/ligands/oleic_acid.pdb @@ -0,0 +1,117 @@ +REMARK 4 COMPLIES WITH FORMAT V. 3.0, 1-DEC-2006 +REMARK 888 +REMARK 888 WRITTEN BY MAESTRO (A PRODUCT OF SCHRODINGER, LLC) +TITLE MRO_oleic - preprocessed +MODEL 1 +HETATM 1 C2 OLC L 1 4.148 7.353 -18.237 1.00 0.00 C +HETATM 2 C1 OLC L 1 2.819 7.913 -18.760 1.00 0.00 C +HETATM 3 C3 OLC L 1 4.336 5.840 -18.529 1.00 0.00 C +HETATM 4 O1 OLC L 1 1.997 8.332 -17.914 1.00 0.00 O +HETATM 5 O2 OLC L 1 2.619 7.886 -19.995 1.00 0.00 O1- +HETATM 6 C4 OLC L 1 3.226 4.913 -17.967 1.00 0.00 C +HETATM 7 C5 OLC L 1 3.428 3.426 -18.324 1.00 0.00 C +HETATM 8 C6 OLC L 1 2.293 2.492 -17.836 1.00 0.00 C +HETATM 9 C7 OLC L 1 2.536 1.015 -18.229 1.00 0.00 C +HETATM 10 C8 OLC L 1 1.783 -0.056 -17.392 1.00 0.00 C +HETATM 11 C9 OLC L 1 2.501 -1.407 -17.407 1.00 0.00 C +HETATM 12 C10 OLC L 1 2.074 -2.659 -17.133 1.00 0.00 C +HETATM 13 C11 OLC L 1 0.708 -3.141 -16.670 1.00 0.00 C +HETATM 14 C12 OLC L 1 -0.251 -3.573 -17.803 1.00 0.00 C +HETATM 15 C13 OLC L 1 -0.435 -2.432 -18.806 1.00 0.00 C +HETATM 16 C14 OLC L 1 -1.522 -2.562 -19.874 1.00 0.00 C +HETATM 17 C15 OLC L 1 -1.587 -1.234 -20.659 1.00 0.00 C +HETATM 18 C16 OLC L 1 -2.964 -0.881 -21.233 1.00 0.00 C +HETATM 19 C17 OLC L 1 -2.994 0.581 -21.715 1.00 0.00 C +HETATM 20 C18 OLC L 1 -4.370 1.021 -22.222 1.00 0.00 C +HETATM 21 H1 OLC L 1 4.953 7.921 -18.708 1.00 0.00 H +HETATM 22 H2 OLC L 1 4.242 7.560 -17.172 1.00 0.00 H +HETATM 23 H3 OLC L 1 4.417 5.705 -19.610 1.00 0.00 H +HETATM 24 H4 OLC L 1 5.305 5.541 -18.122 1.00 0.00 H +HETATM 25 H5 OLC L 1 3.168 5.041 -16.885 1.00 0.00 H +HETATM 26 H6 OLC L 1 2.260 5.241 -18.354 1.00 0.00 H +HETATM 27 H7 OLC L 1 3.528 3.341 -19.407 1.00 0.00 H +HETATM 28 H8 OLC L 1 4.382 3.100 -17.908 1.00 0.00 H +HETATM 29 H9 OLC L 1 2.207 2.594 -16.755 1.00 0.00 H +HETATM 30 H10 OLC L 1 1.338 2.828 -18.243 1.00 0.00 H +HETATM 31 H11 OLC L 1 2.303 0.878 -19.287 1.00 0.00 H +HETATM 32 H12 OLC L 1 3.609 0.837 -18.162 1.00 0.00 H +HETATM 33 H13 OLC L 1 1.694 0.260 -16.354 1.00 0.00 H +HETATM 34 H14 OLC L 1 0.765 -0.137 -17.754 1.00 0.00 H +HETATM 35 H15 OLC L 1 3.532 -1.332 -17.691 1.00 0.00 H +HETATM 36 H16 OLC L 1 2.801 -3.444 -17.245 1.00 0.00 H +HETATM 37 H17 OLC L 1 0.860 -3.979 -15.988 1.00 0.00 H +HETATM 38 H18 OLC L 1 0.249 -2.379 -16.052 1.00 0.00 H +HETATM 39 H19 OLC L 1 0.119 -4.466 -18.306 1.00 0.00 H +HETATM 40 H20 OLC L 1 -0.682 -1.556 -18.213 1.00 0.00 H +HETATM 41 H21 OLC L 1 -1.314 -3.400 -20.542 1.00 0.00 H +HETATM 42 H22 OLC L 1 -2.477 -2.781 -19.397 1.00 0.00 H +HETATM 43 H23 OLC L 1 -1.295 -0.409 -20.004 1.00 0.00 H +HETATM 44 H24 OLC L 1 -0.835 -1.239 -21.451 1.00 0.00 H +HETATM 45 H25 OLC L 1 -3.211 -1.562 -22.049 1.00 0.00 H +HETATM 46 H26 OLC L 1 -3.725 -1.022 -20.464 1.00 0.00 H +HETATM 47 H27 OLC L 1 -2.697 1.242 -20.897 1.00 0.00 H +HETATM 48 H28 OLC L 1 -2.249 0.727 -22.499 1.00 0.00 H +HETATM 49 H29 OLC L 1 -4.348 2.068 -22.528 1.00 0.00 H +HETATM 50 H30 OLC L 1 -4.680 0.430 -23.084 1.00 0.00 H +HETATM 51 H31 OLC L 1 -5.129 0.919 -21.446 1.00 0.00 H +HETATM 52 H32 OLC L 1 -1.213 -3.839 -17.365 1.00 0.00 H +HETATM 53 H33 OLC L 1 0.515 -2.220 -19.298 1.00 0.00 H +CONECT 1 2 3 21 22 +CONECT 2 1 4 5 +CONECT 2 4 +CONECT 3 1 6 23 24 +CONECT 4 2 +CONECT 4 2 +CONECT 5 2 +CONECT 6 3 7 25 26 +CONECT 7 6 8 27 28 +CONECT 8 7 9 29 30 +CONECT 9 8 10 31 32 +CONECT 10 9 11 33 34 +CONECT 11 10 12 35 +CONECT 11 12 +CONECT 12 11 13 36 +CONECT 12 11 +CONECT 13 12 14 37 38 +CONECT 14 13 15 39 52 +CONECT 15 14 16 40 53 +CONECT 16 15 17 41 42 +CONECT 17 16 18 43 44 +CONECT 18 17 19 45 46 +CONECT 19 18 20 47 48 +CONECT 20 19 49 50 51 +CONECT 21 1 +CONECT 22 1 +CONECT 23 3 +CONECT 24 3 +CONECT 25 6 +CONECT 26 6 +CONECT 27 7 +CONECT 28 7 +CONECT 29 8 +CONECT 30 8 +CONECT 31 9 +CONECT 32 9 +CONECT 33 10 +CONECT 34 10 +CONECT 35 11 +CONECT 36 12 +CONECT 37 13 +CONECT 38 13 +CONECT 39 14 +CONECT 40 15 +CONECT 41 16 +CONECT 42 16 +CONECT 43 17 +CONECT 44 17 +CONECT 45 18 +CONECT 46 18 +CONECT 47 19 +CONECT 48 19 +CONECT 49 20 +CONECT 50 20 +CONECT 51 20 +CONECT 52 14 +CONECT 53 15 +ENDMDL +END diff --git a/peleffy/data/ligands/toluene.mae b/peleffy/data/ligands/toluene.mae new file mode 100644 index 00000000..32786bb4 --- /dev/null +++ b/peleffy/data/ligands/toluene.mae @@ -0,0 +1,190 @@ +{ + s_m_m2io_version + ::: + 2.0.0 +} + +f_m_ct { + s_m_title + s_m_entry_id + s_m_entry_name + s_pdb_PDB_TITLE + s_pdb_PDB_ID + r_pdb_PDB_CRYST1_a + r_pdb_PDB_CRYST1_b + r_pdb_PDB_CRYST1_c + r_pdb_PDB_CRYST1_alpha + r_pdb_PDB_CRYST1_beta + r_pdb_PDB_CRYST1_gamma + s_pdb_PDB_CRYST1_Space_Group + i_pdb_PDB_CRYST1_z + s_pdb_PDB_CLASSIFICATION + s_pdb_PDB_DEPOSITION_DATE + s_pdb_PDB_format_version + r_pdb_PDB_R + r_pdb_PDB_Rfree + r_pdb_PDB_RESOLUTION + s_pdb_PDB_EXPDTA + r_pdb_PDB_EXPDTA_TEMPERATURE + r_pdb_PDB_EXPDTA_PH + s_pdb_PDB_REMARK_350_Biomolecule_1_Chains + s_pdb_PDB_REMARK_350_Biomolecule_1_Transformation_1 + s_m_Source_Path + s_m_Source_File + i_m_Source_File_Index + s_ppw_entry_id_backup + b_ppw_prepared + s_ppw_prepared_with_version + b_ppw_assigned_bond_orders + b_ppw_added_hydrogens + b_ppw_treated_metals + b_ppw_created_disulfur + b_ppw_deleted_far_waters + i_psp_model_num + r_psp_Prime_Coulomb + r_psp_Prime_Covalent + r_psp_Prime_Solv_GB + r_psp_Prime_Lipo + s_psp_Prime_Energy_Force_Field + s_psp_Prime_Energy_Solvent_Model + r_psp_Prime_Hbond + r_psp_Prime_Packing + r_psp_Prime_SelfCont + i_m_ct_format + ::: + "4W52 - preprocessed" + 3 + 4w52.1 + "T4 LYSOZYME L99A WITH BENZENE BOUND" + 4W52 + 60.35 + 60.35 + 96.61 + 90 + 90 + 120 + "P 32 2 1" + 6 + HYDROLASE + 16-AUG-14 + 3.30 + 0.165000006556511 + 0.181999996304512 + 1.5 + "X-RAY DIFFRACTION" + 100 + 7.5 + A + "1.000000 0.000000 0.000000 0.000000;0.000000 1.000000 0.000000 0.000000;0.000000 0.000000 1.000000 0.000000" + /home/municoy/builds/PELE/FEPSimulation + 4w52.pdb + 1 + 2 + 1 + 2018-2 + 1 + 1 + 1 + 1 + 1 + 0 + inf + 687.113646057117 + -1117.61415217671 + -410.651549686176 + OPLS3e + VSGB2.1 + -107.883308693242 + -14.5414873816691 + -34.8272744969634 + 2 + m_atom[15] { + # First column is atom index # + i_m_mmod_type + r_m_x_coord + r_m_y_coord + r_m_z_coord + i_m_residue_number + s_m_chain_name + i_m_color + r_m_charge1 + r_m_charge2 + s_m_pdb_residue_name + s_m_pdb_atom_name + i_m_atomic_number + i_m_representation + s_m_color_rgb + s_m_atom_name + s_m_label_format + i_m_label_color + s_m_label_user_text + r_m_pdb_occupancy + r_m_pdb_tfactor + i_m_Hcount + i_m_pdb_convert_problem + i_pdb_PDB_serial + i_ppw_anum + i_ppw_het + i_psp_resnum + s_ppw_CCD_assignment_status + ::: + 1 2 -32.969000 6.196000 2.877000 1 P 134 -0.12885 -0.12885 "TOL " " C1 " 6 3 96FF2E "C1288" "%UT" 134 "" 0.7 15.06 1 4 1360 1309 3 200 "CCD match" + 2 2 -32.945000 7.046000 3.973000 1 P 134 -0.12885 -0.12885 "TOL " " C2 " 6 3 96FF2E "C1289" "%UT" 134 "" 0.7 12.84 1 4 1361 1310 3 200 "CCD match" + 3 2 -33.719000 6.798000 5.113000 1 P 134 -0.12885 -0.12885 "TOL " " C3 " 6 3 96FF2E "C1290" "%UT" 134 "" 0.7 12.24 1 4 1362 1311 3 200 "CCD match" + 4 2 -34.540000 5.680000 5.143000 1 P 134 -0.12885 -0.12885 "TOL " " C4 " 6 3 96FF2E "C1291" "%UT" 134 "" 0.7 13.09 1 4 1363 1312 3 200 "CCD match" + 5 2 -34.545000 4.825000 4.044000 1 P 134 -0.12885 -0.12885 "TOL " " C5 " 6 3 96FF2E "C1292" "%UT" 134 "" 0.7 12.54 1 4 1364 1313 3 200 "CCD match" + 6 2 -33.787000 5.069000 2.915000 1 P 134 -0.12885 -0.12885 "TOL " " C6 " 6 3 96FF2E "C1293" "%UT" 134 "" 0.7 14.23 1 4 1365 1314 3 200 "CCD match" + 7 3 -32.099995 6.505018 1.643737 1 P 134 0.12885 0.12885 "TOL " " C7 " 6 3 96FF2E "C2625" "" 134 "" <> <> 0 <> <> <> <> 200 <> + 8 41 -32.318044 7.925305 3.960797 1 P 134 0.12885 0.12885 "TOL " " H1 " 1 3 96FF2E "" "" 134 "" <> <> 0 <> <> <> <> 200 <> + 9 41 -33.672323 7.473059 5.954735 1 P 134 0.12885 0.12885 "TOL " " H2 " 1 3 96FF2E "" "" 134 "" <> <> 0 <> <> <> <> 200 <> + 10 41 -35.158445 5.487222 6.007154 1 P 134 0.12885 0.12885 "TOL " " H3 " 1 3 96FF2E "" "" 134 "" <> <> 0 <> <> <> <> 200 <> + 11 41 -35.156258 3.934698 4.055241 1 P 134 0.12885 0.12885 "TOL " " H4 " 1 3 96FF2E "" "" 134 "" <> <> 0 <> <> <> <> 200 <> + 12 41 -33.822915 4.399036 2.068680 1 P 134 0.12885 0.12885 "TOL " " H5 " 1 3 96FF2E "" "" 134 "" <> <> 0 <> <> <> <> 200 <> + 13 41 -32.249950 5.732008 0.890034 1 P 134 0.00000 0.00000 "TOL " " H6 " 1 3 96FF2E "" "" 134 "" <> <> <> <> <> <> <> <> <> + 14 41 -32.384126 7.473364 1.231819 1 P 134 0.00000 0.00000 "TOL " " H7 " 1 3 96FF2E "" "" 134 "" <> <> <> <> <> <> <> <> <> + 15 41 -31.049960 6.528714 1.935224 1 P 134 0.00000 0.00000 "TOL " " H8 " 1 3 96FF2E "" "" 134 "" <> <> <> <> <> <> <> <> <> + ::: + } + m_bond[15] { + # First column is bond index # + i_m_from + i_m_to + i_m_order + i_m_from_rep + i_m_to_rep + ::: + 1 1 2 2 3 3 + 2 1 6 1 3 3 + 3 1 7 1 3 3 + 4 2 3 1 3 3 + 5 2 8 1 3 3 + 6 3 4 2 3 3 + 7 3 9 1 3 3 + 8 4 5 1 3 3 + 9 4 10 1 3 3 + 10 5 6 2 3 3 + 11 5 11 1 3 3 + 12 6 12 1 3 3 + 13 7 13 1 3 3 + 14 7 14 1 3 3 + 15 7 15 1 3 3 + ::: + } + m_PDB_SEQRES[1] { + s_pdb_chain_id + s_pdb_SEQRES + ::: + 1 A "MET ASN ILE PHE GLU MET LEU ARG ILE ASP GLU GLY LEU ARG LEU LYS ILE TYR LYS ASP THR GLU GLY TYR TYR THR ILE GLY ILE GLY HIS LEU LEU THR LYS SER PRO SER LEU ASN ALA ALA LYS SER GLU LEU ASP LYS ALA ILE GLY ARG ASN CYS ASN GLY VAL ILE THR LYS ASP GLU ALA GLU LYS LEU PHE ASN GLN ASP VAL ASP ALA ALA VAL ARG GLY ILE LEU ARG ASN ALA LYS LEU LYS PRO VAL TYR ASP SER LEU ASP ALA VAL ARG ARG CYS ALA ALA ILE ASN MET VAL PHE GLN MET GLY GLU THR GLY VAL ALA GLY PHE THR ASN SER LEU ARG MET LEU GLN GLN LYS ARG TRP ASP GLU ALA ALA VAL ASN LEU ALA LYS SER ARG TRP TYR ASN GLN THR PRO ASN ARG ALA LYS ARG VAL ILE THR THR PHE ARG THR GLY THR TRP ASP ALA TYR LYS ASN LEU LEU GLU HIS HIS HIS HIS HIS HIS " + ::: + } + m_PDB_het_residues[2] { + s_pdb_het_id + s_pdb_het_name + s_pdb_het_formula + ::: + 1 BNZ "BENZENE" "C6 H6" + 2 EPE "4-(2-HYDROXYETHYL)-1-PIPERAZINE ETHANESULFONIC ACID" "C8 H18 N2 O4 S" + ::: + } +} + diff --git a/peleffy/data/ligands/toluene.pdb b/peleffy/data/ligands/toluene.pdb new file mode 100644 index 00000000..a02000d6 --- /dev/null +++ b/peleffy/data/ligands/toluene.pdb @@ -0,0 +1,59 @@ +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 15 +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 H1 BNZ L 1 -32.360 6.413 2.012 1.00 0.00 H +HETATM 9 H2 BNZ L 1 -32.318 7.925 3.961 1.00 0.00 H +HETATM 10 H4 BNZ L 1 -35.158 5.487 6.007 1.00 0.00 H +HETATM 11 H5 BNZ L 1 -35.156 3.935 4.055 1.00 0.00 H +HETATM 12 H6 BNZ L 1 -33.823 4.399 2.069 1.00 0.00 H +HETATM 13 H7 BNZ L 1 -34.318 7.407 7.101 1.00 0.00 H +HETATM 14 H8 BNZ L 1 -32.631 7.799 6.692 1.00 0.00 H +HETATM 15 H9 BNZ L 1 -33.960 8.757 5.998 1.00 0.00 H +CONECT 1 2 6 8 +CONECT 1 2 +CONECT 2 1 3 9 +CONECT 2 1 +CONECT 3 2 4 7 +CONECT 3 4 +CONECT 4 3 5 10 +CONECT 4 3 +CONECT 5 4 6 11 +CONECT 5 6 +CONECT 6 1 5 12 +CONECT 6 5 +CONECT 8 1 +CONECT 9 2 +CONECT 7 3 13 14 15 +CONECT 10 4 +CONECT 11 5 +CONECT 12 6 +CONECT 13 7 +CONECT 14 7 +CONECT 15 7 +ENDMDL +END From ba07bcce5cbf325b974055fbf2fb5b9260da5a90 Mon Sep 17 00:00:00 2001 From: Marti Municoy Date: Wed, 4 Nov 2020 12:13:06 +0100 Subject: [PATCH 04/13] Temporary directories to avoid trash files --- peleffy/tests/test_main.py | 38 +++++----- peleffy/tests/test_templates.py | 124 +++++++++++++++++--------------- 2 files changed, 87 insertions(+), 75 deletions(-) diff --git a/peleffy/tests/test_main.py b/peleffy/tests/test_main.py index 83af1f2a..46ad1cc7 100644 --- a/peleffy/tests/test_main.py +++ b/peleffy/tests/test_main.py @@ -261,26 +261,28 @@ def test_peleffy_main(self): 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_templates.py b/peleffy/tests/test_templates.py index a7eeb231..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 @@ -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.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') + 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.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') + 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') From aff5ebb87305f22eb3ebc905e92a72a8f5cd4bf3 Mon Sep 17 00:00:00 2001 From: Laura Malo <44496034+laumalo@users.noreply.github.com> Date: Mon, 9 Nov 2020 09:57:59 +0100 Subject: [PATCH 05/13] Add functions for OBC for OPLS --- peleffy/forcefield/parameters.py | 40 ++++++---- peleffy/forcefield/utils.py | 132 +++++++++++++++++++++++++++++++ peleffy/utils/toolkits.py | 31 ++++++++ 3 files changed, 188 insertions(+), 15 deletions(-) create mode 100644 peleffy/forcefield/utils.py diff --git a/peleffy/forcefield/parameters.py b/peleffy/forcefield/parameters.py index 6a2744b4..da831d7b 100644 --- a/peleffy/forcefield/parameters.py +++ b/peleffy/forcefield/parameters.py @@ -491,6 +491,7 @@ def from_ffld_output(molecule, ffld_output): """ from simtk import unit + from peleffy.utils.toolkits import RDKitToolkitWrapper params = defaultdict(list) @@ -650,8 +651,14 @@ def from_ffld_output(molecule, ffld_output): opls_parameters_wrapper = OPLS2005ParameterWrapper(params) OPLS2005ParameterWrapper._add_SGBNP_solvent_parameters( opls_parameters_wrapper) + + wrapper = RDKitToolkitWrapper() + degree_by_name = dict(zip(wrapper.get_atom_names(molecule), + wrapper.get_atom_degrees(molecule))) + parentType_by_name = dict(zip(wrapper.get_atom_names(molecule), + wrapper.get_atomH_parent(molecule))) OPLS2005ParameterWrapper._add_GBSA_solvent_parameters( - opls_parameters_wrapper) + opls_parameters_wrapper, degree_by_name, parentType_by_name) return opls_parameters_wrapper @@ -768,7 +775,8 @@ def _add_SGBNP_solvent_parameters(OPLS_params): OPLS_params.add_parameters(label, params) @staticmethod - def _add_GBSA_solvent_parameters(OPLS_params): + def _add_GBSA_solvent_parameters(OPLS_params,degree_by_name, + parentType_by_name): """ It adds the GBSA solvent parameters (used in the OBC solvent implemented in the OPLS2005 of PELE) to the OPLS parameters @@ -783,19 +791,21 @@ def _add_GBSA_solvent_parameters(OPLS_params): solvent parameters will be added to the collection: SGB_radii, vdW_radii, gammas, alphas """ - return - - raise NotImplementedError() - - # radii = list() - # scales = list() - # Here we can loop over atom types and names: - # for atom_name, atom_type in zip(OPLS_params['atom_names'], OPLS_params['atom_types']): - # radius, scale = find_GBSA_parameters_according_to(atom_name, atom_type) - # radii.append(radius) - # scales.append(scale) - # OPLS_params['GBSA_radii'] = radii - # OPLS_params['GBSA_scales'] = scales + from peleffy.forcefield.utils import find_GBSA_parameters_according_to + + #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']): + radius, scale = find_GBSA_parameters_according_to( + atom_name, atom_type, + degree_by_name.get(atom_name), + parentType_by_name.get(atom_name)) + radii.append(radius) + scales.append(scale) + OPLS_params['GBSA_radii'] = radii + OPLS_params['GBSA_scales'] = scales class OpenFFOPLS2005ParameterWrapper(BaseParameterWrapper): diff --git a/peleffy/forcefield/utils.py b/peleffy/forcefield/utils.py new file mode 100644 index 00000000..7af9ec52 --- /dev/null +++ b/peleffy/forcefield/utils.py @@ -0,0 +1,132 @@ +from peleffy.utils import get_data_file_path +from peleffy.topology.molecule import Molecule +from peleffy.utils.toolkits import RDKitToolkitWrapper + +def checkBonds(scale, atom_type, degree, parentH): + """ + """ + if atom_type == 'H' and parentH == 'O': scale = '1.05' + if atom_type == 'H' and parentH == 'N': scale = '1.15' + if atom_type == 'C' and degree == 3: scale= '1.875' + if atom_type == 'C' and degree == 2: scale = '1.825' + if atom_type == 'N' and degree == 4: scale = '1.625' + if atom_type == 'N' and degree == 1: scale = '1.60' + if atom_type == 'O' and degree == 1: scale = '1.48' + return scale + +def find_GBSA_parameters_according_to(atom_name, atom_type, degree, + parentH): + # Parameter List extracted from PELE solvent templates for OBC + paramtersLst = [['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'], ] + # ['HWS', '1.05', '0.85'] , + # ['OWS', '1.535', '0.85'] ,] + # Parameter List extracted from TINKER source code for OBC + # (ksolv.f: +/-line 423) + atomTypesOverlapFactors = [['H', '1.25'], + ['Li', '1.432'], + ['C', '1.90'], + ['N', '1.7063'], + ['O', '1.535'], + ['F', '1.47'], + ['FE', '2.00'], # default parameters + ['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'], + ] + # Parameter List extracted from TINKER source code for OBC + # (ksolv.f: +/-line 423) + atomTypesHCTradii = [['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'], + ] + + # Assign overlapFactors and HCT radii using the atom name + for param in paramtersLst: + if atom_name.strip() == param[0]: + scale, radius= param[1], param[2] + break + + # Assign overlapFactors and HCT radii using the atom type + else: + found = False + for OverlapFactor in atomTypesOverlapFactors: + if atom_type.strip() == OverlapFactor[0]: + scale, found = OverlapFactor[1], True + scale = checkBonds(scale, atom_type, degree, parentH) + break + for HCTradii in atomTypesHCTradii: + if atom_type.strip() == HCTradii[0]: + radius, found = HCTradii[1], (found and True) + break + else: found = False + + # Retuns overlapFractor and HCT radii if found otherwise it raises a + # warining and returns the default parameters + if not found: + from peleffy.utils import Logger + log = Logger() + log.warning('Parameter for {} {} NOT found in the template '.format( + atom_name,atom_type) + 'database... using default parameters') + radius, scale = '0.80','2.0' + return radius, scale + + + + diff --git a/peleffy/utils/toolkits.py b/peleffy/utils/toolkits.py index 445fd4da..b8aa791a 100644 --- a/peleffy/utils/toolkits.py +++ b/peleffy/utils/toolkits.py @@ -289,6 +289,37 @@ def get_atom_degrees(self, molecule): return atom_degrees + def get_atomH_parent(self, molecule): + """ + It returns the ordered list of atom parents for the H atoms of the + molecule. + + Parameters + ---------- + molecule : an peleffy.topology.Molecule + The peleffy's Molecule object + + Returns + ------- + atom_parents : list[int] + The list of atom parents if the atom is an H. + """ + rdkit_molecule = molecule.rdkit_molecule + + atom_parents = list() + + for atom in rdkit_molecule.GetAtoms(): + if atom.GetSymbol() == 'H': + for bond in atom.GetBonds(): + if bond.GetBeginAtom().GetSymbol() == 'H': + atom_parents.append(bond.GetEndAtom().GetSymbol()) + if bond.GetEndAtom().GetSymbol() == 'H': + atom_parents.append(bond.GetBeginAtom().GetSymbol()) + else: + atom_parents.append('') + return atom_parents + + def to_pdb_file(self, molecule, path): """ It writes the RDKit molecule to a PDB file. From 9c15fc3e32856afc6a5cb27211f84d1c0f3ad846 Mon Sep 17 00:00:00 2001 From: Laura Malo <44496034+laumalo@users.noreply.github.com> Date: Tue, 10 Nov 2020 14:11:42 +0100 Subject: [PATCH 06/13] Fix errors and improved functions --- peleffy/data/parameters/OBCparam.json | 190 ++++++++++++++++++++++++++ peleffy/forcefield/parameters.py | 111 ++++++++++++++- peleffy/forcefield/utils.py | 132 ------------------ 3 files changed, 298 insertions(+), 135 deletions(-) create mode 100644 peleffy/data/parameters/OBCparam.json delete mode 100644 peleffy/forcefield/utils.py diff --git a/peleffy/data/parameters/OBCparam.json b/peleffy/data/parameters/OBCparam.json new file mode 100644 index 00000000..ef7195a9 --- /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" + } +] \ No newline at end of file diff --git a/peleffy/forcefield/parameters.py b/peleffy/forcefield/parameters.py index da831d7b..29e4a0f5 100644 --- a/peleffy/forcefield/parameters.py +++ b/peleffy/forcefield/parameters.py @@ -651,7 +651,6 @@ def from_ffld_output(molecule, ffld_output): opls_parameters_wrapper = OPLS2005ParameterWrapper(params) OPLS2005ParameterWrapper._add_SGBNP_solvent_parameters( opls_parameters_wrapper) - wrapper = RDKitToolkitWrapper() degree_by_name = dict(zip(wrapper.get_atom_names(molecule), wrapper.get_atom_degrees(molecule))) @@ -790,15 +789,121 @@ def _add_GBSA_solvent_parameters(OPLS_params,degree_by_name, 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 + dictionary containing the number of bonds for each atom_name + parentType_by_name : dict + dictionary containing the parent for hydrogen atoms linked to + each atom_name """ - from peleffy.forcefield.utils import find_GBSA_parameters_according_to + import re + import json + + def _find_GBSA_parameters_according_to( atom_name, atom_type, + degree, parentH): + """ + 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 + parentH : str + Atom type of the parent (if the atom is an H) + + Returns + ------- + radius : str + HCT radii + scale : str + Overlap factor + """ + + OBCPARAM_PATH = get_data_file_path('parameters/OBCparam.json') + + # Load the dictioaries with the OBC parameters + with open(OBCPARAM_PATH, 'r') as fd: + paramtersLst, atomTypesOverlapFactors, atomTypesHCTradii = \ + json.load(fd) + + # Assign overlapFactors and HCT radii using the atom type + for k,params in paramtersLst.items(): + type_aux = '' + if any(chr.isdigit() for chr in atom_type): + type_aux =''.join([i for i in atom_type if not i.isdigit()]) + if atom_type.strip() == k or ''.join([type_aux.strip(), '*']) == k: + scale, radius= params[0], params[1] + break + + # Assign overlapFactors and HCT radii using the atom name + else: + found = False + # Define element name + elementName = \ + ''.join([i for i in atom_name.strip() if not i.isdigit()]) + + # Assign overlapFractor + for k, OverlapFactor in atomTypesOverlapFactors.items(): + if elementName == k.upper(): + scale, found = OverlapFactor, True + scale = _checkBonds(scale,elementName,degree,parentH) + break + else: + if len(elementName) > 1: + for k, OverlapFactor in atomTypesOverlapFactors.items(): + if elementName[0] == k.upper(): + scale, found = OverlapFactor, True + scale =_checkBonds(scale,elementName, + degree,parentH) + elementName = elementName[0] + break + + # Assign HCT radii + for k,HCTradii in atomTypesHCTradii.items(): + if elementName == k.upper(): + radius, found = HCTradii, (found and True) + break + else: found = False + + # Retuns overlapFractor and HCT radii if found otherwise it raises a + # warining and returns the default parameters + if not found: + from peleffy.utils import Logger + log = Logger() + log.warning('Parameter for {} {} NOT found in the template ' + .format(atom_name,atom_type) + + 'database... using default parameters') + radius, scale = '0.80','2.0' + return radius, scale + + def _checkBonds(scale, atom_type, degree, parentH): + """ + It checks the number of bonds and the parent atom for terminal H and + in some especified cases it updates the overlap factor. + """ + if atom_type == 'H' and parentH == 'O': scale = '1.05' + if atom_type == 'H' and parentH == 'N': scale = '1.15' + if atom_type == 'C' and degree == 3: scale= '1.875' + if atom_type == 'C' and degree == 2: scale = '1.825' + if atom_type == 'N' and degree == 4: scale = '1.625' + if atom_type == 'N' and degree == 1: scale = '1.60' + if atom_type == 'O' and degree == 1: scale = '1.48' + return 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']): - radius, scale = find_GBSA_parameters_according_to( + atom_name = re.sub('_', ' ', atom_name) + radius, scale = _find_GBSA_parameters_according_to( atom_name, atom_type, degree_by_name.get(atom_name), parentType_by_name.get(atom_name)) diff --git a/peleffy/forcefield/utils.py b/peleffy/forcefield/utils.py deleted file mode 100644 index 7af9ec52..00000000 --- a/peleffy/forcefield/utils.py +++ /dev/null @@ -1,132 +0,0 @@ -from peleffy.utils import get_data_file_path -from peleffy.topology.molecule import Molecule -from peleffy.utils.toolkits import RDKitToolkitWrapper - -def checkBonds(scale, atom_type, degree, parentH): - """ - """ - if atom_type == 'H' and parentH == 'O': scale = '1.05' - if atom_type == 'H' and parentH == 'N': scale = '1.15' - if atom_type == 'C' and degree == 3: scale= '1.875' - if atom_type == 'C' and degree == 2: scale = '1.825' - if atom_type == 'N' and degree == 4: scale = '1.625' - if atom_type == 'N' and degree == 1: scale = '1.60' - if atom_type == 'O' and degree == 1: scale = '1.48' - return scale - -def find_GBSA_parameters_according_to(atom_name, atom_type, degree, - parentH): - # Parameter List extracted from PELE solvent templates for OBC - paramtersLst = [['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'], ] - # ['HWS', '1.05', '0.85'] , - # ['OWS', '1.535', '0.85'] ,] - # Parameter List extracted from TINKER source code for OBC - # (ksolv.f: +/-line 423) - atomTypesOverlapFactors = [['H', '1.25'], - ['Li', '1.432'], - ['C', '1.90'], - ['N', '1.7063'], - ['O', '1.535'], - ['F', '1.47'], - ['FE', '2.00'], # default parameters - ['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'], - ] - # Parameter List extracted from TINKER source code for OBC - # (ksolv.f: +/-line 423) - atomTypesHCTradii = [['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'], - ] - - # Assign overlapFactors and HCT radii using the atom name - for param in paramtersLst: - if atom_name.strip() == param[0]: - scale, radius= param[1], param[2] - break - - # Assign overlapFactors and HCT radii using the atom type - else: - found = False - for OverlapFactor in atomTypesOverlapFactors: - if atom_type.strip() == OverlapFactor[0]: - scale, found = OverlapFactor[1], True - scale = checkBonds(scale, atom_type, degree, parentH) - break - for HCTradii in atomTypesHCTradii: - if atom_type.strip() == HCTradii[0]: - radius, found = HCTradii[1], (found and True) - break - else: found = False - - # Retuns overlapFractor and HCT radii if found otherwise it raises a - # warining and returns the default parameters - if not found: - from peleffy.utils import Logger - log = Logger() - log.warning('Parameter for {} {} NOT found in the template '.format( - atom_name,atom_type) + 'database... using default parameters') - radius, scale = '0.80','2.0' - return radius, scale - - - - From 6efa67bd48ceeaac8101ea68f256b1d1dccc543f Mon Sep 17 00:00:00 2001 From: Laura Malo <44496034+laumalo@users.noreply.github.com> Date: Fri, 13 Nov 2020 10:15:18 +0100 Subject: [PATCH 07/13] Errors fix --- peleffy/forcefield/parameters.py | 35 +++++++++++++++----------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/peleffy/forcefield/parameters.py b/peleffy/forcefield/parameters.py index 29e4a0f5..dfa52d8e 100644 --- a/peleffy/forcefield/parameters.py +++ b/peleffy/forcefield/parameters.py @@ -798,6 +798,20 @@ def _add_GBSA_solvent_parameters(OPLS_params,degree_by_name, import re import json + def _checkBonds(scale, atom_type, degree, parentH): + """ + It checks the number of bonds and the parent atom for terminal H and + in some especified cases it updates the overlap factor. + """ + if atom_type == 'H' and parentH == 'O': scale = '1.05' + if atom_type == 'H' and parentH == 'N': scale = '1.15' + if atom_type == 'C' and degree == 3: scale= '1.875' + if atom_type == 'C' and degree == 2: scale = '1.825' + if atom_type == 'N' and degree == 4: scale = '1.625' + if atom_type == 'N' and degree == 1: scale = '1.60' + if atom_type == 'O' and degree == 1: scale = '1.48' + return scale + def _find_GBSA_parameters_according_to( atom_name, atom_type, degree, parentH): """ @@ -834,11 +848,8 @@ def _find_GBSA_parameters_according_to( atom_name, atom_type, # Assign overlapFactors and HCT radii using the atom type for k,params in paramtersLst.items(): - type_aux = '' - if any(chr.isdigit() for chr in atom_type): - type_aux =''.join([i for i in atom_type if not i.isdigit()]) - if atom_type.strip() == k or ''.join([type_aux.strip(), '*']) == k: - scale, radius= params[0], params[1] + if atom_type.strip() == k: + scale, radius = params[0], params[1] break # Assign overlapFactors and HCT radii using the atom name @@ -882,20 +893,6 @@ def _find_GBSA_parameters_according_to( atom_name, atom_type, radius, scale = '0.80','2.0' return radius, scale - def _checkBonds(scale, atom_type, degree, parentH): - """ - It checks the number of bonds and the parent atom for terminal H and - in some especified cases it updates the overlap factor. - """ - if atom_type == 'H' and parentH == 'O': scale = '1.05' - if atom_type == 'H' and parentH == 'N': scale = '1.15' - if atom_type == 'C' and degree == 3: scale= '1.875' - if atom_type == 'C' and degree == 2: scale = '1.825' - if atom_type == 'N' and degree == 4: scale = '1.625' - if atom_type == 'N' and degree == 1: scale = '1.60' - if atom_type == 'O' and degree == 1: scale = '1.48' - return scale - #Loop over atom types and names: radii = list() From 0f280bea6578bfb78c8750e8ce0e254c32565329 Mon Sep 17 00:00:00 2001 From: Laura Malo <44496034+laumalo@users.noreply.github.com> Date: Fri, 13 Nov 2020 12:42:27 +0100 Subject: [PATCH 08/13] Add tests --- peleffy/data/tests/etlz_OBCParams.txt | 6 +++ peleffy/data/tests/malz_OBCParams.txt | 10 ++++ peleffy/data/tests/metz_OBCParams.txt | 5 ++ peleffy/tests/test_forcefields.py | 67 +++++++++++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 peleffy/data/tests/etlz_OBCParams.txt create mode 100644 peleffy/data/tests/malz_OBCParams.txt create mode 100644 peleffy/data/tests/metz_OBCParams.txt 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/tests/test_forcefields.py b/peleffy/tests/test_forcefields.py index d17a1003..df3ec712 100644 --- a/peleffy/tests/test_forcefields.py +++ b/peleffy/tests/test_forcefields.py @@ -299,6 +299,73 @@ def test_add_SGBNP_solvent_parameters(self): assert params3['gammas'][0] == 0.005000000, 'Unexpected gamma' assert params3['alphas'][0] == 0.000000000, 'Unexpected alpha' + 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 pelffy.topology import Molecule + from peleffy.utils import get_data_file_path + + def test_add_GBSA_solvent_parameters_ligand(pdb_file, ffld_file, reference_txt): + """ + It tests for a ligand that the HTC radii and the Overlap factor for Heteroatoms computed with the function _add_GBSA_solvent_parameters correspond to the obtained with the 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 + wrapperOPLS = OPLS2005ParameterWrapper() + parameters = wrapperOPLS.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 params[3] == d_scale.get(params[1]), 'Unexpected GBSA Overlap factor' + assert 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') + test_add_GBSA_solvent_parameters_ligand(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') + test_add_GBSA_solvent_parameters_ligand(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') + test_add_GBSA_solvent_parameters_ligand(pdb_file, ffld_file, reference_txt) + class TestOpenFFOPLS2005ForceField(object): """ From d63036fe9e2e15fd794b70184ec118429ac0d522 Mon Sep 17 00:00:00 2001 From: Laura Malo <44496034+laumalo@users.noreply.github.com> Date: Fri, 13 Nov 2020 13:00:02 +0100 Subject: [PATCH 09/13] Minor error fixed --- peleffy/tests/test_forcefields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/peleffy/tests/test_forcefields.py b/peleffy/tests/test_forcefields.py index df3ec712..d90116a0 100644 --- a/peleffy/tests/test_forcefields.py +++ b/peleffy/tests/test_forcefields.py @@ -306,7 +306,7 @@ def test_add_GBSA_solvent_parameters(self): """ from peleffy.forcefield import OPLS2005ParameterWrapper - from pelffy.topology import Molecule + from peleffy.topology import Molecule from peleffy.utils import get_data_file_path def test_add_GBSA_solvent_parameters_ligand(pdb_file, ffld_file, reference_txt): From 314c0722d8834317232c911378429eafcaeebb32 Mon Sep 17 00:00:00 2001 From: Laura Malo <44496034+laumalo@users.noreply.github.com> Date: Fri, 13 Nov 2020 13:10:09 +0100 Subject: [PATCH 10/13] Update releasehistory.rst --- docs/releasehistory.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/releasehistory.rst b/docs/releasehistory.rst index 11e9ad8e..3d1ff8f8 100644 --- a/docs/releasehistory.rst +++ b/docs/releasehistory.rst @@ -16,11 +16,13 @@ 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. 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. 1.0.0 - Full compatibility for OPLS2005 and OpenFF dihedrals and rotamer library improvements From 3a11d1f84f977dc4c124f0ca046c6a38f0043d69 Mon Sep 17 00:00:00 2001 From: Marti Municoy Date: Tue, 17 Nov 2020 16:30:47 +0100 Subject: [PATCH 11/13] Add tests for OBC implementation for OPLS --- peleffy/data/parameters/OBCparam.json | 378 +++++++++++----------- peleffy/forcefield/parameters.py | 175 ++++++----- peleffy/solvent/solvent.py | 2 +- peleffy/tests/test_forcefields.py | 125 -------- peleffy/tests/test_parameters.py | 432 ++++++++++++++++++++++++++ peleffy/utils/toolkits.py | 54 +++- 6 files changed, 769 insertions(+), 397 deletions(-) diff --git a/peleffy/data/parameters/OBCparam.json b/peleffy/data/parameters/OBCparam.json index ef7195a9..49dee0c3 100644 --- a/peleffy/data/parameters/OBCparam.json +++ b/peleffy/data/parameters/OBCparam.json @@ -1,190 +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" - } -] \ No newline at end of file + { + "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/forcefield/parameters.py b/peleffy/forcefield/parameters.py index be5de05f..578f7451 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): @@ -672,13 +673,20 @@ def from_ffld_output(molecule, ffld_output): opls_parameters_wrapper = OPLS2005ParameterWrapper(params) OPLS2005ParameterWrapper._add_SGBNP_solvent_parameters( opls_parameters_wrapper) + + # Employ RDKit to extract atom degree and parent type lists wrapper = RDKitToolkitWrapper() - degree_by_name = dict(zip(wrapper.get_atom_names(molecule), + atom_names = wrapper.get_atom_names(molecule) + degree_by_name = dict(zip(atom_names, wrapper.get_atom_degrees(molecule))) - parentType_by_name = dict(zip(wrapper.get_atom_names(molecule), - wrapper.get_atomH_parent(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, parentType_by_name) + opls_parameters_wrapper, degree_by_name, + parent_by_name, element_by_name) return opls_parameters_wrapper @@ -795,8 +803,9 @@ def _add_SGBNP_solvent_parameters(OPLS_params): OPLS_params.add_parameters(label, params) @staticmethod - def _add_GBSA_solvent_parameters(OPLS_params,degree_by_name, - parentType_by_name): + 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 @@ -811,30 +820,56 @@ def _add_GBSA_solvent_parameters(OPLS_params,degree_by_name, solvent parameters will be added to the collection: SGB_radii, vdW_radii, gammas, alphas degree_by_name : dict - dictionary containing the number of bonds for each atom_name - parentType_by_name : dict - dictionary containing the parent for hydrogen atoms linked to + 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 _checkBonds(scale, atom_type, degree, parentH): + def _check_bonds(scale, atom_type, degree, parent): """ - It checks the number of bonds and the parent atom for terminal H and - in some especified cases it updates the overlap factor. + 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 parentH == 'O': scale = '1.05' - if atom_type == 'H' and parentH == 'N': scale = '1.15' - if atom_type == 'C' and degree == 3: scale= '1.875' - if atom_type == 'C' and degree == 2: scale = '1.825' - if atom_type == 'N' and degree == 4: scale = '1.625' - if atom_type == 'N' and degree == 1: scale = '1.60' - if atom_type == 'O' and degree == 1: scale = '1.48' + + if atom_type == 'H' and parent == 'O': + scale = '1.05' + if atom_type == 'H' and parent == 'N': + scale = '1.15' + if atom_type == 'C' and degree == 3: + scale = '1.875' + if atom_type == 'C' and degree == 2: + scale = '1.825' + if atom_type == 'N' and degree == 4: + scale = '1.625' + if atom_type == 'N' and degree == 1: + scale = '1.60' + if atom_type == 'O' and degree == 1: + scale = '1.48' + return scale - def _find_GBSA_parameters_according_to( atom_name, atom_type, - degree, parentH): + 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 @@ -849,8 +884,10 @@ def _find_GBSA_parameters_according_to( atom_name, atom_type, Atom type degree : str Number of bonds - parentH : str - Atom type of the parent (if the atom is an H) + element : str + The element the atom belongs to + parent : str + The element of the atom's parent (if the atom is a hydrogen) Returns ------- @@ -860,73 +897,67 @@ def _find_GBSA_parameters_according_to( atom_name, atom_type, Overlap factor """ - OBCPARAM_PATH = get_data_file_path('parameters/OBCparam.json') + 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(OBCPARAM_PATH, 'r') as fd: - paramtersLst, atomTypesOverlapFactors, atomTypesHCTradii = \ - json.load(fd) + with open(PARAMS_PATH) as fd: + params_by_type, scale_by_element, \ + radius_by_element = json.load(fd) - # Assign overlapFactors and HCT radii using the atom type - for k,params in paramtersLst.items(): - if atom_type.strip() == k: - scale, radius = params[0], params[1] - break + # 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 overlapFactors and HCT radii using the atom name + # Assign scale factor and HCT radius using the atom element else: - found = False - # Define element name - elementName = \ - ''.join([i for i in atom_name.strip() if not i.isdigit()]) - - # Assign overlapFractor - for k, OverlapFactor in atomTypesOverlapFactors.items(): - if elementName == k.upper(): - scale, found = OverlapFactor, True - scale = _checkBonds(scale,elementName,degree,parentH) - break + 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: - if len(elementName) > 1: - for k, OverlapFactor in atomTypesOverlapFactors.items(): - if elementName[0] == k.upper(): - scale, found = OverlapFactor, True - scale =_checkBonds(scale,elementName, - degree,parentH) - elementName = elementName[0] - break - - # Assign HCT radii - for k,HCTradii in atomTypesHCTradii.items(): - if elementName == k.upper(): - radius, found = HCTradii, (found and True) - break - else: found = False - - # Retuns overlapFractor and HCT radii if found otherwise it raises a - # warining and returns the default parameters + 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: - from peleffy.utils import Logger log = Logger() - log.warning('Parameter for {} {} NOT found in the template ' - .format(atom_name,atom_type) - + 'database... using default parameters') - radius, scale = '0.80','2.0' - return radius, scale + log.warning('Warning: OBC parameters for ' + + '{} {} '.format(atom_name, atom_type) + + 'NOT found in the template ' + + 'database. Using default parameters') + radius, scale = '0.80', '2.0' + return radius, scale - #Loop over atom types and names: + # 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), - parentType_by_name.get(atom_name)) + 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 diff --git a/peleffy/solvent/solvent.py b/peleffy/solvent/solvent.py index c0235393..4132b8e6 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 diff --git a/peleffy/tests/test_forcefields.py b/peleffy/tests/test_forcefields.py index d90116a0..403d68d0 100644 --- a/peleffy/tests/test_forcefields.py +++ b/peleffy/tests/test_forcefields.py @@ -241,131 +241,6 @@ def test_parameterizer(self): expected_propers=expected_propers, expected_impropers=expected_impropers) - 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_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 test_add_GBSA_solvent_parameters_ligand(pdb_file, ffld_file, reference_txt): - """ - It tests for a ligand that the HTC radii and the Overlap factor for Heteroatoms computed with the function _add_GBSA_solvent_parameters correspond to the obtained with the 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 - wrapperOPLS = OPLS2005ParameterWrapper() - parameters = wrapperOPLS.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 params[3] == d_scale.get(params[1]), 'Unexpected GBSA Overlap factor' - assert 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') - test_add_GBSA_solvent_parameters_ligand(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') - test_add_GBSA_solvent_parameters_ligand(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') - test_add_GBSA_solvent_parameters_ligand(pdb_file, ffld_file, reference_txt) - class TestOpenFFOPLS2005ForceField(object): """ diff --git a/peleffy/tests/test_parameters.py b/peleffy/tests/test_parameters.py index 47290946..e83ae44a 100644 --- a/peleffy/tests/test_parameters.py +++ b/peleffy/tests/test_parameters.py @@ -641,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 params[3] == d_scale.get(params[1]), \ + 'Unexpected GBSA Overlap factor' + assert 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/utils/toolkits.py b/peleffy/utils/toolkits.py index f336aca7..bdfb16ae 100644 --- a/peleffy/utils/toolkits.py +++ b/peleffy/utils/toolkits.py @@ -289,10 +289,13 @@ def get_atom_degrees(self, molecule): return atom_degrees - def get_atomH_parent(self, molecule): + def get_hydrogen_parents(self, molecule): """ - It returns the ordered list of atom parents for the H atoms of the - 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 ---------- @@ -302,7 +305,9 @@ def get_atomH_parent(self, molecule): Returns ------- atom_parents : list[int] - The list of atom parents if the atom is an H. + 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 @@ -310,15 +315,44 @@ def get_atomH_parent(self, molecule): for atom in rdkit_molecule.GetAtoms(): if atom.GetSymbol() == 'H': - for bond in atom.GetBonds(): - if bond.GetBeginAtom().GetSymbol() == 'H': - atom_parents.append(bond.GetEndAtom().GetSymbol()) - if bond.GetEndAtom().GetSymbol() == 'H': - atom_parents.append(bond.GetBeginAtom().GetSymbol()) + 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('') + 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): """ From fc968e7219c263ae836c9748b542ffb3b40f7e9c Mon Sep 17 00:00:00 2001 From: Marti Municoy Date: Tue, 17 Nov 2020 16:46:17 +0100 Subject: [PATCH 12/13] Store solvent parameters in floats not strings --- peleffy/data/parameters/OBCparam.json | 216 +++++++++++++------------- peleffy/forcefield/parameters.py | 16 +- peleffy/tests/test_parameters.py | 52 +++---- 3 files changed, 142 insertions(+), 142 deletions(-) diff --git a/peleffy/data/parameters/OBCparam.json b/peleffy/data/parameters/OBCparam.json index 49dee0c3..b893c7dd 100644 --- a/peleffy/data/parameters/OBCparam.json +++ b/peleffy/data/parameters/OBCparam.json @@ -1,190 +1,190 @@ [ { "CW": [ - "1.875", - "0.72" + 1.875, + 0.72 ], "NC": [ - "1.7063", - "0.79" + 1.7063, + 0.79 ], "CM": [ - "1.875", - "0.72" + 1.875, + 0.72 ], "C*": [ - "1.875", - "0.72" + 1.875, + 0.72 ], "H1": [ - "1.25", - "0.85" + 1.25, + 0.85 ], "CT": [ - "1.9", - "0.72" + 1.9, + 0.72 ], "N2": [ - "1.7063", - "0.79" + 1.7063, + 0.79 ], "N*": [ - "1.7063", - "0.79" + 1.7063, + 0.79 ], "CR": [ - "1.875", - "0.72" + 1.875, + 0.72 ], "HO": [ - "1.05", - "0.85" + 1.05, + 0.85 ], "NB": [ - "1.7063", - "0.79" + 1.7063, + 0.79 ], "H2": [ - "1.25", - "0.85" + 1.25, + 0.85 ], "S": [ - "1.775", - "0.96" + 1.775, + 0.96 ], "NA": [ - "1.7063", - "0.79" + 1.7063, + 0.79 ], "H4": [ - "1.25", - "0.85" + 1.25, + 0.85 ], "HC": [ - "1.25", - "0.85" + 1.25, + 0.85 ], "C": [ - "1.875", - "0.72" + 1.875, + 0.72 ], "OH": [ - "1.535", - "0.85" + 1.535, + 0.85 ], "CQ": [ - "1.875", - "0.72" + 1.875, + 0.72 ], "CK": [ - "1.875", - "0.72" + 1.875, + 0.72 ], "O2": [ - "1.48", - "0.85" + 1.48, + 0.85 ], "OS": [ - "1.535", - "0.85" + 1.535, + 0.85 ], "SH": [ - "1.775", - "0.96" + 1.775, + 0.96 ], "HA": [ - "1.25", - "0.85" + 1.25, + 0.85 ], "CB": [ - "1.875", - "0.72" + 1.875, + 0.72 ], "H5": [ - "1.25", - "0.85" + 1.25, + 0.85 ], "CN": [ - "1.875", - "0.72" + 1.875, + 0.72 ], "P": [ - "1.87", - "0.86" + 1.87, + 0.86 ], "N3": [ - "1.625", - "0.79" + 1.625, + 0.79 ], "HP": [ - "1.25", - "0.85" + 1.25, + 0.85 ], "N": [ - "1.7063", - "0.79" + 1.7063, + 0.79 ], "H": [ - "1.15", - "0.85" + 1.15, + 0.85 ], "HS": [ - "1.25", - "0.85" + 1.25, + 0.85 ], "CV": [ - "1.875", - "0.72" + 1.875, + 0.72 ], "CA": [ - "1.875", - "0.72" + 1.875, + 0.72 ], "O": [ - "1.48", - "0.85" + 1.48, + 0.85 ], "CC": [ - "1.875", - "0.72" + 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": 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" + "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/forcefield/parameters.py b/peleffy/forcefield/parameters.py index 578f7451..a8a4b011 100644 --- a/peleffy/forcefield/parameters.py +++ b/peleffy/forcefield/parameters.py @@ -852,19 +852,19 @@ def _check_bonds(scale, atom_type, degree, parent): """ if atom_type == 'H' and parent == 'O': - scale = '1.05' + scale = float(1.05) if atom_type == 'H' and parent == 'N': - scale = '1.15' + scale = float(1.15) if atom_type == 'C' and degree == 3: - scale = '1.875' + scale = float(1.875) if atom_type == 'C' and degree == 2: - scale = '1.825' + scale = float(1.825) if atom_type == 'N' and degree == 4: - scale = '1.625' + scale = float(1.625) if atom_type == 'N' and degree == 1: - scale = '1.60' + scale = float(1.60) if atom_type == 'O' and degree == 1: - scale = '1.48' + scale = float(1.48) return scale @@ -938,7 +938,7 @@ def _find_GBSA_parameters_according_to(atom_name, atom_type, + '{} {} '.format(atom_name, atom_type) + 'NOT found in the template ' + 'database. Using default parameters') - radius, scale = '0.80', '2.0' + radius, scale = float(0.80), float(2.0) return radius, scale diff --git a/peleffy/tests/test_parameters.py b/peleffy/tests/test_parameters.py index e83ae44a..6b1b5c02 100644 --- a/peleffy/tests/test_parameters.py +++ b/peleffy/tests/test_parameters.py @@ -729,9 +729,9 @@ def test_GBSA_params_by_type(self): parent_by_name, element_by_name) - assert OPLS_params['GBSA_radii'] == ['0.72'], \ + assert OPLS_params['GBSA_radii'] == [0.72], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['1.9'], \ + assert OPLS_params['GBSA_scales'] == [1.9], \ 'Unexpected GBSA scale' # 2nd test @@ -749,9 +749,9 @@ def test_GBSA_params_by_type(self): parent_by_name, element_by_name) - assert OPLS_params['GBSA_radii'] == ['0.72'], \ + assert OPLS_params['GBSA_radii'] == [0.72], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['1.875'], \ + assert OPLS_params['GBSA_scales'] == [1.875], \ 'Unexpected GBSA scale' # 3rd test @@ -769,9 +769,9 @@ def test_GBSA_params_by_type(self): parent_by_name, element_by_name) - assert OPLS_params['GBSA_radii'] == ['0.85'], \ + assert OPLS_params['GBSA_radii'] == [0.85], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['1.48'], \ + assert OPLS_params['GBSA_scales'] == [1.48], \ 'Unexpected GBSA scale' # 4th test @@ -789,9 +789,9 @@ def test_GBSA_params_by_type(self): parent_by_name, element_by_name) - assert OPLS_params['GBSA_radii'] == ['0.85'], \ + assert OPLS_params['GBSA_radii'] == [0.85], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['1.25'], \ + assert OPLS_params['GBSA_scales'] == [1.25], \ 'Unexpected GBSA scale' def test_GBSA_params_by_element(self): @@ -817,9 +817,9 @@ def test_GBSA_params_by_element(self): parent_by_name, element_by_name) - assert OPLS_params['GBSA_radii'] == ['0.72'], \ + assert OPLS_params['GBSA_radii'] == [0.72], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['1.875'], \ + assert OPLS_params['GBSA_scales'] == [1.875], \ 'Unexpected GBSA scale' # 2nd test @@ -837,9 +837,9 @@ def test_GBSA_params_by_element(self): parent_by_name, element_by_name) - assert OPLS_params['GBSA_radii'] == ['0.85'], \ + assert OPLS_params['GBSA_radii'] == [0.85], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['1.535'], \ + assert OPLS_params['GBSA_scales'] == [1.535], \ 'Unexpected GBSA scale' # 3rd test @@ -857,9 +857,9 @@ def test_GBSA_params_by_element(self): parent_by_name, element_by_name) - assert OPLS_params['GBSA_radii'] == ['0.85'], \ + assert OPLS_params['GBSA_radii'] == [0.85], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['1.48'], \ + assert OPLS_params['GBSA_scales'] == [1.48], \ 'Unexpected GBSA scale' # 4th test @@ -877,9 +877,9 @@ def test_GBSA_params_by_element(self): parent_by_name, element_by_name) - assert OPLS_params['GBSA_radii'] == ['0.85'], \ + assert OPLS_params['GBSA_radii'] == [0.85], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['1.25'], \ + assert OPLS_params['GBSA_scales'] == [1.25], \ 'Unexpected GBSA scale' # 5th test @@ -897,9 +897,9 @@ def test_GBSA_params_by_element(self): parent_by_name, element_by_name) - assert OPLS_params['GBSA_radii'] == ['0.85'], \ + assert OPLS_params['GBSA_radii'] == [0.85], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['1.15'], \ + assert OPLS_params['GBSA_scales'] == [1.15], \ 'Unexpected GBSA scale' # 6th test @@ -917,9 +917,9 @@ def test_GBSA_params_by_element(self): parent_by_name, element_by_name) - assert OPLS_params['GBSA_radii'] == ['0.85'], \ + assert OPLS_params['GBSA_radii'] == [0.85], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['1.05'], \ + assert OPLS_params['GBSA_scales'] == [1.05], \ 'Unexpected GBSA scale' # 7th test @@ -937,9 +937,9 @@ def test_GBSA_params_by_element(self): parent_by_name, element_by_name) - assert OPLS_params['GBSA_radii'] == ['0.72'], \ + assert OPLS_params['GBSA_radii'] == [0.72], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['1.825'], \ + assert OPLS_params['GBSA_scales'] == [1.825], \ 'Unexpected GBSA scale' def test_GBSA_default_params(self): @@ -987,9 +987,9 @@ def test_GBSA_default_params(self): + 'C1 C?! NOT found in the template database. ' \ + 'Using default parameters\n' - assert OPLS_params['GBSA_radii'] == ['0.80'], \ + assert OPLS_params['GBSA_radii'] == [0.80], \ 'Unexpected GBSA radii' - assert OPLS_params['GBSA_scales'] == ['2.0'], \ + assert OPLS_params['GBSA_scales'] == [2.0], \ 'Unexpected GBSA scale' def test_add_GBSA_solvent_parameters(self): @@ -1045,9 +1045,9 @@ def generate_and_compare_GBSA_solvent_parameters(pdb_file, # Check that the parameters correspond for line in data: params = line.split() - assert params[3] == d_scale.get(params[1]), \ + assert float(params[3]) == d_scale.get(params[1]), \ 'Unexpected GBSA Overlap factor' - assert params[4] == d_radii.get(params[1]), \ + assert float(params[4]) == d_radii.get(params[1]), \ 'Unexpected GBSA radius' # For malonate From 570597ac0160bb8da47e5b001dfe70c926c8c6a0 Mon Sep 17 00:00:00 2001 From: Marti Municoy Date: Tue, 17 Nov 2020 17:08:45 +0100 Subject: [PATCH 13/13] Fix lgtm alert --- peleffy/solvent/solvent.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/peleffy/solvent/solvent.py b/peleffy/solvent/solvent.py index 4132b8e6..af0da80c 100644 --- a/peleffy/solvent/solvent.py +++ b/peleffy/solvent/solvent.py @@ -295,12 +295,6 @@ def __init__(self, molecule): super().__init__(molecule) - def _initialize_from_molecule(self): - """ - Initializes the OBC1 solvent using an peleffy's Molecule. - """ - super()._initialize_from_molecule() - class OBC2(_OpenFFCompatibleSolvent): """ @@ -334,12 +328,6 @@ def __init__(self, molecule): """ super().__init__(molecule) - def _initialize_from_molecule(self): - """ - Initializes the OBC2 solvent using an peleffy's Molecule. - """ - super()._initialize_from_molecule() - class OPLSOBC(_OPLS2005CompatibleSolvent): """