/* This program simulates a firing rate model with four populations: */ /* T, R, E, I. Each population is represented by one variable u_alpha */ /* The equations may have delay. Lemniscal and paralemniscal pathways */ /* are considered. */ #include #include #include #include "nr.h" #include "tlp.h" #include "tplp.h" main(int argc, char*argv[]) { fl_st fl; cont_val cval; scan_val svam, sval; dat_str datstr; psth_str ps; int idatar; char suffix[3]="a1", file_name[30], line[Mline]; if (argc >= 2) strcpy(suffix,argv[1]); fl.in = fopen(strcat(strcpy(file_name,"tlp.n." ),suffix), "r"); fl.tmp = fopen(strcat(strcpy(file_name,"tlp.tmp."),suffix), "w+"); fl.out = fopen(strcat(strcpy(file_name,"tlp.out."),suffix), "w"); fl.col = fopen(strcat(strcpy(file_name,"tlp.col."),suffix), "w"); fl.nps = fopen("tlp.nps", "r"); fl.res = fopen(strcat(strcpy(file_name,"tlp.res."),suffix), "w"); fscanf(fl.in, "scan=%c\n", &sval.scan_type); fprintf(fl.out, "scan=%c\n", sval.scan_type); ps.npsth = 6; ps.nmeasure = 6; ps.psth_res = dmatrix(1, ps.npsth, 1, ps.nmeasure); if (sval.scan_type == 'n') /* no scan */ { fprintf(fl.col, "%c%c.1\n", suffix[0], suffix[1]); while (fgets(line, Mline, fl.in) != NULL) fprintf(fl.tmp, "%s", line); one_par(fl, sval.scan_type, &ps); fprintf(fl.col, "EOF\n"); } else if (sval.scan_type == 'e' || /* e - equal spacing */ sval.scan_type == 'u') { if (sval.scan_type == 'e') line_scan_equal_read(sval.par1, sval.par2, &sval.npt, &sval.parmin, &sval.parmax, &sval.npar, sval.par_ar, &sval.par_type, fl); else if (sval.scan_type == 'u') line_scan_unequal_read(sval.par1, sval.par2, &sval.npt, &sval.parmin, &sval.parmax, &sval.npar, sval.par_ar, &sval.par_type, fl); for (sval.ipar=0; sval.ipar <= sval.npar; sval.ipar++) { printf("ipar=%d npar=%d par=%lf\n", sval.ipar, sval.npar, sval.par_ar[sval.ipar]); if (sval.ipar > 0) fprintf(fl.col, "\n"); fprintf(fl.col, "%c%c.%d\n", suffix[0], suffix[1], sval.ipar+1); read_file_in(&datstr, sval.scan_type, fl); update_file(sval.par1, sval.par2, sval.npt, sval.par_type, sval.par_ar[sval.ipar], &datstr, fl); for (idatar=1; idatar<=datstr.n_datar; idatar++) fprintf(fl.tmp, "%s", datstr.datar[idatar]); one_par(fl, sval.scan_type, &ps); fprintf(fl.col, "EOF\n"); fflush(fl.col); fprintf(fl.out, "func_return\n"); prt_res(sval.par_ar[sval.ipar], sval.par_ar[sval.ipar], sval.scan_type, &ps, fl); } } else if (sval.scan_type == 't') /* t - two parameters */ { line_scan_equal_read(svam.par1, svam.par2, &svam.npt, &svam.parmin, &svam.parmax, &svam.npar, svam.par_ar, &svam.par_type, fl); line_scan_equal_read(sval.par1, sval.par2, &sval.npt, &sval.parmin, &sval.parmax, &sval.npar, sval.par_ar, &sval.par_type, fl); for (svam.ipar=0; svam.ipar <= svam.npar; svam.ipar++) { printf("m: ipar=%d npar=%d par=%lf\n", svam.ipar, svam.npar, svam.par_ar[svam.ipar]); for (sval.ipar=0; sval.ipar <= sval.npar; sval.ipar++) { update_and_run_two_par(&svam, &sval, &ps, fl); } } } else if (sval.scan_type == 'c') /* c - contour plot */ { fscanf(fl.in, "spsth=%d smeasure=%d valmin=%lf valmax=%lf nval=%d\n", &cval.spsth, &cval.smeasure, &cval.valmin, &cval.valmax, &cval.nval); fprintf(fl.out, "spsth=%d smeasure=%d valmin=%lf valmax=%lf nval=%d\n", cval.spsth, cval.smeasure, cval.valmin, cval.valmax, cval.nval); line_scan_equal_read(svam.par1, svam.par2, &svam.npt, &svam.parmin, &svam.parmax, &svam.npar, svam.par_ar, &svam.par_type, fl); line_scan_equal_read(sval.par1, sval.par2, &sval.npt, &sval.parmin, &sval.parmax, &sval.npar, sval.par_ar, &sval.par_type, fl); contour_plot_cal(&cval, &svam, &sval, &ps, fl); } else { printf("wrong scan_type=%c!!!\n", sval.scan_type); exit(0); } free_dmatrix(ps.psth_res, 1, ps.npsth, 1, ps.nmeasure); fclose(fl.in); fclose(fl.tmp); fclose(fl.out); fclose(fl.col); fclose(fl.nps); fclose(fl.res); } /* This function read the parameters for equal-spacing scan for one */ /* parameter */ void line_scan_equal_read(char par1[Mword], char par2[Mword], int *npt, double *parmin, double *parmax, int *npar, double par_ar[Mpar], char *par_type, fl_st fl) { int ipar; char line[Mline], *p1, par2all[Mword], *p2, *p3; fgets(line, Mline, fl.in); p1 = strtok(line, " "); sscanf(p1, " %s", par1); p1 = strtok(NULL, " "); sscanf(p1, " %s", par2all); if (strstr(par2all, ":") == NULL) { strcpy(par2, par2all); *npt = 1; } else { p3 = &par2[0]; for (p2 = &par2all[0]; *p2 != ':'; p2++) *p3++ = *p2; *p3 = '\0'; p2++; sscanf(p2, "%d", npt); } fprintf(fl.out, " par1=%s par2=%s npt=%d\n", par1, par2, *npt); p1 = strtok(NULL, " "); sscanf(p1, "parmin=%lf", parmin); p1 = strtok(NULL, " "); sscanf(p1, "parmax=%lf", parmax); p1 = strtok(NULL, " "); sscanf(p1, "npar=%d", npar); fprintf(fl.out, " parmin=%lf parmax=%lf npar=%d\n", *parmin, *parmax, *npar); *par_type = 'r'; /* assuming a real parameter */ if (*npar == 0) { par_ar[0] = *parmin; } else { for (ipar=0; ipar<=*npar; ipar++) { par_ar[ipar] = *parmin + (*parmax - *parmin) * ipar / *npar; } } for (ipar=0; ipar<=*npar; ipar++) fprintf(fl.out, "ipar=%d par_ar=%lf\n", ipar, par_ar[ipar]); } /* This function read the parameters for unequal-spacing scan for one */ /* parameter */ void line_scan_unequal_read(char par1[Mword], char par2[Mword], int *npt, double *parmin, double *parmax, int *npar, double par_ar[Mpar], char *par_type, fl_st fl) { int ipar; char line[Mline], *p1, par2all[Mword], *p2, *p3; fgets(line, Mline, fl.in); p1 = strtok(line, " "); sscanf(p1, " %s", par1); p1 = strtok(NULL, " "); sscanf(p1, " %s", par2all); if (strstr(par2all, ":") == NULL) { strcpy(par2, par2all); *npt = 1; } else { p3 = &par2[0]; for (p2 = &par2all[0]; *p2 != ':'; p2++) *p3++ = *p2; *p3 = '\0'; p2++; sscanf(p2, "%d", npt); } *par_type = 'r'; /* assuming a real parameter */ ipar=-1; while((p1 = strtok(NULL, " ")) != NULL) { sscanf(p1, "%lf", &par_ar[++ipar]); } *npar = ipar; fprintf(fl.out, "\n"); for (ipar=0; ipar <= *npar; ipar++) fprintf(fl.out, "ipar=%d par_ar=%lf\n", ipar, par_ar[ipar]); } /* This function reads the input file into an array of strings */ void read_file_in(dat_str *datstr, char scan_type, fl_st fl) { char line[Mline]; int idat, nscan, iscan; rewind(fl.in); if (scan_type == 'n') nscan = 1; else if (scan_type == 'e' || scan_type == 'u') nscan = 2; else if (scan_type == 't') nscan = 3; else if (scan_type == 'c') nscan = 4; for (iscan=1; iscan<=nscan; iscan++) fgets(line, Mline, fl.in); idat = 0; while (fgets(datstr->datar[++idat], Mline, fl.in) != NULL) { } datstr->n_datar = idat - 1; } /* This function updates the input file and write the new parameter */ /* value(s) */ void update_file(char *par1, char *par2, int npt, char par_type, double par_ar, dat_str *datstr, fl_st fl) { int nget, nget1, nchange, idatar; char line[Mline]; printf("par1=%s\n", par1); if (strcmp(par1, "ALL") == 0) { /* scanning - multiplying all the occurrences of the specific */ /* parameter value */ nchange=0; for (idatar=1; idatar<=datstr->n_datar; idatar++) { if (process_line(par1, par2, npt, par_type, par_ar, datstr->datar[idatar], fl.tmp)) nchange++; } } else { /* scanning - changing the specific parameter value */ nget=0; for (idatar=1; idatar<=datstr->n_datar; idatar++) { nget++; if (strncmp(datstr->datar[idatar], par1, strlen(par1)) == 0) break; } if (nget == datstr->n_datar) { printf("par1=%s not found!!!\n", par1); exit(0); } nget1 = nget+1; for (idatar=nget1; idatar<=datstr->n_datar; idatar++) { nget++; if (process_line(par1, par2, npt, par_type, par_ar, datstr->datar[idatar], fl.tmp)) break; } /* checking for end of file */ if (nget >= datstr->n_datar) { printf("match not found!!!\n"); exit(0); } } rewind(fl.tmp); return; } /* This function processes one line and relplace a value by sval.par2 or */ /* multiplies it by sval->par2 */ int process_line(char *par1, char *par2, int npt, char par_type, double par_ar, char line[], FILE *ftmp) { double par_ref, eps; int il, il_end, im, ipt, iw, len; int cond1, cond2, cond3; char *pline, word[Mword], newline[Mdatcol], auxline[Mdatcol]; eps = 1.0e-10; for (il=0; il<=Mdatcol-1; il++) newline[il] = '\0'; il_end = -1; /* while (line[il_end+1] != '\n' && il_end < Mline-2) il_end++; */ len = strlen(line); il_end = len - 2; pline = line; il = -1; while (++il <= il_end) { /* Condition: matched pattern, '=' at the end, ' ' or beginning of */ /* line at the beginning */ cond1 = strncmp(pline+il, par2, strlen(par2)) == 0; cond2 = line[il + strlen(par2)] == '='; if (il == 0) cond3 = 1; else cond3 = line[il - 1] == ' '; if (cond1 && cond2 && cond3) break; } if (il >= il_end-1) /* par2 does not appear in line */ { return(0); } else /* par2 appears in line */ { strncpy(newline, line, il); for(im=0; imepsilon = 1.0e-10; netpar->nvar = 18; netpar->npop = 7; /* reading the input data */ fscanf(fl.tmp, "INPUT pstim=%c rstim=%c nnts=%d PLtshift=%lf\n", &netpar->pstim, &netpar->rstim, &netpar->nnts, &netpar->PLtshift); fprintf(fl.out, "INPUT pstim=%c rstim=%c nnts=%d PLtshift=%lf\n", netpar->pstim, netpar->rstim, netpar->nnts, netpar->PLtshift); create_stimulus_array(netpar, runpar, fl); netpar->ints = 1; netpar->ts[0] = 0; for (ints=1; ints<=netpar->nnts; ints++) { fscanf(fl.tmp, "nts=%d ts=%lf ff=%lf alphap=%lf\n", &nts, &netpar->ts[ints], &netpar->ff[ints], &netpar->alphap[ints]); if (nts != ints) { printf("nts=%d != ints=%d\n", nts, ints); exit(0); } netpar->ts[ints] += netpar->ts[ints-1]; fprintf(fl.out, "nts=%d ts=%lf ff=%lf alphap=%lf\n", nts, netpar->ts[ints], netpar->ff[ints], netpar->alphap[ints]); if (netpar->rstim == 'r') { one_stim_read("LT", ints, &netpar->LT, netpar->ff[ints], fl); } else if (netpar->rstim == 'c') { one_stim_calculate("LT", ints, &netpar->LT, netpar->ff[ints], fl); } else if (netpar->rstim == 'w') { one_stim_width("LT", ints, &netpar->LT, netpar->ff[ints], fl); } else if (netpar->rstim == 'n') { one_stim_rune("LT", ints, &netpar->LT, netpar->ff[ints], fl); } else { printf("rstim=%c should be r or c or w or n !\n", netpar->rstim); exit(0); } one_stim_write("LT", ints, &netpar->LT, fl); if (netpar->pstim == 'i') { if (netpar->rstim == 'r') one_stim_read("PT", ints, &netpar->PT, netpar->ff[ints], fl); else if (netpar->pstim == 'c') one_stim_calculate("PT", ints, &netpar->PT, netpar->ff[ints], fl); else if (netpar->pstim == 'w') one_stim_width("PT", ints, &netpar->PT, netpar->ff[ints], fl); else if (netpar->pstim == 'n') one_stim_rune("PT", ints, &netpar->PT, netpar->ff[ints], fl); } else if (netpar->pstim == 'p') { LT_to_PT_stim_copy(ints, &netpar->LT, &netpar->PT, netpar->alphap[ints], netpar->PLtshift, fl); } else { printf("wrong pstim=%c\n", netpar->pstim); exit(0); } one_stim_write("PT", ints, &netpar->PT, fl); } fscanf(fl.tmp, "CELLULAR\n"); fscanf(fl.tmp, "admodel=%d sigmaa=%lf\n", &netpar->admodel, &netpar->sigmaa); fscanf(fl.tmp, "LT: gL=%lf VL=%lf VK=%lf Vthr=%lf taut=%lf fgb=%lf fst=%lf" "\n", &netpar->LT.gL, &netpar->LT.VL, &netpar->LT.VK, &netpar->LT.Vthr, &netpar->LT.taut, &netpar->LT.fgb, &netpar->LT.fst); fscanf(fl.tmp, " thetaa=%lf sadapt=%lf tau_act_del=%lf\n", &netpar->LT.thetaa, &netpar->LT.sadapt, &netpar->LT.tau_act_del); fscanf(fl.tmp, " tauact=%lf taudeact=%lf rauact=%lf raudeact=%lf\n", &netpar->LT.tauact, &netpar->LT.taudeact, &netpar->LT.rauact, &netpar->LT.raudeact); fscanf(fl.tmp, "PT: gL=%lf VL=%lf VK=%lf Vthr=%lf taut=%lf fgb=%lf fst=%lf" "\n", &netpar->PT.gL, &netpar->PT.VL, &netpar->PT.VK, &netpar->PT.Vthr, &netpar->PT.taut, &netpar->PT.fgb, &netpar->PT.fst); fscanf(fl.tmp, " thetaa=%lf sadapt=%lf tau_act_del=%lf\n", &netpar->PT.thetaa, &netpar->PT.sadapt, &netpar->PT.tau_act_del); fscanf(fl.tmp, " tauact=%lf taudeact=%lf rauact=%lf raudeact=%lf\n", &netpar->PT.tauact, &netpar->PT.taudeact, &netpar->PT.rauact, &netpar->PT.raudeact); fscanf(fl.tmp, "R: taut=%lf\n", &netpar->R.taut); fscanf(fl.tmp, "KINETICS\n"); fscanf(fl.tmp, "AMPA: tau2=%lf\n", &netpar->AMPA.tau2); fscanf(fl.tmp, "NMDA: tau2=%lf\n", &netpar->NMDA.tau2); fscanf(fl.tmp, "GABAA: tau2=%lf\n", &netpar->GABAA.tau2); fscanf(fl.tmp, "GABAB: tau1=%lf tau2=%lf power=%lf\n", &netpar->GABAB.tau1, &netpar->GABAB.tau2, &netpar->GABAB.power); fscanf(fl.tmp, "SYNAPTIC STRENGTHS AND DELAYS\n"); fscanf(fl.tmp, "LT: theta=%lf (g,td) lep=%lf %lf ra=%lf %lf rb=%lf %lf\n", &netpar->LT.theta, &netpar->LT.lep.g, &netpar->LT.lep.td, &netpar->LT.ra.g, &netpar->LT.ra.td, &netpar->LT.rb.g, &netpar->LT.rb.td); fscanf(fl.tmp, "LE: theta=%lf (g,td) ltp=%lf %lf lia=%lf %lf\n", &netpar->LE.theta, &netpar->LE.ltp.g, &netpar->LE.ltp.td, &netpar->LE.lia.g, &netpar->LE.lia.td); fscanf(fl.tmp, "LI: theta=%lf (g,td) ltp=%lf %lf lep=%lf %lf\n", &netpar->LI.theta, &netpar->LI.ltp.g, &netpar->LI.ltp.td, &netpar->LI.lep.g, &netpar->LI.lep.td); /* rb -> xrb */ fscanf(fl.tmp, "PT: theta=%lf (g,td) pep=%lf %lf ra=%lf %lf rb=%lf %lf\n", &netpar->PT.theta, &netpar->PT.pep.g, &netpar->PT.pep.td, &netpar->PT.ra.g, &netpar->PT.ra.td, &netpar->PT.rb.g, &netpar->PT.rb.td); fscanf(fl.tmp, "PE: theta=%lf (g,td) ptp=%lf %lf pia=%lf %lf\n", &netpar->PE.theta, &netpar->PE.ptp.g, &netpar->PE.ptp.td, &netpar->PE.pia.g, &netpar->PE.pia.td); fscanf(fl.tmp, "PI: theta=%lf (g,td) ptp=%lf %lf pep=%lf %lf\n", &netpar->PI.theta, &netpar->PI.ptp.g, &netpar->PI.ptp.td, &netpar->PI.pep.g, &netpar->PI.pep.td); fscanf(fl.tmp, "R: theta=%lf (g,td) ltp=%lf %lf lep=%lf %lf ptp=%lf %lf \n", &netpar->R.theta, &netpar->R.ltp.g, &netpar->R.ltp.td, &netpar->R.lep.g, &netpar->R.lep.td, &netpar->R.ptp.g, &netpar->R.ptp.td); fscanf(fl.tmp, "GENERAL\n"); fscanf(fl.tmp, "deltat=%lf nt=%d\n", &runpar->deltat, &runpar->nt); fscanf(fl.tmp, "twrite=%d tmcol=%d\n", &runpar->twrite, &runpar->tmcol); fscanf(fl.tmp, "method=%c smforce=%c\n", &runpar->method, &runpar->smforce); fscanf(fl.tmp, "nwritev=%d nwritevar=", &runpar->nwritev); runpar->nwritevar = ivector(1, runpar->nwritev); for (ivar=1; ivar<=runpar->nwritev; ivar++) fscanf(fl.tmp, "%d ", &runpar->nwritevar[ivar]); fscanf(fl.tmp, "nwritep=%d nwritepar=", &runpar->nwritep); runpar->nwritepar = ivector(1, runpar->nwritep); for (ipop=1; ipop<=runpar->nwritep-1; ipop++) fscanf(fl.tmp, "%d ", &runpar->nwritepar[ipop]); if (runpar->nwritep >= 1) fscanf(fl.tmp, "%d", &runpar->nwritepar[runpar->nwritep]); fscanf(fl.tmp, "\n"); /* printing the input data */ fprintf(fl.out, "CELLULAR\n"); fprintf(fl.out, "admodel=%d sigmaa=%lf\n", netpar->admodel, netpar->sigmaa); fprintf(fl.out, "LT: gL=%lf VL=%lf VK=%lf Vthr=%lf taut=%lf fgb=%lf fst=%lf" "\n", netpar->LT.gL, netpar->LT.VL, netpar->LT.VK, netpar->LT.Vthr, netpar->LT.taut, netpar->LT.fgb, netpar->LT.fst); fprintf(fl.out, " thetaa=%lf sadapt=%lf tau_act_del=%lf\n", netpar->LT.thetaa, netpar->LT.sadapt, netpar->LT.tau_act_del); fprintf(fl.out, " tauact=%lf taudeact=%lf rauact=%lf raudeact=%lf\n", netpar->LT.tauact, netpar->LT.taudeact, netpar->LT.rauact, netpar->LT.raudeact); fprintf(fl.out, "PT: gL=%lf VL=%lf VK=%lf Vthr=%lf taut=%lf fgb=%lf fst=%lf" "\n", netpar->PT.gL, netpar->PT.VL, netpar->PT.VK, netpar->PT.Vthr, netpar->PT.taut, netpar->PT.fgb, netpar->PT.fst); fprintf(fl.out, " thetaa=%lf sadapt=%lf tau_act_del=%lf\n", netpar->PT.thetaa, netpar->PT.sadapt, netpar->PT.tau_act_del); fprintf(fl.out, " tauact=%lf taudeact=%lf rauact=%lf raudeact=%lf\n", netpar->PT.tauact, netpar->PT.taudeact, netpar->PT.rauact, netpar->PT.raudeact); fprintf(fl.out, "R: taut=%lf\n", netpar->R.taut); fprintf(fl.out, "KINETICS\n"); fprintf(fl.out, "AMPA: tau2=%lf\n", netpar->AMPA.tau2); fprintf(fl.out, "NMDA: tau2=%lf\n", netpar->NMDA.tau2); fprintf(fl.out, "GABAA: tau2=%lf\n", netpar->GABAA.tau2); fprintf(fl.out, "GABAB: tau1=%lf tau2=%lf power=%lf\n", netpar->GABAB.tau1, netpar->GABAB.tau2, netpar->GABAB.power); fprintf(fl.out, "SYNAPTIC STRENGTHS AND DELAYS\n"); fprintf(fl.out, "LT: theta=%lf (g,td) lep=%lf %lf ra=%lf %lf\n " "rb=%lf %lf\n", netpar->LT.theta, netpar->LT.lep.g, netpar->LT.lep.td, netpar->LT.ra.g, netpar->LT.ra.td, netpar->LT.rb.g, netpar->LT.rb.td); fprintf(fl.out, "LE: theta=%lf (g,td) ltp=%lf %lf lia=%lf %lf\n", netpar->LE.theta, netpar->LE.ltp.g, netpar->LE.ltp.td, netpar->LE.lia.g, netpar->LE.lia.td); fprintf(fl.out, "LI: theta=%lf (g,td) ltp=%lf %lf lep=%lf %lf\n", netpar->LI.theta, netpar->LI.ltp.g, netpar->LI.ltp.td, netpar->LI.lep.g, netpar->LI.lep.td); fprintf(fl.out, "PT: theta=%lf (g,td) pep=%lf %lf ra=%lf %lf\n " "rb=%lf %lf\n", netpar->PT.theta, netpar->PT.pep.g, netpar->PT.pep.td, netpar->PT.ra.g, netpar->PT.ra.td, netpar->PT.rb.g, netpar->PT.rb.td); fprintf(fl.out, "PE: theta=%lf (g,td) ptp=%lf %lf pia=%lf %lf\n", netpar->PE.theta, netpar->PE.ptp.g, netpar->PE.ptp.td, netpar->PE.pia.g, netpar->PE.pia.td); fprintf(fl.out, "PI: theta=%lf (g,td) ptp=%lf %lf pep=%lf %lf\n", netpar->PI.theta, netpar->PI.ptp.g, netpar->PI.ptp.td, netpar->PI.pep.g, netpar->PI.pep.td); fprintf(fl.out, "R : theta=%lf (g,td) ltp=%lf %lf lep=%lf %lf\n " "ptp=%lf %lf\n", netpar->R.theta, netpar->R.ltp.g, netpar->R.ltp.td, netpar->R.lep.g, netpar->R.lep.td, netpar->R.ptp.g, netpar->R.ptp.td); fprintf(fl.out, "GENERAL\n"); fprintf(fl.out, "deltat=%lf nt=%d\n", runpar->deltat, runpar->nt); fprintf(fl.out, "twrite=%d tmcol=%d\n", runpar->twrite, runpar->tmcol); fprintf(fl.out, "method=%c smforce=%c\n", runpar->method, runpar->smforce); fprintf(fl.out,"nwritev=%d nwritevar=", runpar->nwritev); for (ivar=1; ivar<=runpar->nwritev; ivar++) fprintf(fl.out,"%d ", runpar->nwritevar[ivar]); fprintf(fl.out,"nwritep=%d nwritepar=", runpar->nwritep); for (ipop=1; ipop<=runpar->nwritep-1; ipop++) fprintf(fl.out,"%d ", runpar->nwritepar[ipop]); if (runpar->nwritep >= 1) fprintf(fl.out,"%d", runpar->nwritepar[runpar->nwritep]); fprintf(fl.out, "\n"); fprintf(fl.out, "ts[nnts]=%lf Time=%lf\n", netpar->ts[netpar->nnts], runpar->deltat * runpar->nt); if (netpar->ts[netpar->nnts] + runpar->epsilon < runpar->deltat * runpar->nt) { printf("tsn=%lf < Time=%lf\n", netpar->ts[netpar->nnts], runpar->deltat * runpar->nt); exit(0); } fprintf(fl.out, "\n"); fflush(fl.out); } /* This function reads parameters for one stimulus for one nucleus */ void one_stim_read(char *xTch, int nts, syn_strength_delay *xT, double ff, fl_st fl) { char prstr[50], itstim, ii; strcat(strcpy(prstr, xTch),": ntstim=%d"); fscanf(fl.tmp, prstr, &xT->ntstim[nts]); xT->tstim[nts] = dvector(0, xT->ntstim[nts]+1); xT->Ix[nts] = dvector(0, xT->ntstim[nts]+1); xT->tstim[nts][0] = 0.0; xT->tstim[nts][xT->ntstim[nts]+1] = 1000.0 / ff; fscanf(fl.tmp, " tstim=%lf", &xT->tstim[nts][1]); for (itstim=2; itstim<=xT->ntstim[nts]; itstim++) fscanf(fl.tmp, " %lf", &xT->tstim[nts][itstim]); fscanf(fl.tmp, "\n"); xT->Ix[nts][0] = 0.0; xT->Ix[nts][xT->ntstim[nts]+1] = 0.0; fscanf(fl.tmp, " Ix=%lf", &xT->Ix[nts][1]); for (itstim=2; itstim<=xT->ntstim[nts]; itstim++) fscanf(fl.tmp, " %lf", &xT->Ix[nts][itstim]); fscanf(fl.tmp, "\n"); } /* This function calculates parameters for one stimulus for one nucleus */ void one_stim_calculate(char *xTch, int nts, syn_strength_delay *xT, double ff, fl_st fl) { char prstr[50], itstim, ii; strcat(strcpy(prstr, xTch),": ntstim=%d"); fscanf(fl.tmp, prstr, &xT->ntstim[nts]); xT->tstim[nts] = dvector(0, xT->ntstim[nts]+1); xT->Ix[nts] = dvector(0, xT->ntstim[nts]+1); xT->tstim[nts][0] = 0.0; xT->tstim[nts][xT->ntstim[nts]+1] = 1000.0 / ff; fscanf(fl.tmp, " tstim=%lf", &xT->tstim[nts][1]); for (itstim=2; itstim<=xT->ntstim[nts]; itstim++) fscanf(fl.tmp, " %lf", &xT->tstim[nts][itstim]); fscanf(fl.tmp, "\n"); xT->Ix[nts][0] = 0.0; xT->Ix[nts][xT->ntstim[nts]+1] = 0.0; fscanf(fl.tmp, " slope=%lf Ix=%lf", &xT->slope, &xT->Ix[nts][1]); for (itstim=2; itstim<=xT->ntstim[nts]; itstim++) fscanf(fl.tmp, " %lf", &xT->Ix[nts][itstim]); fscanf(fl.tmp, "\n"); xT->Ix[nts][2] = xT->Ix[nts][1] + xT->slope * (xT->tstim[nts][2] - xT->tstim[nts][1]); } /* This function calculates parameters for one stimulus for one nucleus */ /* using the width. */ void one_stim_width(char *xTch, int nts, syn_strength_delay *xT, double ff, fl_st fl) { double twidth, height, tdecay; char prstr[50], itstim, ii; strcat(strcpy(prstr, xTch),": ntstim=%d"); fscanf(fl.tmp, prstr, &xT->ntstim[nts]); xT->tstim[nts] = dvector(0, xT->ntstim[nts]+1); xT->Ix[nts] = dvector(0, xT->ntstim[nts]+1); xT->tstim[nts][0] = 0.0; xT->tstim[nts][xT->ntstim[nts]+1] = 1000.0 / ff; fscanf(fl.tmp, " tstim=%lf", &xT->tstim[nts][1]); for (itstim=2; itstim<=xT->ntstim[nts]; itstim++) fscanf(fl.tmp, " %lf", &xT->tstim[nts][itstim]); fscanf(fl.tmp, "\n"); xT->Ix[nts][0] = 0.0; xT->Ix[nts][xT->ntstim[nts]+1] = 0.0; fscanf(fl.tmp, " width=%lf Ix=%lf", &xT->width, &xT->Ix[nts][1]); for (itstim=2; itstim<=xT->ntstim[nts]; itstim++) fscanf(fl.tmp, " %lf", &xT->Ix[nts][itstim]); fscanf(fl.tmp, "\n"); twidth = xT->width * (xT->tstim[nts][3] - xT->tstim[nts][2]); height = xT->Ix[nts][2] + (xT->Ix[nts][3] - xT->Ix[nts][2]) * xT->width; tdecay = (xT->tstim[nts][4] - xT->tstim[nts][3]); fprintf(fl.out, "width=%lf twidth=%lf height=%lf tdecay=%lf\n", xT->width, twidth, height, tdecay); xT->tstim[nts][3] = xT->tstim[nts][2] + twidth; xT->Ix[nts][3] = height; xT->tstim[nts][4] = xT->tstim[nts][3] + xT->width * tdecay; } /* This function calculates parameters for one stimulus for one nucleus */ /* using the rune parametrization. */ void one_stim_rune(char *xTch, int nts, syn_strength_delay *xT, double ff, fl_st fl) { double TT, Tup; char prstr[50], itstim, ii; strcat(strcpy(prstr, xTch),": ntstim=%d"); fscanf(fl.tmp, prstr, &xT->ntstim[nts]); xT->tstim[nts] = dvector(0, xT->ntstim[nts]+1); xT->Ix[nts] = dvector(0, xT->ntstim[nts]+1); xT->tstim[nts][0] = 0.0; TT = xT->tstim[nts][xT->ntstim[nts]+1] = 1000.0 / ff; fscanf(fl.tmp, " tstim=%lf", &xT->tstim[nts][1]); for (itstim=2; itstim<=xT->ntstim[nts]; itstim++) fscanf(fl.tmp, " %lf", &xT->tstim[nts][itstim]); fscanf(fl.tmp, "\n"); xT->Ix[nts][0] = 0.0; xT->Ix[nts][xT->ntstim[nts]+1] = 0.0; fscanf(fl.tmp, " Ix=%lf", &xT->width, &xT->Ix[nts][1]); for (itstim=2; itstim<=xT->ntstim[nts]; itstim++) fscanf(fl.tmp, " %lf", &xT->Ix[nts][itstim]); fscanf(fl.tmp, "\n"); Tup = TT - 41.0; fprintf(fl.out, "Tup=%lf\n", Tup); xT->tstim[nts][3] = xT->tstim[nts][2] + Tup; xT->tstim[nts][4] = xT->tstim[nts][3] + 11.0; } /* This function copies parameters for one stimulus from LT to PT */ void LT_to_PT_stim_copy(int nts, syn_strength_delay *LT, syn_strength_delay *PT, double alphap, double PLtshift, fl_st fl) { int itstim; PT->ntstim[nts] = LT->ntstim[nts]; PT->tstim[nts] = dvector(0, PT->ntstim[nts]+1); PT->Ix[nts] = dvector(0, PT->ntstim[nts]+1); for (itstim=0; itstim<=PT->ntstim[nts]+1; itstim++) { PT->tstim[nts][itstim] = LT->tstim[nts][itstim]; PT->Ix[nts][itstim] = alphap * LT->Ix[nts][itstim]; } for (itstim=1; itstim<=PT->ntstim[nts]; itstim++) { PT->tstim[nts][itstim] += PLtshift; } } /* This function writes parameters for one stimulus for one nucleus */ void one_stim_write(char *xTch, int nts, syn_strength_delay *xT, fl_st fl) { char prstr[50], itstim; strcat(strcpy(prstr, xTch),": ntstim=%d tstim=%lf"); fprintf(fl.out, prstr, xT->ntstim[nts], xT->tstim[nts][0]); for (itstim=1; itstim<=xT->ntstim[nts]+1; itstim++) fprintf(fl.out, " %lf", xT->tstim[nts][itstim]); fprintf(fl.out, "\n"); fprintf(fl.out, " Ix=%lf", xT->Ix[nts][0]); for (itstim=1; itstim<=xT->ntstim[nts]+1; itstim++) fprintf(fl.out, " %lf", xT->Ix[nts][itstim]); fprintf(fl.out, "\n"); } /* This function determines the value of sm, that control printing detailed */ /* results */ void determine_sm(run_par *runpar, char scan_type, fl_st fl) { /* controlling the printing of trajectory */ if (runpar->smforce == 'p') runpar->sm = 0; /* detailed printing */ else if (runpar->smforce == 'n') runpar->sm = 1; /* no detailed printing */ else if (runpar->smforce == 'l') { if (scan_type == 'n') /* no scan */ runpar->sm = 0; /* detailed printing */ else if (scan_type == 'e' || /* e - equal spacing */ scan_type == 'u' || /* u - unequal spacing */ scan_type == 't' || /* t - two parameters */ scan_type == 'c') /* c - contour plot */ runpar->sm = 1; /* no detailed printing */ } else { printf("wrong sm=%c!\n", runpar->sm); exit(0); } fprintf(fl.out, "sm=%d\n", runpar->sm); } /* This function find the maximal delay value */ void find_max_delay(net_par *netpar, run_par *runpar, fl_st fl) { double max_delay, xx; max_delay = 0.0; if ((xx=netpar->LT.lep.td) > max_delay) max_delay = xx; if ((xx=netpar->LT.ra.td ) > max_delay) max_delay = xx; if ((xx=netpar->LT.rb.td ) > max_delay) max_delay = xx; if ((xx=netpar->LT.tau_act_del) > max_delay) max_delay = xx; if ((xx=netpar->LE.ltp.td) > max_delay) max_delay = xx; if ((xx=netpar->LE.lia.td) > max_delay) max_delay = xx; if ((xx=netpar->LI.ltp.td) > max_delay) max_delay = xx; if ((xx=netpar->LI.lep.td) > max_delay) max_delay = xx; if ((xx=netpar->PT.pep.td) > max_delay) max_delay = xx; if ((xx=netpar->PT.ra.td ) > max_delay) max_delay = xx; if ((xx=netpar->PT.rb.td ) > max_delay) max_delay = xx; if ((xx=netpar->PT.tau_act_del) > max_delay) max_delay = xx; if ((xx=netpar->PE.ptp.td) > max_delay) max_delay = xx; if ((xx=netpar->PE.pia.td) > max_delay) max_delay = xx; if ((xx=netpar->PI.ptp.td) > max_delay) max_delay = xx; if ((xx=netpar->PI.pep.td) > max_delay) max_delay = xx; if ((xx=netpar->R.ltp.td) > max_delay) max_delay = xx; if ((xx=netpar->R.lep.td) > max_delay) max_delay = xx; if ((xx=netpar->R.ptp.td) > max_delay) max_delay = xx; runpar->max_delay = max_delay; runpar->nstore = (int) ((runpar->max_delay / runpar->deltat) + runpar->epsilon); fprintf(fl.out, "max_delay=%lf nstore=%d\n", runpar->max_delay, runpar->nstore); } /* This function calculates ndt = delay / deltat for all the delay values */ void calculate_ntd(net_par *netpar, run_par *runpar, fl_st fl) { fprintf(fl.out, "\nntd\n"); ntd_cal(&netpar->LT.lep, "LT.lep", runpar, fl); ntd_cal(&netpar->LT.lep, "LT.lep", runpar, fl); ntd_cal(&netpar->LT.ra , "LT.ra" , runpar, fl); ntd_cal(&netpar->LT.rb , "LT.rb" , runpar, fl); fprintf(fl.out, "\n"); ntd_cal(&netpar->LE.ltp, "LE.ltp", runpar, fl); ntd_cal(&netpar->LE.lia, "LE.lia", runpar, fl); fprintf(fl.out, "\n"); ntd_cal(&netpar->LI.ltp, "LI.ltp", runpar, fl); ntd_cal(&netpar->LI.lep, "LI.lep", runpar, fl); fprintf(fl.out, "\n"); ntd_cal(&netpar->PT.pep, "PT.pep", runpar, fl); ntd_cal(&netpar->PT.pep, "PT.pep", runpar, fl); ntd_cal(&netpar->PT.ra, "PT.ra" , runpar, fl); ntd_cal(&netpar->PT.rb, "PT.rb" , runpar, fl); fprintf(fl.out, "\n"); ntd_cal(&netpar->PE.ptp, "PE.ptp", runpar, fl); ntd_cal(&netpar->PE.pia, "PE.pia", runpar, fl); fprintf(fl.out, "\n"); ntd_cal(&netpar->PI.ptp, "PI.ptp", runpar, fl); ntd_cal(&netpar->PI.pep, "PI.pep", runpar, fl); fprintf(fl.out, "\n"); ntd_cal(&netpar->R.ltp , "R.ltp", runpar, fl); ntd_cal(&netpar->R.lep , "R.lep", runpar, fl); ntd_cal(&netpar->R.ptp , "R.ptp", runpar, fl); fprintf(fl.out, "\n"); netpar->LT.ntd_act_del = (int) ((netpar->LT.tau_act_del + runpar->epsilon) / runpar->deltat); fprintf(fl.out, "LT.ntd_act_del=%d\n", netpar->LT.ntd_act_del); netpar->PT.ntd_act_del = (int) ((netpar->PT.tau_act_del + runpar->epsilon) / runpar->deltat); fprintf(fl.out, "PT.ntd_act_del=%d\n", netpar->PT.ntd_act_del); fprintf(fl.out, "\n\n"); } /* This function assigns names to the variables */ void assign_var_name(var_name *varname, fl_st fl) { /* lemniscal system */ varname->iltv = 1; varname->iltb = 17; varname->ilta = 2; varname->ilti = 3; varname->iltp = 4; varname->ilep = 5; varname->ilia = 6; /* paralemniscal system */ varname->iptv = 7; varname->ipta = 8; varname->iptb = 18; varname->ipti = 9; varname->iptp = 10; varname->ipep = 11; varname->ipia = 12; /* RE */ varname->iri = 13; varname->ira = 14; varname->jrb = 15; varname->irb = 16; /* M */ varname->MLT = 1; varname->MLE = 2; varname->MLI = 3; varname->MPT = 4; varname->MPE = 5; varname->MPI = 6; varname->MR = 7; } /* This functuon substitutes the initial conditions */ void in_con(net_par *netpar, run_par *runpar, var_name *varname, double **Varbar, fl_st fl) { int ivar, istore; for (ivar=1; ivar<=netpar->nvar; ivar++) { for (istore=0; istore<=runpar->nstore; istore++) { Varbar[ivar][istore] = 0.0; } } /* adaptation variables are set to 0 */ /* for (istore=0; istore<=runpar->nstore; istore++) Varbar[varname->ilta][istore] = 0.0; for (istore=0; istore<=runpar->nstore; istore++) Varbar[varname->ipta][istore] = 0.0; */ /* "voltages" are set to -70 mV */ for (istore=0; istore<=runpar->nstore; istore++) Varbar[varname->iltv][istore] = -70.0; for (istore=0; istore<=runpar->nstore; istore++) Varbar[varname->iptv][istore] = -70.0; } /* This function solves the delay differential equations */ void n_run(net_par *netpar, run_par *runpar, var_name *varname, double **Varbar, save_str *sv, fl_st fl) { double *k0, *k1, *k2, *k3, *k4, *Vnew, *Mar; double time; int it, ivar, ipop, sptr_new; runpar->sptr = 0; k0 = dvector(1, netpar->nvar); k1 = dvector(1, netpar->nvar); k2 = dvector(1, netpar->nvar); Vnew = dvector(1, netpar->nvar); Mar = dvector(1, netpar->npop); for (ivar=1; ivar<=netpar->nvar; ivar++) k0[ivar] = 0.0; for (ipop=1; ipop<=netpar->npop; ipop++) Mar[ipop] = 0.0; it = 0; time = 0.0; pr_fct(netpar, runpar, varname, Varbar, Mar, time, it, sv, fl); while ((++it) <= runpar->nt) { time = it * runpar->deltat; if (time > netpar->ts[netpar->ints] + runpar->epsilon) { netpar->ints++; fprintf(fl.out, "it=%d time=%lf ints=%d\n", it, time, netpar->ints); if (netpar->ints > netpar->nnts) { printf("ints=%s > nnts=%d!\n", netpar->ints, netpar->nnts); exit(0); } } sptr_new = runpar->sptr - 1; if (sptr_new < 0) sptr_new = runpar->nstore; if (runpar->method =='e') /* Euler method */ { one_integration_step(netpar, runpar, varname, Varbar, k0, k1, 0.0, it, time, Vnew, Mar, fl); for (ivar=1; ivar<=netpar->nvar; ivar++) Varbar[ivar][sptr_new] = Varbar[ivar][runpar->sptr] + runpar->deltat * k1[ivar]; } runpar->sptr = sptr_new; if ( !(it%runpar->twrite) && (it >= runpar->nt-runpar->tmcol)) pr_fct(netpar, runpar, varname, Varbar, Mar, time, it, sv, fl); } free_dvector(k0, 1, netpar->nvar); free_dvector(k1, 1, netpar->nvar); free_dvector(k2, 1, netpar->nvar); free_dvector(Vnew, 1, netpar->nvar); free_dvector(Mar, 1, netpar->npop); } /* RKS, Euler method */ void one_integration_step(net_par *netpar, run_par *runpar, var_name *varname, double **Varbar, double *kin, double *kout, double delt, int it, double time, double *Varc, double *Mar, fl_st fl) { double MLT, MLE, MLI, MPT, MPE, MPI, MR; double Tpulse, t_in_period, stiml, stimp, xaux; double gamf; int iltv, iltp, ilep, ilia; int iptv, iptp, ipep, ipia; int ira, jrb, irb; int sptr, istore, ints; static cal_ad (*cal_adapt); if (it == 1) { if (netpar->admodel == 1) cal_adapt = &calculate_adapt_a; else if (netpar->admodel == 2) cal_adapt = &calculate_adapt_b; else if (netpar->admodel == 3) cal_adapt = &calculate_adapt_c; else if (netpar->admodel == 4) cal_adapt = &calculate_adapt_d; else { printf("wrong admodel=%d\n", netpar->admodel); exit(0); } } sptr = runpar->sptr; /* external / brainstem pulse */ ints = netpar->ints; Tpulse = 1000.0 / netpar->ff[ints]; t_in_period = fmod(time - runpar->deltat - netpar->ts[ints-1] - runpar->epsilon, Tpulse); if (t_in_period < 0) { /* printf("t_in_period=%15.5e < 0 !\n", t_in_period); */ t_in_period = 0.0; } stiml = determine_stim(t_in_period, netpar->LT.ntstim[ints], netpar->LT.tstim[ints], netpar->LT.Ix[ints]); stimp = determine_stim(t_in_period, netpar->PT.ntstim[ints], netpar->PT.tstim[ints], netpar->PT.Ix[ints]); /* printf("%d %lf %lf %lf\n", it, time, stiml, stimp); */ /* updating cell variables */ Mar[varname->MLT] = stiml + gxudel(&netpar->LT.lep, Varbar[varname->ilep], runpar, fl) + gxudel(&netpar->LT.ra, Varbar[varname->ira], runpar, fl) + gxudel(&netpar->LT.rb, Varbar[varname->irb], runpar, fl); Mar[varname->MLE] = gxudel(&netpar->LE.ltp, Varbar[varname->iltp], runpar, fl) + gxudel(&netpar->LE.lia, Varbar[varname->ilia], runpar, fl); Mar[varname->MLI] = gxudel(&netpar->LI.ltp, Varbar[varname->iltp], runpar, fl) + gxudel(&netpar->LI.lep, Varbar[varname->ilep], runpar, fl); Mar[varname->MPT] = stimp + gxudel(&netpar->PT.pep, Varbar[varname->ipep], runpar, fl) + gxudel(&netpar->PT.ra, Varbar[varname->ira], runpar, fl) + gxudel(&netpar->PT.rb, Varbar[varname->irb], runpar, fl); Mar[varname->MPE] = gxudel(&netpar->PE.ptp, Varbar[varname->iptp], runpar, fl) + gxudel(&netpar->PE.pia, Varbar[varname->ipia], runpar, fl); Mar[varname->MPI] = gxudel(&netpar->PI.ptp, Varbar[varname->iptp], runpar, fl) + gxudel(&netpar->PI.pep, Varbar[varname->ipep], runpar, fl); Mar[varname->MR] = gxudel(&netpar->R.ltp, Varbar[varname->iltp], runpar, fl) + gxudel(&netpar->R.lep, Varbar[varname->ilep], runpar, fl) + gxudel(&netpar->R.ptp, Varbar[varname->iptp], runpar, fl); /* fprintf(fl.out, "MT=%lf MR=%lf ME=%lf MI=%lf\n", MT, MR, ME, MI); */ kout[varname->iltv] = -netpar->LT.gL * (Varbar[varname->iltv][sptr] - netpar->LT.VL) + netpar->LT.fgb * gxudel(&netpar->LT.rb, Varbar[varname->irb], runpar, fl) * (Varbar[varname->iltv][sptr] - netpar->LT.VK) + netpar->LT.fst * stiml; (*cal_adapt)(Mar[varname->MLT], Varbar[varname->iltv][sptr], Varbar[varname->iltb], Varbar[varname->ilta], Varbar[varname->ilti][sptr], sptr, &netpar->LT, netpar, runpar->epsilon,&kout[varname->iltb], &kout[varname->ilta], &kout[varname->ilti], runpar, fl); kout[varname->iltp] = (-Varbar[varname->iltp][sptr] + Varbar[varname->ilti][sptr]) / netpar->AMPA.tau2; kout[varname->ilep] = (-Varbar[varname->ilep][sptr] + linthr(Mar[varname->MLE] - netpar->LE.theta)) / netpar->AMPA.tau2; kout[varname->ilia] = (-Varbar[varname->ilia][sptr] + linthr(Mar[varname->MLI] - netpar->LI.theta)) / netpar->GABAA.tau2; kout[varname->iptv] = -netpar->PT.gL * (Varbar[varname->iptv][sptr] - netpar->PT.VL) + netpar->PT.fgb * gxudel(&netpar->PT.rb, Varbar[varname->irb], runpar, fl) * (Varbar[varname->iptv][sptr] - netpar->PT.VK) + netpar->PT.fst * stimp; (*cal_adapt)(Mar[varname->MPT], Varbar[varname->iptv][sptr], Varbar[varname->iptb], Varbar[varname->ipta], Varbar[varname->ipti][sptr], sptr, &netpar->PT, netpar, runpar->epsilon, &kout[varname->iptb], &kout[varname->ipta], &kout[varname->ipti], runpar, fl); kout[varname->iptp] = (-Varbar[varname->iptp][sptr] + Varbar[varname->ipti][sptr]) / netpar->AMPA.tau2; kout[varname->ipep] = (-Varbar[varname->ipep][sptr] + linthr(Mar[varname->MPE] - netpar->PE.theta)) / netpar->AMPA.tau2; kout[varname->ipia] = (-Varbar[varname->ipia][sptr] + linthr(Mar[varname->MPI] - netpar->PI.theta)) / netpar->GABAA.tau2; kout[varname->iri] = (-Varbar[varname->iri][sptr] + linthr(Mar[varname->MR] - netpar->R.theta)) / netpar->R.taut; kout[varname->ira] = (-Varbar[varname->ira][sptr] + Varbar[varname->iri][sptr]) / netpar->GABAA.tau2; /* old kout[varname->jrb] = (-Varbar[varname->jrb][sptr] + Varbar[varname->iri][sptr]) / netpar->GABAB.tau1; */ kout[varname->jrb] = (-Varbar[varname->jrb][sptr] + linthr(Mar[varname->MR] - netpar->R.theta)) / netpar->GABAB.tau1; kout[varname->irb] = (-Varbar[varname->irb][sptr] + pow(Varbar[varname->jrb][sptr], netpar->GABAB.power)) / netpar->GABAB.tau2; } /* This function determines the stimulus strength for time t_in_period */ double determine_stim(double t_in_period, int ntstim, double *tstim, double *Ix) { double stim; int itstim; itstim = 1; while ((t_in_period > tstim[itstim]) && (itstim <= ntstim + 1)) { itstim++; } if (itstim > ntstim + 1) { printf("itstim=%d > ntstim=%d+1 !\n", itstim, ntstim); } if (tstim[itstim-1] == tstim[itstim]) { stim = (Ix[itstim-1] + Ix[itstim]) / 2.0; } else { stim = lininter(tstim[itstim-1], tstim[itstim], t_in_period, Ix[itstim-1], Ix[itstim]); } return stim; } /* This function calculates g_syn * u_syn(t_delay) */ double gxudel(g_td *gtd, double *array, run_par *runpar, fl_st fl) { double gxu; gxu = gtd->g * delay(array, gtd->ntd, runpar, fl); return gxu; } /* This function calculates the delayed value of a variable */ double delay(double *array, int nn, run_par *runpar, fl_st fl) { double xx; int iptr; iptr = runpar->sptr + nn; if (iptr > runpar->nstore) iptr -= runpar->nstore+1; xx = array[iptr]; return xx; } /* This function calculates the adaptation-related derivatives */ void calculate_adapt_a(double Mar_MxT, double Varbar_ixtv, double *Varbar_ixtb, double *Varbar_ixta, double Varbar_ixti, int sptr, syn_strength_delay *nxT, net_par *netpar, double epsilon, double *kout_ixtb, double *kout_ixta, double *kout_ixti, run_par *runpar, fl_st fl) { double real_MxT, gamf; double Varbar_ixta_now, Varbar_ixta_delay; Varbar_ixta_now = Varbar_ixta[sptr]; Varbar_ixta_delay = delay(Varbar_ixta, nxT->ntd_act_del, runpar, fl); real_MxT = linthr(Mar_MxT * heav(Varbar_ixtv - nxT->Vthr) - nxT->theta); gamf = Gammaf(real_MxT, nxT->thetaa, netpar->sigmaa) * heav(real_MxT - epsilon); *kout_ixta = (gamf * (1.0 - Varbar_ixta_now) / nxT->tauact) - ((1.0 - gamf) * Varbar_ixta_now / nxT->taudeact); *kout_ixti = (-Varbar_ixti + real_MxT * (1.0 - nxT->sadapt * Varbar_ixta_delay)) / nxT->taut; } /* This function calculates the adaptation-related derivatives */ void calculate_adapt_b(double Mar_MxT, double Varbar_ixtv, double *Varbar_ixtb, double *Varbar_ixta, double Varbar_ixti, int sptr, syn_strength_delay *nxT, net_par *netpar, double epsilon, double *kout_ixtb, double *kout_ixta, double *kout_ixti, run_par *runpar, fl_st fl) { double real_MxT; double Varbar_ixta_now, Varbar_ixta_delay; Varbar_ixta_now = Varbar_ixta[sptr]; Varbar_ixta_delay = delay(Varbar_ixta, nxT->ntd_act_del, runpar, fl); real_MxT = linthr(Mar_MxT * heav(Varbar_ixtv - nxT->Vthr) - nxT->theta); *kout_ixta = (real_MxT * (1.0 - Varbar_ixta_now) / nxT->tauact) - (Varbar_ixta_now / nxT->taudeact); *kout_ixti = (-Varbar_ixti + real_MxT * (1.0 - nxT->sadapt * Varbar_ixta_delay)) / nxT->taut; } /* This function calculates the adaptation-related derivatives */ void calculate_adapt_c(double Mar_MxT, double Varbar_ixtv, double *Varbar_ixtb, double *Varbar_ixta, double Varbar_ixti, int sptr, syn_strength_delay *nxT, net_par *netpar, double epsilon, double *kout_ixtb, double *kout_ixta, double *kout_ixti, run_par *runpar, fl_st fl) { double real_MxT, real_MxT_a; double Varbar_ixta_now, Varbar_ixta_delay; Varbar_ixta_now = Varbar_ixta[sptr]; Varbar_ixta_delay = delay(Varbar_ixta, nxT->ntd_act_del, runpar, fl); real_MxT = linthr(Mar_MxT - nxT->theta); real_MxT_a = real_MxT * (1.0 - nxT->sadapt * Varbar_ixta_delay); /* real_MxT_a = linthr(Mar_MxT - nxT->sadapt * Varbar_ixta_delay - nxT->theta); */ *kout_ixta = (real_MxT_a * (1.0 - Varbar_ixta_now) / nxT->tauact) - (Varbar_ixta_now / nxT->taudeact); *kout_ixti = (-Varbar_ixti + real_MxT_a) / nxT->taut; } /* This function calculates the adaptation-related derivatives */ void calculate_adapt_d(double Mar_MxT, double Varbar_ixtv, double *Varbar_ixtb, double *Varbar_ixta, double Varbar_ixti, int sptr, syn_strength_delay *nxT, net_par *netpar, double epsilon, double *kout_ixtb, double *kout_ixta, double *kout_ixti, run_par *runpar, fl_st fl) { double real_MxT, real_MxT_a; double Varbar_ixta_now, Varbar_ixtb_now; Varbar_ixtb_now = Varbar_ixtb[sptr]; Varbar_ixta_now = Varbar_ixta[sptr]; real_MxT = linthr(Mar_MxT - nxT->theta); real_MxT_a = real_MxT * (1.0 - Varbar_ixta_now); *kout_ixtb = (real_MxT_a * (1.0 - Varbar_ixtb_now) / nxT->rauact) - (Varbar_ixtb_now / nxT->raudeact); *kout_ixta = (1.0 - Varbar_ixta_now) * Varbar_ixtb_now / nxT->tauact - Varbar_ixta_now / nxT->taudeact; *kout_ixti = (-Varbar_ixti + real_MxT_a) / nxT->taut; } /* This function writes the data on fcol */ void pr_fct(net_par *netpar, run_par *runpar, var_name *varname, double **Varbar, double *Mar, double time, int it, save_str *sv, fl_st fl) { double xvar; int ivar, jvar, ipop, jpop; sv->itsave++; if (!runpar->sm) fprintf(fl.col, "%12.5lf", time); sv->av_save[sv->itsave][1] = time; for (ivar=1; ivar<=runpar->nwritev; ivar++) { jvar = runpar->nwritevar[ivar]; /* normalizing the "voltage" variable */ if ((jvar == varname->iltv)) { xvar = (Varbar[jvar][runpar->sptr] - netpar->LT.Vthr) / (netpar->LT.Vthr - netpar->LT.VK); } else if (jvar == varname->iptv) { xvar = (Varbar[jvar][runpar->sptr] - netpar->PT.Vthr) / (netpar->PT.Vthr - netpar->PT.VK); } else { xvar = Varbar[jvar][runpar->sptr]; } if (!runpar->sm) fprintf(fl.col, "%11.5lf", xvar); sv->av_save[sv->itsave][1+ivar] = xvar; } for (ipop=1; ipop<=runpar->nwritep; ipop++) { jpop = runpar->nwritepar[ipop]; if (!runpar->sm) fprintf(fl.col, "%11.5lf",Mar[jpop]); sv->av_save[sv->itsave][1+runpar->nwritev+ipop] = Mar[jpop]; } if (!runpar->sm) fprintf(fl.col, "\n"); } /* This function calculates ntd from td */ void ntd_cal(g_td *gtd, char *syn_del_str, run_par *runpar, fl_st fl) { gtd->ntd = (int) ((gtd->td + runpar->epsilon) / runpar->deltat); fprintf(fl.out, "%s=%d\n", syn_del_str, gtd->ntd); } /* Linear interpolation */ double lininter(double x1, double x2, double xc, double y1, double y2) { double linter; linter = ((xc-x1)*y2+(x2-xc)*y1) / (x2-x1) ; return(linter); } void create_stimulus_array(net_par *netpar, run_par *runpar, fl_st fl) { netpar->ts = dvector(0, netpar->nnts); netpar->ff = dvector(1, netpar->nnts); netpar->alphap = dvector(1, netpar->nnts); netpar->LT.ntstim = ivector(1, netpar->nnts); netpar->LT.tstim = dptr_vector(1, netpar->nnts); netpar->LT.Ix = dptr_vector(1, netpar->nnts); netpar->PT.ntstim = ivector(1, netpar->nnts); netpar->PT.tstim = dptr_vector(1, netpar->nnts); netpar->PT.Ix = dptr_vector(1, netpar->nnts); } void free_stimulus_array(net_par *netpar, run_par *runpar, fl_st fl) { int ints; free_dvector(netpar->ts, 0, netpar->nnts); free_dvector(netpar->ff, 1, netpar->nnts); free_dvector(netpar->alphap, 1, netpar->nnts); for (ints=1; ints<=netpar->nnts; ints++) free_dvector(netpar->LT.tstim[ints], 0, netpar->LT.ntstim[ints]+1); free_dptr_vector(netpar->LT.tstim, 1, netpar->nnts); for (ints=1; ints<=netpar->nnts; ints++) free_dvector(netpar->LT.Ix[ints], 0, netpar->LT.ntstim[ints]+1); free_dptr_vector(netpar->LT.Ix, 1, netpar->nnts); free_ivector(netpar->LT.ntstim, 1, netpar->nnts); for (ints=1; ints<=netpar->nnts; ints++) free_dvector(netpar->PT.tstim[ints], 0, netpar->PT.ntstim[ints]+1); free_dptr_vector(netpar->PT.tstim, 1, netpar->nnts); for (ints=1; ints<=netpar->nnts; ints++) free_dvector(netpar->PT.Ix[ints], 0, netpar->PT.ntstim[ints]+1); free_dptr_vector(netpar->PT.Ix, 1, netpar->nnts); free_ivector(netpar->PT.ntstim, 1, netpar->nnts); } double** dptr_vector(long nl, long nh) /* allocate a *d vector with subscript range v[nl..nh] */ { double **dptr; dptr = (double **)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(double*))); if (!dptr) nrerror("allocation failure in dptr_vector()"); return dptr-nl+NR_END; } void free_dptr_vector(double **dptr, long nl, long nh) /* free a *d vector allocated with dptr_vector() */ { free((FREE_ARG) (dptr+nl-NR_END)); } void generate_struct_psth(save_str *sv, run_par *runpar, fl_st fl) { sv->ncol = runpar->nwritev + runpar-> nwritep + 1; sv->ntsave = (runpar->nt / runpar->twrite); sv->itsave = -1; fprintf(fl.out, "sv: ncol=%d ntsave=%d itsave=%d\n", sv->ncol, sv->ntsave, sv->itsave); sv->av_save = dmatrix(0, sv->ntsave, 1, sv->ncol); } /* This function prints the results */ void prt_res(double mpar, double lpar, char scan_type, psth_str *ps, fl_st fl) { int iraw, icol; for (iraw=1; iraw<=ps->npsth; iraw++) { if (scan_type == 't' || scan_type == 'c') fprintf(fl.res, "%lf ", mpar); fprintf(fl.res, "%lf %d", lpar, iraw); for (icol=1; icol<=ps->nmeasure; icol++) { fprintf(fl.res, " %lf", ps->psth_res[iraw][icol]); } fprintf(fl.res, "\n"); } } void contour_plot_cal(cont_val *cval, scan_val *svam, scan_val *sval, psth_str *ps, fl_st fl) { transfer_to_func ttfunc; double **mesh, conpar, tol; int mmesh, lmesh; void *ptr; /* Declarations */ tol=1.0e-6; ttfunc.cval = cval; ttfunc.svam = svam; ttfunc.sval = sval; ttfunc.ps = ps; ttfunc.fl = &fl; ptr = (void*) (&ttfunc); /* Checking whether there is enough declated memory */ if (svam->npar > Mpar || sval->npar > Mpar) { printf("m l npar = %d %d > Mpar !\n", svam->npar, sval->npar); exit(0); } mesh = dmatrix(0, svam->npar, 0, sval->npar); /* Finding the mesh values */ for (svam->ipar = 0; svam->ipar <= svam->npar; svam->ipar++) { svam->par_ar[svam->ipar] = svam->parmin + (svam->parmax - svam->parmin) * svam->ipar / svam->npar; fprintf(fl.out, "m: ipar=%d par=%lf\n", svam->ipar, svam->par_ar[svam->ipar]); printf("m: ipar=%d par=%lf\n", svam->ipar, svam->par_ar[svam->ipar]); for (sval->ipar=0; sval->ipar <= sval->npar; sval->ipar++) { sval->par_ar[sval->ipar] = sval->parmin + (sval->parmax - sval->parmin) * sval->ipar / sval->npar; update_and_run_two_par(svam, sval, ps, fl); mesh[svam->ipar][sval->ipar] = ps->psth_res[cval->spsth][cval->smeasure]; } } fprintf(fl.out, "\nmesh\n"); for (svam->ipar=0; svam->ipar <= svam->npar; svam->ipar++) { for (sval->ipar=0; sval->ipar <= sval->npar; sval->ipar++) { if (sval->ipar > 0) fprintf(fl.out, " "); fprintf(fl.out, "%lf", mesh[svam->ipar][sval->ipar]); } fprintf(fl.out, "\n"); } fprintf(fl.out, "\n"); /* Finding the contour dots */ for (cval->ival = 0; cval->ival <= cval->nval; cval->ival++) { if (cval->nval == 0) { cval->val = cval->valmin; } else if (cval->nval > 0) { cval->val = cval->valmin + (cval->valmax - cval->valmin) * cval->ival / cval ->nval; fprintf(fl.col, "# #\n"); fflush(fl.col); } printf("ival=%d val=%lf\n", cval->ival, cval->val); for (svam->ipar = 0; svam->ipar <= svam->npar; svam->ipar++) { if (fabs(mesh[svam->ipar][0] - cval->val) < 1.0e-10) { fprintf(fl.col, "%d %lf %lf %lf\n", cval->ival, cval->val, svam->par_ar[svam->ipar], sval->par_ar[0]); } for (sval->ipar=1; sval->ipar <= sval->npar; sval->ipar++) { if (fabs(mesh[svam->ipar][sval->ipar] - cval->val) < 1.0e-10) { fprintf(fl.col, "%d %lf %lf %lf\n", cval->ival, cval->val, svam->par_ar[svam->ipar], sval->par_ar[sval->ipar]); } else if ((mesh[svam->ipar][sval->ipar] - cval->val) * (mesh[svam->ipar][sval->ipar-1] - cval->val) < 0.0) { conpar = zbrent(contour_dot_func, sval->par_ar[sval->ipar-1], sval->par_ar[sval->ipar], tol, ptr); fprintf(fl.col, "%d %lf %lf %lf\n", cval->ival, cval->val, svam->par_ar[svam->ipar], conpar); fflush(fl.col); } } } } free_dmatrix(mesh, 0, svam->npar, 0, sval->npar); } double contour_dot_func(double xx, void *ptr) { transfer_to_func *ttfunc; cont_val *cval; scan_val *svam; scan_val *sval; psth_str *ps; fl_st *fl; dat_str datstr; int idatar; double yfunc; ttfunc = (transfer_to_func*) ptr; cval = ttfunc->cval; svam = ttfunc->svam; sval = ttfunc->sval; ps = ttfunc->ps; fl = ttfunc->fl; fprintf(fl->out, "xx=%lf\n", xx); printf("xx=%lf\n", xx); read_file_in(&datstr, sval->scan_type, *fl); update_file(svam->par1, svam->par2, svam->npt, sval->par_type, svam->par_ar[svam->ipar], &datstr, *fl); update_file(sval->par1, sval->par2, sval->npt, sval->par_type, xx, &datstr, *fl); for (idatar=1; idatar<=datstr.n_datar; idatar++) fprintf(fl->tmp, "%s", datstr.datar[idatar]); one_par(*fl, sval->scan_type, ps); yfunc = ps->psth_res[cval->spsth][cval->smeasure] - cval->val; return yfunc; } void update_and_run_two_par(scan_val *svam, scan_val *sval, psth_str *ps, fl_st fl) { dat_str datstr; int idatar; fprintf(fl.out, "l: ipar=%d par=%lf\n", sval->ipar, sval->par_ar[sval->ipar]); printf("l: ipar=%d par=%lf\n", sval->ipar, sval->par_ar[sval->ipar]); read_file_in(&datstr, sval->scan_type, fl); update_file(svam->par1, svam->par2, svam->npt, sval->par_type, svam->par_ar[svam->ipar], &datstr, fl); update_file(sval->par1, sval->par2, sval->npt, sval->par_type, sval->par_ar[sval->ipar], &datstr, fl); for (idatar=1; idatar<=datstr.n_datar; idatar++) fprintf(fl.tmp, "%s", datstr.datar[idatar]); one_par(fl, sval->scan_type, ps); prt_res(svam->par_ar[svam->ipar], sval->par_ar[sval->ipar], sval->scan_type, ps, fl); }