 # Description of problem

I have created a spiking neural network model with an input layer of Poisson neurons and four layers of conductance-based LIF neurons. I am experiencing issues with refractory period: when I run a simulation, some neurons are firing more frequently than the refractory period should allow.

# Minimal code to reproduce problem

``````V_th = -53*mV
V_r = -90*mV
tau_r = 5*ms
E_l = -74*mV           # leak reversal potential
g_l = 100*nS            # leak conductance
E_e = -20*mV           # excitatory synaptic reversal potential
E_i = -100*mV          # inhibitory synaptic reversal potential
C_m = 0.5*nF           # membrane capacitance

LIF_neurons='''
dv/dt = (g_l*(E_l-v) + g_e*(E_e-v) + g_i*(E_i-v))/C_m    : volt (unless refractory) # membrane potential
dg_e/dt = -g_e/tau_e                                     : siemens  # post-synaptic exc. conductance
dg_i/dt = -g_i/tau_i                                     : siemens  # post-synaptic inh. conductance
'''

self.L1 = NeuronGroup(N_LIF_exc + N_LIF_inh, LIF_neurons, threshold='v > V_th', reset='v = V_r', refractory='tau_r', method='euler')
``````

g_e or g_i are incremented upon the arrival of a spike from an excitatory or inhibitory neuron, respectively.

# What you have aready tried

• Defining refractory period in same way as above without passing as a string: refractory=5*ms
• Defining refractory period as state variable and then setting it like: L1.refractory = 5*ms
• Defining refractory period like this: refractory=’(t - lastspike) <= 5*ms’
• Defining refractory period like this: refractory='timestep(t - lastspike, dt) <= timestep(5*ms, dt)
• Defining refractory period using the voltage threshold this: refractory=‘v >= -53*mV’
• Specifying ‘(unless refractory)’ after equations for excitatory and inhibitory conductance

# Expected output (if relevant)

The maximum frequency a neuron could fire would be limited by refractory period (max every 5ms in this case)

# Actual output (if relevant)

Some neurons are firing every integration time-step (0.1ms)

# Full traceback of error (if relevant)

This looks like it ought to work and it’s a very straightforward example so I’m a bit confused. I can see two things that might be relevant.

1. Something to do with the `self.L1 = ...`. You have to be a little bit careful about namespaces when you’re attaching objects to a class. Can you reproduce the same problem when it’s not part of a class?
2. You said that ge and gi are being incremented when there’s an incoming spike, but that’s correct for the code you’ve written because it’s only v that has `(unless refractory)` added. Can you confirm that ge and gi are being incremented if you add `(unless refractory)` after them?
1 Like

Thanks for your reply. I think it was a namespace issue after all - I hadn’t added tau_r to the dictionary of parameters I was passing in as the namespace argument of the run() function when running a simulation - silly mistake!

1 Like