def draw_encoder_perfs(agg): freqs,lags = get_freqs_and_lags() electrodes = [ROSTRAL_CAUDAL_ELECTRODES_LEFT, ROSTRAL_CAUDAL_ELECTRODES_RIGHT, ROSTRAL_CAUDAL_ELECTRODES_LEFT] sites = [('GreBlu9508M', 'Site4', 'Call1', 'L'), ('WhiWhi4522M', 'Site2', 'Call2', 'R'), ('YelBlu6903F', 'Site3', 'Call3', 'L') ] weights = list() for bird,block,segment,hemi in sites: i = (agg.df.bird == bird) & (agg.df.block == block) & (agg.df.segment == segment) & (agg.df.hemi == hemi) ii = i & (agg.df.decomp == 'self_locked') assert ii.sum() == 1 wkey = agg.df[ii]['wkey'].values[0] lfp_eperf = agg.encoder_perfs[wkey] lfp_decoder_weights = agg.decoder_weights[wkey] print 'lfp_decoder_weights.shape=',lfp_decoder_weights.shape lfp_sal_weights = lfp_decoder_weights[:, :, REDUCED_ACOUSTIC_PROPS.index('sal')] lfp_q2_weights = lfp_decoder_weights[:, :, REDUCED_ACOUSTIC_PROPS.index('q2')] weights.append( (lfp_eperf, lfp_sal_weights, lfp_q2_weights) ) figsize = (24, 13) fig = plt.figure(figsize=figsize) fig.subplots_adjust(top=0.95, bottom=0.02, right=0.97, left=0.03, hspace=0.25, wspace=0.25) nrows = 3 ncols = 3 for k,(lfp_eperf,lfp_sal_weights,lfp_q2_weights) in enumerate(weights): index2electrode = electrodes[k] ax = plt.subplot(nrows, ncols, k*ncols + 1) plt.imshow(lfp_eperf, interpolation='nearest', aspect='auto', vmin=0, cmap=magma) plt.yticks(range(len(index2electrode)), ['%d' % e for e in index2electrode]) plt.xticks(range(len(freqs)), ['%d' % f for f in freqs], rotation=45) plt.xlabel('Frequency (Hz)') plt.ylabel('Electrode') plt.colorbar(label='Encoder R2') ax = plt.subplot(nrows, ncols, k*ncols + 2) absmax = np.abs(lfp_sal_weights).max() plt.imshow(lfp_sal_weights, interpolation='nearest', aspect='auto', vmin=-absmax, vmax=absmax, cmap=plt.cm.seismic) plt.yticks(range(len(index2electrode)), ['%d' % e for e in index2electrode]) plt.xticks(range(len(freqs)), ['%d' % f for f in freqs], rotation=45) plt.xlabel('Frequency (Hz)') plt.ylabel('Electrode') plt.colorbar(label='Decoder Weight') ax = plt.subplot(nrows, ncols, k*ncols + 3) absmax = np.abs(lfp_sal_weights).max() plt.imshow(lfp_q2_weights, interpolation='nearest', aspect='auto', vmin=-absmax, vmax=absmax, cmap=plt.cm.seismic) plt.yticks(range(len(index2electrode)), ['%d' % e for e in index2electrode]) plt.xticks(range(len(freqs)), ['%d' % f for f in freqs], rotation=45) plt.xlabel('Frequency (Hz)') plt.ylabel('Electrode') plt.colorbar(label='Decoder Weight') fname = os.path.join(get_this_dir(), 'encoder_weights.svg') plt.savefig(fname, facecolor='w', edgecolor='none')
def build_graph(bird='GreBlu9508M', block='Site4', segment='Call1', hemi='L', aprop='q2'): # map electrodes to positions df = pd.read_csv('/auto/tdrive/mschachter/data/aggregate/electrode_data+dist.csv') i = (df.bird == bird) & (df.block == block) & (df.hemisphere == hemi) g = df[i].groupby('electrode') electrode_props = dict() for e,gdf in g: assert len(gdf) == 1 reg = str(gdf.region.values[0]) if reg.startswith('CM'): reg = 'CM' elif 'NCM' in reg: reg = 'NCM' elif reg in ['L', 'L2A', 'L2B', 'L2', 'L1', 'L3']: reg = 'L' electrode_props[e] = {'dist_midline':float(gdf.dist_midline.values[0]), 'dist_l2a':float(gdf.dist_l2a.values[0]), 'region':reg } #TODO get the lags in a less hacky way data_dir = '/auto/tdrive/mschachter/data' pfile = os.path.join(data_dir, 'GreBlu9508M', 'transforms', 'PairwiseCF_GreBlu9508M_Site4_Call1_L_raw.h5') hf = h5py.File(pfile, 'r') lags_ms = hf.attrs['lags'] hf.close() lags_absmax = 6. lags_i = np.abs(lags_ms) < lags_absmax lags_short = lags_ms[lags_i] # read the aggregator file agg_file = os.path.join(data_dir, 'aggregate', 'pard.h5') agg = AcousticEncoderDecoderAggregator.load(agg_file) i = (agg.df.decomp == 'self+cross_locked_lim_-%d_%d' % (int(lags_absmax), int(lags_absmax))) & (agg.df.bird == bird) & (agg.df.block == block) & \ (agg.df.segment == segment) & (agg.df.hemi == hemi) print 'i.sum()=%d' % i.sum() assert i.sum() == 1, 'i.sum()=%d' % i.sum() # get decoder weights electrode_order = ROSTRAL_CAUDAL_ELECTRODES_RIGHT if hemi == 'L': electrode_order = ROSTRAL_CAUDAL_ELECTRODES_LEFT electrode_order = [int(x) for x in electrode_order] # get segment/decomp props wkey = agg.df[i].wkey.values[0] iindex = agg.df[i].iindex.values[0] # get decoder weights decoder_weights = agg.decoder_weights[wkey] W = decoder_weights[:, :, :, REDUCED_ACOUSTIC_PROPS.index(aprop)] # create a directed graph g = nx.DiGraph() # add a node for each electrode for e in electrode_order: g.add_node(e, dist_midline=electrode_props[e]['dist_midline'], dist_l2a=electrode_props[e]['dist_l2a'], region=electrode_props[e]['region'], electrode=e) # connect up the nodes for k,e1 in enumerate(electrode_order): for j in range(k): e2 = electrode_order[j] # get the coherency function and reduce it to a left and right side cf = W[k, j, :] assert len(cf) == len(lags_short) cleft = np.sum(cf[lags_short <= 0]) # goes from e2 to e1 cright = np.sum(cf[lags_short >= 0]) # goes from e1 to e2 # add edges to the graph g.add_edge(e2, e1, weight=float((cleft))) g.add_edge(e1, e2, weight=float((cright))) # plot the edge weights ewts = np.array([g.edge[e1][e2]['weight'] for e1,e2 in g.edges()]) plt.figure() plt.hist(ewts, bins=20, color='c') plt.xlabel('Edge Weight') plt.show() # threshold out the edges with low weights wthresh = 0.3 for e1,e2 in [(e1,e2) for e1,e2 in g.edges() if abs(g.edge[e1][e2]['weight']) < wthresh]: g.remove_edge(e1, e2) # write the graph to a file nx.write_gexf(g, '/tmp/%s_graph.gexf' % aprop)