.. currentmodule:: brian2

.. custom_events:

Example: custom_events
======================


        .. only:: html

            .. |launchbinder| image:: file:///usr/share/doc/python-brian-doc/docs/badge.svg
            .. _launchbinder: https://mybinder.org/v2/gh/brian-team/brian2-binder/master?filepath=examples/advanced/custom_events.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|_

        

Example demonstrating the use of custom events.

Here we have three neurons, the first is Poisson spiking and connects to neuron G,
which in turn connects to neuron H. Neuron G has two variables v and g, and the
incoming Poisson spikes cause an instantaneous increase in variable g. g decays
rapidly, and in turn causes a slow increase in v. If v crosses a threshold, it
causes a standard spike and reset. If g crosses a threshold, it causes a custom
event ``gspike``, and if it returns below that threshold it causes a custom
event ``end_gspike``. The standard spike event when v crosses a threshold
causes an instantaneous increase in variable x in neuron H (which happens
through the standard ``pre`` pathway in the synapses), and the gspike
event causes an increase in variable y (which happens through the custom
pathway ``gpath``).

::

    from brian2 import *
    # Input Poisson spikes
    inp = PoissonGroup(1, rates=250*Hz)
    # First group G
    eqs_G = '''
    dv/dt = (g-v)/(50*ms) : 1
    dg/dt = -g/(10*ms) : 1
    allow_gspike : boolean
    '''
    G = NeuronGroup(1, eqs_G, threshold='v>1',
                    reset='v = 0; g = 0; allow_gspike = True;',
                    events={'gspike': 'g>1 and allow_gspike',
                            'end_gspike': 'g<1 and not allow_gspike'})
    G.run_on_event('gspike', 'allow_gspike = False')
    G.run_on_event('end_gspike', 'allow_gspike = True')
    # Second group H
    eqs_H = '''
    dx/dt = -x/(10*ms) : 1
    dy/dt = -y/(10*ms) : 1
    '''
    H = NeuronGroup(1, eqs_H)
    # Synapses from input Poisson group to G
    Sin = Synapses(inp, G, on_pre='g += 0.5')
    Sin.connect()
    # Synapses from G to H
    S = Synapses(G, H,
                 on_pre={'pre': 'x += 1',
                         'gpath': 'y += 1'},
                 on_event={'pre': 'spike',
                           'gpath': 'gspike'})
    S.connect()
    # Monitors
    Mstate = StateMonitor(G, ('v', 'g'), record=True)
    Mgspike = EventMonitor(G, 'gspike', 'g')
    Mspike = SpikeMonitor(G, 'v')
    MHstate = StateMonitor(H, ('x', 'y'), record=True)
    # Initialise and run
    G.allow_gspike = True
    run(500*ms)
    # Plot
    figure(figsize=(10, 4))
    subplot(121)
    plot(Mstate.t/ms, Mstate.g[0], '-g', label='g')
    plot(Mstate.t/ms, Mstate.v[0], '-b', lw=2, label='V')
    plot(Mspike.t/ms, Mspike.v, 'ob', label='_nolegend_')
    plot(Mgspike.t/ms, Mgspike.g, 'og', label='_nolegend_')
    xlabel('Time (ms)')
    title('Presynaptic group G')
    legend(loc='best')
    subplot(122)
    plot(MHstate.t/ms, MHstate.y[0], '-r', label='y')
    plot(MHstate.t/ms, MHstate.x[0], '-k', lw=2, label='x')
    xlabel('Time (ms)')
    title('Postsynaptic group H')
    legend(loc='best')
    tight_layout()
    show()
    

