static char rcsid[] = "$Id: SynG_ron.c,v 1.0 1997/08/18 23:57:06 venkat Exp $"; #define VOLTAGE 0 #define CAF 1 #define CAS 2 #define POSTVOLTAGE 3 #define EK 4 #define TH 1000 #include "SynGS_ext.h" static int DEBUG_SynG = 0; static double savedata[3]; /* * Graded synaptic transmission for leech HN cells. * Needs presynaptic calcium currents and presynaptic voltage * 1/15/98 Calculates channel current therefore needs postsynaptic voltage. * This is necessary in order to have an Ik field. * However, the simuation will work without it because the postsynaptic * compartment calculates the current based on Vm and reversal pot. * This object was modified from synchan.c */ int SynG(channel,action) register struct SynG_type *channel; Action *action; { double dt; double g; int CAS_msg_in = 1,CAF_msg_in = 1,volt_msg_in = 1,pvolt_msg_in =1; /*CHECK*/ MsgIn *msg; double V, ICaF, ICaS, I_Ca, Ainf, Atau, Binf, Btau, tmp, PV; int n; if(Debug(DEBUG_SynG) > 1) ActionHeader("SynG",channel,action); SELECT_ACTION(action) { case INIT: channel->Gk = 0; break; case PROCESS: MSGLOOP(channel,msg) { case VOLTAGE: /* get presynaptic membrane potential */ V = MSGVALUE(msg,0); break; case CAF: /* get presynaptic ICaF */ ICaF= MSGVALUE(msg,0); break; case CAS: /* get presynaptic ICaS */ ICaS= MSGVALUE(msg, 0); break; case POSTVOLTAGE: /* get postsynaptic membrane potential */ PV = MSGVALUE(msg,0); break; case EK: /* reversal potential Ek */ channel->Ek = MSGVALUE(msg,0); break; } /* hn cell's grad-synaptic transmission ** calculate state variables and conductance */ dt = Clockrate(channel); /* Ainf, Atau, and Binf are voltage dependent */ Ainf=0e-12+200e-12/(1+exp(-0.4*TH*(V+0.037)));/* 25e-12 to 200e-12 A*/ /* Ainf units =A */ /* Atau=.001+1.0/(1+exp(0.3*TH*(V+0.037))+ \ exp(-1*TH*(V+0.045))); */ Atau=0.10+0.10/(1+exp(0.3*TH*(V+0.045))); /* units = Sec */ Binf=2.0; /* +8.0/(1+exp(0.21*TH*(V+.0436))); 2 to 10 Sec-1 */ Btau=0.20; /* units = Sec */ /* exponential euler */ channel->B=(channel->B)*exp(-dt/Btau)+Binf*(1-exp(-dt/Btau)); /* exponential euler */ channel->A=(channel->A)*exp(-dt/Atau)+Ainf*(1-exp(-dt/Atau)); I_Ca=ICaF+ICaS-(channel->A); /* I in A */ if (I_Ca < 0) I_Ca=0.0; /* exponential euler */ channel->P=(channel->P)*exp(-(channel->B)*dt)+ \ I_Ca/(channel->B)*(1-exp(-(channel->B)*dt)); tmp=(channel->P)*(channel->P)*(channel->P); g = (channel->Gbar)*tmp/(tmp+(channel->C)); /* C=1e-31 */ /* calculate the transmembrane current using the postsynaptic Vm */ channel->Gk = g; channel->Ik = (channel->Ek - PV) * g; break; /* end of case PROCESS */ case RESET: channel->Gk = 0; channel->Ik = 0; channel->A = 0; channel->P = 0; break; case CHECK: volt_msg_in = 0; CAF_msg_in = 0; CAS_msg_in = 0; pvolt_msg_in = 0; MSGLOOP(channel,msg) { case VOLTAGE: volt_msg_in = 1; break; case CAF: CAF_msg_in = 1; break; case CAS: CAS_msg_in = 1; break; case POSTVOLTAGE: pvolt_msg_in = 1; break; } if (volt_msg_in == 0) ErrorMessage("SynG","No membrane potential.", channel); if (CAF_msg_in == 0) ErrorMessage("SynG","No ICaF.", channel); if (CAS_msg_in == 0) ErrorMessage("SynG","No ICaS.", channel); if (pvolt_msg_in == 0) ErrorMessage("SynG","No postsynaptic memb. potential.", channel); if ((channel->Gbar) < 0) ErrorMessage("SynG","Gbar must be >= 0.", channel); break; /* CHECK */ case SAVE2: savedata[0] = (double)(channel->A); savedata[1] = (double)(channel->P); n=2; fwrite(&n,sizeof(int),1,(FILE*)action->data); fwrite(savedata,sizeof(double),2,(FILE*)action->data); break; /* SAVE2 */ case RESTORE2: fread(&n,sizeof(int),1,(FILE*)action->data); if (n != 2) { ErrorMessage("SynG_ron","Invalid savedata length",channel); return(n); } fread(savedata,sizeof(double),2,(FILE*)action->data); channel->A = savedata[0]; channel->P = savedata[1]; break; /* RESTORE2 */ default: InvalidAction("SynG_ron", channel ,action); break; } return (0); }