def simulate_network(**kw):
    my_nest.ResetKernel()
    my_nest.SetKernelStatus({
        'local_num_threads': 1,
        #                              'print_time':True
    })

    p_gi = par.dic['nest']['GI']
    p_st = par.dic['nest']['ST']
    for d in [p_gi, p_st]:
        if 'type_id' in d: del d['type_id']

    mm = {'active': True, 'params': {'to_memory': True, 'to_file': False}}
    st = MyNetworkNode('st', model='my_aeif_cond_exp', n=1, params=p_st, mm=mm)

    for key in ['GI_ST_gaba', 'CS_ST_ampa']:
        d = par.dic['nest'][key]
        if 'type_id' in d: del d['type_id']
        my_nest.CopyModel('static_synapse', key, d)

    d = {
        'rate_first': 30**2. * (1 + kw.get('gi_amp', 0)),
        'rate_second': 30**2.**(1 - kw.get('gi_amp', 0)),
        'period_first': 25.0,
        'period_second': 25.
    }
    inp_st_gaba = my_nest.Create('poisson_generator_periodic', n=1, params=d)

    d = {
        'rate_first': 400. * (1 + kw.get('st_amp', 0)),
        'rate_second': 400.**(1 - kw.get('st_amp', 0)),
        'period_first': 25.0,
        'period_second': 25.
    }
    inp_st_ampa = my_nest.Create('poisson_generator_periodic', n=1, params=d)

    my_nest.Connect(inp_st_gaba, st.ids, 0.08, 1., model='GI_ST_gaba')
    my_nest.Connect(inp_st_ampa, st.ids, 0.25, 1., model='CS_ST_ampa')

    my_nest.Simulate(kw.get('sim_time'), chunksize=1000.0)

    d = {}

    from core.network.data_processing import Data_unit_vm
    st_dus = Data_unit_vm('st', st.get_voltage_signal())
    d['st'] = {'vm_signal': st_dus}

    return d
def simulate_network(**kw):
    my_nest.ResetKernel()
    my_nest.SetKernelStatus({
        'local_num_threads': 4,
        #                              'print_time':True
    })

    p_gi = par.dic['nest']['GI']
    p_st = par.dic['nest']['ST']

    p_st.update(kw.get('p_st', {}))

    for d in [p_gi, p_st]:
        if 'type_id' in d: del d['type_id']

    sd = {
        'active': True,
        'params': {
            'to_memory': True,
            'to_file': False,
            'start': 500.0
        }
    }
    gi = MyNetworkNode('gi',
                       model='my_aeif_cond_exp',
                       n=kw.get('gi_n'),
                       params=p_gi,
                       sd=sd)
    #     st=MyNetworkNode('gi',model='my_aeif_cond_exp', n=kw.get('st_n'), params=p_gi, sd=sd)
    st = MyNetworkNode('st',
                       model='my_aeif_cond_exp',
                       n=kw.get('st_n'),
                       params=p_st,
                       sd=sd)

    for key in [
            'GI_ST_gaba', 'GI_GI_gaba', 'ST_GI_ampa', 'EI_GI_ampa',
            'CS_ST_ampa'
    ]:
        d = par.dic['nest'][key]
        if 'type_id' in d: del d['type_id']
        my_nest.CopyModel('static_synapse', key, d)

    df = my_nest.GetDefaults('my_aeif_cond_exp')['receptor_types']
    for post in st:
        idx = random.sample(range(kw.get('gi_n')), 30)
        #         params={'receptor_type':df['GABAA_1']}
        delay = kw['gi_st_delay']
        model = 'GI_ST_gaba'
        my_nest.Connect([pre for i, pre in enumerate(gi) if i in idx],
                        [post] * 30, [0.08] * 30, [delay] * 30, model)

    for pre in gi:
        idx = random.sample(range(kw.get('gi_n')), 30)
        #         params={'receptor_type':df['GABAA_1']}
        delay = kw['gi_gi_delay']
        model = 'GI_GI_gaba'
        my_nest.Connect([pre] * 30,
                        [post for i, post in enumerate(gi) if i in idx],
                        [1.3] * 30, [delay] * 30, model)

    for pre in gi:
        idx = random.sample(range(kw.get('st_n')), 30)
        #         params={'receptor_type':df['AMPA_1']}
        delay = kw['st_gi_delay']
        model = 'ST_GI_ampa'
        my_nest.Connect([pre for i, pre in enumerate(st) if i in idx],
                        [post] * 30, [0.35] * 30, [delay] * 30, model)

    d = {
        'rate_first': 1400. * (1 + kw.get('gi_amp', 0)),
        'rate_second': 1400.**(1 - kw.get('gi_amp', 0)),
        'period_first': 25.0,
        'period_second': 25.
    }
    inp_gi = my_nest.Create('poisson_generator_periodic',
                            n=kw.get('gi_n'),
                            params=d)

    d = {
        'rate_first': 400. * (1 + kw.get('st_amp', 0)),
        'rate_second': 400.**(1 - kw.get('st_amp', 0)),
        'period_first': 25.0,
        'period_second': 25.
    }
    inp_st = my_nest.Create('poisson_generator_periodic',
                            n=kw.get('st_n'),
                            params=d)

    my_nest.Connect(inp_gi, gi.ids, 0.25, 1., model='EI_GI_ampa')
    my_nest.Connect(inp_st, st.ids, 0.25, 1., model='CS_ST_ampa')

    my_nest.Simulate(kw.get('sim_time'), chunksize=1000.0)

    d = {}

    from core.network.data_processing import Data_unit_spk, Data_units_relation
    gi_dus = Data_unit_spk('gi', gi.get_spike_signal())
    d['gi'] = {'spike_signal': gi_dus}
    st_dus = Data_unit_spk('st', st.get_spike_signal())
    d['st'] = {'spike_signal': st_dus}

    d['gi_st'] = {'spike_signal': Data_units_relation('gi_st', gi_dus, st_dus)}

    return d
'''

import numpy
from core import my_nest
my_nest.SetKernelStatus({"total_num_virtual_procs": 4})
pg = my_nest.Create("poisson_generator", 20, params={"rate": 50000.0})
n = my_nest.Create('aeif_cond_exp', 20)
# n = my_nest.Create('iaf_neuron', 20)
w = [10. for _ in n]
d = [1. for _ in n]
sd = my_nest.Create("spike_detector",
                    params={
                        "to_file": False,
                        "to_memory": True
                    })

post = n
post_ids = list(numpy.unique(post))
status = my_nest.GetStatus(list(numpy.unique(post)), 'local')
lockup = dict(zip(post_ids, status))
l = [1 if lockup[p] else 0 for p in post]
print l

pre = [p for p, b in zip(pg, l) if b]
post = [p for p, b in zip(n, l) if b]
my_nest.Connect_speed(pre, post, w, d)
my_nest.ConvergentConnect(n, sd)
my_nest.Simulate(1000.0)

print len(my_nest.GetStatus(sd)[0]['events']['senders'])
my_nest.Connect([n[2]], vt)

my_nest.Connect(pn[0:2], n[0:2])
my_nest.SetDefaults('bcpnn_dopamine_synapse', params={'vt': vt[0]})
my_nest.Connect([n[0]], [n[1]], model='bcpnn_dopamine_synapse')

p_sd = {"withgid": True, 'to_file': False, 'to_memory': True}
sd = my_nest.Create('spike_detector', 5, params=p_sd)
pd = my_nest.Create('poisson_generator', 5, params={'rate': 100.})
my_nest.Connect(pd, sd)

d = {'n': []}
T = []
for t in range(200):
    my_nest.Simulate(1)
    d['n'].append(my_nest.GetConnProp([n[0]], [n[1]], 'n'))
    _t = my_nest.GetStatus(sd)[0]['events']['times']
    if list(_t[(_t >= t - 1) * (_t < t)]):
        T.append(_t[(_t >= t - 1) * (_t < t)])

T = reduce(lambda x, y: list(x) + list(y), T)
print _t - T
print my_nest.PrintNetwork()
t = [[tt, tt, tt] for tt in t]
y = [[0, 0.01, 0] for tt in t]

t = reduce(lambda x, y: x + y, t)
y = reduce(lambda x, y: x + y, y)

binned = numpy.zeros(len(d['n']))