spatial_network_setup.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import numpy as np
  2. import brian2 as br
  3. from brian2.units import *
  4. def ex_in_network(N_E, N_I, excitatory_eqs, excitatory_params, interneuron_eqs, interneuron_params, interneuron_options,
  5. ei_synapse_model, ei_synapse_on_pre, ei_synapse_param, ex_in_weights, ie_synapse_model,
  6. ie_synapse_on_pre, ie_synapse_param, in_ex_weights, random_seed, dt=None):
  7. # TODO: Check if this does anything
  8. if random_seed is not None:
  9. np.random.seed(random_seed)
  10. if dt is None:
  11. dt = 0.1 * br.ms
  12. br.defaultclock = dt
  13. '''
  14. Excitatory neurons
  15. '''
  16. excitatory_neurons = br.NeuronGroup(N_E, excitatory_eqs, namespace=excitatory_params,
  17. threshold='v>0*mV', refractory='v>0*mV', method='exponential_euler',
  18. name="excitatory_neurons")
  19. excitatory_neurons.v = excitatory_params["El"] * np.random.normal(1, 0.1, N_E)
  20. excitatory_spike_monitor = br.SpikeMonitor(excitatory_neurons, name="excitatory_spike_monitor")
  21. recorded_excitatory_neuron_idx = int(N_E / 2)
  22. excitatory_trace_recorder = br.StateMonitor(excitatory_neurons, 'v', record=[recorded_excitatory_neuron_idx],
  23. name="excitatory_trace_recorder")
  24. '''
  25. Inhibitory neurons
  26. '''
  27. inhibitory_neurons = br.NeuronGroup(N_I, interneuron_eqs, namespace=interneuron_params, name="interneurons",
  28. **interneuron_options)
  29. inhibitory_neurons.v = interneuron_params["u_ext_const"]
  30. recorded_interneuron_idx = int(N_I / 2)
  31. inhibitory_trace_recorder = br.StateMonitor(inhibitory_neurons, 'v', record=[recorded_interneuron_idx],
  32. name="inhibitory_trace_recorder")
  33. inhibitory_spike_monitor = br.SpikeMonitor(inhibitory_neurons, name="inhibitory_spike_monitor")
  34. '''
  35. Connectivities
  36. '''
  37. ei_synapses = br.Synapses(source=excitatory_neurons, target=inhibitory_neurons, model=ei_synapse_model,
  38. on_pre=ei_synapse_on_pre, namespace=ei_synapse_param, name="ei_synapses")
  39. ei_synapses.connect()
  40. ex_indices, in_indices = ex_in_weights.nonzero()
  41. for ex_idx, in_idx in zip(ex_indices, in_indices):
  42. ei_synapses.synaptic_strength[ex_idx, in_idx] = ex_in_weights[ex_idx, in_idx]
  43. ie_synapses = br.Synapses(source=inhibitory_neurons, target=excitatory_neurons, model=ie_synapse_model,
  44. on_pre=ie_synapse_on_pre, namespace=ie_synapse_param, name="ie_synapses")
  45. ie_synapses.connect()
  46. in_indices, ex_indices = in_ex_weights.nonzero()
  47. for in_idx, ex_idx in zip(in_indices, ex_indices):
  48. ie_synapses.synaptic_strength[in_idx, ex_idx] = in_ex_weights[in_idx, ex_idx]
  49. '''
  50. Net
  51. '''
  52. net = br.Network(excitatory_neurons)
  53. net.add(inhibitory_neurons)
  54. net.add(ei_synapses)
  55. net.add(ie_synapses)
  56. net.add(excitatory_spike_monitor)
  57. net.add(excitatory_trace_recorder)
  58. net.add(inhibitory_spike_monitor)
  59. net.add(inhibitory_trace_recorder)
  60. net.store()
  61. return net
  62. def get_head_direction_input(peak_phase, phase_dispersion):
  63. """
  64. Returns function that provides drive depending on an array of preferred direction assuming that the input is
  65. distributed as a
  66. von
  67. Mises (
  68. Gaussian on a ring) distribution with a peak phase and an uncertainty given by the phase dispersion. Normalized
  69. to one at the peak phase.
  70. :param peak_phase:
  71. :param phase_dispersion:
  72. :return: head_direction_input
  73. """
  74. def head_direction_input(direction_preference):
  75. head_direction_input_shape = np.exp(
  76. phase_dispersion * np.cos(direction_preference - peak_phase)) / np.exp(phase_dispersion)
  77. return head_direction_input_shape
  78. return head_direction_input
  79. def create_head_direction_input(ex_input_baseline, ex_tunings, phase_dispersion, max_head_direction_input_amplitude,
  80. tuning_center):
  81. peak_phase = tuning_center
  82. direction_input = get_head_direction_input(peak_phase, phase_dispersion)
  83. input_to_excitatory_population = ex_input_baseline + max_head_direction_input_amplitude * direction_input(
  84. np.array(ex_tunings))
  85. return input_to_excitatory_population
  86. def get_synaptic_weights(N_E, N_I, ie_connections, excitatory_synapse_strength, inhibitory_synapse_strength):
  87. in_ex_weights = np.zeros((N_I, N_E)) * nS
  88. for interneuron_idx, connected_excitatory_idxs in enumerate(ie_connections):
  89. in_ex_weights[interneuron_idx, connected_excitatory_idxs] = inhibitory_synapse_strength
  90. ex_in_weights = np.where(in_ex_weights > 0 * nS, excitatory_synapse_strength, 0 * mV).T * volt
  91. return ex_in_weights, in_ex_weights