diff roi_details.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_details.py	Thu Apr 18 08:03:38 2013 -0400
@@ -0,0 +1,144 @@
+#!/usr/bin/env python
+"""Generation of detailed ROI reports with larger plots.
+
+This report generation works for hundred of ROIs.
+"""
+
+import argparse
+import math
+import os.path
+import sys
+
+import Cheetah.Template
+import matplotlib.pyplot as plt
+
+import rois
+
+PAGE_TPL = """
+<html>
+  <head><title>ROI Table</title></head>
+  <body>
+    <h1>Detailed ROI Report</h1>
+    #for i, roi in enumerate($records)
+    <h2>${roi.ref}:${roi.start_pos + 1}-${roi.end_pos+1}</h2>
+    <img src="${args.out_prefix}${i}.png" />
+    <dl>
+      <dt>chr:start-end name length strand</dt>
+      <dd>${roi.ref}:${roi.start_pos}-${roi.end_pos} ${roi.region_name} ${roi.region_length} ${roi.strand}</dd>
+      <dt>metrics</dt>
+      <dd>#for j, key in enumerate($data_keys)#$key: ${roi.data[$j]}, #end for#</dd>
+    </dl>
+    #end for
+  </body>
+</html>
+"""
+
+class DetailedRoiGenerator(object):
+    """Generate detailed ROI report.
+
+    :ivar args:Arguments from the comment line.
+    """
+
+    def __init__(self, args):
+        self.args = args
+
+    def run(self):
+        """Run report generation, return status code.
+
+        :return: integer with the result.
+        """
+        print >>sys.stderr, 'Loading ROI'
+        keys, records = rois.loadRoi(self.args.in_file, self.args.max_rois)
+
+        self.writeHtml(keys, records)
+        self.writePlots(records)
+        return 0
+
+    def writePlots(self, records):
+        for i, roi in enumerate(records):
+            file_name = '%s%d.png' % (os.path.join(self.args.out_dir, self.args.out_prefix), i)
+            print >>sys.stderr, 'Writing plot %s' % file_name
+            plt.figure(figsize=(6, 4))
+            plt.gcf().subplots_adjust(bottom=0.1, left=0.1)
+            plt.plot(roi.points)
+            plt.ylabel('coverage')
+            plt.xlabel('ROI pos')
+            plt.savefig(file_name)
+
+    def writeHtml(self, keys, records):
+        file_name = self.args.out_file
+        print >>sys.stderr, 'Writing HTML file %s' % file_name
+
+        vals = {'args': self.args, 'records': records, 'data_keys': keys}
+        t = Cheetah.Template.Template(PAGE_TPL, searchList=vals)
+        
+        with open(file_name, 'wb') as f:
+            f.write(str(t))
+
+
+def main():
+    parser = argparse.ArgumentParser(description='Plot ROI file.')
+    parser.add_argument('-o', '--out-file', dest='out_file', metavar='PATH',
+                        help='Prefix of output HTML file.  The tool will create '
+                        'PNG files parallel to the HTML file.',
+                        default='roi_plots.html')
+    parser.add_argument('-d', '--out-dir', dest='out_dir', metavar='DIR',
+                        help='Directory to write images to.  By default '
+                        'this is the same as the directory for --out-file.',
+                        default=None)
+    parser.add_argument('-p', '--out-prefix', dest='out_prefix', metavar='DIR',
+                        help='Prefix of output PNG files.', default='roi_plot_grid')
+    parser.add_argument('-i', '--in-file', dest='in_file', metavar='FILE',
+                        required=True, help='Path to ROI file to read.')
+
+    group = parser.add_argument_group('Plot Configuration', 'Arguments for the plot images.')
+
+    group.add_argument('--max-rois', dest='max_rois', metavar='NUM',
+                        type=int, default=0,
+                        help='Maximal number of ROIs, 0 for all.')
+
+    group.add_argument('--num-rows', dest='num_rows', metavar='ROWS',
+                        type=int, default=50,
+                        help='Number of rows per grid.')
+    group.add_argument('--num-cols', dest='num_cols', metavar='COLS',
+                       type=int, default=40,
+                       help='Number of columns per grid.')
+    
+    group.add_argument('--plot-height', dest='plot_height', metavar='HEIGHT',
+                       type=int, default=30, help='Height of one plot in px.')
+    group.add_argument('--plot-width', dest='plot_width', metavar='WIDTH',
+                       type=int, default=30, help='Width of one plot in px.')
+
+    group = parser.add_argument_group('HTML Links', 'Arguments for HTML link creation.')
+
+    group.add_argument('--link-target', dest='link_target', metavar='TARGET',
+                       default='_blank', choices=['_blank', '_top'],
+                       help='Select the link target to create (_blank or _top).')
+    
+    group.add_argument('--link-type', dest='link_type', metavar='TARGET',
+                       default='local_igv', choices=['local_igv', 'ucsc'],
+                       help='Select the type of links to create.  One of '
+                       '"local_igv" and "ucsc".')
+    
+    group.add_argument('--igv-host', dest='igv_host', metavar='HOST',
+                       default='localhost', help='Host for IGV link.')
+    group.add_argument('--igv-port', dest='igv_port', metavar='PORT',
+                       type=int, default='60151', help='Port for IGV link.')
+
+    group.add_argument('--ucsc-org', dest='ucsc_org', metavar='ORG',
+                       default='human', help='Organism for UCSC browser link.')
+    group.add_argument('--ucsc-db', dest='ucsc_db', metavar='DB',
+                       default='hg18', help='Assembly version for UCSC browser link.')
+    group.add_argument('--ucsc-chr-prefix', dest='ucsc_chr_prefix', metavar='PREFIX',
+                       default='', help='Prefix for chromosome names in UCSC browser.')
+
+    args = parser.parse_args()
+    if not args.out_dir:
+        args.out_dir = os.path.dirname(args.out_file) or '.'
+    print args
+    app = DetailedRoiGenerator(args)
+    return app.run()
+
+
+if __name__ == '__main__':
+    sys.exit(main())