Mercurial > repos > galaxyp > openms
comparison openms_wrapper.py @ 2:cf0d72c7b482 draft
Update.
| author | galaxyp |
|---|---|
| date | Fri, 10 May 2013 17:31:05 -0400 |
| parents | ba86fd127f5a |
| children | 1183846e70a1 |
comparison
equal
deleted
inserted
replaced
| 1:5c65f8116244 | 2:cf0d72c7b482 |
|---|---|
| 2 import sys | 2 import sys |
| 3 from optparse import OptionParser | 3 from optparse import OptionParser |
| 4 from ConfigParser import SafeConfigParser | 4 from ConfigParser import SafeConfigParser |
| 5 from xml.etree import ElementTree | 5 from xml.etree import ElementTree |
| 6 import subprocess | 6 import subprocess |
| 7 from re import compile | |
| 7 | 8 |
| 8 DEBUG = False | 9 DEBUG = False |
| 9 | 10 |
| 10 | 11 |
| 11 def main(): | 12 def main(): |
| 12 (options, args) = _parse_args() | 13 (options, args) = _parse_args() |
| 13 for executable, config_path in zip(options.executables, options.configs): | 14 for executable, config_path in zip(options.executables, options.configs): |
| 14 _run_openms(executable, config_path) | 15 command_handler = COMMAND_HANDLERS.get(executable, _run_openms) |
| 16 command_handler(executable, config_path) | |
| 17 | |
| 18 | |
| 19 def _run_shell(executable, config_path): | |
| 20 command = open(config_path, "r").read().strip() | |
| 21 if DEBUG: | |
| 22 print "Running shell command %s" % command | |
| 23 _exec(command) | |
| 15 | 24 |
| 16 | 25 |
| 17 def _run_openms(executable, config_path): | 26 def _run_openms(executable, config_path): |
| 18 _exec("%s -write_ini openms.ini" % executable) | 27 _exec("%s -write_ini openms.ini" % executable) |
| 19 tree = ElementTree.parse("openms.ini") | 28 tree = ElementTree.parse("openms.ini") |
| 22 tree.write("openms.ini") | 31 tree.write("openms.ini") |
| 23 if DEBUG: | 32 if DEBUG: |
| 24 print 'With openms.ini as:\n%s\n, calling: %s -ini openms.ini' % (open("openms.ini", "r").read(), executable) | 33 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) | 34 _exec("%s -ini openms.ini" % executable) |
| 26 | 35 |
| 36 COMMAND_HANDLERS = { | |
| 37 "__SHELL__": _run_shell, | |
| 38 } | |
| 39 | |
| 40 | |
| 41 def _fail(message, return_code=1): | |
| 42 print message | |
| 43 sys.exit(return_code) | |
| 44 | |
| 27 | 45 |
| 28 def _exec(command): | 46 def _exec(command): |
| 29 proc = subprocess.Popen(args=command, shell=True) | 47 proc = subprocess.Popen(args=command, shell=True) |
| 30 return_code = proc.wait() | 48 return_code = proc.wait() |
| 31 if return_code != 0: | 49 if return_code != 0: |
| 32 sys.exit(return_code) | 50 _fail("Error executing command [%s], return code is %d" % (command, return_code), return_code) |
| 33 | 51 |
| 34 | 52 |
| 35 def _set_options(tree, executable, options): | 53 def _set_options(tree, executable, options): |
| 36 executable_node = tree.find("./NODE[@name='%s']" % executable) | 54 executable_node = tree.find("./NODE[@name='%s']" % executable) |
| 55 if executable_node is None: | |
| 56 _fail("Could not find options for executable %s" % executable) | |
| 37 options_node = executable_node.find("./NODE[@name='1']") | 57 options_node = executable_node.find("./NODE[@name='1']") |
| 38 for key, raw_value in options.items("simple_options"): | 58 for key, raw_value in options.items("simple_options"): |
| 59 if raw_value is None: | |
| 60 _fail("No value found key %s" % key) | |
| 39 value = _parse_value(raw_value) | 61 value = _parse_value(raw_value) |
| 40 _set_option(options_node, key.split("!"), value) | 62 _set_option(options_node, key.split("!"), value) |
| 41 _set_option(options_node, ["no_progress"], "true", required=False) | 63 _set_option(options_node, ["no_progress"], "true", required=False) |
| 42 | 64 |
| 43 | 65 |
| 44 def _set_option(node, key_parts, value, required=True): | 66 def _set_option(node, key_parts, value, required=True): |
| 45 key = key_parts[0] | 67 key = key_parts[0] |
| 46 if len(key_parts) == 1: | 68 if len(key_parts) == 1: |
| 47 item = node.find("./ITEM[@name='%s']" % key) | 69 if not _set_item_value(node, key, value) and \ |
| 48 if item is not None: | 70 not _set_list_item_value(node, key, value) and \ |
| 49 item.set("value", value) | 71 required: |
| 50 elif required: | 72 _fail("Failed to find specific OpenMS option [%s] in node [%s]" % (key, node)) |
| 51 raise Exception("Failed to find specific OpenMS option [%s] in node [%s]" % (key, node)) | |
| 52 else: | 73 else: |
| 74 if not node: | |
| 75 _fail("Failed to find specific OpenMS option [%s] in node [%s]" % (key, node)) | |
| 53 sub_node = node.find("./NODE[@name='%s']" % key) | 76 sub_node = node.find("./NODE[@name='%s']" % key) |
| 77 if not sub_node: | |
| 78 _fail("Failed to find node for key %s" % key) | |
| 54 _set_option(sub_node, key_parts[1:], value, required) | 79 _set_option(sub_node, key_parts[1:], value, required) |
| 80 | |
| 81 | |
| 82 def _set_item_value(node, key, value): | |
| 83 item = node.find("./ITEM[@name='%s']" % key) | |
| 84 if item is not None: | |
| 85 item.set("value", value) | |
| 86 return item is not None | |
| 87 | |
| 88 | |
| 89 def _set_list_item_value(node, key, values): | |
| 90 item = node.find("./ITEMLIST[@name='%s']" % key) | |
| 91 if item is not None: | |
| 92 for value in values.split(","): | |
| 93 ElementTree.SubElement(item, "LISTITEM", {"value": value}) | |
| 94 return item is not None | |
| 55 | 95 |
| 56 | 96 |
| 57 def _parse_value(raw_value): | 97 def _parse_value(raw_value): |
| 58 value = raw_value | 98 value = raw_value |
| 59 if raw_value in VALUE_FUNCTIONS: | 99 for pattern, function in VALUE_FUNCTIONS.iteritems(): |
| 60 value = VALUE_FUNCTIONS[raw_value](raw_value) | 100 try: |
| 101 match = pattern.match(value) | |
| 102 except TypeError: | |
| 103 print "Invalid value found config file %s" % value | |
| 104 sys.exit(1) | |
| 105 if match: | |
| 106 value = function(*match.groups()) | |
| 107 if value is None: | |
| 108 print "Failed to properly parse raw value %s" % raw_value | |
| 109 sys.exit(1) | |
| 61 return value | 110 return value |
| 62 | 111 |
| 63 | 112 |
| 64 ## Special value parser for various OpenMS components | 113 ## Special value parser for various OpenMS components |
| 65 def _get_pepnovo_models_path(_): | 114 def _get_pepnovo_models_path(): |
| 66 pepnovo_path = _get_pepnovo_executable_path(None) | 115 pepnovo_path = _which('PepNovo') |
| 67 pepnovo_dir = os.path.split(pepnovo_path)[0] | 116 pepnovo_dir = os.path.split(pepnovo_path)[0] |
| 68 guesses = [os.path.join(pepnovo_dir, 'Models'), | 117 guesses = [os.path.join(pepnovo_dir, 'Models'), |
| 69 os.path.join(pepnovo_dir, '..', 'Models'), | 118 os.path.join(pepnovo_dir, '..', 'Models'), |
| 70 os.path.join(pepnovo_dir, '..', 'share', 'pepnovo', 'Models')] | 119 os.path.join(pepnovo_dir, '..', 'share', 'pepnovo', 'Models')] |
| 71 models_dir = None | 120 models_dir = None |
| 72 for guess in guesses: | 121 for guess in guesses: |
| 73 if os.path.isdir(guess): | 122 if os.path.isdir(guess): |
| 74 models_dir = guess | 123 models_dir = guess |
| 75 break | 124 break |
| 76 return models_dir | 125 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 | 126 |
| 85 | 127 |
| 86 # http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python | 128 # http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python |
| 87 def _which(program): | 129 def _which(program): |
| 88 | 130 |
| 94 if is_exe(program): | 136 if is_exe(program): |
| 95 return program | 137 return program |
| 96 else: | 138 else: |
| 97 for path in os.environ["PATH"].split(os.pathsep): | 139 for path in os.environ["PATH"].split(os.pathsep): |
| 98 exe_file = os.path.join(path, program) | 140 exe_file = os.path.join(path, program) |
| 141 print path | |
| 99 if is_exe(exe_file): | 142 if is_exe(exe_file): |
| 100 return exe_file | 143 return exe_file |
| 101 | 144 |
| 102 return None | 145 return None |
| 146 | |
| 147 | |
| 148 VALUE_FUNCTIONS = {compile(r"\@WHICH\((.*)\)\@"): _which, | |
| 149 compile(r"\@PEPNOVO_MODELS_PATH\@"): _get_pepnovo_models_path, | |
| 150 } | |
| 103 | 151 |
| 104 | 152 |
| 105 def _parse_args(): | 153 def _parse_args(): |
| 106 parser = OptionParser() | 154 parser = OptionParser() |
| 107 parser.add_option("-e", "--executable", dest="executables", default=[], action="append") | 155 parser.add_option("-e", "--executable", dest="executables", default=[], action="append") |
| 109 return parser.parse_args() | 157 return parser.parse_args() |
| 110 | 158 |
| 111 | 159 |
| 112 def _load_options(config_path): | 160 def _load_options(config_path): |
| 113 config_parser = SafeConfigParser() | 161 config_parser = SafeConfigParser() |
| 162 config_parser.optionxform = str | |
| 114 config_parser.read(config_path) | 163 config_parser.read(config_path) |
| 115 return config_parser | 164 return config_parser |
| 116 | 165 |
| 117 if __name__ == "__main__": | 166 if __name__ == "__main__": |
| 118 main() | 167 main() |
