.. currentmodule:: brian

.. index::
   pair: example usage; SpikeMonitor

.. _example-twister_anonymous:

Example: anonymous (twister)
============================

Anonymous entry for the 2012 Brian twister.

::

    '''
    My contribution to the brian twister!
    
    I meant to give it more thought, but I forgot about the deadline!
    '''
    from brian import *
    from brian.hears import *
    import pygame
    
    _mixer_status = [-1,-1]
    class SoundMonitor(SpikeMonitor):
        """
        Listen to you networks!
        
        Plays pure tones whenever a neuron spikes, frequency is set according to the neuron number.
        """
        def __init__(self, source, record=False, delay=0, 
                     frange = (100.*Hz, 5000.*Hz),
                     duration = 50*ms,
                     samplerate = 44100*Hz):
            super(SoundMonitor, self).__init__(source, record = record, delay = delay)
    
            self.samplerate = samplerate
            self.nsamples = np.rint(duration * samplerate)
    
            p = linspace(0, 1, len(source)).reshape((1, len(source)))
            p = np.tile(p, (self.nsamples, 1))
            freqs = frange[0] * p + (1-p) * frange[1]
            del p
    
            times = linspace(0*ms, duration, self.nsamples).reshape((self.nsamples, 1))
            times = np.tile(times, (1, len(source)))
            
            self.sounds = np.sin(2 * np.pi * freqs * times) 
            self._init_mixer()
    
    
        def propagate(self, spikes):
            if len(spikes):
                data = np.sum(self.sounds[:,spikes], axis = 1)
                x = array((2 ** 15 - 1) * clip(data/amax(data), -1, 1), dtype=int16)
                x.shape = x.size
                # Make sure pygame receives an array in C-order
                x = pygame.sndarray.make_sound(np.ascontiguousarray(x))
                x.play()
    
        def _init_mixer(self):
            global _mixer_status
            if _mixer_status==[-1,-1] or _mixer_status[0]!=1 or _mixer_status != self.samplerate:
                pygame.mixer.quit()
                pygame.mixer.init(int(self.samplerate), -16, 1)
                _mixer_status=[1,self.samplerate]
    
    
    def test_cuba():
        # The CUBA example with sound!
        taum = 20 * ms
        taue = 5 * ms
        taui = 10 * ms
        Vt = -50 * mV
        Vr = -60 * mV
        El = -49 * mV
    
        eqs = Equations('''
        dv/dt  = (ge+gi-(v-El))/taum : volt
        dge/dt = -ge/taue : volt
        dgi/dt = -gi/taui : volt
        ''')
    
        P = NeuronGroup(4000, model=eqs, threshold=Vt, reset=Vr, refractory=5 * ms)
        P.v = Vr
        P.ge = 0 * mV
        P.gi = 0 * mV
    
        Pe = P.subgroup(3200)
        Pi = P.subgroup(800)
        we = (60 * 0.27 / 10) * mV # excitatory synaptic weight (voltage)
        wi = (-20 * 4.5 / 10) * mV # inhibitory synaptic weight
        Ce = Connection(Pe, P, 'ge', weight=we, sparseness=0.5)
        Ci = Connection(Pi, P, 'gi', weight=wi, sparseness=0.5)
        P.v = Vr + rand(len(P)) * (Vt - Vr)
    
        # Record the number of spikes
        M = SoundMonitor(P)
        run(10 * second)
    
    def test_synfire():
        from brian import *
        # Neuron model parameters
        Vr = -70 * mV
        Vt = -55 * mV
        taum = 10 * ms
        taupsp = 0.325 * ms
        weight = 4.86 * mV
        # Neuron model
        eqs = Equations('''
        dV/dt=(-(V-Vr)+x)*(1./taum) : volt
        dx/dt=(-x+y)*(1./taupsp) : volt
        dy/dt=-y*(1./taupsp)+25.27*mV/ms+\
            (39.24*mV/ms**0.5)*xi : volt
        ''')
        # Neuron groups
        P = NeuronGroup(N=1000, model=eqs,
            threshold=Vt, reset=Vr, refractory=1 * ms)
        Pinput = PulsePacket(t=50 * ms, n=85, sigma=1 * ms)
        # The network structure
        Pgp = [ P.subgroup(100) for i in range(10)]
        C = Connection(P, P, 'y')
        for i in range(9):
            C.connect_full(Pgp[i], Pgp[i + 1], weight)
        Cinput = Connection(Pinput, Pgp[0], 'y')
        Cinput.connect_full(weight=weight)
    
        monitor = SoundMonitor(P)
    
        # Setup the network, and run it
        P.V = Vr + rand(len(P)) * (Vt - Vr)
        run(1*second)
        # Plot result
    
        show()
    
    
    if __name__ == '__main__':
        test_synfire()
    
    

