Network and Simulation Issues

@mstimberg, I would be interested in collaborating with you and turning this story into a blog post. (and getting this example uploaded to the Brian2 examples guide). Your NMDA code works, but the model only displays the integration behavior when the stimulus coherence is geq 0.3 (screenshot from coherence=0.3)


When the stimulus coherence is zero, the integration population rate traces look like this.

Wimmer’s traces for 0% coherence on ModelDB is below

In addition, I took another look at Wimmer’s paper and found the following line that details the initial conditions for both the sensory and integration populations.

Range of initial uniform distribution of membrane potentials [-48mV, -50mV]
I am not sure exactly what this line means as my initial read was that the distribution of initial membrane voltages was a uniform distribution on [-48mV, -50mV], but that implies that every single neuron spikes at t=0 as -50mV is the spike threshold.
Initial conditions code below (now fixed to be in Brian2 syntax)

# ---- set initial conditions (random)
    #decisionE.gen = decisionE.gen * (1 + 0.2 * rand(decisionE.__len__()))
    #decisionI.gen = decisionI.gen * (1 + 0.2 * rand(decisionI.__len__()))
    decisionE.gen='1+0.2*rand()' #Syntax stuff 
    decisionI.gen='1+0.2*rand()'
    #decisionE.V = decisionE.V + rand(decisionE.__len__()) * 2 * mV
    #decisionI.V = decisionI.V + rand(decisionI.__len__()) * 2 * mV #Removes the 'all neurons spike at t=0' problem
    decisionE.V='-52*mV + rand()*2*mV'
    decisionI.V='-52*mV + rand()*2*mV'

    # ---- set initial conditions (random)
    #sensoryE.V = -50.0 * mV - 2 * mV + rand(sensoryE.__len__()) * 2 * mV
    #sensoryI.V = -50.0 * mV - 2 * mV + rand(sensoryI.__len__()) * 2 * mV
    sensoryE.V ='-52*mV+rand()*2*mV'
    sensoryI.V ='-52*mV+rand()*2*mV'
    #sensoryE.gea = 0.05 * (1 + rand(sensoryE.__len__()) * 0.2)
    #sensoryI.gea = 0.05 * (1 + rand(sensoryI.__len__()) * 0.2)
    sensoryE.gea='0.05*(1+0.2*rand())'
    sensoryI.gea='0.05*(1+0.2*rand())'


This is the trace that occurs when the initial voltage of all the integration circuit neurons is accidentally set to 0mV, which also doesn’t match the ModelDB trace.

Is there a difference in the order a simulation runs in from Brian to Brian2? I think that was mentioned earlier in the reproducibility section.

Also, after looking at the traces, the blue trace (decisionE2) seems to match Wimmer’s trace and the red trace (decisionE1) doesn’t.

I wouldn’t worry about the initial values, as you show they don’t make a difference for the main result. The reason for the difference you are seeing at 0 coherence might be related to the differences in the connections or in the response of the inhibitory neurons. But I am not seeing anything obviously wrong in your code, and I don’t think the detailed order of operations should matter here. Could you somehow share your code with me or upload it to a place like github so that I could try it out and investigate in more detail? Feel free to contact me via a direct message if you prefer.

I just sent you a PM with all of my code in github. I hope it works.

1 Like