/*----------------------------------------------------------------------------
Andrew Knox 2014
Newer synapses
----------------------------------------------------------------------------*/
nsynapses = 100
nstimuli = 10
nhfburst = 10 //10
timestimuli = 333
timehfburst = 3 //2.5
//----------------------------------------------------------------------------
// load and define general graphical procedures
//----------------------------------------------------------------------------
load_file("nrngui.hoc")
objectvar g[20] // max 20 graphs
objectvar g1, g2, g3, g4
ngraph = 0
objref PYtimevec, PYidvec, INtimevec, INidvec, REtimevec, REidvec, TCtimevec, TCidvec, recncs, recveclist
field = 0
gababi = 0
ampai = 0
proc addgraph() { local ii // define subroutine to add a new graph
// addgraph("variable", minvalue, maxvalue)
ngraph = ngraph+1
ii = ngraph-1
g[ii] = new Graph(0)
g[ii].view(0,1,0,1, int(ii/2)*550+80, ii%2*450+80, 400, 300)
g[ii].size(tstart,tstop,$2,$3)
g[ii].xaxis()
g[ii].yaxis()
g[ii].addvar($s1,1,0)
g[ii].save_name("graphList[0].")
graphList[0].append(g[ii])
}
proc addtext() { local ii // define subroutine to add a text graph
// addtext("text")
ngraph = ngraph+1
ii = ngraph-1
g[ii] = new Graph()
g[ii].size(0,tstop,0,1)
g[ii].xaxis(3)
g[ii].yaxis(3)
g[ii].label(0.1,0.8,$s1)
g[ii].save_name("graphList[0].")
graphList[0].append(g[ii])
text_id = ii
}
proc addline() { // to add a comment to the text window
// addline("text")
g[text_id].label($s1)
}
if(ismenu==0) {
nrnmainmenu() // create main menu
nrncontrolmenu() // create control menu
ismenu=1
}
objref membranedatafile
membranedatafile = new File()
//----------------------------------------------------------------------------
// transient time
//----------------------------------------------------------------------------
trans = 00
print " "
print ">> Transient time of ",trans," ms"
print " "
//----------------------------------------------------------------------------
// setup simulation parameters
//----------------------------------------------------------------------------
Dt = 0.1
npoints = 40000
objectvar Sim // create vector of simulation points
Sim = new Vector(npoints)
dt = 0.1 // must be submultiple of Dt
tstart = trans
tstop = trans + npoints * Dt
runStopAt = tstop
steps_per_ms = 1/Dt
celsius = 36
v_init = -70.5 //originally 70
//----------------------------------------------------------------------------
// create PY cell
//----------------------------------------------------------------------------
load_file("sPY.tem") // read geometry file
objectvar PY // create PY cells
objectvar PYVtrace
PY = new sPY()
PYVtrace = new Vector()
PYVtrace.record(&PY.soma.v(0.5))
//----------------------------------------------------------------------------
// setup stimulus vectors
//----------------------------------------------------------------------------
//load_file("vecevent.mod")
objectvar gabaAtimevec[nsynapses]
objectvar gabaBtimevec[nsynapses]
objectvar ampatimevec[nsynapses]
objectvar nmdatimevec[nsynapses]
objectvar nmdavec[nsynapses]
objref VgabaA[nsynapses]
objref VgabaB[nsynapses]
objref Vampa[nsynapses]
double Vnmda[nsynapses]
objectvar pygabaB[nsynapses]
objectvar pynmda[nsynapses]
objectvar jitter
jitter = new Random()
jitter.uniform(-1,1)
for ctr=0,nsynapses-1 {
gabaAtimevec[ctr] = new Vector()
gabaBtimevec[ctr] = new Vector()
ampatimevec[ctr] = new Vector()
nmdatimevec[ctr] = new Vector()
nmdavec[ctr] = new Vector()
VgabaA[ctr] = new VecStim()
VgabaB[ctr] = new VecStim()
Vampa[ctr] = new VecStim()
Vnmda[ctr] = 0
nmdavec[ctr].append(-60)
nmdatimevec[ctr].append(0)
for i=1, nstimuli-1 {
for j=1, nhfburst-1 {
stime = i*timestimuli+j*timehfburst+jitter.repick()
//stime = i*timestimuli+j*timehfburst
gabaAtimevec[ctr].append(stime)
stime = i*timestimuli+j*timehfburst+jitter.repick()
//stime = i*timestimuli+j*timehfburst
gabaBtimevec[ctr].append(stime)
stime = i*timestimuli+j*timehfburst+jitter.repick()
//stime = i*timestimuli+j*timehfburst
ampatimevec[ctr].append(stime)
stime = i*timestimuli+j*timehfburst+jitter.repick()
//stime = i*timestimuli+j*timehfburst
nmdatimevec[ctr].append(stime)
nmdavec[ctr].append(10)
nmdatimevec[ctr].append(stime+2*Dt)
nmdavec[ctr].append(-60)
}
}
nmdavec[ctr].play(&Vnmda[ctr],nmdatimevec[ctr])
}
//----------------------------------------------------------------------------
// setup synapses
//----------------------------------------------------------------------------
objectvar pygabaA
objectvar pyampa
objref netcon
// pygabaA = new GABAa_S()
// pyampa = new AMPA_S()
// pynmda = new NMDA()
// PY.soma pygabaA.loc(0.5)
// PY.soma pyampa.loc(0.5)
// PY.soma pynmda.loc(0.5)
for i=0,nsynapses-1 {
pygabaB[i] = new GABAb_S()
pynmda[i] = new NMDA()
PY.soma pygabaB[i].loc(0.5)
PY.soma pynmda[i].loc(0.5)
PY.gababpost.append(pygabaB[i])
}
Alpha_GABAa_S = 20 // from diffusion model
Beta_GABAa_S = 0.16
Cmax_GABAa_S = 0.5 // short pulses
Cdur_GABAa_S = 0.3
Erev_GABAa_S = -80 // Rinzel's Erev
K1_GABAb_S = 0.09 //0.52 (/ms mM) forward binding rate to receptor
K2_GABAb_S = 0.0012//0.0045 (/ms) backward (unbinding) rate of receptor
K3_GABAb_S = 0.18 // (/ms) rate of G-protein production
K4_GABAb_S = 0.034 // (/ms) rate of G-protein decay
KD_GABAb_S = 100 // dissociation constant of K+ channel
n_GABAb_S = 4 // nb of binding sites of G-protein on K+
Erev_GABAb_S = -95 // (mV) reversal potential (E_K)
Cmax_GABAb_S = 0.5 // short pulses
Cdur_GABAb_S = 0.3
Alpha_AMPA_S = 0.94 // kinetics from simplex with short pulses
Beta_AMPA_S = 0.18
Cmax_AMPA_S = 0.5
Cdur_AMPA_S = 0.3
Erev_AMPA_S = 0
Cmax_NMDA = 0.5 //1 //(mM) : max transmitter concentration
Cdur_NMDA = 0.3 //1 //(ms) : transmitter duration (rising phase)
Alpha_NMDA = 0.11 //.072 //(/ms mM) : forward (binding) rate
Beta_NMDA = 0.0066 //(/ms) : backward (unbinding) rate
Erev_NMDA = 0 //(mV)
Mg_NMDA = 2 //(mM) : external magnesium
proc assign_synapses() { // procedure to assign syn conductances
// params: 1=gabaA, 2=gabaB, 3=ampa, 4=nmda
for i=0,nsynapses-1 {
PY.INgabaalist.append(new NetCon(VgabaA[i], PY.gabaapost, 0, 0, $1))
PY.INgabablist.append(new NetCon(VgabaB[i], PY.gababpost.object(i), 0, 0, 1))
PY.gababpost.object(i).gmax = $2
PY.PYlist.append(new NetCon(Vampa[i], PY.ampapostTC, 0, 0, $3))
setpointer pynmda[i].pre, Vnmda[i]
pynmda[i].gmax = $4
}
}
//assign_synapses(0.0015,0.004,0.004)
assign_synapses(0.0015,0.004,0.004,0.001)
//assign_synapses(0.00,0.004,0.005,0.00)
//assign_synapses(1.5,4,4,1)
//assign_synapses(0,0.004,0.005)
for i=0,nsynapses-1 {
VgabaA[i].play(gabaAtimevec[i])
VgabaB[i].play(gabaBtimevec[i])
Vampa[i].play(ampatimevec[i])
}
//----------------------------------------------------------------------------
// add graphs
//----------------------------------------------------------------------------
//addgraph("tcB[0][0].g",0,0.05)
//addgraph("TC[0].soma.o2_iar",0,1)
//addgraph("TC[0].soma.p1_iar",0,1)
//addgraph("TC[15].it.h",0,1)
//addgraph("TC[15].it.h_inf",0,1)
strdef gtxt
sprint(gtxt,"PY.soma.v(0.5)")
addgraph(gtxt,-90,10)
addgraph("field",-5,2)
//addgraph("VgabaB[0]",-70,15)
//addgraph("Vampa[1]",-70,15)
//addgraph("Vampa[2]",-70,15)
addgraph("ampai",-20,0.1)
//addgraph("PY.ampapost.g",-0.1,0.1)
//addgraph("PY.ampapost.Ron",-0.1,0.1)
//addgraph("PY.ampapost.Roff",-0.1,0.1)
//addgraph("PY.gabaapost.i",-0.1,0.1)
//addgraph("PY.gababpost.object(0).i",0,0.005)
addgraph("gababi",0,5)
//addgraph("PY.gababpost.R",-0.1,0.4)
//addgraph("PY.gababpost.Gn",-0.1,0.4)
//addgraph("PY.gababpost.Roff",-0.1,0.4)
//addgraph("PY.INgabablist.object(0).weight[1]",-0.001,0.001)
//addgraph("PY.INgabablist.object(0).weight[2]",325,375)
//addgraph("PY.ampapost.synon",-0.001,0.001)
//-----------------------------------------------------------------------------
// Write recorded membrane data to file
//-----------------------------------------------------------------------------
proc writedatafile() {
membranedatafile.wopen("membrane_data.txt")
PYVtrace.printf(membranedatafile)
membranedatafile.close()
}
////////////////////////////////////////////////////////////////////////
// Code for dealing with field potentials
///////////////////////////////////////////////////////////////////////
func xfield() {local i, j, tmp, Re, x, cw
//$1 is Re, $2 is distance from nearest neuron
total_field = 0
tmp = 0
Re = $1
x = $2
for i=0, nsynapses-1 {
tmp += pygabaB[i].i
tmp += pynmda[i].g
}
return (PY.ampapostTC.i + PY.gabaapost.i + tmp) * Re/4/PI/x
// return (PY.ampapostTC.i + PY.gabaapost.i + PY.soma.ik_im + tmp) * Re/4/PI/x
}
func gababcur() {local i, tmp
tmp = 0
Re = $1
x = $2
for i=0, nsynapses-1 {
tmp += PY.gababpost.object(i).i
}
return tmp * Re/4/PI/x
}
func ampacur() {
Re = $1
x = $2
return PY.ampapostTC.i * Re/4/PI/x
}
proc advance() {
fadvance()
field = xfield(230,5)
gababi = gababcur(230,5)
ampai = ampacur(230,5)
}
proc printweight() {
print PY.INgabablist.object(0).weight
print PY.INgabablist.object(0).weight[0]
print PY.INgabablist.object(0).weight[1]
print PY.gababpost.K2
}