/*----------------------------------------------------------------------------
	SIMULATIONS OF INTERCONNECTED TC AND RE CELLS
	=============================================
	- Object sTC (simplified single-compartment cell based on 
	  Huguenard-McCormick model of TC cell)
	- Object sRE (simplified single-compartment cell based on 
	  Destexhe et al. model)
	- kinetic models for synaptic receptors with pulses of transmitter
	SIMULATION OF THALAMIC SPINDLES WITH SINGLE COMPARTMENTS
		RE  <--(GABAa)-->  RE  <---(AMPA)----   TC
				       ----(GABAa)-->
					   (GABAb)
	SIMPLE NETWORK CONFIGURATION WITH 2 TC and 2 RE cells
	     RE = RE
	     | / \ |
	     TC   TC
	This file simulates delta oscillations in the 4-cell circuit
	(short time scale)
	Model from:
	Destexhe, A., Bal, T., McCormick, D.A. and Sejnowski, T.J.
	Ionic mechanisms underlying synchronized oscillations and propagating
	waves in a model of ferret thalamic slices. Journal of Neurophysiology
	76: 2049-2070, 1996.
	(see http://cns.iaf.cnrs-gif.fr)
	Alain Destexhe, Salk Institute and Laval University, 1995
----------------------------------------------------------------------------*/
//----------------------------------------------------------------------------
//  load and define general graphical procedures
//----------------------------------------------------------------------------
load_file("nrngui.hoc")
objectvar g[20]			// max 20 graphs
ngraph = 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)*350+50, ii%2*260+80, 300, 200)
	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
}
//----------------------------------------------------------------------------
//  transient time
//----------------------------------------------------------------------------
trans = 00
print " "
print ">> Transient time of ",trans," ms"
print " "
//----------------------------------------------------------------------------
//  create TC cells
//----------------------------------------------------------------------------
print " "
print "<<==================================>>"
print "<<            CREATE CELLS          >>"
print "<<==================================>>"
print " "
load_file("TC.tem")		// read geometry file
ncells = 2
objectvar TC[ncells]
for i=0,ncells-1 {
  TC[i] = new sTC()
}
//----------------------------------------------------------------------------
//  create RE cells
//----------------------------------------------------------------------------
load_file("RE.tem")		// read geometry file
objectvar RE[ncells]		// create RE cells
for i=0,ncells-1 {
  RE[i] = new sRE()
}
//----------------------------------------------------------------------------
//  PROCEDURES FOR SYNAPTIC CONNECTIVITY IN 1-DIM
//----------------------------------------------------------------------------
print " "
print "<<==================================>>"
print "<<     CREATE SYNAPTIC RECEPTORS    >>"
print "<<==================================>>"
print " "
func ncon() { local nc		// function to get the number of connections 
				// argument: interaction diameter
   nc = 2 * $1 + 1
   if(nc>ncells) nc = ncells
   return nc
}
//----------------------------------------------------------------------------
//  Glutamate AMPA receptors in synapses from TC to RE
//----------------------------------------------------------------------------
diamTCRE = 1		// diameter of connectivity for TC->RE
nTCRE = ncon(diamTCRE)	// nb of RE cells receiving synapses from one TC cell
objectvar reG[ncells][nTCRE]
for i=0,ncells-1 {
   nv = 0
   for j=0,ncells-1 {
     if( abs(i-j) <= diamTCRE) {
	print "<< AMPA receptor from TC cell ",i," to RE cell ",j," >>"
	print " "
	reG[i][nv] = new AMPA_S()
	RE[j].soma reG[i][nv].loc(0.5)		// postsynaptic is RE[j] 
	setpointer reG[i][nv].pre, TC[i].soma.v	// presynaptic is TC[i]
	nv = nv + 1
     }
   }
}
print " "
print "<< ",nv," AMPA-MEDIATED SYNAPTIC CONTACTS FROM TC TO RE >>"
print " "
	
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
//----------------------------------------------------------------------------
//  GABAa receptors in intra-RE synapses
//----------------------------------------------------------------------------
diamRERE = 1		// diameter of connectivity for RE->RE
nRERE = ncon(diamRERE)	// nb of RE cells receiving synapses from one TC cell
objectvar reA[ncells][nRERE]
for i=0,ncells-1 {
   nv = 0
   for j=0,ncells-1 {
     if( abs(i-j) <= diamRERE) {
	print "<< GABAa receptor from RE cell ",i," to RE cell ",j," >>"
	print " "
	reA[i][nv] = new GABAa_S()
	RE[j].soma reA[i][nv].loc(0.5)		// postsynaptic is RE[j] 
	setpointer reA[i][nv].pre, RE[i].soma.v	// presynaptic is TC[i]
	nv = nv + 1
     }
   }
}
	
print " "
print "<< ",nv," GABAa-MEDIATED SYNAPTIC CONTACTS FROM RE TO RE >>"
print " "
Alpha_GABAa_S = 20		// from diffusion model
Beta_GABAa_S = 0.162
Cmax_GABAa_S = 0.5		// short pulses
Cdur_GABAa_S = 0.3
Erev_GABAa_S = -80
//----------------------------------------------------------------------------
//  GABAa receptors in synapses from RE to TC cells
//----------------------------------------------------------------------------
diamRETC = 1		// diameter of connectivity from RE->TC
nRETC = ncon(diamRETC)	// nb of RE cells receiving synapses from one TC cell
objectvar tcA[ncells][nRETC]
for i=0,ncells-1 {
   nv = 0
   for j=0,ncells-1 {
     if( abs(i-j) <= diamRETC) {
	print "<< GABAa receptor from RE cell ",i," to TC cell ",j," >>"
	print " "
	tcA[i][nv] = new GABAa_S()
	TC[j].soma tcA[i][nv].loc(0.5)		// postsynaptic is TC[j] 
	setpointer tcA[i][nv].pre, RE[i].soma.v	// presynaptic is RE[i]
	nv = nv + 1
     }
   }
}
	
print " "
print "<< ",nv," GABAa-MEDIATED SYNAPTIC CONTACTS FROM RE TO TC >>"
print " "
Alpha_GABAa_S = 20		// from diffusion model
Beta_GABAa_S = 0.162
Cmax_GABAa_S = 0.5		// short pulses
Cdur_GABAa_S = 0.3
Erev_GABAa_S = -85		// Rinzel's Erev
//----------------------------------------------------------------------------
//  GABAb receptors in synapses from RE to TC cells
//----------------------------------------------------------------------------
// use same diameters and connectivity as GABAa receptors (colocalized)
objectvar tcB[ncells][nRETC]
for i=0,ncells-1 {
   nv = 0
   for j=0,ncells-1 {
     if( abs(i-j) <= diamRETC) {
	print "<< GABAb receptor from RE cell ",i," to TC cell ",j," >>"
	print " "
	tcB[i][nv] = new GABAb_S()
	TC[j].soma tcB[i][nv].loc(0.5)		// postsynaptic is TC[j] 
	setpointer tcB[i][nv].pre, RE[i].soma.v	// presynaptic is RE[i]
	nv = nv + 1
     }
   }
}
	
print " "
print "<< ",nv," GABAb-MEDIATED SYNAPTIC CONTACTS FROM RE TO TC >>"
print " "
//
//  Kinetics of GABAb_S synapses (from simplex low K1)
//
K1_GABAb_S	= 0.09	//	(/ms mM) forward binding rate to receptor
K2_GABAb_S	= 0.0012 //	(/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
proc assign_synapses() {	// procedure to assign syn conductances 
				// params: 1=intraRE, 2=GABAa in TC,
				// 3=GABAb in TC, 3=AMPA in RE
  for i=0, ncells-1 {
    for j=0, nRERE-1 {
	reA[i][j].gmax = $1 / nRERE
    }
    for j=0, nRETC-1 {
	tcA[i][j].gmax = $2 / nRETC
	tcB[i][j].gmax = $3 / nRETC
    }
    for j=0, nTCRE-1 {
	reG[i][j].gmax = $4 / nTCRE
    }
  }
}
assign_synapses(0.2,0.02,0.04,0.2)		// synaptic weights J neurophys
// setup TC cells in resting mode (no spontaneous oscillation)
for i=0,ncells-1 { 
  TC[i].soma.ghbar_iar = 1.5e-5
  TC[i].kl.gmax = 0.003
}
// setup first TC cell as an initiator (spontaneous waxing-waning)
// TC[0].soma.ghbar_iar = 2.5e-5	// long interspindle period
// TC[0].kl.gmax = 0.005
//TC[0].soma.ghbar_iar = 2e-5	// shorter interspindle period
//TC[0].kl.gmax = 0.005
TC[0].soma.ghbar_iar = 1e-5	// delta oscillations
TC[0].kl.gmax = 0.005
ginc_iar = 1
//----------------------------------------------------------------------------
//  setup simulation parameters
//----------------------------------------------------------------------------
Dt = 0.1
npoints = 20000
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
//----------------------------------------------------------------------------
//  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)
strdef gtxt
for i=0,ncells-1 {
	sprint(gtxt,"TC[%d].soma.v(0.5)",i)
	addgraph(gtxt,-120,40)
	sprint(gtxt,"RE[%d].soma.v(0.5)",i)
	addgraph(gtxt,-120,40)
}
//----------------------------------------------------------------------------
//  add text
//----------------------------------------------------------------------------
access TC[0].soma
proc text() {
  sprint(gtxt,"%d RE and %d TC cell",ncells,ncells)
  addtext(gtxt)
  sprint(gtxt,"Membrane level: kleak=%g",TC.kl.gmax)
  addline(gtxt)
  sprint(gtxt,"Ih: g=%g, ginc=%g, nca=%g, k2=%g, cac=%g", \
  ghbar_iar,ginc_iar,nca_iar,k2_iar,cac_iar)
  addline(gtxt)
  sprint(gtxt,"Ih: nexp=%g, Pc=%g, k4=%g, taum=%g", \
  nexp_iar,Pc_iar,k4_iar,taum_iar)
  addline(gtxt)
  sprint(gtxt,"GABAa_S: Alpha=%g, Beta=%g, Cdur=%g, Cmax=%g", \
  Alpha_GABAa_S,Beta_GABAa_S,Cmax_GABAa_S,Cdur_GABAa_S)
  addline(gtxt)
  sprint(gtxt,"GABAb_S: K1=%g, K2=%g, K3=%g, K4=%g, KD=%g", \
  K1_GABAb_S,K2_GABAb_S,K3_GABAb_S,K4_GABAb_S,KD_GABAb_S)
  addline(gtxt)
  sprint(gtxt,"RE-RE=%g, RE-TC=%g, RE-TC(b)=%g, TC-RE=%g", \
  reA[0][0].gmax, tcA[0][0].gmax, tcB[0][0].gmax, reG[0][0].gmax)
  addline(gtxt)
}
text()
print " "
print "Use procedure text() to create a new window with actual parameters"
print "Use procedure assign_synapses() to change synaptic conductances"
print " "