annotate roi_table.py @ 1:0ac4f6f3d984 draft

Uploaded
author holtgrewe
date Mon, 06 May 2013 12:34:43 -0400
parents 61d9bdb6d519
children 1a5ea7128b6a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
1 #!/usr/bin/env python
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
2 """ROI Table Generator
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
3
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
4 Generates a HTML page with a table of ROI record details. Besides showing the
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
5 numeric ROI information, it also gives little roi plots in a column.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
6
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
7 For the little ROI plots, it calls the program roi_plot_thumbnails that has to
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
8 be in the PATH.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
9 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
10
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
11 __author__ = 'Manuel Holtgrewe <manuel.holtgrewe@fu-berlin.de>'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
12 __copyright__ = 'Copyring 2013, Freie Universitaet Berlin'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
13 __license__ = 'BSD 3-clause'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
14
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
15
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
16 # TODO(holtgrew): Actually call roi_plot_thumbnails
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
17 # TODO(holtgrew): from __future__ use print_function
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
18
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
19
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
20 import argparse
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
21 import math
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
22 import os.path
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
23 import sys
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
24
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
25 import Cheetah.Template
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
26
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
27 import ngs_roi.app
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
28 import ngs_roi.argparse
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
29 import ngs_roi.io
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
30
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
31
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
32 # Main template.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
33 PAGE_TPL = """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
34 <html>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
35 <head><title>ROI Table</title></head>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
36 <body>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
37 <h1>ROI Table</h1>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
38 $table
1
0ac4f6f3d984 Uploaded
holtgrewe
parents: 0
diff changeset
39 <div><code>$args</code></div>
0
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
40 </body>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
41 </html>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
42 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
43
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
44 # Template for a table.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
45 TABLE_TPL = """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
46 <table border="1">
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
47 <tr>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
48 <th>plot</th>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
49 <th>chr</th>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
50 <th>start</th>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
51 <th>end</th>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
52 <th>name</th>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
53 <th>length</th>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
54 <th>strand</th>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
55 <th>max_count</th>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
56 #for i, key in enumerate($data_keys)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
57 <th>$key</th>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
58 #end for
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
59 </tr>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
60 #for id, roi in enumerate($records)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
61 <tr>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
62 <td><div style="width:${args.plot_width}; margin:2px; height:${args.plot_height+1}; background:url(thumbnail_${imgId($id)}.png) -${imgX($id)} -${imgY($id)};"></div></td>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
63 <td>$roi.ref</td>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
64 <td style="text-align:right;">$fmtPos($roi.start_pos + 1)</td>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
65 <td style="text-align:right;">$fmtPos($roi.end_pos)</td>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
66 <td><a href="$href($roi)">$roi.region_name</a></td>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
67 <td style="text-align:right;">$fmtPos($roi.region_length)</td>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
68 <td style="text-align:center;">$roi.strand</td>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
69 <td style="text-align:right;">$roi.max_count</td>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
70 #for i, key in enumerate($data_keys)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
71 <td>$roi.data[$i]</td>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
72 #end for
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
73 </tr>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
74 #end for
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
75 </table>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
76 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
77
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
78
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
79 class RoiTable(object):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
80 """A table of ROI records with small plots."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
81
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
82 def __init__(self, args, keys, records, app):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
83 self.args = args
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
84 self.keys = keys
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
85 self.records = records
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
86 self.app = app
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
87
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
88 def tplFuncs(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
89 def intWithCommas(x):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
90 if type(x) not in [type(0), type(0L)]:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
91 raise TypeError("Parameter must be an integer.")
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
92 if x < 0:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
93 return '-' + intWithCommas(-x)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
94 result = ''
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
95 while x >= 1000:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
96 x, r = divmod(x, 1000)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
97 result = ",%03d%s" % (r, result)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
98 return "%d%s" % (x, result)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
99
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
100 def imgId(idx):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
101 """Image id from roi record id."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
102 return idx / (self.args.num_rows * self.args.num_cols)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
103
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
104 def imgX(idx):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
105 """x position in image from record id."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
106 x = idx % self.args.num_cols
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
107 res = x * self.args.plot_width
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
108 if x > 0:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
109 res += (x - 1) * 2
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
110 return res
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
111
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
112 def imgY(idx):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
113 """y position in image from record id."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
114 y = idx / self.args.num_cols
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
115 res = y * self.args.plot_height
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
116 res += y * 2
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
117 return res
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
118
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
119 return {'fmtPos': intWithCommas, 'imgId': imgId, 'imgX': imgX, 'imgY': imgY}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
120
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
121 def render(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
122 """Returns string with rendered table."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
123 vals = {'data_keys': self.keys, 'records': self.records, 'args': self.args,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
124 'href': lambda x:self.app.buildHref(x.ref, x.start_pos, x.end_pos)}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
125 vals.update(self.tplFuncs())
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
126 t = Cheetah.Template.Template(TABLE_TPL, searchList=vals)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
127 return str(t)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
128
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
129
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
130 class TableApp(ngs_roi.app.App):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
131 def __init__(self, args):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
132 # Call parent's constructor and create output directory.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
133 ngs_roi.app.App.__init__(self, args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
134 self.prepareOutDir()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
135
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
136 def run(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
137 # Load ROI records.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
138 print >>sys.stderr, 'Loading ROI'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
139 records = ngs_roi.io.load(self.args.in_file, self.args.max_rois)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
140 keys = []
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
141 if records:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
142 keys = records[0].data_keys
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
143
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
144 # Create plots.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
145 print >>sys.stderr, 'Creating plots...'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
146 runner = ngs_roi.app.PlotThumbnailsRunner(self.args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
147 runner.run()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
148
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
149 # Create table.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
150 print >>sys.stderr, 'Creating table...'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
151 self.createHtml(self.args.out_file, keys, records)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
152 return 0
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
153
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
154 def createHtml(self, file_name, keys, records):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
155 print >>sys.stderr, 'Writing %s' % self.args.out_file
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
156 vals = {'table': RoiTable(self.args, keys, records, self).render()}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
157 t = Cheetah.Template.Template(PAGE_TPL, searchList=vals)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
158 with open(self.args.out_file, 'wb') as f:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
159 f.write(str(t))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
160
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
161
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
162 def main():
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
163 parser = argparse.ArgumentParser(description='Plot ROI file.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
164
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
165 ngs_roi.argparse.addFileArguments(parser)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
166 ngs_roi.argparse.addPlotGridArguments(parser, default_plot_height=60,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
167 default_plot_width=90)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
168 ngs_roi.argparse.addLinkArguments(parser)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
169 args = parser.parse_args()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
170 ngs_roi.argparse.applyFileDefaults(args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
171
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
172 app = TableApp(args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
173 return app.run()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
174
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
175
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
176 if __name__ == '__main__':
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
177 sys.exit(main())