Mercurial > repos > holtgrewe > ngs_roi
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())
