.. currentmodule:: brian

.. index::
   pair: example usage; IdentityConnection
   pair: example usage; NeuronGroup
   pair: example usage; cos
   pair: example usage; run
   pair: example usage; arctan
   pair: example usage; Connection
   pair: example usage; exp
   pair: example usage; SpikeCounter

.. _example-frompapers_Sturzl_et_al_2000:

Example: Sturzl_et_al_2000 (frompapers)
=======================================

Adapted from
Theory of Arachnid Prey Localization
W. Sturzl, R. Kempter, and J. L. van Hemmen
PRL 2000

Poisson inputs are replaced by integrate-and-fire neurons

Romain Brette

::

    from brian import *
    
    # Parameters
    degree = 2 * pi / 360.
    duration = 500 * ms
    R = 2.5 * cm # radius of scorpion
    vr = 50 * meter / second # Rayleigh wave speed
    phi = 144 * degree # angle of prey
    A = 250 * Hz
    deltaI = .7 * ms # inhibitory delay
    gamma = (22.5 + 45 * arange(8)) * degree # leg angle
    delay = R / vr * (1 - cos(phi - gamma))  # wave delay
    
    # Wave (vector w)
    t = arange(int(duration / defaultclock.dt) + 1) * defaultclock.dt
    Dtot = 0.
    w = 0.
    for f in range(150, 451):
        D = exp(-(f - 300) ** 2 / (2 * (50 ** 2)))
        xi = 2 * pi * rand()
        w += 100 * D * cos(2 * pi * f * t + xi)
        Dtot += D
    w = .01 * w / Dtot
    
    # Rates from the wave
    def rates(t):
        return w[array(t / defaultclock.dt, dtype=int)]
    
    # Leg mechanical receptors
    tau_legs = 1 * ms
    sigma = .01
    eqs_legs = """
    dv/dt=(1+rates(t-d)-v)/tau_legs+sigma*(2./tau_legs)**.5*xi:1
    d : second
    """
    legs = NeuronGroup(8, model=eqs_legs, threshold=1, reset=0, refractory=1 * ms)
    legs.d = delay
    spikes_legs = SpikeCounter(legs)
    
    # Command neurons
    tau = 1 * ms
    taus = 1 * ms
    wex = 7
    winh = -2
    eqs_neuron = '''
    dv/dt=(x-v)/tau : 1
    dx/dt=(y-x)/taus : 1 # alpha currents
    dy/dt=-y/taus : 1
    '''
    neurons = NeuronGroup(8, model=eqs_neuron, threshold=1, reset=0)
    synapses_ex = IdentityConnection(legs, neurons, 'y', weight=wex)
    synapses_inh = Connection(legs, neurons, 'y', delay=deltaI)
    for i in range(8):
        synapses_inh[i, (4 + i - 1) % 8] = winh
        synapses_inh[i, (4 + i) % 8] = winh
        synapses_inh[i, (4 + i + 1) % 8] = winh
    spikes = SpikeCounter(neurons)
    
    run(duration)
    nspikes = spikes.count
    x = sum(nspikes * exp(gamma * 1j))
    print "Angle (deg):", arctan(imag(x) / real(x)) / degree
    polar(concatenate((gamma, [gamma[0] + 2 * pi])), concatenate((nspikes, [nspikes[0]])) / duration)
    show()
    

