import sys
from pyinit import *
from labels import *
from math import exp
h.celsius = 37
h.load_file("pywrap.hoc")
from conf import *
# determine config file name
def setfcfg ():
fcfg = "netcfg.cfg" # default config file name
for i in xrange(len(sys.argv)):
if sys.argv[i].endswith(".cfg") and os.path.exists(sys.argv[i]):
fcfg = sys.argv[i]
return fcfg
fcfg=setfcfg() # config file name
dconf = readconf(fcfg)
taurcada = dconf['taurcada']
h.cac_hcnwino = 0.006
h.k4_hcnwino = dconf['iark4']
ihginc = h.ginc_hcnwino = dconf['ihginc'];
recdt = dconf['recdt']
recvdt = dconf['recvdt']
erevh = dconf['erevh']
spaceum = dconf['spaceum']
h_lambda = dconf['h_lambda']
h_gbar = dconf['h_gbar'] # for E cells
fs_h_gbar = dconf['fs_h_gbar'] #
lts_h_gbar = dconf['lts_h_gbar'] #
cagk_gbar = dconf['cagk_gbar'] #
ikc_gkbar = dconf['ikc_gkbar'] #
cabar = dconf['cabar'] # used for E cells
lts_cabar = dconf['lts_cabar']
tau1NMDAEE=15; tau2NMDAEE=150;
tau1NMDAEI=15; tau2NMDAEI=150;
nax_gbar = dconf['nax_gbar']
kdr_gbar = dconf['kdr_gbar']
kap_gbar = dconf['kap_gbar']
kdmc_gbar = dconf['kdmc_gbar']
km_gmax = dconf['km_gmax']
##
from syn import *
# if rdt > 0 use fixed interval for recording, else let cvode determine it
def saferecord (var, rdt):
if rdt > 0.0:
vrec = h.Vector(h.tstop/rdt + 1)
vrec.record(var,rdt)
else:
vrec = h.Vector()
vrec.record(var)
return vrec
###############################################################################
# General Cell
###############################################################################
class Cell:
"General cell"
def __init__ (self,x,y,z,ID,ty):
self.x=x
self.y=y
self.z=z
self.ID=ID
self.ty = ty
self.snames = [] # list of section names
self.all_sec = []
self.add_comp('soma',True)
self.set_morphology()
self.set_conductances()
self.set_synapses()
self.set_inj()
# get number of outgoing connections
def set_morphology (self): pass
def set_conductances (self): pass
def set_synapses (self): pass
def set_inj (self): self.somaInj = h.IClamp(0.5, sec=self.soma)
def add_comp (self, name, rec):
self.snames.append( name )
self.__dict__[name] = h.Section()
self.all_sec.append(self.__dict__[name])
if rec: # Record voltage
self.__dict__[name+"_volt"] = saferecord(self.__dict__[name](0.5)._ref_v, recvdt)
self.__dict__[name+"_volt"].label(name+"_volt")
###############################################################################
# Soma-targeting interneuron (fast-spiking Basket Cell -- Bas)
###############################################################################
class Bas (Cell):
"Basket cell"
def set_morphology(self):
total_area = 10000 # um2
self.soma.nseg = 1
self.soma.cm = 1 # uF/cm2
diam = sqrt(total_area) # um
L = diam/pi # um
h.pt3dclear(sec=self.soma)
h.pt3dadd(self.x, self.y, self.z, diam, sec=self.soma)
h.pt3dadd(self.x, self.y, self.z+L, diam, sec=self.soma)
def set_conductances(self): # Bas
cap = 1.0
rall = 150.0
rm = 10e3
Vrest = -79.8
p_ek = -85.0
p_ena = 55.0
sh_nax = 0.0
sec = self.soma
sec.insert('k_ion')
sec.insert('na_ion')
#sec.insert('ca_ion')
sec.insert('pas') # passive
sec.insert('nax') # Na current
sec.insert('kdr') # K delayed rectifier current
# erev
sec.ek = p_ek # K+ current reversal potential (mV)
sec.ena = p_ena # Na+ current reversal potential (mV)
# passive
sec.g_pas = 1.0/rm
sec.Ra = rall
sec.cm = cap
sec.e_pas = Vrest
# Na
sec.gbar_nax = nax_gbar
sec.sh_nax = sh_nax
# KDR
sec.gbar_kdr = kdr_gbar
self.soma.insert('HCN1')
self.soma(0.5).HCN1.gbar = fs_h_gbar
def set_synapses(self):
self.somaGABAf=Synapse(sect=self.soma,loc=0.5,tau1=0.07,tau2=9.1,e=-80);#self.dSy['somaGABAf']=self.somaGABAf;
self.somaGABAss=Synapse(sect=self.soma,loc=0.5,tau1=20,tau2=40,e=-80);#self.dSy['somaGABAss']=self.somaGABAss;
self.somaAMPA=Synapse(sect=self.soma,loc=0.5,tau1=0.05,tau2=5.3,e=0);#self.dSy['somaAMPAf']=self.somaAMPAf;
self.somaNMDA=SynapseNMDA(sect=self.soma,loc=0.5, tau1NMDA=tau1NMDAEI,tau2NMDA=tau2NMDAEI,r=1,e=0);
###############################################################################
# Dendrite-targeting interneuron (LTS Cell)
###############################################################################
class Lts (Cell):
"LTS cell"
def set_morphology(self):
total_area = 10000 # um2
self.soma.nseg = 1
self.soma.cm = 1 # uF/cm2
diam = sqrt(total_area) # um
L = diam/pi # um
h.pt3dclear(sec=self.soma)
h.pt3dadd(self.x, self.y, self.z, diam, sec=self.soma)
h.pt3dadd(self.x, self.y, self.z+L, diam, sec=self.soma)
def set_conductances(self): # LTS
cap = 1.0
rall = 150.0
rm = 10e3
Vrest = -79.8
p_ek = -85.0
p_ena = 55.0
sh_nax = 0.0
sec = self.soma
sec.insert('k_ion')
sec.insert('na_ion')
sec.insert('pas') # passive
sec.insert('nax') # Na current
sec.insert('kdr') # K delayed rectifier current
# erev
sec.ek = p_ek # K+ current reversal potential (mV)
sec.ena = p_ena # Na+ current reversal potential (mV)
# passive
sec.g_pas = 1.0/rm
sec.Ra = rall
sec.cm = cap
sec.e_pas = Vrest
# Na
sec.gbar_nax = nax_gbar
sec.sh_nax = sh_nax
# KDR
sec.gbar_kdr = kdr_gbar
# ca-related
sec.insert('icalts')
sec(0.5).icalts.gca = lts_cabar
sec.insert('kcalts')
sec.insert('ihlts')
sec(0.5).ihlts.gh = lts_h_gbar
sec.insert('calts') # calcium extrusion
sec(0.5).calts.tau = taurcada
def set_synapses(self):
self.somaGABAf = Synapse(sect=self.soma, loc=0.5, tau1=0.07, tau2=9.1, e=-80)
self.somaGABAss = Synapse( sect=self.soma, loc=0.5, tau1=20, tau2=40, e=-80)#originally for septal input
self.somaAMPA = Synapse( sect=self.soma, loc=0.5, tau1=0.05, tau2=5.3, e=0)
self.somaNMDA = SynapseNMDA(sect=self.soma, loc=0.5, tau1NMDA=tau1NMDAEI, tau2NMDA=tau2NMDAEI, r=1, e=0)
LTS = Lts
FS = Bas
###############################################################################
# Pyramidal Cell
###############################################################################
class PyrAdr (Cell):
"Pyramidal cell"
def __init__(self,x,y,z,ID,ty):
Cell.__init__(self,x,y,z,ID,ty)
self.set_props()
lrec = ['soma','Adend3']
def set_morphology(self):
self.add_comp('Bdend',True)
self.add_comp('Adend1',False)
self.add_comp('Adend2',False)
self.add_comp('Adend3',True)
self.apic = [self.Adend1, self.Adend2, self.Adend3]
self.basal = [self.Bdend]
sec = self.soma; sec.L = 20.0; sec.diam = 20.0
if self.ty == E5R or self.ty == E5B or self.ty == E5P: apicL = 300.0
else: apicL = 150.0
#else: apicL = 300.0
for sec in self.apic:
sec.L = apicL; sec.diam = 2.0
self.Bdend.L = 200.0; self.Bdend.diam = 2.0
self.Bdend.connect(self.soma, 0, 0)
self.Adend1.connect(self.soma, 1, 0)
self.Adend2.connect(self.Adend1, 1, 0)
self.Adend3.connect(self.Adend2, 1, 0)
if spaceum > 0.0:
for sec in self.all_sec:
ns = int(sec.L / spaceum)
if ns % 2 == 0: ns += 1
sec.nseg = ns
def set_props (self): # PYR
Vrest = -79.8
h.v_init = -60.0
#h.v_init = -79.8 # -70 # -75 # -79.8 # Vrest # -79.8
# passive properties
cap = 1.0
rall = 150.0
rm = 10e3
# Na, K reversal potentials calculated from
# internal and external solutions via Nernst equation
p_ek = -85.0
p_ena = 55.0
# h-current
#h.erev_h = -42.0
gbar_h = h_gbar
# d-current
kdmc_gbar_somam = 20
# na,k
sh_nax = 0.0
gbar_nax = nax_gbar
nax_gbar_somam = 5
kdr_gbar_somam = 5
# A few kinetic params changed vis-a-vis kdr_BS.mod defaults:
h.a0n_kdr = 0.0075 # def 0.02
h.nmax_kdr = 20.0 # def 2
sh_kap = 0.0
kap_gbar_somam = 5
# A few kinetic params changed from kap_BS.mod defaults:
h.vhalfn_kap = 35.0 # def 11
h.nmin_kap = 0.4 # def 0.1
h.lmin_kap = 5.0 # def 2
h.tq_kap = -45.0 # def -40
# other ion channel parameters
cal_gcalbar = cabar
can_gcanbar = cabar
cat_gcatbar = cabar
calginc = 1.0 # 2.0 - middle might need to get more but can leave out
cal_gbar_somam = can_gbar_somam = cat_gbar_somam = 0.1
cal_gbar_bdendm = can_gbar_bdendm = cat_gbar_bdendm = 0.25
ikc_gbar_dendm = 0.25
for sec in self.all_sec:
# erev
sec.ek = p_ek # K+ current reversal potential (mV)
sec.ena = p_ena # Na+ current reversal potential (mV)
# passive
sec.g_pas = 1.0/rm
sec.Ra = rall
sec.cm = cap
sec.e_pas = Vrest
# Ih
sec.ehwino = erevh
for seg in sec:
seg.hcnwino.k2 = 1e-4 # 1e-5 #
seg.hcnwino.ghbar = gbar_h
# Na
sec.gbar_nax = gbar_nax
sec.sh_nax = sh_nax
# KDR
sec.gbar_kdr = kdr_gbar
# K-A
sec.gbar_kap = kap_gbar
sec.sh_kap = sh_kap
soma = self.soma
soma.gbar_kdmc = kdmc_gbar * kdmc_gbar_somam
soma.gbar_nax = nax_gbar * nax_gbar_somam
soma.gbar_kdr = kdr_gbar * kdr_gbar_somam
soma.gbar_kap = kap_gbar * kap_gbar_somam
soma.gkbar_ikc = ikc_gkbar
soma.gcalbar_cal = cal_gcalbar * cal_gbar_somam
soma.gcanbar_can = can_gcanbar * can_gbar_somam
soma.gcatbar_cat = cat_gcatbar * cat_gbar_somam
h.distance(0,0.5,sec=self.soma) # middle of soma is origin for distance
for sec in self.apic:
sec.gcalbar_cal = cal_gcalbar
sec.gcanbar_can = can_gcanbar
sec.gcatbar_cat = cat_gcatbar
sec.gkbar_ikc = ikc_gkbar * ikc_gbar_dendm
sec.gbar_cagk = cagk_gbar
for seg in sec:
d = h.distance(seg.x,sec=sec)
seg.hcnwino.ghbar = gbar_h * exp(d/h_lambda)
seg.gmax_km = km_gmax * exp(d/h_lambda)
seg.gbar_kap = soma.gbar_kap * exp(d/h_lambda)
seg.gbar_kdr = soma.gbar_kdr * exp(d/h_lambda)
self.apic[1].gcalbar_cal = cal_gcalbar * calginc # middle apical dend gets more iL
self.apic[2].cm = 2.0
Bdend = self.Bdend
Bdend.gcalbar_cal = cal_gcalbar * cal_gbar_bdendm
Bdend.gcanbar_can = can_gcanbar * can_gbar_bdendm
Bdend.gcatbar_cat = cat_gcatbar * cat_gbar_bdendm
Bdend.gkbar_ikc = ikc_gkbar * ikc_gbar_dendm
Bdend.gbar_cagk = cagk_gbar
Bdend.gbar_kap = soma.gbar_kap; Bdend.gbar_kdr = soma.gbar_kdr
Bdend.gmax_km = km_gmax
def set_conductances (self): # insert the conductances
for sec in self.all_sec:
sec.insert('k_ion')
sec.insert('na_ion')
sec.insert('ca_ion')
sec.insert('pas') # passive
sec.insert('hcnwino') # H channel in Ih.mod
sec.insert('nax') # Na current
sec.insert('kdr') # K delayed rectifier current
sec.insert('kap') # K-A current
# calcium-related channels
sec.insert('cal') # cal_mig.mod
sec.insert('can') # can_mig.mod
sec.insert('cat') # cat_mig.mod
sec.insert('ikc') # IC.mod - ca and v dependent k channel - BK
soma = self.soma; self.soma.insert('kdmc') # K-D current in soma only
for sec in self.apic:
sec.insert('km') # km.mod
sec.insert('cagk') # cagk.mod - SK
self.Bdend.insert('km') # km.mod
self.Bdend.insert('cagk') # cagk.mod - SK
def set_synapses(self):
erevgaba = -80
self.somaGABAf = Synapse(sect=self.soma,loc=0.5,tau1=0.07,tau2=9.1,e=erevgaba)
self.somaAMPA = Synapse(sect=self.soma,loc=0.5,tau1=0.05,tau2=5.3,e=0)
bdsyloc = 0.5
self.BdendAMPA = Synapse(sect=self.Bdend,loc=bdsyloc,tau1=0.05, tau2=5.3,e=0)
self.BdendNMDA = SynapseNMDA(sect=self.Bdend,loc=bdsyloc,tau1NMDA=tau1NMDAEE,tau2NMDA=tau2NMDAEE,r=1,e=0)
self.Adend1GABAs = Synapse(sect=self.Adend1,loc=0.5,tau1=0.2,tau2=20,e=erevgaba)
self.Adend2GABAs = Synapse(sect=self.Adend2,loc=0.5,tau1=0.2,tau2=20,e=erevgaba)
self.Adend3GABAs = Synapse(sect=self.Adend3,loc=0.5,tau1=0.2,tau2=20,e=erevgaba)
self.Adend3GABAf = Synapse(sect=self.Adend3,loc=0.5,tau1=0.07,tau2=9.1,e=erevgaba)
self.Adend3AMPA = Synapse(sect=self.Adend3,loc=0.5,tau1=0.05,tau2=5.3,e=0)
self.Adend3NMDA = SynapseNMDA(sect=self.Adend3,loc=0.5,tau1NMDA=tau1NMDAEE,tau2NMDA=tau2NMDAEE,r=1,e=0)
self.Adend2AMPA = Synapse(sect=self.Adend2,loc=0.5,tau1=0.05,tau2=5.3,e=0)
self.Adend2NMDA = SynapseNMDA(sect=self.Adend2,loc=0.5,tau1NMDA=tau1NMDAEE,tau2NMDA=tau2NMDAEE,r=1,e=0)
self.Adend1AMPA = Synapse(sect=self.Adend1,loc=0.5,tau1=0.05,tau2=5.3,e=0)
self.Adend1NMDA = SynapseNMDA(sect=self.Adend1,loc=0.5,tau1NMDA=tau1NMDAEE,tau2NMDA=tau2NMDAEE,r=1,e=0)
self.Adend3mGLUR = SynapsemGLUR(sect=self.Adend3,loc=0.5)
self.Adend3GABAB = SynapseGABAB(sect=self.Adend3,loc=0.5)
self.Adend2mGLUR = SynapsemGLUR(sect=self.Adend2,loc=0.5)
self.Adend2GABAB = SynapseGABAB(sect=self.Adend2,loc=0.5)
self.Adend1mGLUR = SynapsemGLUR(sect=self.Adend1,loc=0.5)
self.Adend1GABAB = SynapseGABAB(sect=self.Adend1,loc=0.5)
#######################################
# some utils to avoid the h. #
vlk = h.vlk
Vector = h.Vector
NQS = h.NQS
gg = h.gg
ge = h.ge
Random = h.Random
List = h.List
Matrix = h.Matrix
nqsdel = h.nqsdel
Graph = h.Graph
vrsz = h.vrsz
allocvecs = h.allocvecs
NetCon = h.NetCon
NetStim = h.NetStim
#######################################