Concentration dependent nonlinear K+ and Cl- leak current (Huang et al. 2015)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:195569
"In their seminal works on squid giant axons, Hodgkin, and Huxley approximated the membrane leak current as Ohmic, i.e., linear, since in their preparation, sub-threshold current rectification due to the influence of ionic concentration is negligible. Most studies on mammalian neurons have made the same, largely untested, assumption. Here we show that the membrane time constant and input resistance of mammalian neurons (when other major voltage-sensitive and ligand-gated ionic currents are discounted) varies non-linearly with membrane voltage, following the prediction of a Goldman-Hodgkin-Katz-based passive membrane model. ..." (see paper for details and more).
Reference:
1 . Huang S, Hong S, De Schutter E (2015) Corrigendum: Non-linear leak currents affect mammalian neuron physiology. Front Cell Neurosci 9:475 [PubMed]
2 . Huang S, Hong S, De Schutter E (2015) Non-linear leak currents affect mammalian neuron physiology. Front Cell Neurosci 9:432 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type:
Brain Region(s)/Organism:
Cell Type(s): Cerebellum Purkinje GABA cell; Hodgkin-Huxley neuron;
Channel(s): I K,leak; I Cl, leak;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; Python;
Model Concept(s):
Implementer(s): Huang, Shiwei [shiweihuang at outlook.com]; Hong, Sungho [shhong at oist.jp];
Search NeuronDB for information about:  Cerebellum Purkinje GABA cell; I K,leak; I Cl, leak;
/
HuangEtAl2015
readme.html
kcl.mod
fig2a_run.py
fig2a_show.py
mosinit.py
screenshot.png
                            
"""

fig2a_run.py

Run simulation for Fig. 2A in Huang S, Hong S, and De Schutter E. 2015. Non-linear leak currents affect mammalian neuron physiology. Front Cell Neurosci 9: 4602-10.

Written by Shiwei Huang, Computational Neuroscience Unit, OIST, 2015

"""


import neuron
from neuron import h
from numpy import *
import pickle
import time
import os

os.makedirs('data')

cvode = h.CVode() ; cvode_is_active = cvode.active(1)
MEMBRANERESIST = 120000. #float
AXIALRESIST    = 140.
MEMBRANECAP    = 0.8
h.celsius      = 34
tstop          = 1

soma = h.Section();
for sec in [soma]:
    sec.diam = 262.6117
    sec.L    = 262.6117
    sec.cm   = MEMBRANECAP
    sec.Ra   = AXIALRESIST


# MEMBRANE PROPERTIES
section_count = 0
for i, sec in enumerate(h.allsec()):
    sec.cm   = MEMBRANECAP
    sec.Ra   = AXIALRESIST

    sec.insert("kcl")
    sec.gsum_kcl = 1/MEMBRANERESIST
    sec.veq_kcl  = -85
    sec.cli = 10
    sec.clo = 130
    sec.ki  = 150
    sec.ko  = 2.5
    sec.nai = 10
    sec.nao = 150

    sec.insert("pas")
    sec.e_pas = -85
    sec.g_pas = 0

    section_count = i

#for multicompartmental model only
spine_dens = 13
spine_area = 1.33
def spinecomp(sec): #thin dendrite corrections
    a = 0
    maxdiam = 0
    for seg in sec.allseg():
	    if (seg.diam > maxdiam):
	        maxdiam = seg.diam
    if (maxdiam <= 3.17):
        a = 0
        for seg in sec.allseg():
            zeta = h.area(seg.x)
            a = a + zeta
        F = (sec.L * spine_area * spine_dens + a)/a
    else:
        F = 1

    return F
#

def get_index(np_array, curr_element):
    for i, val in enumerate(np_array):
        if(val >= curr_element):
            return i-1
            break


def get_params(section):
    """ returns a dictionary containing useful section parameters."""
    vector = {}
    vector['diam'] = section.diam
    vector['L']    = section.L
    vector['Ra']   = section.Ra
    vector['cm']   = section.cm
    vector['ek']   = round(section.ek,2)
    vector['ecl']  = round(section.ecl,2)
    vector['ena']  = round(section.ena,2)
    vector['ko']   = round(section.ko,1)
    vector['ki']   = round(section.ki,1)
    vector['clo']  = round(section.clo,1)
    vector['cli']  = round(section.cli,1)
    vector['nao']  = round(section.nao,1)
    vector['nai']  = round(section.nai,1)

    return vector

def get_iclamp(section, init_mV, holding_i, stepping_i):
    ichold       = h.IClamp(0.5, sec=section)
    ichold.delay = 2000
    ichold.dur   = 100000
    ichold.amp   = holding_i
    icstep       = h.IClamp(0.5, sec=section)
    icstep.delay = 4000
    icstep.dur   = 2000
    icstep.amp   = stepping_i

    hocvec = {}
    for var in 't', 'v', 'icl', 'ik':
        hocvec[var] = h.Vector()
    hocvec['t'].record(h._ref_t)
    hocvec['v'].record(section(0.5)._ref_v)
    hocvec['icl'].record(section(0.5)._ref_icl_kcl)
    hocvec['ik'].record(section(0.5)._ref_ik_kcl)

    h.finitialize(init_mV)
    TSTOP = icstep.delay + icstep.dur + 1000
    neuron.run(TSTOP)

    return hocvec

#generate parameter set
EKCL   = array([-85])
CONC   = linspace(10, 10, 1) #intracellular Cl concentration
IHOLD = linspace(-0.5, 2, 51)
ISTEP = linspace(-0.06, 0.06, 9)
param_set = []
for a in EKCL:
    for b in CONC:
        for c in IHOLD:
            for d in ISTEP:
                line = array([a,b,c,d])
                param_set.append(line)


# PARALLEL RUN
pc = h.ParallelContext();
myid = int(pc.id());
np = int(pc.nhost());
n = len(param_set)

for i in range(myid,n,np):
    print 'myid: ' + str(myid)+':'+str(i); pctime = str(time.time())[5:-3]

    for sec in h.allsec():
        sec.veq_kcl = param_set[i][0]
        sec.e_pas   = param_set[i][0]
        sec.cli     = param_set[i][1]
    h.finitialize(soma.veq_kcl);

    for sec in h.allsec():
        sec.g_pas = 0
        sec.gsum_kcl = 1/MEMBRANERESIST

    #Save useful GHK model parameters
    h.finitialize(soma.veq_kcl);
    vector = get_params(soma)
    vector['gsum_kcl']   = soma.gsum_kcl
    vector['Pratio_kcl'] = round(soma.Pratio_kcl, 3)
    vector['veq_kcl']    = soma.veq_kcl
    vector['e']          = soma.veq_kcl
    vector['IHOLD'] = param_set[i][2]
    vector['ISTEP'] = param_set[i][3]

    hvec_d = get_iclamp(soma, soma.veq_kcl, vector['IHOLD'], vector['ISTEP'])
    for key in hvec_d:
	    vector[key] = array( hvec_d[key] );

    #repeat simulation with ohmic leak current
    for sec in h.allsec():
        sec.gsum_kcl = 0
        sec.g_pas = 1/MEMBRANERESIST

    # save useful ohmic model paramters
    h.finitialize(soma.e_pas)
    vector2  = get_params(soma)
    vector2['g_pas']  = soma.g_pas
    vector2['e_pas']  = round(soma.e_pas, 2)
    vector2['e']      = round(soma.e_pas, 2)
    vector2['IHOLD'] = vector['IHOLD']
    vector2['ISTEP'] = vector['ISTEP']

    hvec_d2 = get_iclamp(soma, soma.e_pas, vector2['IHOLD'], vector2['ISTEP'])
    for key in hvec_d2:
        vector2[key] = array( hvec_d[key] )

    fname='Pr_%g_ecl_%g_CONC_%g_EL_%g_IHOLD_%g_ISTEP_%g.pkl' \
	  % (vector['Pratio_kcl'], vector['ecl'], vector['cli'], vector['veq_kcl'], \
	     vector['IHOLD'], vector['ISTEP'])
    fname = os.path.join('data', fname)
    pklfile  = open(fname, 'wb')
    pickle.dump(vector, pklfile)
    pickle.dump(vector2, pklfile)
    pklfile.close()

    vector  = None
    vector2 = None
pc.done();