Skip to content

Commit

Permalink
Merge pull request #171 from martimunicoy/ffld_error
Browse files Browse the repository at this point in the history
Ffld error
  • Loading branch information
martimunicoy committed Jun 21, 2022
2 parents c25cda0 + 202ce26 commit cc41953
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 49 deletions.
4 changes: 2 additions & 2 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
# -- Project information -----------------------------------------------------

project = 'Open Force Field for PELE'
copyright = '2020, Barcelona Supercomputing Center'
copyright = '2022, Barcelona Supercomputing Center'
author = 'Martí Municoy'


Expand Down Expand Up @@ -85,7 +85,7 @@ def add_source_parser(_old_add_source_parser, self, *args, **kwargs):

#import peleffy
#version = peleffy.__version__
version = '1.4.1'
version = '1.4.3'

pygments_style = 'sphinx'

Expand Down
10 changes: 10 additions & 0 deletions docs/releasehistory.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ Releases follow the ``major.minor.micro`` scheme recommended by `PEP440 <https:/
* ``micro`` increments represent bugfix releases or improvements in documentation


1.4.3 - Minor improvements for CLI arguments and ffld_server
------------------------------------------------------------

This is a micro release of peleffy that contains minor improvements for the CLI interface and the usage of the ffld_server.

New features
""""""""""""
- `PR #171 <https://github.com/martimunicoy/peleffy/pull/171>`_: improvements for the CLI interface. Also, ffld_server will not raise an exception but any warning or error found will be raised by peleffy's logger


1.4.2 - Compatibility fixes for latest RDKit and Schrodinger versions
---------------------------------------------------------------------

Expand Down
2 changes: 1 addition & 1 deletion peleffy/forcefield/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
from .forcefield import *
from .selectors import ForceFieldSelector
from .selectors import *
25 changes: 16 additions & 9 deletions peleffy/forcefield/selectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@
"""


_ALL_ = ["ForceFieldSelector", "ChargeCalculatorSelector"]


class ForceFieldSelector(object):
"""
It defines a force field selector.
"""
_FF_TYPES = {'OPLS2005': ('OPLS2005'),
_FF_TYPES = {'OPLS2005': ('OPLS2005', ),
'OpenFF': ('openff_unconstrained-2.0.0.offxml',
'openff_unconstrained-1.3.0.offxml',
'openff_unconstrained-1.2.1.offxml',
Expand Down Expand Up @@ -69,11 +72,16 @@ def get_list(self):
Returns
-------
forcefields : dict
The complete list of available force fields grouped by
force field type
forcefields : list[str]
The complete list of available force fields
"""
return self._FF_TYPES
forcefields = []

for ff_type in self._FF_TYPES:
forcefields.extend([ff_name.lower() for ff_name in
self._FF_TYPES[ff_type]])

return forcefields


class ChargeCalculatorSelector(object):
Expand Down Expand Up @@ -131,8 +139,7 @@ def get_list(self):
Returns
-------
forcefields : dict
The complete list of available force fields grouped by
force field type
charge_methods : list[str]
The complete list of available charge methods
"""
return self._FF_TYPES
return list(self._AVAILABLE_TYPES.keys())
48 changes: 39 additions & 9 deletions peleffy/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,9 @@
from peleffy.forcefield.selectors import ChargeCalculatorSelector


DEFAULT_OFF_FORCEFIELD = 'openff_unconstrained-1.3.0.offxml'
DEFAULT_OFF_FORCEFIELD = 'openff_unconstrained-2.0.0.offxml'
DEFAULT_RESOLUTION = int(30)
DEFAULT_CHARGE_METHOD = 'am1bcc'
AVAILABLE_CHARGE_METHODS = ChargeCalculatorSelector()._AVAILABLE_TYPES.keys()
DEFAULT_CHARGE_METHOD = None # Use FF's default
IMPACT_TEMPLATE_PATH = 'DataLocal/Templates/OFF/Parsley/HeteroAtoms/'
ROTAMER_LIBRARY_PATH = 'DataLocal/LigandRotamerLibs/'
SOLVENT_TEMPLATE_PATH = 'DataLocal/OBC/'
Expand All @@ -41,9 +40,12 @@ def parse_args(args):
parsed_args : argparse.Namespace
It contains the command-line arguments that are supplied by the user
"""
parser = ap.ArgumentParser()
import peleffy

parser = ap.ArgumentParser(prog="PELE Force Field Yielder (peleffy)")
parser.add_argument("pdb_file", metavar="PDB FILE", type=str,
help="Path PDB file to parameterize")
help="Path PDB file to parameterize",
default=None)
parser.add_argument("-f", "--forcefield", metavar="NAME",
type=str, help="OpenForceField's forcefield name. " +
"Default is " + str(DEFAULT_OFF_FORCEFIELD),
Expand All @@ -66,8 +68,7 @@ def parse_args(args):
"DataLocal hierarchy", action='store_true')
parser.add_argument('-c', '--charge_method', metavar="NAME",
type=str, help="The name of the method to use to " +
"compute charges", default=DEFAULT_CHARGE_METHOD,
choices=AVAILABLE_CHARGE_METHODS)
"compute charges", default=DEFAULT_CHARGE_METHOD)
parser.add_argument('--charges_from_file', metavar="PATH",
type=str, help="The path to the file with charges",
default=None)
Expand All @@ -92,6 +93,9 @@ def parse_args(args):
action='store_true',
help="Generate Impact template compatible with " +
"PELE\'s AMBER implementation")
parser.add_argument('-v', '--version',
action='version',
version='%(prog)s {}'.format(peleffy.__version__))

parser.set_defaults(as_datalocal=False)
parser.set_defaults(with_solvent=False)
Expand All @@ -101,6 +105,29 @@ def parse_args(args):
parser.set_defaults(for_amber=False)

parsed_args = parser.parse_args(args)

# Check force field
from peleffy.forcefield import ForceFieldSelector

selector = ForceFieldSelector()
available_ffs = selector.get_list()

if parsed_args.forcefield.lower() not in available_ffs:
raise ValueError('Force field ' +
'\'{}\' '.format(parsed_args.forcefield) +
'is unknown')

# Check charge method
if parsed_args.charge_method is not None:
from peleffy.forcefield import ChargeCalculatorSelector

selector = ChargeCalculatorSelector()
available_charge_methods = selector.get_list()

if parsed_args.charge_method.lower() not in available_charge_methods:
raise ValueError('Charge method ' +
'\'{}\' '.format(parsed_args.charge_method) +
'is unknown')

return parsed_args

Expand Down Expand Up @@ -157,11 +184,14 @@ def run_peleffy(pdb_file,
+ ' - Charge file: {}'.format(charges_from_file)
charge_method = 'dummy'
else:
charge_method_str = charge_method
if charge_method is None:
charge_method_str = "-"
else:
charge_method_str = charge_method

log = Logger()
log.info('-' * 60)
log.info('Open Force Field parameterizer for PELE', peleffy.__version__)
log.info('PELE Force Field Yielder', peleffy.__version__)
log.info('-' * 60)
log.info(' - General:')
log.info(' - Input PDB:', pdb_file)
Expand Down
44 changes: 19 additions & 25 deletions peleffy/tests/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,11 @@ def test_peleffy_argparse(self):

assert parsed_args.as_datalocal is False, \
'Unexpected as_datalocal settings were parsed'
assert parsed_args.charge_method == 'am1bcc', \
assert parsed_args.charge_method == None, \
'Unexpected charge_method settings were parsed'
assert parsed_args.debug is False, \
'Unexpected debug settings were parsed'
assert parsed_args.forcefield == 'openff_unconstrained-1.3.0.offxml', \
assert parsed_args.forcefield == 'openff_unconstrained-2.0.0.offxml', \
'Unexpected forcefield settings were parsed'
assert parsed_args.include_terminal_rotamers is False, \
'Unexpected include_terminal_rotamers settings were parsed'
Expand Down Expand Up @@ -152,23 +152,20 @@ def test_peleffy_argparse(self):
'Unexpected for_amber settings were parsed'

# Test unexpected charge method
with pytest.raises(SystemExit) as pytest_wrapped_e:
with pytest.raises(ValueError):
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(['methane.pdb',
'--as_datalocal'])

assert parsed_args.as_datalocal is True, \
'Unexpected as_datalocal settings were parsed'
assert parsed_args.charge_method == 'am1bcc', \
assert parsed_args.charge_method == None, \
'Unexpected charge_method settings were parsed'
assert parsed_args.debug is False, \
'Unexpected debug settings were parsed'
assert parsed_args.forcefield == 'openff_unconstrained-1.3.0.offxml', \
assert parsed_args.forcefield == 'openff_unconstrained-2.0.0.offxml', \
'Unexpected forcefield settings were parsed'
assert parsed_args.include_terminal_rotamers is False, \
'Unexpected include_terminal_rotamers settings were parsed'
Expand All @@ -193,11 +190,11 @@ def test_peleffy_argparse(self):

assert parsed_args.as_datalocal is False, \
'Unexpected as_datalocal settings were parsed'
assert parsed_args.charge_method == 'am1bcc', \
assert parsed_args.charge_method == None, \
'Unexpected charge_method settings were parsed'
assert parsed_args.debug is False, \
'Unexpected debug settings were parsed'
assert parsed_args.forcefield == 'openff_unconstrained-1.3.0.offxml', \
assert parsed_args.forcefield == 'openff_unconstrained-2.0.0.offxml', \
'Unexpected forcefield settings were parsed'
assert parsed_args.include_terminal_rotamers is False, \
'Unexpected include_terminal_rotamers settings were parsed'
Expand All @@ -224,11 +221,11 @@ def test_peleffy_argparse(self):

assert parsed_args.as_datalocal is False, \
'Unexpected as_datalocal settings were parsed'
assert parsed_args.charge_method == 'am1bcc', \
assert parsed_args.charge_method == None, \
'Unexpected charge_method settings were parsed'
assert parsed_args.debug is False, \
'Unexpected debug settings were parsed'
assert parsed_args.forcefield == 'openff_unconstrained-1.3.0.offxml', \
assert parsed_args.forcefield == 'openff_unconstrained-2.0.0.offxml', \
'Unexpected forcefield settings were parsed'
assert parsed_args.include_terminal_rotamers is True, \
'Unexpected include_terminal_rotamers settings were parsed'
Expand All @@ -253,11 +250,11 @@ def test_peleffy_argparse(self):

assert parsed_args.as_datalocal is False, \
'Unexpected as_datalocal settings were parsed'
assert parsed_args.charge_method == 'am1bcc', \
assert parsed_args.charge_method == None, \
'Unexpected charge_method settings were parsed'
assert parsed_args.debug is False, \
'Unexpected debug settings were parsed'
assert parsed_args.forcefield == 'openff_unconstrained-1.3.0.offxml', \
assert parsed_args.forcefield == 'openff_unconstrained-2.0.0.offxml', \
'Unexpected forcefield settings were parsed'
assert parsed_args.include_terminal_rotamers is False, \
'Unexpected include_terminal_rotamers settings were parsed'
Expand All @@ -282,11 +279,11 @@ def test_peleffy_argparse(self):

assert parsed_args.as_datalocal is False, \
'Unexpected as_datalocal settings were parsed'
assert parsed_args.charge_method == 'am1bcc', \
assert parsed_args.charge_method == None, \
'Unexpected charge_method settings were parsed'
assert parsed_args.debug is False, \
'Unexpected debug settings were parsed'
assert parsed_args.forcefield == 'openff_unconstrained-1.3.0.offxml', \
assert parsed_args.forcefield == 'openff_unconstrained-2.0.0.offxml', \
'Unexpected forcefield settings were parsed'
assert parsed_args.include_terminal_rotamers is False, \
'Unexpected include_terminal_rotamers settings were parsed'
Expand All @@ -311,11 +308,11 @@ def test_peleffy_argparse(self):

assert parsed_args.as_datalocal is False, \
'Unexpected as_datalocal settings were parsed'
assert parsed_args.charge_method == 'am1bcc', \
assert parsed_args.charge_method == None, \
'Unexpected charge_method settings were parsed'
assert parsed_args.debug is True, \
'Unexpected debug settings were parsed'
assert parsed_args.forcefield == 'openff_unconstrained-1.3.0.offxml', \
assert parsed_args.forcefield == 'openff_unconstrained-2.0.0.offxml', \
'Unexpected forcefield settings were parsed'
assert parsed_args.include_terminal_rotamers is False, \
'Unexpected include_terminal_rotamers settings were parsed'
Expand All @@ -340,11 +337,11 @@ def test_peleffy_argparse(self):

assert parsed_args.as_datalocal is False, \
'Unexpected as_datalocal settings were parsed'
assert parsed_args.charge_method == 'am1bcc', \
assert parsed_args.charge_method == None, \
'Unexpected charge_method settings were parsed'
assert parsed_args.debug is False, \
'Unexpected debug settings were parsed'
assert parsed_args.forcefield == 'openff_unconstrained-1.3.0.offxml', \
assert parsed_args.forcefield == 'openff_unconstrained-2.0.0.offxml', \
'Unexpected forcefield settings were parsed'
assert parsed_args.include_terminal_rotamers is False, \
'Unexpected include_terminal_rotamers settings were parsed'
Expand All @@ -369,11 +366,11 @@ def test_peleffy_argparse(self):

assert parsed_args.as_datalocal is False, \
'Unexpected as_datalocal settings were parsed'
assert parsed_args.charge_method == 'am1bcc', \
assert parsed_args.charge_method == None, \
'Unexpected charge_method settings were parsed'
assert parsed_args.debug is False, \
'Unexpected debug settings were parsed'
assert parsed_args.forcefield == 'openff_unconstrained-1.3.0.offxml', \
assert parsed_args.forcefield == 'openff_unconstrained-2.0.0.offxml', \
'Unexpected forcefield settings were parsed'
assert parsed_args.include_terminal_rotamers is False, \
'Unexpected include_terminal_rotamers settings were parsed'
Expand Down Expand Up @@ -441,6 +438,3 @@ def test_PDB_checks(self):
complex_path = get_data_file_path('complexes/complex_test.pdb')
with pytest.raises(ValueError):
_ = run_peleffy(complex_path, chain = 'C')



10 changes: 7 additions & 3 deletions peleffy/utils/toolkits.py
Original file line number Diff line number Diff line change
Expand Up @@ -1322,6 +1322,10 @@ def run_ffld_server(self, molecule):
ffld_output : str
The ffld_server output
"""
from peleffy.utils import Logger

# Initialize logger
logger = Logger()

ffld_server_exec = self.path_to_ffld_server()

Expand All @@ -1338,9 +1342,9 @@ def run_ffld_server(self, molecule):
"parameters.txt"])

if errors:
raise SystemError('FFLD_SERVER has failed with the ' +
'following error message: \n ' +
'{}'.format(errors.decode("utf-8")))
logger.warning('FFLD_SERVER has produced the ' +
'following error message: \n ' +
'{}'.format(errors.decode("utf-8")))

with open('parameters.txt') as parameters_file:
return parameters_file.read()
3 changes: 3 additions & 0 deletions peleffy/utils/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,9 @@ def __init__(self):

# Add stream handler
self.set_stdout_handler()

# Disable backwards propagation
self._logger.propagate = False
else:
self._logger = logging.getLogger('peleffy_log')

Expand Down

0 comments on commit cc41953

Please sign in to comment.