From 6016ac58ec340e654adc187dc6be1d44efee2fe0 Mon Sep 17 00:00:00 2001 From: Marco Biasini <marco.biasini@unibas.ch> Date: Wed, 18 May 2011 19:25:04 +0200 Subject: [PATCH] Allow to pass dssp binary path to AssignDSSP While we are in there, also fix BZDNG-235 by checking that DSSP is executable and not a directory and making sure the output file exists before continuing. --- modules/bindings/pymod/dssp.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/modules/bindings/pymod/dssp.py b/modules/bindings/pymod/dssp.py index 56f78bd05..6e60c1c8d 100644 --- a/modules/bindings/pymod/dssp.py +++ b/modules/bindings/pymod/dssp.py @@ -44,12 +44,17 @@ def _Cleanup(pdb_path, temp_path, entity_saved): if os.path.exists(temp_path): os.remove(temp_path) -def _ExecuteDSSP(path, temp_dir=None): +def _ExecuteDSSP(path, dssp_bin, temp_dir=None): # use of mktemp is a safty problem (use mkstemp and provide file handle to # subsequent process temp_dssp_path=tempfile.mktemp(suffix=".out",prefix="dssp", dir=temp_dir) - dssp_abs_path=settings.Locate('dssp', env_name='DSSP_EXECUTABLE') - assert os.path.exists(path) + dssp_abs_path=settings.Locate('dssp', env_name='DSSP_EXECUTABLE', + explicit_file_name=dssp_bin) + if os.path.isdir(dssp_abs_path): + raise RuntimeError('"%s" is a directory. Specify path to DSSP binary' % dssp_abs_path) + if not os.access(dssp_abs_path, os.X_OK): + raise RuntimeError('"%s" is not executable' % dssp_abs_path) + ps=subprocess.Popen([dssp_abs_path, path, temp_dssp_path], stderr=subprocess.PIPE) err_lines=ps.stderr.readlines() @@ -72,7 +77,8 @@ def _CalcRelativeSA(residue_type, absolute_sa): return rel -def AssignDSSP(ent, pdb_path="", extract_burial_status=False, tmp_dir=None): +def AssignDSSP(ent, pdb_path="", extract_burial_status=False, tmp_dir=None, + dssp_bin=None): """ Assign secondary structure states to peptide residues in the structure. This function uses the DSSP command line program. @@ -85,9 +91,10 @@ def AssignDSSP(ent, pdb_path="", extract_burial_status=False, tmp_dir=None): :param extract_burial_status: If true, also extract burial status :param tmp_dir: If set, overrides the default tmp directory of the operating system - + :param dssp_bin: The path to the DSSP executable :raises: :class:`~ost.settings.FileNotFound` if the dssp executable is not in the path. + :raises: :class:`RuntimeError` when dssp is executed with errors """ entity_saved = False # use of mktemp is a safty problem (use mkstemp and provide file handle to @@ -99,8 +106,9 @@ def AssignDSSP(ent, pdb_path="", extract_burial_status=False, tmp_dir=None): #TODO: exception handling (currently errors occuring here # are handled in the parser LoadDSSP) - temp_dssp_path=_ExecuteDSSP(pdb_path) - + temp_dssp_path=_ExecuteDSSP(pdb_path, dssp_bin) + if not os.path.exists(temp_dssp_path): + raise RuntimeEror('DSSP output file does not exist.') # assign DSSP to entity try: LoadDSSP(temp_dssp_path, ent, extract_burial_status, -- GitLab