Mercurial > repos > miller-lab > genome_diversity
comparison dpmix_plot.py @ 27:8997f2ca8c7a
Update to Miller Lab devshed revision bae0d3306d3b
| author | Richard Burhans <burhans@bx.psu.edu> |
|---|---|
| date | Mon, 15 Jul 2013 10:47:35 -0400 |
| parents | 4b6590dd7250 |
| children | a631c2f6d913 |
comparison
equal
deleted
inserted
replaced
| 26:91e835060ad2 | 27:8997f2ca8c7a |
|---|---|
| 35 def parse_input_file(input_file): | 35 def parse_input_file(input_file): |
| 36 chroms = [] | 36 chroms = [] |
| 37 individuals = [] | 37 individuals = [] |
| 38 data = {} | 38 data = {} |
| 39 chrom_len = {} | 39 chrom_len = {} |
| 40 used_states = [] | |
| 40 | 41 |
| 41 with open(input_file) as fh: | 42 with open(input_file) as fh: |
| 42 for line in fh: | 43 for line in fh: |
| 43 line = line.strip() | 44 line = line.strip() |
| 44 if line: | 45 if line: |
| 45 elems = line.split() | 46 elems = line.split() |
| 46 chrom = elems[0] | 47 chrom = elems[0] |
| 47 p1, p2, state = map(int, elems[1:4]) | 48 p1, p2, state = map(int, elems[1:4]) |
| 48 id = elems[4] | 49 id = elems[4] |
| 49 | 50 |
| 51 if state not in used_states: | |
| 52 used_states.append(state) | |
| 53 | |
| 50 if chrom not in chroms: | 54 if chrom not in chroms: |
| 51 chroms.append(chrom) | 55 chroms.append(chrom) |
| 52 | 56 |
| 53 if id not in individuals: | 57 if id not in individuals: |
| 54 individuals.append(id) | 58 individuals.append(id) |
| 58 data[chrom][id].append((p1, p2, state)) | 62 data[chrom][id].append((p1, p2, state)) |
| 59 | 63 |
| 60 if p2 > chrom_len.setdefault(chrom, 0): | 64 if p2 > chrom_len.setdefault(chrom, 0): |
| 61 chrom_len[chrom] = p2 | 65 chrom_len[chrom] = p2 |
| 62 | 66 |
| 63 return chroms, individuals, data, chrom_len | 67 return chroms, individuals, data, chrom_len, used_states |
| 64 | 68 |
| 65 def check_chroms(chroms, chrom_len, dbkey): | 69 def check_chroms(chroms, chrom_len, dbkey): |
| 66 error = 0 | 70 error = 0 |
| 67 for chrom in chroms: | 71 for chrom in chroms: |
| 68 if chrom not in chrom_len: | 72 if chrom not in chrom_len: |
| 110 def make_split_rectangle(p1, p2, top_color, bottom_color): | 114 def make_split_rectangle(p1, p2, top_color, bottom_color): |
| 111 patch1 = make_rectangle(p1, p2, bottom_color, top=0.5) | 115 patch1 = make_rectangle(p1, p2, bottom_color, top=0.5) |
| 112 patch2 = make_rectangle(p1, p2, top_color, bottom=0.5) | 116 patch2 = make_rectangle(p1, p2, top_color, bottom=0.5) |
| 113 return [patch1, patch2] | 117 return [patch1, patch2] |
| 114 | 118 |
| 115 def make_state_rectangle(p1, p2, state, chrom, individual): | 119 def make_state_rectangle_2pop(p1, p2, state, chrom, individual): |
| 120 p1_color = 'r' | |
| 121 p2_color = 'g' | |
| 122 heterochromatin_color = '#c7c7c7' | |
| 123 | |
| 116 if state == 0: | 124 if state == 0: |
| 117 return [ make_rectangle(p1, p2, 'r') ] | 125 return [ make_rectangle(p1, p2, heterochromatin_color) ] |
| 118 elif state == 1: | 126 elif state == 1: |
| 119 return make_split_rectangle(p1, p2, 'r', 'g') | 127 return [ make_rectangle(p1, p2, p1_color) ] |
| 120 elif state == 2: | 128 elif state == 2: |
| 121 return [ make_rectangle(p1, p2, 'g') ] | 129 return [ make_rectangle(p1, p2, p2_color) ] |
| 122 elif state == 3: | 130 elif state == 3: |
| 123 return [ make_rectangle(p1, p2, '#c7c7c7') ] | 131 return make_split_rectangle(p1, p2, p1_color, p2_color) |
| 132 else: | |
| 133 print >> sys.stderr, "Unknown state: {0}: {1} {2} {3} {4}".format(state, chrom, p1, p2, state, individual) | |
| 134 sys.exit(1) | |
| 135 | |
| 136 def make_state_rectangle_3pop(p1, p2, state, chrom, individual): | |
| 137 p1_color = 'r' | |
| 138 p2_color = 'g' | |
| 139 p3_color = 'b' | |
| 140 heterochromatin_color = '#c7c7c7' | |
| 141 | |
| 142 if state == 0: | |
| 143 return [ make_rectangle(p1, p2, heterochromatin_color) ] | |
| 144 if state == 1: | |
| 145 return [ make_rectangle(p1, p2, p1_color) ] | |
| 146 if state == 2: | |
| 147 return [ make_rectangle(p1, p2, p2_color) ] | |
| 148 if state == 3: | |
| 149 return [ make_rectangle(p1, p2, p3_color) ] | |
| 150 if state == 4: | |
| 151 return make_split_rectangle(p1, p2, p1_color, p2_color) | |
| 152 if state == 5: | |
| 153 return make_split_rectangle(p1, p2, p1_color, p3_color) | |
| 154 if state == 6: | |
| 155 return make_split_rectangle(p1, p2, p2_color, p3_color) | |
| 124 else: | 156 else: |
| 125 print >> sys.stderr, "Unknown state: {0}: {1} {2} {3} {4}".format(state, chrom, p1, p2, state, individual) | 157 print >> sys.stderr, "Unknown state: {0}: {1} {2} {3} {4}".format(state, chrom, p1, p2, state, individual) |
| 126 sys.exit(1) | 158 sys.exit(1) |
| 127 | 159 |
| 128 def nicenum(num, round=False): | 160 def nicenum(num, round=False): |
| 193 | 225 |
| 194 return vals, labels | 226 return vals, labels |
| 195 | 227 |
| 196 ################################################################################ | 228 ################################################################################ |
| 197 | 229 |
| 198 def make_dpmix_plot(input_dbkey, input_file, output_file, galaxy_data_index_dir): | 230 def make_dpmix_plot(input_dbkey, input_file, output_file, galaxy_data_index_dir, state2name=None, populations=3): |
| 199 fs_chrom_len = build_chrom_len_dict(input_dbkey, galaxy_data_index_dir) | 231 fs_chrom_len = build_chrom_len_dict(input_dbkey, galaxy_data_index_dir) |
| 200 chroms, individuals, data, chrom_len = parse_input_file(input_file) | 232 chroms, individuals, data, chrom_len, used_states = parse_input_file(input_file) |
| 233 | |
| 234 if populations == 3: | |
| 235 make_state_rectangle = make_state_rectangle_3pop | |
| 236 elif populations == 2: | |
| 237 make_state_rectangle = make_state_rectangle_2pop | |
| 238 else: | |
| 239 pass | |
| 201 | 240 |
| 202 for chrom in chrom_len.keys(): | 241 for chrom in chrom_len.keys(): |
| 203 if chrom in fs_chrom_len: | 242 if chrom in fs_chrom_len: |
| 204 chrom_len[chrom] = fs_chrom_len[chrom] | 243 chrom_len[chrom] = fs_chrom_len[chrom] |
| 205 | 244 |
| 212 chrom_height = 0.25 | 251 chrom_height = 0.25 |
| 213 ind_space = 0.10 | 252 ind_space = 0.10 |
| 214 ind_height = 0.25 | 253 ind_height = 0.25 |
| 215 | 254 |
| 216 total_height = 0.0 | 255 total_height = 0.0 |
| 217 at_top = True | 256 |
| 257 ## make a legend | |
| 258 ## only print out states that are | |
| 259 ## 1) in the data | |
| 260 ## - AND - | |
| 261 ## 2) in the state2name map | |
| 262 ## here, we only calculate the space needed | |
| 263 legend_states = [] | |
| 264 if state2name is not None: | |
| 265 for state in used_states: | |
| 266 if state in state2name: | |
| 267 legend_states.append(state) | |
| 268 | |
| 269 if legend_states: | |
| 270 total_height += len(legend_states) * (ind_space + ind_height) | |
| 271 total_height += (top_space - ind_space) | |
| 272 at_top = False | |
| 273 else: | |
| 274 at_top = True | |
| 275 | |
| 218 for chrom in chroms: | 276 for chrom in chroms: |
| 219 if at_top: | 277 if at_top: |
| 220 total_height += (top_space + chrom_height) | 278 total_height += (top_space + chrom_height) |
| 221 at_top = False | 279 at_top = False |
| 222 else: | 280 else: |
| 233 | 291 |
| 234 bottom = 1.0 | 292 bottom = 1.0 |
| 235 | 293 |
| 236 fig = plt.figure(figsize=(width, height)) | 294 fig = plt.figure(figsize=(width, height)) |
| 237 | 295 |
| 238 at_top = True | 296 if legend_states: |
| 297 at_top = True | |
| 298 for state in sorted(legend_states): | |
| 299 if at_top: | |
| 300 bottom -= (top_space + ind_height)/height | |
| 301 at_top = False | |
| 302 else: | |
| 303 bottom -= (ind_space + ind_height)/height | |
| 304 ## add code here to draw legend | |
| 305 # [left, bottom, width, height] | |
| 306 ax1 = fig.add_axes([0.0, bottom, 0.09, ind_height/height]) | |
| 307 plt.axis('off') | |
| 308 ax1.set_xlim(0, 1) | |
| 309 ax1.set_ylim(0, 1) | |
| 310 for patch in make_state_rectangle(0, 1, state, 'legend', state2name[state]): | |
| 311 ax1.add_patch(patch) | |
| 312 | |
| 313 ax2 = fig.add_axes([0.10, bottom, 0.88, ind_height/height], frame_on=False) | |
| 314 plt.axis('off') | |
| 315 plt.text(0.0, 0.5, state2name[state], fontsize=10, ha='left', va='center') | |
| 316 else: | |
| 317 at_top = True | |
| 318 | |
| 239 for_webb = False | 319 for_webb = False |
| 240 | 320 |
| 241 for chrom in chroms: | 321 for chrom in chroms: |
| 242 length = chrom_len[chrom] | 322 length = chrom_len[chrom] |
| 243 vals, labels = tick_foo(0, length) | 323 vals, labels = tick_foo(0, length) |
| 281 ax2.set_xticks(vals) | 361 ax2.set_xticks(vals) |
| 282 ax2.set_xticklabels(labels) | 362 ax2.set_xticklabels(labels) |
| 283 else: | 363 else: |
| 284 plt.axis('off') | 364 plt.axis('off') |
| 285 for p1, p2, state in sorted(data[chrom][individual]): | 365 for p1, p2, state in sorted(data[chrom][individual]): |
| 366 #for patch in make_state_rectangle(p1, p2, state, chrom, individual): | |
| 286 for patch in make_state_rectangle(p1, p2, state, chrom, individual): | 367 for patch in make_state_rectangle(p1, p2, state, chrom, individual): |
| 287 ax2.add_patch(patch) | 368 ax2.add_patch(patch) |
| 288 | 369 |
| 289 plt.savefig(output_file) | 370 plt.savefig(output_file) |
| 290 | 371 |
| 293 if __name__ == '__main__': | 374 if __name__ == '__main__': |
| 294 input_dbkey, input_file, output_file, galaxy_data_index_dir = sys.argv[1:5] | 375 input_dbkey, input_file, output_file, galaxy_data_index_dir = sys.argv[1:5] |
| 295 make_dpmix_plot(input_dbkey, input_file, output_file, galaxy_data_index_dir) | 376 make_dpmix_plot(input_dbkey, input_file, output_file, galaxy_data_index_dir) |
| 296 sys.exit(0) | 377 sys.exit(0) |
| 297 | 378 |
| 379 ## notes | |
| 380 # 1) pass in a state to name mapping | |
| 381 # 2) only print out names for states which exist in the data, and are in the state to name mapping |
