Mercurial > repos > galaxyp > openms
view openms_wrapper.py @ 0:ba86fd127f5a draft
Uploaded
author | galaxyp |
---|---|
date | Wed, 19 Dec 2012 00:32:25 -0500 |
parents | |
children | cf0d72c7b482 |
line wrap: on
line source
import os import sys from optparse import OptionParser from ConfigParser import SafeConfigParser from xml.etree import ElementTree import subprocess DEBUG = False def main(): (options, args) = _parse_args() for executable, config_path in zip(options.executables, options.configs): _run_openms(executable, config_path) def _run_openms(executable, config_path): _exec("%s -write_ini openms.ini" % executable) tree = ElementTree.parse("openms.ini") options = _load_options(config_path) _set_options(tree, executable, options) tree.write("openms.ini") if DEBUG: print 'With openms.ini as:\n%s\n, calling: %s -ini openms.ini' % (open("openms.ini", "r").read(), executable) _exec("%s -ini openms.ini" % executable) def _exec(command): proc = subprocess.Popen(args=command, shell=True) return_code = proc.wait() if return_code != 0: sys.exit(return_code) def _set_options(tree, executable, options): executable_node = tree.find("./NODE[@name='%s']" % executable) options_node = executable_node.find("./NODE[@name='1']") for key, raw_value in options.items("simple_options"): value = _parse_value(raw_value) _set_option(options_node, key.split("!"), value) _set_option(options_node, ["no_progress"], "true", required=False) def _set_option(node, key_parts, value, required=True): key = key_parts[0] if len(key_parts) == 1: item = node.find("./ITEM[@name='%s']" % key) if item is not None: item.set("value", value) elif required: raise Exception("Failed to find specific OpenMS option [%s] in node [%s]" % (key, node)) else: sub_node = node.find("./NODE[@name='%s']" % key) _set_option(sub_node, key_parts[1:], value, required) def _parse_value(raw_value): value = raw_value if raw_value in VALUE_FUNCTIONS: value = VALUE_FUNCTIONS[raw_value](raw_value) return value ## Special value parser for various OpenMS components def _get_pepnovo_models_path(_): pepnovo_path = _get_pepnovo_executable_path(None) pepnovo_dir = os.path.split(pepnovo_path)[0] guesses = [os.path.join(pepnovo_dir, 'Models'), os.path.join(pepnovo_dir, '..', 'Models'), os.path.join(pepnovo_dir, '..', 'share', 'pepnovo', 'Models')] models_dir = None for guess in guesses: if os.path.isdir(guess): models_dir = guess break return models_dir def _get_pepnovo_executable_path(_): return _which("PepNovo") VALUE_FUNCTIONS = {"@PEPNOVO_MODELS_PATH@": _get_pepnovo_models_path, "@PEPNOVO_EXECUTABLE_PATH@": _get_pepnovo_executable_path} # http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python def _which(program): def is_exe(fpath): return os.path.isfile(fpath) and os.access(fpath, os.X_OK) fpath, fname = os.path.split(program) if fpath: if is_exe(program): return program else: for path in os.environ["PATH"].split(os.pathsep): exe_file = os.path.join(path, program) if is_exe(exe_file): return exe_file return None def _parse_args(): parser = OptionParser() parser.add_option("-e", "--executable", dest="executables", default=[], action="append") parser.add_option("-c", "--config", dest="configs", default=[], action="append") return parser.parse_args() def _load_options(config_path): config_parser = SafeConfigParser() config_parser.read(config_path) return config_parser if __name__ == "__main__": main()