COMMENT

This .mod file MUST use the euler method of differentiation. Other
methods make numerous calls to the check() block within a single
timestep and hence do unintuitive things to the state variables there.

ENDCOMMENT

:INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}

UNITS {
	(mM) = (milli/liter)
      (umho) = (micromho)
        (nA) = (nanoamp)
        (mA) = (milliamp)
        (mV) = (millivolt)
}

NEURON {
	POINT_PROCESS abbott_nmda
	POINTER vpre
	NONSPECIFIC_CURRENT i
	RANGE d, s
	RANGE tauD, tauS, taug, G
	RANGE erev, thresh
}

STATE {
	D 
	S
	g 		(umho)		: conductance
	h 		(umho)		: conductance
}

PARAMETER {
	v    (mV)
	erev = 0 (mV)
	thresh = 0.5 (mV) : useful for 0-1 files
	d = 0.4
	s = 1.0
	tauD = 300 (ms)
	tauS = 20e3 (ms)
	taug = 2 (ms)
	G    = 10e-12 (umho)
	eta     = 0.33  (/mM)
	mag     = 1     (mM)
	gamma   = 0.06  (/mV)
}	

ASSIGNED {

	i     (nA)
	firing
	vpre  (mV)
}

INITIAL {
	firing = 0
	D = 1
	S = 1
	g = 0
}

BREAKPOINT {

   SOLVE depression METHOD euler : so now we're clinical psychiatrists
   aux()
}

DERIVATIVE depression {
   check()
   D' = (1/tauD) * ( 1 - D ) 
   S' = (1/tauS) * ( 1 - S )
   g' = (1/taug) * (-g) 
:   printf("D: %f, S: %f, g: %f\n", D, S, g)
}

PROCEDURE aux() {
	h = 1/(1 + eta * mag * exp( - (gamma * v)))
	i = (g * h * (v - erev))
}

PROCEDURE check() {
:	  printf ("--------------------------------------------------\n")
:	  printf ("t: %f\n", t)


	if (firing && (vpre < thresh)) {
		firing = 0
		}
	if ((vpre >= thresh) && !firing) {
		firing = 1
		D = d * D
		S = s * S
		g = g + G * D * S
:		printf(" **** firing: %f \n", firing)
		}

:	  printf("vpre: %f, firing: %f\n", vpre, firing)
}