#!/usr/bin/python from neuron import h from neuron import gui import matplotlib as mpl mpl.use("Agg") import matplotlib.pyplot as plt font = {'weight':'regular', 'size':8, 'family':'sans-serif', 'sans-serif':'Arial'} mpl.rc('font', **font) mpl.rcParams['text.usetex']=True mpl.rcParams['text.latex.unicode']=True import numpy as np import sys import pickle import time import itertools import numpy as np def indexes(y, thres=0.3, min_dist=1): if isinstance(y, np.ndarray) and np.issubdtype(y.dtype, np.unsignedinteger): raise ValueError("y must be signed") thres = thres * (np.max(y) - np.min(y)) + np.min(y) min_dist = int(min_dist) dy = np.diff(y) zeros,=np.where(dy == 0) while len(zeros): zerosr = np.hstack([dy[1:], 0.]) zerosl = np.hstack([0., dy[:-1]]) dy[zeros]=zerosr[zeros] zeros,=np.where(dy == 0) dy[zeros]=zerosl[zeros] zeros,=np.where(dy == 0) peaks = np.where((np.hstack([dy, 0.]) < 0.) & (np.hstack([0., dy]) > 0.) & (y > thres))[0] if peaks.size > 1 and min_dist > 1: highest = peaks[np.argsort(y[peaks])][::-1] rem = np.ones(y.size, dtype=bool) rem[peaks] = False for peak in highest: if not rem[peak]: sl = slice(max(0, peak - min_dist), peak + min_dist + 1) rem[sl] = True rem[peak] = False peaks = np.arange(y.size)[~rem] return peaks eSynlist = [] ePreconlist = [] iPreconlist = [] eStimlist = [] iStimlist = [] iSynlista = [] def placeNMDA(location): eStimlist.append(h.NetStim()) eStimlist[-1].interval = 1 eStimlist[-1].number = 1 eStimlist[-1].start = 100 eStimlist[-1].noise = 0 eSynlist.append(h.ProbAMPANMDA2_RATIO(location)) eSynlist[-1].gmax = 0.0004 eSynlist[-1].mgVoltageCoeff = 0.08 ePreconlist.append(h.NetCon(eStimlist[-1], eSynlist[-1])) ePreconlist[-1].weight[0] = 1 ePreconlist[-1].delay = 0 def placeGABA(location): iStimlist.append(h.NetStim()) iStimlist[-1].interval = 1 iStimlist[-1].number = 1 iStimlist[-1].start = 100 iStimlist[-1].noise = 0 iSynlista.append(h.ProbUDFsyn2_lark(location)) iSynlista[-1].tau_r = 0.18 iSynlista[-1].tau_d = 5 iSynlista[-1].e = - 80 iSynlista[-1].Dep = 0 iSynlista[-1].Fac = 0 iSynlista[-1].Use = 0.6 iSynlista[-1].u0 = 0 iSynlista[-1].gmax = 0.001 iPreconlist.append(h.NetCon(iStimlist[-1], iSynlista[-1])) iPreconlist[-1].weight[0] = 1 iPreconlist[-1].delay = 0 def plot_figure_06_b_c(): startTime = time.time() h.tstop = 300 h.v_init = -70 h.dt = 0.025 delays = [0, 90, 100, 110, 120, 130] ampaCond = 0.008 gabaCond = 0.0015 seg = 0.9 secNames = [] secRins = [] for sec in h.L5PC.all: a = h.SectionRef(sec=sec) if (a.nchild() == 0) and ('dend' in sec.name()): im = h.Impedance() h("access " + sec.name()) im.loc(seg) im.compute(0) Ri = im.input(seg) if (Ri > 400): secNames.append(sec.name()) secRins.append(Ri) secRins, excitable_secs = zip(*sorted(zip(secRins, secNames))) num_of_branches = 16 sectionNum = "L5PC.soma[0]" no_zero = True excitable_secs = ['TTC[0].dend[82]', 'TTC[0].dend[69]', 'TTC[0].dend[80]', 'TTC[0].dend[66]', 'TTC[0].dend[10]', 'TTC[0].dend[66]', 'TTC[0].dend[82]', 'TTC[0].dend[66]', 'TTC[0].dend[37]', 'TTC[0].dend[54]', 'TTC[0].dend[31]', 'TTC[0].dend[72]', 'TTC[0].dend[54]', 'TTC[0].dend[49]', 'TTC[0].dend[76]', 'TTC[0].dend[13]'] for syn in eSynlist: syn.gmax = 0 del syn for syn in iSynlista: syn.gmax = 0 del syn for stim in iStimlist: del stim for sec in h.L5PC.all: h("nseg = 1") for sec in excitable_secs: h("access " + str(sec)) h("nseg = 10") placeNMDA(seg) placeGABA(seg) h.pop_section() voltageNpVec = {} soma_voltageNpVec = {} for delay in delays: inhibitionTiming = delay voltageVec = h.Vector() soma_voltageVec = h.Vector() timeVec = h.Vector() for syn in eSynlist: syn.gmax = ampaCond for syn in iSynlista: syn.gmax = gabaCond for stim in iStimlist: stim.start = inhibitionTiming voltageVec.record(eval("h." + excitable_secs[-14] + "(" + str(seg) + ")._ref_v")) soma_voltageVec.record(eval("h." + sectionNum + "(" + str(seg) + ")._ref_v")) timeVec.record(h._ref_t) h.init() h.run() soma_voltageNpVec[delay] = np.array(soma_voltageVec) voltageNpVec[delay] = np.array(voltageVec) print len(indexes(soma_voltageNpVec[delay], thres=np.abs(10 - np.min(soma_voltageNpVec[delay])) / (np.abs(np.max(soma_voltageNpVec[delay]) - np.min(soma_voltageNpVec[delay]))), min_dist=10)) len_orinial_spike_indices = len(indexes(soma_voltageNpVec[0], thres=np.abs(10 - np.min(soma_voltageNpVec[0])) / (np.abs(np.max(soma_voltageNpVec[0]) - np.min(soma_voltageNpVec[0]))), min_dist=10)) len_spike_indices = len(indexes(soma_voltageNpVec[120], thres=np.abs(10 - np.min(soma_voltageNpVec[120])) / (np.abs(np.max(soma_voltageNpVec[120]) - np.min(soma_voltageNpVec[120]))), min_dist=10)) if (len_spike_indices == 0 and len_orinial_spike_indices == 2): no_zero = False colors = {90: 'black', 100: 'green', 110 : 'brown', 120 : 'blue', 130 : 'red'} for delay in delays[1:]: fig = plt.figure(figsize=(4, 6), frameon = False) ax = plt.Axes(fig, [0., 0., 1., 1.], ) fig.add_axes(ax) ax.plot(timeVec, soma_voltageNpVec[delay], linewidth = 0.75, color='black'); ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['left'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom') ax.axis([80, 200, -90, 60]) ax.set_xticks([]) ax.set_yticks([]) if (delay == 130): ax.plot([150, 170],[-18, -18],linewidth=0.75,color='black') ax.plot([170, 170],[-18, 2],linewidth=0.75,color='black') ax.text(148, -44, "20 msec", fontsize = 8) ax.text(173, -16, "20 mV", fontsize = 8) fig.set_size_inches(0.6, 0.6) fig.savefig('figure_06_b_%d.pdf' % (delay), transparent=True, bbox_inches='tight', format='pdf', dpi=3000, pad_inches=0) plt.show(block = 0) for delay in delays[1:]: fig = plt.figure(figsize=(4, 6), frameon = False) ax = plt.Axes(fig, [0., 0., 1., 1.], ) fig.add_axes(ax) ax.plot([delay, delay],[voltageNpVec[0][delay / 0.025], 0],linewidth=0.5,color='black',linestyle=':') ax.plot(timeVec, voltageNpVec[delay], linewidth = 0.75, color='green'); ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['left'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom') ax.axis([80, 200, -90, 30]) ax.set_xticks([]) ax.set_yticks([]) if (delay == 130): ax.plot([150, 170],[-18, -18],linewidth=0.75,color='black') ax.plot([170, 170],[-18, 2],linewidth=0.75,color='black') ax.text(148, -44, "20 msec", fontsize = 8) ax.text(173, -16, "20 mV", fontsize = 8) plt.text(delay - 14, 20, '%d msec' % (delay - 100), color='green', fontsize = 8) ax.arrow(delay, 10, 0, -10, head_width=1.25, width=0.75, head_length=0.75, fc='green', ec='green') fig.set_size_inches(0.6, 0.6) fig.savefig('figure_06_c_%d.pdf' % (delay), transparent=True, bbox_inches='tight', format='pdf', dpi=3000, pad_inches=0) # plt.close('all') def plot_figure_06_d(): eps = np.finfo(float).eps (avg, std) = pickle.load(open('spikes_num.pickle', 'rb')) delays = [0] + range(90, 161, 1) fig = plt.figure(figsize=(1.7,1.7)) ax = plt.Axes(fig, [0., 0., 1., 1.], ) fig.add_axes(ax) ax.plot([delays[1], delays[-1]], [avg[0],avg[0]], linewidth = 1, color="black", linestyle='--', dashes=(3,3)); ax.plot(delays[1:], avg[1:], linewidth = 1, color="black"); ax.plot(delays[1:], avg[1:] + std[1:], linewidth = 1, color="green"); ax.plot(delays[1:], avg[1:] - std[1:], linewidth = 1, color="green"); ax.fill_between(delays[1:], avg[1:] + std[1:], avg[1:] - std[1:],facecolor='green', alpha=0.2) ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['left'].set_linewidth(1) ax.spines['bottom'].set_linewidth(1) ax.tick_params(direction='out', width=1, size=5) ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom') ax.set_xlabel(r'${\Delta t}$ Inhibition vs excitation (msec)', fontsize = 10, fontweight = 'regular') ax.set_ylabel('Number of spikes', fontsize = 10, fontweight = 'regular') ax.axis([90, 160, -0.1, 3.25], fontsize = 24) kwargs = dict(linewidth = 1, transform=ax.transAxes, color='k', clip_on=False) ax.xaxis.set_ticks([100, 120, 140, 160]) ax.xaxis.set_ticklabels([0, 20, 40, 60], fontsize=8) ax.yaxis.set_ticks([0,1,2,3]) ax.yaxis.set_ticklabels([0,1,2,3], fontsize=8) plt.subplots_adjust(hspace = 0.1) fig.set_size_inches(1.5, 1.5) fig.savefig('figure_06_d.pdf', transparent=True, bbox_inches='tight', format='pdf', dpi=300, pad_inches=0) h.load_file("nrngui.hoc") h.load_file("import3d.hoc") h.load_file("L5PCbiophys3.hoc") h.load_file("TTC.hoc") h("objref L5PC") h("celsius = 34.5") h.L5PC = h.TTC("cell1.asc") h("forall nseg = 1") h("forall vo = 1") h("objref eSynlist, ePreconlist, iPreconlist, eStimlist, iStimlist, iSynlista, voltageClamp, resistanceVector") plot_figure_06_b_c() plot_figure_06_d()