Software for teaching neurophysiology of neuronal circuits (Grisham et al. 2008)


Help downloading and running models
Accession:121628
"To circumvent the many problems in teaching neurophysiology as a “wet lab,” we developed SWIMMY, a virtual fish that swims by moving its virtual tail by means of a virtual neural circuit. ... Using SWIMMY, students (1) review the basics of neurophysiology, (2) identify the neurons in the circuit, (3) ascertain the neurons’ synaptic interconnections, (4) discover which cells generate the motor pattern of swimming, (5) discover how the rhythm is generated, and finally (6) use an animation that corresponds to the activity of the motoneurons to discover the behavioral effects produced by various lesions and explain them in terms of their neural underpinnings. ..."
Reference:
1 . Grisham W, Schottler NA, Krasne FB (2008) SWIMMY: Free Software for Teaching Neurophysiology of Neuronal Circuits. J Undergrad Neurosci Educ 7:A1-8 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Unknown;
Cell Type(s):
Channel(s): I Na,t; I K;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON (web link to model);
Model Concept(s): Oscillations; Tutorial/Teaching;
Implementer(s):
Search NeuronDB for information about:  I Na,t; I K;
(located via links below)
begintemplate VectorPlay
public b, g, vx, vy, sname, set_vec, oldval, con1
objref b, g, this, vx, vy, sc
strdef sname, tstr

i=0
oldval=0

proc init() {
	have_name = 0
	is_con = 0
	state = 0
	sc = new SymChooser("Variable Name to Play into")
	build()
	if (numarg() == 0) {
		sprint(tstr, "%s", this)
		b.map(tstr)
	}
}

proc build() {
	sname = "Choose Variable Name in Graph menu"
	b = new VBox()
	b.ref(this)
	b.save("save()")
	b.intercept(1)
	xpanel("", 1)
	xstatebutton("Connected", &state, "con()")
	xvarlabel(sname)
	xpanel()
	g = new Graph()
	b.intercept(0)
	g.menu_action("Variable Name", "varname()")
	g.menu_action("Vector from Clipboard", "clipboard()")
}

proc varname() {
	if (sc.run()) {
		have_name = 1
		sc.text(sname)
	}
	con1(is_con)
}

proc clipboard() {
	sprint(tstr, "%s.set_vec(hoc_obj_[1], hoc_obj_[0])", this)
	if(execute1(tstr) == 0) {
continue_dialog("No data in the Vector clipboard.")
        }else{
		con1(is_con)
	}
}

proc set_vec() {
	vx = $o1.c
	vy = $o2.c
	vy.plot(g, vx)
}

proc con() {
	if (!have_name) {
		continue_dialog("Choose Variable name (see Graph Menu)")
		state = 0
	}else if (!object_id(vy)) {
		continue_dialog("Choose Vector from Clipboard (see Graph Menu)")
		state = 0
	}else{
		con1(state)
	}		
}

proc con1() {
	if (object_id(vy)) {
		if (is_con) {
			vy.play_remove()
			sprint(tstr, "%s = %g", sname, oldval)
			execute(tstr)
			is_con = 0
			state = 0
		}
		if ($1) {
			sprint(tstr, "%s.vy.play(&%s, %s.vx)", this, sname, this)
			if (execute1(tstr)) {
				sprint(tstr, "%s.oldval = %s", this, sname)
				execute(tstr)
				is_con = 1
				state = 1
			}else{
				continue_dialog("Invalid Variable name")
			}
		}
	}
}

proc save() {local i
	b.save("load_file(\"vplay.hoc\")\n}\n{")
	b.save("ocbox_=new VectorPlay(1)")
	b.save("}\n{object_push(ocbox_)}")

	if (object_id(vy)) {
		sprint(tstr, "vy = new Vector(%d)", vy.size)
		b.save(tstr)
		sprint(tstr, "vx = new Vector(%d)", vx.size)
		b.save(tstr)
		sprint(tstr, "for i=0,%d { vx.x[i]=fscan() vy.x[i]=fscan()}",\
			vx.size-1)
		b.save(tstr)
		for i=0, vx.size-1 {   
			sprint(tstr, "%g %g", vx.x[i], vy.x[i])
			b.save(tstr)
		}
		b.save("{vy.plot(g, vx)}")
	}

	sprint(tstr, "{sname = \"%s\"  have_name = %d  con1(%d)}",\
		 sname, have_name, is_con)
	b.save(tstr)

	b.save("{object_pop()}\n{")
	g.save_name("ocbox_.g", 1)
	b.save("ocbox_ = ocbox_.b")
}

endtemplate VectorPlay

objref tobj

proc makeVectorPlay() {
	tobj = new VectorPlay()
	objref tobj
}

Loading data, please wait...