def biexp_current(input, tau1, tau2, current_name=None, unit=amp): ''' Biexponential synaptic current. current_name = name of current variable ''' current_name = current_name or unique_id() current = Current() + biexp_synapse(input, tau1, tau2, unit, current_name) current.set_current_name(current_name) return current
def alpha_current(input, tau, current_name=None, unit=amp): ''' Alpha synaptic current. current_name = name of current variable ''' current_name = current_name or unique_id() current = Current() + alpha_synapse(input, tau, unit, current_name) current.set_current_name(current_name) return current
def exp_current(input, tau, current_name=None, unit=amp): ''' Exponential synaptic current. input = name of input variable (where presynaptic spikes act). current_name = name of current variable ''' current_name = current_name or unique_id() current = Current() + exp_synapse(input, tau, unit, current_name) current.set_current_name(current_name) return current
def alpha_conductance(input, E, tau, conductance_name=None, unit=siemens): ''' Alpha synaptic conductance. conductance_name = name of conductance variable E = synaptic reversal potential ''' conductance_name = conductance_name or unique_id() return Current('I=g*(E-vm): amp', I=input + '_current', g=conductance_name, E=E) + \ alpha_synapse(input, tau, unit, conductance_name)
def K_current_int(gmax, EK, current_name=None): return Current(''' I=gmax*n**4*(EK-vm) : amp dn/dt=alphan*(1-n)-betan*n : 1 alphan=.05*(vm+34.*mV)/(1-exp(-(vm+34.*mV)/(10.*mV)))/mV/ms : Hz betan=.625*exp(-(vm+44.*mV)/(80.*mV))/ms : Hz ''', gmax=gmax, EK=EK, I=current_name)
def K_current_HH(gmax, EK, current_name=None): ''' Hodkin-Huxley K+ current. Resting potential is 0 mV. ''' current_name = current_name or unique_id() return Current(''' I=gmax*n**4*(EK-vm) : amp dn/dt=alphan*(1-n)-betan*n : 1 alphan=.01*(10*mV-vm)/(exp(1-.1*vm/mV)-1)/mV/ms : Hz betan=.125*exp(-.0125*vm/mV)/ms : Hz ''', gmax=gmax, EK=EK, I=current_name, current_name=current_name)
def Na_current_int(gmax, ENa, current_name=None): return Current(''' I=gmax/((1+betam/alpham)**3)*h*(ENa-vm) : amp dh/dt=alphah*(1-h)-betah*h : 1 alpham=.5*(vm+35.*mV)/(1-exp(-(vm+35.*mV)/(10.*mV)))/mV/ms : Hz betam=20.*exp(-(vm+60.*mV)/(18.*mV))/ms : Hz alphah=.35*exp(-(vm+58.*mV)/(20.*mV))/ms : Hz betah=5./(1.+exp(-(vm+28.*mV)/(10.*mV)))/ms : Hz ''', gmax=gmax, ENa=ENa, I=current_name)
def Na_current_HH(gmax, ENa, current_name=None): ''' Hodkin-Huxley Na+ current. ''' current_name = current_name or unique_id() return Current(''' I=gmax*m**3*h*(ENa-vm) : amp dm/dt=alpham*(1-m)-betam*m : 1 dh/dt=alphah*(1-h)-betah*h : 1 alpham=.1*(25*mV-vm)/(exp(2.5-.1*vm/mV)-1)/mV/ms : Hz betam=4*exp(-.0556*vm/mV)/ms : Hz alphah=.07*exp(-.05*vm/mV)/ms : Hz betah=1./(1+exp(3.-.1*vm/mV))/ms : Hz ''', gmax=gmax, ENa=ENa, I=current_name, current_name=current_name)
def leak_current(gl, El, current_name=None): ''' Leak current: gl*(El-vm) ''' current_name = current_name or unique_id() return Current('I=gl*(El-vm) : amp', gl=gl, El=El, I=current_name, current_name=current_name)
def __init__(self, params=default_params, pyr_params=pyr_params(), inh_params=inh_params(), plasticity_params=plasticity_params(), background_input=None, task_inputs=None, clock=defaultclock): self.params = params self.pyr_params = pyr_params self.inh_params = inh_params self.plasticity_params = plasticity_params self.background_input = background_input self.task_inputs = task_inputs ## Set up equations # Exponential integrate-and-fire neuron eqs = exp_IF(params.C, params.gL, params.EL, params.VT, params.DeltaT) eqs += Equations('g_muscimol : nS') # AMPA conductance - recurrent input current eqs += exp_synapse('g_ampa_r', params.tau_ampa, siemens) eqs += Current('I_ampa_r=g_ampa_r*(E-vm): amp', E=params.E_ampa) # AMPA conductance - background input current eqs += exp_synapse('g_ampa_b', params.tau_ampa, siemens) eqs += Current('I_ampa_b=g_ampa_b*(E-vm): amp', E=params.E_ampa) # AMPA conductance - task input current eqs += exp_synapse('g_ampa_x', params.tau_ampa, siemens) eqs += Current('I_ampa_x=g_ampa_x*(E-vm): amp', E=params.E_ampa) # Voltage-dependent NMDA conductance eqs += biexp_synapse('g_nmda', params.tau1_nmda, params.tau2_nmda, siemens) eqs += Equations('g_V = 1/(1+(Mg/3.57)*exp(-0.062 *vm/mV)) : 1 ', Mg=params.Mg) eqs += Current('I_nmda=g_V*g_nmda*(E-vm): amp', E=params.E_nmda) # GABA-A conductance eqs += exp_synapse('g_gaba_a', params.tau_gaba_a, siemens) eqs += Current('I_gaba_a=(g_gaba_a+g_muscimol)*(E-vm): amp', E=params.E_gaba_a) eqs += InjectedCurrent('I_dcs: amp') # Total synaptic conductance eqs += Equations( 'g_syn=g_ampa_r+g_ampa_x+g_ampa_b+g_V*g_nmda+g_gaba_a : siemens') eqs += Equations( 'g_syn_exc=g_ampa_r+g_ampa_x+g_ampa_b+g_V*g_nmda : siemens') # Total synaptic current eqs += Equations( 'I_abs=(I_ampa_r**2)**.5+(I_ampa_b**2)**.5+(I_ampa_x**2)**.5+(I_nmda**2)**.5+(I_gaba_a**2)**.5 : amp' ) NeuronGroup.__init__(self, params.network_group_size, model=eqs, threshold=-20 * mV, refractory=1 * ms, reset=params.Vr, compile=True, freeze=True, clock=clock) self.init_subpopulations() self.init_connectivity(clock)
def leak_current_int(gl, El, current_name=None): return Current('I=gl*(El-vm) : amp', gl=gl, El=El, I=current_name)
betah=5./(1.+exp(-(vm+28.*mV)/(10.*mV)))/ms : Hz ''', gmax=gmax, ENa=ENa, I=current_name) c = Clock(dt=.01 * ms) # more precise El = -65 * mV EK = -90 * mV ENa = 55 * mV eqs = MembraneEquation(0.01 * uF) + leak_current_int( .003 * msiemens, El, current_name='Il') eqs += K_current_int(0.36 * msiemens, EK, current_name='IK') eqs += Na_current_int(1.20 * msiemens, ENa) eqs += Current(I='Iapp:amp') neuron = NeuronGroup(1, eqs) neuron.h = 1. neuron.n = .1 neuron.vm = -64 * mV trace = StateMonitor(neuron, 'vm', record=True) run(100 * ms) neuron.Iapp = 0. run(100 * ms) print trace[0] / mV plot(trace.times / ms, trace[0] / mV)