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

 Download zip file   Auto-launch 
Help downloading and running models
"Abnormalities in oscillations have been suggested to play a role in schizophrenia. We studied theta-modulated gamma oscillations in a computer model of hippocampal CA3 in vivo with and without simulated application of ketamine, an NMDA receptor antagonist and psychotomimetic. Networks of 1200 multi-compartment neurons (pyramidal, basket and oriens-lacunosum moleculare, OLM, cells) generated theta and gamma oscillations from intrinsic network dynamics: basket cells primarily generated gamma and amplified theta, while OLM cells strongly contributed to theta. ..."
1 . 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 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Hippocampus;
Cell Type(s): Hippocampus CA3 pyramidal cell; Hippocampus CA3 basket cell; Hippocampus CA3 stratum oriens lacunosum-moleculare interneuron;
Channel(s): I L high threshold; I A; I K; I K,Ca;
Gap Junctions:
Receptor(s): GabaA; NMDA; Glutamate;
Gene(s): HCN1; HCN2;
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON; Python;
Model Concept(s): Oscillations; Synchronization; Therapeutics; Pathophysiology; Schizophrenia; Information transfer; Brain Rhythms;
Implementer(s): Lazarewicz, Maciej [mlazarew at]; Neymotin, Sam [samn at];
Search NeuronDB for information about:  Hippocampus CA3 pyramidal cell; Hippocampus CA3 basket cell; GabaA; NMDA; Glutamate; I L high threshold; I A; I K; I K,Ca; Gaba; Glutamate;
CA1ih.mod *
CA1ika.mod *
CA1ikdr.mod *
CA1ina.mod *
caolmw.mod *
capr.mod *
icaolmw.mod *
icapr.mod *
iholmkop.mod *
iholmw.mod *
ihpyrkop.mod *
kahppr.mod *
kaolmkop.mod *
kapyrkop.mod *
kcaolmw.mod *
kcpr.mod *
kdrbwb.mod *
kdrolmkop.mod *
kdrpr.mod *
kdrpyrkop.mod *
misc.mod *
MyExp2Syn.mod *
MyExp2SynAlpha.mod *
MyExp2SynBB.mod *
MyExp2SynNMDA.mod *
MyExp2SynNMDABB.mod *
nafbwb.mod *
nafolmkop.mod *
nafpr.mod *
nafpyrkop.mod *
vecst.mod *
wrap.mod * *
declist.hoc *
decmat.hoc *
decnqs.hoc *
decvec.hoc *
default.hoc *
drline.hoc *
geom.hoc * *
grvec.hoc *
init.hoc *
labels.hoc *
local.hoc *
misc.h * *
nqs.hoc *
nqs_utils.hoc *
nrnoc.hoc * *
simctrl.hoc *
stats.hoc *
syncode.hoc *
xgetargs.hoc *
// $Id: decvec.hoc,v 1.424 2010/12/13 13:52:10 billl Exp $

proc decvec() {}

//* Declarations
objref ind, tvec, vec, vec0, vec1, tmpvec, vrtmp, veclist, veccollect, pwm
objref tmpobj, XO, YO, rdm, dir
strdef filename,dblform,tabform,xtmp
{dblform="%.4g" tabform=" "}

dir = new List()
tmpfile = new File()
if (! name_declared("datestr")) load_file("setup.hoc")
load_file("declist.hoc")  // declare list iterators
print "Loading decvec"

{symnum = 7 colnum = 10}
func cg () { return $1%(colnum-1)+1 } // skip white color
objref clrsym[colnum+1]
for ii=0,colnum { clrsym[ii]=new Union() clrsym[ii].x=ii%colnum }
// black->red->blue->green->orange->brown->violet->yellow->grey
{clrsym[0].s="white" clrsym[1].s="black" clrsym[2].s="red" clrsym[3].s="blue"
clrsym[4].s="green" clrsym[5].s="orange" clrsym[6].s="brown" clrsym[7].s="violet" 
clrsym[8].s="yellow" clrsym[9].s="grey"} 
clrsym[0].o=new List()
{symmax=20 symmin=2}
obfunc sg () { local ii localobj o
  o.x[1]=(3-ii)%4+1 // descending line types
  o.x[4]=(int((ii+1)/5)%2+1)*4-(ii+1)%4+1 // another line type sequence
  return o

{ MSONUM=100 MSOSIZ=100 msomax=0 msoptr=0 objref mso[MSONUM] }
double x[4],y[4]
xx=0 // declare a scalar 
ind = new Vector(100)
tvec = new Vector(100)
vec = new Vector(100)
vec0 = new Vector(10)
vec1 = new Vector(10)
vrtmp = new Vector(10)
veclist = new List()
veccollect = new List()
rdm = new Random()

if (!(xwindows && name_declared("xwindows"))) {
  objref graphItem
  strdef temp_string_, temp_string2_

//* stuff that doesn't belong here
//** dired([list,]file) - put together list of files matching 'file', calls 'ls -1 file'
//   dired([list,]file,1) file name to read for list of files
//   dired([list,]file,2) clear dir first; if list isn't present assume 'dir'
//   dired([list,]file,3) do recursive search
func dired () { local f,i,f1 localobj st,o
  st=new String2()
  if (numarg()==0) { print "dired([list,]filename[,flag])\t\
    adds the filename to list (use wildcards) (flag:1 read file;flag:2 clear list)"
    return 0 }
  if (argtype(1)==2) {o=dir st.s=$s1 i=2} else {o=$o1 st.s=$s2 i=3}
  while (i<=numarg()) { 
    if (argtype(i)==2) st.t=$si else f=$i
  if (f==2 || f==3) o.remove_all
  if (f==1) {
  } else { // f!=1
    if (f==3) {
      printf("Search starting in ") system("pwd")
      sprint(st.t,"sh -fc \"find . -name %s > %s\"",st.s,xtmp)
    } else {
      if (strm(st.s,"[*?]")) f1=0 else f1=1 // is this a wildcard or a directory
      if (f1) {  
        if (sfunc.len(st.t)>0) {
          sprint(st.t,"find %s -name %s >> %s",st.s,st.t,xtmp)
        } else  sprint(st.t,"find %s >> %s",st.s,xtmp)
      } else     sprint(st.t,"ls -1R %s >> %s",st.s,xtmp)
  while (tmpfile.scanstr(st.t) != -1) {
    if (f1) { // a directory
      if ((x=ftype(st.t))!=2) {print "Ignoring ",st.t,x  continue}
    o.append(new String(st.t))
    tmpfile.gets(st.t)  // get rid of the rest of the line
  printf("%d files in dir\n",o.count)
  return o.count

// lsdir([dir])
proc lsdir () { 
  if (numarg()==1) {
    for ltr($o1) {sprint(tstr,"ls -l %s",XO.s) system(tstr)}
  } else for ltr(dir) {sprint(tstr,"ls -l %s",XO.s) system(tstr)}

//** lbrw(list,action) is used to put up a browser
// note action given without '()'
proc lbrw () {

//** l2v(S1,S2) makes a list(S1) and puts all the XO.S2 into vec
// eg l2v("IClamp","amp")
proc l2v () {
  tmpobj=new List($s1)
  if (numarg()==3) YO=$o3 else YO=vec
  YO.resize(tmpobj.count) YO.resize(0)
  for ltr(tmpobj) {

//* vector iterator vtr
// for vtr(vec) { print x }
// for vtr(&x, vec) { print x }
// for vtr(&x, vec, &y) { print x,y }
// for vtr(&x, vec, max_ind) { print x }
// for vtr(&x, vec, min_ind, max_ind) { print x }
// for vtr(&x, vec, &y, min_ind, max_ind) { print x,y }
iterator vtr () { local i,j,pf,cf,b,e localobj o
  if (argtype(1)==1) { // 1st arg a vector or the pointer
    o=$o1 i=2
  } else if (argtype(1)==3) {
    pf=1 o=$o2 i=3 // pointer alway in position 1
  b=0 e=o.size-1 // default: do whole vec
  // now can take counter or limits
  if (argtype(i)==3) {cf=i i+=1} // cf gives counter location
  if (argtype(i)==0) {
    if (argtype(i+1)==0) {b=$i i+=1 e=$i} else e=$i
  if (!cf) i1=0 else {i=cf $&i=0} // default counter
  for j=b,e {
    if (pf) $&1=o.x[j] else x=o.x[j]  
    if (cf) $&i+=1 else i1+=1

//* vector iterator vtr2, treat two vectors as pairs
// usage 'for vtr2(&x, &y, vec1, vec2) { print x,y }'
iterator vtr2 () { local i,pairwise,noi1
  if (numarg()==3) { pairwise=1 i1=0 }
  if (numarg()==4) if (argtype(4)==3) { pairwise=1 $&4=0 noi1=1}
  if (pairwise) if ($o3.size%2!=0) { print "vtr2 ERROR: vec not even sized." return }
  if (! pairwise) {
    if ($o3.size != $o4.size) { print "vtr2 ERROR: sizes differ." return }
    if (numarg()==5) {$&5=0 noi1=1} else {i1 = 0}
  for i = 0,$o3.size()-1 {
    $&1 = $o3.x[i]
    if (pairwise) $&2=$o3.x[i+=1] else $&2=$o4.x[i]
    if (noi1) { if (pairwise) $&4+=1 else $&5+=1 } else i1+=1

proc viconv () { local a,b
  if (numarg()==0) { printf("viconv(TARG,OLD_INDS,NEW_INDS)\n") return }
  a=b=allocvecs(2) b+=1
  if ($o2.size!=$o3.size) {printf("OLD_INDS %d != NEW_INDS %d\n",$o2.size,$o3.size) return}
  for vtr2(&x,&y,$o2,$o3) { // x -> y

//* iterator lvtr, step through a list and a vector together
// usage 'for lvtr(XO, &x, list, vec) { print XO,x }'
iterator lvtr () { local i
  if ($o3.count <  $o4.size) { printf("lvtr ERROR: vecsize > listsize: list %d,vec %d.\n",$o3.count,$o4.size) return }
  if ($o3.count != $o4.size) { printf("lvtr WARNING: sizes differ: list %d,vec %d.\n",$o3.count,$o4.size) }
  if (numarg()==5) {$&5=0} else {i1 = 0}
  for i = 0, $o4.size()-1 {
    $o1 = $o3.object(i)
    $&2 = $o4.x[i]
    if (numarg()==5) { $&5+=1 } else { i1+=1 }

//* other iterators: case, scase, ocase
iterator case () { local i,j,max,flag
  if (argtype(numarg())==3) {flag=1 max=numarg()-1} else {flag=0 max=numarg()}
  if (flag) {i=max+1 $&i=0} else i1 = 0
  for i = 2, max {
    $&1 = $i
    if (flag) {j=i i=max+1 $&i+=1 i=j} else i1+=1

iterator scase () { local i,j,min,max,flag
  if (argtype(numarg())==3) {flag=1 max=numarg()-1} else {flag=0 max=numarg()}
  if (flag) {i=max+1 $&i=0} else i1=0
  if (argtype(1)==1) {
    if (! isobj($o1,"String")) $o1=new String() // will accept String or String2
  } else min=1
  for i = min,max {
    if (min==1) temp_string_=$si else $o1.s=$si
    if (flag) {j=i i=max+1 $&i+=1 i=j} else i1+=1

// eg for scase2("a","b","c","d","e","f") print tmpobj.s,tmpobj.t
iterator scase2 () { local i,min,flag,na,newstr localobj o
  flag=i1=0 newstr=min=1 
  if (argtype(na)==0) {i=na newstr=$i na-=1}
  if (argtype(1)==1) {flag=1 min=2}
  for i=min,na {
    if (i==min || newstr) o=new String2()
    o.s=$si i+=1  o.t=$si
    if (flag) $o1=o else tmpobj=o

iterator ocase () { local i
  i1 = 0
  if (isassigned($o1)) {
    for i = 1, numarg() {
      XO = $oi
 } else {
    for i = 2, numarg() {
      $o1 = $oi

//* strm(STR,REGEXP) == regexp string match 
func strm () { return sfunc.head($s1,$s2,"")!=-1 }
func strc () { return strcmp($s1,$s2)==0 }

//** count_substr(str,sub): count occurences of substring in str
func count_substr () { local cnt
  cnt = 0
  while (sfunc.tail($s1,$s2,$s1) != -1) { cnt += 1}
  return cnt

//* nind(targ,data,ind) fill the target vector with data NOT index by ind (opposite of v.index)
proc nind () { 
  if (! eqobj($o1,$o2)) $o1.copy($o2)

//* vlk(vec)
// vlk(vec,max)
// vlk(vec,min,max)
// vlk(vec,min,max,"INDEX") -- give index of each entry
// prints out a segment of a vector
proc vlkomitoff () { execute1("func vlkomit () {return NOP}") }
proc vlkomit0(){execute1("func vlkomit(){if(vcnt($o1,0)==$o1.size) return 1 else return 0}")}
proc vlk () { local ii,i,j,ami,min,max,wdh,nl,na,width,tablen,omfl,ixfl localobj st,v1,vi
  st=new String2()  v1=new Vector(numarg()) vi=new Vector()
  nl=1 wdh=vlk_width j=0 omfl=ixfl=0 ami=2
  na=numarg() min=0 max=$o1.size-1
  if (vlkomit(v1)!=NOP) omfl=1 // omfl to omit printing some
  if (argtype(na)==2) {i=na 
    if (strm($si,"I")) {ixfl=1 vrsz($o1,vi) vi.indgen ami=1}
  if (argtype(na)==0) {i=na 
    if ($i<0) min=$i else max=$i 
  if (argtype(na)==0) {i=na min=$i na-=1}
  if (max<0) max+=$o1.size
  if (min<0) min+=$o1.size
  if (max>$o1.size-1) { max=$o1.size-1 printf("vlk: max beyond $o1 size\n") }
  if (strm(tabform,"\t")) tablen=6 else if (strm(tabform,"\n")) tablen=-1e5 else {
    tablen=sfunc.len(tabform) }
  for ii=min,max { 
    if (omfl) { v1.resize(0)
      for i=1,na v1.append($oi.x[ii])
      if (vlkomit(v1)) continue
    if (ixfl) sprint(st.s,dblform,vi.x[ii]) else sprint(st.s,dblform,$o1.x[ii])
    for i=ami,na sprint(st.s,st.t,st.s,$oi.x[ii]) 
    if (width>vlk_width && nl) {printf("\n") width=0}
  if (nl) print ""

// vpr2(v1,v2) to print out 2 vecs in parallel
proc vpr2 () { local i,fl2,max,min,newline localobj v1,v2
  v1=$o1 v2=$o2 min=0 max=v1.size if (v2.size!=max) {print "vpr2 diff szs" return}
  for ({i=min fl2=0}; i<max; i+=1) {
    if (v1.x[i]==BVBASE || v2.x[i]==BVBASE) {
      if (!fl2) printf(" ")  
    } else { 
      printf("\n%5.1g %5.1g [%d]",v1.x[i],v2.x[i],i)
  print ""

//** vlkp(SRC,PVEC) uses indices in PVEC to print out values in SRC
proc vlkp () { local i,j,wdh
  j=0 nl=1 wdh=vlk_width
  if (numarg()==2) {
    for vtr(&x,$o1) {
      if ((j=j+1)%vlk_width==0 && nl && strcmp(tabform," ")==0) { print "" }
  } else {
    for vtr(&x,$o1) { for i=2,numarg() printf("%g%s",$oi.x[x],tabform) 
      print "" }
  if (nl) print ""

//* vprf() prints 1,2 or 3 vectors in parallel to output file
proc vprf () { local x2
  if (! tmpfile.isopen()) {
    print "Writing to temp file 'temp'"
  if (numarg()==1) { 
    for vtr(&x,$o1) { tmpfile.printf("%g\n",x) }
  } else if (numarg()==2) { 
    for vtr2(&x,&y,$o1,$o2) { tmpfile.printf("%g %g\n",x,y) }
  } else if (numarg()==3) { 
    for vtr2(&x,&y,$o1,$o2,&ii) { x2=$o3.x[ii] tmpfile.printf("%g %g %g\n",x,y,x2) }

//* vpr() prints 1,2 or 3 vectors in parallel to STDOUT
proc vpr () { local x2
  if (numarg()==1) { 
    for vtr(&x,$o1) { printf("%g",x) }
  } else if (numarg()==2) { 
    for vtr2(&x,&y,$o1,$o2) { printf("%g:%g ",x,y) }
  } else if (numarg()==3) { 
    for vtr2(&x,&y,$o1,$o2,&ii) { x2=$o3.x[ii] printf("%g:%g:%g ",x,y,x2) }
  print ""

//* readvec(vec) read from line
proc readvec () { 
  while (read(xx)) $o1.append(xx)
//* popvec(), savenums, readnums, vecsprint, savevec, savestr
//  vrsz(), vcp(), zvec(), resize, copy, empty
proc pushvec () { local i // same as .append, retained for compatability
  for i=2, numarg() $o1.append($i)

//** insvec(VEC,IND,VAL1[,VAL2,...]) insert values into the vector
proc insvec () { local ix,i,a // insert values into a vector
  a=allocvecs(1)  ix=$2
  for i=3, numarg() mso[a].append($i)

//** revec() clear vector then append
proc revec () { local i,x localobj o,st // clear vector then append
  if (! isobj($o1,"Vector")) $o1=new Vector(100)
  if (argtype(2)==2) {
    o=$o1 o.resize(0)
    st=new String2($s2)
    if (strm(st.s,",")) { // use split
    } else if (strm(st.s," ")) {
      split(st.s,o," ")
    } else while (sfunc.len(st.s)>0) { // assume binary vector, could generalize for hex and base64
      sfunc.tail(st.s, ".", st.t)
  } else for (i=1;i<=numarg();i+=1) { 
    if (ty==1) {        o=$oi o.resize(0)
    } else if (ty==0) { o.append($i)
    } else if (ty==3) { o.append($&i) }

//** unvec(VEC,&a,&b,...) put values from vector back into doubles (via pointers)
proc unvec () { local i
  if ($o1.size!=numarg()-1) { printf("unvec WARNING resizing %s to %d\n",$o1,numarg()-1) 
    $o1.resize(numarg()-1) }
  for i=2,numarg() $&i=$o1.x[i-2] 

//** wevec(VEC,wt0,wt1,...) returned weighted sum
func wevec () { local i,sum
  if ($o1.size!=numarg()-1) { printf("wevec SIZE ERR %d %d\n",$o1.size,numarg()-1) return }
  for i=2,numarg() sum+=$o1.x[i-2]*$i
  return sum

//** vrsz(VEC or NUM,VEC1,VEC2...,VECn or NUM)  -- vector resize -- to size of first arg
//   vrsz(VEC or NUM,VEC1,NUM,VEC2,etc)  -- vector resize -- to size of first arg (vec or num)
// or prior NUM
// optional final number is fill
func vrsz () { local i,sz,max,fill,flag,rsz0
  if (argtype(1)==1) { 
    if (isobj($o1,"Vector")) sz=$o1.size else if (isobj($o1,"List")) sz=$o1.count
    if (argtype(2)==0) {printf("vrsz(vec,num) backwards ERR\n") return -1}
  } else sz=$1
  if (argtype(max)==0) {i=max max-=1 fill=$i flag=1}
  if (argtype(max)==2) {max-=1 rsz0=1} // string means resize(0)
  if (sz<0) sz+=$o2.size // reduce size
  if (sz<0) {printf("vrsz ERR: can't resize %s to %d\n",$o2,sz) return sz}
  for i=2, max { 
    if (argtype(i)==0) sz=$i else {
      if (rsz0) $oi.resize(0) else if (flag) $oi.fill(fill) 
  return sz

//** vcp() -- copy vector segment with resizing
proc vcp () { local i,sz
  $o1.resize($4-$3+1) $o1.copy($o2,$3,$4)

//** veccut(VEC,min,max) just keep a piece of the vector
// veccut(VEC,min,max,tstep) generate indices from times using tstep
proc veccut () { local a localobj v1
  if (numarg()==4) { min=round($2/$4) max=round($3/$4)
  } else { min=$2 max=$3 }

//** zvec()
proc zvec () { local i // make vectors zero size
  for i=1, numarg() $oi.resize(0)

//* save and read series
//** savenums(x[,y,...]) save numbers to tmpfile via a vector
proc savenums () { local i,vv
  if (argtype(1)==3) {
  } else for i=1, numarg() mso[vv].append($i)

//** readnums(&x[,&y...]) recover nums from tmpfile via a vector
func readnums () { local a,i,cnt localobj v1
  if (numarg()==1 && v1.size>1) {
    if (verbose) printf("readnums WARNING: reading %d vals into presumed double array\n",cnt)
  } else {
    if (numarg()>v1.size && verbose) {
      printf("readnums() WARNING: too many args %d>%d\n",numarg(),v1.size) }
    for (i=1; i<=numarg() && i<=v1.size; i+=1) $&i = v1.x[i-1]
  return cnt

//** wrvstr(str) save string to a file by converting to ascii
proc wrvstr () { local vv,i

//** rdvstr(str) read string from a file via vread and conversion
func rdvstr () { local vv,i,flag
  if (mso[vv].vread(tmpfile)) {
    if (numarg()==1) v2str(mso[vv],$s1) else v2str(mso[vv],tstr)
  } else flag=0
  return flag

//** str2v()
proc str2v () { localobj lo
  lo=new String()
  while (sfunc.len(lo.s)>0) {
//** v2str() translates from vector to string
proc v2str () { local ii,x
  for ii=0,$o1.size-1 { x=$o1.x[ii] sprint($s2,"%s%c",$s2,x) }

//* popvec() remove last entry
func popvec () { local sz, ret
  sz = $o1.size-1
  if (sz<0) return 1e9
  ret = $o1.x[sz]
  return ret

//* chkvec (look at last entry)
func chkvec () { if ($o1.size>0) return $o1.x[$o1.size-1] else return -1e10 }

// vecsprint(strdef,vec)
proc vecsprint () { local ii
  if ($o2.size>100) { return }
  for ii=0,$o2.size-1 { sprint($s1,"%s %g ",$s1,$o2.x[ii]) }

// savevec([list,]vec1[,vec2,...]) add vector onto veclist or other list if given as 1st arg
// don't throw out vectors
func savevec () { local i,flag,beg localobj v1
  if (numarg()==0) { savevec(hoc_obj_[0],hoc_obj_[1]) return }
  if (isobj($o1,"List")) beg=2 else beg=1
  for i=beg, numarg() { 
    if (veccollect.count>0) { // grab a vector from garbage collection
    } else v1 = new Vector($oi.size)
    if (beg==2) $o1.append(v1) else veclist.append(v1)
  if (beg==2) return $o1.count-1 else return veclist.count-1

// prveclist(filename[,list])
proc prveclist () { localobj xo
  if (!batch_flag && tmpfile.ropen($s1)) {
    printf("%s exists; save anyway? (y/n) ",$s1)
    getstr(temp_string_) chop(temp_string_)
    if (strcmp(temp_string_,"y")!=0) return
  if (! tmpfile.wopen($s1)) { print "Can't open ",$s1  return }
  if (numarg()==2) {
    for ltr(xo,$o2) xo.vwrite(tmpfile)
  } else {
    for ltr(xo,veclist) xo.vwrite(tmpfile)

// prvl2(filename[,list]) --- save using a more standard fwrite
proc prvl2 () { localobj xo,o
  if (!batch_flag && tmpfile.ropen($s1)) {
    printf("%s exists; save anyway? (y/n) ",$s1)
    getstr(temp_string_) chop(temp_string_)
    if (strcmp(temp_string_,"y")!=0) return
  if (! tmpfile.wopen($s1)) { print "Can't open ",$s1  return }
  if (numarg()==2) o=$o2 else o=veclist
  for ltr(xo,o) {tmpfile.printf("%d\n",xo.size) xo.fwrite(tmpfile)}

// rdveclist("FILENAME"[,list])
// rdveclist("FILENAME"[,NOERASE])
proc rdveclist () { local flag,a
  if (numarg()==1) { flag=1 clrveclist() } else if (argtype(2)==1) $o2.remove_all else flag=1
  if (! tmpfile.ropen($s1)) { print "Can't open ",$s1  return }
  while (mso[a].vread(tmpfile)) {
    if (flag) savevec(mso[a]) else savevec($o2,mso[a])
// rdvecs("FILENAME",vec1,vec2,...)
proc rdvecs () { local i
  if (! tmpfile.ropen($s1)) { print "Can't open ",$s1  return }
  for i=2,numarg() {
    if ($oi==nil) $oi=new Vector()
    if ($oi.vread(tmpfile)==0) printf("WARNING nothing to read into %s\n",$oi)
// svvecs("FILENAME",vec1,vec2,...)
proc svvecs () { local i
  for i=2,numarg() savevec($oi)
// vpad(vec,howmany,val[,right])
proc vpad () { local a
  mso[a].resize($2) mso[a].fill($3)
  if (numarg()==4) $o1.append(mso[a]) else {
    mso[a].append($o1) $o1.copy(mso[a])     }

// vtrunc(vec,howmany[,right])
proc vtrunc () { local a
  if (numarg()==3) $o1.resize($o1.size-$2) else {
    $o1.reverse $o1.resize($o1.size-$2) $o1.reverse

proc rdxy () { local a,flag
  a = allocvecs(1)
  if (numarg()>=1) tmpfile.ropen($s1) else tmpfile.ropen("aa")
  if (numarg()>=2) flag=$2 else flag=2
  if (flag==2) {
    for vtr2(&x,&y,mso[a]) {ind.append(x) vec.append(y)}
  } else {
  print ind.size," points read"

// closest(vec,num) -- return ind for vec member closest to num
func closest () { local a,ret
  mso[a].copy($o1) mso[a].sub($2) mso[a].abs
  return ret

// memb(TEST#,#1,#2,...) -- true if the TEST# is in the list
func memb () { local na,i
  for i=2,numarg() if ($1==$i) return 1
  return 0

proc clrveclist () { localobj o,xo
  if (numarg()==1) o=$o1 else o=veclist
  for ltr(xo,o) { xo.resize(0) veccollect.append(xo) }

// savestr(str1...) add string obj onto tmplist
proc savestr () { local i
  if (argtype(1)==1) for i=2, numarg() $o1.append(new String($si)) else {
    for i=1, numarg() tmplist.append(new String($si))

// redund with v.count in vecst.mod
func vcount () { local val,sum
  val=$2 sum=0
  for vtr(&x,$o1) if (x==val) sum+=1
  return sum

// tvecl(inlist[,outlist]) -- transpose veclist
obfunc tvecl () { local x,cnt,sz,err,ii,p localobj xo,il,ol
  if (numarg()>1) ol=$o2
  if (!isassigned(ol)) {ol=veclist clrveclist()} else ol.remove_all
  err=0   cnt=il.count sz=il.o(0).size
  for ltr(xo,il,&x) if (xo.size!=sz) err=x
  if (err) { print "Wrong size vector is #",x return ol }
  p = allocvecs(1,cnt)  mso[p].resize(cnt)
  for ii=0,sz-1 {
    for jj=0,cnt-1 mso[p].x[jj] = il.o(jj).x[ii]
  return ol

//* vinsect(v1,v2,v3) -- v1 gets intersection (common members) of v2,v3
//  replaced by v.insct() in vecst.mod
proc vinsect () {
  for vtr(&x,$o2) for vtr(&y,$o3) if (x==y) $o1.append(x)

//* vecsplit(vec,vec1,vec2[,vec3,...])
// splits vec into other vecs given
proc vecsplit () { local num,ii,i
  num = numarg()-1 // how many
  for i=2,numarg() $oi.resize(0)
  for (ii=0;ii<$o1.size;ii+=num) {
    for i=2,numarg() if (ii+i-2<$o1.size) $oi.append($o1.x[ii+i-2])

//* vecsort(vec,vec1,vec2[,vec3,...])
// sorts n vecs including first vec by first one
proc vecsort () { local i,inv,scr,narg
  if (narg<2 || narg>10) {print "Wrong #args in decvec.hoc:vecsort" return}
  scr=inv=allocvecs(2) scr+=1
  for i=3,narg sprint(temp_string_,"%s,%s",temp_string_,$oi)

//** order(&x,&y,...) put values in order
proc order () { local a,i,na
  for i=1,na mso[a].append($&i)
  for i=1,na $&i=mso[a].x[i-1]

//** vdelind()  -- delete a single index
proc vdelind () { local i,iin
  iin = $2
  if (iin<0) iin=$o1.size+iin
  if (iin>$o1.size-1 || iin<0) {
    printf("vdelind Error: index %d doesn't exist.\n",iin) return }
  if (iin<$o1.size-1) $o1.copy($o1,iin,iin+1,$o1.size-1)

//* mkveclist(num[,sz]) recreate veclist to have NUM vecs each of size SZ (or MSOSIZ)
proc mkveclist () { local ii,num,sz,diff localobj xo
  diff = num-veclist.count
  if (numarg()==2) { sz=$2 } else { sz = MSOSIZ }
  if (diff>0) {
    for ii=0,diff-1 {
    tmpvec = new Vector(sz)
  } else if (diff<0) {
    for (ii=veclist.count-1;ii>=num;ii=ii-1) { veclist.remove(ii) }
  for ltr(xo,veclist) { xo.resize(sz) }

//* allocvecs
// create temp set of vectors on mso
// returns starting point on mso 
// eg p = allocvecs(3)
// p = allocvecs(v1,v2,v3) // where v1..v3 are localobj or objref
// p = allocvecs(v1,v2,v3,...,size) // set all to size
// p = allocvecs(num,list) // append num vecs to list
// p = allocvecs(num,size) // num vecs of size size
// p = allocvecs(num,size,list) // append num vecs of size to list
// p = allocvecs(num,list,size) // allow args to be given in reverse order
// access these vectors by mso[p+0] ... [p+2]
func allocvecs () { local i,ii,llen,sz,newv,aflg,lflg,na localobj o
  if (numarg()==0) { 
    print "p=allocvecs(#) or p=allocvecs(v1,v2,...), access with mso[p], mso[p+1]..." return 0 }
  sz=MSOSIZ  na=numarg()
  if (argtype(1)==0) {
    aflg=0 newv=$1
    if (na>=2) if (argtype(2)==0) sz=$2 else {lflg=1 o=$o2} // append to list in arg2
    if (na>=3) if (argtype(3)==0) sz=$3 else {lflg=1 o=$o3} 
    if (lflg) o.remove_all
  } else {
    if (argtype(na)==0) {
      i=na sz=$i newv=i-1
    } else newv=na 
  llen = msoptr
  for ii=msomax,msoptr+newv-1 { // may need new vectors
    if (ii>=MSONUM) { print "alloc ERROR: MSONUM exceeded." return 0 }
    mso[ii] = new Vector(sz)
  for ii=0,newv-1 {
    msoptr = msoptr+1
  if (msomax<msoptr) msomax = msoptr
  if (aflg) for i=1,newv $oi=mso[i-1+llen]
  if (lflg) for i=0,newv-1 o.append(mso[i+llen])
  return llen

//** dealloc(start)
// remove temp set of vectors from mso
proc dealloc () { local ii,min
  if (numarg()==0) { min = 0 } else { min = $1 }
  msoptr = min

//* indvwhere family
//** vwh(VEC,VAL) returns index where VEC.x[i]==VAL
func vwh () { 
  if (argtype(2)==0) return $o1.indwhere("==",$2) 
  if (numarg()==3) return $o1.indwhere($s2,$3)
  return $o1.indwhere($s2,$3,$4)

//** vval(VEC,STR,NUM) uses indwhere to return first value that qualifies
func vval () {
  if (argtype(2)==0) return $o1.x[$o1.indwhere("==",$2)]
  if (numarg()==3) return $o1.x[$o1.indwhere($s2,$3)] 
  return $o1.x[$o1.indwhere($s2,$3,$4)] 

//** vcnt(VEC,STR,x[,y]) uses indvwhere and returns # of values that qualify
func vcnt () { local a,ret
  if (numarg()==2) mso[a].indvwhere($o1,"==",$2)
  if (numarg()==3) mso[a].indvwhere($o1,$s2,$3)
  if (numarg()==4) mso[a].indvwhere($o1,$s2,$3,$4)
  ret = mso[a].size
  // if ($o1.size>0) printf("%d/%d (%g)\n",ret,$o1.size,ret/$o1.size*100)
  return ret
//** civw(DEST,SRC1,STR1,x1[,y1]...) does compound indvwhere
// overwrites tstr; DEST should be size 0 unless to be compounded
// civw(DEST,0,...) will resize DEST to 0
func civw () { local i,a,b,c,f2,x,y,sz,min
  a=b=c=allocvecs(3) b+=1 c+=2
  // if ($o1.size>0) print "Starting with previously set index vector"
  if (argtype(2)==0) {
    if ($2==0) { $o1.resize(0) min=3
      if (argtype(3)==1) sz=$o3.size else {
        printf("ERR0: arg 3 should be obj when $2==0\n",i) return -1 }
    } else {
      printf("ERR0a: arg 2 should be 0 if a number -- zero sizes ind vector\n") 
      return -1
  } else if (argtype(2)==1) sz=$o2.size else {
    printf("ERR0b: arg 2 should be obj\n",i) return -1 }
  for (i=min;i<=numarg();) {
    if (argtype(i)!=1) { printf("ERR1: arg %d should be obj\n",i) return -1}
    if ($oi.size!=sz)  { printf("ERR1a: all vecs should be size %d\n",sz) return -1}
    mso[a].copy($oi)  i+=1   // look in a
    if (argtype(i)!=2) { printf("ERR2: arg %d should be str\n",i) return -1}
    tstr=$si          i+=1
    if (strm(tstr,"[[(]")) f2=1 else f2=0 // opstring2 needs 2 args
    if (argtype(i)!=0) { printf("ERR3: arg %d should be dbl\n",i) return -1}
    x=$i              i+=1 
    if (f2) {
      if (argtype(i)!=0) { printf("ERR4: arg %d should be dbl\n",i) return -1}
      y=$i            i+=1
    if (f2) mso[b].indvwhere(mso[a],tstr,x,y) else { // the engine
            mso[b].indvwhere(mso[a],tstr,x)   }
    $o1.resize(sz) // make sure it's big enough for insct -- shouldn't need
    if (mso[c].size>0) $o1.insct(mso[b],mso[c]) else $o1.copy(mso[b])
    if ($o1.size==0) break
  return $o1.size

//* vecconcat(vec1,vec2,...)
// vecconcat(vec1,list) puts concat all vecs from list
// destructive: concatenates all vecs onto vec1
// performs a list2vec() functionality
proc vecconcat () { local i,max localobj xo
  if (numarg()<2) { 
    print "vecconcat(v1,v2,...) puts all into v1" return 
  if (argtype(max)==0) {max-=1 $o1.resize(0)}
  if (isobj($o2,"List")) {
    for ltr(xo,$o2) $o1.append(xo)
  } else for i=2,max $o1.append($oi)
//** vecelim(v1,v2)  eliminates items in v1 given by index vec v2
proc vecelim () {
  for vtr(&x,$o2) { $o1.x[x]= -1e20 }

//** redundout(vec) eliminates sequential redundent entries
// destructive
func redundout () { local x,ii,p1
  return $o1.size

//** uniq(src,dest[,cnt]) uses redundout to return random values of a vector
// like redundout except nondestructive
obfunc uniq () { local a localobj v1,vret
  v1.copy($o1) v1.sort 
  if (numarg()==3) {          $o2.redundout(v1,0,$o3) 
  } else if (numarg()==2) {   $o2.redundout(v1) 
  } else {
    vret=new Vector(v1.size) vret.redundout(v1)
  if (numarg()==1) return vret else return $o2

//** complement(ind,max) for indices -- return values from 0..max that are not in ind
proc complement () { local a,b,max
  a=b=allocvecs(2) b+=1

//** albetname() generate sequential 3 char alphabetical file names (make filenames)
obfunc albetname () { local na,sret localobj st
  na=numarg() sret=0
  st=new String2()
  if (na==0) { fnum+=1 st.t=".id"
  } else if (na>=1) {
    if (argtype(1)==2) {st.t=$s1 fnum+=1} else fnum=$1
  if (na==2) st.t=$s2  // partially back compatible, doesn't handle albetname(tstr,".id")
  if (na==3) {st.t=$s3 sret=1}
  if (fnum>17575) printf("albetname WARN: out of names: %d > %d\n",fnum,26^3-1)
  sprint(st.s,"%c%c%c",  fnum/26/26%26+97,fnum/26%26+97,fnum%26+97)
  if (sfunc.len(st.t)>0) sprint(st.s,"%s%s",st.s,st.t)
  if (sret) $s2=st.s 
  return st

// save_idraw([filename,save_all,PS]) -- save idraw to file
// default is to generate albetname, save selected to idraw
proc save_idraw () { local sv,ps localobj st,li
  st=new String()
  if (argtype(1)==2) {
    if (argtype(2)==0) sv=$2
    if (argtype(3)==0) ps=$3
  } else if (argtype(1)==0) {
    if (argtype(2)==0) ps=$2  
  if (sfunc.len(st.s)==0) st.s=albetname().s
  if (verbose) printf("Saving to %s\n",st.s)
  pwm.printfile(st.s, ps, sv)

proc find_pwm () { localobj li
  if (isassigned(pwm)) return
  li=new List("PWManager")
  if (li.count==0) pwm=new PWManager() else pwm=li.o(0)

// vecconv() convert $o1 by replacing instances in $o2 by corresponding instances in $o3
proc vecconv () { local a,x,y localobj v1,v2,v3,v4
  if (argtype(2)==0) v2.append($2) else v2=$o2
  if (argtype(3)==0) v3.append($3) else v3=$o3
  for vtr2(&x,&y,v2,v3) { // x -> y

//** veceq()  like vec.eq but don't have to be same size and shows discrepency
func veceq () { local sz1,sz2,eq,beg,ii,jj,kk
  sz1=$o1.size sz2=$o2.size
  if (numarg()==3) beg=$3 else beg=0
  if (sz1!=sz2) printf("%s %d; %s %d\n",$o1,sz1,$o2,sz2)
  ii=0 jj=beg
  while (ii<sz1 && jj<sz2) {
    if ($o1.x[ii]!=$o2.x[jj]) { 
      printf("Differ at %d %d\n",ii,jj) 
      for kk=-10,10 if ((ii+kk)>=0 && (ii+kk)<sz1 && (jj+kk)>=0 && (jj+kk)<sz2) {
        printf("(%d)%g:(%d)%g ",(ii+kk),$o1.x[ii+kk],(jj+kk),$o2.x[jj+kk])  }
      print ""
    } else eq=1
    ii+=1 jj=ii+beg
  return eq

//* isstring() determine if object $o1 is of type string, if so return the string in [$s2]
func isstring () {
  if (sfunc.substr(tstr,"String")==0) {
    if (numarg()==2) sprint($s2,"%s",$o1.s)
    return 1
  } else {
    if (numarg()==2) sprint($s2,"%s",$o1)
    return 0

//** isassigned() checks whether an object is Null
if (name_declared("VECST_INSTALLED")) {
  sprint(tstr,"func isassigned () { return !isojt($o1,nil) }")
} else {
  sprint(tstr,"func isassigned () { return !isobt($o1,nil) }")

//** declare goes through a list of scalars and assigns them if they don't already exist
// eg declare("adj",nil,"vd",nil,"vc",nil,"allcells",0,"div","d[1][1]")
func declare () { local i,nd,min,verbose,ty,tye,ret localobj st,ut
  if (argtype(1)==0) {verbose=0 min=2} else {min=verbose=1}
  if (numarg()==0) {
    printf("eg declare(\"obj\",new Vector(),\"num\",0,\"arr\",\"d[2][2]\",\"vec\",\"o[5]\",\"str\",\"\")\nfirst arg num means quiet")
    return 0 }
  st=new String2() ut=new String2() ret=0
  ut.s="^[do]\\["  ut.t="^[A-Z][A-Za-z]+[(][^)]*[)]$" // for declaring arrays and objects
  for i=min,numarg() {
    st.s=$si     i=i+1
    if (nd==1) { nd=0
      if (verbose) {
        printf("declare WARN defining '%s' despite prior existence in symbol table\n",st.s) }}
    if ((nd==5 && ty==0) || (nd==4 && ty==2) || (nd==2 && ty==1)) { // OK -- DO NOTHING
      if (i==min+1) ret=1
      if (verbose) printf("'%s' predeclared\n",st.s)
    } else if (nd != 0) { // different type codes from name_declared() bzw argtype()
      if ((nd==5 && ty==2) || (nd==2 && ty==2)) {
        if (strm($si,ut.s)) { // name_declared gives 2 for either objref and objarray
          if (nd==5) st.t="DOUBLE" else st.t="OBJ"
          if (verbose) {
            printf("'%s' predeclared as %s array: WARN: no check on type or dims\n",st.s,st.t)}
          continue  // declaration for a double or obj array 
        } else  if (strm($si,ut.t)) { 
          if (verbose) printf("'%s' predeclared\n",st.s)
          continue  // declaration for an object
      if (nd==5) tye=0 else if (nd==4) tye=2 else if (nd==2) tye=1 
      if (verbose) printf("Declared ERR %s predeclared as a %d statt %d\n",st.s,tye,ty)
    } else { // declare it
      if (ty==0) { 
      } else if (ty==1) { 
        if ($oi==nil) {  sprint(st.t,"objref %s\n%s=nil",st.s,st.s)
        } else           sprint(st.t,"objref %s\n%s=%s", st.s,st.s,$oi)
      } else if (ty==2) { // key strings are eg d[5][5] or o[5][5] for double or obj array
        if (strm($si,ut.s)) {
          if (strm($si,"^d")) ty=0 else ty=1
          if (ty==0) sprint(st.t,"double %s%s",st.s,st.t) else \
                     sprint(st.t,"objref %s%s",st.s,st.t) 
        } else if (strm($si,ut.t)) {
          sprint(st.t,"objref %s\n%s = new %s",st.s,st.s,$si) 
        } else sprint(st.t,"strdef %s\n%s=\"%s\"",st.s,st.s,$si)
  return ret

//** declared goes through a list of function names and makes sure they exist
// useful to check a bunch of names before entering a template that calls them as external
proc declared () { local i,nd,min,flag
  if (argtype(1)==0) {flag=$1 min=2} else {flag=0 min=1}
  for i=min,numarg() {
    if (nd==0 || (flag==1 && nd==1)) { // declare it or clear it
      // sprint(tstr,"func %s () {printf(\"\\tEMPTY FUNCTION %s()\\n\") return 0}",$si,$si)
      sprint(tstr,"func %s () {return 0}",$si)
    } else if (nd!=1) { // 2=obj,3=sec,4=str,5=dbl
      printf("NAME CONFLICT: %s can't be a func since was declared as a %d\n",$si,nd)

//** isit() like isassigned() but can take a string instead
obfunc isit () { local ret localobj sv,o,st
  o=new Union()  st=new String()
  if (argtype(1)==2) {
    execute(st.s) // XO points to the thing
    return o
  } else return isassigned($o1)

//** isob(s1,s2) like isobj but takes string statt obj
func isob () { localobj st
  st=new String()
  execute(st.s) // XO points to the thing
  if (sfunc.substr(st.s,$s2)==0) {
    return 1
  } else {
    return 0

//** eqobj(o1,o2) checks whether 2 objects are the same
func eqobj () {	return object_id($o1) == object_id($o2) }
//** ocnt(STR) counts number of objects named string
func ocnt () { local ret
  tmpobj=new List($s1) ret=tmpobj.count
  return ret

//** isobj(o1,s2) checks whether object $o1 is of type $s2
func isobj () { localobj st
  st=new String()
  if (sfunc.substr(st.s,$s2)==0) {
    return 1
  } else {
    return 0

//** isobt(o1,o2) checks whether object $o1 is of type $o2
func isobt () { localobj s
  s=new String2()
  sprint(s.s,"%s",$o1)  sprint(s.t,"%s",$o2)
  sfunc.head(s.s,"\\[",s.s) sfunc.head(s.t,"\\[",s.t)
  if (strc(s.s,s.t)) return 1 else return 0

// destructive of $s1
func str2num () { local x localobj o,st
  if (sscanf($s1,"%d",&x)!=1) {
    o=new Union() st=new String()
    sprint(st.s,"%s.x=%s",o,$s1)  // o has temp existance in global namespace
    if (!execute1(st.s,0)) printf("Can't find '%s'\n",$s1)
  return x

func isnum () { return strm($s1,"^[-+0-9.][-+0-9.eE]*$") }

// fln(num,STR_OBJ) move forward line n lines, chop string at end, remove quotes if present
// fln("rxp",STR_OBJ) move forward to regexp rxp; with arg3 use exact search
// fln("rxp OR n",STR_OBJ,obj) return union in obj with more data
// uses tmpfile; assumes that file is open for reading
fln_lnum=0 // use to count lines; must be rest by calling routine
func fln () { local n,nn,x,y localobj o,st,un
  n=nn=0 y=OK o=$o2
  if (argtype(1)==0) nn=$1 // if need to back up
  if (argtype(3)==1 || argtype(4)==1) { un=new Union(tmpfile.tell())
    if (argtype(3)==1) $o3=un else $o4=un 
  if (nn) {
    while(n<nn) { tmpfile.gets(o.s) n+=1 }
  } else { // look for a string
    st=new String2()
    if (argtype(3)!=0) { // default regexp search
      if (strc(o.s,"A")) o.s="B" else o.s="A" // start with something different
      while (! strm(o.s,$s1)) {tmpfile.gets(o.s) n+=1}
    } else {  // exact string search
      sprint(st.s,"%s\n",$s1) // look for this string
      o.s=$s1 // make sure not somehow starting with exactly the same thing
      while (strcmp(o.s,st.s)!=0) {tmpfile.gets(o.s) n+=1} // might want to return line cnt
  sfunc.left(o.s,sfunc.len(o.s)-1) // get rid of newline
  if (sfunc.head(o.s,"\"","")==0) { // find quote at beginning
    sfunc.left(o.s,sfunc.len(o.s)-1) // assume quote at end
  } else if (sscanf(o.s,"%g,%g",&x,&y)==2) { // specifically used by NQS.rddif
  } else if (sscanf(o.s,"%g",&y)==1) { }
  if (un!=nil) {un.x[1]=tmpfile.tell() un.x[2]=n un.x[3]=x un.x[4]=y un.s=o.s}
  return y

// like perl chop -- removes the last character
// chop(STR[,TERM]); TERM chop only TERM
// note that no + means must repeat char eg "))*" statt ")+"
func chop () { local ln1,match localobj st
  ln1=sfunc.len($s1)  st=new String()
  if (numarg()==2) { 
    if (!strc($s2,"\n")) sprint($s2,"%s$",$s2) // just look for terminal character
    if ((match=sfunc.head($s1,$s2,st.s))==-1) {
      return 0 
    } else {
      return match
  } else if (sfunc.len($s1)>=1) {
    return 1
  } else {
    print "ERR: chop called on empty string" }
    return 0

// lchop(STR[,BEGIN]) -- chop from the left
func lchop () { local ln1,match localobj st
  ln1=sfunc.len($s1)  st=new String()
  if (numarg()==2) { 
    sprint($s2,"^%s",$s2) // just look for initial chars
    if ((match=sfunc.tail($s1,$s2,st.s))==-1) {
      return 0 
    } else {
      return match
  } else if (sfunc.len($s1)>=1) {
    return 1
  } else {
    print "ERR: chop called on empty string" }
    return 0

// strcat(tstr,"stra","strb",...) tstr=stra+strb+...
// 1st arg can be a strdef or String obj
// other args can be strdef, String obj, literal string, or number handled as %g
// returns String obj
obfunc strcat () { local i,na localobj out
  if (argtype(1)==0) { out=new String() 
  } else if (argtype(1)==1) { 
    if (isassigned($o1)) out=$o1 else { out=new String() $o1=out }
  } else { out=new String() out.s=$s1 } // print "AA:",$s1," ",sfunc.len($s1)
  if (argtype(na)==0) { out.s="" na-=1 } // clear string
  for i=2,na {
    if (argtype(i)==1) {        sprint(out.s,"%s%s",out.s,$oi.s) 
    } else if (argtype(i)==2) { sprint(out.s,"%s%s",out.s,$si) 
    } else                      sprint(out.s,"%s%g",out.s,$i) 
  if (argtype(1)==2) $s1=out.s
  return out

// split(string,vec) // split comma sep string into numbers
// split(string,list) // split comma sep string into list of strings
// split(string,list,regexp) // split regexp sep string into list of strings
// split(string,vec,regexp,1) // split but don't interpret: eg "5*3"->15 or "x"->val
// split(string,list,num) // split every num chars
// eg split("534,  43 , 2, 1.4, 34",vec[,"/"])
// split("13, 3*PI/2*tau/2, 32+7, 6, 9.2, 42/3",vec) 
//    optional 3rd str is what to split on; default is comma
func split () { local i,vf,x,done,num localobj s,st,o
  if (numarg()==0) {
    printf("eg split(\"534 43 2 1.4 34\",vec,\" \") split(\"a,b,c,d,e\",tmplist)")
    return -1 }
  s=new String2() st=new String2()
  if (argtype(2)!=1) {
    o=new Vector() vf=2 i=2
  } else { 
    o=$o2 i=3
    if (isobj(o,"Vector")) {
    } else {
      if (!isassigned(o)) { o=new List() $o2=o }
  if (vf) revec(o) else o.remove_all
  if (argtype(i)==2) {       st.s=$si   i+=1
  } else if (argtype(i)==1) {st.s=$oi.s i+=1
  } else                     st.s="[, ]+"
  if (argtype(i)==0) { // length split into a list eg c2 c2 c2 etc
    if (vf) {printf("Split err: attempting to do length split into vector: %s",o) return 0}
    sprint(st.s,"%%*%ds%%s",num) // eg "%2*s%s" to get all but first 2 chars
    sprint(st.t,"%%%ds",num)     // eg "%2s"    to get first 2 chars
    if (num>sfunc.len(s.t)){
      printf("split() ERRA %s of length %d in pieces of %d?\n",s.t,sfunc.len(s.t),num) return 0}
  } else num=0
  while (sfunc.len(s.t)>0) {
    if (vf) {
      if (split_interp) if (strm(s.t,"^[^,]+[+*/-]")) {
        if (sfunc.len(s.s)==0) s.s=s.t
        sprint(s.s,"%s.append(%s)",o,s.s) execute(s.s)
      if (!done) if (sscanf(s.t,"%lf",&x)) { 
      if (!done && split_interp) { // try to interpret as a variable
        hoc_ac_=ERR // global hoc_ac_ for execute1()
        if (sfunc.len(s.s)==0) s.s=s.t // the end
        execute1(st.t,0) // no error
        if (hoc_ac_==ERR) {
          printf("split WARNING skipping non-parsable value: %s\n",s.s)
        } else {
      if (vf==2) if (o.size==0) return ERR else return o.x[0]
    } else { // split into a list
      if (num) {
        o.append(new String2(s.s,s.s))
      } else {
        if (sfunc.len(s.s)==0) s.s=s.t // the end
        o.append(new String2(s.s,s.s))
    if (num) { // splitting equal length strings
      if (sfunc.len(s.t)<=num) s.t="" else sscanf(s.t,st.s,s.t)
    } else {
  if (vf) return o.size else return o.count

//** splitmatch(str,strlist) returns which string in strlist matches the str
func splitmatch () { local ii,x,ret localobj ll,xo
  ll=$o2 ret=-1
  for ltr(xo,ll,&x) {
    if (strm($s1,xo.s)) {ret=x
      break }
  return ret

// parsenums(STR[,VEC]) find first or all the numbers in a string
func parsenums () { print "Use split(\"str\") instead" }

// intervals(TRAIN,OUTPUT)
func intervals () { local a
  if ($o1.size<=1) { printf("%s size <2 in intervals()\n",$o1) return 0}
  return $o2.size

// invl(train,stats[,thresh])
func invl () { local a,x,sz localobj v1,v2
  if ($o1.size<=1) { printf("%s size <2 in invl()\n",$o1) 
    $o2.resize(5) $o2.fill(-1)
    return 0
  if (!$o1.ismono(2)) printf("decvec::invl() WARN: %s not sorted\n",$o1)
  if (numarg()==3) {
    if ((x=v1.w("<",$3,-1))>0) { // tag and remove all below threshold
      v1.sort v1.reverse
  return sz

// freql(train,stats)
// doesn't make much sense to take the mean of inverses 
func freql () { local a localobj v1
  if ($o1.size<=1) { printf("%s size <2 in intervals()\n",$o1) return 0}
  return v1.size

// downcase(tstr[,UPCASE]) 
obfunc downcase () { local len,ii,let,diff,min,max localobj st
  diff=32 min=65 max=90 st=new String2()
  if (argtype(1)==2) st.s=$s1 else st.s=$o1.s
  if (numarg()==2) { diff=-diff min=97 max=122 } // if flag -> upcase
  len = sfunc.len(st.s)
  for ii=1,len {
    if (x>=min&&x<=max) {
    } else sprint(st.s,"%s%c",st.s,x) // just rotate the letter
  if (argtype(1)==2) $s1=st.s
  return st

// newlst() puts a newline in the middle of a string
proc newlst () { local l
  if (numarg()>1) l=$2 else l=int(sfunc.len($s1)/2)

//* rdcol(file,vec,col#,cols): read multicolumn file
func rdcol () { local col,cols,length
  if (numarg()==0) { print "\trdcol(\"file\",vec,col#,cols) // col#=1..." return 0}
  col=$3 cols=$4 length=0
  if (! tmpfile.ropen($s1)) { printf("\tERROR: can't open file \"%s\"\n",$s1) return 0}
  while (tmpfile.gets(temp_string_) != -1) length+=1 // count lines
  print length
  if ($o2.size!=length) printf("rdcol ERR: only read %d statt %d\n",$o2.size,length)
  return length

//* rdmuniq(vec,n,rdm) -- augment vec by n unique vals from rdm
//  rdmuniq(vec,n,max) -- augment vec by n unique vals 0-max
//  rdmuniq(vec,n,min,max) -- augment vec by n unique vals min-max
// draw n numbers without replacement, only makes sense with discrete distribution
// could do something like 
// mso[a].setrand($o3) mso[d].copy(mso[a]) 
//     mso[b].indsort(mso[a]) mso[a].sort() mso[c].redundout(mso[a],1)
// to get indices of unique values but then have to back index to original
// rdmuniqm4=1 to use setrnd() statt setrand()
proc rdmuniq () { local i,max,min,n,a3,a,see localobj ro,v1,v2,vin,l
  if (numarg()==0) {
    printf("rdmuniq(vec,n,rdm) - augment vec by n unique vals from rdm\
  rdmuniq(vec,n) - augment vec by n unique vals 0-99\
  rdmuniq(vec,n,max) - augment vec by n unique vals 0-max\
  rdmuniq(vec,n,min,max) - augment vec by n unique vals min-max\
  rdmuniq(vec,n,min,max,seed) - augment vec by n unique vals min-max using seed\n") 
  return }
  if (rdmuniqm4 && argtype(5)!=0) {
    printf("flag set: rdmuniqm4==1: should use all 5 args: rdmuniq(vec,n,min,max,seed)\n") return }
  vin=$o1 min=max=0 see=0 n=int($2) // round down
  if (a3==1) {
    ro=$o3  // random previously setup, min,max unknown
  } else if (a3==-1) {
      min=0 max=99
  } else {
    if (argtype(4)==0){min=$3 max=$4}
    if (argtype(5)==0) see=$5
  if (max>0) { // else rdm was an arg with unknown min,max
    if (max-min+1==n) {
    } else if (n>max-min+1) {
      printf("rdmuniq ERR incompatible: min=%d max=%d n=%d (%g vs %d)\n",min,max,n,$2,max-min+1) 
  if (!rdmuniqm4) {
    if (ro==nil) ro=new Random()
    if (see) ro.ACG($5) // seed it
  a=allocvecs(v1,v2) l=new List() l.append(v2) l.append(vin)
  for (ii=1;vin.size<n && ii<5;ii+=1) {
    if (rdmuniqm4) { 
    } else v1.setrand(ro)
    v1.uniq(l,1) // preserve order
  if (vin.size<n) {
    printf("rdmuniq ERR unable to find %d uniq values [%d,%d] -- only \n",n,min,max,vin.size)

// rdmord (vec,n) randomly ordered numbers 0->n-1 in vec
// eg rdmord(ind,ind.size); check: for ii=0,ind.size-1 if (ind.count(ii)!=1) print ii
proc rdmord () { local n,a localobj v1
  a=allocvecs(v1)  n=$2

// shuffle(VSRC[,VDEST]) randomly rearrange elements of vec
obfunc shuffle () { local a  localobj v1,v2,oi,oo
  if (numarg()==2) {oo=$o2 oo.copy(oi)} else oo=oi
  return oo

// colshuf(ind,veclist) shuffle the 'transpose' of indexed vecs -- ie not the vecs themselves
// shuffle items from list of vectors across the list rather than across the vectors
// all vecs should be same size, eg colshuf(nq.ind,nq.fcdo) after a select
func colshuf () { local a,x,ii,cols,rows  localobj v1,v2,oi,ol
  oi=$o1 ol=$o2 cols=ol.o(oi.x[0]).size rows=oi.size
  if (rows==0 || cols==0) {printf("ERRA:a 0") return -1}
  for vtr(&x,oi) v1.append(ol.o(x))
  v1.transpose(cols) v1.mshuffle() v1.transpose() // shuffle in the other direction
  for vtr(&x,oi,&ii) ol.o(x).copy(v1,ii*cols,(ii+1)*cols-1)
  return cols

// sample(vec,beg,end,vals) pick out n integer values from given range
// sample(vec,end,vals) -- assumes 0
proc sample () { local min,max,vals
  if (numarg()==4) {min=$2 max=$3 vals=$4} else {max=$2 vals=$3}

// round() round off to nearest integer
func round () { local ii
  if (argtype(1)==1) {
    if ($o1.size==0) return 1e9
    for ii=0,$o1.size-1 {
      if ($o1.x[ii]>0) $o1.x[ii]=int($o1.x[ii]+0.5) else $o1.x[ii]=int($o1.x[ii]-0.5) 
  } else {
    if ($1>0) return int($1+0.5) else return int($1-0.5) 

// filevers() pulls out version of file from first line
func filevers () { localobj f1,s1,lx1
  f1=new File() s1=new String() lx1=new Union()
  if (! f1.ropen($s1)) { printf("filevers ERR, can't open %s\n",$s1) 
    return 0 }
  if (sscanf(s1.s,"%*s $Id: %*s %*d.%d",&lx1.x)!=1) {
    printf("filevers ERR, sscanf failed %s: %s",$s1,s1.s) }
  return lx1.x

//* hocfind(FILENAME) searches through HOC_LIBRARY_PATH and locates file
obfunc hocfind () { local done localobj f1,s1,s2
  f1=new File() s1=new String() s2=new String()
  system("echo -n $HOC_LIBRARY_PATH",s1.s)
  sprint(s1.s,"%s ",s1.s) // to look at last item
  while (sfunc.len(s1.s)>2) {
    sfunc.head(s1.s,"[ :]",s2.s)
    if (f1.ropen(s2.s)) {done=1 break}
    sfunc.tail(s1.s,"[ :]",s1.s)
  if (!done) if (f1.ropen($s1)) {sprint(s2.s,"./%s",$s1) done=1}
  if (!done) s2.s="NOT FOUND"
  return s2

//* usefiles(F1[,F2,...]) list of files returns string with list of files and versions
obfunc usefiles () { local i localobj s1,s2
  s2=new String()
  s2.s="Using "
  for i=1,numarg() {
    sprint(s2.s,"%s %s%d",s2.s,$si,filevers(s1.s))
  return s2

//* ttest(v1,v2)  student t-test
// nrniv/sync/notebook.dol:16230
// checked against
func ttest () {  local prob,df
  t_val=($o1.mean-$o2.mean)/sqrt($o1.var/$o1.size + $o2.var/$o2.size)
  return prob

// pttest() paired t-test
func pttest () {  local prob,sd,df,cov,j,ave1,ave2,var1,var2
  n=$o1.size ave1=$o1.mean ave2=$o2.mean var1=$o1.var var2=$o2.var cov=0
  if (n!=$o2.size) {printf("pttest ERR: != sizes\n",n,$o2.size) return -1}
  for (j=0;j<n;j+=1) cov+=($o1.x[j]-ave1)*($o2.x[j]-ave2)
  cov /= (df=n-1)
  // printf("%g ",t_val)
  return prob

func howfull () { local a,min,max,bins,ret localobj v1
  min=0 bins=1e3
  if (numarg()==4){min=$2 max=$3 bins=$4} else if (numarg()==3){max=$2 bins=$3} else max=$2
  return ret

//* Matrix things
// msize() print size of a matrix
proc msize () { printf("%d x %d\n",$o1.nrow,$o1.ncol) }

//** l2m() turn a vector list into a matrix
obfunc l2m () { local ii,m,n localobj mat,l,xo
  n=l.o(0).size m=l.count // rows x cols (data in cols)
  mat=new Matrix(n,m)
  for ltr(xo,l,&ii) mat.setcol(ii,xo)
  return mat

//** m2l() turn a matrix into a vector list
obfunc m2l () { local ii,m,n localobj mat,l,xo
  l=new List() mat=$o1 m=mat.ncol n=mat.nrow
  for ii=0,m-1 l.append(mat.getcol(ii))
  return l

//** reind(ind,filter0[,ifilter1,...]) goes through a series of vectors or values 
// to translate an index if filter is a vec then get vec.x[x] else get x+val
func reind () { local i,x
  for i=2,numarg() if (argtype(i)==0) x+=$i else x=$oi.x[x]
  return x

// rmxtmp() sets xtmp string
proc rmxtmp () { localobj st
  if (wopen("xtmp")) { 
    xtmp = "xtmp" 
  } else if (wopen("/tmp/xtmp")) {
  } else {  
    if (!wopen(xtmp)) printf("Can't open an xtmp file anywhere: . /tmp ~/ \n")
  wopen() // close the file

//* matrix functions using matrix.mod stuff
//** getdiag(matvec,destvec) 
proc getdiag () { local a localobj v1

//** setdiag(matvec,value) 
proc setdiag () { local a localobj v1

func msetrc () { local x
  if ((x=sqrt($o1.size))==int(x)) ROWS=COLS=x else printf("Unable to set ROWS,COLS\n")
  return x

for scase(XO,"o","t","s","O","T","S","+") clrsym.o.append(new String(XO.s))

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[PubMed]

References and models cited by this paper

References and models that cite this paper

Achim AM, Bertrand MC, Sutton H, Montoya A, Czechowska Y, Malla AK, Joober R, Pruessner JC, L (2007) Selective abnormal modulation of hippocampal activity during memory formation in first-episode psychosis. Arch Gen Psychiatry 64:999-1014 [PubMed]

Benes FM, Sorensen I, Bird ED (1991) Reduced neuronal size in posterior hippocampus of schizophrenic patients. Schizophr Bull 17:597-608 [PubMed]

Bleuler E (1911) Dementia Praecox oder Gruppe der Schizophrenien Handbuch der Psychiatrie, Aschaffenburg G, ed.

Borgers C, Kopell N (2003) Synchronization in networks of excitatory and inhibitory neurons with sparse, random connectivity. Neural Comput 15:509-38 [PubMed]

Bragin A, Jando G, Nadasdy Z, Hetke J, Wise K, Buzsaki G (1995) Gamma (40-100 Hz) oscillation in the hippocampus of the behaving rat. J Neurosci 15:47-60 [PubMed]

Bresink I, Danysz W, Parsons CG, Mutschler E (1995) Different binding affinities of NMDA receptor channel blockers in various brain regions--indication of NMDA receptor heterogeneity. Neuropharmacology 34:533-40 [PubMed]

Bubeníkova-Valesova V, Horacek J, Vrajova M, Höschl C (2008) Models of schizophrenia in humans and animals based on inhibition of NMDA receptors. Neurosci Biobehav Rev 32:1014-23 [PubMed]

Canolty RT, Edwards E, Dalal SS, Soltani M, Nagarajan SS, Kirsch HE, Berger MS, Barbaro NM, K (2006) High gamma power is phase-locked to theta oscillations in human neocortex. Science 313:1626-8 [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

Cobb SR, Halasy K, Vida I, Nyiri G, Tamas G, Buhl EH, Somogyi P (1997) Synaptic effects of identified interneurons innervating both interneurons and pyramidal cells in the rat hippocampus. Neuroscience 79:629-48 [PubMed]

Cull-Candy S, Brickley S, Farrant M (2001) NMDA receptor subunits: diversity, development and disease. Curr Opin Neurobiol 11:327-35 [PubMed]

Cutsuridis V, Cobb S, Graham BP (2009) Encoding and retrieval in a model of the hippocampal CA1 microcircuit. Hippocampus 20(3):423-46 [Journal] [PubMed]

   Encoding and retrieval in a model of the hippocampal CA1 microcircuit (Cutsuridis et al. 2009) [Model]

Dean B, Scarr E, Bradbury R, Copolov D (1999) Decreased hippocampal (CA3) NMDA receptors in schizophrenia. Synapse 32:67-9

Destexhe A, Rudolph M, Pare D (2003) The high-conductance state of neocortical neurons in vivo. Nat Rev Neurosci 4:739-51 [PubMed]

Ehrlichman RS, Gandal MJ, Maxwell CR, Lazarewicz MT, Finkel LH, Contreras D, Turetsky BI, Sie (2009) N-methyl-d-aspartic acid receptor antagonist-induced frequency oscillations in mice recreate pattern of electrophysiological deficits in schizophrenia. Neuroscience 158:705-12 [PubMed]

Fries P, Nikolić D, Singer W (2007) The gamma cycle. Trends Neurosci 30:309-16 [PubMed]

Gourevitch B, Eggermont JJ (2007) Evaluating information transfer between auditory cortical neurons. J Neurophysiol 97:2533-43 [PubMed]

Goutagny R, Jackson J, Williams S (2009) Self-generated theta oscillations in the hippocampus. Nat Neurosci 12:1491-3 [PubMed]

Gray CM, Singer W (1989) Stimulus-specific neuronal oscillations in orientation columns of cat visual cortex. Proc Natl Acad Sci U S A 86:1698-702 [PubMed]

Greene R (2001) Circuit analysis of NMDAR hypofunction in the hippocampus, in vitro, and psychosis of schizophrenia. Hippocampus 11:569-77 [PubMed]

Grillner S, Markram H, De Schutter E, Silberberg G, LeBeau FE (2005) Microcircuits in action--from CPGs to neocortex. Trends Neurosci 28:525-33 [PubMed]

Hajos N, Freund TF, Mody I (2002) Comparison of single NMDA receptor channels recorded on hippocampal principal cells and oriens-alveus interneurons projecting to stratum lacunosum-moleculare (O-LM cells). Acta Biol Hung 53:465-72 [PubMed]

Hangya B, Borhegyi Z, Szilagyi N, Freund TF, Varga V (2009) GABAergic neurons of the medial septum lead the hippocampal network during theta activity. J Neurosci 29:8094-102 [PubMed]

Heckers S (2001) Neuroimaging studies of the hippocampus in schizophrenia. Hippocampus 11:520-8 [PubMed]

Hines ML, Carnevale NT (1997) The NEURON simulation environment. Neural Comput 9:1179-209 [PubMed]

Hines ML, Carnevale NT (2001) NEURON: a tool for neuroscientists. Neuroscientist 7:123-35 [Journal] [PubMed]

   Spatial gridding and temporal accuracy in NEURON (Hines and Carnevale 2001) [Model]

Hines ML, Davison AP, Muller E (2009) NEURON and Python Frontiers in Neuroinformatics 3:1 [Journal] [PubMed]

   NEURON + Python (Hines et al. 2009) [Model]

Holthausen EA, Wiersma D, Sitskoorn MM, Dingemans PM, Schene AH, van den Bosch RJ (2003) Long-term memory deficits in schizophrenia: primary or secondary dysfunction? Neuropsychology 17:539-47 [PubMed]

Homayoun H, Moghaddam B (2007) NMDA receptor hypofunction produces opposite effects on prefrontal cortex interneurons and pyramidal neurons. J Neurosci 27:11496-500 [PubMed]

Honea R, Crow TJ, Passingham D, Mackay CE (2005) Regional deficits in brain volume in schizophrenia: a meta-analysis of voxel-based morphometry studies. Am J Psychiatry 162:2233-45 [PubMed]

Hong LE, Summerfelt A, Buchanan RW, O'Donnell P, Thaker GK, Weiler MA, Lahti AC (2010) Gamma and delta neural oscillations and association with clinical symptoms under subanesthetic ketamine. Neuropsychopharmacology 35:632-40 [PubMed]

Jackson ME, Homayoun H, Moghaddam B (2004) NMDA receptor hypofunction produces concomitant firing rate potentiation and burst activity reduction in the prefrontal cortex. Proc Natl Acad Sci U S A 101:8467-72 [PubMed]

Jahr CE, Stevens CF (1990) Voltage dependence of NMDA-activated macroscopic conductances predicted by single-channel kinetics. J Neurosci 10:3178-82 [PubMed]

Jessen F, Scheef L, Germeshausen L, Tawo Y, Kockler M, Kuhn KU, Maier W, Schild HH, Heun R (2003) Reduced hippocampal activation during encoding and recognition of words in schizophrenia patients. Am J Psychiatry 160:1305-12 [PubMed]

Kelemen E, Fenton AA (2010) Dynamic grouping of hippocampal neural activity during cognitive control of two spatial frames. PLoS Biol 8:e1000403 [PubMed]

Kolomeets NS, Orlovskaya DD, Uranova NA (2007) Decreased numerical density of CA3 hippocampal mossy fiber synapses in schizophrenia. Synapse 61:615-21 [PubMed]

Lazarewicz MT, Ehrlichman RS, Maxwell CR, Gandal MJ, Finkel LH, Siegel SJ (2010) Ketamine modulates theta and gamma oscillations. J Cogn Neurosci 22:1452-64 [PubMed]

Lisman J, Buzsaki G (2008) A neural coding scheme formed by the combined function of gamma and theta oscillations. Schizophr Bull 34:974-80 [PubMed]

Lisman JE, Coyle JT, Green RW, Javitt DC, Benes FM, Heckers S, Grace AA (2008) Circuit-based framework for understanding neurotransmitter and risk gene interactions in schizophrenia. Trends Neurosci 31:234-42 [PubMed]

Lytton WW (2006) Neural Query System: Data-mining from within the NEURON simulator. Neuroinformatics 4:163-76 [Journal] [PubMed]

   Neural Query System NQS Data-Mining From Within the NEURON Simulator (Lytton 2006) [Model]

Lytton WW (2008) Computer modelling of epilepsy. Nat Rev Neurosci 9:626-37 [Journal] [PubMed]

Lytton WW, Sejnowski TJ (1991) Simulations of cortical pyramidal neurons synchronized by inhibitory interneurons. J Neurophysiol 66:1059-79 [Journal] [PubMed]

Malhotra AK, Pinals DA, Adler CM, Elman I, Clifton A, Pickar D, Breier A (1997) Ketamine-induced exacerbation of psychotic symptoms and cognitive impairment in neuroleptic-free schizophrenics. Neuropsychopharmacology 17:141-50 [PubMed]

Malhotra AK, Pinals DA, Weingartner H, Sirocco K, Missar CD, Pickar D, Breier A (1996) NMDA receptor function and human cognition: the effects of ketamine in healthy volunteers. Neuropsychopharmacology 14:301-7 [PubMed]

Narr KL, Thompson PM, Szeszko P, Robinson D, Jang S, Woods RP, Kim S, Hayashi KM, Asunction D (2004) Regional specificity of hippocampal volume reductions in first-episode schizophrenia. Neuroimage 21:1563-75 [PubMed]

Newcomer JW, Farber NB, Jevtovic-Todorovic V, Selke G, Melson AK, Hershey T, Craft S, Olney J (1999) Ketamine-induced NMDA receptor hypofunction as a model of memory impairment and psychosis. Neuropsychopharmacology 20:106-18 [PubMed]

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, 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]

Nyi­ri G, Stephenson FA, Freund TF, Somogyi P (2003) Large variability in synaptic N-methyl-D-aspartate receptor density on interneurons and a comparison with pyramidal-cell spines in the rat hippocampus. Neuroscience 119:347-63 [PubMed]

Olypher AV, Klement D, Fenton AA (2006) Cognitive disorganization in hippocampus: a physiological model of the disorganization in psychosis. J Neurosci 26:158-68 [PubMed]

Oppenheim AV, Schafer RW, Buck JR (1999) Discrete-time signal processing

Orban G, Kiss T, Erdi P (2006) Intrinsic and synaptic mechanisms determining the timing of neuron population activity during hippocampal theta oscillation. J Neurophysiol 96:2889-904 [PubMed]

Orban G, Kiss T, Lengyel M, Erdi P (2001) Hippocampal rhythm generation: gamma-related theta-frequency resonance in CA3 interneurons. Biol Cybern 84:123-32 [PubMed]

Parnas J, Bovet P, Zahavi D (2002) Schizophrenic autism: clinical phenomenology and pathogenetic implications. World Psychiatry 1:131-6 [PubMed]

Reggia JA, Goodall SM, Shkuro Y, Glezer M (2001) The callosal dilemma: explaining diaschisis in the context of hemispheric rivalry via a neural network model. Neurol Res 23:465-71 [PubMed]

Sabolek H, Penley S, Bunce J, Hinman J, Chrobak J (2006) Ketamine alters synchrony throughout the hippocampal formation Society for Neuroscience Abstract 751.12-AA3

Silberberg G, Grillner S, LeBeau FE, Maex R, Markram H (2005) Synaptic pathways in neural microcircuits. Trends Neurosci 28:541-51 [PubMed]

Stacey WC, Lazarewicz MT, Litt B (2009) Synaptic noise and physiological coupling generate high-frequency oscillations in a hippocampal computational model. J Neurophysiol 102:2342-57 [Journal] [PubMed]

   High frequency oscillations in a hippocampal computational model (Stacey et al. 2009) [Model]

Stewart M, Fox SE (1990) Do septal neurons pace the hippocampal theta rhythm? Trends Neurosci 13:163-8 [PubMed]

Suzuki Y, Jodo E, Takeuchi S, Niwa S, Kayama Y (2002) Acute administration of phencyclidine induces tonic activation of medial prefrontal cortex neurons in freely moving rats. Neuroscience 114:769-79 [PubMed]

Szeszko PR, Goldberg E, Gunduz-Bruce H, Ashtari M, Robinson D, Malhotra AK, Lencz T, Bates J, (2003) Smaller anterior hippocampal formation volume in antipsychotic-naive patients with first-episode schizophrenia. Am J Psychiatry 160:2190-7 [PubMed]

Tamminga CA, Stan AD, Wagner AD (2010) The hippocampal formation in schizophrenia. Am J Psychiatry 167:1178-93 [PubMed]

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

Tort AB, Rotstein HG, Dugladze T, Gloveli T, Kopell NJ (2007) On the formation of gamma-coherent cell assemblies by oriens lacunosum-moleculare interneurons in the hippocampus. Proc Natl Acad Sci U S A 104:13490-5 [Journal] [PubMed]

   Gamma and theta rythms in biophysical models of hippocampus circuits (Kopell et al. 2011) [Model]

Uhlhaas PJ, Phillips WA, Mitchell G, Silverstein SM (2006) Perceptual grouping in disorganized schizophrenia. Psychiatry Res 145:105-17 [PubMed]

Uhlhaas PJ, Phillips WA, Schenkel LS, Silverstein SM (2006) Theory of mind and perceptual context-processing in schizophrenia. Cogn Neuropsychiatry 11:416-36

Uhlhaas PJ, Silverstein SM (2005) Perceptual organization in schizophrenia spectrum disorders: empirical research and theoretical implications. Psychol Bull 131:618-32 [PubMed]

Uhlhaas PJ, Singer W (2006) Neural synchrony in brain disorders: relevance for cognitive dysfunctions and pathophysiology. Neuron 52:155-68 [PubMed]

Wang XJ (2002) Pacemaker neurons for the theta rhythm and their synchronization in the septohippocampal reciprocal loop. J Neurophysiol 87:889-900 [PubMed]

Wang XJ, Buzsaki G (1996) Gamma oscillation by synaptic inhibition in a hippocampal interneuronal network model. J Neurosci 16:6402-13 [Journal] [PubMed]

   Gamma oscillations in hippocampal interneuron networks (Wang, Buzsaki 1996) [Model]

White JA, Banks MI, Pearce RA, Kopell NJ (2000) Networks of interneurons with fast and slow gamma-aminobutyric acid type A (GABAA) kinetics provide substrate for mixed gamma-theta rhythm. Proc Natl Acad Sci U S A 97:8128-33 [PubMed]

Whittington MA, Traub RD, Kopell N, Ermentrout B, Buhl EH (2000) Inhibition-based rhythms: experimental and mathematical observations on network dynamics. Int J Psychophysiol 38:315-36 [PubMed]

Zaidel DW, Esiri MM, Harrison PJ (1997) Size, shape, and orientation of neurons in the left and right hippocampus: investigation of normal asymmetries and alterations in schizophrenia. Am J Psychiatry 154:812-8 [PubMed]

Bezaire MJ, Raikov I, Burk K, Vyas D, Soltesz I (2016) Interneuronal mechanisms of hippocampal theta oscillation in a full-scale model of the rodent CA1 circuit. Elife [Journal] [PubMed]

   Hippocampal CA1 NN with spontaneous theta, gamma: full scale & network clamp (Bezaire et al 2016) [Model]

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 [Journal] [PubMed]

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

Chehelcheraghi M, van Leeuwen C, Steur E, Nakatani C (2017) A neural mass model of cross frequency coupling. PLoS One 12:e0173776 [Journal] [PubMed]

   A neural mass model of cross frequency coupling (Chehelcheraghi et al 2017) [Model]

Ferguson KA, Huh CY, Amilhon B, Williams S, Skinner FK (2013) Experimentally constrained CA1 fast-firing parvalbumin-positive interneuron network models exhibit sharp transitions into coherent high frequency rhythms. Front Comput Neurosci 7:144 [Journal] [PubMed]

   CA1 PV+ fast-firing hippocampal interneuron (Ferguson et al. 2013) [Model]

Neymotin SA, Chadderdon GL, Kerr CC, Francis JT, Lytton WW (2013) Reinforcement learning of 2-joint virtual arm reaching in a computer model of sensorimotor cortex Neural Computation 25(12):3263-93 [Journal] [PubMed]

   Sensorimotor cortex reinforcement learning of 2-joint virtual arm reaching (Neymotin et al. 2013) [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, Hilscher MM, Moulin TC, Skolnick Y, Lazarewicz MT, Lytton WW (2013) Ih Tunes Theta/Gamma Oscillations and Cross-Frequency Coupling In an In Silico CA3 Model PLoS ONE 8(10):e76285 [Journal] [PubMed]

   Ih tunes oscillations in an In Silico CA3 model (Neymotin et al. 2013) [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]

Sanjay M, Neymotin SA, Krothapalli SB (2015) Impaired dendritic inhibition leads to epileptic activity in a computer model of CA3. Hippocampus 25:1336-50 [Journal] [PubMed]

   CA3 Network Model of Epileptic Activity (Sanjay et. al, 2015) [Model]

Stanley DA, Talathi SS, Parekh MB, Cordiner DJ, Zhou J, Mareci TH, Ditto WL, Carney PR (2013) Phase shift in the 24-hour rhythm of hippocampal EEG spiking activity in a rat model of temporal lobe epilepsy. J Neurophysiol 110:1070-86 [Journal] [PubMed]

   Hippocampal CA3 network and circadian regulation (Stanley et al. 2013) [Model]

(84 refs)