CA3 pyramidal cell: rhythmogenesis in a reduced Traub model (Pinsky, Rinzel 1994)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:35358
Fig. 2A and 3 are reproduced in this simulation of Pinsky PF, Rinzel J (1994).
Reference:
1 . Pinsky PF, Rinzel J (1994) Intrinsic and network rhythmogenesis in a reduced Traub model for CA3 neurons. J Comput Neurosci 1:39-60 [PubMed]
2 . Pinsky PF, Rinzel J (1995) Erratum for Intrinsic and network rhythmogenesis in a reduced Traub model for CA3 neurons. J Comput Neurosci 2:275-275
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism:
Cell Type(s): Hippocampus CA3 pyramidal cell;
Channel(s): I Na,t; I L high threshold; I K,Ca;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; XPP;
Model Concept(s): Active Dendrites;
Implementer(s): Lytton, William [billl at neurosim.downstate.edu];
Search NeuronDB for information about:  Hippocampus CA3 pyramidal cell; I Na,t; I L high threshold; I K,Ca;
: $Id: vecst.mod,v 1.115 2003/12/25 00:06:31 billl Exp $
 
:* COMMENT
COMMENT
randwd   randomly chooses n bits to set to 1
hamming  v.hamming(v1) is hamming distance between 2 vecs
flipbits v.flipbits(scratch,num) flips num rand chosen bits
flipbalbits v.flipbalbits(scratch,num) balanced flipping
vpr      v.vpr prints out vector as 1 (x[i]>0) or 0 (x[i]<=0)
thresh   turns analog vec to BVBASE,1 vec separating at thresh (scalar or vec)
triplet  return location of a triplet in a vector
onoff    turns state vec on or off depending on values in other vecs
bpeval   used by backprop: vo=outp*(1-outp)*del
w        like where but sets chosen nums // modified from .wh in 1.23
xing     determines where vector crosses in a positive direction (destructive)
xzero    count 0 crossings by putting in a 1 or -1
indset(ind,val) sets spots indexed by ind to val
ismono([arg]) checks if a vector is monotonically increaseing (-1 decreasing)
count(num) count the number of nums in vec
scr.fewind(ind,vec1,vec2[,vec3,vec4]) // uses ind as index into other vecs
scr.nind(ind,vec1,vec2[,vec3,vec4]) // uses ind to elim elems in other vecs
ind.keyind(key,vec1,vec2[,vec3,vec4]) // pick out bzw. values from vectors
vdest.intrp(flag) // interpolate numbers replacing numbers given as flag
v.insct(v1,v2)   // return v1 intersect v2
v.cvlv(v1,v2)   // convolve v1 with v2
fac      not vec related - returns factorial
logfac   not vec related - returns log factorial
v2d      copy into a double block
d2v      copy out of a double block NB: same as vec.from_double()
smgs     rewrite of sumgauss form ivovect.cpp
iwr      write integers
ird      read integers
ENDCOMMENT

NEURON {
  SUFFIX nothing
  GLOBAL BVBASE, RES, VECST_INSTALLED  : bit vector base number (typically 0 or -1)
  GLOBAL ALL,NEG,POS,CHK,NOZ
}

PARAMETER {
  BVBASE = -1.
  VECST_INSTALLED=0

  ALL=-1.3479e120
  NEG=-1.3478e120
  POS=-1.3477e120
  CHK=-1.3476e120
  NOZ=-1.3475e120
}

ASSIGNED { RES }

VERBATIM
#include <stdlib.h>
#include <math.h>
// obsolete #include <values.h> /* contains MAXLONG */
#include <limits.h> /* LONG_MAX replaces MAXLONG */
#include <time.h> 
extern double* hoc_pgetarg();
extern double hoc_call_func(Symbol*, int narg);
extern FILE* hoc_obj_file_arg(int narg);
extern void vector_resize();
extern int vector_instance_px();
extern void* vector_arg();
extern double hoc_epsilon;

/* Below added by RTB 170913. Exerpt taken from changes made by Michael Hines
 to Buzsaki Wang 1996, modelDB Accession:26997 */
/* Michael Hines fix for cygwin on mswin */
#if !defined(MAXLONG)
#include <limits.h>
#define MAXLONG LONG_MAX
#endif
/* some machines do not have drand48 and srand48 so use the implementation
at the end of this file */
extern double my_drand48();
extern void my_srand48();
#undef drand48
#undef srand48
#define drand48 my_drand48
#define srand48 my_srand48

extern double drand48();
// end of exerpt

ENDVERBATIM
 
:* v1.slope(num) does a linear regression to find the slope, assuming num=timestep of vector

VERBATIM
static double slope(void* vv) {
	int i, n;
	double *x, *y;
        double timestep, sigxy, sigx, sigy, sigx2;
	/* how to get the instance data */
	n = vector_instance_px(vv, &y);

        if(ifarg(1)) { 
          timestep = *getarg(1); 
        } else { printf("You must supply a timestep\n"); return 0; }

        sigxy= sigx= sigy= sigx2=0; // initialize these

        x = (double *) malloc(sizeof(double)*n);
        for(i=0; i<n; i++) {
          x[i] = timestep*i;
          sigxy += x[i] * y[i];
          sigx  += x[i];
          sigy  += y[i];
          sigx2 += x[i]*x[i];
        }
        return (n*sigxy - sigx*sigy)/(n*sigx2 - sigx*sigx);
}
ENDVERBATIM
 
:* v1.vslope(v2) does a linear regression, using v2 as the x-coords

VERBATIM
static double vslope(void* vv) {
	int i, n;
	double *x, *y;
        double timestep, sigxy, sigx, sigy, sigx2;
	/* how to get the instance data */
	n = vector_instance_px(vv, &y);

        if(ifarg(1)) {
          if(vector_arg_px(1, &x) != n ) {
            hoc_execerror("Vector size doesn't match.", 0); 
          }
          sigxy= sigx= sigy= sigx2=0; // initialize these

          for(i=0; i<n; i++) {
            sigxy += x[i] * y[i];
            sigx  += x[i];
            sigy  += y[i];
            sigx2 += x[i]*x[i];
          }
        }         
        return (n*sigxy - sigx*sigy)/(n*sigx2 - sigx*sigx);
}
ENDVERBATIM
 
:* v1.stats(num) does a linear regression, assuming num=timestep of vector

VERBATIM
static double stats(void* vv) {
	int i, n;
	double *x, *y;
        double timestep, sigxy, sigx, sigy, sigx2, sigy2;
        double r, m, b;
	/* how to get the instance data */
	n = vector_instance_px(vv, &y);

        if(ifarg(1)) { 
          timestep = *getarg(1); 
        } else { printf("You must supply a timestep\n"); return 0; }

        sigxy= sigx= sigy= sigx2=sigy2= 0; // initialize these

        x = (double *) malloc(sizeof(double)*n);
        for(i=0; i<n; i++) {
          x[i] = timestep*i;
          sigxy += x[i] * y[i];
          sigx  += x[i];
          sigy  += y[i];
          sigx2 += x[i]*x[i];
          sigy2 += y[i]*y[i];
        }
        m = (n*sigxy - sigx*sigy)/(n*sigx2 - sigx*sigx);
        b = (sigy*sigx2 - sigx*sigxy)/(n*sigx2 - sigx*sigx);
        r = (n*sigxy - sigx*sigy)/(sqrt(n*sigx2-sigx*sigx) * sqrt(n*sigy2-sigy*sigy));

        printf("Examined %d data points\n", n);
        printf("slope     = %f\n", m);
        printf("intercept = %f\n", b);
        printf("R         = %f\n", r);
        printf("R-squared = %f\n", r*r);
        return 1;
}
ENDVERBATIM
 
:* v1.vstats(v2) does a linear regression, using v2 as the x-coords

VERBATIM
static double vstats(void* vv) {
	int i, n;
	double *x, *y;
        double timestep, sigxy, sigx, sigy, sigx2, sigy2;
        double r, m, b;
	/* how to get the instance data */
	n = vector_instance_px(vv, &y);

        if(ifarg(1)) {
          if(vector_arg_px(1, &x) != n ) {
            hoc_execerror("Vector size doesn't match.", 0); 
          }
          sigxy= sigx= sigy= sigx2=sigy2=0; // initialize these

          for(i=0; i<n; i++) {
            sigxy += x[i] * y[i];
            sigx  += x[i];
            sigy  += y[i];
            sigx2 += x[i]*x[i];
            sigy2 += y[i]*y[i];
          }
          m = (n*sigxy - sigx*sigy)/(n*sigx2 - sigx*sigx);
          b = (sigy*sigx2 - sigx*sigxy)/(n*sigx2 - sigx*sigx);
          r = (n*sigxy - sigx*sigy)/(sqrt(n*sigx2-sigx*sigx) * sqrt(n*sigy2-sigy*sigy));

          printf("Examined %d data points\n", n);
          printf("slope     = %f\n", m);
          printf("intercept = %f\n", b);
          printf("R         = %f\n", r);
          printf("R-squared = %f\n", r*r);
          return 1;
        } else {
          printf("You must supply an x vector!\n");
          return 0;
        }
}
ENDVERBATIM
 
:* v1.randwd(num[,v2]) will randomly flip num bits from BVBASE to 1
: does v1.fill(BVBASE); optionally fill v2 with the indices
VERBATIM
static double randwd(void* vv) {
	int i, ii, jj, nx, ny, flip, flag;
	double* x, *y;
	/* how to get the instance data */
	nx = vector_instance_px(vv, &x);
        flip = (int) *getarg(1);
        if (ifarg(2)) { /* write a diff vector to z */
          flag = 1; ny = vector_arg_px(2, &y);
          if (ny!=flip) { hoc_execerror("Opt vector must be size for # of flips", 0); }
        } else { flag = 0; }
        if (flip>=nx) { hoc_execerror("# of flips exceeds (or ==) vector size", 0); }
	for (i=0; i < nx; i++) { x[i] = BVBASE; }
	for (i=0,jj=0; i < flip; i++) { /* flip these bits */
	  ii = (int) ((nx+1)*drand48());
	  if (x[ii]==BVBASE) {
	    x[ii] = 1.; 
            if (flag) { y[jj] = ii; jj++; }
	  } else {
	    i--;
	  }
	}
	return flip;
}
ENDVERBATIM
 
:* v1.hamming(v2[,v3]) compares v1 and v2 for matches, v3 gives diff vector
VERBATIM
static double hamming(void* vv) {
	int i, nx, ny, nz, prflag;
	double* x, *y, *z,sum;
	sum = 0.;
	nx = vector_instance_px(vv, &x);
	ny = vector_arg_px(1, &y);
        if (ifarg(2)) { /* write a diff vector to z */
          prflag = 1; nz = vector_arg_px(2, &z);
        } else { prflag = 0; }
	if (nx!=ny || (prflag && nx!=nz)) {
	  hoc_execerror("Vectors must be same size", 0);
	}
	for (i=0; i < nx; ++i) {
	  if (x[i] != y[i]) { sum++; 
            if (prflag) { z[i] = 1.; }
          } else if (prflag) { z[i] = 0.; }
        }
	return sum;
}
ENDVERBATIM
 
:* v1.indset(ind,x[,y]) sets indexed values to x and other values to optional y
VERBATIM
static double indset(void* vv) {
	int i, nx, ny, nz, flag;
	double* x, *y, *z, val, val2 ;
	nx = vector_instance_px(vv, &x);
	ny = vector_arg_px(1, &y);
        if (hoc_is_object_arg(2)) { 
          flag=1;
          nz = vector_arg_px(2, &z); 
          if (ny!=nz) { hoc_execerror("v.indset: Vector sizes don't match.", 0); }
        } else { flag=0; val=*getarg(2); }
        if (ifarg(3)) { 
          val2 = *getarg(3); 
          for (i=0; i<nx; i++) { x[i]=val2; }
        }
	for (i=0; i<ny; i++) {
	  if (y[i] > nx) { hoc_execerror("v.indset: Index exceeds vector size", 0); }
          if (flag) x[(int)y[i]]=z[i]; else x[(int)y[i]]=val;
        }
	return i;
}
ENDVERBATIM
 
VERBATIM
/* Maintain parallel int vector to avoid slowness of repeated casts */
static int scrsz=0;
static int *scr;
ENDVERBATIM

:* tmp.fewind(ind,vec1,vec2[,vec3,vec4,...])
: picks out numbers from multiple vectors using index ind
VERBATIM
static double fewind(void* vv) {
	int i, j, nx, ni, nv[10], num;
	double *x, *ind, *vvo[10];
	nx = vector_instance_px(vv, &x);
        for (i=1;ifarg(i);i++);
        i--; /* counted 1 arg too many */
	if (i>11) hoc_execerror("ERR: fewind can only handle 10 vectors", 0);
	num = i-1; /* number of vectors to be picked apart */
        for (i=0;i<num;i++) { 
          nv[i] = vector_arg_px(i+2, &vvo[i]);
          if (nx!=nv[i]) { printf("fewind ERR %d %d %d\n",i,nx,nv[i]);
            hoc_execerror("Vectors must all be same size: ", 0); }
        }
        ni = vector_arg_px(1, &ind);
        if (ni>scrsz) { 
          if (scrsz>0) { free(scr); scr=(int *)NULL; }
          scrsz=ni+10000;
          scr=(int *)ecalloc(scrsz, sizeof(int));
        }
        for (i=0;i<ni;i++) { scr[i]=(int)ind[i]; /* copy into integer array */
          if (scr[i]>nx || scr[i]<0) { printf("fewind ERR1 %d %d\n",scr[i],nx);
            hoc_execerror("Index vector out-of-bounds", 0); }
        }
        for (j=0;j<num;j++) {
          for (i=0;i<ni;i++) x[i]=vvo[j][scr[i]];    
          for (i=0;i<ni;i++) vvo[j][i]=x[i];   
          vv=vector_arg(j+2); vector_resize(vv, ni);
        }
	return ni;
}
ENDVERBATIM

:* v.iwr()
: picks out numbers from multiple vectors using index ind
VERBATIM
static double iwr(void* vv) {
  int i, j, nx;
  double *x;
  FILE* f, *hoc_obj_file_arg();
  f = hoc_obj_file_arg(1);
  nx = vector_instance_px(vv, &x);
  if (nx>scrsz) { 
    if (scrsz>0) { free(scr); scr=(int *)NULL; }
    scrsz=nx+10000;
    scr=(int *)ecalloc(scrsz, sizeof(int));
  }
  for (i=0;i<nx;i++) scr[i]=(int)x[i]; /* copy into integer array */
  fwrite(&nx,sizeof(int),1,f);  // write out the size
  fwrite(scr,sizeof(int),nx,f);
  return nx;
}
ENDVERBATIM

:* v.ird()
: picks out numbers from multiple vectors using index ind
VERBATIM
static double ird(void* vv) {
  int i, j, nx, n;
  double *x;
  FILE* f, *hoc_obj_file_arg();
  f = hoc_obj_file_arg(1);
  nx = vector_instance_px(vv, &x);
  fread(&n,sizeof(int),1,f);  // size
  if (n>scrsz) { 
    if (scrsz>0) { free(scr); scr=(int *)NULL; }
    scrsz=n+10000;
    scr=(int *)ecalloc(scrsz, sizeof(int));
  }
  if (n!=nx) { 
    nx=vector_buffer_size(vv);
    if (n<=nx) {
      vector_resize(vv, n); nx=n; 
    } else {
      printf("%d > %d :: ",n,nx);
      hoc_execerror("Vector max capacity too small for ird ", 0);
    }
  }
  fread(scr,sizeof(int),n,f);
  for (i=0;i<nx;i++) x[i]=(double)scr[i];
  return n;
}
ENDVERBATIM

:* ind.insct(ind,vec1,vec2)
: picks out numbers from multiple vectors using index ind
VERBATIM
static double insct(void* vv) {
	int i, j, k, nx, nv1, nv2, maxsz;
	double *x, *v1, *v2;
	nx = vector_instance_px(vv, &x);
        maxsz=vector_buffer_size(vv);
        vector_resize(vv, maxsz);
	nv1 = vector_arg_px(1, &v1);
	nv2 = vector_arg_px(2, &v2);
        for (i=0,k=0;i<nv1&&k<maxsz;i++) for (j=0;j<nv2&&k<maxsz;j++) if (v1[i]==v2[j]) {
          x[k++]=v1[i]; } /* v1[i] found in both vectors */
        if (k==maxsz) { 
          printf("\tinsct WARNING: ran out of room: %d\n",k);
          for (;i<nv1;i++,j=0) for (;j<nv2;j++) if (v1[i]==v2[j]) k++;
        } else { vector_resize(vv, k); }
	return (double)k;
}
ENDVERBATIM

:* vdest.cvlv(vsrc,vfilt)
: convolution
VERBATIM
static double cvlv(void* vv) {
  int i, j, k, nx, nsrc, nfilt;
  double *x, *src, *filt, sum, lpad, rpad;
  nx = vector_instance_px(vv, &x);
  nsrc = vector_arg_px(1, &src);
  nfilt = vector_arg_px(2, &filt);
  if (nx!=nsrc) { hoc_execerror("Vectors not same size: ", 0); }
  if (nfilt>nsrc) { hoc_execerror("Filter bigger than source ", 0); }
  for (i=0;i<nx;i++) {
    x[i]=0.0;
    for (j=0,k=i-(int)(nfilt/2);j<nfilt;j++,k++) {
      if (k>0 && k<nsrc-1) x[i]+=filt[j]*src[k];
    }
  }
}
ENDVERBATIM

:* vdest.intrp(flag)
: interpolate numbers replacing numbers given as flag
VERBATIM
static double intrp(void* vv) {
  int i, la, lb, nx;
  double *x, fl, a, b;
  nx = vector_instance_px(vv, &x);
  fl = *getarg(1);
  i=0; a=x[0]; la=0;
  if (a==fl) a=0;
  while (i<nx-1) {
    for (i=la+1;x[i]==fl && i<nx-1; i++) ; /* find the next one */
    b=x[i]; lb=i;
    for (i=la+1; i<lb; i++) x[i]= a + (b-a)/(lb-la)*(i-la);
    a=b; la=lb;
  }
}
ENDVERBATIM

:* tmp.nind(ind,vec1,vec2[,vec3,vec4,...])
: picks out numbers not in ind from multiple vectors
: ind must be sorted
VERBATIM
static double nind(void* vv) {
	int i, j, k, m, nx, ni, nv[10], num, c, last;
	double *x, *ind, *vvo[10];
	nx = vector_instance_px(vv, &x);
        for (i=0;ifarg(i);i++);
	if (i>9) hoc_execerror("ERR: nind can only handle 9 vectors", 0);
	num = i-2; /* number of vectors to be picked apart */
        for (i=0;i<num;i++) { 
          nv[i] = vector_arg_px(i+2, &vvo[i]);
          if (nx!=nv[i]) { printf("nind ERR %d %d %d\n",i,nx,nv[i]);
            hoc_execerror("Vectors must all be same size: ", 0); }
        }
        ni = vector_arg_px(1, &ind);
        c = nx-ni; /* the elems indexed are to be eliminated */
        if (ni>scrsz) { 
          if (scrsz>0) { free(scr); scr=(int *)NULL; }
          scrsz=ni+10000;
          scr=(int *)ecalloc(scrsz, sizeof(int));
        }
        for (i=0,last=-1;i<ni;i++) { 
          scr[i]=(int)ind[i]; /* copy into integer array */
          if (scr[i]<0 || scr[i]>=nx) hoc_execerror("nind(): Index out of bounds", 0);
          if (scr[i]<=last) hoc_execerror("nind(): indices should mono increase", 0);
          last=scr[i];
        }
        for (j=0;j<num;j++) { /* each output vec */
          for (i=0,last=-1,m=0;i<ni;i++) { /* the indices of ind */
            for (k=last+1;k<scr[i];k++) { x[m++]=vvo[j][k]; }
            last=scr[i];
          }
          for (k=last+1;k<nx;k++,m++) { x[m]=vvo[j][k]; }
          for (i=0;i<c;i++) vvo[j][i]=x[i];   
          vv=vector_arg(j+2); vector_resize(vv, c);
        }
	return c;
}
ENDVERBATIM

:* ind.keyind(key,vec1,vec2[,vec3,vec4,...])
: picks out indices of numbers in key from multiple vectors
VERBATIM
static double keyind(void* vv) {
  int i, j, k, ni, nk, nv[10], num;
  double *ind, *key, *vvo[10];
  ni = vector_instance_px(vv, &ind); // vv is ind
  for (i=0;ifarg(i);i++); i--; // drop back by one to get numarg()
  if (i>10) hoc_execerror("ERR: keyind can only handle 9 vectors", 0);
  num = i-1; /* number of vectors to be picked apart */
  for (i=0;i<num;i++) { 
    nv[i] = vector_arg_px(i+2, &vvo[i]);
    if (ni!=nv[i]) { printf("keyind ERR %d %d %d\n",i,ni,nv[i]);
    hoc_execerror("Non-key vectors must be same size: ", 0); }
  }
  nk = vector_arg_px(1, &key);
  if (nk!=num) { printf("keyind ERR2 %d %d\n",nk,num); 
    hoc_execerror("Key length must be number of vecs",0); }
  k=0;
  for (j=0;j<ni;j++) { // j steps through elements of vectors
    for (i=0;i<nk;i++) { // i steps through the key
      if (key[i]==ALL) continue; // OK - do nothing
      if (key[i]==NOZ)        { if (vvo[i][j]==0.) break; else continue; 
      } else if (key[i]==POS) { if (vvo[i][j]<=0.) break; else continue; 
      } else if (key[i]==NEG) { if (vvo[i][j]>=0.) break; else continue; 
      } else if (key[i]!=vvo[i][j]) break; // default
    }
    if (i==nk) ind[k++]=j; // all equal
  }
  vector_resize(vv, k);
  return k;
}
ENDVERBATIM

:* v1.flipbits(scratch,num) flips num bits
: uses scratch vector of same size as v1 to make sure doesn't flip same bit twice
VERBATIM
static double flipbits(void* vv) {	
	int i, nx, ny, flip, ii;
	double* x, *y;

	nx = vector_instance_px(vv, &x);
	ny = vector_arg_px(1, &y);
        flip = (int)*getarg(2);
	if (nx != ny) {
	  hoc_execerror("Scratch vector must be same size", 0);
	}
	for (i=0; i<nx; i++) { y[i]=x[i]; } /* copy */
	for (i=0; i < flip; i++) { /* flip these bits */
	  ii = (int) ((nx+1)*drand48());
	  if (x[ii]==y[ii]) { /* hasn't been touched */
	    x[ii]=((x[ii]==1.)?BVBASE:1.);
	  } else {
	    i--; /* do it again */
	  }
	}
	return flip;
}
ENDVERBATIM
 
:* v1.flipbalbits(scratch,num) flips num bits making sure to balance every 1
: flip with a 0 flip to preserve initial power
: uses scratch vector of same size as v1 to make sure doesn't flip same bit twice
VERBATIM
static double flipbalbits(void* vv) {	
	int i, nx, ny, flip, ii, next;
	double* x, *y;

	nx = vector_instance_px(vv, &x);
	ny = vector_arg_px(1, &y);
        flip = (int)*getarg(2);
	if (nx != ny) {
	  hoc_execerror("Scratch vector must be same size", 0);
	}
	for (i=0; i<nx; i++) { y[i]=x[i]; } /* copy */
        next = 1; /* start with 1 */
	for (i=0; i < flip;) { /* flip these bits */
	  ii = (int) ((nx+1)*drand48());
	  if (x[ii]==y[ii] && y[ii]==next) { /* hasn't been touched */
	    next=x[ii]=((x[ii]==1.)?BVBASE:1.);
            i++;
	  }
	}
	return flip;
}
ENDVERBATIM
 
:* v1.vpr() prints out neatly
VERBATIM
static double vpr(void* vv) {
  int i, nx;
  double* x;
  FILE* f;
  nx = vector_instance_px(vv, &x);
  if (ifarg(1)) { 
    f = hoc_obj_file_arg(1);
    for (i=0; i<nx; i++) {
      if (x[i]>BVBASE) { fprintf(f,"%d",1); 
      } else { fprintf(f,"%d",0); }
    }
    fprintf(f,"\n");
  } else {
    for (i=0; i<nx; i++) {
      if (x[i]>BVBASE) { printf("%d",1); 
      } else { printf("%d",0); }
    }
    printf("\n");
  }
  return 1.;
}
ENDVERBATIM
 
:* v1.thresh() threshold above and below thresh
VERBATIM
static double thresh(void* vv) {
  int i, nx, ny, cnt;
  double *x, *y, th;
  nx = vector_instance_px(vv, &x);
  cnt=0;
  if (hoc_is_object_arg(1)) { 
    ny = vector_arg_px(1, &y); th=0;
    if (nx!=ny) { hoc_execerror("Vector sizes don't match in thresh.", 0); }
    for (i=0; i<nx; i++) { if (x[i]>=y[i]) { x[i]= 1.; cnt++;} else { x[i]= BVBASE; } }
  } else { th = *getarg(1);
    for (i=0; i<nx; i++) { if (x[i] >= th) { x[i]= 1.; cnt++;} else { x[i]= BVBASE; } }
  }
  return cnt;
}
ENDVERBATIM
 
:* v1.triplet() return location of a triplet
VERBATIM
static double triplet(void* vv) {
  int i, nx;
  double *x, *y, a, b;
  nx = vector_instance_px(vv, &x);
  a = *getarg(1); b = *getarg(2);
  for (i=0; i<nx; i+=3) if (x[i]==a&&x[i+1]==b) break;
  if (i<nx) return (double)i; else return -1.;
}
ENDVERBATIM

:* state.onoff(volts,OBon,thresh,dur,refr)
:  looks at volts vector to decide if have rearch threshold thresh
:  OBon takes account of burst dur and refractory period
VERBATIM
static double onoff(void* vv) {
  int i, j, n, nv, non, nt, nd, nr, num;
  double *st, *vol, *obon, *thr, *dur, *refr;
  n = vector_instance_px(vv, &st);
  nv   = vector_arg_px(1, &vol);
  non  = vector_arg_px(2, &obon);
  nt   = vector_arg_px(3, &thr);
  nd   = vector_arg_px(4, &dur);
  nr   = vector_arg_px(5, &refr);
  if (n!=nv||n!=non||n!=nt||n!=nd||n!=nr) {
    hoc_execerror("v.onoff: vectors not all same size", 0); }
  for (i=0,num=0;i<n;i++) {
    obon[i]--;
    if (obon[i]>0.) { st[i]=1.; continue; } /* cell must fire */
    if (vol[i]>=thr[i] && obon[i]<= -refr[i]) { /* past refractory period */
        st[i]=1.; obon[i]=dur[i]; num++;
    } else { st[i]= BVBASE; }
  }
  return num;
}
ENDVERBATIM
 
:* vo.bpeval(outp,del)
:  service routine for back-prop: vo=outp*(1-outp)*del
VERBATIM
static double bpeval(void* vv) {
  int i, n, no, nd, flag=0;
  double add,div;
  double *vo, *outp, *del;
  n = vector_instance_px(vv, &vo);
  no   = vector_arg_px(1, &outp);
  nd   = vector_arg_px(2, &del);
  if (ifarg(3) && ifarg(4)) { add= *getarg(3); div= *getarg(4); flag=1;}
  if (n!=no||n!=nd) hoc_execerror("v.bpeval: vectors not all same size", 0);
  if (flag) {
    for (i=0;i<n;i++) vo[i]=((outp[i]+add)/div)*(1.-1.*((outp[i]+add)/div))*del[i];
  } else {
    for (i=0;i<n;i++) vo[i]=outp[i]*(1.-1.*outp[i])*del[i];
  }
}
ENDVERBATIM
 
:* v1.sedit() string edit
VERBATIM
static double sedit(void* vv) {
  int i, n, ni, f=0;
  double *x, *ind, th, val;
  Symbol* s; char *op;
  op = gargstr(1);
  n = vector_instance_px(vv, &x);
  sprintf(op,"hello world");
  return (double)n;
}
ENDVERBATIM

:* v1.w() a .where that sets elements in source vector
VERBATIM
static double w(void* vv) {
  int i, n, ni, f=0;
  double *x, *ind, th, val;
  Symbol* s; char *op;
  if (! ifarg(1)) { 
    printf("v1.w('op',thresh[,val,v2])\n"); 
    printf("  a .where that sets elements in v1 to val (default 0), if v2 => only look at these elements\n");
    printf("  'op'=='function name' is a .apply targeted by v2 called as func(x[i],thresh,val)\n");
    return -1.;
  }
  op = gargstr(1);
  n = vector_instance_px(vv, &x);
  th = *getarg(2);
  if (ifarg(3)) { val = *getarg(3); } else { val = 0.0; }
  if (ifarg(4)) {ni = vector_arg_px(4, &ind); f=1;} // just look at the spots indexed
  if (!strcmp(op,"==")) { 
    if (f==1) {for (i=0; i<ni;i++) {if (x[(int)ind[i]]==th) { x[(int)ind[i]] = val;}}
    } else {for (i=0; i<n; i++) {if (x[i]==th) { x[i] = val;}}}
  } else if (!strcmp(op,"!=")) {
    if (f==1) {for (i=0; i<ni;i++) {if (x[(int)ind[i]]!=th) { x[(int)ind[i]] = val;}}
    } else {for (i=0; i<n; i++) {if (x[i]!=th) { x[i] = val;}}}
  } else if (!strcmp(op,">")) {
    if (f==1) {for (i=0; i<ni;i++) {if (x[(int)ind[i]]>th) { x[(int)ind[i]] = val;}}
    } else {for (i=0; i<n; i++) {if (x[i]>th) { x[i] = val;}}}
  } else if (!strcmp(op,"<")) {
    if (f==1) {for (i=0; i<ni;i++) {if (x[(int)ind[i]]<th) { x[(int)ind[i]] = val;}}
    } else {for (i=0; i<n; i++) {if (x[i]<th) { x[i] = val;}}}
  } else if (!strcmp(op,">=")) {
    if (f==1) {for (i=0; i<ni;i++) {if (x[(int)ind[i]]>=th) { x[(int)ind[i]] = val;}}
    } else {for (i=0; i<n; i++) {if (x[i]>=th) { x[i] = val;}}}
  } else if (!strcmp(op,"<=")) {
    if (f==1) {for (i=0; i<ni;i++) {if (x[(int)ind[i]]<=th) { x[(int)ind[i]] = val;}}
    } else {for (i=0; i<n; i++) {if (x[i]<=th) { x[i] = val;}}}
  } else if ((s=hoc_lookup(op))) { // same as .apply but only does indexed ones
    if (f==1) {for (i=0; i<ni;i++) {
        hoc_pushx(x[(int)ind[i]]); hoc_pushx(th); hoc_pushx(val);
      x[(int)ind[i]]=hoc_call_func(s, 3);}
    } else {for (i=0; i<n;i++) {hoc_pushx(x[i]); hoc_pushx(th); hoc_pushx(val);
        x[i]=hoc_call_func(s, 3);}}
  }
  return (double)i;
}
ENDVERBATIM
  
:* dest.xing(src,tvec,thresh) 
: a .where that looks for threshold crossings and then doesn't pick another till
: comes back down again; places values from tvec in dest; interpolates
VERBATIM
static double xing(void* vv) {
  int i, j, nsrc, ndest, ntvec, f, maxsz;
  double *src, *dest, *tvec, th;
  ndest = vector_instance_px(vv, &dest);
  nsrc = vector_arg_px(1, &src); th=0;
  ntvec = vector_arg_px(2, &tvec); th=0;
  th = *getarg(3);
  maxsz=vector_buffer_size(vv);
  vector_resize(vv, maxsz);
  if (nsrc!=ntvec) hoc_execerror("v.xing: vectors not all same size", 0);
  for (i=0,f=0,j=0; i<nsrc; i++) {
    if (src[i]>th) { /* ? passing thresh */
      if (f==0) { 
        if (j>=maxsz) {
          printf("(%d) :: ",maxsz);
          hoc_execerror("Dest vec too small in xing ", 0);
        }
        if (i>0) { /* don't record if first value is above thresh */
          dest[j++] = tvec[i-1] + (tvec[i]-tvec[i-1])*(th-src[i-1])/(src[i]-src[i-1]);
        }
        f=1; 
      }
    } else {       /* below thresh */
      if (f==1) { f=0; } /* just passed going down */
    }
  }
  vector_resize(vv, j);
  return (double)i;
}
ENDVERBATIM

:* v1.xzero() looks for zero crossings 
VERBATIM
static double xzero(void* vv) {
  int i, n, nv, up;
  double *x, *vc, th, cnt=0.;
  n = vector_instance_px(vv, &x);
  nv = vector_arg_px(1, &vc);
  if (ifarg(2)) { th = *getarg(2); } else { th=0.0;}
  if (vc[0]<th) up=0; else up=1;  /* F or T */
  if (nv!=n) hoc_execerror("Vector size doesn't match.", 0);
  for (i=0; i<nv; i++) {
    x[i]=0.;
    if (up) { /* look for passing down */
      if (vc[i]<th) { x[i]=-1; up=0; cnt++; }
    } else if (vc[i]>th) { up=x[i]=1; cnt++; }
  }
  return cnt;
}
ENDVERBATIM
  
:* v1.sw(FROM,TO) switchs all FROMs to TO
VERBATIM
static double sw(void* vv) {
  int i, n;
  double *x, fr, to;
  n = vector_instance_px(vv, &x);
  fr = *getarg(1);
  to = *getarg(2);
  for (i=0; i<n; i++) {
    if (x[i]==fr) { x[i] = to;}
  }
  return n;
}
ENDVERBATIM
 
:* v.v2d(&x) copies from vector to double area -- a seg error waiting to happen
VERBATIM
static double v2d(void* vv) {
  int i, n, num;
  double *x, *to;
  n = vector_instance_px(vv, &x);
  to = hoc_pgetarg(1);
  if (ifarg(2)) { num = *getarg(2); } else { num=-1;}
  if (num>-1 && num!=n) { hoc_execerror("Vector size doesn't match.", 0); }
  for (i=0; i<n; i++) {to[i] = x[i];}
  return n;
}
ENDVERBATIM
 
:* v.d2v(&x) copies from double area to vector -- a seg error waiting to happen
VERBATIM
static double d2v(void* vv) {
  int i, n, num;
  double *x, *fr;
  n = vector_instance_px(vv, &x);
  fr = hoc_pgetarg(1);
  if (ifarg(2)) { num = *getarg(2); } else { num=-1;}
  if (num>-1 && num!=n) { hoc_execerror("Vector size doesn't match.", 0); }
  for (i=0; i<n; i++) {x[i] = fr[i];}
  return n;
}
ENDVERBATIM
 
:* v1.ismono([arg]) asks whether is monotonically increasing, with arg==-1 - decreasing
:  with arg==0 - all same
VERBATIM
static double ismono(void* vv) {
  int i, n, flag;
  double *x,last;
  n = vector_instance_px(vv, &x);
  if (ifarg(1)) { flag = (int)*getarg(1); } else { flag = 1; }
  last=x[0]; 
  if (flag==1) {
    for (i=1; i<n && x[i]>=last; i++) last=x[i];
  } else if (flag==-1) {
    for (i=1; i<n && x[i]<=last; i++) last=x[i];
  } else if (flag==0) {
    for (i=1; i<n && x[i]==last; i++) ;
  }
  if (i==n) return 1.; else return 0.;
}
ENDVERBATIM
 
:* v1.count(num) returns number of instances of num
VERBATIM
static double count(void* vv) {
  int i, n, cnt=0;
  double *x,num;
  n = vector_instance_px(vv, &x);
  num = *getarg(1);
  for (i=0; i<n; i++) if (x[i]==num) cnt++;
  return cnt;
}
ENDVERBATIM

:* fac (n) 
: from numerical recipes p.214
FUNCTION fac (n) {
VERBATIM {
    static int ntop=4;
    static double a[101]={1.,1.,2.,6.,24.};
    static double cof[6]={76.18009173,-86.50532033,24.01409822,
      -1.231739516,0.120858003e-2,-0.536382e-5};
    int j,n;
    n = (int)_ln;
    if (n<0) { hoc_execerror("No negative numbers ", 0); }
    if (n>100) { /* gamma function */
      double x,tmp,ser;
      x = _ln;
      tmp=x+5.5;
      tmp -= (x+0.5)*log(tmp);
      ser=1.0;
      for (j=0;j<=5;j++) {
        x += 1.0;
        ser += cof[j]/x;
      }
      return exp(-tmp+log(2.50662827465*ser));
    } else {
      while (ntop<n) {
        j=ntop++;
        a[ntop]=a[j]*ntop;
      }
    return a[n];
    }
}
ENDVERBATIM
}
 
:* logfac (n)
: from numerical recipes p.214
FUNCTION logfac (n) {
VERBATIM {
    static int ntop=4;
    static double a[101]={1.,1.,2.,6.,24.};
    static double cof[6]={76.18009173,-86.50532033,24.01409822,
      -1.231739516,0.120858003e-2,-0.536382e-5};
    int j,n;
    n = (int)_ln;
    if (n<0) { hoc_execerror("No negative numbers ", 0); }
    if (n>100) { /* gamma function */
      double x,tmp,ser;
      x = _ln;
      tmp=x+5.5;
      tmp -= (x+0.5)*log(tmp);
      ser=1.0;
      for (j=0;j<=5;j++) {
        x += 1.0;
        ser += cof[j]/x;
      }
      return (-tmp+log(2.50662827465*ser));
    } else {
      while (ntop<n) {
        j=ntop++;
        a[ntop]=a[j]*ntop;
      }
    return log(a[n]);
    }
}
ENDVERBATIM
}

PROCEDURE Expo (x) {
  TABLE RES FROM -20 TO 0 WITH 5000
  RES = exp(x)
}

FUNCTION AAA (x) {
  Expo(x)
  AAA = RES
}

:* dest.smgs(src,low,high,step,var)
:  rewrite on v.sumgauss() in nrn5.3::ivoc/ivocvect.cpp:1078
VERBATIM
static double smgs(void* vv) {	
  int i, j, nx, xv, nsum, points, maxsz;
  double *x, *sum;
  double  low , high , step , var , svar , scale , arg;

  nsum = vector_instance_px(vv, &sum);
  nx = vector_arg_px(1,&x);
  low = *getarg(2);
  high = *getarg(3);
  step = *getarg(4);
  var = *getarg(5);

  points = (int)((high-low)/step+hoc_epsilon);
  if (nsum!=points) { 
    maxsz=vector_buffer_size(vv);
    if (points<=maxsz) {
      vector_resize(vv, nsum); nsum=points; 
    } else {
      printf("%d > %d :: ",points,maxsz);
      hoc_execerror("Vector max capacity too small in smgs ", 0);
    }
  }

  svar = -2.*var*var/step/step;
  scale = 1./sqrt(2.*M_PI)/var;

  for (j=0; j<points;j++) sum[j] = 0.;
  for (i=0;i<nx;i++) {
    xv = (int)((x[i]-low)/step + 0.5);
    for (j=xv; j<points && (arg=(j-xv)*(j-xv)/svar)>-20;j++) {
      Expo(arg);
      sum[j] += RES;
    }
    for (j=xv-1; j>=0 && (arg=(j-xv)*(j-xv)/svar)>-20;j--) {
      Expo(arg);
      sum[j] += RES;
    }
  }
  for (j=0; j<points;j++) sum[j] *= scale;
  return svar;
}
ENDVERBATIM

:* PROCEDURE install_vecst()
PROCEDURE install_vecst() {
  VECST_INSTALLED=1
VERBATIM
  install_vector_method("slope", slope);
  install_vector_method("vslope", vslope);
  install_vector_method("stats", stats);
  install_vector_method("vstats", vstats);
  install_vector_method("indset", indset);
  install_vector_method("randwd", randwd);
  install_vector_method("hamming", hamming);
  install_vector_method("flipbits", flipbits);
  install_vector_method("flipbalbits", flipbalbits);
  install_vector_method("vpr", vpr);
  install_vector_method("thresh", thresh);
  install_vector_method("triplet", triplet);
  install_vector_method("onoff", onoff);
  install_vector_method("bpeval", bpeval);
  install_vector_method("w", w);
  install_vector_method("sedit", sedit);
  install_vector_method("xing", xing);
  install_vector_method("cvlv", cvlv);
  install_vector_method("intrp", intrp);
  install_vector_method("xzero", xzero);
  install_vector_method("sw", sw);
  install_vector_method("ismono", ismono);
  install_vector_method("count", count);
  install_vector_method("fewind", fewind);
  install_vector_method("nind", nind);
  install_vector_method("keyind", keyind);
  install_vector_method("insct", insct);
  install_vector_method("d2v", d2v);
  install_vector_method("v2d", v2d);
  install_vector_method("iwr", iwr);
  install_vector_method("ird", ird);
  install_vector_method("smgs", smgs);
ENDVERBATIM
}

: unable to get the drand here to recognize the same fseed used in rand
PROCEDURE vseed(seed) {
  VERBATIM
  srand48((unsigned)_lseed);
  ENDVERBATIM
}


VERBATIM
/* Below added by RTB 170913. Exerpt taken from changes made by Michael Hines
 to Buzsaki Wang 1996, modelDB Accession:26997 */ 
/* http://www.mit.edu/afs/athena/activity/c/cgs/src/math/drand48/ */
/*
 Michael Hines removed  all code not used by srand48 and drand48,
 the code handling non-floating point processor machines, and the
 pdp-11 fragment. Global names have my_ prefix added.
*/


/*	@(#)drand48.c	2.2	*/
/*LINTLIBRARY*/
/*
 *	drand48, etc. pseudo-random number generator
 *	This implementation assumes unsigned short integers of at least
 *	16 bits, long integers of at least 32 bits, and ignores
 *	overflows on adding or multiplying two unsigned integers.
 *	Two's-complement representation is assumed in a few places.
 *	Some extra masking is done if unsigneds are exactly 16 bits
 *	or longs are exactly 32 bits, but so what?
 *	An assembly-language implementation would run significantly faster.
 */
#define N	16
#define MASK	((unsigned)(1 << (N - 1)) + (1 << (N - 1)) - 1)
#define LOW(x)	((unsigned)(x) & MASK)
#define HIGH(x)	LOW((x) >> N)
#define MUL(x, y, z)	{ long l = (long)(x) * (long)(y); \
		(z)[0] = LOW(l); (z)[1] = HIGH(l); }
#define CARRY(x, y)	((long)(x) + (long)(y) > MASK)
#define ADDEQU(x, y, z)	(z = CARRY(x, (y)), x = LOW(x + (y)))
#define X0	0x330E
#define X1	0xABCD
#define X2	0x1234
#define A0	0xE66D
#define A1	0xDEEC
#define A2	0x5
#define C	0xB
#define SET3(x, x0, x1, x2)	((x)[0] = (x0), (x)[1] = (x1), (x)[2] = (x2))
#define SEED(x0, x1, x2) (SET3(x, x0, x1, x2), SET3(a, A0, A1, A2), c = C)

static unsigned x[3] = { X0, X1, X2 }, a[3] = { A0, A1, A2 }, c = C;
static unsigned short lastx[3];
static void next();

double
my_drand48()
{
	static double two16m = 1.0 / (1L << N);

	next();
	return (two16m * (two16m * (two16m * x[0] + x[1]) + x[2]));
}

static void
next()
{
	unsigned p[2], q[2], r[2], carry0, carry1;

	MUL(a[0], x[0], p);
	ADDEQU(p[0], c, carry0);
	ADDEQU(p[1], carry0, carry1);
	MUL(a[0], x[1], q);
	ADDEQU(p[1], q[0], carry0);
	MUL(a[1], x[0], r);
	x[2] = LOW(carry0 + carry1 + CARRY(p[1], r[0]) + q[1] + r[1] +
		a[0] * x[2] + a[1] * x[1] + a[2] * x[0]);
	x[1] = LOW(p[1] + r[0]);
	x[0] = LOW(p[0]);
}

void
my_srand48(seedval)
long seedval;
{
	SEED(X0, LOW(seedval), HIGH(seedval));
}

#if 0
#ifdef DRIVER
/*
	This should print the sequences of integers in Tables 2
		and 1 of the TM:
	1623, 3442, 1447, 1829, 1305, ...
	657EB7255101, D72A0C966378, 5A743C062A23, ...
 */
#include <stdio.h>

main()
{
	int i;

	for (i = 0; i < 80; i++) {
		printf("%4d ", (int)(4096 * my_drand48()));
		printf("%.4X%.4X%.4X\n", x[2], x[1], x[0]);
	}
}
#endif
#endif
ENDVERBATIM

Pinsky PF, Rinzel J (1994) Intrinsic and network rhythmogenesis in a reduced Traub model for CA3 neurons. J Comput Neurosci 1:39-60[PubMed]

References and models cited by this paper

References and models that cite this paper

Bhalla US, Bower JM (1993) Exploring parameter space in detailed single neuron models: simulations of the mitral and granule cells of the olfactory bulb. J Neurophysiol 69:1948-65 [Journal] [PubMed]

   Granule Cells of the Olfactory Bulb (Simoes_De_Souza et al. 2014) [Model]
   Olfactory Mitral Cell (Bhalla, Bower 1993) [Model]

Chamberlin NL, Traub RD, Dingledine R (1990) Role of EPSPs in initiation of spontaneous synchronized burst firing in rat hippocampal neurons bathed in high potassium. J Neurophysiol 64:1000-8 [Journal] [PubMed]

Hansel D, Sompolinsky H (1992) Synchronization and computation in a chaotic neural network. PHYSICAL REVIEW LETTERS 68:718-721 [PubMed]

Kay AR, Wong RK (1987) Calcium current activation kinetics in isolated pyramidal neurones of the Ca1 region of the mature guinea-pig hippocampus. J Physiol 392:603-16 [PubMed]

Kim HG, Connors BW (1993) Apical dendrites of the neocortex: correlation between sodium- and calcium-dependent spiking and pyramidal cell morphology. J Neurosci 13:5301-11 [PubMed]

Lancaster B, Adams PR (1986) Calcium-dependent current generating the afterhyperpolarization of hippocampal neurons. J Neurophysiol 55:1268-82 [Journal] [PubMed]

Llinas R (1975) Electroresponsive properties of dendrites in central neurons. Adv Neurol 12:1-13 [PubMed]

Masukawa LM, Prince DA (1984) Synaptic control of excitability in isolated dendrites of hippocampal neurons. J Neurosci 4:217-27

Miles R, Traub RD, Wong RK (1988) Spread of synchronous firing in longitudinal slices from the CA3 region of the hippocampus. J Neurophysiol 60:1481-96 [Journal] [PubMed]

Numann RE, Wadman WJ, Wong RK (1987) Outward currents of single hippocampal cells obtained from the adult guinea-pig. J Physiol 393:331-53 [PubMed]

Pinsky P (1994) Synchrony and clustering in an excitatory neural network with intrinsic relaxation kinetics. Siam J Appl Math (in Press)

Pinsky P, Rinzel J (1994) Phase-plane analysis of a reduced Traub model of a CA3 pyramidal neuron. In preparation

Rhodes PA, Gray CM (1994) Simulations of intrinsically bursting neocortical pyramidal neurons. Neural Computation 6:1086-1110

Rinzel J, Lee YS (1987) Dissection of a model for neuronal parabolic bursting. J Math Biol 25:653-75 [PubMed]

Ruelle D (1989) Elements of Differentiable Dynamics and Bifurcation Theory.

Sah P, Gibb AJ, Gage PW (1988) Potassium current activated by depolarization of dissociated neurons from adult guinea pig hippocampus. J Gen Physiol 92:263-78 [PubMed]

Sah P, Gibb AJ, Gage PW (1988) The sodium current underlying action potentials in guinea pig hippocampal CA1 neurons. J Gen Physiol 91:373-98 [PubMed]

Traub RD, Miles R (1991) Neuronal Networks Of The Hippocampus

Traub RD, Miles R, Buzsaki G (1992) Computer simulation of carbachol-driven rhythmic population oscillations in the CA3 region of the in vitro rat hippocampus. J Physiol 451:653-72 [PubMed]

Traub RD, Miles R, Jefferys JG (1993) Synaptic and intrinsic conductances shape picrotoxin-induced synchronized after-discharges in the guinea-pig hippocampal slice. J Physiol 461:525-47 [PubMed]

Traub RD, Wong RK, Miles R, Michelson H (1991) A model of a CA3 hippocampal pyramidal neuron incorporating voltage-clamp data on intrinsic conductances. J Neurophysiol 66:635-50 [Journal] [PubMed]

Wong RK, Prince DA, Basbaum AI (1979) Intradendritic recordings from hippocampal neurons. Proc Natl Acad Sci U S A 76:986-90 [PubMed]

Alturki A, Feng F, Nair A, Guntu V, Nair SS (2016) Distinct current modules shape cellular dynamics in model neurons. Neuroscience 334:309-331 [Journal] [PubMed]

   Distinct current modules shape cellular dynamics in model neurons (Alturki et al 2016) [Model]

Barreto E, Cressman JR (2011) Ion concentration dynamics as a mechanism for neuronal bursting Journal of Biological Physics 37:361-373 [Journal] [PubMed]

   Ion concentration dynamics as a mechanism for neuronal bursting (Barreto & Cressman 2011) [Model]

Bianchi D, Marasco A, Limongiello A, Marchetti C, Marie H, Tirozzi B, Migliore M (2012) On the mechanisms underlying the depolarization block in the spiking dynamics of CA1 pyramidal neurons J Comput. Neurosci. 33:207-25 [Journal] [PubMed]

   CA1 pyramidal neuron: depolarization block (Bianchi et al. 2012) [Model]

Booth V, Bose A (2001) Neural mechanisms for generating rate and temporal codes in model CA3 pyramidal cells. J Neurophysiol 85:2432-45 [Journal] [PubMed]

Booth V, Bose A (2002) Burst synchrony patterns in hippocampal pyramidal cell model networks. Network 13:157-77 [PubMed]

Booth V, Rinzel J, Kiehn O (1997) Compartmental model of vertebrate motoneurons for Ca2+-dependent spiking and plateau potentials under pharmacological treatment. J Neurophysiol 78:3371-85 [Journal] [PubMed]

Brown SA, Moraru II, Schaff JC, Loew LM (2011) Virtual NEURON: a strategy for merged biochemical and electrophysiological modeling. J Comput Neurosci 31(2):385-400 [Journal] [PubMed]

   A simplified cerebellar Purkinje neuron (the PPR model) (Brown et al. 2011) [Model]

Bush K, Knight J, Anderson C (2005) Optimizing conductance parameters of cortical neural models via electrotonic partitions. Neural Netw 18:488-96 [PubMed]

Chow CC, Kopell N (2000) Dynamics of spiking neurons with electrical coupling. Neural Comput 12:1643-78 [PubMed]

Coop AD, Reeke GN (2001) The composite neuron: a realistic one-compartment Purkinje cell model suitable for large-scale neuronal network simulations. J Comput Neurosci 10:173-86 [Journal] [PubMed]

Cressman JR, Ullah G, Ziburkus J, Schiff SJ, Barreto E (2009) The influence of sodium and potassium dynamics on excitability, seizures, and the stability of persistent states: I. Single neuron dynamics. J Comput Neurosci 26:159-70 [Journal] [PubMed]

   Single neuron with dynamic ion concentrations (Cressman et al. 2009) [Model]

Dasika VK, White JA, Colburn HS (2007) Simple models show the general advantages of dendrites in coincidence detection. J Neurophysiol 97:3449-59 [PubMed]

Davison A (2004) Biologically-detailed network modelling (Chapter 10) Computation Neuroscience: A Comprehensive Approach, Feng J, ed. pp.287

Davison AP, Feng J, Brown D (2000) A reduced compartmental model of the mitral cell for use in network models of the olfactory bulb. Brain Res Bull 51:393-9 [Journal] [PubMed]

   Olfactory Mitral Cell (Davison et al 2000) [Model]

Deyo SN, Lytton WW (1997) Inhibition can disrupt hypersynchrony in model neuronal networks. Prog Neuropsychopharmacol Biol Psychiatry 21:735-50 [PubMed]

Doiron B, Laing C, Longtin A, Maler L (2002) Ghostbursting: a novel neuronal burst mechanism. J Comput Neurosci 12:5-25 [Journal] [PubMed]

Doiron B, Longtin A, Turner RW, Maler L (2001) Model of gamma frequency burst discharge generated by conditional backpropagation. J Neurophysiol 86:1523-45 [Journal] [PubMed]

Duijnhouwer J, Remme MWH, Ooyen VANA, Pelt VANJ (2001) Influence of dendritic topology on firing patterns in model neurons Neurocomputing 38:183-189

Elaagouby A, Yuste R (1999) Role of calcium electrogenesis in apical dendrites: generation of intrinsic oscillations by an axial current. J Comput Neurosci 7:41-53 [Journal] [PubMed]

Ermentrout GB, Terman DH (2010) Mathematical Foundations of Neuroscience Interdisciplinary Applied Mathematics, Antman SS:Marsden JE:Sirovich L:Wiggins, ed. pp.1 [Journal]

   Mathematical Foundations of Neuroscience (Ermentrout and Terman 2010) [Model]

Feng J, Li G (2002) Impact of geometrical structures on the output of neuronal models: a theoretical and numerical analysis. Neural Comput 14:621-40 [PubMed]

Fernandez FR, Engbers JD, Turner RW (2007) Firing dynamics of cerebellar purkinje cells. J Neurophysiol 98:278-94 [PubMed]

Fernandez FR, Mehaffey WH, Turner RW (2005) Dendritic na+ current inactivation can increase cell excitability by delaying a somatic depolarizing afterpotential. J Neurophysiol 94:3836-48 [Journal] [PubMed]

   Dendritic Na inactivation drives a decrease in ISI (Fernandez et al 2005) [Model]

Forrest MD (2015) Simulation of alcohol action upon a detailed Purkinje neuron model and a simpler surrogate model that runs >400 times faster BMC Neuroscience 16:27 [Journal] [PubMed]

   Alcohol action in a detailed Purkinje neuron model and an efficient simplified model (Forrest 2015) [Model]

French DA, Gruenstein EI (2006) An integrate-and-fire model for synchronized bursting in a network of cultured cortical neurons. J Comput Neurosci 21:227-241 [Journal] [PubMed]

Gabbiani F, Cox SJ (2010) Mathematics for Neuroscientists :1-486 [Journal]

   Mathematics for Neuroscientists (Gabbiani and Cox 2010) [Model]

Gabbiani F, Krapp HG (2006) Spike-frequency adaptation and intrinsic properties of an identified, looming-sensitive neuron. J Neurophysiol 96:2951-62 [Journal] [PubMed]

   Leaky integrate-and-fire model of spike frequency adaptation in the LGMD (Gabbiani and Krapp 2006) [Model]

Golomb D, Shedmi A, Curtu R, Ermentrout GB (2006) Persistent synchronized bursting activity in cortical tissues with low magnesium concentration: a modeling study J Neurophysiol 95:1049-1067 [Journal] [PubMed]

   Persistent synchronized bursting activity in cortical tissues (Golomb et al 2005) [Model]

Golomb D, Yue C, Yaari Y (2006) Contribution of persistent Na+current and M-type K+ current to somatic bursting in CA1 pyramidal cells: combined experimental and modeling study J Neurophysiol 96(4):1912-26 [Journal] [PubMed]

   CA1 pyramidal cell: I_NaP and I_M contributions to somatic bursting (Golomb et al 2006) [Model]

Gottschalk A, Haney P (2003) Computational aspects of anesthetic action in simple neural models. Anesthesiology 98:548-64 [PubMed]

Gunn BG, Cox CD, Chen Y, Frotscher M, Gall CM, Baram TZ, Lynch G (2017) The Endogenous Stress Hormone CRH Modulates Excitatory Transmission and Network Physiology in Hippocampus. Cereb Cortex :1-17 [Journal] [PubMed]

   CRH modulates excitatory transmission and network physiology in hippocampus (Gunn et al. 2017) [Model]

Hahn PJ, Durand DM (2003) Bistability dynamics in simulations of neural activity in high-extracellular-potassium conditions. J Comput Neurosci 11:5-18 [Journal]

Hausser M, Mel B (2003) Dendrites: bug or feature? Curr Opin Neurobiol 13:372-83 [PubMed]

Hemond P, Epstein D, Boley A, Migliore M, Ascoli GA, Jaffe DB (2008) Distinct classes of pyramidal cells exhibit mutually exclusive firing patterns in hippocampal area CA3b Hippocampus 18(4):411-24 [Journal] [PubMed]

   CA3 pyramidal neuron: firing properties (Hemond et al. 2008) [Model]

Hill AA, Lu J, Masino MA, Olsen OH, Calabrese RL (2001) A model of a segmental oscillator in the leech heartbeat neuronal network. J Comput Neurosci 10:281-302 [Journal] [PubMed]

   Leech heart interneuron network model (Hill et al 2001, 2002) [Model]

Huang CW, Chow JC, Tsai JJ, Wu SN (2012) Characterizing the effects of Eugenol on neuronal ionic currents and hyperexcitability. Psychopharmacology (Berl) 221:575-587 [Journal] [PubMed]

   Effects of eugenol on the firing of action potentials in NG108-15 neurons (Huang et al. 2011) [Model]

Huang CW, Huang CC, Cheng JT, Tsai JJ, Wu SN (2007) Glucose and hippocampal neuronal excitability: Role of ATP-sensitive potassium channels. J Neurosci Res : [PubMed]

   The role of ATP-sensitive potassium channels in a hippocampal neuron (Huang et al. 2007) [Model]

Huang CW, Huang CC, Lin MW, Tsai JJ, Wu SN (2008) The synergistic inhibitory actions of oxcarbazepine on voltage-gated sodium and potassium currents in differentiated NG108-15 neuronal cells and model neurons. Int J Neuropsychopharmacol 11:597-610 [Journal] [PubMed]

   Synergistic inhibitory action of oxcarbazepine on INa and IK (Huang et al. 2008) [Model]

Huang CW, Huang CC, Wu SN (2007) Activation by Zonisamide, a Newer Anti-Epileptic Drug, of Large-Conductance Calcium-Activated Potassium Channel in Differentiated Hippocampal Neuron-Derived H19-7 Cells. J Pharmacol Exp Ther [Journal] [PubMed]

   Zonisamide-induced inhibition of the firing of APs in hippocampal neurons (Huang et al. 2007) [Model]

Jin DZ, Ramazanoglu FM, Seung HS (2007) Intrinsic bursting enhances the robustness of a neural network model of sequence generation by avian brain area HVC. J Comput Neurosci 23:283-99 [Journal] [PubMed]

Jones SR, Pinto DJ, Kaper TJ, Kopell N (2001) Alpha-frequency rhythms desynchronize over long cortical distances: a modeling study. J Comput Neurosci 9:271-91 [Journal] [PubMed]

Kepecs A, Raghavachari S (2007) Gating information by two-state membrane potential fluctuations. J Neurophysiol 97:3015-23 [PubMed]

Kobayashi R, Tsubo Y, Shinomoto S (2009) Made-to-order spiking neuron model equipped with a multi-timescale adaptive threshold. Front Comput Neurosci 3:9 [Journal] [PubMed]

   Multi-timescale adaptive threshold model (Kobayashi et al 2009) [Model]
   Multi-timescale adaptive threshold model (Kobayashi et al 2009) (NEURON) [Model]

Krichmar JL, Nasuto SJ, Scorcioni R, Washington SD, Ascoli GA (2002) Effects of dendritic morphology on CA3 pyramidal cell electrophysiology: a simulation study. Brain Res 941:11-28 [PubMed]

Kurian M, Crook SM, Jung R (2011) Motoneuron model of self-sustained firing after spinal cord injury. J Comput Neurosci [Journal] [PubMed]

   Motoneuron model of self-sustained firing after spinal cord injury (Kurian et al. 2011) [Model]

Laing CR, Doiron B, Longtin A, Noonan L, Turner RW, and Maler L (2003) Type I Burst Excitability Journal of Computational Neuroscience 14:329-342 [Journal]

Lansky P, Sanda P, He J (2006) The parameters of the stochastic leaky integrate-and-fire neuronal model. J Comput Neurosci 21:211-23 [Journal] [PubMed]

Lepora NF, Overton PG,Gurney K (2012) Efficient fitting of conductance-based model neurons from somatic current clamp. J. Comp. Neuro. 32(1):1-24 [Journal] [PubMed]

   Parameter estimation for Hodgkin-Huxley based models of cortical neurons (Lepora et al. 2011) [Model]

London M, Meunier C, Segev I (1999) Signal transfer in passive dendrites with nonuniform membrane conductance. J Neurosci 19:8219-33 [PubMed]

London M, Schreibman A, Hausser M, Larkum ME, Segev I (2002) The information efficacy of a synapse. Nat Neurosci 5:332-40 [PubMed]

Lytton WW, Hellman KM, Sutula TP (1998) Computer models of hippocampal circuit changes of the kindling model of epilepsy. Artif Intell Med 13:81-97 [PubMed]

Mainen ZF, Sejnowski TJ (1996) Influence of dendritic structure on firing pattern in model neocortical neurons. Nature 382:363-6 [Journal] [PubMed]

   [2 reconstructed morphologies on NeuroMorpho.Org]
   Pyramidal Neuron Deep, Superficial; Aspiny, Stellate (Mainen and Sejnowski 1996) [Model]

Marasco A, Limongiello A, Migliore M (2012) Fast and accurate low-dimensional reduction of biophysically detailed neuron models Scientific Reports 2:928:1-7 [Journal] [PubMed]

   Ca1 pyramidal neuron: reduction model (Marasco et al. 2012) [Model]

Mehaffey WH, Fernandez FR, Maler L, Turner RW (2007) Regulation of burst dynamics improves differential encoding of stimulus frequency by spike train segregation. J Neurophysiol 98:939-51 [PubMed]

Migliore M, Cook EP, Jaffe DB, Turner DA, Johnston D (1995) Computer simulations of morphologically reconstructed CA3 hippocampal neurons. J Neurophysiol 73:1157-68 [Journal] [PubMed]

   CA3 Pyramidal Neuron (Migliore et al 1995) [Model]

Morita K (2008) Possible role of dendritic compartmentalization in the spatial working memory circuit. J Neurosci 28:7699-724 [Journal] [PubMed]

   Working memory circuit with branched dendrites (Morita 2008) [Model]

Morse TM (2008) ModelDB in Computational Neuroscience Education - a research tool as interactive educational media. Interactive Educational Media for the Neural and Cognitive Sciences. Brains, Minds & Media, Lorenz S, Egelhaaf M, ed. pp.bmm1409 [Journal]

Park EH, Barreto E, Gluckman BJ, Schiff SJ, So P (2005) A Model of the Effects of Applied Electric Fields on Neuronal Synchronization J Comp Neurosci 19:53-70 [Journal]

Pospischil M, Piwkowska Z, Rudolph M, Bal T, Destexhe A (2007) Calculating event-triggered average synaptic conductances from the membrane potential. J Neurophysiol 97:2544-52 [PubMed]

   Code to calc. spike-trig. ave (STA) conduct. from Vm (Pospischil et al. 2007, Rudolph et al. 2007) [Model]

Powers RK, Dai Y, Bell BM, Percival DB, Binder MD (2005) Contributions of the input signal and prior activation history to the discharge behaviour of rat motoneurones. J Physiol 562:707-24 [Journal] [PubMed]

   Contibutions of input and history to motoneuron output (Powers et al 2005) [Model]

Reznik RI, Barreto E, Sander E, So P (2015) Effects of polarization induced by non-weak electric fields on the excitability of elongated neurons with active dendrites. J Comput Neurosci [Journal] [PubMed]

   Non-Weak E-Fields Pyramidal Neurons (Reznik et. al.,2015) [Model]

Roth A, Hausser M (2001) Compartmental models of rat cerebellar Purkinje cells based on simultaneous somatic and dendritic patch-clamp recordings. J Physiol 535:445-72 [PubMed]

Rowat PF, Elson RC (2004) State-Dependent Effects of Na Channel Noise on Neuronal burst Generation Journal of Computational Neuroscience 16:87-112 [Journal]

Rulkov NF, Timofeev I, Bazhenov M (2004) Oscillations in large-scale cortical networks: map-based model. J Comput Neurosci 17:203-23 [Journal] [PubMed]

   Large cortex model with map-based neurons (Rulkov et al 2004) [Model]

Saraga F, Skinner FK (2002) Dynamics and diversity in interneurons: a model exploration with slowly inactivating potassium currents. Neuroscience 113:193-203 [PubMed]

Segev I, London M (2000) Untangling dendrites with quantitative models. Science 290:744-50 [PubMed]

Segev I, Rall W (1998) Excitable dendrites and spines: earlier theoretical insights elucidate recent direct observations. Trends Neurosci 21:453-60 [PubMed]

Szalisznyo K (2006) Role of hyperpolarization-activated conductances in the lateral superior olive: A modeling study J Comput Neurosci 20:137-152 [Journal]

Takekawa T, Aoyagi T, Fukai T (2007) Synchronous and asynchronous bursting states: role of intrinsic neural dynamics. J Comput Neurosci 23:189-200 [Journal] [PubMed]

Taxidis J, Coombes S, Mason R, Owen MR (2012) Modeling sharp wave-ripple complexes through a CA3-CA1 network model with chemical synapses. Hippocampus 22:995-1017 [PubMed]

   CRH modulates excitatory transmission and network physiology in hippocampus (Gunn et al. 2017) [Model]

Tikidji-Hamburyan RA, Narayana V, Bozkus Z, El-Ghazawi TA (2017) Software for Brain Network Simulations: A Comparative Study Front. Neuroinform. [Journal]

   Brain networks simulators - a comparative study (Tikidji-Hamburyan et al 2017) [Model]

Tobin AE, Calabrese RL (2006) Endogenous and half-center bursting in morphologically inspired models of leech heart interneurons. J Neurophysiol 96:2089-106 [Journal] [PubMed]

Tobin AE, Van Hooser SD, Calabrese RL (2006) Creation and reduction of a morphologically detailed model of a leech heart interneuron. J Neurophysiol 96:2107-20 [Journal] [PubMed]

Tsay D, Yuste R (2002) Role of dendritic spines in action potential backpropagation: a numerical simulation study. J Neurophysiol 88:2834-45 [Journal] [PubMed]

   [10 reconstructed morphologies on NeuroMorpho.Org]

van der Velden L, van Hooft JA, Chameau P (2012) Altered dendritic complexity affects firing properties of cortical layer 2/3 pyramidal neurons in mice lacking the 5-HT3A receptor J Neurophysiol. 108:1521-1528 [Journal] [PubMed]

   Altered complexity in layer 2/3 pyramidal neurons (Luuk van der Velden et al. 2012) [Model]

van Elburg RA, van Ooyen A (2010) Impact of dendritic size and dendritic topology on burst firing in pyramidal cells. PLoS Comput Biol 6:e1000781 [Journal] [PubMed]

   Impact of dendritic size and topology on pyramidal cell burst firing (van Elburg and van Ooyen 2010) [Model]

van Ooyen A, Duijnhouwer J, Remme MW, van Pelt J (2002) The effect of dendritic topology on firing patterns in model neurons. Network 13:311-25 [PubMed]

Wang XJ, Liu Y, Sanchez-Vives MV, McCormick DA (2003) Adaptation and temporal decorrelation by single neurons in the primary visual cortex. J Neurophysiol 89:3279-93 [Journal] [PubMed]

   Temporal decorrelation by intrinsic cellular dynamics (Wang et al 2003) [Model]

Washington SD, Ascoli GA, Krichmar JL (2000) Statistical Analysis of Dendritic Morphology's Effect on CA3 Pyramidal Cell Electrophysiology Neurocomputing 32:261-269

Wetmore DZ, Mukamel EA, Schnitzer MJ (2007) Lock-and-key mechanisms of cerebellar memory recall based on rebound currents. J Neurophysiol : [PubMed]

White JA, Chow CC, Ritt J, Soto-Trevino C, Kopell N (1998) Synchronization and oscillatory dynamics in heterogeneous, mutually inhibited neurons. J Comput Neurosci 5:5-16 [Journal] [PubMed]

(103 refs)

Pinsky PF, Rinzel J (1995) Erratum for Intrinsic and network rhythmogenesis in a reduced Traub model for CA3 neurons. J Comput Neurosci 2:275-275

References and models cited by this paper

References and models that cite this paper

Booth V, Bose A (2001) Neural mechanisms for generating rate and temporal codes in model CA3 pyramidal cells. J Neurophysiol 85:2432-45 [Journal] [PubMed]

Booth V, Bose A (2002) Burst synchrony patterns in hippocampal pyramidal cell model networks. Network 13:157-77 [PubMed]

Gottschalk A, Haney P (2003) Computational aspects of anesthetic action in simple neural models. Anesthesiology 98:548-64 [PubMed]

(3 refs)