The subcellular distribution of T-type Ca2+ channels in LGN interneurons (Allken et al. 2014)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:156039
" ...To study the relationship between the (Ca2+ channel) T-distribution and several (LGN interneuron) IN response properties, we here run a series of simulations where we vary the T-distribution in a multicompartmental IN model with a realistic morphology. We find that the somatic response to somatic current injection is facilitated by a high T-channel density in the soma-region. Conversely, a high T-channel density in the distal dendritic region is found to facilitate dendritic signalling in both the outward direction (increases the response in distal dendrites to somatic input) and the inward direction (the soma responds stronger to distal synaptic input). ..."
Reference:
1 . Allken V, Chepkoech JL, Einevoll GT, Halnes G (2014) The subcellular distribution of T-type Ca2+ channels in interneurons of the lateral geniculate nucleus. PLoS One 9:e107780 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism: Thalamus;
Cell Type(s): Thalamus lateral geniculate nucleus interneuron;
Channel(s): I L high threshold; I T low threshold; I h; I K,Ca; I CAN; I_AHP;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Dendritic Action Potentials; Active Dendrites; Conductance distributions;
Implementer(s): Allken, Vaneeda [vaneeda at gmail.com];
Search NeuronDB for information about:  I L high threshold; I T low threshold; I h; I K,Ca; I CAN; I_AHP;
from scipy.stats import norm
from neuron import h, load_mechanisms
from numpy import trapz
cvode = h.CVode()
cvode.active(1)
cvode.maxstep(0.2)
h.load_file('stdlib.hoc')
import pylab
pylab.interactive(1) 
import matplotlib.cm as cm
celsius = 36.0 # temperature
Epas = -69

## SELECT MORPHOLOGY
h("forall delete_section()")
h("sec_counted=0")
h.load_file(1,"Morf_default.hoc") # Default, from Halnes2011
h.load_file(1,"fixnseg.hoc") # Segmentize (technicality)

#################################################################
## CaT DISTRIBUTION. (Tdist)
dist = {0:'Null', 1: 'Soma', 2 : 'Proximal', 3 : 'Uniform', 4: 'Middle', 5 : 'Linear',  6:'Distal', 7: 'Halnes'} 
colour = {'Null':'k','Soma':'r', 'Proximal':'y','Uniform': 'b', 'Middle':'c', 'Linear': 'g', 'Distal':'m'}

Tdist = 3 # Choose distribution number between 0 and 7

##################################################################
### Current stimulus
# Choose type of signal input:
# 1 for 1000 ms weak input signal; 2 for 10 ms strong pulse; 3 for synaptic input
input_cond = 1 # Must be 1, 2 or 3

# den is only used when input_cond == 3
den = 99 # Section at which synaptic input is injected (distalmost dendrite): 

if (input_cond == 1):
    dur = 1000
    istim = 0.036
    gna = 0.18
    dsynweight = 0 #0.07341 #0.001 #  Distal synapses, weight (muS)

elif (input_cond == 2):
    dur = 10
    istim = 0.25
    gna = 0.18
    dsynweight = 0 #0.07341 #0.001 #  Distal synapses, weight (muS)
     
elif (input_cond == 3):
    dur = 0
    istim = 0
    gna = 0.18
    dsynweight = 0.002 #0.07341 #0.001 #  Distal synapses, weight (muS)   

else:
    print("Input condition must be 1, 2 or 3")
                  
######################################################################
def test(Tdist,dur,gna,istim,dsynweight):
    global den
    rall = 113 # most people find something like this
    cap = 1.1
    Rm = 45000.0
    Vrest = - 69

    # Channel densities & shifts
    # gna = 0.15
    nash = - 50.5 #-51.3 #-50.3 
    gkdr = 0.4
    kdrsh = - 49.3
    gahp = 0 #0.00013
    gcat = 8.5e-6
    gcal = 0 #0.0013
    ghbar = 0 #5e-6 
    catau = 50
    gcanbar = 0 #1e-7
    
    # Channel distribution
    Nadendfac = 0.035
    Kdendfac =  0.015
    ihdendfac = 1
    ldendfac = 0.25
    iahpdendfac = 0.1
    itinc = 2.39/60
    icaninc = itinc

    ###################################################################
    ## INSERT STIMULATION ELECTRODES
    stim = h.IClamp(.5)
    stim.delay = 1000
    stim.dur = dur
    stim.amp = istim

    ###################################################################
    ## INSERT ION CHANNELS:
    for sec in h.allsec():
        sec.insert("pas")
        sec.e_pas = Vrest
        sec.g_pas = 1/Rm
        sec.Ra = rall
        sec.cm = cap
        sec.insert("iar")
        sec.ghbar_iar = ghbar * ihdendfac
        sec.insert("Cad")
        sec.insert("ical")
        sec.insert("it2")
        sec.insert("iahp")
        sec.insert("hh2")
        sec.ena = 50
        sec.ek = -90
        sec.insert("ican")
     
     ##################################################################
    ## INSERT SYNAPSES    
    syn = h.Exp2Syn(h.dend[den](1)) # Sum of exp's
    syn.tau1 = 0.5 # Rise
    syn.tau2 = 2 # Decay
    syn.e = 10 # Reversal # pot.
              
    s = h.NetStim(0.5)
    s.start = 1000  # start for distal synapses
    s.number = 1
    s.noise = 0    
    
    nc = h.NetCon(s,syn,sec = sec)       
    nc.weight[0] = dsynweight

    #################################################################
    # for sec in h.soma:
    freq = 50
    h.geom_nseg(freq)
    tot = 0
    for sec in h.allsec():
        tot += sec.nseg
    h.distance()
    print("total # of segments (50Hz):", tot)      
              
    ##################################################################
    # INITIALIZE
    def initialize(Tchoice):
        global Epas
        h.celsius = celsius
        for sec in h.soma:
            h.distance()    
   
        for sec in h.allsec():
            sec.v = Vrest
            sec.e_pas = Epas
    
            sec.insert("pas")
            sec.e_pas = Epas
            sec.g_pas = 1/Rm
            sec.Ra = rall
            sec.cm = cap

        for sec in h.allsec():
            sec.gnabar_hh2 = gna * Nadendfac
            sec.vtraubNa_hh2 = nash  
            sec.gkbar_hh2 = gkdr * Kdendfac
            sec.vtraubK_hh2 = kdrsh
            sec.pcabar_ical = gcal * ldendfac
            sec.gkbar_iahp = gahp * iahpdendfac
            sec.ghbar_iar = ghbar * ihdendfac

        for sec in h.soma:
            sec.gnabar_hh2 = gna 
            sec.vtraubNa_hh2 = nash
            sec.gkbar_hh2 = gkdr
            sec.vtraubK_hh2 = kdrsh
            sec.pcabar_ical = gcal
            sec.gkbar_iahp = gahp
            sec.ghbar_iar = ghbar       
# Insert CaT
            sec.gcabar_it2 = gcat
            sec.gbar_ican = gcanbar            
            
        if (Tchoice == 7):  # Halnes
            Epas = -70.61
            for sec in h.allsec():
                sec.gcabar_it2 = gcat * (1 + itinc * h.distance(1))
                sec.gbar_ican = gcanbar * (1 + itinc * h.distance(1))
                
            for sec in h.soma:
                sec.gcabar_it2 = gcat
                sec.gbar_ican = gcanbar   
                  
        elif (Tchoice == 5): # Linear
              Epas = -70.6
              for sec in h.allsec():
                  for seg in sec:
                      seg.gcabar_it2 = gcat * (1 + itinc * (h.distance(0) + sec.L * seg.x)) 
                      seg.gbar_ican = gcanbar * (1 + itinc * (h.distance(0) + sec.L * seg.x))
      
        elif (Tchoice == 3): # Uniform
              Epas = -70.66
              for sec in h.allsec():        
                  sec.gcabar_it2 = gcat
                  sec.gbar_ican = gcanbar
                                              
        elif (Tchoice == 2): # Proximal
              Epas = -70.77
              mu = 60 # 
              sigma = 41 # Chosen to match data (Munsch et al, 1997) for 1st 60 micrometres.

              for sec in h.allsec():
                  for seg in sec:
                      d = h.distance(0) + sec.L * seg.x 
                      seg.gcabar_it2 = gcat * norm.pdf(d,mu,sigma)
                      seg.gbar_ican = gcanbar * norm.pdf(d,mu,sigma)
                      
        elif (Tchoice == 6): # Distal
              Epas = -70.72
              mu = 660 # 
              sigma = 120 #

              for sec in h.allsec():
                  for seg in sec:
                      d = h.distance(0) + sec.L * seg.x 
                      seg.gcabar_it2 = gcat * norm.pdf(d,mu,sigma)
                      seg.gbar_ican = gcanbar * norm.pdf(d,mu,sigma)              
                      
        elif (Tchoice == 4): # Middle
              Epas = -70.64
              mu = 300 # 
              sigma = 80 #

              for sec in h.allsec():
                  for seg in sec:
                      d = h.distance(0) + sec.L * seg.x 
                      seg.gcabar_it2 = gcat * norm.pdf(d,mu,sigma)
                      seg.gbar_ican = gcanbar * norm.pdf(d,mu,sigma) 
        
        elif (Tchoice == 0): # Null
              Epas = -69 
              for sec in h.allsec():
                  sec.gcabar_it2 = 0
                  sec.gbar_ican = 0                                                         
                                                                               
        elif (Tchoice == 1): # Soma
              Epas = -70.82   
              for sec in h.dend:
                  sec.gcabar_it2 = 0
                  sec.gbar_ican = 0    
        
        for sec in h.allsec():
            sec.taur_Cad = catau
           
        h.finitialize(Vrest)       
        h.fcurrent()     
        cvode.re_init()
    
    ###################################################################
    # Separate function that determines gcat
    def tcount():
        GCATOT = 0
        for sec in h.allsec():
            for seg in sec:    
                GCATOT += seg.gcabar_it2 * h.area(seg.x)  
        return GCATOT    
    
    ##################################################################
    # NORMALIZE g_CaT
    # Aim: Have the tot. # of T-channels as in Halnes et al. 2011 regardless dist. chosen.  
    initialize(7)    
    GCATOT7 = tcount()   
    print('GCATOT7', GCATOT7)
    initialize(Tdist)
    GCATOTX = tcount()
    print('GCATOTX', GCATOTX)
    if (Tdist !=0):
        gcat *=  GCATOT7/GCATOTX

    initialize(Tdist)

    print("gcat =", gcat)
    print("stim.amp=",stim.amp)

    ##################################################################
    vec ={}
    for var in 't', 'd_sec', 'd_seg', 'diam_sec','gc','diam_seg','stim_curr':
        vec[var] = h.Vector()
        
    for var in 'V_sec', 'V_seg', 'CaConc_sec','CaConc_seg':
        vec[var] = h.List()
    
    def create_lists(vec):        
        for sec in h.allsec():
            vec['d_sec'].append(h.distance(1))
            vec['diam_sec'].append(sec.diam)  
            rec0 = h.Vector()
            rec0.record(sec(0.5)._ref_v)         
            vec['V_sec'].append(rec0)
            rec_Ca = h.Vector()
            rec_Ca.record(sec(0.5)._ref_Cai)
            vec['CaConc_sec'].append(rec_Ca)        
            for seg in sec: 
                vec['d_seg'].append(h.distance(0) + sec.L * seg.x)
                vec['diam_seg'].append(seg.diam)
                vec['gc'].append(seg.gcabar_it2)   
                rec = h.Vector()
                rec.record(seg._ref_v)
                vec['V_seg'].append(rec)
                rec1 = h.Vector()
                rec1.record(seg._ref_Cai)
                vec['CaConc_seg'].append(rec1)                                   
        return vec
    
    #####################################    	
    create_lists(vec)       
    # run the simulation
    
    vec['t'].record(h._ref_t)
    # vec['current'].record(VC_patch._ref_i)
    vec['stim_curr'].record(stim._ref_i)
    h.load_file("stdrun.hoc")               
    h.tstop = 2500  # Simulation time
    h.t = -500
    h.run()
    return vec            

vec = test(Tdist,dur,gna,istim,dsynweight)

print("Dist #", Tdist,":",dist[Tdist], "; Epas =", Epas)

t = vec['t'].to_python()
d_seg = vec['d_seg'].to_python()
d_sec = vec['d_sec'].to_python()
gc = vec['gc'].to_python()
V_soma = vec['V_sec'][0].to_python()
CaConc_soma = vec['CaConc_sec'][0].to_python()
stim_curr = vec['stim_curr'].to_python()

# ########################################################################
## Plotting propagation of voltage signal 
fig = pylab.figure()

ax1 = fig.add_subplot(4, 1, 1)
ax1.set_title(dist[Tdist])
ax1.text(-0.025, 1.025, 'A',horizontalalignment='center',verticalalignment='bottom',fontsize=18, fontweight='demibold',
transform=ax1.transAxes)

ax2 = fig.add_subplot(4, 1, 2, sharex=ax1, sharey=ax1, ylabel='Voltage(mV)')
ax2.text(-0.025, 1.025, 'B',horizontalalignment='center',verticalalignment='bottom',fontsize=18, fontweight='demibold',
transform=ax2.transAxes)

ax3 = fig.add_subplot(4, 1, 3, sharex=ax1, sharey=ax1)
ax3.text(-0.025, 1.025, 'C',horizontalalignment='center',verticalalignment='bottom',fontsize=18, fontweight='demibold',
transform=ax3.transAxes)

ax4 = fig.add_subplot(4, 1, 4, sharex=ax1, sharey=ax1)
ax4.text(-0.025, 1.025, 'D',horizontalalignment='center',verticalalignment='bottom',fontsize=18, fontweight='demibold',
transform=ax4.transAxes)

ax1.plot(vec['t'], vec['V_sec'][0],color=colour[dist[Tdist]], label = 'At soma') 
ax2.plot(vec['t'], vec['V_sec'][83],color=colour[dist[Tdist]], label = '%1.1f $\mu$m' % d_sec[83]) 
ax3.plot(vec['t'], vec['V_sec'][88],color=colour[dist[Tdist]], label = '%1.1f $\mu$m' % d_sec[88])
ax4.plot(vec['t'], vec['V_sec'][99],color=colour[dist[Tdist]], label = '%1.1f $\mu$m' % d_sec[99]) 
try:
    ax1.legend(loc='best',frameon=False, fontsize=13)
    ax2.legend(loc='best',frameon=False, fontsize=13)
    ax3.legend(loc='best',frameon=False, fontsize=13)
    ax4.legend(loc='best',frameon=False, fontsize=13)
except:
    # no fontsize in older version of matplotlib
    ax1.legend(loc='best',frameon=False)
    ax2.legend(loc='best',frameon=False)
    ax3.legend(loc='best',frameon=False)
    ax4.legend(loc='best',frameon=False)

pylab.setp([a.set_xlabel('') for a in [ax1,ax2,ax3]], visible=False) 
pylab.setp([a.get_xticklabels() for a in [ax1,ax2,ax3]], visible=False)