diff roi_table.py @ 0:61d9bdb6d519 draft

Uploaded
author holtgrewe
date Thu, 18 Apr 2013 08:03:38 -0400
parents
children 0ac4f6f3d984
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/roi_table.py	Thu Apr 18 08:03:38 2013 -0400
@@ -0,0 +1,176 @@
+#!/usr/bin/env python
+"""ROI Table Generator
+
+Generates a HTML page with a table of ROI record details.  Besides showing the
+numeric ROI information, it also gives little roi plots in a column.
+
+For the little ROI plots, it calls the program roi_plot_thumbnails that has to
+be in the PATH.
+"""
+
+__author__    = 'Manuel Holtgrewe <manuel.holtgrewe@fu-berlin.de>'
+__copyright__ = 'Copyring 2013, Freie Universitaet Berlin'
+__license__   = 'BSD 3-clause'
+
+
+# TODO(holtgrew): Actually call roi_plot_thumbnails
+# TODO(holtgrew): from __future__ use print_function
+
+
+import argparse
+import math
+import os.path
+import sys
+
+import Cheetah.Template
+
+import ngs_roi.app
+import ngs_roi.argparse
+import ngs_roi.io
+
+
+# Main template.
+PAGE_TPL = """
+<html>
+  <head><title>ROI Table</title></head>
+  <body>
+    <h1>ROI Table</h1>
+    $table
+  </body>
+</html>
+"""
+
+# Template for a table.
+TABLE_TPL = """
+<table border="1">
+  <tr>
+    <th>plot</th>
+    <th>chr</th>
+    <th>start</th>
+    <th>end</th>
+    <th>name</th>
+    <th>length</th>
+    <th>strand</th>
+    <th>max_count</th>
+    #for i, key in enumerate($data_keys)
+    <th>$key</th>
+    #end for
+  </tr>
+  #for id, roi in enumerate($records)
+  <tr>
+    <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>
+    <td>$roi.ref</td>
+    <td style="text-align:right;">$fmtPos($roi.start_pos + 1)</td>
+    <td style="text-align:right;">$fmtPos($roi.end_pos)</td>
+    <td><a href="$href($roi)">$roi.region_name</a></td>
+    <td style="text-align:right;">$fmtPos($roi.region_length)</td>
+    <td style="text-align:center;">$roi.strand</td>
+    <td style="text-align:right;">$roi.max_count</td>
+    #for i, key in enumerate($data_keys)
+    <td>$roi.data[$i]</td>
+    #end for
+  </tr>
+  #end for
+</table>
+"""
+
+
+class RoiTable(object):
+    """A table of ROI records with small plots."""
+
+    def __init__(self, args, keys, records, app):
+        self.args = args
+        self.keys = keys
+        self.records = records
+        self.app = app
+
+    def tplFuncs(self):
+        def intWithCommas(x):
+            if type(x) not in [type(0), type(0L)]:
+                raise TypeError("Parameter must be an integer.")
+            if x < 0:
+                return '-' + intWithCommas(-x)
+            result = ''
+            while x >= 1000:
+                x, r = divmod(x, 1000)
+                result = ",%03d%s" % (r, result)
+            return "%d%s" % (x, result)
+
+        def imgId(idx):
+            """Image id from roi record id."""
+            return idx / (self.args.num_rows * self.args.num_cols)
+
+        def imgX(idx):
+            """x position in image from record id."""
+            x = idx % self.args.num_cols
+            res = x * self.args.plot_width
+            if x > 0:
+                res += (x - 1) * 2
+            return res
+
+        def imgY(idx):
+            """y position in image from record id."""
+            y = idx / self.args.num_cols
+            res = y * self.args.plot_height
+            res += y * 2
+            return res
+
+        return {'fmtPos': intWithCommas, 'imgId': imgId, 'imgX': imgX, 'imgY': imgY}
+
+    def render(self):
+        """Returns string with rendered table."""
+        vals = {'data_keys': self.keys, 'records': self.records, 'args': self.args,
+                'href': lambda x:self.app.buildHref(x.ref, x.start_pos, x.end_pos)}
+        vals.update(self.tplFuncs())
+        t = Cheetah.Template.Template(TABLE_TPL, searchList=vals)
+        return str(t)
+
+
+class TableApp(ngs_roi.app.App):
+    def __init__(self, args):
+        # Call parent's constructor and create output directory.
+        ngs_roi.app.App.__init__(self, args)
+        self.prepareOutDir()
+
+    def run(self):
+        # Load ROI records.
+        print >>sys.stderr, 'Loading ROI'
+        records = ngs_roi.io.load(self.args.in_file, self.args.max_rois)
+        keys = []
+        if records:
+            keys = records[0].data_keys
+
+        # Create plots.
+        print >>sys.stderr, 'Creating plots...'
+        runner = ngs_roi.app.PlotThumbnailsRunner(self.args)
+        runner.run()
+
+        # Create table.
+        print >>sys.stderr, 'Creating table...'
+        self.createHtml(self.args.out_file, keys, records)
+        return 0
+
+    def createHtml(self, file_name, keys, records):
+        print >>sys.stderr, 'Writing %s' % self.args.out_file
+        vals = {'table': RoiTable(self.args, keys, records, self).render()}
+        t = Cheetah.Template.Template(PAGE_TPL, searchList=vals)
+        with open(self.args.out_file, 'wb') as f:
+            f.write(str(t))        
+
+
+def main():
+    parser = argparse.ArgumentParser(description='Plot ROI file.')
+
+    ngs_roi.argparse.addFileArguments(parser)
+    ngs_roi.argparse.addPlotGridArguments(parser, default_plot_height=60,
+                                          default_plot_width=90)
+    ngs_roi.argparse.addLinkArguments(parser)
+    args = parser.parse_args()
+    ngs_roi.argparse.applyFileDefaults(args)
+
+    app = TableApp(args)
+    return app.run()
+
+
+if __name__ == '__main__':
+    sys.exit(main())