def runtest(lmaManager=None, lma_view=None, HDFmanagers=None): # colormap = get_cmap('gist_yarg_r') colormap = get_cmap('gist_earth') density_maxes = [] total_counts = [] all_t = [] for delta_minutes in minute_intervals: time_delta = DateTimeDelta(0, 0, delta_minutes, 0) n_frames = int(ceil((end_time - start_time) / time_delta)) n_cols = 6 n_rows = int(ceil( float(n_frames) / n_cols )) w, h = figaspect(float(n_rows)/n_cols) xedge=np.arange(b.x[0], b.x[1]+dx, dx) yedge=np.arange(b.y[0], b.y[1]+dy, dy) x_range = b.x[1] - b.x[0] y_range = b.y[1] - b.y[0] min_count, max_count = 1, max_count_baseline*delta_minutes f = figure(figsize=(w,h)) p = small_multiples_plot(fig=f, rows=n_rows, columns=n_cols) p.label_edges(True) for ax in p.multiples.flat: ax.yaxis.set_major_formatter(kilo_formatter) ax.xaxis.set_major_formatter(kilo_formatter) for i in range(n_frames): frame_start = start_time + i*time_delta frame_end = frame_start + time_delta b.sec_of_day = (frame_start.abstime, frame_end.abstime) b.t = (frame_start, frame_end) do_plot = False flash_extent_density = True density = None if source_density==True: lmaManager.refresh(b) lma_view.transformed.cache_is_old() x,y,t=lma_view.transformed['x','y','t'] density,edges = np.histogramdd((x,y), bins=(xedge,yedge)) do_plot=True else: for lmaManager in HDFmanagers: # yes, loop through every file every time and reselect data. # so wrong, yet so convenient. h5 = lmaManager.h5file if flash_extent_density == False: lmaManager.refresh(b) lma_view = AcuityView(DataSelection(lmaManager.data, b), mapProj, bounds=b) # lma_view.transformed.cache_is_old() x,y,t=lma_view.transformed['x','y','t'] if x.shape[0] > 1: do_plot = True break else: # assume here that the bounds sec_of_day day is the same as # the dataset day t0, t1 = b.sec_of_day # events = getattr(h5.root.events, lmaManager.table.name)[:] # flashes = getattr(h5.root.flashes, lmaManager.table.name)[:] event_dtype = getattr(h5.root.events, lmaManager.table.name)[0].dtype events_all = getattr(h5.root.events, lmaManager.table.name)[:] flashes = getattr(h5.root.flashes, lmaManager.table.name) def event_yielder(evs, fls): these_events = [] for fl in fls: if ( (fl['n_points']>9) & (t0 < fl['start']) & (fl['start'] <= t1) ): these_events = evs[evs['flash_id'] == fl['flash_id']] if len(these_events) <> fl['n_points']: print 'not giving all ', fl['n_points'], ' events? ', these_events.shape for an_ev in these_events: yield an_ev # events = np.fromiter((an_ev for an_ev in ( events_all[events_all['flash_id'] == fl['flash_id']] # for fl in flashes if ( # (fl['n_points']>9) & (t0 < fl['start']) & (fl['start'] <= t1) # ) # ) ), dtype=event_dtype) events = np.fromiter(event_yielder(events_all, flashes), dtype=event_dtype) # print events['flash_id'].shape ### Flash extent density ### x,y,z = mapProj.fromECEF( *geoProj.toECEF(events['lon'], events['lat'], events['alt']) ) # Convert to integer grid coordinate bins # 0 1 2 3 # | | | | | # -1.5 0.0 1.5 3.0 4.5 if x.shape[0] > 1: density, edges = extent_density(x,y,events['flash_id'].astype('int32'), b.x[0], b.y[0], dx, dy, xedge, yedge) do_plot = True break # print 'density values: ', density.min(), density.max() if do_plot == True: # need some data # density,edges = np.histogramdd((x,y), bins=(xedge,yedge)) density_plot = p.multiples.flat[i].pcolormesh(xedge,yedge, np.log10(density.transpose()), vmin=-0.2, vmax=np.log10(max_count), cmap=colormap) label_string = frame_start.strftime('%H%M:%S') text_label = p.multiples.flat[i].text(b.x[0]-pad+x_range*.01, b.y[0]-pad+y_range*.01, label_string, color=(0.5,)*3, size=6) density_plot.set_rasterized(True) density_maxes.append(density.max()) total_counts.append(density.sum()) all_t.append(frame_start) print label_string, x.shape, density.max(), density.sum() color_scale = ColorbarBase(p.colorbar_ax, cmap=density_plot.cmap, norm=density_plot.norm, orientation='horizontal') # color_scale.set_label('count per pixel') color_scale.set_label('log10(count per pixel)') # moving reference frame correction. all panels will have same limits, based on time of last frame view_dt = 0.0 # (frame_start - t0).seconds x_ctr = x0 + view_dt*u y_ctr = y0 + view_dt*v view_x = (x_ctr - view_dx/2.0 - pad, x_ctr + view_dx/2.0 + pad) view_y = (y_ctr - view_dy/2.0 - pad, y_ctr + view_dy/2.0 + pad) # view_x = (b.x[0]+view_dt*u, b.x[1]+view_dt*u) # view_y = (b.y[0]+view_dt*v, b.y[1]+view_dt*v) # print 'making timeseries', # time_series = figure(figsize=(16,9)) # ts_ax = time_series.add_subplot(111) # ts_ax.plot_date(mx2num(all_t),total_counts,'-', label='total sources', tz=tz) # ts_ax.plot_date(mx2num(all_t),density_maxes,'-', label='max pixel', tz=tz) # ts_ax.xaxis.set_major_formatter(time_series_x_fmt) # ts_ax.legend() # time_filename = 'out/LMA-timeseries_%s_%5.2fkm_%5.1fs.pdf' % (start_time.strftime('%Y%m%d_%H%M%S'), dx/1000.0, time_delta.seconds) # time_series.savefig(time_filename) # print ' ... done' print 'making multiples', p.multiples.flat[0].axis(view_x+view_y) filename = 'out/LMA-density_%s_%5.2fkm_%5.1fs.pdf' % (start_time.strftime('%Y%m%d_%H%M%S'), dx/1000.0, time_delta.seconds) f.savefig(filename, dpi=150) print ' ... done' f.clf() return events
def make_plot(filename, grid_name, x_name='x', y_name='y', t_name='time', n_cols=6, outpath='', filename_prefix='LMA', do_save=True, image_type='pdf', colormap='gist_earth'): """ colormap: a string giving the name of a matplotlib built-in colormap, or a matplotlib.colors.Colormap instance """ f = nc.NetCDFFile(filename) data = f.variables # dictionary of variable names to nc_var objects dims = f.dimensions # dictionary of dimension names to sizes x = data[x_name] y = data[y_name] t = data[t_name] grid = data[grid_name] assert len(x.shape) == 1 assert len(y.shape) == 1 assert len(t.shape) == 1 grid_dims = grid.dimensions # tuple of dimension names name_to_idx = dict((k, i) for i, k in enumerate(grid_dims)) grid_t_idx = name_to_idx[t.dimensions[0]] grid_x_idx = name_to_idx[x.dimensions[0]] grid_y_idx = name_to_idx[y.dimensions[0]] n_frames = t.shape[0] # n_cols = 6 n_rows = int(ceil( float(n_frames) / n_cols )) if type(colormap) == type(''): colormap = get_cmap(colormap) grey_color = (0.5,)*3 frame_color = (0.2,)*3 density_maxes = [] total_counts = [] all_t = [] xedge = centers_to_edges(x) x_range = xedge.max() - xedge.min() yedge = centers_to_edges(y) y_range = yedge.max() - yedge.min() dx = (xedge[1]-xedge[0]) # w, h = figaspect(float(n_rows)/n_cols) # breaks for large numbers of frames - has a hard-coded max figure size w, h, n_rows_perpage, n_pages = multiples_figaspect(n_rows, n_cols, x_range, y_range, fig_width=8.5, max_height=None) # count_scale_factor = dx # / 1000.0 # max_count_baseline = 450 * count_scale_factor #/ 10.0 min_count, max_count = 1, grid[:].max() #max_count_baseline*(t[1]-t[0]) if (max_count == 0) | (max_count == 1 ): max_count = min_count+1 f.close() default_vmin = -0.2 if np.log10(max_count) <= default_vmin: vmin_count = np.log10(max_count) + default_vmin else: vmin_count = default_vmin fig = Figure(figsize=(w,h)) canvas = FigureCanvasAgg(fig) fig.set_canvas(canvas) p = small_multiples_plot(fig=fig, rows=n_rows, columns=n_cols) p.label_edges(True) pad = 0.0 # for time labels in each frame for ax in p.multiples.flat: ax.set_axis_bgcolor('black') ax.spines['top'].set_edgecolor(frame_color) ax.spines['bottom'].set_edgecolor(frame_color) ax.spines['left'].set_edgecolor(frame_color) ax.spines['right'].set_edgecolor(frame_color) # ax.yaxis.set_major_formatter(kilo_formatter) # ax.xaxis.set_major_formatter(kilo_formatter) base_date = datetime.strptime(t.units, "seconds since %Y-%m-%d %H:%M:%S") time_delta = timedelta(0,float(t[0]),0) start_time = base_date + time_delta indexer = [slice(None),]*len(grid.shape) frame_start_times = [] for i in range(n_frames): frame_start = base_date + timedelta(0,float(t[i]),0) frame_start_times.append(frame_start) indexer[grid_t_idx] = i density = grid[indexer] # density,edges = np.histogramdd((x,y), bins=(xedge,yedge)) density_plot = p.multiples.flat[i].pcolormesh(xedge,yedge, np.log10(density.transpose()), vmin=vmin_count, vmax=np.log10(max_count), cmap=colormap) label_string = frame_start.strftime('%H%M:%S') text_label = p.multiples.flat[i].text(xedge[0]-pad+x_range*.015, yedge[0]-pad+y_range*.015, label_string, color=grey_color, size=6) density_plot.set_rasterized(True) density_maxes.append(density.max()) total_counts.append(density.sum()) all_t.append(frame_start) print label_string, x.shape, density.max(), density.sum() color_scale = ColorbarBase(p.colorbar_ax, cmap=density_plot.cmap, norm=density_plot.norm, orientation='horizontal') # color_scale.set_label('count per pixel') color_scale.set_label('log10(count per pixel)') view_x = (xedge.min(), xedge.max()) view_y = (yedge.min(), yedge.max()) print 'making multiples', p.multiples.flat[0].axis(view_x+view_y) filename = '%s-%s_%s_%05.2fkm_%05.1fs.%s' % (filename_prefix, grid_name, start_time.strftime('%Y%m%d_%H%M%S'), dx, time_delta.seconds, image_type) filename = os.path.join(outpath, filename) if do_save: fig.savefig(filename, dpi=150) return fig, p, frame_start_times, filename print ' ... done'
def make_plot(filename, grid_name, x_name='x', y_name='y', t_name='time', n_cols=6, outpath='', filename_prefix='LMA', do_save=True, image_type='pdf', colormap='gist_earth'): """ colormap: a string giving the name of a matplotlib built-in colormap, or a matplotlib.colors.Colormap instance """ f = nc.NetCDFFile(filename) data = f.variables # dictionary of variable names to nc_var objects dims = f.dimensions # dictionary of dimension names to sizes x = data[x_name] y = data[y_name] t = data[t_name] grid = data[grid_name] assert len(x.shape) == 1 assert len(y.shape) == 1 assert len(t.shape) == 1 grid_dims = grid.dimensions # tuple of dimension names name_to_idx = dict((k, i) for i, k in enumerate(grid_dims)) grid_t_idx = name_to_idx[t.dimensions[0]] grid_x_idx = name_to_idx[x.dimensions[0]] grid_y_idx = name_to_idx[y.dimensions[0]] n_frames = t.shape[0] # n_cols = 6 n_rows = int(ceil(float(n_frames) / n_cols)) if type(colormap) == type(''): colormap = get_cmap(colormap) grey_color = (0.5, ) * 3 frame_color = (0.2, ) * 3 density_maxes = [] total_counts = [] all_t = [] xedge = centers_to_edges(x) x_range = xedge.max() - xedge.min() yedge = centers_to_edges(y) y_range = yedge.max() - yedge.min() dx = (xedge[1] - xedge[0]) # w, h = figaspect(float(n_rows)/n_cols) # breaks for large numbers of frames - has a hard-coded max figure size w, h, n_rows_perpage, n_pages = multiples_figaspect(n_rows, n_cols, x_range, y_range, fig_width=8.5, max_height=None) # count_scale_factor = dx # / 1000.0 # max_count_baseline = 450 * count_scale_factor #/ 10.0 min_count, max_count = 1, grid[:].max() #max_count_baseline*(t[1]-t[0]) if (max_count == 0) | (max_count == 1): max_count = min_count + 1 f.close() default_vmin = -0.2 if np.log10(max_count) <= default_vmin: vmin_count = np.log10(max_count) + default_vmin else: vmin_count = default_vmin fig = Figure(figsize=(w, h)) canvas = FigureCanvasAgg(fig) fig.set_canvas(canvas) p = small_multiples_plot(fig=fig, rows=n_rows, columns=n_cols) p.label_edges(True) pad = 0.0 # for time labels in each frame for ax in p.multiples.flat: ax.set_axis_bgcolor('black') ax.spines['top'].set_edgecolor(frame_color) ax.spines['bottom'].set_edgecolor(frame_color) ax.spines['left'].set_edgecolor(frame_color) ax.spines['right'].set_edgecolor(frame_color) # ax.yaxis.set_major_formatter(kilo_formatter) # ax.xaxis.set_major_formatter(kilo_formatter) base_date = datetime.strptime(t.units, "seconds since %Y-%m-%d %H:%M:%S") time_delta = timedelta(0, float(t[0]), 0) start_time = base_date + time_delta indexer = [ slice(None), ] * len(grid.shape) frame_start_times = [] for i in range(n_frames): frame_start = base_date + timedelta(0, float(t[i]), 0) frame_start_times.append(frame_start) indexer[grid_t_idx] = i density = grid[indexer] # density,edges = np.histogramdd((x,y), bins=(xedge,yedge)) density_plot = p.multiples.flat[i].pcolormesh(xedge, yedge, np.log10( density.transpose()), vmin=vmin_count, vmax=np.log10(max_count), cmap=colormap) label_string = frame_start.strftime('%H%M:%S') text_label = p.multiples.flat[i].text(xedge[0] - pad + x_range * .015, yedge[0] - pad + y_range * .015, label_string, color=grey_color, size=6) density_plot.set_rasterized(True) density_maxes.append(density.max()) total_counts.append(density.sum()) all_t.append(frame_start) print label_string, x.shape, density.max(), density.sum() color_scale = ColorbarBase(p.colorbar_ax, cmap=density_plot.cmap, norm=density_plot.norm, orientation='horizontal') # color_scale.set_label('count per pixel') color_scale.set_label('log10(count per pixel)') view_x = (xedge.min(), xedge.max()) view_y = (yedge.min(), yedge.max()) print 'making multiples', p.multiples.flat[0].axis(view_x + view_y) filename = '%s-%s_%s_%05.2fkm_%05.1fs.%s' % ( filename_prefix, grid_name, start_time.strftime('%Y%m%d_%H%M%S'), dx, time_delta.seconds, image_type) filename = os.path.join(outpath, filename) if do_save: fig.savefig(filename, dpi=150) return fig, p, frame_start_times, filename print ' ... done'
def runtest(lmaManager=None, lma_view=None, HDFmanagers=None): # colormap = get_cmap('gist_yarg_r') colormap = get_cmap('gist_earth') density_maxes = [] total_counts = [] all_t = [] for delta_minutes in minute_intervals: time_delta = DateTimeDelta(0, 0, delta_minutes, 0) n_frames = int(ceil((end_time - start_time) / time_delta)) n_cols = 6 n_rows = int(ceil(float(n_frames) / n_cols)) w, h = figaspect(float(n_rows) / n_cols) xedge = np.arange(b.x[0], b.x[1] + dx, dx) yedge = np.arange(b.y[0], b.y[1] + dy, dy) x_range = b.x[1] - b.x[0] y_range = b.y[1] - b.y[0] min_count, max_count = 1, max_count_baseline * delta_minutes f = figure(figsize=(w, h)) p = small_multiples_plot(fig=f, rows=n_rows, columns=n_cols) p.label_edges(True) for ax in p.multiples.flat: ax.yaxis.set_major_formatter(kilo_formatter) ax.xaxis.set_major_formatter(kilo_formatter) for i in range(n_frames): frame_start = start_time + i * time_delta frame_end = frame_start + time_delta b.sec_of_day = (frame_start.abstime, frame_end.abstime) b.t = (frame_start, frame_end) do_plot = False flash_extent_density = True density = None if source_density == True: lmaManager.refresh(b) lma_view.transformed.cache_is_old() x, y, t = lma_view.transformed['x', 'y', 't'] density, edges = np.histogramdd((x, y), bins=(xedge, yedge)) do_plot = True else: for lmaManager in HDFmanagers: # yes, loop through every file every time and reselect data. # so wrong, yet so convenient. h5 = lmaManager.h5file if flash_extent_density == False: lmaManager.refresh(b) lma_view = AcuityView(DataSelection( lmaManager.data, b), mapProj, bounds=b) # lma_view.transformed.cache_is_old() x, y, t = lma_view.transformed['x', 'y', 't'] if x.shape[0] > 1: do_plot = True break else: # assume here that the bounds sec_of_day day is the same as # the dataset day t0, t1 = b.sec_of_day # events = getattr(h5.root.events, lmaManager.table.name)[:] # flashes = getattr(h5.root.flashes, lmaManager.table.name)[:] event_dtype = getattr(h5.root.events, lmaManager.table.name)[0].dtype events_all = getattr(h5.root.events, lmaManager.table.name)[:] flashes = getattr(h5.root.flashes, lmaManager.table.name) def event_yielder(evs, fls): these_events = [] for fl in fls: if ((fl['n_points'] > 9) & (t0 < fl['start']) & (fl['start'] <= t1)): these_events = evs[evs['flash_id'] == fl['flash_id']] if len(these_events) <> fl['n_points']: print 'not giving all ', fl[ 'n_points'], ' events? ', these_events.shape for an_ev in these_events: yield an_ev # events = np.fromiter((an_ev for an_ev in ( events_all[events_all['flash_id'] == fl['flash_id']] # for fl in flashes if ( # (fl['n_points']>9) & (t0 < fl['start']) & (fl['start'] <= t1) # ) # ) ), dtype=event_dtype) events = np.fromiter(event_yielder( events_all, flashes), dtype=event_dtype) # print events['flash_id'].shape ### Flash extent density ### x, y, z = mapProj.fromECEF(*geoProj.toECEF( events['lon'], events['lat'], events['alt'])) # Convert to integer grid coordinate bins # 0 1 2 3 # | | | | | # -1.5 0.0 1.5 3.0 4.5 if x.shape[0] > 1: density, edges = extent_density( x, y, events['flash_id'].astype('int32'), b.x[0], b.y[0], dx, dy, xedge, yedge) do_plot = True break # print 'density values: ', density.min(), density.max() if do_plot == True: # need some data # density,edges = np.histogramdd((x,y), bins=(xedge,yedge)) density_plot = p.multiples.flat[i].pcolormesh( xedge, yedge, np.log10(density.transpose()), vmin=-0.2, vmax=np.log10(max_count), cmap=colormap) label_string = frame_start.strftime('%H%M:%S') text_label = p.multiples.flat[i].text( b.x[0] - pad + x_range * .01, b.y[0] - pad + y_range * .01, label_string, color=(0.5, ) * 3, size=6) density_plot.set_rasterized(True) density_maxes.append(density.max()) total_counts.append(density.sum()) all_t.append(frame_start) print label_string, x.shape, density.max(), density.sum() color_scale = ColorbarBase(p.colorbar_ax, cmap=density_plot.cmap, norm=density_plot.norm, orientation='horizontal') # color_scale.set_label('count per pixel') color_scale.set_label('log10(count per pixel)') # moving reference frame correction. all panels will have same limits, based on time of last frame view_dt = 0.0 # (frame_start - t0).seconds x_ctr = x0 + view_dt * u y_ctr = y0 + view_dt * v view_x = (x_ctr - view_dx / 2.0 - pad, x_ctr + view_dx / 2.0 + pad) view_y = (y_ctr - view_dy / 2.0 - pad, y_ctr + view_dy / 2.0 + pad) # view_x = (b.x[0]+view_dt*u, b.x[1]+view_dt*u) # view_y = (b.y[0]+view_dt*v, b.y[1]+view_dt*v) # print 'making timeseries', # time_series = figure(figsize=(16,9)) # ts_ax = time_series.add_subplot(111) # ts_ax.plot_date(mx2num(all_t),total_counts,'-', label='total sources', tz=tz) # ts_ax.plot_date(mx2num(all_t),density_maxes,'-', label='max pixel', tz=tz) # ts_ax.xaxis.set_major_formatter(time_series_x_fmt) # ts_ax.legend() # time_filename = 'out/LMA-timeseries_%s_%5.2fkm_%5.1fs.pdf' % (start_time.strftime('%Y%m%d_%H%M%S'), dx/1000.0, time_delta.seconds) # time_series.savefig(time_filename) # print ' ... done' print 'making multiples', p.multiples.flat[0].axis(view_x + view_y) filename = 'out/LMA-density_%s_%5.2fkm_%5.1fs.pdf' % ( start_time.strftime('%Y%m%d_%H%M%S'), dx / 1000.0, time_delta.seconds) f.savefig(filename, dpi=150) print ' ... done' f.clf() return events