.. currentmodule:: brian2 .. Fig5A: Example: Fig5A ============== .. only:: html .. |launchbinder| image:: http://mybinder.org/badge.svg .. _launchbinder: https://mybinder.org/v2/gh/brian-team/brian2-binder/master?filepath=examples/frompapers/Brette_2012/Fig5A.ipynb .. note:: You can launch an interactive, editable version of this example without installing any local files using the Binder service (although note that at some times this may be slow or fail to open): |launchbinder|_ Brette R (2013). Sharpness of spike initiation in neurons explained by compartmentalization. PLoS Comp Biol, doi: 10.1371/journal.pcbi.1003338. Fig. 5A. Voltage trace for current injection, with an additional reset when a spike is produced. Trick: to reset the entire neuron, we use a set of synapses from the spike initiation compartment where the threshold condition applies to all compartments, and the reset operation (v = EL) is applied there every time a spike is produced. :: from brian2 import * from params import * defaultclock.dt = 0.025*ms duration = 500*ms # Morphology morpho = Soma(50*um) # chosen for a target Rm morpho.axon = Cylinder(diameter=1*um, length=300*um, n=300) # Input taux = 5*ms sigmax = 12*mV xx0 = 7*mV compartment = 40 # Channels eqs = ''' Im = gL * (EL - v) + gNa * m * (ENa - v) + gLx * (xx0 + xx) : amp/meter**2 dm/dt = (minf - m) / taum : 1 # simplified Na channel minf = 1 / (1 + exp((va - v) / ka)) : 1 gNa : siemens/meter**2 gLx : siemens/meter**2 dxx/dt = -xx / taux + sigmax * (2 / taux)**.5 *xi : volt ''' neuron = SpatialNeuron(morphology=morpho, model=eqs, Cm=Cm, Ri=Ri, threshold='m>0.5', threshold_location=compartment, refractory=5*ms) neuron.v = EL neuron.gLx[0] = gL neuron.gNa[compartment] = gNa_0 / neuron.area[compartment] # Reset the entire neuron when there is a spike reset = Synapses(neuron, neuron, on_pre='v = EL') reset.connect('i == compartment') # Connects the spike initiation compartment to all compartments # Monitors S = SpikeMonitor(neuron) M = StateMonitor(neuron, 'v', record=0) run(duration, report='text') # Add spikes for display v = M[0].v for t in S.t: v[int(t / defaultclock.dt)] = 50*mV plot(M.t/ms, v/mV, 'k') tight_layout() show() .. image:: ../resources/examples_images/frompapers.Brette_2012.Fig5A.1.png