Exemplo n.º 1
0
    def __init__(self, filterbank, targetvar, *args, **kwds):
        self.targetvar = targetvar
        self.filterbank = filterbank
        filterbank.buffer_init()

        # update level keyword
        kwds['level'] = kwds.get('level', 0)+1
    
        # Sanitize the clock - does it have the right dt value?
        if 'clock' in kwds:
            if int(1/kwds['clock'].dt)!=int(filterbank.samplerate):
                raise ValueError('Clock should have 1/dt=samplerate')
        else:
            kwds['clock'] = Clock(dt=1/filterbank.samplerate)        
        
        buffersize = kwds.pop('buffersize', 32)
        if not isinstance(buffersize, int):
            buffersize = int(buffersize*self.samplerate)
        self.buffersize = buffersize
        self.buffer_pointer = buffersize
        self.buffer_start = -buffersize
        
        NeuronGroup.__init__(self, filterbank.nchannels, *args, **kwds)
        
        @network_operation(when='start', clock=self.clock)
        def apply_filterbank_output():
            if self.buffer_pointer>=self.buffersize:
                self.buffer_pointer = 0
                self.buffer_start += self.buffersize
                self.buffer = self.filterbank.buffer_fetch(self.buffer_start, self.buffer_start+self.buffersize)
            setattr(self, targetvar, self.buffer[self.buffer_pointer, :])
            self.buffer_pointer += 1
        
        self.contained_objects.append(apply_filterbank_output)
Exemplo n.º 2
0
    def __init__(self, params=zheng_params, network=None):
        eqs=Equations('''
        G_total                                                       : siemens
        G_total_exc                                                   : siemens
        cmr_o                                                         : 1
        cb                                                            : 1
        g                                                             : 1
        c_ab                                                          : 1
        cb_0                                                          : 1
        g_0                                                           : 1
        ''')

        NeuronGroup.__init__(self, 1, model=eqs, compile=True, freeze=True)

        self.params=params
        self.c_ab=self.params.c_ab
        self.cb_0=self.params.cb_0
        self.g_0=self.params.g_0

        self.cb=self.cb_0
        self.g=self.g_0

        if network is not None:
            self.G_total = linked_var(network, 'g_syn', func=sum)
            self.G_total_exc = linked_var(network, 'g_syn_exc', func=sum)
Exemplo n.º 3
0
    def __init__(self, filterbank, targetvar, *args, **kwds):
        self.targetvar = targetvar
        self.filterbank = filterbank
        filterbank.buffer_init()

        # update level keyword
        kwds['level'] = kwds.get('level', 0) + 1

        # Sanitize the clock - does it have the right dt value?
        if 'clock' in kwds:
            if int(1 / kwds['clock'].dt) != int(filterbank.samplerate):
                raise ValueError('Clock should have 1/dt=samplerate')
        else:
            kwds['clock'] = Clock(dt=1 / filterbank.samplerate)

        buffersize = kwds.pop('buffersize', 32)
        if not isinstance(buffersize, int):
            buffersize = int(buffersize * self.samplerate)
        self.buffersize = buffersize
        self.buffer_pointer = buffersize
        self.buffer_start = -buffersize

        NeuronGroup.__init__(self, filterbank.nchannels, *args, **kwds)

        @network_operation(when='start', clock=self.clock)
        def apply_filterbank_output():
            if self.buffer_pointer >= self.buffersize:
                self.buffer_pointer = 0
                self.buffer_start += self.buffersize
                self.buffer = self.filterbank.buffer_fetch(
                    self.buffer_start, self.buffer_start + self.buffersize)
            setattr(self, targetvar, self.buffer[self.buffer_pointer, :])
            self.buffer_pointer += 1

        self.contained_objects.append(apply_filterbank_output)
Exemplo n.º 4
0
    def __init__(self, params=zheng_params, network=None):
        eqs = Equations('''
        G_total                                                       : siemens
        G_total_exc                                                   : siemens
        cmr_o                                                         : 1
        cb                                                            : 1
        g                                                             : 1
        c_ab                                                          : 1
        cb_0                                                          : 1
        g_0                                                           : 1
        ''')

        NeuronGroup.__init__(self, 1, model=eqs, compile=True, freeze=True)

        self.params = params
        self.c_ab = self.params.c_ab
        self.cb_0 = self.params.cb_0
        self.g_0 = self.params.g_0

        self.cb = self.cb_0
        self.g = self.g_0

        if network is not None:
            self.G_total = linked_var(network, 'g_syn', func=sum)
            self.G_total_exc = linked_var(network, 'g_syn_exc', func=sum)
Exemplo n.º 5
0
 def __init__(self, pyramidal_group, clock=defaultclock):
     eqs = Equations('''
      LFP : amp
     ''')
     NeuronGroup.__init__(self,
                          1,
                          model=eqs,
                          compile=True,
                          freeze=True,
                          clock=clock)
     self.LFP = linked_var(pyramidal_group, 'I_abs', func=sum)
Exemplo n.º 6
0
    def __init__(self, clock, params=default_params, network=None):
        eqs = Equations('''
        G_total                                                       : siemens
        G_total_exc                                                   : siemens
        ds/dt=eta*(G_total-G_base)/G_base-s/tau_s-(f_in-1.0)/tau_f    : 1
        df_in/dt=s/second                                             : 1
        dv/dt=1/tau_o*(f_in-f_out)                                    : 1
        f_out=v**(1.0/alpha)                                          : 1
        o_e=1-(1-e_base)**(1/f_in)                                    : 1
        dq/dt=1/tau_o*((f_in*o_e/e_base)-f_out*q/v)                   : 1
        y=v_base*((k1+k2)*(1-q)-(k2+k3)*(1-v))                        : 1
        G_base                                                        : siemens
        eta                                                           : 1/second
        tau_s                                                         : second
        tau_f                                                         : second
        alpha                                                         : 1
        tau_o                                                         : second
        e_base                                                        : 1
        v_base                                                        : 1
        k1                                                            : 1
        k2                                                            : 1
        k3                                                            : 1
        ''')
        NeuronGroup.__init__(self,
                             1,
                             model=eqs,
                             clock=clock,
                             compile=True,
                             freeze=True)
        self.params = params
        self.G_base = params.G_base
        self.eta = params.eta
        self.tau_s = params.tau_s
        self.tau_f = params.tau_f
        self.alpha = params.alpha
        self.tau_o = params.tau_o
        self.e_base = params.e_base
        self.v_base = params.v_base
        self.k1 = params.k1
        self.params.s_e = params.s_e_0 * exp(-params.TE / params.T_2E)
        self.params.s_i = params.s_i_0 * exp(-params.TE / params.T_2I)
        self.params.beta = self.params.s_e / self.params.s_i
        self.k2 = self.params.beta * params.r_0 * self.e_base * params.TE
        self.k3 = self.params.beta - 1

        self.f_in = 1
        self.s = 0
        self.v = 1
        self.q = 1

        if network is not None:
            self.G_total = linked_var(network, 'g_syn', func=sum)
            self.G_total_exc = linked_var(network, 'g_syn_exc', func=sum)
Exemplo n.º 7
0
    def __init__(self, clock, params=default_params, network=None):
        eqs=Equations('''
        G_total                                                       : siemens
        G_total_exc                                                   : siemens
        ds/dt=eta*(G_total-G_base)/G_base-s/tau_s-(f_in-1.0)/tau_f    : 1
        df_in/dt=s/second                                             : 1
        dv/dt=1/tau_o*(f_in-f_out)                                    : 1
        f_out=v**(1.0/alpha)                                          : 1
        o_e=1-(1-e_base)**(1/f_in)                                    : 1
        dq/dt=1/tau_o*((f_in*o_e/e_base)-f_out*q/v)                   : 1
        y=v_base*((k1+k2)*(1-q)-(k2+k3)*(1-v))                        : 1
        G_base                                                        : siemens
        eta                                                           : 1/second
        tau_s                                                         : second
        tau_f                                                         : second
        alpha                                                         : 1
        tau_o                                                         : second
        e_base                                                        : 1
        v_base                                                        : 1
        k1                                                            : 1
        k2                                                            : 1
        k3                                                            : 1
        ''')
        NeuronGroup.__init__(self, 1, model=eqs, clock=clock, compile=True, freeze=True)
        self.params=params
        self.G_base=params.G_base
        self.eta=params.eta
        self.tau_s=params.tau_s
        self.tau_f=params.tau_f
        self.alpha=params.alpha
        self.tau_o=params.tau_o
        self.e_base=params.e_base
        self.v_base=params.v_base
        self.k1=params.k1
        self.params.s_e=params.s_e_0*exp(-params.TE/params.T_2E)
        self.params.s_i=params.s_i_0*exp(-params.TE/params.T_2I)
        self.params.beta=self.params.s_e/self.params.s_i
        self.k2=self.params.beta*params.r_0*self.e_base*params.TE
        self.k3=self.params.beta-1

        self.f_in=1
        self.s=0
        self.v=1
        self.q=1

        if network is not None:
            self.G_total = linked_var(network, 'g_syn', func=sum)
            self.G_total_exc = linked_var(network, 'g_syn_exc', func=sum)
Exemplo n.º 8
0
 def __init__(self, pyramidal_group, clock=defaultclock):
     eqs=Equations('''
      LFP : amp
     ''')
     NeuronGroup.__init__(self, 1, model=eqs, compile=True, freeze=True, clock=clock)
     self.LFP=linked_var(pyramidal_group, 'I_abs', func=sum)
Exemplo n.º 9
0
    def __init__(self, clock, params=zheng_params, network=None):
        eqs=Equations('''
        G_total                                                       : siemens
        G_total_exc                                                   : siemens
        ds/dt=eta*(G_total-G_base)/G_base-s/tau_s-(f_in-1.0)/tau_f    : 1
        df_in/dt=s/second                                             : 1.0
        dv/dt=1/tau_o*(f_in-f_out)                                    : 1
        f_out=v**(1.0/alpha)                                          : 1
        do_e/dt=1.0/(phi/f_in)*(-o_e+(1.0-g)*(1.0-(1.0-e_base/(1.0-g_0))**(1.0/f_in))) : %.4f
        dcb/dt=1.0/(phi/f_in)*(-cb-(c_ab*o_e)/oe_log+c_ab*g)  : 1
        oe_log                            : 1
        cmr_o=(cb-g*c_ab)/(cb_0-g_0*c_ab) : 1
        dg/dt=1.0/(j*v_ratio*((r*transitTime)/e_base))*((cmr_o-1.0)-k*s)  : %.4f
        dq/dt=1/tau_o*((f_in*o_e/e_base)-f_out*q/v)                   : 1
        y=v_0*((k1+k2)*(1-q)-(k2+k3)*(1-v))                        : 1
        G_base                                                        : siemens
        eta                                                           : 1/second
        tau_s                                                         : second
        tau_f                                                         : second
        alpha                                                         : 1
        tau_o                                                         : second
        v_0                                                           : 1
        k1                                                            : 1
        k2                                                            : 1
        k3                                                            : 1
        phi                                                           : %.4f*second
        e_base                                                        : %.4f
        g_0                                                           : %.4f
        c_ab                                                          : 1
        cb_0                                                          : 1
        v_ratio                                                       : 1
        j                                                             : 1
        transitTime                                                   : second
        k                                                             : 1
        r                                                             : 1
        ''' % (params.e_base, params.g_0, params.phi, params.e_base, params.g_0))
        NeuronGroup.__init__(self, 1, model=eqs, clock=clock, compile=True, freeze=True)

        self.params=params
        self.G_base=params.G_base
        self.eta=params.eta
        self.tau_s=params.tau_s
        self.tau_f=params.tau_f
        self.alpha=params.alpha
        self.tau_o=params.tau_o
        self.e_base=params.e_base
        self.v_0=params.v_0
        self.k1=params.k1
        self.params.s_e=params.s_e_0*exp(-params.TE/params.T_2E)
        self.params.s_i=params.s_i_0*exp(-params.TE/params.T_2I)
        self.params.beta=self.params.s_e/self.params.s_i
        self.k2=self.params.beta*params.r_0*self.e_base*params.TE
        self.k3=self.params.beta-1.0
        self.c_ab=self.params.c_ab
        self.cb_0=self.params.cb_0
        self.g_0=self.params.g_0
        self.phi=self.params.phi
        self.v_ratio=self.params.v_ratio
        self.j=self.params.j
        self.transitTime=self.params.transitTime
        self.k=self.params.k
        self.r=self.params.r

        self.f_in=1.0
        self.s=0.0
        self.v=1.0
        self.o_e=self.e_base
        self.cb=self.cb_0
        self.g=self.g_0
        self.oe_log=np.log(1.0-self.o_e/(1.0-self.g))

        self.q=1.0

        if network is not None:
            self.G_total = linked_var(network, 'g_syn', func=sum)
            self.G_total_exc = linked_var(network, 'g_syn_exc', func=sum)
Exemplo n.º 10
0
    def __init__(self,
                 lip_size,
                 params,
                 background_inputs=None,
                 visual_cortex_input=None,
                 go_input=None):
        self.lip_size = lip_size
        self.N = 2 * self.lip_size

        self.params = params
        self.background_inputs = background_inputs
        self.visual_cortex_input = visual_cortex_input
        self.go_input = go_input

        ## Set up equations

        # Exponential integrate-and-fire neuron
        eqs = exp_IF(params.C, params.gL, params.EL, params.VT, params.DeltaT)

        # AMPA conductance - recurrent input current
        eqs += exp_synapse('g_ampa_r', params.tau_ampa, siemens)
        eqs += Current('I_ampa_r=g_ampa_r*(E-vm): amp', E=params.E_ampa)

        # AMPA conductance - background input current
        eqs += exp_synapse('g_ampa_b', params.tau_ampa, siemens)
        eqs += Current('I_ampa_b=g_ampa_b*(E-vm): amp', E=params.E_ampa)

        # AMPA conductance - task input current
        eqs += exp_synapse('g_ampa_x', params.tau_ampa, siemens)
        eqs += Current('I_ampa_x=g_ampa_x*(E-vm): amp', E=params.E_ampa)

        # AMPA conductance - go input current
        eqs += exp_synapse('g_ampa_g', params.tau_ampa, siemens)
        eqs += Current('I_ampa_g=g_ampa_g*(E-vm): amp', E=params.E_ampa)

        # Voltage-dependent NMDA conductance
        eqs += biexp_synapse('g_nmda', params.tau1_nmda, params.tau2_nmda,
                             siemens)
        eqs += Equations('g_V = 1/(1+(Mg/3.57)*exp(-0.062 *vm/mV)) : 1 ',
                         Mg=params.Mg)
        eqs += Current('I_nmda=g_V*g_nmda*(E-vm): amp', E=params.E_nmda)

        # GABA-A conductance
        eqs += exp_synapse('g_gaba_a', params.tau_gaba_a, siemens)
        eqs += Current('I_gaba_a=g_gaba_a*(E-vm): amp', E=params.E_gaba_a)

        # GABA-B conductance
        eqs += biexp_synapse('g_gaba_b', params.tau1_gaba_b,
                             params.tau2_gaba_b, siemens)
        eqs += Current('I_gaba_b=g_gaba_b*(E-vm): amp', E=params.E_gaba_b)

        # Total synaptic conductance
        eqs += Equations(
            'g_syn=g_ampa_r+g_ampa_x+g_ampa_g+g_ampa_b+g_V*g_nmda+g_gaba_a+g_gaba_b : siemens'
        )
        eqs += Equations(
            'g_syn_exc=g_ampa_r+g_ampa_x+g_ampa_g+g_ampa_b+g_V*g_nmda : siemens'
        )
        # Total synaptic current
        eqs += Equations(
            'I_abs=abs(I_ampa_r)+abs(I_ampa_b)+abs(I_ampa_x)+abs(I_ampa_g)+abs(I_nmda)+abs(I_gaba_a) : amp'
        )

        NeuronGroup.__init__(self,
                             self.N,
                             model=eqs,
                             threshold=-20 * mV,
                             reset=params.EL,
                             compile=True)

        self.init_subpopulations()

        self.connections = []

        self.init_connectivity()

        if self.background_inputs is not None:
            # Background -> E+I population connections
            background_left_ampa = init_connection(self.background_inputs[0],
                                                   self.left_lip.neuron_group,
                                                   'g_ampa_b',
                                                   self.params.w_ampa_min,
                                                   self.params.w_ampa_max,
                                                   self.params.p_b_e,
                                                   delay=5 * ms)
            background_right_ampa = init_connection(
                self.background_inputs[1],
                self.right_lip.neuron_group,
                'g_ampa_b',
                self.params.w_ampa_min,
                self.params.w_ampa_max,
                self.params.p_b_e,
                delay=5 * ms)
            self.connections.append(background_left_ampa)
            self.connections.append(background_right_ampa)

        if self.visual_cortex_input is not None:
            # Task input -> E population connections
            vc_left_lip_ampa = init_connection(self.visual_cortex_input[0],
                                               self.left_lip.e_contra_vis,
                                               'g_ampa_x',
                                               self.params.w_ampa_min,
                                               self.params.w_ampa_max,
                                               self.params.p_v_ec_vis,
                                               delay=270 * ms)
            vc_right_lip_ampa = init_connection(self.visual_cortex_input[1],
                                                self.right_lip.e_contra_vis,
                                                'g_ampa_x',
                                                self.params.w_ampa_min,
                                                self.params.w_ampa_max,
                                                self.params.p_v_ec_vis,
                                                delay=270 * ms)
            self.connections.append(vc_left_lip_ampa)
            self.connections.append(vc_right_lip_ampa)

        if self.go_input is not None:
            go_left_lip_i_ampa = init_connection(self.go_input,
                                                 self.left_lip.i_group,
                                                 'g_ampa_g',
                                                 self.params.w_ampa_min,
                                                 self.params.w_ampa_max,
                                                 self.params.p_g_i,
                                                 delay=5 * ms)
            go_right_lip_i_ampa = init_connection(self.go_input,
                                                  self.right_lip.i_group,
                                                  'g_ampa_g',
                                                  self.params.w_ampa_min,
                                                  self.params.w_ampa_max,
                                                  self.params.p_g_i,
                                                  delay=5 * ms)
            go_left_lip_e_ampa = init_connection(self.go_input,
                                                 self.left_lip.e_group,
                                                 'g_ampa_g',
                                                 self.params.w_ampa_min,
                                                 self.params.w_ampa_max,
                                                 self.params.p_g_e,
                                                 delay=5 * ms)
            go_right_lip_e_ampa = init_connection(self.go_input,
                                                  self.right_lip.e_group,
                                                  'g_ampa_g',
                                                  self.params.w_ampa_min,
                                                  self.params.w_ampa_max,
                                                  self.params.p_g_e,
                                                  delay=5 * ms)
            self.connections.append(go_left_lip_i_ampa)
            self.connections.append(go_right_lip_i_ampa)
            self.connections.append(go_left_lip_e_ampa)
            self.connections.append(go_right_lip_e_ampa)
Exemplo n.º 11
0
    def __init__(self, lip_size, params, background_inputs=None, visual_cortex_input=None,
                 go_input=None):
        self.lip_size=lip_size
        self.N=2*self.lip_size

        self.params=params
        self.background_inputs=background_inputs
        self.visual_cortex_input=visual_cortex_input
        self.go_input=go_input

        ## Set up equations

        # Exponential integrate-and-fire neuron
        eqs = exp_IF(params.C, params.gL, params.EL, params.VT, params.DeltaT)

        # AMPA conductance - recurrent input current
        eqs += exp_synapse('g_ampa_r', params.tau_ampa, siemens)
        eqs += Current('I_ampa_r=g_ampa_r*(E-vm): amp', E=params.E_ampa)

        # AMPA conductance - background input current
        eqs += exp_synapse('g_ampa_b', params.tau_ampa, siemens)
        eqs += Current('I_ampa_b=g_ampa_b*(E-vm): amp', E=params.E_ampa)

        # AMPA conductance - task input current
        eqs += exp_synapse('g_ampa_x', params.tau_ampa, siemens)
        eqs += Current('I_ampa_x=g_ampa_x*(E-vm): amp', E=params.E_ampa)

        # AMPA conductance - go input current
        eqs += exp_synapse('g_ampa_g', params.tau_ampa, siemens)
        eqs += Current('I_ampa_g=g_ampa_g*(E-vm): amp', E=params.E_ampa)

        # Voltage-dependent NMDA conductance
        eqs += biexp_synapse('g_nmda', params.tau1_nmda, params.tau2_nmda, siemens)
        eqs += Equations('g_V = 1/(1+(Mg/3.57)*exp(-0.062 *vm/mV)) : 1 ', Mg=params.Mg)
        eqs += Current('I_nmda=g_V*g_nmda*(E-vm): amp', E=params.E_nmda)

        # GABA-A conductance
        eqs += exp_synapse('g_gaba_a', params.tau_gaba_a, siemens)
        eqs += Current('I_gaba_a=g_gaba_a*(E-vm): amp', E=params.E_gaba_a)

        # GABA-B conductance
        eqs += biexp_synapse('g_gaba_b', params.tau1_gaba_b, params.tau2_gaba_b, siemens)
        eqs += Current('I_gaba_b=g_gaba_b*(E-vm): amp', E=params.E_gaba_b)

        # Total synaptic conductance
        eqs += Equations('g_syn=g_ampa_r+g_ampa_x+g_ampa_g+g_ampa_b+g_V*g_nmda+g_gaba_a+g_gaba_b : siemens')
        eqs += Equations('g_syn_exc=g_ampa_r+g_ampa_x+g_ampa_g+g_ampa_b+g_V*g_nmda : siemens')
        # Total synaptic current
        eqs += Equations('I_abs=abs(I_ampa_r)+abs(I_ampa_b)+abs(I_ampa_x)+abs(I_ampa_g)+abs(I_nmda)+abs(I_gaba_a) : amp')

        NeuronGroup.__init__(self, self.N, model=eqs, threshold=-20*mV, reset=params.EL, compile=True)

        self.init_subpopulations()

        self.connections=[]

        self.init_connectivity()

        if self.background_inputs is not None:
            # Background -> E+I population connections
            background_left_ampa=init_connection(self.background_inputs[0], self.left_lip.neuron_group, 'g_ampa_b',
                self.params.w_ampa_min, self.params.w_ampa_max, self.params.p_b_e, delay=5*ms)
            background_right_ampa=init_connection(self.background_inputs[1], self.right_lip.neuron_group, 'g_ampa_b',
                self.params.w_ampa_min, self.params.w_ampa_max, self.params.p_b_e, delay=5*ms)
            self.connections.append(background_left_ampa)
            self.connections.append(background_right_ampa)

        if self.visual_cortex_input is not None:
            # Task input -> E population connections
            vc_left_lip_ampa=init_connection(self.visual_cortex_input[0], self.left_lip.e_contra_vis, 'g_ampa_x',
                self.params.w_ampa_min, self.params.w_ampa_max, self.params.p_v_ec_vis, delay=270*ms)
            vc_right_lip_ampa=init_connection(self.visual_cortex_input[1], self.right_lip.e_contra_vis, 'g_ampa_x',
                self.params.w_ampa_min, self.params.w_ampa_max, self.params.p_v_ec_vis, delay=270*ms)
            self.connections.append(vc_left_lip_ampa)
            self.connections.append(vc_right_lip_ampa)

        if self.go_input is not None:
            go_left_lip_i_ampa=init_connection(self.go_input, self.left_lip.i_group, 'g_ampa_g', self.params.w_ampa_min,
                self.params.w_ampa_max, self.params.p_g_i, delay=5*ms)
            go_right_lip_i_ampa=init_connection(self.go_input, self.right_lip.i_group, 'g_ampa_g', self.params.w_ampa_min,
                self.params.w_ampa_max, self.params.p_g_i, delay=5*ms)
            go_left_lip_e_ampa=init_connection(self.go_input, self.left_lip.e_group, 'g_ampa_g', self.params.w_ampa_min,
                self.params.w_ampa_max, self.params.p_g_e, delay=5*ms)
            go_right_lip_e_ampa=init_connection(self.go_input, self.right_lip.e_group, 'g_ampa_g', self.params.w_ampa_min,
                self.params.w_ampa_max, self.params.p_g_e, delay=5*ms)
            self.connections.append(go_left_lip_i_ampa)
            self.connections.append(go_right_lip_i_ampa)
            self.connections.append(go_left_lip_e_ampa)
            self.connections.append(go_right_lip_e_ampa)
Exemplo n.º 12
0
    def __init__(self, clock, params=zheng_params, network=None):
        eqs = Equations(
            '''
        G_total                                                       : siemens
        G_total_exc                                                   : siemens
        ds/dt=eta*(G_total-G_base)/G_base-s/tau_s-(f_in-1.0)/tau_f    : 1
        df_in/dt=s/second                                             : 1.0
        dv/dt=1/tau_o*(f_in-f_out)                                    : 1
        f_out=v**(1.0/alpha)                                          : 1
        do_e/dt=1.0/(phi/f_in)*(-o_e+(1.0-g)*(1.0-(1.0-e_base/(1.0-g_0))**(1.0/f_in))) : %.4f
        dcb/dt=1.0/(phi/f_in)*(-cb-(c_ab*o_e)/oe_log+c_ab*g)  : 1
        oe_log                            : 1
        cmr_o=(cb-g*c_ab)/(cb_0-g_0*c_ab) : 1
        dg/dt=1.0/(j*v_ratio*((r*transitTime)/e_base))*((cmr_o-1.0)-k*s)  : %.4f
        dq/dt=1/tau_o*((f_in*o_e/e_base)-f_out*q/v)                   : 1
        y=v_0*((k1+k2)*(1-q)-(k2+k3)*(1-v))                        : 1
        G_base                                                        : siemens
        eta                                                           : 1/second
        tau_s                                                         : second
        tau_f                                                         : second
        alpha                                                         : 1
        tau_o                                                         : second
        v_0                                                           : 1
        k1                                                            : 1
        k2                                                            : 1
        k3                                                            : 1
        phi                                                           : %.4f*second
        e_base                                                        : %.4f
        g_0                                                           : %.4f
        c_ab                                                          : 1
        cb_0                                                          : 1
        v_ratio                                                       : 1
        j                                                             : 1
        transitTime                                                   : second
        k                                                             : 1
        r                                                             : 1
        ''' %
            (params.e_base, params.g_0, params.phi, params.e_base, params.g_0))
        NeuronGroup.__init__(self,
                             1,
                             model=eqs,
                             clock=clock,
                             compile=True,
                             freeze=True)

        self.params = params
        self.G_base = params.G_base
        self.eta = params.eta
        self.tau_s = params.tau_s
        self.tau_f = params.tau_f
        self.alpha = params.alpha
        self.tau_o = params.tau_o
        self.e_base = params.e_base
        self.v_0 = params.v_0
        self.k1 = params.k1
        self.params.s_e = params.s_e_0 * exp(-params.TE / params.T_2E)
        self.params.s_i = params.s_i_0 * exp(-params.TE / params.T_2I)
        self.params.beta = self.params.s_e / self.params.s_i
        self.k2 = self.params.beta * params.r_0 * self.e_base * params.TE
        self.k3 = self.params.beta - 1.0
        self.c_ab = self.params.c_ab
        self.cb_0 = self.params.cb_0
        self.g_0 = self.params.g_0
        self.phi = self.params.phi
        self.v_ratio = self.params.v_ratio
        self.j = self.params.j
        self.transitTime = self.params.transitTime
        self.k = self.params.k
        self.r = self.params.r

        self.f_in = 1.0
        self.s = 0.0
        self.v = 1.0
        self.o_e = self.e_base
        self.cb = self.cb_0
        self.g = self.g_0
        self.oe_log = np.log(1.0 - self.o_e / (1.0 - self.g))

        self.q = 1.0

        if network is not None:
            self.G_total = linked_var(network, 'g_syn', func=sum)
            self.G_total_exc = linked_var(network, 'g_syn_exc', func=sum)