/*--------------------------------------------------------------------------
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: 2002-01-25
--------------------------------------------------------------------------*/
#ifndef LPRNEURON_CC
#define LPRNEURON_CC
#include "CN_neuron.cc"
#define efunc(X,Y,Z) (1.0/(1.0+exp(((X)-(Y))/(Z))))
#define Eaxon x[idx]
#define Esoma x[idx+15]
#define gNa p[0]
#define ENa p[1]
#define gCa1 p[2]
#define gCa2 p[3]
#define goCa p[4]
#define EK p[5]
#define gd p[6]
#define gA p[7]
#define gh p[8]
#define EIh p[9]
#define gleak p[10]
#define Eleak p[11]
#define Cmem p[12]
#define c_iCa p[13]
#define k_Ca p[14]
#define kfac p[15]
#define Vshift p[16]
#define IDC p[17]
#define kfacfast p[18]
#define gVV p[19]
#define Cs p[20]
#define gleaks p[21]
#define RTF p[22]
#define AreaAxon p[23]
#define Area p[24]
// ICa from my own fit
#define k_aCa1 p[25]
#define k_bCa1 p[26]
#define k_aCa2 p[27]
#define V_aCa1 p[28]
#define V_bCa1 p[29]
#define V_aCa2 p[30]
#define s_aCa1 p[31]
#define s_bCa1 p[32]
#define s_aCa2 p[33]
#define P_Ca p[34]
#define Ca_out p[35]
#define V_kbCa1 p[36]
#define s_kbCa1 p[37]
#define k_oa p[38]
#define k_ob p[39]
#define V_ao1 p[40]
#define V_ao2 p[41]
#define s_ao1 p[42]
#define s_ao2 p[43]
#define f p[44]
#define c1 p[45]
#define c2 p[46]
#define c3 p[47]
#define Ca_0 p[48]
#define k_aA p[49]
#define k_bA1 p[50]
#define c_A2 p[51]
#define V_aA p[52]
#define V_bA p[53]
#define V_kbA2 p[54]
#define V_x p[55]
#define s_aA p[56]
#define s_bA p[57]
#define s_kbA2 p[58]
#define s_x p[59]
// Ih from my own fit
#define c_r p[60]
#define V_r p[61]
#define V_kr p[62]
#define s_r p[63]
#define s_kr p[64]
#define I_scale p[65]
#define E_M p[66]
#define g_M p[67]
#define k_M p[68]
#define V_M p[69]
#define s_M p[70]
#define V_kM p[71]
#define s_kM p[72]
LPRneuron::LPRneuron(int inlabel, double *the_p= LPR_p):
neuron(inlabel, LPR_IVARNO, LPRNEURON, the_p, LPR_PNO)
{
}
LPRneuron::LPRneuron(int inlabel, vector<int> inpos, double *the_p= LPR_p):
neuron(inlabel, LPR_IVARNO, LPRNEURON, inpos, the_p, LPR_PNO)
{
}
inline double LPRneuron::E(double *x)
{
return x[idx+15]+Vshift;
}
void LPRneuron::currents(ostream &os, double *x)
{
static double INa, ICa, IoCa, Id, IA, Ih, Il, IM, IVV;
// differential eqn for the axon membrane potential
INa= pw3(x[idx+1])*x[idx+2]*gNa*(Eaxon-ENa)*AreaAxon;
Id= pw4(x[idx+8])*gd*(Esoma-EK)*AreaAxon;
IM= g_M*x[idx+14]*(Eaxon-E_M)*AreaAxon;
Il= gleak*(Eaxon-Eleak)*AreaAxon;
os << INa << " ";
os << Id << " ";
os << IM << " ";
os << Il << " ";
ICa= (x[idx+3]*x[idx+4]*gCa1+x[idx+5]*gCa2)*
P_Ca*Esoma*(x[idx+13]*exp(Esoma/RTF)-Ca_out)/(exp(Esoma/RTF)-1.0)*Area;
IoCa= x[idx+6]*x[idx+7]*goCa*(Esoma-EK)*Area;
IA= pw3(x[idx+9])*gA*(Esoma-EK)*
(efunc(Esoma,V_x,s_x)*x[idx+10]+(1.0-efunc(Esoma,V_x,s_x))*x[idx+11])*Area;
Ih= x[idx+12]*gh*(Esoma-EIh)*Area;
IVV= gVV*(Esoma-Eaxon);
Il= gleaks*(Esoma-Eleak)*Area;
os << ICa << " ";
os << IoCa << " ";
os << IA << " ";
os << Ih << " ";
os << IVV << " ";
os << Il << endl;
}
void LPRneuron::derivative(double *x, double *dx)
{
static double a, b, hinf, kh, minf, km;
static double INa, Id, ICa, IoCa, IA, Ih, Il, IM, IVV;
static double Isyn;
Isyn= 0.0;
forall(den, den_it) {
Isyn+= (*den_it)->Isyn(x);
}
// differential eqn for the axon membrane potential
INa= pw3(x[idx+1])*x[idx+2]*gNa*(Eaxon-ENa)*AreaAxon;
Id= pw4(x[idx+8])*gd*(Eaxon-EK)*AreaAxon;
IM= g_M*x[idx+14]*(Eaxon-E_M)*AreaAxon;
Il= gleak*(Eaxon-Eleak)*AreaAxon;
IVV= gVV*(Esoma-Eaxon);
dx[idx]= (-INa - Id - IM - Il + IVV)/Cmem;
// soma compartment
a= exp(Esoma/RTF);
ICa= (x[idx+3]*x[idx+4]*gCa1+x[idx+5]*gCa2)*P_Ca*Esoma*(x[idx+13]*a-Ca_out)
/(a-1.0)*Area;
IoCa= x[idx+6]*x[idx+7]*goCa*(Esoma-EK)*Area;
a= efunc(Esoma,V_x,s_x);
IA= pw3(x[idx+9])*gA*(Esoma-EK)*(a*x[idx+10]+(1.0-a)*x[idx+11])*Area;
Ih= x[idx+12]*gh*(Esoma-EIh)*Area;
Il= gleaks*(Esoma-Eleak)*Area;
dx[idx+15]= (-ICa - IoCa - IA - Ih - Il - IVV + (IDC + Isyn)*I_scale)/Cs;
// differential eqn for mNa
a= (3.5+0.1*x[idx]) / (1.0-exp(-3.5-0.1*x[idx]));
b= 4.0*exp(-(x[idx]+60.0)/18.0);
dx[idx+1]= (a*(1.0-x[idx+1])-b*x[idx+1])*kfac*kfacfast;
// differential eqn for hNa
a= 0.07*exp(-x[idx]/20.0-3.0);
b= 1.0 / (exp(-3.0-0.1*x[idx])+1.0);
dx[idx+2]= (a*(1.0-x[idx+2])-b*x[idx+2])*kfac*kfacfast;
// differential eqn for md
a= (-0.5-0.01*x[idx]) / (exp(-5.0-0.1*x[idx])-1.0);
b= 0.125*exp(-(x[idx]+60.0)/80.0);
dx[idx+8]= (a*(1.0-x[idx+8])-b*x[idx+8])*kfac*kfacfast;
// differential eqn for mCa1
minf= efunc(Esoma,V_aCa1,s_aCa1);
km= k_aCa1*kfac;
dx[idx+3]= (minf-x[idx+3])*km;
// differential eqn for hCa1
hinf= efunc(Esoma,V_bCa1,s_bCa1);
kh= k_bCa1*efunc(Esoma,V_kbCa1,s_kbCa1)*kfac;
dx[idx+4]= (hinf-x[idx+4])*kh;
// differential eqn for mCa2
minf= efunc(Esoma,V_aCa2,s_aCa2);
km= k_aCa2*kfac;
dx[idx+5]= (minf-x[idx+5])*km;
// differential eqn for moCa
a= V_ao1-f*x[idx+13];
b= V_ao2-f*x[idx+13];
minf= efunc(Esoma,a,s_ao1)*efunc(Esoma,b,s_ao2)*(x[idx+13]/(c1+x[idx+13]));
km= k_oa*kfac;
dx[idx+6]= (minf-x[idx+6])*km;
// differential eqn for hoCa
hinf= c2/(c3+x[idx+13]);
kh= k_ob*kfac;
dx[idx+7]= (hinf-x[idx+7])*kh;
// differential eqn for mA
minf= efunc(Esoma,V_aA,s_aA);
km= k_aA*kfac;
dx[idx+9]= (minf-x[idx+9])*km;
// differential eqn for hA1
hinf= efunc(Esoma,V_bA,s_bA);
kh= k_bA1*kfac;
dx[idx+10]= (hinf-x[idx+10])*kh;
// differential eqn for hA2
kh= c_A2*efunc(Esoma,V_kbA2,s_kbA2)*kfac;
dx[idx+11]= (hinf-x[idx+11])*kh;
// differential eqn for mh
minf= efunc(Esoma,V_r,s_r);
km= c_r/efunc(Esoma,V_kr,s_kr)*kfac;
dx[idx+12]= (minf-x[idx+12])*km;
// differential eqn for Ca concentration
dx[idx+13]= -c_iCa*ICa - k_Ca*(x[idx+13]-Ca_0);
// differential equn for M current activation var
minf= efunc(Eaxon,V_M,s_M);
km= k_M*efunc(Eaxon,V_kM,s_kM)*kfac;
dx[idx+14]= (minf-x[idx+14])*km;
}
#undef efunc
#undef Eaxon
#undef Esoma
#undef gNa
#undef ENa
#undef gCa1
#undef gCa2
#undef goCa
#undef EK
#undef gd
#undef gA
#undef gh
#undef EIh
#undef gleak
#undef Eleak
#undef Cmem
#undef c_iCa
#undef k_Ca
#undef kfac
#undef Vshift
#undef IDC
#undef kfacfast
#undef gVV
#undef Cs
#undef gleaks
#undef RTF
#undef V_m
#undef s_m
// ICa from my own fit
#undef k_aCa1
#undef k_bCa1
#undef k_aCa2
#undef V_aCa1
#undef V_bCa1
#undef V_aCa2
#undef s_aCa1
#undef s_bCa1
#undef s_aCa2
#undef P_Ca
#undef Ca_out
#undef V_kbCa1
#undef s_kbCa1
#undef k_oa
#undef k_ob
#undef V_ao1
#undef V_ao2
#undef s_ao1
#undef s_ao2
#undef f
#undef c1
#undef c2
#undef c3
#undef Ca_0
#undef c_n
#undef V_n
#undef V_kn
#undef s_n
#undef s_kn
#undef k_aA
#undef k_bA1
#undef c_A2
#undef V_aA
#undef V_bA
#undef V_kbA2
#undef V_x
#undef s_aA
#undef s_bA
#undef s_kbA2
#undef s_x
// Ih from my own fit
#undef c_r
#undef V_r
#undef V_kr
#undef s_r
#undef s_kr
#undef I_scale
#undef E_M
#undef g_M
#undef k_M
#undef V_M
#undef s_M
#endif