NEURON {
POINT_PROCESS APThreshold
RANGE n, slopeth, ampth, time, vth, firing1, firing2
}
UNITS {
(mV) = (millivolt)
}
PARAMETER {
n
slopeth = 10 (mV/ms)
ampth = -20 (mV)
time (ms)
vth (mV)
v (mV)
dt (ms)
}
ASSIGNED {
firing1
firing2
spacet
spaceth
v1 (mV)
}
VERBATIM
extern void vector_resize();
extern double* vector_vec();
extern void* vector_arg();
ENDVERBATIM
INITIAL {
n = 0
firing1 = 0
firing2 = 0
v1 = 0 (mV)
VERBATIM
{ void* vvt; void* vvth;
vvt = *((void**)(&spacet));
vvth = *((void**)(&spaceth));
if (vvt) {
vector_resize(vvt, 0);
}
if (vvth) {
vector_resize(vvth, 0);
}
}
ENDVERBATIM
check()
}
BREAKPOINT {
SOLVE check METHOD after_cvode
}
PROCEDURE check() {
VERBATIM
if ((v - v1)/dt >= slopeth && !firing1) {
firing1 = 1;
time = t;
vth = v;
}
if (v >= ampth && firing1 && !firing2) {
int size; double* px; void* vvt; void* vvth;
firing2 = 1;
n += 1.;
vvt = *((void**)(&spacet));
vvth = *((void**)(&spaceth));
if (vvt) {
size = (int)n;
vector_resize(vvt, size);
px = vector_vec(vvt);
px[size-1] = time;
}
if (vvth) {
size = (int)n;
vector_resize(vvth, size);
px = vector_vec(vvth);
px[size-1] = vth;
}
}
if (firing1 && (v - v1)/dt < slopeth && t > time) {
firing1 = 0;
}
if (firing2 && v < ampth && t > time) {
firing2 = 0;
firing1 = 0;
}
v1 = v;
ENDVERBATIM
}
PROCEDURE spiketimes() {
VERBATIM
extern void* vector_arg();
void** vvt;
vvt = (void**)(&spacet);
*vvt = (void*)0;
if (ifarg(1)) {
*vvt = vector_arg(1);
}
ENDVERBATIM
}
PROCEDURE thresholds() {
VERBATIM
extern void* vector_arg();
void** vvth;
vvth = (void**)(&spaceth);
*vvth = (void*)0;
if (ifarg(1)) {
*vvth = vector_arg(1);
}
ENDVERBATIM
}