/*--------------------------------------------------------------------------
Author: Thomas Nowotny
Institute: Institute for Nonlinear Dynamics
University of California San Diego
La Jolla, CA 92093-0402
email to: tnowotny@ucsd.edu
initial version: 2005-08-17
--------------------------------------------------------------------------*/
#ifndef CN_NEUROSYNPOISSON_CC
#define CN_NEUROSYNPOISSON_CC
#include "CN_neuron.cc"
NeuroSynPoisson::NeuroSynPoisson(int inlabel, double *the_p= NEUROSYNPOISSON_p):
neuron(inlabel, NEUROSYNPOISSON_IVARNO, NEUROSYNPOISSON, the_p, NEUROSYNPOISSON_PNO)
{
tlast= -10000;
}
NeuroSynPoisson::NeuroSynPoisson(int inlabel, vector<int> inpos, double *the_p= NEUROSYNPOISSON_p):
neuron(inlabel, NEUROSYNPOISSON_IVARNO, NEUROSYNPOISSON, inpos, the_p, NEUROSYNPOISSON_PNO)
{
tlast= -10000;
}
double NeuroSynPoisson::E(double *x)
{
if (spikingThistime) {
return p[20];
}
else {
return p[21];
}
}
double NeuroSynPoisson::S(double *x)
{
assert(enabled);
return x[idx];
}
void NeuroSynPoisson::derivative(double *x, double *dx)
{
static double dt;
dt= x[0] - tlast;
if ((dt >= 0) && (dt <= p[16])) {
dx[idx]= p[14] - p[15]*x[idx];
} else {
if ((E(x) > p[13]) && (dt > p[16])) {
// new spike ... start releasing
tlast= x[0];
dx[idx]= p[14] - p[15]*x[idx];
}
else {
// no release
dx[idx]= -p[15]*x[idx];
}
}
if (spiking)
spiking= 0;
}
void NeuroSynPoisson::init(double *x, double *iniVars)
{
assert(enabled);
for (int i= 0; i < iVarNo; i++)
x[idx+i]= iniVars[i];
spike_time= -1.0;
spiking= 0;
refract= 0;
spikingThistime = 0.0;
start_spiking= 0;
tlast= -10000;
}
void NeuroSynPoisson::ResetSynapse(double *x)
{
x[idx] = 0;
}
void NeuroSynPoisson::advance(double *x, double dt,double buts)
{
if (spikingThistime)
spikingThistime =0.0;
if (spiking)
spiking= 0;
double actualTime = x[0]-buts/p[18];
if((actualTime - spike_time) > 1/p[18]){
spiking= 1;
spike_time= actualTime;
spikingThistime =1.0;
}
/*
if (RG.n() < p[18]*0.1) {
spiking= 1;
spikingThistime =1.0;
spike_time= x[0];
}
*/
}
#endif