Network model with neocortical architecture (Anderson et al 2007,2012; Azhar et al 2012)

 Download zip file 
Help downloading and running models
Accession:141507
Architecturally realistic neocortical model using seven classes of excitatory and inhibitory single compartment Hodgkin-Huxley cells. This is an addendum to ModelDB Accession # 98902, Studies of stimulus parameters for seizure disruption (Anderson et al. 2007). Wiring is adapted from the minicolumn hypothesis and incorporates visual and neocortical wiring data. Simulation demonstrates spontaneous bursting onset and cessation. This activity can be induced by random fluctuations in the surrounding background input.
Reference:
1 . Anderson WS, Kudela P, Cho J, Bergey GK, Franaszczuk PJ (2007) Studies of stimulus parameters for seizure disruption using neural network simulations. Biol Cybern 97:173-94 [PubMed]
2 . Anderson WS, Kudela P, Weinberg S, Bergey GK, Franaszczuk PJ (2009) Phase-dependent stimulation effects on bursting activity in a neural network cortical simulation. Epilepsy Res 84:42-55 [PubMed]
3 . Anderson WS, Azhar F, Kudela P, Bergey GK, Franaszczuk PJ (2012) Epileptic seizures from abnormal networks: why some seizures defy predictability. Epilepsy Res 99:202-13 [PubMed]
4 . Azhar F, Anderson WS (2012) Predicting single-neuron activity in locally connected networks. Neural Comput 24:2655-77 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism:
Cell Type(s): Neocortex V1 L6 pyramidal corticothalamic cell; Neocortex V1 L2/6 pyramidal intratelencephalic cell; Neocortex V1 interneuron basket PV cell; Neocortex fast spiking (FS) interneuron;
Channel(s): I A; I K; I K,leak; I K,Ca; I Sodium; I Calcium;
Gap Junctions:
Receptor(s): AMPA; Gaba;
Gene(s):
Transmitter(s):
Simulation Environment: C or C++ program;
Model Concept(s): Bursting; Epilepsy; Vision;
Implementer(s):
Search NeuronDB for information about:  Neocortex V1 L6 pyramidal corticothalamic cell; Neocortex V1 L2/6 pyramidal intratelencephalic cell; Neocortex V1 interneuron basket PV cell; AMPA; Gaba; I A; I K; I K,leak; I K,Ca; I Sodium; I Calcium;
/
AndersonEtAl2011
readme.txt
0.net
0.par *
0.stim
0.sub
Ca_sum.c
clust_cn.c
clust_cn.h *
crl.c *
jhist.c *
link_sort.c *
lnet.h
mkhist.c *
mklink.c
mknode.c
mkpar.c *
Movie1.mpg
netclustwacnmdadiff.c
nodes.16
rnetcolumn *
rnetcolumn.txt *
sublink.c *
                            
/***************************************************************************
 *   Copyright (C) 2006 by Piotr Franaszczuk                               *
 *   pfranasz@jhmi.edu                                                      *
 *   Johns Hopkins University, Baltimore,MD                                *                                                                      *
 *                                                                         * 
 ***************************************************************************/


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>

#define NO_OF_PROC 16
#define NO_OF_LINKS 1000000

#define RISC
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>

#include "lnet.h"


int main(int argc,char *argv[])
{


  NEURON_INDEX **link_out;

  int lin_no[NO_OF_PROC][NO_OF_PROC];
//  int check_out[NO_OF_PROC][NO_OF_PROC];
//  int check_link=0;
  int lout_no[NO_OF_PROC];
  int nproc,last;
  char fname[100];
  char name[NO_OF_PROC][200];
//  int in_sum=0,out_sum=0;


  FILE* fil_in, *fil_out, *fil_tab, *fil_dst[NO_OF_PROC];
  int ii,i,nin,nout,src_proc,dst_proc,src_neu,dst_neu,preclassnum,w;
  int axflag,old_src;
  double del;
  struct LINK tmp;

  if(argc <3 ){fprintf(stderr,"USAGE:\n\tcrl fname(no.ext) nproc\n");exit(1);}

  nproc=atoi(argv[2]);
  if(nproc>NO_OF_PROC || nproc<1)
  {fprintf(stderr,"nproc= %i> %i\n",nproc,NO_OF_PROC);exit(1);}

  link_out=(NEURON_INDEX**)malloc(sizeof(NEURON_INDEX*)*nproc);
  if(!link_out)
  { fprintf(stderr,"malloc link_out");exit(1);}
  for(i=0;i<nproc;i++)
  {
    link_out[i]=(NEURON_INDEX*)calloc(sizeof(NEURON_INDEX),NO_OF_LINKS);
    if(!link_out[i])
    { fprintf(stderr,"calloc link_out[%i]",i);exit(1);}
    bzero(lin_no[i],nproc*sizeof(int));
//    bzero(check_out[i],nproc*sizeof(int));
    sprintf(name[i],"%s.dst.%i",argv[1],i);
    fil_dst[i]=fopen(name[i],"w+");
    if(fil_dst[i]==NULL){fprintf(stderr,"fopen(%s) error\n",name[i]);exit(1);}
  }
  strcat(strcpy(fname,argv[1]),".link1");
  fil_in=fopen(fname,"r");
  if(fil_in==NULL){fprintf(stderr,"fopen(%s) error\n",fname);exit(1);}

  bzero(lout_no,nproc*sizeof(int));

  if((fil_tab=fopen(strcat(strcpy(fname,argv[1]),".conn.tab"),"w"))==NULL)
  {fprintf(stderr,"fopen(%s) error\n",fname);exit(1);}
  fprintf(fil_tab,"%i\n",nproc);

  old_src=0;
  for(;;)
  {  //assumes src proc are sorted in order
  // read next line
   fscanf(fil_in,"%i:%i %i:%i %i %lf %i\n",&src_proc,&src_neu,&dst_proc,&dst_neu,&preclassnum,&del,&w);
          
    if(ferror(fil_in))
    {fprintf(stderr,"fscanf error on input: %s.link1\n",argv[1]);exit(1);}
    
//    check_out[dst_proc][src_proc]++;
    if(lout_no[dst_proc]==NO_OF_LINKS)
    {
      fprintf(stderr,"no_of out_links > %i for  src:%i dst:%i\n", NO_OF_LINKS,src_proc,dst_proc);
      exit(2);
    }
    fprintf(fil_dst[dst_proc],"%i:%i %i:%i %i %5.2f %i\n",src_proc,src_neu,dst_proc,dst_neu,preclassnum,del,w);
    if(ferror(fil_dst[dst_proc]))
    {fprintf(stderr,"fwrite dst.%i error\n",dst_proc);exit(3);}
    lin_no[src_proc][dst_proc]++;

    //if (lin_no[src_proc][dst_proc]>(USHRT_MAX-1)){
    //	        {fprintf(stderr,"lin_no exceeding max, src_proc=%i, dst_proc=%i\n",src_proc,dst_proc);exit(3);}
    //	}

	if(feof(fil_in))
	{
		link_out[dst_proc][lout_no[dst_proc]++]=(NEURON_INDEX)src_neu;
		//if (lout_no[dst_proc]>(USHRT_MAX-1)){
		//        {fprintf(stderr,"lout_no exceeding max, dst_proc=%i\n",dst_proc);exit(3);}
		//}

		src_proc=old_src+1;
	}
    if(src_proc!=old_src)
//	fprintf(stderr,"%i new=%i old=%i\n",check_link,src_proc,old_src);
    
    if(src_proc>old_src)
    {  // write out data for old_src processor
      nout=0;
      for(i=0;i<nproc;i++)
      {
        if(lout_no[i]>0)nout++;
      }
      sprintf(fname,"%s.lout.%i",argv[1],old_src);
      fil_out=fopen(fname,"w");
    if(fil_out==NULL){fprintf(stderr,"fopen(%s) error\n",fname);exit(1);}
      fwrite(&nout, sizeof(int),1,fil_out);

      if(nout>0)
      {

        printf("proc %i nout %i\n",old_src,nout);

        for(i=0;i<nproc;i++)
        {
          if(i!=old_src && lout_no[i]>0)
          {
            printf("%i->%i:%i\n",old_src,i,lout_no[i]);
            fwrite(&i,sizeof(int),1,fil_out);
            fwrite(&lout_no[i],sizeof(int),1,fil_out);
            fwrite(link_out[i],sizeof(NEURON_INDEX),lout_no[i],fil_out);
            /*		  for(ii=0;ii<lout_no[j][i];ii++)
              {
                printf("%i,",link_out[j][i][ii]);
            }
            printf("\n"); */
          }
        }
        // internal loops in the same node  last
        if(lout_no[old_src]>0)
        {
          printf("%i->%i:%i\n",old_src,old_src,lout_no[old_src]);
          fwrite(&old_src,sizeof(int),1,fil_out);
          fwrite(&lout_no[old_src],sizeof(int),1,fil_out);
          fwrite(link_out[old_src],sizeof(NEURON_INDEX),lout_no[old_src],fil_out);
          /*		  for(ii=0;ii<lout_no[j][j];ii++)
          		  {
          		  printf("%i,",link_out[j][j][ii]);
          		  }
          		  printf("\n"); */
        }

        //	    printf("\n");

      }
      fclose(fil_out);
      nout=0;
      for(i=0;i<nproc;i++)
        if(i!=old_src && lout_no[i]>0)nout++;

      fprintf(fil_tab,"%i %i:",old_src,nout);
      for(i=0;i<nproc;i++)
      {
        if(i!=old_src && lout_no[i]>0)
          fprintf(fil_tab," %i",i);
      }
      fprintf(fil_tab,"\n");

      // new src_proc

/*      // check
      for(i=0;i<nproc;i++)
      {
        out_sum+=lout_no[i];
        if(check_out[i][old_src]!=lout_no[i])
          fprintf(stderr,"check: %i->%i,%i,%i\n",old_src,i,check_out[i][old_src],lout_no[i]);
      }
//      fprintf(stderr,"%i:out_sum=%i,check_link=%i\n",old_src,out_sum,check_link);
*/
      if(feof(fil_in))break;
      bzero(lout_no,nproc*sizeof(int));
      old_src=src_proc;

    }
  	link_out[dst_proc][lout_no[dst_proc]++]=(NEURON_INDEX)src_neu;
//	check_link++;
  }/* while(feof) */
  fclose(fil_in);
  fclose(fil_tab);
/*
  for(i=0;i<nproc;i++)
  {
    int j;
    for(j=0;j<nproc;j++)
    {
      if(check_out[j][i]!=lin_no[i][j])
        fprintf(stderr,"check: %i-%i,%i,%i\n",i,j,check_out[i][j],lin_no[i][j]);
    }
  }
*/
  for(i=0;i<nproc;i++)
  {
    free(link_out[i]);
    fflush(fil_dst[dst_proc]);
  }
  free(link_out);

  for(dst_proc=0;dst_proc<nproc;dst_proc++)
  {

    int first=1;
    nin=0;
    for(i=0;i<nproc;i++)
    {
//      in_sum+=lin_no[i][dst_proc];
      if(lin_no[i][dst_proc]>0)nin++;
    }
//    fprintf(stderr,"%i: in_sum=%i\n",dst_proc,in_sum);
    sprintf(fname,"%s.lin.%i",argv[1],dst_proc);
    fil_out=fopen(fname,"w");
  if(fil_out==NULL){fprintf(stderr,"fopen(%s) error\n",fname);exit(1);}
    fwrite(&nin,sizeof(int),1,fil_out);
    do
    {
      if(nin>0)
      {
        if(first)printf("proc %i nin %i\n",dst_proc,nin);
        rewind(fil_dst[dst_proc]);
        old_src=-1;
        while(!feof(fil_dst[dst_proc]))
        {
          fscanf(fil_dst[dst_proc],"%i:%i %i:%i %i %lf %i\n",&src_proc,&src_neu,&dst_proc,&dst_neu,&preclassnum,&del,&w);
          if(ferror(fil_dst[dst_proc]))
          {fprintf(stderr,"fread dst.%i error\n",dst_proc);exit(3);}
          if(src_proc!=dst_proc ^ first )continue;
          if(src_proc>old_src && lin_no[src_proc][dst_proc]>0)
          {
            printf("%i<-%i:%i\n",dst_proc,src_proc,lin_no[src_proc][dst_proc]);
            fwrite(&src_proc,sizeof(int),1,fil_out);
            fwrite(&lin_no[src_proc][dst_proc],sizeof(int),1,fil_out);
            old_src=src_proc;
          }
          tmp.neuron_post=(NEURON_INDEX)dst_neu;
          tmp.delay=rint(del/(1000.*DELTA_T));  /*input in msec */
          tmp.weight=w;  /* weight */
          tmp.first=tmp.last=EMPTY_LIST; /* was EMPTY_LIST */
          tmp.preclass_num=(NEURON_INDEX)preclassnum;
          fwrite(&tmp,sizeof(struct LINK),1,fil_out);
        }


        //	      printf("\n");
        first=!first;
      }

    }
    while(!first);
    fclose(fil_out);
    fclose(fil_dst[dst_proc]);
    remove(name[dst_proc]);

  }
//  printf("no_links=%i\n",check_link);
  return 0;

}