#include "define.h"
//#include "gd.h"
#include "Neur_Class_PRC.h"
#include "Corr_Stat.h"
#include <time.h>
int MIN(int a, int b)
{
double Out;
if(a>=b)
Out=b;
else
Out=a;
return Out;
}
int
main(int ac, char **av)
{
ofstream OutFile,OutFile1;
ifstream InFile;
time_t start, end1, end2;
int increment = 0;
time(&start);
int32 seed = time(NULL);
TRandomMersenne rg(seed);
string s1, s2, s3, s4, s5;
if (ac <= 11) {
puts("endtime");
puts("Iinput external current");
puts("self inhibition strength");
puts("mutual inhibition strength");
puts("strength of mutual electrical coupling");
puts("decay constant for inhibition");
puts("Tau Rise time");
puts("Reversal potential of inhibitory synapse");
puts("Delta pulse time of first input");
puts("Delta pulse time of second input");
puts("Outfile");
exit(0);
}
int NN = 4, count = 0;
double endtime = atof(av[1]);
double I_ext = atof(av[2]);
double gself = atof(av[3]);
double gmutual=atof(av[4]);
double gelectrical=atof(av[5]);
double tauD = atof(av[6]);
double tauR = atof(av[7]);
double ERever=atof(av[8]);
double deltapulse=atof(av[9]);
double deltapulse2=atof(av[10]);
string PRCOut=av[11];
double Curr,Temp,Period=0;
string StringtauD=DoubleToStdStr(tauD);
string StringtauR=DoubleToStdStr(tauR);
//string Read="Files/ISI_"+StringtauD+"_"+StringtauR+".dat";
OutFile1.open("./PRCData/TempData.dat",ios::out);
double tim=0, timestep = epsilon, Threshold = 0;
double Rec_Time=0;
int bolrec=0;
vector < double >*T;
vector <int>bolneur;
T = new vector < double >[3000];
for (int i = 0; i < NN; i++)
bolneur.push_back(0);
HHneuron **neur;
neur = new HHneuron *[NN];
for (int i = 0; i < NN; i++) {
neur[i] = new HHneuron(0.0, 3);
neur[i]->parameter[11] = -65;
neur[i]->parameter[7] = 0.;
neur[i]->x[0] = -65;
}
Insynapse **Input, *Ext;
Input = new Insynapse *[NN];
Ext=new Insynapse(neur[2],0.0);
for (int i = 0; i < NN; i++)
Input[i] = new Insynapse(neur[i], 0.0);
Couplingcurrent ***coupAB,***coupBA,***couprefAB,***couprefBA;
coupAB = new Couplingcurrent **[NN];
coupBA = new Couplingcurrent **[NN];
couprefAB=new Couplingcurrent **[NN];
couprefBA=new Couplingcurrent **[NN];
coupAB[0]=new Couplingcurrent *[NN];
coupBA[0]=new Couplingcurrent *[NN];
couprefAB[0]=new Couplingcurrent *[NN];
couprefBA[0]=new Couplingcurrent *[NN];
coupAB[0][0] =new Couplingcurrent(neur[1], neur[2], 0.0*gelectrical);
coupBA[0][0] =new Couplingcurrent(neur[2], neur[1], gelectrical);
couprefAB[0][0] =new Couplingcurrent(neur[3], neur[0], gelectrical);
couprefBA[0][0] =new Couplingcurrent(neur[0], neur[3], 0.0*gelectrical);
TwoDsynapse ***slowself,***slowmutual;
slowself = new TwoDsynapse **[NN];
slowmutual=new TwoDsynapse **[NN];
slowmutual[0]=new TwoDsynapse*[NN];
slowmutual[0][0]=new TwoDsynapse(neur[2], neur[1], gmutual, 0., 0); //connecting through mutual synapse
slowmutual[0][0]->parameter[1] = ERever;
slowmutual[0][0]->parameter[2] = tauR;
slowmutual[0][0]->parameter[3] = tauD;
for (int i = 0; i < NN; i++) {
slowself[i] = new TwoDsynapse *[NN];
slowself[i][i] = new TwoDsynapse(neur[i], neur[i], gself, 0., 0);
slowself[i][i]->parameter[1] = -82;
slowself[i][i]->parameter[2] = tauR;
slowself[i][i]->parameter[3] = tauD;
}
/*******************parameters for the TwoDsynapse to work********************/
double *ref_time;
double *vnew, *vold;
double *diff;
int *bol;
ref_time = new double[NN];
vnew = new double[NN];
vold = new double[NN];
diff = new double[NN];
bol = new int [NN];
double ref_pre_post;
double diff_pre_post;
int bol_pre_post=0;
double vold_pre_post=0,vnew_pre_post=0;
for (int i = 0; i < NN; i++) {
vnew[i] = 0;
bol[i] = 0;
}
/*****************************************************************************/
// cout<<tim<< " "<<endtime << " "<<epsilon<<" "<<I_ext<<" "<<gself<<" "<<tauR<<" "<<tauD<<endl;
//variables to determine the coupling coefficient of the electrical synapse
double v2Mod,v1Mod,v2Ref,v1Ref;
while (tim < endtime) {
for (int i = 0; i < NN; i++)
Input[i]->set_I(0);
if (tim > 200 ) {
for (int i = 0; i < 2; i++)
Input[i]->set_I(I_ext);
}
if (T[0].size()>=10 && bolrec==0)
{
Rec_Time=T[0][10-1];
// cout<<"Recorded this tim "<<Rec_Time<<endl;
bolrec=1;
}
if (Rec_Time!=0)
{
if (tim>Rec_Time+deltapulse && tim<Rec_Time+deltapulse+.5)
Input[2]->set_I(50);
if (tim>Rec_Time+deltapulse2 && tim<Rec_Time+deltapulse2+.5)
Input[2]->set_I(50);
}
for (int i = 0; i < NN; i++) {
HH_Run(&tim, neur[i], timestep);
TwoD_Run(&tim, slowself[i][i],neur[i]->x[0], timestep);
}
TwoD_Run(&tim, slowmutual[0][0],neur[2]->x[0], timestep);
if (tim > 200) {
for (int i = 0; i < NN; i++) {
spiketimes(&tim, &neur[i]->x[0], Threshold, bolneur[i], T[i]);
}
}
/*******************************************************/
count += 1;
// if (neur[0]->x[0]>0)
//OutFile1<<tim<<" "<<slowmutual[0][0]->Isyn()<<endl;
// OutFile1<<tim<<" "<<neur[0]->x[0]<<" "<<neur[1]->x[0]<<" "<<neur[2]->x[0]<<" "<<neur[3]->x[0]<<endl;
tim += epsilon;
}
//cout<<tim<<" "<<neur[0]->x[0]<<" "<<neur[1]->x[0]<<" "<<neur[2]->x[0]<<" "<<neur[3]->x[0]<<endl;
OutFile1.close();
OutFile.open((char *)PRCOut.c_str(),ios::out);
/*
v2Ref=neur[2]->x[0];
v1Ref=neur[1]->x[0];
double CS=(v1Mod-v1Ref)/(v2Mod-v2Ref);
OutFile<<gelectrical<<" "<<CS<<endl;
*/
/*
string gString=DoubleToStdStr(gmutual);
string Istring=DoubleToStdStr(I_ext);
string Deltastring=DoubleToStdStr(deltapulse);
string Store="PRC_B_"+Deltastring+".dat";
*/
int Sz=int(MIN(double(T[0].size()),double(T[1].size())));
double sum=0;
int countdiff=0;
for (int i=0;i<Sz;i++)
{
//cout<<T[1][i]<< " "<<T[0][i]<<" "<<T[1][i]-T[0][i]<<endl;
if (fabs(T[1][i]-T[0][i])>.001)
{
sum=sum+T[1][i]-T[0][i];
countdiff+=1;
}
}
double RefPeriod=T[0][T[0].size()-1]-T[0][T[0].size()-2];
double AsympPhase=T[1][Sz-1]-T[0][Sz-1];
OutFile.precision(10);
//OutFile<<I_ext<<" "<<RefPeriod<<endl;
//OutFile<<deltapulse<<" "<<T[1][10]-T[0][10]<<" "<<RefPeriod<<" "<<AsympPhase<<endl;
OutFile<<deltapulse<<" "<<T[1][10]-T[1][9]<<" "<<T[1][11]-T[1][10]<<" "<<T[1][12]-T[1][11]<<" "<<T[1][13]-T[1][12]<<" "<<RefPeriod<<" "<<AsympPhase<<endl;
//OutFile<<I_ext<<" "<<T[0][T[0].size()-1]-T[0][T[0].size()-2]<<endl;
cout.precision(4);
//cout<<I_ext<<" "<<T[0][20]-T[0][19]<<endl;
delete []ref_time;
delete []vnew;
delete []vold;
delete []bol;
delete []T;
delete *Input;
delete **slowself;
delete *neur;
delete []Input;
delete []neur;
delete []slowself;
OutFile.close();
return 0;
}