Mercurial > repos > galaxyp > openms
comparison openms_wrapper.py @ 0:ba86fd127f5a draft
Uploaded
| author | galaxyp |
|---|---|
| date | Wed, 19 Dec 2012 00:32:25 -0500 |
| parents | |
| children | cf0d72c7b482 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:ba86fd127f5a |
|---|---|
| 1 import os | |
| 2 import sys | |
| 3 from optparse import OptionParser | |
| 4 from ConfigParser import SafeConfigParser | |
| 5 from xml.etree import ElementTree | |
| 6 import subprocess | |
| 7 | |
| 8 DEBUG = False | |
| 9 | |
| 10 | |
| 11 def main(): | |
| 12 (options, args) = _parse_args() | |
| 13 for executable, config_path in zip(options.executables, options.configs): | |
| 14 _run_openms(executable, config_path) | |
| 15 | |
| 16 | |
| 17 def _run_openms(executable, config_path): | |
| 18 _exec("%s -write_ini openms.ini" % executable) | |
| 19 tree = ElementTree.parse("openms.ini") | |
| 20 options = _load_options(config_path) | |
| 21 _set_options(tree, executable, options) | |
| 22 tree.write("openms.ini") | |
| 23 if DEBUG: | |
| 24 print 'With openms.ini as:\n%s\n, calling: %s -ini openms.ini' % (open("openms.ini", "r").read(), executable) | |
| 25 _exec("%s -ini openms.ini" % executable) | |
| 26 | |
| 27 | |
| 28 def _exec(command): | |
| 29 proc = subprocess.Popen(args=command, shell=True) | |
| 30 return_code = proc.wait() | |
| 31 if return_code != 0: | |
| 32 sys.exit(return_code) | |
| 33 | |
| 34 | |
| 35 def _set_options(tree, executable, options): | |
| 36 executable_node = tree.find("./NODE[@name='%s']" % executable) | |
| 37 options_node = executable_node.find("./NODE[@name='1']") | |
| 38 for key, raw_value in options.items("simple_options"): | |
| 39 value = _parse_value(raw_value) | |
| 40 _set_option(options_node, key.split("!"), value) | |
| 41 _set_option(options_node, ["no_progress"], "true", required=False) | |
| 42 | |
| 43 | |
| 44 def _set_option(node, key_parts, value, required=True): | |
| 45 key = key_parts[0] | |
| 46 if len(key_parts) == 1: | |
| 47 item = node.find("./ITEM[@name='%s']" % key) | |
| 48 if item is not None: | |
| 49 item.set("value", value) | |
| 50 elif required: | |
| 51 raise Exception("Failed to find specific OpenMS option [%s] in node [%s]" % (key, node)) | |
| 52 else: | |
| 53 sub_node = node.find("./NODE[@name='%s']" % key) | |
| 54 _set_option(sub_node, key_parts[1:], value, required) | |
| 55 | |
| 56 | |
| 57 def _parse_value(raw_value): | |
| 58 value = raw_value | |
| 59 if raw_value in VALUE_FUNCTIONS: | |
| 60 value = VALUE_FUNCTIONS[raw_value](raw_value) | |
| 61 return value | |
| 62 | |
| 63 | |
| 64 ## Special value parser for various OpenMS components | |
| 65 def _get_pepnovo_models_path(_): | |
| 66 pepnovo_path = _get_pepnovo_executable_path(None) | |
| 67 pepnovo_dir = os.path.split(pepnovo_path)[0] | |
| 68 guesses = [os.path.join(pepnovo_dir, 'Models'), | |
| 69 os.path.join(pepnovo_dir, '..', 'Models'), | |
| 70 os.path.join(pepnovo_dir, '..', 'share', 'pepnovo', 'Models')] | |
| 71 models_dir = None | |
| 72 for guess in guesses: | |
| 73 if os.path.isdir(guess): | |
| 74 models_dir = guess | |
| 75 break | |
| 76 return models_dir | |
| 77 | |
| 78 | |
| 79 def _get_pepnovo_executable_path(_): | |
| 80 return _which("PepNovo") | |
| 81 | |
| 82 VALUE_FUNCTIONS = {"@PEPNOVO_MODELS_PATH@": _get_pepnovo_models_path, | |
| 83 "@PEPNOVO_EXECUTABLE_PATH@": _get_pepnovo_executable_path} | |
| 84 | |
| 85 | |
| 86 # http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python | |
| 87 def _which(program): | |
| 88 | |
| 89 def is_exe(fpath): | |
| 90 return os.path.isfile(fpath) and os.access(fpath, os.X_OK) | |
| 91 | |
| 92 fpath, fname = os.path.split(program) | |
| 93 if fpath: | |
| 94 if is_exe(program): | |
| 95 return program | |
| 96 else: | |
| 97 for path in os.environ["PATH"].split(os.pathsep): | |
| 98 exe_file = os.path.join(path, program) | |
| 99 if is_exe(exe_file): | |
| 100 return exe_file | |
| 101 | |
| 102 return None | |
| 103 | |
| 104 | |
| 105 def _parse_args(): | |
| 106 parser = OptionParser() | |
| 107 parser.add_option("-e", "--executable", dest="executables", default=[], action="append") | |
| 108 parser.add_option("-c", "--config", dest="configs", default=[], action="append") | |
| 109 return parser.parse_args() | |
| 110 | |
| 111 | |
| 112 def _load_options(config_path): | |
| 113 config_parser = SafeConfigParser() | |
| 114 config_parser.read(config_path) | |
| 115 return config_parser | |
| 116 | |
| 117 if __name__ == "__main__": | |
| 118 main() |
