0
|
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()
|