load_file("nrngui.hoc") load_file("init.hoc") load_file(1, "fig3b.ses") /* Fig 3B in the paper was constructed by: Turning on the variable step method. Selecting "KeepLines" in the grapher Using Begin-End, Steps values for Proximal 2-12, 20 Middle 2-6, 8 6-7.5, 50 7.5-12, 9 Distal 2-5, 6 5-5.8, 30 5.8-6, 20 6-6.5, 10 6.5-12, 11 */ for i=0, 1 { InhiSyn[i].gmaxampa = 0 InhiSyn[i].gmaxnmda = 0 } hoc_ac_ = .5 tuftden[1] PointProcessManager[1].move() hoc_ac_ = .5 tuftden[0] PointProcessManager[2].move() GluSyn[0].onset = 0 GluSyn[1].onset = 0 tstop = 12 steps_per_ms = 400 objref svec, pvec, tvec, mat, xvec, yvec svec = new Vector() pvec = new Vector() tvec = new Vector() svec.record(&soma.v(.5)) pvec.record(&priden.v(.75)) tvec.record(&t) mat = new Matrix(3,3) func tmax() {local i, x, x1, x2, y, y1, y2 // interpolated maximum under assumption of nonuniform t values i = \$o1.max_ind if (i > 0 && i < \$o1.size-1) { yvec = \$o1.c(i-1,i+1) xvec = tvec.c(i-1,i+1) mat.setcol(0, xvec.c.mul(xvec)) mat.setcol(1, xvec) mat.setcol(2, 1) yvec = mat.solv(yvec) if (yvec.x[0] <= 0) { // good, it's convex x = -yvec.x[1]/2/yvec.x[0] if (x >= xvec.x[0] && x <= xvec.x[2]) { // and we are in the original interval return x } } printf("failure in finding time of maximum around index %d\n", i) print "x" xvec.printf print "y" \$o1.c(i-1,i+1).printf print "quadratic fit a*x^2 + b*x + c" yvec.printf } return tvec.x[i] } func spdiff() { GluSyn[0].gmaxampa = \$1*1e-3 GluSyn[1].gmaxampa = \$1*1e-3 GluSyn[0].gmaxnmda = \$1*1e-3*.5 GluSyn[1].gmaxnmda = \$1*1e-3*.5 run() return (tmax(svec) - tmax(pvec)) } proc tuftlocate() {local i hoc_ac_ = \$1 tuftden[1] PointProcessManager[1].move() hoc_ac_ = \$1 tuftden[0] PointProcessManager[2].move() } xpanel("Synapse tuft location") xradiobutton("proximal", "tuftlocate(.17)") xradiobutton("middle", "tuftlocate(.5)", 1) xradiobutton("distal", "tuftlocate(.83)") xpanel() tuftlocate(.5)