123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- import numpy as np
- import brian2 as br
- from brian2.units import *
- def ex_in_network(N_E, N_I, excitatory_eqs, excitatory_params, interneuron_eqs, interneuron_params, interneuron_options,
- ei_synapse_model, ei_synapse_on_pre, ei_synapse_param, ex_in_weights, ie_synapse_model,
- ie_synapse_on_pre, ie_synapse_param, in_ex_weights, random_seed, dt=None):
- # TODO: Check if this does anything
- if random_seed is not None:
- np.random.seed(random_seed)
- if dt is None:
- dt = 0.1 * br.ms
- br.defaultclock = dt
- '''
- Excitatory neurons
- '''
- excitatory_neurons = br.NeuronGroup(N_E, excitatory_eqs, namespace=excitatory_params,
- threshold='v>0*mV', refractory='v>0*mV', method='exponential_euler',
- name="excitatory_neurons")
- excitatory_neurons.v = excitatory_params["El"] * np.random.normal(1, 0.1, N_E)
- excitatory_spike_monitor = br.SpikeMonitor(excitatory_neurons, name="excitatory_spike_monitor")
- recorded_excitatory_neuron_idx = int(N_E / 2)
- excitatory_trace_recorder = br.StateMonitor(excitatory_neurons, 'v', record=[recorded_excitatory_neuron_idx],
- name="excitatory_trace_recorder")
- '''
- Inhibitory neurons
- '''
- inhibitory_neurons = br.NeuronGroup(N_I, interneuron_eqs, namespace=interneuron_params, name="interneurons",
- **interneuron_options)
- inhibitory_neurons.v = interneuron_params["u_ext_const"]
- recorded_interneuron_idx = int(N_I / 2)
- inhibitory_trace_recorder = br.StateMonitor(inhibitory_neurons, 'v', record=[recorded_interneuron_idx],
- name="inhibitory_trace_recorder")
- inhibitory_spike_monitor = br.SpikeMonitor(inhibitory_neurons, name="inhibitory_spike_monitor")
- '''
- Connectivities
- '''
- ei_synapses = br.Synapses(source=excitatory_neurons, target=inhibitory_neurons, model=ei_synapse_model,
- on_pre=ei_synapse_on_pre, namespace=ei_synapse_param, name="ei_synapses")
- ei_synapses.connect()
- ex_indices, in_indices = ex_in_weights.nonzero()
- for ex_idx, in_idx in zip(ex_indices, in_indices):
- ei_synapses.synaptic_strength[ex_idx, in_idx] = ex_in_weights[ex_idx, in_idx]
- ie_synapses = br.Synapses(source=inhibitory_neurons, target=excitatory_neurons, model=ie_synapse_model,
- on_pre=ie_synapse_on_pre, namespace=ie_synapse_param, name="ie_synapses")
- ie_synapses.connect()
- in_indices, ex_indices = in_ex_weights.nonzero()
- for in_idx, ex_idx in zip(in_indices, ex_indices):
- ie_synapses.synaptic_strength[in_idx, ex_idx] = in_ex_weights[in_idx, ex_idx]
- '''
- Net
- '''
- net = br.Network(excitatory_neurons)
- net.add(inhibitory_neurons)
- net.add(ei_synapses)
- net.add(ie_synapses)
- net.add(excitatory_spike_monitor)
- net.add(excitatory_trace_recorder)
- net.add(inhibitory_spike_monitor)
- net.add(inhibitory_trace_recorder)
- net.store()
- return net
- def get_head_direction_input(peak_phase, phase_dispersion):
- """
- Returns function that provides drive depending on an array of preferred direction assuming that the input is
- distributed as a
- von
- Mises (
- Gaussian on a ring) distribution with a peak phase and an uncertainty given by the phase dispersion. Normalized
- to one at the peak phase.
- :param peak_phase:
- :param phase_dispersion:
- :return: head_direction_input
- """
- def head_direction_input(direction_preference):
- head_direction_input_shape = np.exp(
- phase_dispersion * np.cos(direction_preference - peak_phase)) / np.exp(phase_dispersion)
- return head_direction_input_shape
- return head_direction_input
- def create_head_direction_input(ex_input_baseline, ex_tunings, phase_dispersion, max_head_direction_input_amplitude,
- tuning_center):
- peak_phase = tuning_center
- direction_input = get_head_direction_input(peak_phase, phase_dispersion)
- input_to_excitatory_population = ex_input_baseline + max_head_direction_input_amplitude * direction_input(
- np.array(ex_tunings))
- return input_to_excitatory_population
- def get_synaptic_weights(N_E, N_I, ie_connections, excitatory_synapse_strength, inhibitory_synapse_strength):
- in_ex_weights = np.zeros((N_I, N_E)) * nS
- for interneuron_idx, connected_excitatory_idxs in enumerate(ie_connections):
- in_ex_weights[interneuron_idx, connected_excitatory_idxs] = inhibitory_synapse_strength
- ex_in_weights = np.where(in_ex_weights > 0 * nS, excitatory_synapse_strength, 0 * mV).T * volt
- return ex_in_weights, in_ex_weights
|