setuptime = startsw()

one_tenth_ncell = 1
use_gap = 0
use_ectopic = 0
use_inject = 0
default_delay=.05
awake = 1
use_load_balance = 0

{load_file("nrngui.hoc")}
{load_file("fortmap.hoc")}
{load_file("hoc/parlib.hoc")}

focus = 1

iterator pcitr() {local i1, i2
	$&1 = 0
	$&2 = focus
	iterator_statement
}

proc gid_distribute() {
print "gid_distribute ", focus
	pc.set_gid2node(focus, pc.id)
}

{load_file("finit.hoc")}
ranseedbase = 1
serial = 0 // override serial set in parlib.hoc
pmesg = 1 && (pc.id == 0)
small_model = 0 // 0 for full model, set to 1 for 40 cells each type
use_traubexact = 1
{load_file("hoc/traubcon.hoc")}

// turn off/on all tables
proc activate_tables() {
	usetable_ar = $1
	usetable_cal = $1
	usetable_cat_a = $1
	usetable_cat = $1
	usetable_k2 = $1
	usetable_ka = $1
	usetable_ka_ib = $1
	usetable_kc = $1
	usetable_kc_fast = $1
	usetable_kdr = $1
	usetable_kdr_fs = $1
	usetable_km = $1
//	usetable_naf2 = $1
//	usetable_naf = $1
//	usetable_naf_tcr = $1
	usetable_nap = $1
//	usetable_napf = $1
//	usetable_napf_spinstell = $1
//	usetable_napf_tcr = $1
}

// til the shift bug in the mod files are fixed (table depends on range variable)
if (1) {
usetable_naf2 = 0
usetable_naf = 0
usetable_naf_tcr = 0
usetable_napf = 0
usetable_napf_spinstell = 0
usetable_napf_tcr = 0
}

gfac_AMPA = 1
gfac_NMDA = 0
gfac_GABAA = 1

{load_file("cell_templates.hoc")}
use_p2c_net_connections = 1
{load_file("net/network_specification_interface.hoc")}
if (!serial) {load_file("hoc/parlib2.hoc")}
{load_file("net/serial_or_par_wrapper.hoc")}

objref fihprog_

objref pattern_, tvec_, idvec_
objref cell, typeflag
load_file("clear.hoc")
typeflag = new Vector(14)
pattern_ = new PatternStim()

proc pattern() {
	clipboard_retrieve("out.spk")
	tvec_ = hoc_obj_[1].c
	idvec_ = hoc_obj_[0].c
	pattern_.play(tvec_, idvec_)
}

proc fakeout() {local i, gid, th
	if ($1 != 0) { th = 1e9 } else { th = 0 }
	pattern_.fake_output = $1
	for pcitr (&i, &gid) {
		pnm.pc.threshold(gid, th)
	}
}		

proc reload() {local i, st, dtsav  localobj ncl
	dtsav=dt
	st = startsw()
	clear()
	focus = $1
	load_file(1, "net/groucho.hoc")
	define_shape()
	want_all_spikes()
	mkhist(50)

	if (pc.id == 0) fihprog_ = new FInitializeHandler("progress()")
	if (use_traubexact) {
		load_file("hoc/traubcon_net.hoc")
		reset_connection_coefficients()
	}
	st = startsw() - st
	cell = cells.object(0)
	fakeout(1)
	typeflag.fill(0) typeflag.x[cell.type] = 1
	dt=dtsav
	ncl = pnm.nclist
	for i=0, ncl.count-1 if (ncl.object(i).delay == .05) ncl.object(i).delay=0
	if (pc.id == 0) {print "reload time: ", st }
}
reload(focus)

proc progress() {
//	print "t=",t
	cvode.event(t+1, "progress()")
}


cvode_active(1)

setuptime = startsw() - setuptime
if (pc.id == 0) {print "SetupTime: ", setuptime}

steps_per_ms = 50
dt = .01
secondorder = 2
if (serial) {
	tstop = 10
}else{
	tstop = 10
}

load_file("gidcell.ses")

tf = 100
objref gm, synmat[3]
proc rdat() {local numcomp  localobj s, f
	s = new String()
	classname(cell, s.s)
	sprint(s.s, "../p2c/data/GROUCHO110.%s", s.s)
	print s.s
//	gm = new Matrix(999,8)
	gm = new Matrix(10*tf-1,2)
	f = new File()
	f.ropen(s.s)
	gm.scanf(f, gm.nrow, gm.ncol)
	gm.getcol(1).line(Graph[0], gm.getcol(0), 2, 1)
    if (0) {
	gm.getcol(5).line(Graph[1], gm.getcol(0), 2, 1)
	gm.getcol(6).line(Graph[1], gm.getcol(0), 3, 1)
	gm.getcol(7).line(Graph[1], gm.getcol(0), 4, 1)
    }
    if (1) {
	f = new File()
	numcomp=0 forsec cell.all numcomp += 1
	synmat[2] = new Matrix(10*tf-1, numcomp+1)
	classname(cell, s.s)
	sprint(s.s, "../p2c/data/gaba_%s.dat", s.s)
	f.ropen(s.s)
	synmat[2].scanf(f, synmat[2].nrow, synmat[2].ncol)

	synmat[0] = new Matrix(10*tf-1, numcomp+1)
	classname(cell, s.s)
	sprint(s.s, "../p2c/data/ampa_%s.dat", s.s)
	f.ropen(s.s)
	synmat[0].scanf(f, synmat[0].nrow, synmat[0].ncol)

	synmat[1] = new Matrix(10*tf-1, numcomp+1)
	classname(cell, s.s)
	sprint(s.s, "../p2c/data/nmda_%s.dat", s.s)
	f.ropen(s.s)
	synmat[1].scanf(f, synmat[0].nrow, synmat[0].ncol)
    }
}
rdat()
pattern()

proc another() {
	reload($1)
	Graph[0].erase
	rdat()
}

//clipboard_retrieve("../p2c/data/ampa.dat")
//hoc_obj_.line(Graph[1], hoc_obj_[1], 2, 1) 
//clipboard_retrieve("../p2c/data/nmda.dat")
//hoc_obj_.line(Graph[1], hoc_obj_[1], 2, 1) 

objref gg
gg = Graph[1]
which = 1
func am() {local g
	g = 0
	forsec cell.all if (ismembrane("ampa1_ion")) {
		g += iampa1*area(0.5)/100
	}
	return g
}
func nm() {local g
	g = 0
	forsec cell.all if (ismembrane("nmda1_ion")) {
		g += inmda1*area(0.5)/100
	}
	return g
}
func ga() {local g
	g = 0
	forsec cell.all if (ismembrane("gaba1_ion")) {
		g += igaba1*area(0.5)/100
	}
	return g
}

func f() {local g
//   cell.comp[which] if (ismembrane("ampa1_ion")) {
//    g = iampa1*area(0.5)/100
   cell.comp[which] if (ismembrane("gaba1_ion")) {
    g = igaba1*area(0.5)/100
   }
   return g
}

proc pw() {
   gg.erase()
   which = $1
   gm = $o2
   gm.getcol(which).line(gg, gm.getcol(0), 2, 1)
}

/* some useful idioms
objref a
a = cell.synlist
for i=0, a.count-1 if (a.o(i).comp == 3) print i, a.o(i), a.o(i).srcgid

objref b
b = pnm.nclist
for i=0,b.count-1 if (b.o(i).syn.comp == 3) print i, b.o(i), b.o(i).syn

for i=0,b.count-1 b.o(i).threshold = 1000
*/

proc mk_another_panel() {local i  localobj s1, s2, base
	s1 = new String()
	s2 = new String()
	base = new Vector(14)
	base.x[0] = 1
	for i=0, 12 {
		sprint(s1.s, "hoc_ac_ = num_%s", typename[i].s)
		execute(s1.s)
		base.x[i+1] = base.x[i] + hoc_ac_
	}
	xpanel("Make a different cell")
	for i=0, 13 {
		sprint(s2.s, "another(%d)", base.x[i])
		sprint(s1.s, "%s %d", typename[i].s, base.x[i])
		xcheckbox(s1.s, &typeflag.x[i], s2.s)
	}
	xpanel(0)
}
mk_another_panel()

seewhich = 0
seetype = 0 // ampa,nmda,gaba
objref syntrajeclist[3], tsyn
proc synsim() { local i, j  localobj vv, gn, gf, r, rr
	for i=0,2 { syntrajeclist[i] = new List() }
	gn = syntrajeclist[seetype]
	gf = synmat[seetype]
	i = 1
	tsyn = new Vector()
	cell.comp[1] {tsyn.record(&t)}
	for i=1, gf.ncol-1 cell.comp[i] {
		insert ampa1_ion
		insert gaba1_ion
		insert nmda1_ion
		vv = new Vector()
		vv.record(&iampa1(.5))
		syntrajeclist[0].append(vv)
		vv = new Vector()
		vv.record(&inmda1(.5))
		syntrajeclist[1].append(vv)
		vv = new Vector()
		vv.record(&igaba1(.5))
		syntrajeclist[2].append(vv)
	}
	stdinit()
	continuerun(100)
	rr = new Vector()
	for i=1, gf.ncol-1 cell.comp[i] for j=0, 2{
		syntrajeclist[j].object(i-1).mul(area(0.5)/100)
	}
	for i=0, gn.count-1 {
		r = gn.object(i).c.interpolate(gf.getcol(0), tsyn)
		rr.append(r.sub(gf.getcol(i+1)).sumsq)
	}
	i = rr.max_ind
	print i, rr.x[i]
	see(i+1, seetype)
}

proc see() {localobj gn, gf, s
   s = new String()
   gg.erase_all()
   seewhich = $1
   seetype = $2
   if (seetype > 2) {seetype = 2}
   if (seetype < 0) {seetype = 0}
   gf = synmat[seetype]
   gn = syntrajeclist[seetype]
   if (seewhich > gn.count) {seewhich = gn.count-1}
   if (seewhich < 1) { seewhich = 1 }
   if (seetype == 0) { s.s = "AMPA" }
   if (seetype == 1) { s.s = "NMDA" }
   if (seetype == 2) { s.s = "GABAA" }
   cell.comp[seewhich] { sprint(s.s,"%s at %s",s.s, secname()) }
   gg.label(.5,.8,s.s,2,1,0,0,1)
   gf.getcol(seewhich).line(gg, gf.getcol(0), 2, 1)
   gn.object(seewhich-1).line(gg, tsyn) 
}


proc mksee() {
	xpanel("compare synapse conductance")
	xvalue("AMPA=0 NMDA=1 GABAA=2", "seetype", 1, "see(seewhich, seetype)")
	xvalue("which", "seewhich", 1, "see(seewhich, seetype)")
	xpanel()
}

load_file("vclampg.hoc")