def sort(trialsfile, plots, unit=None, network='p', **kwargs): # Load trials data = utils.load(trialsfile) if len(data) == 9: trials, U, Z, A, P, M, perf, r_p, r_v = data else: trials, U, Z, Z_b, A, P, M, perf, r_p, r_v = data if network == 'p': print("Sorting policy network activity.") r = r_p else: print("Sorting value network activity.") r = r_v # Number of units N = r.shape[-1] # Time time = trials[0]['time'] Ntime = len(time) # Aligned time time_a = np.concatenate((-time[1:][::-1], time)) Ntime_a = len(time_a) #===================================================================================== # Preferred targets #===================================================================================== preferred_targets = get_preferred_targets(trials, perf, r) #===================================================================================== # No-wager trials #===================================================================================== def get_no_wager(func_t0): trials_by_cond = {} for n, trial in enumerate(trials): if trial['wager']: continue if trial['coh'] == 0: continue if perf.choices[n] is None: continue cond = trial['left_right'] m_n = np.tile(M[:,n], (N, 1)).T r_n = r[:,n]*m_n t0 = func_t0(trial['epochs'], perf.t_choices[n]) # Storage trials_by_cond.setdefault(cond, {'r': np.zeros((Ntime_a, N)), 'n': np.zeros((Ntime_a, N))}) # Before n_b = r_n[:t0].shape[0] trials_by_cond[cond]['r'][Ntime-1-n_b:Ntime-1] += r_n[:t0] trials_by_cond[cond]['n'][Ntime-1-n_b:Ntime-1] += m_n[:t0] # After n_a = r_n[t0:].shape[0] trials_by_cond[cond]['r'][Ntime-1:Ntime-1+n_a] += r_n[t0:] trials_by_cond[cond]['n'][Ntime-1:Ntime-1+n_a] += m_n[t0:] # Average for cond in trials_by_cond: trials_by_cond[cond] = utils.div(trials_by_cond[cond]['r'], trials_by_cond[cond]['n']) return trials_by_cond noTs_stimulus = get_no_wager(lambda epochs, t_choice: epochs['stimulus'][0] - 1) noTs_choice = get_no_wager(lambda epochs, t_choice: t_choice) #===================================================================================== # Wager trials, aligned to stimulus onset #===================================================================================== def get_wager(func_t0): trials_by_cond = {} trials_by_cond_sure = {} for n, trial in enumerate(trials): if not trial['wager']: continue if perf.choices[n] is None: continue if trial['coh'] == 0: continue cond = trial['left_right'] m_n = np.tile(M[:,n], (N, 1)).T r_n = r[:,n]*m_n t0 = func_t0(trial['epochs'], perf.t_choices[n]) if perf.choices[n] == 'S': # Storage trials_by_cond_sure.setdefault(cond, {'r': np.zeros((Ntime_a, N)), 'n': np.zeros((Ntime_a, N))}) # Before n_b = r_n[:t0].shape[0] trials_by_cond_sure[cond]['r'][Ntime-1-n_b:Ntime-1] += r_n[:t0] trials_by_cond_sure[cond]['n'][Ntime-1-n_b:Ntime-1] += m_n[:t0] # After n_a = r_n[t0:].shape[0] trials_by_cond_sure[cond]['r'][Ntime-1:Ntime-1+n_a] += r_n[t0:] trials_by_cond_sure[cond]['n'][Ntime-1:Ntime-1+n_a] += m_n[t0:] else: # Storage trials_by_cond.setdefault(cond, {'r': np.zeros((Ntime_a, N)), 'n': np.zeros((Ntime_a, N))}) # Before n_b = r_n[:t0].shape[0] trials_by_cond[cond]['r'][Ntime-1-n_b:Ntime-1] += r_n[:t0] trials_by_cond[cond]['n'][Ntime-1-n_b:Ntime-1] += m_n[:t0] # After n_a = r_n[t0:].shape[0] trials_by_cond[cond]['r'][Ntime-1:Ntime-1+n_a] += r_n[t0:] trials_by_cond[cond]['n'][Ntime-1:Ntime-1+n_a] += m_n[t0:] # Average for cond in trials_by_cond: trials_by_cond[cond] = utils.div(trials_by_cond[cond]['r'], trials_by_cond[cond]['n']) # Average for cond in trials_by_cond_sure: trials_by_cond_sure[cond] = utils.div(trials_by_cond_sure[cond]['r'], trials_by_cond_sure[cond]['n']) return trials_by_cond, trials_by_cond_sure Ts_stimulus, Ts_stimulus_sure = get_wager(lambda epochs, t_choice: epochs['stimulus'][0] - 1) Ts_sure, Ts_sure_sure = get_wager(lambda epochs, t_choice: epochs['sure'][0] - 1) Ts_choice, Ts_choice_sure = get_wager(lambda epochs, t_choice: t_choice) #===================================================================================== # Plot #===================================================================================== lw = kwargs.get('lw', 1.25) dashes = kwargs.get('dashes', [3, 1.5]) in_opp_colors = {-1: '0.6', +1: 'k'} def plot_noTs(noTs, plot, unit, tmin, tmax): w, = np.where((tmin <= time_a) & (time_a <= tmax)) t = time_a[w] yall = [[1]] for lr in noTs: color = in_opp_colors[lr*preferred_targets[unit]] y = noTs[lr][w,unit] plot.plot(t, y, color=color, lw=lw) yall.append(y) plot.xlim(tmin, tmax) plot.xticks([0, tmax]) plot.lim('y', yall, lower=0) return yall def plot_Ts(Ts, Ts_sure, plot, unit, tmin, tmax): w, = np.where((tmin <= time_a) & (time_a <= tmax)) t = time_a[w] yall = [[1]] for lr in Ts: color = in_opp_colors[lr*preferred_targets[unit]] y = Ts[lr][w,unit] plot.plot(t, y, color=color, lw=lw) yall.append(y) for lr in Ts_sure: color = in_opp_colors[lr*preferred_targets[unit]] y = Ts_sure[lr][w,unit] plot.plot(t, y, color=color, lw=lw, linestyle='--', dashes=dashes) yall.append(y) plot.xlim(tmin, tmax) plot.xticks([0, tmax]) plot.lim('y', yall, lower=0) return yall if unit is not None: y = [] tmin = kwargs.get('noTs-stimulus-tmin', -100) tmax = kwargs.get('noTs-stimulus-tmax', 700) y += plot_noTs(noTs_stimulus, plots['noTs-stimulus'], unit, tmin, tmax) tmin = kwargs.get('noTs-choice-tmin', -500) tmax = kwargs.get('noTs-choice-tmax', 0) y += plot_noTs(noTs_choice, plots['noTs-choice'], unit, tmin, tmax) tmin = kwargs.get('Ts-stimulus-tmin', -100) tmax = kwargs.get('Ts-stimulus-tmax', 700) y += plot_Ts(Ts_stimulus, Ts_stimulus_sure, plots['Ts-stimulus'], unit, tmin, tmax) tmin = kwargs.get('Ts-sure-tmin', -200) tmax = kwargs.get('Ts-sure-tmax', 700) y += plot_Ts(Ts_sure, Ts_sure_sure, plots['Ts-sure'], unit, tmin, tmax) tmin = kwargs.get('Ts-choice-tmin', -500) tmax = kwargs.get('Ts-choice-tmax', 0) y += plot_Ts(Ts_choice, Ts_choice_sure, plots['Ts-choice'], unit, tmin, tmax) return y else: name = plots for unit in xrange(N): w = utils.mm_to_inch(174) r = 0.35 fig = Figure(w=w, r=r) x0 = 0.09 y0 = 0.15 w = 0.13 h = 0.75 dx = 0.05 DX = 0.08 fig.add('noTs-stimulus', [x0, y0, w, h]) fig.add('noTs-choice', [fig[-1].right+dx, y0, w, h]) fig.add('Ts-stimulus', [fig[-1].right+DX, y0, w, h]) fig.add('Ts-sure', [fig[-1].right+dx, y0, w, h]) fig.add('Ts-choice', [fig[-1].right+dx, y0, w, h]) #----------------------------------------------------------------------------- y = [] plot = fig['noTs-stimulus'] y += plot_noTs(noTs_stimulus, plot, unit, -100, 700) plot.vline(0) plot = fig['noTs-choice'] y += plot_noTs(noTs_choice, plot, unit, -500, 200) plot.vline(0) plot = fig['Ts-stimulus'] y += plot_Ts(Ts_stimulus, Ts_stimulus_sure, plot, unit, -100, 700) plot.vline(0) plot = fig['Ts-sure'] y += plot_Ts(Ts_sure, Ts_sure_sure, plot, unit, -200, 700) plot.vline(0) plot = fig['Ts-choice'] y += plot_Ts(Ts_choice, Ts_choice_sure, plot, unit, -500, 200) plot.vline(0) for plot in fig.plots.values(): plot.lim('y', y, lower=0) #----------------------------------------------------------------------------- fig.save(name+'_{}{:03d}'.format(network, unit)) fig.close()
# analysis/rdm rdm_analysisfile = os.path.join(analysispath, 'rdm.py') rdm_analysis = imp.load_source('rdm_analysis', rdm_analysisfile) # models/rdm_fixed rdm_fixed_modelfile = os.path.join(modelspath, 'rdm_fixed.py') rdm_fixed_model = imp.load_source('rdm_fixed_model', rdm_fixed_modelfile) rdm_fixed_behavior = os.path.join(trialspath, 'rdm_fixed', 'trials_behavior.pkl') rdm_fixed_activity = os.path.join(trialspath, 'rdm_fixed', 'trials_activity.pkl') #========================================================================================= w = utils.mm_to_inch(174) r = 0.5 fig = Figure(w=w, r=r) x0 = 0.12 y0 = 0.15 w = 0.37 h = 0.8 dx = 1.3 * w fig.add('on-stimulus', [x0, y0, w, h]) fig.add('on-choice', [x0 + dx, y0, w, h]) #========================================================================================= kwargs = {
analysispath = os.path.join(parent, 'examples', 'analysis') modelspath = os.path.join(parent, 'examples', 'models') # analysis/rdm rdm_analysisfile = os.path.join(analysispath, 'rdm.py') rdm_analysis = imp.load_source('rdm_analysis', rdm_analysisfile) # models/rdm_fixed rdm_fixed_modelfile = os.path.join(modelspath, 'rdm_fixed.py') rdm_fixed_model = imp.load_source('rdm_fixed_model', rdm_fixed_modelfile) rdm_fixed_behavior = os.path.join(trialspath, 'rdm_fixed', 'trials_behavior.pkl') rdm_fixed_activity = os.path.join(trialspath, 'rdm_fixed', 'trials_activity.pkl') #========================================================================================= w = utils.mm_to_inch(174) r = 0.5 fig = Figure(w=w, r=r) x0 = 0.12 y0 = 0.15 w = 0.37 h = 0.8 dx = 1.3*w fig.add('on-stimulus', [x0, y0, w, h]) fig.add('on-choice', [x0+dx, y0, w, h]) #========================================================================================= kwargs = {'on-stimulus-tmin': -200, 'on-stimulus-tmax': 600,
def sort(trialsfile, plots, unit=None, network='p', **kwargs): # Load trials data = utils.load(trialsfile) if len(data) == 9: trials, U, Z, A, P, M, perf, r_p, r_v = data else: trials, U, Z, Z_b, A, P, M, perf, r_p, r_v = data if network == 'p': print("Sorting policy network activity.") r = r_p else: print("Sorting value network activity.") r = r_v # Number of units N = r.shape[-1] # Time time = trials[0]['time'] Ntime = len(time) # Aligned time time_a = np.concatenate((-time[1:][::-1], time)) Ntime_a = len(time_a) #===================================================================================== # Preferred targets #===================================================================================== preferred_targets = get_preferred_targets(trials, perf, r) #===================================================================================== # No-wager trials #===================================================================================== def get_no_wager(func_t0): trials_by_cond = {} for n, trial in enumerate(trials): if trial['wager']: continue if trial['coh'] == 0: continue if perf.choices[n] is None: continue cond = trial['left_right'] m_n = np.tile(M[:,n], (N, 1)).T r_n = r[:,n]*m_n t0 = func_t0(trial['epochs'], perf.t_choices[n]) # Storage trials_by_cond.setdefault(cond, {'r': np.zeros((Ntime_a, N)), 'n': np.zeros((Ntime_a, N))}) # Before n_b = r_n[:t0].shape[0] trials_by_cond[cond]['r'][Ntime-1-n_b:Ntime-1] += r_n[:t0] trials_by_cond[cond]['n'][Ntime-1-n_b:Ntime-1] += m_n[:t0] # After n_a = r_n[t0:].shape[0] trials_by_cond[cond]['r'][Ntime-1:Ntime-1+n_a] += r_n[t0:] trials_by_cond[cond]['n'][Ntime-1:Ntime-1+n_a] += m_n[t0:] # Average for cond in trials_by_cond: trials_by_cond[cond] = utils.div(trials_by_cond[cond]['r'], trials_by_cond[cond]['n']) return trials_by_cond noTs_stimulus = get_no_wager(lambda epochs, t_choice: epochs['stimulus'][0] - 1) noTs_choice = get_no_wager(lambda epochs, t_choice: t_choice) #===================================================================================== # Wager trials, aligned to stimulus onset #===================================================================================== def get_wager(func_t0): trials_by_cond = {} trials_by_cond_sure = {} for n, trial in enumerate(trials): if not trial['wager']: continue if perf.choices[n] is None: continue if trial['coh'] == 0: continue cond = trial['left_right'] m_n = np.tile(M[:,n], (N, 1)).T r_n = r[:,n]*m_n t0 = func_t0(trial['epochs'], perf.t_choices[n]) if perf.choices[n] == 'S': # Storage trials_by_cond_sure.setdefault(cond, {'r': np.zeros((Ntime_a, N)), 'n': np.zeros((Ntime_a, N))}) # Before n_b = r_n[:t0].shape[0] trials_by_cond_sure[cond]['r'][Ntime-1-n_b:Ntime-1] += r_n[:t0] trials_by_cond_sure[cond]['n'][Ntime-1-n_b:Ntime-1] += m_n[:t0] # After n_a = r_n[t0:].shape[0] trials_by_cond_sure[cond]['r'][Ntime-1:Ntime-1+n_a] += r_n[t0:] trials_by_cond_sure[cond]['n'][Ntime-1:Ntime-1+n_a] += m_n[t0:] else: # Storage trials_by_cond.setdefault(cond, {'r': np.zeros((Ntime_a, N)), 'n': np.zeros((Ntime_a, N))}) # Before n_b = r_n[:t0].shape[0] trials_by_cond[cond]['r'][Ntime-1-n_b:Ntime-1] += r_n[:t0] trials_by_cond[cond]['n'][Ntime-1-n_b:Ntime-1] += m_n[:t0] # After n_a = r_n[t0:].shape[0] trials_by_cond[cond]['r'][Ntime-1:Ntime-1+n_a] += r_n[t0:] trials_by_cond[cond]['n'][Ntime-1:Ntime-1+n_a] += m_n[t0:] # Average for cond in trials_by_cond: trials_by_cond[cond] = utils.div(trials_by_cond[cond]['r'], trials_by_cond[cond]['n']) # Average for cond in trials_by_cond_sure: trials_by_cond_sure[cond] = utils.div(trials_by_cond_sure[cond]['r'], trials_by_cond_sure[cond]['n']) return trials_by_cond, trials_by_cond_sure Ts_stimulus, Ts_stimulus_sure = get_wager(lambda epochs, t_choice: epochs['stimulus'][0] - 1) Ts_sure, Ts_sure_sure = get_wager(lambda epochs, t_choice: epochs['sure'][0] - 1) Ts_choice, Ts_choice_sure = get_wager(lambda epochs, t_choice: t_choice) #===================================================================================== # Plot #===================================================================================== lw = kwargs.get('lw', 1.25) dashes = kwargs.get('dashes', [3, 1.5]) in_opp_colors = {-1: '0.6', +1: 'k'} def plot_noTs(noTs, plot, unit, tmin, tmax): w, = np.where((tmin <= time_a) & (time_a <= tmax)) t = time_a[w] yall = [[1]] for lr in noTs: color = in_opp_colors[lr*preferred_targets[unit]] y = noTs[lr][w,unit] plot.plot(t, y, color=color, lw=lw) yall.append(y) plot.xlim(tmin, tmax) plot.xticks([0, tmax]) plot.lim('y', yall, lower=0) return yall def plot_Ts(Ts, Ts_sure, plot, unit, tmin, tmax): w, = np.where((tmin <= time_a) & (time_a <= tmax)) t = time_a[w] yall = [[1]] for lr in Ts: color = in_opp_colors[lr*preferred_targets[unit]] y = Ts[lr][w,unit] plot.plot(t, y, color=color, lw=lw) yall.append(y) for lr in Ts_sure: color = in_opp_colors[lr*preferred_targets[unit]] y = Ts_sure[lr][w,unit] plot.plot(t, y, color=color, lw=lw, linestyle='--', dashes=dashes) yall.append(y) plot.xlim(tmin, tmax) plot.xticks([0, tmax]) plot.lim('y', yall, lower=0) return yall if unit is not None: y = [] tmin = kwargs.get('noTs-stimulus-tmin', -100) tmax = kwargs.get('noTs-stimulus-tmax', 700) y += plot_noTs(noTs_stimulus, plots['noTs-stimulus'], unit, tmin, tmax) tmin = kwargs.get('noTs-choice-tmin', -500) tmax = kwargs.get('noTs-choice-tmax', 0) y += plot_noTs(noTs_choice, plots['noTs-choice'], unit, tmin, tmax) tmin = kwargs.get('Ts-stimulus-tmin', -100) tmax = kwargs.get('Ts-stimulus-tmax', 700) y += plot_Ts(Ts_stimulus, Ts_stimulus_sure, plots['Ts-stimulus'], unit, tmin, tmax) tmin = kwargs.get('Ts-sure-tmin', -200) tmax = kwargs.get('Ts-sure-tmax', 700) y += plot_Ts(Ts_sure, Ts_sure_sure, plots['Ts-sure'], unit, tmin, tmax) tmin = kwargs.get('Ts-choice-tmin', -500) tmax = kwargs.get('Ts-choice-tmax', 0) y += plot_Ts(Ts_choice, Ts_choice_sure, plots['Ts-choice'], unit, tmin, tmax) return y else: name = plots for unit in xrange(N): w = utils.mm_to_inch(174) r = 0.35 fig = Figure(w=w, r=r) x0 = 0.09 y0 = 0.15 w = 0.13 h = 0.75 dx = 0.05 DX = 0.08 fig.add('noTs-stimulus', [x0, y0, w, h]) fig.add('noTs-choice', [fig[-1].right+dx, y0, w, h]) fig.add('Ts-stimulus', [fig[-1].right+DX, y0, w, h]) fig.add('Ts-sure', [fig[-1].right+dx, y0, w, h]) fig.add('Ts-choice', [fig[-1].right+dx, y0, w, h]) #----------------------------------------------------------------------------- y = [] plot = fig['noTs-stimulus'] y += plot_noTs(noTs_stimulus, plot, unit, -100, 700) plot.vline(0) plot = fig['noTs-choice'] y += plot_noTs(noTs_choice, plot, unit, -500, 200) plot.vline(0) plot = fig['Ts-stimulus'] y += plot_Ts(Ts_stimulus, Ts_stimulus_sure, plot, unit, -100, 700) plot.vline(0) plot = fig['Ts-sure'] y += plot_Ts(Ts_sure, Ts_sure_sure, plot, unit, -200, 700) plot.vline(0) plot = fig['Ts-choice'] y += plot_Ts(Ts_choice, Ts_choice_sure, plot, unit, -500, 200) plot.vline(0) for plot in fig.plots.values(): plot.lim('y', y, lower=0) #----------------------------------------------------------------------------- fig.save(name+'_{}{:03d}'.format(network, unit)) fig.close()
analysisfile = os.path.join(analysispath, 'postdecisionwager.py') analysis = imp.load_source('postdecisionwager_analysis', analysisfile) # model modelfile = os.path.join(modelspath, 'postdecisionwager.py') model = imp.load_source('model', modelfile) trialsfile_b = os.path.join(trialspath, 'postdecisionwager', 'trials_behavior.pkl') trialsfile_a = os.path.join(trialspath, 'postdecisionwager', 'trials_activity.pkl') #========================================================================================= # Figure #========================================================================================= w = utils.mm_to_inch(114) r = 0.9 thickness = 0.4 axislabelsize = 6 fig = Figure(w=w, r=r, thickness=thickness, ticksize=3, ticklabelsize=5, axislabelsize=axislabelsize, labelpadx=3, labelpady=4.5) x0 = 0.16 y0 = 0.67 DX = 0.1
# analysis analysisfile = os.path.join(analysispath, 'postdecisionwager.py') analysis = imp.load_source('postdecisionwager_analysis', analysisfile) # model modelfile = os.path.join(modelspath, 'postdecisionwager.py') model = imp.load_source('model', modelfile) trialsfile_b = os.path.join(trialspath, 'postdecisionwager', 'trials_behavior.pkl') trialsfile_a = os.path.join(trialspath, 'postdecisionwager', 'trials_activity.pkl') #========================================================================================= # Figure #========================================================================================= w = utils.mm_to_inch(114) r = 0.9 thickness = 0.4 axislabelsize = 6 fig = Figure(w=w, r=r, thickness=thickness, ticksize=3, ticklabelsize=5, axislabelsize=axislabelsize, labelpadx=3, labelpady=4.5) x0 = 0.16 y0 = 0.67 DX = 0.1 w_task = 0.82 h_task = 0.3 dy0 = 0.09 dy = 0.12