/* A code to get the IPSR (instantaneous population spike rate) for the constituent cells */ #include /* Standard header file for the Input and Output */ #include /* Standard library header file */ #include /* Math header file */ #include /* Header file for the IO on the console */ #define N 1000 /* No. of cells: The index of the array begins from i=1. --> The size of array is N+1. */ #define NOD 10000 /* No. of spikes in the input raster plot */ unsigned long int RKCNT; /* No. of calling the Runge-Kutta intergration routine FLOW() to avoid the calculation error in time */ int SN,TN,PN; int NOSi[N+1]; float Time,SPTime[N+1][20000]; float IISR[N+1],IPSR; float h,BW; char FINN[20],FOUTN[20]; FILE *FIN,*FOUT; /* General Routines */ void KDE(); /* A routine to obtain the individual and population spiking rate using the kernel density estimation */ float GaussKernel(float t); /* A routine to return value of the Gaussian kernel */ void main() { int i; /* Band width for the weighting function */ BW=10.; /* Calculation Conditions to obtain the raster plot: h: RK time interval, TN: Transient time to eliminate the transient behavior, PN: Plotting time. */ SN=10; h=1./SN; TN=0; PN=2000; /* Input names of input and output files, and open them */ printf("\n INPUT THE NAME OF THE INPUT FILE\n");scanf("%s",FINN); if((FIN = fopen(FINN,"r"))==NULL){printf("FILE OPEN ERROR...\n");exit(-1);} printf("\n INPUT THE NAME OF THE OUTPUT FILE\n");scanf("%s",FOUTN); if((FOUT = fopen(FOUTN,"w"))==NULL){printf("FILE OPEN ERROR...\n");exit(-1);} KDE(); fclose(FIN); fclose(FOUT); printf("<***** End *****>\n"); getche(); } /* A routine to obtain the individual and population spiking rate using the kernel density estimation */ void KDE() { int i,j,k,ni,tmpi; float ftmp,ftmp2; /* Initialize No. of spike per each neuron */ for(i=1;i<=N;i++) NOSi[i]=0; /* Read the spike time from the input raster plot */ for(i=1;i<=NOD;i++) { fscanf(FIN,"%f %d",&Time,&ni); NOSi[ni]=NOSi[ni]+1; SPTime[ni][NOSi[ni]]=Time; } /* Calculate the individual and population spiking rate kernel estimation */ for(i=1;i<=PN*SN;i++) { Time=((float)i+(float)TN*SN)*h; /* Calculate the individual spiking rate kernel estimation */ for(j=1;j<=N;j++) { IISR[j]=0.; /* Initialize */ for(k=1;k<=NOSi[j];k++) { if(SPTime[j][k]>(Time-TN)) { IISR[j]=IISR[j]+GaussKernel((Time-SPTime[j][k])/BW)/BW; } if(SPTime[j][k]>(Time+TN)) break; } IISR[j]=1000.*IISR[j]; /* 1000x: msec --> sec */ } /* Calculate the population spiking rate kernel estimation */ IPSR=0.; /* Initialize */ for(j=1;j<=N;j++) { IPSR=IPSR+IISR[j]; } IPSR=IPSR/N; fprintf(FOUT,"%12.8f %12.8f ",Time,IPSR); } } /* A routine to return value of the rectangular kernel */ float RectKernel(float t) { float KERNEL; if (fabs(t)<1.) KERNEL=0.5; else KERNEL=0.; return KERNEL; } /* A routine to return value of the triangular kernel */ float TriangKernel(float t) { float KERNEL; if (fabs(t)<1.) KERNEL=1.-fabs(t); else KERNEL=0.; return KERNEL; } /* A routine to return value of the Gaussian kernel */ float GaussKernel(float t) { float KERNEL; KERNEL=(1./sqrt(2.*M_PI))*exp(-t*t/2.); return KERNEL; }