def find_excitability_region(P, El, Gl, Cm, pp=low_rate_fluct_domain, discret=40, print_domain=False): """ P are the coefficients of the firing rate response fit the other parameters set the default boundaries of the numerical evaluation of the relevant firing rate domain here all in SI units """ sV0 = np.linspace(pp["sV_min"], pp["sV_max"], discret) TvN0 = np.linspace(pp["Ts_ratio"] + 1.0 / pp["muG_max"], pp["Ts_ratio"] + 1.0 / pp["muG_min"], discret) muV0 = np.linspace(pp["muV_min"], pp["muV_max"], 5 * discret) # high discret muV, sV, TvN = np.meshgrid(muV0, sV0, TvN0) Vthre = final_threshold_func(P, muV, sV, TvN, Gl, El) Fout = erfc_func(muV, sV, TvN, Vthre, Gl, Cm) dmuV, dsV, dTvN = derivatives_template(P, muV, sV, TvN, Gl * np.ones(muV.shape), El, Gl, Cm) ok = (Fout < pp["max_Fout"]) & (Fout > pp["min_Fout"]) & (dmuV > 0) & (dsV > 0) # desired conditions if print_domain: print "muV domain :", round(1e3 * muV[ok].min()), round(1e3 * muV[ok].max()) print "sV domain :", round(1e3 * sV[ok].min()), round(1e3 * sV[ok].max()) print "TvN domain :", round(1e2 * TvN[ok].min()), round(1e2 * TvN[ok].max()) return Fout[ok], Vthre[ok], muV[ok], sV[ok], TvN[ok]
def find_excitability_region(P, El, Gl, Cm,\ pp = low_rate_fluct_domain, discret=40,\ print_domain=False): """ P are the coefficients of the firing rate response fit the other parameters set the default boundaries of the numerical evaluation of the relevant firing rate domain here all in SI units """ sV0 = np.linspace(pp['sV_min'], pp['sV_max'], discret) TvN0 = np.linspace(pp['Ts_ratio'] + 1. / pp['muG_max'], pp['Ts_ratio'] + 1. / pp['muG_min'], discret) muV0 = np.linspace(pp['muV_min'], pp['muV_max'], 5 * discret) # high discret muV, sV, TvN = np.meshgrid(muV0, sV0, TvN0) Vthre = final_threshold_func(P, muV, sV, TvN, Gl) Fout = erfc_func(muV, sV, TvN, Vthre, Gl, Cm) dmuV, dsV, dTvN = derivatives_template(\ P, muV, sV, TvN, Gl*np.ones(muV.shape), El, Gl, Cm) ok = (Fout < pp['max_Fout']) & (Fout > pp['min_Fout']) & (dmuV > 0) & ( dsV > 0) # desired conditions if print_domain: print('muV domain :', round(1e3 * muV[ok].min()), round(1e3 * muV[ok].max())) print('sV domain :', round(1e3 * sV[ok].min()), round(1e3 * sV[ok].max())) print('TvN domain :', round(1e2 * TvN[ok].min()), round(1e2 * TvN[ok].max())) return Fout[ok], Vthre[ok], muV[ok], sV[ok], TvN[ok]
def make_3d_and_2d_figs(P, Fout, s_Fout, muV, sV, Tv_ratio,\ muGn, Gl, Cm, El, cell_id, vthre_lim=None,\ FONTSIZE=18): font = {'size' : FONTSIZE} mpl.rc('font', **font) Tv_ratio = np.round(1000.*Tv_ratio)/10 sV, muV = np.round(sV), np.round(muV) Tv_levels = np.unique(Tv_ratio) muV_levels = np.unique(muV) DISCRET_muV = len(muV_levels) # 3d view - Fout fig1 = plt.figure(figsize=(5,3)) plt.subplots_adjust(left=.3, bottom=.3) ax = plt.subplot(111, projection='3d') ax.set_title(cell_id) ax.view_init(elev=20., azim=210.) plt.xlabel('\n\n $\mu_V$ (mV)') plt.ylabel('\n\n $\sigma_V$ (mV)') ax.set_zlabel('\n\n $\\nu_\mathrm{out}$ (Hz)') # the colorbar to index the autocorrelation fig3 = plt.figure(figsize=(1.7,4.)) plt.subplots_adjust(right=.25) Tv_levels = np.unique(Tv_ratio) # levels no more than 5 mymap = mpl.colors.LinearSegmentedColormap.from_list(\ 'mycolors',['red','blue']) bounds= np.linspace(Tv_levels.min()-10, Tv_levels.max()+10, len(Tv_levels)+1) norm = mpl.colors.BoundaryNorm(bounds, mymap.N) cb = mpl.colorbar.ColorbarBase(plt.subplot(111), cmap=mymap, norm=norm, orientation='vertical') cb.set_ticks(np.round(Tv_levels)) cb.set_label('$\\tau_V / \\tau_\mathrm{m}^0$ (%)', fontsize=16) for TvN in Tv_levels: i_repet_Tv = np.where(Tv_ratio==TvN)[0] # setting color if len(Tv_levels)>1: r = np.min([1,(TvN-bounds.min())/(bounds.max()-bounds.min())]) else: r=1 muV2, sV2 = muV[i_repet_Tv], sV[i_repet_Tv] Fout2, s_Fout2 = Fout[i_repet_Tv], s_Fout[i_repet_Tv] for muV3 in np.unique(muV2): i_repet_muV = np.where(muV2==muV3)[0] i_muV = np.where(muV3==muV_levels)[0] sV3 = sV2[i_repet_muV] Fout3, s_Fout3 = Fout2[i_repet_muV], s_Fout2[i_repet_muV] ax.plot(muV3*np.ones(len(sV3)), sV3, Fout3,\ 'D', color=mymap(r,1), ms=6, lw=0) sv_th = np.linspace(0, sV3.max()) muGn3 =np.ones(len(sv_th)) Vthre_th = final_threshold_func(P,\ 1e-3*muV3, 1e-3*sv_th, TvN/100., muGn3, El) Fout_th = erfc_func(1e-3*muV3, 1e-3*sv_th,\ TvN/100., Vthre_th, Gl, Cm) ax.plot(muV3*np.ones(len(sv_th)), sv_th,\ Fout_th, color=mymap(r,1), alpha=.7, lw=3) for ii in range(len(Fout3)): # then errobar manually ax.plot([muV3, muV3], [sV3[ii], sV3[ii]],\ [Fout3[ii]+s_Fout3[ii], Fout3[ii]-s_Fout3[ii]],\ marker='_', color=mymap(r,1)) ax.set_zlim([0., Fout.max()]) ax.xaxis.set_major_locator( MaxNLocator(nbins = 4,prune='both') ) ax.yaxis.set_major_locator( MaxNLocator(nbins = 4) ) ax.zaxis.set_major_locator( MaxNLocator(nbins = 4,prune='lower')) fig1.tight_layout() ax.set_zlim([0., max([1,Fout.max()])]) ax.xaxis.set_major_locator( MaxNLocator(nbins = 4,prune='both') ) ax.yaxis.set_major_locator( MaxNLocator(nbins = 4) ) ax.zaxis.set_major_locator( MaxNLocator(nbins = 4,prune='lower') ) return fig1
def make_3d_fig(P, Fout, s_Fout, muV, sV, Tv_ratio,\ muGn, Gl, Cm, El, cell_id, vthre_lim=None,\ FONTSIZE=18): font = {'size': FONTSIZE} mpl.rc('font', **font) Tv_ratio = np.round(1000. * Tv_ratio) / 10 sV, muV = np.round(sV), np.round(muV) Tv_levels = np.unique(Tv_ratio) muV_levels = np.unique(muV) DISCRET_muV = len(muV_levels) # 3d view - Fout fig1 = plt.figure(figsize=(7, 4)) plt.subplots_adjust(left=.1, bottom=.2, right=.78, top=0.95) ax = plt.subplot(111, projection='3d') ax.set_title(cell_id) ax.view_init(elev=20., azim=210.) plt.xlabel('\n\n $\mu_V$ (mV)') plt.ylabel('\n\n $\sigma_V$ (mV)') ax.set_zlabel('\n\n $\\nu_\mathrm{out}$ (Hz)') # the colorbar to index the autocorrelation ax2 = plt.axes([.82, .1, .02, .8]) Tv_levels = np.unique(Tv_ratio) # levels no more than 5 mymap = mpl.colors.LinearSegmentedColormap.from_list(\ 'mycolors',['red','blue']) bounds = np.linspace(Tv_levels.min() - 10, Tv_levels.max() + 10, len(Tv_levels) + 1) norm = mpl.colors.BoundaryNorm(bounds, mymap.N) cb = mpl.colorbar.ColorbarBase(ax2, cmap=mymap, norm=norm, orientation='vertical') cb.set_ticks(np.round(Tv_levels)) cb.set_label('$\\tau_V / \\tau_\mathrm{m}^0$ (%)', fontsize=16) for TvN in Tv_levels: i_repet_Tv = np.where(Tv_ratio == TvN)[0] # setting color if len(Tv_levels) > 1: r = np.min( [1, (TvN - bounds.min()) / (bounds.max() - bounds.min())]) else: r = 1 muV2, sV2 = muV[i_repet_Tv], sV[i_repet_Tv] Fout2, s_Fout2 = Fout[i_repet_Tv], s_Fout[i_repet_Tv] for muV3 in np.unique(muV2): i_repet_muV = np.where(muV2 == muV3)[0] i_muV = np.where(muV3 == muV_levels)[0] sV3 = sV2[i_repet_muV] Fout3, s_Fout3 = Fout2[i_repet_muV], s_Fout2[i_repet_muV] ax.plot(muV3*np.ones(len(sV3)), sV3, Fout3,\ 'D', color=mymap(r,1), ms=6, lw=0) sv_th = np.linspace(0, sV3.max()) muGn3 = np.ones(len(sv_th)) Vthre_th = final_threshold_func(P,\ 1e-3*muV3, 1e-3*sv_th, TvN/100., muGn3, El) Fout_th = erfc_func(1e-3*muV3, 1e-3*sv_th,\ TvN/100., Vthre_th, Gl, Cm) ax.plot(muV3*np.ones(len(sv_th)), sv_th,\ Fout_th, color=mymap(r,1), alpha=.7, lw=3) for ii in range(len(Fout3)): # then errobar manually ax.plot([muV3, muV3], [sV3[ii], sV3[ii]],\ [Fout3[ii]+s_Fout3[ii], Fout3[ii]-s_Fout3[ii]],\ marker='_', color=mymap(r,1)) ax.set_zlim([0., Fout.max()]) ax.xaxis.set_major_locator(MaxNLocator(nbins=4, prune='both')) ax.yaxis.set_major_locator(MaxNLocator(nbins=4)) ax.zaxis.set_major_locator(MaxNLocator(nbins=4, prune='lower')) ax.set_zlim([0., max([1, Fout.max()])]) ax.xaxis.set_major_locator(MaxNLocator(nbins=4, prune='both')) ax.yaxis.set_major_locator(MaxNLocator(nbins=4)) ax.zaxis.set_major_locator(MaxNLocator(nbins=4, prune='lower')) return fig1