diff roi_details.py @ 1:0ac4f6f3d984 draft

Uploaded
author holtgrewe
date Mon, 06 May 2013 12:34:43 -0400
parents 61d9bdb6d519
children 170e48a55078
line wrap: on
line diff
--- a/roi_details.py	Thu Apr 18 08:03:38 2013 -0400
+++ b/roi_details.py	Mon May 06 12:34:43 2013 -0400
@@ -12,28 +12,51 @@
 import Cheetah.Template
 import matplotlib.pyplot as plt
 
-import rois
+import ngs_roi.app
+import ngs_roi.argparse
+import ngs_roi.io
 
 PAGE_TPL = """
 <html>
-  <head><title>ROI Table</title></head>
+  <head>
+    <title>ROI Table</title>
+    <style type="text/css">
+    div.plot
+    {
+        float: left;
+        padding: 4px;
+        margin: 2px;
+        width: 420px;
+    }
+
+    .plot h2 { margin-top: 3px; margin-bottom: 3px; text-align: center; }
+    .plot img { display: block; margin: 0 auto; }
+    </style>
+  </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>
+    <div class="plot">
+      <h2>${roi.ref}:${roi.start_pos + 1}-${roi.end_pos+1}</h2>
+      <a href="${href($roi)}" target="dead"><img src="plot_${i}.png" /></a>
+      <p>
+        <b>chr:start-end</b> <a href="${href($roi)}" target="dead">${roi.ref}:${roi.start_pos}-${roi.end_pos} ${roi.strand}</a>;
+        <b>region name</b> ${roi.region_name};
+        <b>region length</b> ${roi.region_length};
+      </p>
+      #if $roi.data
+      <p>#for j, key in enumerate($data_keys)#<b>$key:</b> ${roi.data[$j]}; #end for#</p>
+      #end if
+    </div>
     #end for
+    <iframe name="dead" height="0" width="0"></iframe>
+    <div><code>$args</code></div>
   </body>
 </html>
 """
 
-class DetailedRoiGenerator(object):
+class DetailedRoiGenerator(ngs_roi.app.App):
     """Generate detailed ROI report.
 
     :ivar args:Arguments from the comment line.
@@ -48,28 +71,40 @@
         :return: integer with the result.
         """
         print >>sys.stderr, 'Loading ROI'
-        keys, records = rois.loadRoi(self.args.in_file, self.args.max_rois)
+        records = ngs_roi.io.load(self.args.in_file, self.args.max_rois)
+        keys = records[0].data_keys
 
         self.writeHtml(keys, records)
         self.writePlots(records)
         return 0
 
     def writePlots(self, records):
+        COLOR = 'blue'
+        LINE_WIDTH = .5
+        LINE_STYLE = '-'
+        TICK_FONT_SIZE = 8
+        LABEL_FONT_SIZE = 10
         for i, roi in enumerate(records):
-            file_name = '%s%d.png' % (os.path.join(self.args.out_dir, self.args.out_prefix), i)
+            file_name = 'plot_%d.png' % i
+            file_name = os.path.join(self.args.out_dir, file_name)
             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.figure(figsize=(4, 2.5))
+            plt.gcf().subplots_adjust(bottom=0.16, left=0.15)
+            plt.plot(roi.points, color=COLOR, linewidth=LINE_WIDTH, linestyle=LINE_STYLE)
+            plt.ylim(ymin=0)
+            if self.args.max_value:
+                plt.ylim(ymax=self.args.max_value)
+            plt.tick_params(labelsize=TICK_FONT_SIZE)
+            plt.ylabel('coverage', fontsize=LABEL_FONT_SIZE, weight='semibold')
+            plt.xlabel('ROI beginPos', fontsize=LABEL_FONT_SIZE, weight='semibold')
             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}
+        vals = {'args': self.args, 'records': records, 'data_keys': keys,
+                'href': lambda x: self.buildHref(x.ref, x.start_pos, x.end_pos)}
         t = Cheetah.Template.Template(PAGE_TPL, searchList=vals)
         
         with open(file_name, 'wb') as f:
@@ -78,64 +113,12 @@
 
 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.')
+    ngs_roi.argparse.addFileArguments(parser)
+    ngs_roi.argparse.addPlotGridArguments(parser)
+    ngs_roi.argparse.addLinkArguments(parser)
+    args = parser.parse_args()
+    ngs_roi.argparse.applyFileDefaults(args)
 
-    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()