diff --git a/propka/lib.py b/propka/lib.py index 509d4b2..be2dbf6 100644 --- a/propka/lib.py +++ b/propka/lib.py @@ -4,6 +4,8 @@ from __future__ import print_function import sys import pkg_resources import logging +import argparse + logger = logging.getLogger("propka") stdout_handler = logging.StreamHandler(sys.stdout) @@ -136,9 +138,95 @@ def parse_res_string(res_str): return chain, resnum, inscode +def build_parser(parser_=None): + """Build an argument parser for PROPKA. + + Args: + parser_: existing parser. If this is not None, then the PROPKA parser will + be created as a subparser to this existing parser. Otherwise, a + new parser will be created. + Returns: + ArgumentParser object. + """ + if parser_ is not None: + subparsers = parser_.add_subparsers(title="PROPKA sub-command group", + dest="propka_group", action="store_true") + parser = subparsers.add_parser("PROPKA", help="PROPKA invocation options", + dest="propka", action="store_true") + else: + parser = argparse.ArgumentParser(description=("PROPKA predicts the pKa values of ionizable " + "groups in proteins and protein-ligand " + "complexes based in the 3D structure"), + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument("-f", "--file", action="append", dest="filenames", + help="read data from , i.e. is added to arguments") + parser.add_argument("-r", "--reference", dest="reference", default="neutral", + help=("setting which reference to use for stability calculations " + "[neutral/low-pH]")) + parser.add_argument("-c", "--chain", action="append", dest="chains", + help=('creating the protein with only a specified chain. Specify ' + '" " for chains without ID [all]')) + parser.add_argument("-i", "--titrate_only", dest="titrate_only", + help=('Treat only the specified residues as titratable. Value should ' + 'be a comma-separated list of "chain:resnum" values; for example: ' + '-i "A:10,A:11"')) + parser.add_argument("-t", "--thermophile", action="append", dest="thermophiles", + help=("defining a thermophile filename; usually used in " + "'alignment-mutations'")) + parser.add_argument("-a", "--alignment", action="append", dest="alignment", + help=("alignment file connecting and " + "[.pir]")) + parser.add_argument("-m", "--mutation", action="append", dest="mutations", + help=("specifying mutation labels which is used to modify " + " according to, e.g. N25R/N181D")) + parser.add_argument("-v", "--version", dest="version_label", default="Jan15", + help="specifying the sub-version of propka [Jan15/Dec19]") + parser.add_argument("-p", "--parameters", dest="parameters", + default=pkg_resources.resource_filename(__name__, "propka.cfg"), + help="set the parameter file [%default]") + parser.add_argument("-z", "--verbose", dest="verbosity", action="store_const", + const=2, help="output debugging information") + parser.add_argument("-q", "--quiet", dest="verbosity", action="store_const", + const=0, default=1, help="inhibit printing to stdout") + parser.add_argument("-o", "--pH", dest="pH", type=float, default=7.0, + help="setting pH-value used in e.g. stability calculations [7.0]") + parser.add_argument("-w", "--window", dest="window", nargs=3, type=float, + default=(0.0, 14.0, 1.0), + help=("setting the pH-window to show e.g. stability profiles " + "[0.0, 14.0, 1.0]")) + parser.add_argument("-g", "--grid", dest="grid", nargs=3, type=float, + default=(0.0, 14.0, 0.1), + help=("setting the pH-grid to calculate e.g. stability " + "related properties [0.0, 14.0, 0.1]")) + parser.add_argument("--mutator", dest="mutator", + help="setting approach for mutating [alignment/scwrl/jackal]") + parser.add_argument("--mutator-option", dest="mutator_options", action="append", + help="setting property for mutator [e.g. type=\"side-chain\"]") + parser.add_argument("-d", "--display-coupled-residues", dest="display_coupled_residues", + action="store_true", help=("Displays alternative pKa values due " + "to coupling of titratable groups")) + parser.add_argument("-l", "--reuse-ligand-mol2-files", dest="reuse_ligand_mol2_file", + action="store_true", default=False, + help=("Reuses the ligand mol2 files allowing the user to alter " + "ligand bond orders")) + parser.add_argument("-k", "--keep-protons", dest="keep_protons", action="store_true", + help="Keep protons in input file", default=False) + parser.add_argument("--protonate-all", dest="protonate_all", action="store_true", + help="Protonate all atoms (will not influence pKa calculation)", + default=False) + parser.add_argument("input_pdb", + help="read data from ") + return parser + + def loadOptions(*args): """ - Load the arguments parser with options. Note that verbosity is set as soon as this function is invoked. + Load the arguments parser with options. Note that verbosity is set as soon + as this function is invoked. + + Returns: + argparse namespace """ from optparse import OptionParser @@ -149,68 +237,17 @@ def loadOptions(*args): parser = OptionParser(usage) # loading the parser - parser.add_option("-f", "--file", action="append", dest="filenames", - help="read data from , i.e. is added to arguments") - parser.add_option("-r", "--reference", dest="reference", default="neutral", - help="setting which reference to use for stability calculations [neutral/low-pH]") - parser.add_option("-c", "--chain", action="append", dest="chains", - help='creating the protein with only a specified chain. Specify " " for chains without ID [all]') - parser.add_option("-i", "--titrate_only", dest="titrate_only", - help='Treat only the specified residues as titratable. Value should ' - 'be a comma-separated list of "chain:resnum" values; for example: ' - '-i "A:10,A:11"') - parser.add_option("-t", "--thermophile", action="append", dest="thermophiles", - help="defining a thermophile filename; usually used in 'alignment-mutations'") - parser.add_option("-a", "--alignment", action="append", dest="alignment", - help="alignment file connecting and [.pir]") - parser.add_option("-m", "--mutation", action="append", dest="mutations", - help="specifying mutation labels which is used to modify according to, e.g. N25R/N181D") - parser.add_option("-v", "--version", dest="version_label", default="Jan15", - help="specifying the sub-version of propka [Jan15/Dec19]") - parser.add_option("-p", "--parameters",dest="parameters", default=pkg_resources.resource_filename(__name__, "propka.cfg"), - help="set the parameter file [%default]") - parser.add_option("-z", "--verbose", dest="verbosity", action="store_const", const=2, - help="output debugging information") - parser.add_option("-q", "--quiet", dest="verbosity", action="store_const", const=0, default=1, - help="inhibit printing to stdout") - parser.add_option("-o", "--pH", dest="pH", type="float", default=7.0, - help="setting pH-value used in e.g. stability calculations [7.0]") - parser.add_option("-w", "--window", dest="window", nargs=3, type="float", default=(0.0, 14.0, 1.0), - help="setting the pH-window to show e.g. stability profiles [0.0, 14.0, 1.0]") - parser.add_option("-g", "--grid", dest="grid", nargs=3, type="float", default=(0.0, 14.0, 0.1), - help="setting the pH-grid to calculate e.g. stability related properties [0.0, 14.0, 0.1]") - parser.add_option("--mutator", dest="mutator", - help="setting approach for mutating [alignment/scwrl/jackal]") - parser.add_option("--mutator-option", dest="mutator_options", action="append", - help="setting property for mutator [e.g. type=\"side-chain\"]") - - parser.add_option("-d","--display-coupled-residues", dest="display_coupled_residues", action="store_true", - help="Displays alternative pKa values due to coupling of titratable groups") - parser.add_option("-l","--reuse-ligand-mol2-files", dest="reuse_ligand_mol2_file", action="store_true", - help="Reuses the ligand mol2 files allowing the user to alter ligand bond orders", default=False) - parser.add_option("-k","--keep-protons", dest="keep_protons", action="store_true", - help="Keep protons in input file", default=False) - parser.add_option("--protonate-all", dest="protonate_all", action="store_true", - help="Protonate all atoms (will not influence pKa calculation)", default=False) - + parser = build_parser() # parsing and returning options and arguments if len(args) == 0: # command line - options, args = parser.parse_args() + options = parser.parse_args() else: - options, args = parser.parse_args(list(args)) + options = parser.parse_args(list(args)) # adding specified filenames to arguments - if options.filenames: - for filename in options.filenames: - args.append(filename) - - # checking at early stage that there is at least one pdbfile to work with. The error message is misleading - # if one is using the python interface via Molecular_container. - if len(args) == 0: - info("No pdbfile provided") - #sys.exit(9) + options.filenames.append(options.input_pdb) # Convert titrate_only string to a list of (chain, resnum) items: if options.titrate_only is not None: @@ -236,10 +273,7 @@ def loadOptions(*args): logger.warning("Invalid verbosity level, using default") # done! - return options, args - - - + return options def makeTidyAtomLabel(name,element): diff --git a/propka/run.py b/propka/run.py index 7eb13a5..d5b3cc2 100644 --- a/propka/run.py +++ b/propka/run.py @@ -1,13 +1,18 @@ # entry point for propka script - +import logging import propka.lib, propka.molecular_container + +_LOGGER = logging.getLogger("PROPKA") + + def main(): """ Reads in structure files, calculates pKa values, and prints pKa files """ # loading options, flaggs and arguments - options, pdbfiles = propka.lib.loadOptions() + options = propka.lib.loadOptions() + pdbfiles = options.filenames for pdbfile in pdbfiles: my_molecule = propka.molecular_container.Molecular_container(pdbfile, options) @@ -25,7 +30,10 @@ def single(pdbfile, optargs=None): single("protein.pdb", optargs=["--mutation=N25R/N181D", "-v", "--pH=7.2"]) """ optargs = optargs if optargs is not None else [] - options, ignored_pdbfiles = propka.lib.loadOptions(*optargs) + options = propka.lib.loadOptions(*optargs) + pdbfile = options.filenames.pop(0) + if len(options.filenames) > 0: + _LOGGER.warning("Ignoring filenames: %s", options.filenames) my_molecule = propka.molecular_container.Molecular_container(pdbfile, options) my_molecule.calculate_pka() diff --git a/scripts/propka31.py b/scripts/propka31.py index a35426b..3b8c81e 100755 --- a/scripts/propka31.py +++ b/scripts/propka31.py @@ -16,7 +16,8 @@ def main(): Reads in structure files, calculates pKa values, and prints pKa files """ # loading options, flaggs and arguments - options, pdbfiles = propka.lib.loadOptions() + options = propka.lib.loadOptions() + pdbfiles = options.filenames for pdbfile in pdbfiles: my_molecule = propka.molecular_container.Molecular_container(pdbfile, options)