annotate roi_details.py @ 0:61d9bdb6d519 draft

Uploaded
author holtgrewe
date Thu, 18 Apr 2013 08:03:38 -0400
parents
children 0ac4f6f3d984
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 """Generation of detailed ROI reports with larger plots.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
3
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
4 This report generation works for hundred of ROIs.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
5 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
6
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
7 import argparse
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
8 import math
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
9 import os.path
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
10 import sys
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
11
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
12 import Cheetah.Template
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
13 import matplotlib.pyplot as plt
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
14
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
15 import rois
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
16
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
17 PAGE_TPL = """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
18 <html>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
19 <head><title>ROI Table</title></head>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
20 <body>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
21 <h1>Detailed ROI Report</h1>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
22 #for i, roi in enumerate($records)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
23 <h2>${roi.ref}:${roi.start_pos + 1}-${roi.end_pos+1}</h2>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
24 <img src="${args.out_prefix}${i}.png" />
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
25 <dl>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
26 <dt>chr:start-end name length strand</dt>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
27 <dd>${roi.ref}:${roi.start_pos}-${roi.end_pos} ${roi.region_name} ${roi.region_length} ${roi.strand}</dd>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
28 <dt>metrics</dt>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
29 <dd>#for j, key in enumerate($data_keys)#$key: ${roi.data[$j]}, #end for#</dd>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
30 </dl>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
31 #end for
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
32 </body>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
33 </html>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
34 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
35
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
36 class DetailedRoiGenerator(object):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
37 """Generate detailed ROI report.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
38
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
39 :ivar args:Arguments from the comment line.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
40 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
41
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
42 def __init__(self, args):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
43 self.args = args
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
44
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
45 def run(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
46 """Run report generation, return status code.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
47
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
48 :return: integer with the result.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
49 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
50 print >>sys.stderr, 'Loading ROI'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
51 keys, records = rois.loadRoi(self.args.in_file, self.args.max_rois)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
52
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
53 self.writeHtml(keys, records)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
54 self.writePlots(records)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
55 return 0
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
56
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
57 def writePlots(self, records):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
58 for i, roi in enumerate(records):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
59 file_name = '%s%d.png' % (os.path.join(self.args.out_dir, self.args.out_prefix), i)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
60 print >>sys.stderr, 'Writing plot %s' % file_name
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
61 plt.figure(figsize=(6, 4))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
62 plt.gcf().subplots_adjust(bottom=0.1, left=0.1)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
63 plt.plot(roi.points)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
64 plt.ylabel('coverage')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
65 plt.xlabel('ROI pos')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
66 plt.savefig(file_name)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
67
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
68 def writeHtml(self, keys, records):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
69 file_name = self.args.out_file
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
70 print >>sys.stderr, 'Writing HTML file %s' % file_name
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
71
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
72 vals = {'args': self.args, 'records': records, 'data_keys': keys}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
73 t = Cheetah.Template.Template(PAGE_TPL, searchList=vals)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
74
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
75 with open(file_name, 'wb') as f:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
76 f.write(str(t))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
77
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
78
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
79 def main():
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
80 parser = argparse.ArgumentParser(description='Plot ROI file.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
81 parser.add_argument('-o', '--out-file', dest='out_file', metavar='PATH',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
82 help='Prefix of output HTML file. The tool will create '
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
83 'PNG files parallel to the HTML file.',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
84 default='roi_plots.html')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
85 parser.add_argument('-d', '--out-dir', dest='out_dir', metavar='DIR',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
86 help='Directory to write images to. By default '
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
87 'this is the same as the directory for --out-file.',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
88 default=None)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
89 parser.add_argument('-p', '--out-prefix', dest='out_prefix', metavar='DIR',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
90 help='Prefix of output PNG files.', default='roi_plot_grid')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
91 parser.add_argument('-i', '--in-file', dest='in_file', metavar='FILE',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
92 required=True, help='Path to ROI file to read.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
93
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
94 group = parser.add_argument_group('Plot Configuration', 'Arguments for the plot images.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
95
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
96 group.add_argument('--max-rois', dest='max_rois', metavar='NUM',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
97 type=int, default=0,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
98 help='Maximal number of ROIs, 0 for all.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
99
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
100 group.add_argument('--num-rows', dest='num_rows', metavar='ROWS',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
101 type=int, default=50,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
102 help='Number of rows per grid.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
103 group.add_argument('--num-cols', dest='num_cols', metavar='COLS',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
104 type=int, default=40,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
105 help='Number of columns per grid.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
106
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
107 group.add_argument('--plot-height', dest='plot_height', metavar='HEIGHT',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
108 type=int, default=30, help='Height of one plot in px.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
109 group.add_argument('--plot-width', dest='plot_width', metavar='WIDTH',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
110 type=int, default=30, help='Width of one plot in px.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
111
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
112 group = parser.add_argument_group('HTML Links', 'Arguments for HTML link creation.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
113
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
114 group.add_argument('--link-target', dest='link_target', metavar='TARGET',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
115 default='_blank', choices=['_blank', '_top'],
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
116 help='Select the link target to create (_blank or _top).')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
117
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
118 group.add_argument('--link-type', dest='link_type', metavar='TARGET',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
119 default='local_igv', choices=['local_igv', 'ucsc'],
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
120 help='Select the type of links to create. One of '
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
121 '"local_igv" and "ucsc".')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
122
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
123 group.add_argument('--igv-host', dest='igv_host', metavar='HOST',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
124 default='localhost', help='Host for IGV link.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
125 group.add_argument('--igv-port', dest='igv_port', metavar='PORT',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
126 type=int, default='60151', help='Port for IGV link.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
127
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
128 group.add_argument('--ucsc-org', dest='ucsc_org', metavar='ORG',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
129 default='human', help='Organism for UCSC browser link.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
130 group.add_argument('--ucsc-db', dest='ucsc_db', metavar='DB',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
131 default='hg18', help='Assembly version for UCSC browser link.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
132 group.add_argument('--ucsc-chr-prefix', dest='ucsc_chr_prefix', metavar='PREFIX',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
133 default='', help='Prefix for chromosome names in UCSC browser.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
134
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
135 args = parser.parse_args()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
136 if not args.out_dir:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
137 args.out_dir = os.path.dirname(args.out_file) or '.'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
138 print args
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
139 app = DetailedRoiGenerator(args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
140 return app.run()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
141
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
142
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
143 if __name__ == '__main__':
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
144 sys.exit(main())