Skip to content

Commit

Permalink
Merge pull request #147 from martimunicoy/devel
Browse files Browse the repository at this point in the history
1.3.3 Release
  • Loading branch information
martimunicoy committed Jun 11, 2021
2 parents 9b6110a + ef8635e commit fe4308c
Show file tree
Hide file tree
Showing 13 changed files with 965 additions and 266 deletions.
13 changes: 13 additions & 0 deletions docs/releasehistory.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,19 @@ Releases follow the ``major.minor.micro`` scheme recommended by `PEP440 <https:/
* ``minor`` increments add features but do not break API compatibility
* ``micro`` increments represent bugfix releases or improvements in documentation

1.3.3 - Explicit hydrogens support
---------------------------------------------------------

This is a micro release of peleffy that includes support for the new OpenFF flag to manage explicit and implicit hydrogen atoms.

New features
""""""""""""
- `PR #146 <https://github.com/martimunicoy/peleffy/pull/146>`_: Adds support for the new explicit hydrogens flag

Tests added
"""""""""""
- `PR #146 <https://github.com/martimunicoy/peleffy/pull/146>`_: New test to check new explicit hydrogens flag


1.3.2 - Migration and support for openff.toolkit
---------------------------------------------------------
Expand Down
336 changes: 235 additions & 101 deletions examples/OFF_parameterization/parameterize.ipynb

Large diffs are not rendered by default.

246 changes: 215 additions & 31 deletions examples/OPLS_parameterization/parameterize.ipynb

Large diffs are not rendered by default.

246 changes: 211 additions & 35 deletions examples/molecular_representations/PDB-SMILES_comparison.ipynb

Large diffs are not rendered by default.

120 changes: 70 additions & 50 deletions examples/rotamers/core_constraints.ipynb

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions peleffy/data/tests/ethane_noH.pdb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
HETATM 1 C1 UNK 1 0.755 0.000 0.000 1.00 0.00 C
HETATM 2 C2 UNK 1 -0.755 0.000 0.000 1.00 0.00 C
CONECT 1 2
END

2 changes: 0 additions & 2 deletions peleffy/forcefield/forcefield.py
Original file line number Diff line number Diff line change
Expand Up @@ -404,9 +404,7 @@ def _get_parameters(self, molecule):

openff_parameters = self._openff.parameterize(molecule,
charge_method='dummy')
print(openff_parameters['sigmas'])
oplsff_parameters = self._oplsff.parameterize(molecule)
print(oplsff_parameters['sigmas'])

if self._nonbonding == 'openff':
hybrid_parameters['atom_names'] = openff_parameters['atom_names']
Expand Down
100 changes: 88 additions & 12 deletions peleffy/tests/test_molecule.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def test_smiles_initialization(self):
"""
It checks the initialization from a SMILES tag.
"""
molecule = Molecule(smiles='c1ccccc1')
molecule = Molecule(smiles='c1ccccc1', hydrogens_are_explicit=False)

# Save it
with tempfile.TemporaryDirectory() as tmpdir:
Expand All @@ -59,12 +59,13 @@ def test_molecule_name_assignment(self):
assert molecule.name == 'benzene', 'Unexpected atom name'

# Look for the SMILES name when a Molecule is loaded from a SMILES tag
molecule = Molecule(smiles='c1ccccc1')
molecule = Molecule(smiles='c1ccccc1', hydrogens_are_explicit=False)
assert molecule.name == 'c1ccccc1', 'Unexpected atom name'

# Look for benzene name when a Molecule is loaded from a SMILES tag
# with a custom name
molecule = Molecule(smiles='c1ccccc1', name='benzene')
molecule = Molecule(smiles='c1ccccc1', name='benzene',
hydrogens_are_explicit=False)
assert molecule.name == 'benzene', 'Unexpected atom name'

def test_molecule_tag_assignment(self):
Expand All @@ -88,12 +89,13 @@ def test_molecule_tag_assignment(self):
assert molecule.tag == 'BEN', 'Unexpected atom tag'

# Look for UNK tag when a Molecule is loaded from a SMILES tag
molecule = Molecule(smiles='c1ccccc1')
molecule = Molecule(smiles='c1ccccc1', hydrogens_are_explicit=False)
assert molecule.tag == 'UNK', 'Unexpected atom tag'

# Look for BNZ tag when a Molecule is loaded from a SMILES tag with
# a custom tag
molecule = Molecule(smiles='c1ccccc1', tag='BNZ')
molecule = Molecule(smiles='c1ccccc1', tag='BNZ',
hydrogens_are_explicit=False)
assert molecule.tag == 'BNZ', 'Unexpected atom tag'

def test_PDB_connectivity_template(self):
Expand Down Expand Up @@ -198,23 +200,24 @@ def check_residue_name(name):
check_residue_name('TAG')

# Checking default tag assignment from SMILES
molecule = Molecule(smiles='c1ccccc1')
molecule = Molecule(smiles='c1ccccc1', hydrogens_are_explicit=False)
with tempfile.TemporaryDirectory() as tmpdir:
with temporary_cd(tmpdir):
assert molecule.tag == 'UNK', 'Unexpected molecule tag'
molecule.to_pdb_file('molecule.pdb')
check_residue_name('UNK')

# Checking custom tag assignment from SMILES
molecule = Molecule(smiles='c1ccccc1', tag='BEN')
molecule = Molecule(smiles='c1ccccc1', tag='BEN',
hydrogens_are_explicit=False)
with tempfile.TemporaryDirectory() as tmpdir:
with temporary_cd(tmpdir):
assert molecule.tag == 'BEN', 'Unexpected molecule tag'
molecule.to_pdb_file('molecule.pdb')
check_residue_name('BEN')

# Checking second custom tag assignment from SMILES
molecule = Molecule(smiles='c1ccccc1')
molecule = Molecule(smiles='c1ccccc1', hydrogens_are_explicit=False)
with tempfile.TemporaryDirectory() as tmpdir:
with temporary_cd(tmpdir):
molecule.set_tag('BNZ')
Expand Down Expand Up @@ -281,11 +284,13 @@ def test_undefined_stereo(self):

# This should crash due to an undefined stereochemistry error
with pytest.raises(UndefinedStereochemistryError):
mol = Molecule(smiles='CN(C)CCC=C1c2ccccc2CCc3c1cccc3')
mol = Molecule(smiles='CN(C)CCC=C1c2ccccc2CCc3c1cccc3',
hydrogens_are_explicit=False)

# This now should work
mol = Molecule(smiles='CN(C)CCC=C1c2ccccc2CCc3c1cccc3',
allow_undefined_stereo=True)
allow_undefined_stereo=True,
hydrogens_are_explicit=False)

# And we can parameterize it
ff = OpenForceField('openff_unconstrained-1.2.1.offxml')
Expand Down Expand Up @@ -330,7 +335,9 @@ def test_from_openff(self):
"""
from openff.toolkit.topology import Molecule as OpenFFMolecule

openff_molecule = OpenFFMolecule.from_smiles('C(C(=O)[O-])C(=O)[OH]')
openff_molecule = \
OpenFFMolecule.from_smiles('C(C(=O)[O-])C(=O)[OH]',
hydrogens_are_explicit=False)

molecule = Molecule.from_openff(openff_molecule)

Expand All @@ -350,6 +357,75 @@ def test_from_openff(self):
assert molecule.graph is not None, \
'Molecule\' graph should be initialized'

def test_explicit_hydrogens(self):
"""
It checks initialization of a Molecule with the explicit hydrogens
flag.
"""

# Load ethane from SMILES with implicit hydrogen atoms
molecule = Molecule(smiles='CC')
atom_names = molecule.get_pdb_atom_names()

for atom_name in atom_names:
assert 'H' not in atom_name, 'Unexpected H in molecule without ' \
+ 'explicit hydrogen atoms and hydrogens_are_explicit ' \
+ 'set to True'

# Load ethane from SMILES without explicit hydrogen atoms
molecule = Molecule(smiles='CC', hydrogens_are_explicit=False)
atom_names = molecule.get_pdb_atom_names()

found_hydrogen = False
for atom_name in atom_names:
if 'H' in atom_name:
found_hydrogen = True
break

assert found_hydrogen, 'Hydrogen not found regardless of setting ' \
+ 'hydrogens_are_explicit to False'

# Load ethane from SMILES with explicit hydrogen atoms
molecule = Molecule(smiles='[H]C([H])([H])C([H])([H])([H])',
hydrogens_are_explicit=True)
atom_names = molecule.get_pdb_atom_names()

found_hydrogen = False
for atom_name in atom_names:
if 'H' in atom_name:
found_hydrogen = True
break

assert found_hydrogen, 'Hydrogen not found regardless of being ' \
+ 'explicitly defined in the SMILES tag'

# Load ethane from PDB with implicit hydrogen atoms
pdb_path = get_data_file_path('tests/ethane_noH.pdb')
molecule = Molecule(pdb_path,
hydrogens_are_explicit=True)
atom_names = molecule.get_pdb_atom_names()

for atom_name in atom_names:
assert 'H' not in atom_name, 'Unexpected H in molecule without ' \
+ 'explicit hydrogen atoms and hydrogens_are_explicit ' \
+ 'set to True'

# Load ethane from PDB without explicit hydrogen atoms
pdb_path = get_data_file_path('tests/ethane_noH.pdb')
molecule = Molecule(pdb_path,
hydrogens_are_explicit=False)
atom_names = molecule.get_pdb_atom_names()

found_hydrogen = False
for atom_name in atom_names:
if 'H' in atom_name:
found_hydrogen = True
break

assert found_hydrogen, 'Hydrogen not found regardless of setting ' \
+ 'hydrogens_are_explicit to False'


def test_pdb_fixer(self):
"""
It checks the PDB fixer prior parsing a PDB input file for
Expand Down Expand Up @@ -443,7 +519,7 @@ def test_molecule_display(self):

from IPython.display import display

molecule = Molecule(smiles='c1ccccc1')
molecule = Molecule(smiles='c1ccccc1', hydrogens_are_explicit=False)

# This should not raise any Exception
display(molecule)
15 changes: 8 additions & 7 deletions peleffy/tests/test_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ def test_OFF_parameters(self):
MAX_THRESHOLD = 1e-3

# Load benzene ring
molecule = Molecule(smiles='c1ccccc1')
molecule = Molecule(smiles='c1ccccc1', hydrogens_are_explicit=False)

# Parameterize
ff = OpenForceField(FORCEFIELD_NAME)
Expand Down Expand Up @@ -369,7 +369,7 @@ def test_Impact_writable_parameters(self):
"""

# Load benzene ring
molecule = Molecule(smiles='CC=O')
molecule = Molecule(smiles='CC=O', hydrogens_are_explicit=False)

# Parameterize
ff = OpenForceField(FORCEFIELD_NAME)
Expand Down Expand Up @@ -407,7 +407,7 @@ def test_OFF_parameters(self):
MAX_THRESHOLD = 1e-3

# Load benzene ring
molecule = Molecule(smiles='c1ccccc1')
molecule = Molecule(smiles='c1ccccc1', hydrogens_are_explicit=False)

# Parameterize
ff = OpenForceField(FORCEFIELD_NAME)
Expand Down Expand Up @@ -475,7 +475,7 @@ def test_Impact_writable_parameters(self):
"""

# Load benzene ring
molecule = Molecule(smiles='CC=O')
molecule = Molecule(smiles='CC=O', hydrogens_are_explicit=False)

# Parameterize
ff = OpenForceField(FORCEFIELD_NAME)
Expand Down Expand Up @@ -515,7 +515,7 @@ def test_OFF_parameters(self):
"""

# Load molecule
molecule = Molecule(smiles='C=CC(=O)O')
molecule = Molecule(smiles='C=CC(=O)O', hydrogens_are_explicit=False)

# Parameterize
ff = OpenForceField(FORCEFIELD_NAME)
Expand Down Expand Up @@ -635,7 +635,7 @@ def test_Impact_writable_parameters(self):
"""

# Load benzene ring
molecule = Molecule(smiles='CC=O')
molecule = Molecule(smiles='CC=O', hydrogens_are_explicit=False)

# Parameterize
ff = OpenForceField(FORCEFIELD_NAME)
Expand Down Expand Up @@ -793,7 +793,8 @@ def test_nonstandard_dihedrals_writable_parameters(self):
It checks the writable representation of non standard dihedrals.
"""
# Load molecule
molecule = Molecule(smiles='c1c(c(n(n1)S(=O)(=O)C))O')
molecule = Molecule(smiles='c1c(c(n(n1)S(=O)(=O)C))O',
hydrogens_are_explicit=False)

# Parameterize
ff = OpenForceField(FORCEFIELD_NAME)
Expand Down
2 changes: 1 addition & 1 deletion peleffy/tests/test_toolkits.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ def test_get_Schrodinger_parameters(self):
from peleffy.utils.toolkits import ToolkitUnavailableException

# Load benzene ring
molecule = Molecule(smiles='c1ccccc1')
molecule = Molecule(smiles='c1ccccc1', hydrogens_are_explicit=False)

# Load OPLS2005 force field
opls2005 = OPLS2005ForceField()
Expand Down
15 changes: 10 additions & 5 deletions peleffy/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,8 @@ def test_non_datalocal_paths(self):
from peleffy.forcefield import OpenForceField

# Load benzene molecule
molecule = Molecule(smiles='c1ccccc1', name='benzene', tag='BNZ')
molecule = Molecule(smiles='c1ccccc1', name='benzene', tag='BNZ',
hydrogens_are_explicit=False)

# Load force field
openff = OpenForceField('openff_unconstrained-1.2.1.offxml')
Expand Down Expand Up @@ -225,7 +226,8 @@ def test_datalocal_paths_for_openff(self):
from peleffy.forcefield import OpenForceField

# Load benzene molecule
molecule = Molecule(smiles='c1ccccc1', name='benzene', tag='BNZ')
molecule = Molecule(smiles='c1ccccc1', name='benzene', tag='BNZ',
hydrogens_are_explicit=False)

# Load force field
openff = OpenForceField('openff_unconstrained-1.2.1.offxml')
Expand Down Expand Up @@ -289,7 +291,8 @@ def test_datalocal_paths_for_opls(self):
from peleffy.forcefield import OPLS2005ForceField

# Load benzene molecule
molecule = Molecule(smiles='c1ccccc1', name='benzene', tag='BNZ')
molecule = Molecule(smiles='c1ccccc1', name='benzene', tag='BNZ',
hydrogens_are_explicit=False)

# Load force field
opls2005 = OPLS2005ForceField()
Expand Down Expand Up @@ -358,7 +361,8 @@ def test_datalocal_paths_for_offopls(self):
from peleffy.forcefield import OpenFFOPLS2005ForceField

# Load benzene molecule
molecule = Molecule(smiles='c1ccccc1', name='benzene', tag='BNZ')
molecule = Molecule(smiles='c1ccccc1', name='benzene', tag='BNZ',
hydrogens_are_explicit=False)
molecule._forcefield = OpenFFOPLS2005ForceField('OPLS2005')

# Load force field
Expand Down Expand Up @@ -484,7 +488,8 @@ def test_folder_creation(self):
from peleffy.forcefield import OpenForceField

# Load benzene molecule
molecule = Molecule(smiles='c1ccccc1', name='benzene', tag='BNZ')
molecule = Molecule(smiles='c1ccccc1', name='benzene', tag='BNZ',
hydrogens_are_explicit=False)

# Load force field
openff = OpenForceField('openff_unconstrained-1.2.1.offxml')
Expand Down
Loading

0 comments on commit fe4308c

Please sign in to comment.