Motor cortex microcircuit simulation based on brain activity mapping (Chadderdon et al. 2014)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:146949
"... We developed a computational model based primarily on a unified set of brain activity mapping studies of mouse M1. The simulation consisted of 775 spiking neurons of 10 cell types with detailed population-to-population connectivity. Static analysis of connectivity with graph-theoretic tools revealed that the corticostriatal population showed strong centrality, suggesting that would provide a network hub. ... By demonstrating the effectiveness of combined static and dynamic analysis, our results show how static brain maps can be related to the results of brain activity mapping."
Reference:
1 . Chadderdon GL, Mohan A, Suter BA, Neymotin SA, Kerr CC, Francis JT, Shepherd GM, Lytton WW (2014) Motor cortex microcircuit simulation based on brain activity mapping. Neural Comput 26:1239-62 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Neocortex;
Cell Type(s): Neocortex V1 pyramidal corticothalamic L6 cell; Neocortex M1 pyramidal intratelencephalic L2-5 cell; Neocortex fast spiking (FS) interneuron; Neocortex spiking regular (RS) neuron; Neocortex spiking low threshold (LTS) neuron;
Channel(s):
Gap Junctions:
Receptor(s): GabaA; AMPA; NMDA;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Oscillations; Laminar Connectivity;
Implementer(s): Lytton, William [billl at neurosim.downstate.edu]; Neymotin, Sam [samn at neurosim.downstate.edu]; Shepherd, Gordon MG [g-shepherd at northwestern.edu]; Chadderdon, George [gchadder3 at gmail.com]; Kerr, Cliff [cliffk at neurosim.downstate.edu];
Search NeuronDB for information about:  Neocortex V1 pyramidal corticothalamic L6 cell; Neocortex M1 pyramidal intratelencephalic L2-5 cell; GabaA; AMPA; NMDA; Gaba; Glutamate;
/
src
README
infot.mod *
intf6.mod *
intfsw.mod *
matrix.mod
misc.mod *
nstim.mod *
staley.mod *
stats.mod *
vecst.mod *
boxes.hoc *
col.hoc
declist.hoc *
decmat.hoc *
decnqs.hoc *
decvec.hoc *
default.hoc *
drline.hoc *
filtutils.hoc *
gcelldata.hoc
gmgs102.nqs
grvec.hoc *
infot.hoc *
init.hoc
intfsw.hoc *
labels.hoc *
load.py
local.hoc *
main.hoc
misc.h *
miscfuncs.py
network.hoc
neuroplot.py *
nload.hoc
nqs.hoc *
nqsnet.hoc
nrnoc.hoc *
params.hoc
run.hoc
samutils.hoc *
saveoutput.hoc
saveweights.hoc
setup.hoc *
simctrl.hoc *
spkts.hoc *
staley.hoc *
stats.hoc *
stdgui.hoc *
syncode.hoc *
updown.hoc *
wdmaps2.nqs
xgetargs.hoc *
                            
// $Id: decmat.hoc,v 1.78 2011/07/11 05:58:31 samn Exp $ 
 
print "Loading decmat.hoc..."
 
//** mtriavg(mat,[mask]) - get average of elements in upper triangular part of matrix $o1
// mask is of same size as mat, has 0 for entries to skip
func mtriavg () { local i,j,s,c localobj mm,msk
  mm=$o1 s=c=0
  if(numarg()>1) { msk=$o2
    for i=0,mm.nrow-1 for j=i+1,mm.ncol-1 if(msk.x(i,j)) {
      s+=mm.x[i][j]
      c+=1
    }    
  } else {
    for i=0,mm.nrow-1 for j=i+1,mm.ncol-1 {
      s+=mm.x[i][j]
      c+=1
    }
  }
  if(c>0) return s/c else return 0
}

//** mltristd(mat,[mask]) - get stdev of elements in upper triangular part of matrix $o1
// mask is of same size as mat, has 0 for entries to skip
func mtristd () { local i,j,s,c,s2,tm localobj mm,msk
  mm=$o1 s=s2=c=0
  if(numarg()>1) { msk=$o2
    for i=0,mm.nrow-1 for j=i+1,mm.ncol-1 if(msk.x(i,j)) {
      s+=mm.x[i][j]
      s2+=mm.x[i][j]^2
      c+=1
    }
  } else {
    for i=0,mm.nrow-1 for j=i+1,mm.ncol-1 {
      s+=mm.x[i][j]
      s2+=mm.x[i][j]^2
      c+=1
    }
  }
  if(c>0) return sqrt(s2/c - (s/c)^2) else return 0
}

//** mltristd(mat,[mask]) - get std-error of elements in upper triangular part of matrix $o1
// mask is of same size as mat, has 0 for entries to skip
func mtristderr () { local i,j,s,c,s2,tm localobj mm,msk
  mm=$o1 s=s2=c=0
  if(numarg()>0) {
    msk=$o2
    for i=0,mm.nrow-1 for j=i+1,mm.ncol-1 if(msk.x(i,j)) {
      s+=mm.x[i][j]
      s2+=mm.x[i][j]^2
      c+=1
    }
  } else {
    for i=0,mm.nrow-1 for j=i+1,mm.ncol-1 {
      s+=mm.x[i][j]
      s2+=mm.x[i][j]^2
      c+=1
    }
  }
  if(c>0) return sqrt(s2/c - (s/c)^2)/sqrt(c) else return 0
}

//** vi2mi(ind[,COLS]) take index from vector and print out matrix indices using COLS 
obfunc vi2mi () { local x,co,r,c
  x=$1
  if (argtype(2)==0) co=$2 else co=COLS
  r=int(x/COLS) c=x%COLS
  if (verbose) print r,c
  return new Union(r,c)
}

//** symmclean(vec[,COLS]) remove redundant entries from vector representing a symm matrix
proc vimiclean() {print "Use symmclean() statt vimiclean()"}
func symmclean () { local ix,dg,cols,ii,n,flag localobj v1
  v1=$o1 
  if (argtype(2)==0) cols=$2 else cols=COLS
  if (argtype(3)==0) flag=$3 else flag=0 // flag gets rid of the diagonal as well
  for ii=0,v1.size-1 { ix=v1.x[ii]
    dg=(n=int(ix/(cols+1)))*(cols+1)
    if (ix<dg || ix>=dg+(cols-n)) v1.x[ii]=-1
    if (flag && ix==dg) v1.x[ii]=-1
  }
  v1.where(">",-1)
  return v1.size
}

//** msqdif(m1,m2) - get matrix with elements squared difference of m1-m2
obfunc msqdif () { local i,j localobj m1,m2,md
  m1=$o1 m2=$o2
  md=new Matrix(m1.nrow,m1.ncol)
  for i=0,m1.nrow-1 for j=0,m1.ncol-1 md.x[i][j]=(m1.x[i][j]-m2.x[i][j])^2
  return md
}

//** mthresh(mat,th) - get matrix with mat elements thresholded : values < t set to 0, >= t to 1
obfunc mthresh () { local i,j,t localobj mi,mo
  mi=$o1 t=$2
  mo=new Matrix(mi.nrow,mi.ncol)
  for i=0,mo.nrow-1 for j=0,mo.ncol-1 if(mi.x[i][j]>=t) mo.x[i][j]=1 else mo.x[i][j]=0
  return mo
}

//** mdif(m1,m2) - get matrix with elements difference of m1-m2
obfunc mdif () { local i,j localobj m1,m2,md
  m1=$o1 m2=$o2
  md=new Matrix(m1.nrow,m1.ncol)
  for i=0,m1.nrow-1 for j=0,m1.ncol-1 md.x[i][j]=(m1.x[i][j]-m2.x[i][j])
  return md
}

//** getttmat(nqs,[column-name]) - uses NQS $o1 to make time-time correlation matrix
//optional $s2 , otherwise default column-name = 'vc'.
//column $s2 must be .odec with Vector objects
obfunc getttmat () { local i,j,inc,szm localobj mc,nq,v1,v2,str,lc
  {nq=$o1    str=new String()}
  if(numarg()>1)str.s=$s2 else str.s="vc"
  {szm=nq.v.size()  mc=new Matrix(szm,szm)  lc=new List()}
  for i=0,szm-1 lc.append(nq.get(str.s,i).o)
  for i=0,szm-1 {
    mc.x(i,i)=1
    v1=lc.o(i) 
    for j=i+1,szm-1 {
      v2=lc.o(j) 
      mc.x(i,j)=mc.x(j,i)=v1.pcorrel(v2)
    }
  }
  return mc
}

//** svmat(matrix,path,[writesz,binary]) - save a matrix to file as ascii, each row on new line
//$o1==matrix, $s2==file path -- will overwrite!! , $3 = optional == 1 to include nrows,ncols
// writesz = write rows,cols . binary - use binary output format, this will write using vwrite
// and first two elements of written vector will have rows,cols (so writesz arg is ignored)
func svmat () { local pr,bin,a localobj m,f,myv1,myv2,mt
  {m=$o1 a=allocvecs(myv1,myv2) f=new File() f.wopen($s2)}
  if(!f.isopen()) {
    printf("svmat ERRA: couldnt open output file %s\n",$s2)
    return 0
  }
  if(numarg()>2)pr=$3 else pr=0
  if(numarg()>3)bin=$4 else bin=0
  if(bin) {
    mt=$o1.transpose()
    mt.to_vector(myv1)
    myv2.append($o1.ncol,$o1.nrow)
    myv2.append(myv1)
    myv2.vwrite(f)
  } else {
    if(pr) m.fprint(f) else m.fprint(0,f)
  }
  {f.close() dealloc(a)}
  return 1
}

//obfunc rdmat () { local pr localobj m,f
// m=$o1
// f=new File()
// f.wopen($s2)
// if(!f.isopen()) {
//   printf("svmat ERRA: couldnt open output file %s\n",$s2)
//   return 0
// }
// if(numarg()>2)pr=$3 else pr=0
// if(pr) m.fprint(f) else m.fprint(0,f)
// f.close()
// return 1
//}

//** matimagesc - display a matrix ($o1) in matlab using matimgsc program
// or a text file $s1 , $2 = min scale value , $3 = max scale value, $4 optional
// binary input flag
func matimagesc () { local x,binflag localobj str
  if(numarg()>3) binflag=$4 else binflag=1
  str=new String2()
  if(argtype(1)==2) {
    str.s=$s1
  } else {
    str.s="__tmp__mat__ml__.txt"
    if(!svmat($o1,str.s,1,binflag)) return 0
  }
  sprint(str.t,"/usr/site/nrniv/local/matlab/matimgsc %s %g %g %d",str.s,$2,$3,binflag)
  x = system(str.t)
  return x
}

//** pyimagesc - display a matrix ($o1) in python's matplotlib or a text file $s1
//opt:[$2=min scaling for colors, $3=max scaling for colors, [$s4=title,$s5=xlabel,$s6=ylabel]
func pyimagesc () { local i,minc,maxc localobj str,cmd,strout,strt,strl,fp
  str=new String2()
  strout=new String()//collect stdout from script
  if(argtype(1)==2) {
    str.s=$s1
  } else {
    str.s="__tmp__mat__py__.txt"
    if(!svmat($o1,str.s)) return 0
  }
  if(numarg()>1)minc=$2 else minc=-1
  if(numarg()>2)maxc=$3 else maxc=1  
  if(numarg()>3) { //write title,xlabel,ylabel for pyimgsc.py
    {strl=new String() strl.s="__tmp__str__py__.txt"    fp=new File()}
    fp.wopen(strl.s)
    if(!fp.isopen()){
      printf("pyimagesc ERRB: couldnt save tmp file %s\n",strl.s)
      return 0
    }
    for i=4,numarg() fp.printf("%s\n",$si)
    fp.close()
    sprint(str.t,"/u/samn/python/pyimgsc.py %s %g %g %s",str.s,minc,maxc,strl.s)
  } else {
    sprint(str.t,"/u/samn/python/pyimgsc.py %s %g %g",str.s,minc,maxc)
  }
  return system(str.t,strout.s)
}

//** matgcspks(vec1,vec2,samplingrate,pathin1,pathin2,pathout,pid])
// this function calls /usr/site/nrniv/local/matlab/callmatgcspks to send a signal to
// /usr/site/nrniv/local/matlab/matgcspks and run MZD's granger causality on spike trains
// this function returns an NQS with 1 row containing output
// vec1,vec2 are binned spike trains (spikes per time)
// returns a vector containing vec1->vec2,  vec2->vec1 granger causality
obfunc matgcspks () { local sampr,pid localobj vspks1,vspks2,fpin1,fpin2,fpout,str,vop,strin,strout
  if(numarg()==0) {printf("matgcspks(vec1,vec2,samplingrate)\nvec1,2 are binned spike trains\n") return nil}
  vspks1=$o1 vspks2=$o2 sampr=$3 vop=new Vector(2)
  fpin1=new File() fpin2=new File() fpout=new File() str=new String() strin=new String2() strout=new String()  
  {strin.s=$s4 strin.t=$s5 strout.s=$s6 pid=$7}
  {fpin1.wopen(strin.s) fpin2.wopen(strin.t)}
  if(!fpin1.isopen()) {printf("matgcspks ERRA: couldn't open %s for writing\n",strin.s)  return nil}
  if(!fpin2.isopen()) {printf("matgcspks ERRA: couldn't open %s for writing\n",strin.t)  return nil}
  {vspks1.vwrite(fpin1)  fpin1.close() vspks2.vwrite(fpin2)  fpin2.close()}
  sprint(str.s,"/usr/site/nrniv/local/matlab/callmatgcspks %d",pid)
  {printf("%s\n",str.s) system(str.s)}
  fpout.ropen(strout.s)
  while(!fpout.isopen()){
    printf("matgcspks ERRB: couldn't open %s for reading\n",strout.s)
    fpout.ropen(strout.s)
  }
  vop.vread(fpout)
  return vop
}

//** matspecgram(vec,samplingrate,maxfrequency,fftwinsz,[,dodraw,mincolor,maxcolor])
// if fftwinsz <= 0, matspecgram will pick a WINDOW size for STFT
obfunc matspecgram () { local a,sampr,maxfreq,dodraw,rows,cols,x,y,minc,maxc,fftwinsz\
                       localobj vin,fpin,fpout,str,vop,vof,nqo,strin,strout,vtmp,strd
  vin=$o1 sampr=$2 maxfreq=$3 fftwinsz=$4 fpin=new File() fpout=new File()
  str=new String() strin=new String() strout=new String() strd=new String()
  a=allocvecs(vtmp,vop,vof)  if(numarg()>4)dodraw=$5 else dodraw=1  
  if(!fpin.mktemp || !fpout.mktemp) {
    print "matspecgram ERR0: couldn't make temp files!"
    {dealloc(a) return nil}
  }  
  {strin.s=fpin.getname strout.s=fpout.getname strd.s="/usr/site/nrniv/local/matlab" fpin.wopen(strin.s)}
  if(!fpin.isopen()){printf("matspecgram ERRA: couldn't open %s for writing\n",strin.s) dealloc(a) return nil}
  {vin.vwrite(fpin)  fpin.close()}
  if(dodraw && numarg()>=7) {
    sprint(str.s,"%s/matspecgram %s %g %g %d %d %s %g %g",strd.s,strin.s,sampr,maxfreq,fftwinsz,dodraw,strout.s,$6,$7)
  } else {
    sprint(str.s,"%s/matspecgram %s %g %g %d %d %s",strd.s,strin.s,sampr,maxfreq,fftwinsz,dodraw,strout.s)
  }
  print str.s
  system(str.s)
  fpout.ropen(strout.s) 
  if(!fpout.isopen()){printf("matspecgram ERRB: couldn't open %s for reading\n",strout.s) dealloc(a) return nil}
  {vop.vread(fpout) vof.vread(fpout)}  
  {nqo=new NQS("f","pow")  nqo.odec("pow")}
  {rows=vof.size() cols=vop.size()/rows x=0}
  for y=0,rows-1 { vtmp.resize(0)
    vtmp.copy(vop,x,x+cols-1)
    nqo.append(vof.x(y),vtmp)
    x+=cols
  }
  {fpin.unlink() fpout.unlink()}
  {dealloc(a) return nqo}
}

//** matmodind(vec,samplingrate,lohz1,lohz2,hihz1,hihz2)
// this function calls /usr/site/nrniv/local/matlab/matmodindex to run Canolty's modulation index with Matlab
// returns an NQS with 1 row containing output
obfunc matmodind () { local a,sampr,lohz1,lohz2,hihz1,hihz2\
                       localobj vin,fpin,fpout,str,vop,nqo,strin,strout
  if(numarg()==0) {printf("matmodind(vec,samplingrate,lohz1,lohz2,hihz1,hihz2)\n") return nil}
  vin=$o1 sampr=$2 lohz1=$3 lohz2=$4 hihz1=$5 hihz2=$6
  fpin=new File() fpout=new File() str=new String() strin=new String() strout=new String()
  a=allocvecs(vop)
  if(!fpin.mktemp || !fpout.mktemp) {
    print "matmodind ERR0: couldn't make temp files!"
    {dealloc(a) return nil}
  }
  {strin.s=fpin.getname strout.s=fpout.getname}
  {fpin.wopen(strin.s)}
  if(!fpin.isopen()) {printf("matmodind ERRA: couldn't open %s for writing\n",strin.s) dealloc(a) return nil}
  {vin.vwrite(fpin)  fpin.close()}
  sprint(str.s,"/usr/site/nrniv/local/matlab/matmodindex %s %g %g %g %g %g %s",strin.s,sampr,lohz1,lohz2,hihz1,hihz2,strout.s)
  print str.s
  system(str.s)
  fpout.ropen(strout.s) 
  if(!fpout.isopen()){printf("matmodind ERRB: couldn't open %s for reading\n",strout.s) dealloc(a) return nil}
  {vop.vread(fpout) nqo=new NQS("modind","phase","lohz1","lohz2","hihz1","hihz2")}
  nqo.append(vop.x(0),vop.x(1),lohz1,lohz2,hihz1,hihz2)
  {dealloc(a) fpin.unlink() fpout.unlink()}
  return nqo
}

//** matpmtm(vec,samplingrate)
// this function calls /usr/site/nrniv/local/matlab/matpmtm to run multitaper power spectra using matlab, returns an nqs
obfunc matpmtm () { local a,sampr,rows,cols,x,y\
                       localobj vin,fpin,fpout,str,vop,vof,nqo,strin,strout
  if(numarg()==0) {printf("%s\n","matpmtm(vec,samplingrate)") return nil}
  vin=$o1 sampr=$2 fpin=new File() fpout=new File() str=new String() strin=new String() strout=new String()
  a=allocvecs(vop,vof)  
  if(!fpin.mktemp || !fpout.mktemp) {
    print "matpmtm ERR0: couldn't make temp files!"
    {dealloc(a) return nil}
  }
  {strin.s=fpin.getname strout.s=fpout.getname}
  {fpin.wopen(strin.s)}
  if(!fpin.isopen()) {printf("matpmtm ERRA: couldn't open %s for writing\n",strin.s) dealloc(a) return nil}
  {vin.vwrite(fpin)  fpin.close()}
  sprint(str.s,"/usr/site/nrniv/local/matlab/matpmtm %s %g %s",strin.s,sampr,strout.s)
  print str.s
  system(str.s)
  fpout.ropen(strout.s) 
  if(!fpout.isopen()){printf("matpmtm ERRB: couldn't open %s for reading\n",strout.s) dealloc(a) return nil}
  {vop.vread(fpout) vof.vread(fpout) nqo=new NQS("f","pow")}
  {nqo.v[0].copy(vof) nqo.v[1].copy(vop) dealloc(a) fpin.unlink() fpout.unlink()}
  return nqo
}

//** matfftpow(vec,samplingrate,maxfrequency,[dodraw,dosmooth,smoothwindowsz])
// this function calls /usr/site/nrniv/local/matlab/matfftpow to run power spectra using matlab, returns an nqs
// dosmooth controls whether to smooth output, is OFF by default
// smoothwindowsz controls size of running average smoothing of power spectra output
obfunc matfftpow () { local a,sampr,maxfreq,dodraw,rows,cols,x,y,dosmooth\
                       localobj vin,fpin,fpout,str,vop,vof,nqo,strin,strout
  if(numarg()==0) {printf("%s\n","matfftpow(vec,samplingrate,maxfrequency,[dodraw,dosmooth,smoothwindowsz])") return nil}
  vin=$o1 sampr=$2 maxfreq=$3 fpin=new File() fpout=new File() str=new String() strin=new String() strout=new String()
  a=allocvecs(vop,vof)  if(numarg()>3)dodraw=$4 else dodraw=1
  if(numarg()>4)dosmooth=$5 else dosmooth=0
  if(!fpin.mktemp || !fpout.mktemp) {
    print "matfftpow ERR0: couldn't make temp files!"
    {dealloc(a) return nil}
  }
  {strin.s=fpin.getname strout.s=fpout.getname}
  {fpin.wopen(strin.s)}
  if(!fpin.isopen()) {printf("matfftpow ERRA: couldn't open %s for writing\n",strin.s) dealloc(a) return nil}
  {vin.vwrite(fpin)  fpin.close()}
  if(numarg()>5) {
    sprint(str.s,"/usr/site/nrniv/local/matlab/matfftpow %s %g %d %d %s %d %d",strin.s,sampr,maxfreq,dodraw,strout.s,dosmooth,$6)
  } else sprint(str.s,"/usr/site/nrniv/local/matlab/matfftpow %s %g %d %d %s %d",strin.s,sampr,maxfreq,dodraw,strout.s,dosmooth)
  print str.s
  system(str.s)
  fpout.ropen(strout.s) 
  if(!fpout.isopen()){printf("matfftpow ERRB: couldn't open %s for reading\n",strout.s) dealloc(a) return nil}
  {vop.vread(fpout) vof.vread(fpout) nqo=new NQS("f","pow")}
  {nqo.v[0].copy(vof) nqo.v[1].copy(vop) dealloc(a) fpin.unlink() fpout.unlink()}
  return nqo
}

//** mathilbert(vec,samplingrate,minfrequency,maxfrequency)
obfunc mathilbert () { local a,sampr,minfreq,maxfreq\
                       localobj vin,fp,str,vfilt,vph,vamp,nqo,strin,strout
  vin=$o1 sampr=$2 minfreq=$3 maxfreq=$4 fp=new File() str=new String() strin=new String() strout=new String()
  a=allocvecs(vfilt,vph,vamp) 
  {sprint(strin.s,"__tmp__mat__hilbert__input__vec__.vec")  sprint(strout.s,"__tmp__mat__hilbert_output__vec__.vec")}
  {fp.wopen(strin.s)}
  if(!fp.isopen()) {
    printf("mathilbert ERRA: couldn't open %s for writing\n",strin.s)
    dealloc(a)
    return nil
  }
  {vin.vwrite(fp)  fp.close()}
  sprint(str.s,"/usr/site/nrniv/local/matlab/mathilbert %s %g %g %g %s",strin.s,sampr,minfreq,maxfreq,strout.s)
  print str.s
  system(str.s)
  fp.ropen(strout.s) 
  if(!fp.isopen()) {
    printf("mathilbert ERRB: couldn't open %s for reading\n",strout.s)
    dealloc(a)
    return nil
  }
  {vfilt.vread(fp) vph.vread(fp) vamp.vread(fp) nqo=new NQS("filt","phase","amp","t")}
  {nqo.v[0].copy(vfilt) nqo.v[1].copy(vph) nqo.v[2].copy(vamp)}
  {nqo.v[3].indgen(0,1e3*nqo.v[2].size/sampr,1e3/sampr)  nqo.v[3].resize(nqo.v[2].size)}
  dealloc(a)
  return nqo
}

//** matprincomp(input Matrix object)
// returns list with : eigenvectors as Vector, scores as Vector, eigenvalues as Vector, scores as Matrix
// scores has same size as $o1, eigenvectors is $o1.ncols^2, eigenvalues is $o1.ncols
// input matrix has rows as observations and columns as dimensions
obfunc matprincomp () { local i,j,k localobj mcin,fp,str,strin,strout,lsout,vcoeff,vscore,vlat,mscore
  mcin=$o1 fp=new File() str=new String() strin=new String() strout=new String() lsout=new List()
  {vcoeff=new Vector() vscore=new Vector() vlat=new Vector()}
  {sprint(strin.s,"__tmp__mat__princomp__input__mat__.txt")  sprint(strout.s,"__tmp__mat__princomp_output__vec__.vec")}
  if(!svmat(mcin,strin.s,1)) {
    printf("matprincomp ERRA: couldn't open %s for writing\n",strin.s)
    return nil
  }
  sprint(str.s,"/usr/site/nrniv/local/matlab/matprincomp %s %s",strin.s,strout.s)
  print str.s
  system(str.s)
  fp.ropen(strout.s) 
  if(!fp.isopen()) {
    printf("matprincomp ERRB: couldn't open %s for reading\n",strout.s)
    return nil
  }
  {vcoeff.vread(fp) vscore.vread(fp) vlat.vread(fp) fp.close()}
  mscore=new Matrix(mcin.nrow,mcin.ncol)
  mscore.from_vector(vscore) //reads it in in column major order
  {lsout.append(vcoeff) lsout.append(vscore) lsout.append(vlat) lsout.append(mscore)}
  return lsout
}

//** matmin(mat) - return min element of mat
func matmin () { local i,j,me,tmp localobj m
  m=$o1 
  me=m.getrow(0).min()
  for i=1,m.nrow-1 if((tmp=m.getrow(i).min)<me) me=tmp
  return me
}

//** matmax(mat) - return max element of mat
func matmax () { local i,j,me,tmp localobj m
  m=$o1 
  me=m.getrow(0).max()
  for i=1,m.nrow-1 if((tmp=m.getrow(i).max)>me) me=tmp
  return me
}

//** mlk(mat) - use vlk to print rows of matrix
// a matrix will have it's lower/smaller rows printed first:
//    1 2 3 
//    4 5 6 
//    7 8 9 
proc mlk () { local i localobj m
  m=$o1
  for i=0,m.nrow-1 vlk(m.getrow(i))
}

//** mateq(mat1,mat2) - return 1 iff matrix row Vectors are eq, 0 otherwise
func mateq () { local i localobj m1,m2
  m1=$o1 m2=$o2
  if(m1.nrow!=m2.nrow || m1.ncol!=m2.ncol) return 0
  for i=0,m1.nrow-1 if(m1.getrow(i).eq(m2.getrow(i))==0) return 0
  return 1
}

//** matavg - return average value in Matrix $o1
func matavg () { local i,s localobj m
  m=$o1
  if(m.nrow<1 || m.ncol<1) {
    printf("matavg ERRA: empty matrix!\n")
    return 0
  }
  s=0
  for i=0,m.nrow-1 s += m.getrow(i).sum()
  return s/(m.nrow*m.ncol)
}

//** avgmat(list of Matrix) - return Matrix that has its elements avg of elements in $o1 List
obfunc avgmat () { local sz,i localobj ma
  sz=$o1.count
  if(sz<1) return nil
  ma=new Matrix($o1.o(0).nrow,$o1.o(0).ncol)
  for i=0,sz-1 ma.add($o1.o(i))
  ma.muls(1.0/sz)
  return ma
}

//** stdmat(list of Matrix) - return Matrix that has its elements stdev of elements in $o1 List
obfunc stdmat () {  local sz,i,j,k localobj ms,ma
  sz=$o1.count
  if(sz<1) return nil
  ma=new Matrix($o1.o(0).nrow,$o1.o(0).ncol)
  ms=new Matrix($o1.o(0).nrow,$o1.o(0).ncol)
  for i=0,sz-1 for j=0,ma.nrow-1 for k=0,ma.ncol-1 {
    ms.x(j,k) += $o1.o(i).x(j,k)^2
    ma.x(j,k) += $o1.o(i).x(j,k)
  }
  ma.muls(1.0/sz)
  ms.muls(1.0/sz)  
  for j=0,ma.nrow-1 for k=0,ma.ncol-1 {
    ms.x(j,k) -= ma.x(j,k)^2
    if(ms.x(j,k) > 1e-9) ms.x(j,k) = sqrt(ms.x(j,k)) else ms.x(j,k) = 0
  }
  return ms
}

//** chgmat(list of before Matrices, list of after Matrices) - returns change in each entry in units of std-dev
obfunc chgmat () { local szbef,szaft,i,j,k localobj lbef,laft,mavg,mstd,lchg,mchg,mt
  lbef=$o1 laft=$o2
  szbef=lbef.count szaft=laft.count
  lchg=new List()
  mavg=avgmat(lbef)
  mstd=stdmat(lbef)
  mchg=new Matrix(mavg.nrow,mavg.ncol)
  for i=0,szaft-1 {
    mt=laft.o(i)
    for j=0,mt.nrow-1 for k=0,mt.ncol-1 {
      if(mstd.x(j,k)>1e-9) {
        mchg.x(j,k) += ( mt.x(j,k) - mavg.x(j,k) ) / mstd.x(j,k)
      } else if(szbef==1) {
        mchg.x(j,k) += ( mt.x(j,k) - mavg.x(j,k) ) 
      }
    }
  }
  return mchg
}

//** getlv(rows,cols) - make a List of Vectors as 2D array
//$1 == # of rows (vectors), $2 == # of cols (size of vectors)
obfunc getlv () { local idx,rows,cols localobj ls
  ls=new List()
  rows=$1 cols=$2
  for idx=0,rows-1 ls.append(new Vector(cols))
  return ls
}

//** vec2mat(vec,rows) - get a matrix from a vec -- row major order
obfunc vec2mat () { local i,j,k,rows,cols localobj vin,mout
  vin=$o1 rows=$2 cols=vin.size/rows mout=new Matrix(rows,cols) k=0
  for i=0,rows-1 for j=0,cols-1 {
    mout.x(i,j)=vin.x(k)
    k+=1
  }
  return mout
}

//** mat2vec(mat) - get a vec from a matrix -- row major order 
obfunc mat2vec () { local i,j,k,rows,cols localobj mat,vout
  mat=$o1 rows=mat.nrow cols=mat.ncol i=j=k=0 vout=new Vector(rows*cols)
  for i=0,rows-1 for j=0,cols-1 {
    vout.x(k)=mat.x(i,j)
    k+=1
  }
  return vout
}
//** mltmed(mat) - get median values from lower-triangular portion - lower triang. means smaller rows
// this matrix printed as (with printf or mlk):
//    1 2 3 
//    4 5 6 
//    7 8 9 
// will have mltmed of 3, since uses 2,3,6 from bottom of matrix to get median
func mltmed () { local i,j,a localobj m,vo
  a=allocvecs(vo) m=$o1
  for i=0,m.nrow-1 for j=i+1,m.ncol-1 vo.append(m.x(i,j))
  return vo.median()
}
//** mzerout(mat) - zero out everything >= diagonal
// a matrix printed as (with printf or mlk):
//    1 2 3 
//    4 5 6 
//    7 8 9 
// will end up as:
//    0 2 3 
//    0 0 6 
//    0 0 0 
proc mzerout () { local i,j,a localobj m,vo
  a=allocvecs(vo) m=$o1
  for i=0,m.nrow-1 for j=0,i m.x(i,j)=0
}
//** matsqsymm(matrix) - return 1 iff matrix is square and symmetric
func matsqsymm () { local i,j localobj mc
  mc=$o1  if(mc.nrow!=mc.ncol) return 0
  for i=0,mc.nrow-1 for j=i+1,mc.ncol-1 if(mc.x(i,j)!=mc.x(j,i)) return 0
  return 1
}
//** getsubmat(matrix,startx,endx,starty,endy) - copy subsection of matrix
// and return in new output matrix
obfunc getsubmat () { local x,y,startx,endx,starty,endy localobj m1,msub
  m1=$o1
  startx=$2 endx=$3 starty=$4 endy=$5
  msub=new Matrix(endy-starty+1,endx-startx+1)
  for y=starty,endy for x=startx,endx msub.x(y-starty,x-startx)=m1.x(y,x)
  return msub
}

Chadderdon GL, Mohan A, Suter BA, Neymotin SA, Kerr CC, Francis JT, Shepherd GM, Lytton WW (2014) Motor cortex microcircuit simulation based on brain activity mapping. Neural Comput 26:1239-62[PubMed]

References and models cited by this paper

References and models that cite this paper

Ainsworth M, Lee S, Cunningham MO, Roopun AK, Traub RD, Kopell NJ, Whittington MA (2011) Dual gamma rhythm generators control interlaminar synchrony in auditory cortex. J Neurosci 31:17040-51 [PubMed]

Anderson CT, Sheets PL, Kiritani T, Shepherd GM (2010) Sublayer-specific microcircuits of corticospinal and corticostriatal neurons in motor cortex. Nat Neurosci 13:739-44 [PubMed]

Apicella AJ, Wickersham IR, Seung HS, Shepherd GM (2012) Laminarly orthogonal excitation of fast-spiking and low-threshold-spiking interneurons in mouse motor cortex. J Neurosci 32:7021-33 [PubMed]

Bastos AM, Usrey WM, Adams RA, Mangun GR, Fries P, Friston KJ (2012) Canonical microcircuits for predictive coding. Neuron 76:695-711 [PubMed]

Beltramo R, D'Urso G, Dal Maschio M, Farisello P, Bovetti S, Clovis Y, Lassi G, Tucci V, De P (2013) Layer-specific excitatory circuits differentially control recurrent network dynamics in the neocortex. Nat Neurosci 16:227-34 [PubMed]

Bernhardt BC, Chen Z, He Y, Evans AC, Bernasconi N (2011) Graph-theoretical analysis reveals disrupted small-world organization of cortical thickness correlation networks in temporal lobe epilepsy. Cereb Cortex 21:2147-57 [PubMed]

Binzegger T, Douglas RJ, Martin KA (2004) A quantitative map of the circuit of cat primary visual cortex. J Neurosci 24:8441-53 [PubMed]

Bureau I, Shepherd GM, Svoboda K (2004) Precise development of functional and anatomical columns in the neocortex. Neuron 42:789-801 [PubMed]

Cardin JA, Carlen M, Meletis K, Knoblich U, Zhang F, Deisseroth K, Tsai LH, Moore CI (2009) Driving fast-spiking cells induces gamma rhythm and controls sensory responses. Nature 459:663-7 [PubMed]

Carnevale NT, Hines ML (2006) The NEURON Book

Chadderdon GL, Neymotin SA, Kerr CC, Lytton WW (2012) Reinforcement learning of targeted movement in a spiking neuronal model of motor cortex. PLoS One 7:e47251-57 [PubMed]

Chen D, Fetz EE (2005) Characteristic membrane potential trajectories in primate sensorimotor cortex neurons recorded in vivo. J Neurophysiol 94:2713-25 [PubMed]

Dantzker JL, Callaway EM (2000) Laminar sources of synaptic input to cortical inhibitory interneurons and pyramidal neurons. Nat Neurosci 3:701-7 [PubMed]

Dembrow NC, Chitwood RA, Johnston D (2010) Projection-specific neuromodulation of medial prefrontal cortex neurons. J Neurosci 30:16922-37 [PubMed]

Douglas RJ, Martin KA (2004) Neuronal circuits of the neocortex. Annu Rev Neurosci 27:419-51 [PubMed]

Freeman LC (1977) A set of measures of centrality based on betweenness Sociometry 40:35-41

Hattox AM, Nelson SB (2007) Layer V neurons in mouse cortex projecting to different targets have distinct physiological properties. J Neurophysiol 98:3330-40 [PubMed]

Hooks BM, Hires SA, Zhang YX, Huber D, Petreanu L, Svoboda K, Shepherd GM (2011) Laminar analysis of excitatory local circuits in vibrissal motor and sensory cortical areas. PLoS Biol 9:e1000572 [Journal] [PubMed]

   Laminar analysis of excitatory circuits in vibrissal motor and sensory cortex (Hooks et al. 2011) [Model]

Hooks BM, Mao T, Gutnisky DA, Yamawaki N, Svoboda K, Shepherd GM (2013) Organization of cortical and thalamic input to pyramidal neurons in mouse motor cortex. J Neurosci 33:748-60 [PubMed]

Isomura Y, Harukuni R, Takekawa T, Aizawa H, Fukai T (2009) Microcircuitry coordination of cortical motor information in self-initiation of voluntary movements. Nat Neurosci 12:1586-93 [PubMed]

Kameda H, Hioki H, Tanaka YH, Tanaka T, Sohn J, Sonomura T, Furuta T, Fujiyama F, Kaneko T (2012) Parvalbumin-producing cortical interneurons receive inhibitory inputs on proximal portions and cortical excitatory inputs on distal dendrites. Eur J Neurosci 35:838-54 [PubMed]

Katzel D, Zemelman BV, Buetfering C, Wölfel M, Miesenböck G (2011) The columnar and laminar organization of inhibitory connections to neocortical excitatory cells. Nat Neurosci 14:100-7 [PubMed]

Kerr C, Van_albada S, Neymotin S, Chadderdon G, Robinson P, Lytton W (2012) Effects of basal ganglia on cortical computation: A hybrid network-field model Soc. Neurosci. Abstracts 301.16

Kerr CC, Neymotin SA, Chadderdon GL, Fietkiewicz CT, Francis JT, Lytton WW (2012) Electrostimulation as a prosthesis for repair of information flow in a computer model of neocortex IEEE Transactions on Neural Systems & Rehabilitation Engineering 20(2):153-60 [Journal] [PubMed]

   Prosthetic electrostimulation for information flow repair in a neocortical simulation (Kerr 2012) [Model]

Kiritani T, Wickersham IR, Seung HS, Shepherd GM (2012) Hierarchical connectivity and connection-specific dynamics in the corticospinal-corticostriatal microcircuit in mouse motor cortex. J Neurosci 32:4992-5001 [PubMed]

Lang S, Dercksen VJ, Sakmann B, Oberlaender M (2011) Simulation of signal flow in 3D reconstructions of an anatomically realistic neural network in rat vibrissal cortex. Neural Netw : [PubMed]

Lefort S, Tomm C, Floyd Sarria JC, Petersen CC (2009) The excitatory neuronal network of the C2 barrel column in mouse primary somatosensory cortex. Neuron 61:301-16 [PubMed]

Lytton W, Stewart M (2006) Rule-based firing for network simulations Neurocomputing 69:1160-1164

Lytton WW, Neymotin SA, Hines ML (2008) The virtual slice setup. J Neurosci Methods 171:309-15 [Journal] [PubMed]

   The virtual slice setup (Lytton et al. 2008) [Model]

Lytton WW, Omurtag A (2007) Tonic-clonic transitions in computer simulation. J Clin Neurophysiol 24:175-81 [PubMed]

   Tonic-clonic transitions in a seizure simulation (Lytton and Omurtag 2007) [Model]

Lytton WW, Omurtag A, Neymotin SA, Hines ML (2008) Just in time connectivity for large spiking networks Neural Comput 20(11):2745-56 [Journal] [PubMed]

   JitCon: Just in time connectivity for large spiking networks (Lytton et al. 2008) [Model]

Lytton WW, Stewart M (2005) A rule-based firing model for neural networks Int J Bioelectromagn 7:47-50

Markram H (2006) The blue brain project. Nat Rev Neurosci 7:153-60 [Journal] [PubMed]

   [241 reconstructed morphologies on NeuroMorpho.Org]

Miller MN, Okaty BW, Nelson SB (2008) Region-specific spike-frequency acceleration in layer 5 pyramidal neurons mediated by Kv1 subunits. J Neurosci 28:13716-26 [PubMed]

Morgan RJ, Soltesz I (2008) Nonrandom connectivity of the epileptic dentate gyrus predicts a major role for neuronal hubs in seizures. Proc Natl Acad Sci U S A 105:6179-84 [Journal] [PubMed]

   Dentate gyrus (Morgan et al. 2007, 2008, Santhakumar et al. 2005, Dyhrfjeld-Johnsen et al. 2007) [Model]

Morishima M, Kawaguchi Y (2006) Recurrent connection patterns of corticostriatal pyramidal cells in frontal cortex. J Neurosci 26:4394-405 [PubMed]

Neymotin S, Kerr C, Francis J, Lytton W (2011) Training oscillatory dynamics with spike-timing-dependent plasticity in a computer model of neocortex Signal Processing in Medicine and Biology Symposium (SPMB), IEEE :1-6

Neymotin SA, Jacobs KM, Fenton AA, Lytton WW (2011) Synaptic information transfer in computer models of neocortical columns. J Comput Neurosci. 30(1):69-84 [Journal] [PubMed]

   Synaptic information transfer in computer models of neocortical columns (Neymotin et al. 2010) [Model]

Neymotin SA, Lazarewicz MT, Sherif M, Contreras D, Finkel LH, Lytton WW (2011) Ketamine disrupts theta modulation of gamma in a computer model of hippocampus Journal of Neuroscience 31(32):11733-11743 [Journal] [PubMed]

   Ketamine disrupts theta modulation of gamma in a computer model of hippocampus (Neymotin et al 2011) [Model]

Neymotin SA, Lee H, Park E, Fenton AA, Lytton WW (2011) Emergence of physiological oscillation frequencies in a computer model of neocortex. Front Comput Neurosci 5:19-75 [Journal] [PubMed]

   Emergence of physiological oscillation frequencies in neocortex simulations (Neymotin et al. 2011) [Model]

Oviedo HV, Bureau I, Svoboda K, Zador AM (2010) The functional asymmetry of auditory cortex is reflected in the organization of local cortical circuits. Nat Neurosci 13:1413-20 [PubMed]

Packer AM, Yuste R (2011) Dense, unspecific connectivity of neocortical parvalbumin-positive interneurons: a canonical microcircuit for inhibition? J Neurosci 31:13260-71 [PubMed]

   [37 reconstructed morphologies on NeuroMorpho.Org]

Roopun AK, Kramer MA, Carracedo LM, Kaiser M, Davies CH, Traub RD, Kopell NJ, Whittington MA (2008) Period concatenation underlies interactions between gamma and beta rhythms in neocortex. Front Cell Neurosci 2:1-11 [PubMed]

Sakata S, Harris KD (2009) Laminar structure of spontaneous and sensory-evoked population activity in auditory cortex. Neuron 64:404-18 [PubMed]

Schubert D, Staiger JF, Cho N, Kotter R, Zilles K, Luhmann HJ (2001) Layer-specific intracolumnar and transcolumnar functional connectivity of layer V pyramidal cells in rat barrel cortex. J Neurosci 21:3580-92 [PubMed]

Song W, Kerr CC, Lytton WW, Francis JT (2013) Cortical plasticity induced by spike-triggered microstimulation in primate somatosensory cortex. PLoS One 8:e57453-18 [PubMed]

Stepanyants A, Chklovskii DB (2005) Neurogeometry and potential synaptic connectivity. Trends Neurosci 28:387-94 [PubMed]

Stepanyants A, Hirsch JA, Martinez LM, Kisvarday ZF, Ferecskó AS, Chklovskii DB (2008) Local potential connectivity in cat primary visual cortex. Cereb Cortex 18:13-28 [PubMed]

   [10 reconstructed morphologies on NeuroMorpho.Org]

Suter BA, Migliore M, Shepherd GM (2013) Intrinsic electrophysiology of mouse corticospinal neurons: a class-specific triad of spike-related properties. Cereb Cortex 23:1965-77 [PubMed]

Tanaka YH, Tanaka YR, Fujiyama F, Furuta T, Yanagawa Y, Kaneko T (2011) Local connections of layer 5 GABAergic interneurons to corticospinal neurons. Front Neural Circuits 5:12

Thomson AM, Bannister AP (2003) Interlaminar connections in the neocortex. Cereb Cortex 13:5-14 [PubMed]

Tiesinga P, Sejnowski TJ (2009) Cortical enlightenment: are attentional gamma oscillations driven by ING or PING? Neuron 63:727-32 [PubMed]

van Diessen E, Hanemaaijer JI, Otte WM, Zelmann R, Jacobs J, Jansen FE, Dubeau F, Stam CJ, Go (2013) Are high frequency oscillations associated with altered network topology in partial epilepsy? Neuroimage 82:564-73 [PubMed]

Vierling-Claassen D, Cardin JA, Moore CI, Jones SR (2010) Computational modeling of distinct neocortical oscillations driven by cell-type selective optogenetic drive: separable resonant circuits controlled by low-threshold spiking and fast-spiking interneurons. Front Hum Neurosci 4:198 [Journal] [PubMed]

   Engaging distinct oscillatory neocortical circuits (Vierling-Claassen et al. 2010) [Model]

Wang XJ (2010) Neurophysiological and computational principles of cortical rhythms in cognition. Physiol Rev 90:1195-268 [PubMed]

Wang Y, Markram H, Goodman PH, Berger TK, Ma J, Goldman-Rakic PS (2006) Heterogeneity in the pyramidal network of the medial prefrontal cortex. Nat Neurosci 9:534-42 [PubMed]

   [204 reconstructed morphologies on NeuroMorpho.Org]

Weiler N, Wood L, Yu J, Solla SA, Shepherd GM (2008) Top-down laminar organization of the excitatory network in motor cortex. Nat Neurosci 11:360-6 [Journal] [PubMed]

   Laminar connectivity matrix simulation (Weiler et al 2008) [Model]

Wilke C, Worrell G, He B (2011) Graph analysis of epileptogenic networks in human partial epilepsy. Epilepsia 52:84-93 [PubMed]

Wilson HR, Cowan JD (1972) Excitatory and inhibitory interactions in localized populations of model neurons. Biophys J 12:1-24 [Journal] [PubMed]

   Excitatory and inhibitory interactions in populations of model neurons (Wilson and Cowan 1972) [Model]

Yu J, Anderson CT, Kiritani T, Sheets PL, Wokosin DL, Wood L, Shepherd GM (2008) Local-Circuit Phenotypes of Layer 5 Neurons in Motor-Frontal Cortex of YFP-H Mice. Front Neural Circuits 2:6-405 [PubMed]

Dura-Bernal S, Li K, Neymotin SA, Francis JT, Principe JC, Lytton WW (2016) Restoring behavior via inverse neurocontroller in a lesioned cortical spiking model driving a virtual arm. Front. Neurosci. Neuroprosthetics 10:28 [Journal]

   Cortical model with reinforcement learning drives realistic virtual arm (Dura-Bernal et al 2015) [Model]

Dura-Bernal S, Neymotin SA, Kerr CC, Sivagnanam S, Majumdar A, Francis JT, Lytton WW (2017) Evolutionary algorithm optimization of biological learning parameters in a biomimetic neuroprosthesis. IBM Journal of Research and Development (Computational Neuroscience special issue) 61(2/3):6:1-6:14 [Journal]

   Motor system model with reinforcement learning drives virtual arm (Dura-Bernal et al 2017) [Model]

Neymotin SA, Dura-Bernal S, Lakatos P, Sanger TD, Lytton WW (2016) Multitarget Multiscale Simulation for Pharmacological Treatment of Dystonia in Motor Cortex. Front Pharmacol 7:157 [Journal] [PubMed]

   Multitarget pharmacology for Dystonia in M1 (Neymotin et al 2016) [Model]

Neymotin SA, McDougal RA, Bulanova AS, Zeki M, Lakatos P, Terman D, Hines ML, Lytton WW (2016) Calcium regulation of HCN channels supports persistent activity in a multiscale model of neocortex Neuroscience 316:344-366 [Journal] [PubMed]

   Ca+/HCN channel-dependent persistent activity in multiscale model of neocortex (Neymotin et al 2016) [Model]

(64 refs)