2
|
1 from xml.sax import make_parser, ContentHandler
|
|
2 from optparse import OptionParser
|
|
3
|
|
4
|
|
5 def main():
|
|
6 (options, _) = _parse_args()
|
|
7 with open(options.output, "w") as out:
|
|
8 parser = make_parser()
|
|
9 handler = _get_handler(options)(out)
|
|
10 parser.setContentHandler(handler)
|
|
11 parser.parse(open(options.input, "r"))
|
|
12
|
|
13
|
|
14 def _get_handler(options):
|
|
15 return handlers[options.type]
|
|
16
|
|
17
|
|
18 class OpenMsContentHandler(ContentHandler):
|
|
19
|
|
20 def __record_values(self, keys, attrs):
|
|
21 for key in keys:
|
|
22 setattr(self, key, attrs.get(key, None))
|
|
23
|
|
24 def _get_values(self, keys):
|
|
25 return [getattr(self, key, "") for key in keys]
|
|
26
|
|
27 def _set_attributes(self, name, attrs):
|
|
28 for element_name, element_attributes in self.record_values.iteritems():
|
|
29 if name == element_name:
|
|
30 self.__record_values(element_attributes, attrs)
|
|
31
|
|
32 def _write_line(self, line):
|
|
33 self.output.write(line)
|
|
34 self.output.write("\n")
|
|
35
|
|
36 def startElement(self, name, attrs):
|
|
37 self._set_attributes(name, attrs)
|
|
38
|
|
39 def _handleElement(self, name):
|
|
40 pass
|
|
41
|
|
42 def endElement(self, name):
|
|
43 self._handleElement(name)
|
|
44 self._set_attributes(name, {})
|
|
45
|
|
46 def _write_row(self, col_keys):
|
|
47 row_values = self._get_values(col_keys)
|
|
48 row = "\t".join(row_values)
|
|
49 self._write_line(row)
|
|
50
|
|
51
|
|
52 class FeatureHullHandler(OpenMsContentHandler):
|
|
53 record_values = {
|
|
54 "feature": ["id"],
|
|
55 "convexhull": ["nr"],
|
|
56 "pt": ["x", "y"]
|
|
57 }
|
|
58
|
|
59 def __init__(self, output):
|
|
60 self.output = output
|
|
61
|
|
62 def _handleElement(self, name):
|
|
63 if name == "pt":
|
|
64 self._write_point()
|
|
65
|
|
66 def _write_point(self):
|
|
67 col_keys = ["id", "nr", "x", "y"]
|
|
68 self._write_row(col_keys)
|
|
69
|
|
70
|
|
71 class PeptideHandler(OpenMsContentHandler):
|
|
72 record_values = {
|
|
73 "IdentificationRun": ["search_engine"],
|
|
74 "PeptideIdentification": ["score_type", "significance_threshold", "MZ", "RT"],
|
|
75 "PeptideHit": ["score", "sequence", "charge"],
|
|
76 }
|
|
77
|
|
78 def __init__(self, output):
|
|
79 self.output = output
|
|
80
|
|
81 def _handleElement(self, name):
|
|
82 if name == "PeptideHit":
|
|
83 self._write_peptide()
|
|
84
|
|
85 def _write_peptide(self):
|
|
86 col_keys = ["score", "sequence", "score_type", "charge", "MZ", "RT"]
|
|
87 self._write_row(col_keys)
|
|
88
|
|
89
|
|
90 handlers = {
|
|
91 "peptide": PeptideHandler,
|
|
92 "feature_hull": FeatureHullHandler,
|
|
93 }
|
|
94
|
|
95
|
|
96 def _parse_args():
|
|
97 parser = OptionParser()
|
|
98 parser.add_option("--input", dest="input")
|
|
99 parser.add_option("--output", dest="output")
|
|
100 parser.add_option("--type", dest="type", choices=["peptide", "feature_hull"])
|
|
101 return parser.parse_args()
|
|
102
|
|
103 if __name__ == "__main__":
|
|
104 main()
|