run_micro_network.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import json
  2. import numpy
  3. from brian2.units import *
  4. from pypet import Environment, cartesian_product
  5. from pypet.brian2 import Brian2MonitorResult
  6. from scripts import models
  7. from scripts.ring_network.head_direction import ex_in_network
  8. from scripts.spatial_network.head_direction_index_over_noise_scale import calculate_rates
  9. from scripts.spatial_network.run_entropy_maximisation_orientation_map import DATA_FOLDER, LOG_FOLDER
  10. NO_CONNECTIONS = 0
  11. RECIPROCAL = 1
  12. UNI_DIRECTIONAL = 2
  13. TRAJ_NAME = "competition_in_microcircuit"
  14. def run_micro_networks(traj):
  15. N_E = 10
  16. number_of_inhibitory_neurons_per_population = 2
  17. architecture = traj.network.architecture
  18. excitatory_synapse_strength = traj.synapses.ex_in.strength * mV
  19. inhibitory_synapse_strength = traj.synapses.in_ex.strength * nS
  20. baseline = traj.input.baseline * nA
  21. input_to_pop_1 = traj.input.to_1 * nA
  22. input_to_pop_2 = traj.input.to_2 * nA
  23. duration = 500 * ms
  24. excitatory_eqs = models.hodgkin_huxley_eqs_with_synaptic_conductance + '''
  25. ih = 0*amp: amp
  26. ''' # add noise?
  27. excitatory_params = models.hodgkin_huxley_params
  28. excitatory_params.update({
  29. "E_i": -100 * mV
  30. })
  31. inhibitory_eqs = models.lif_eqs
  32. inhibitory_options = models.lif_options
  33. inhibitory_params = models.lif_params
  34. ei_synapse_model = models.delta_synapse_model
  35. ei_synapse_on_pre = models.delta_synapse_on_pre
  36. ei_synapse_param = models.delta_synapse_param
  37. ie_synapse_model = models.exponential_synapse
  38. ie_synapse_on_pre = models.exponential_synapse_on_pre
  39. ie_synapse_param = models.exponential_synapse_params
  40. number_of_excitatory_neurons_per_population = int(N_E / 2.0)
  41. if architecture == NO_CONNECTIONS:
  42. N_I = number_of_inhibitory_neurons_per_population
  43. ex_in_weights = numpy.zeros((N_E, N_I)) * volt
  44. in_ex_weights = numpy.zeros((N_I, N_E)) * siemens
  45. elif architecture == RECIPROCAL:
  46. N_I = number_of_inhibitory_neurons_per_population
  47. ex_in_weights = numpy.ones((N_E, N_I)) * excitatory_synapse_strength
  48. in_ex_weights = numpy.ones((N_I, N_E)) * inhibitory_synapse_strength
  49. elif architecture == UNI_DIRECTIONAL:
  50. N_I = 2 * number_of_inhibitory_neurons_per_population
  51. # each population has its own interneurons which then project to the other population
  52. ex_in_weights = numpy.zeros((N_E, N_I))
  53. ex_in_weights[:number_of_excitatory_neurons_per_population, :number_of_inhibitory_neurons_per_population] = 1
  54. ex_in_weights[number_of_excitatory_neurons_per_population:, number_of_inhibitory_neurons_per_population:] = 1
  55. ex_in_weights = ex_in_weights * excitatory_synapse_strength
  56. in_ex_weights = numpy.zeros((N_I, N_E))
  57. in_ex_weights[:number_of_inhibitory_neurons_per_population, number_of_excitatory_neurons_per_population:] = 1
  58. in_ex_weights[number_of_inhibitory_neurons_per_population:, :number_of_excitatory_neurons_per_population] = 1
  59. in_ex_weights = in_ex_weights * inhibitory_synapse_strength
  60. else:
  61. raise RuntimeError("Specify a valid network architecture.")
  62. net = ex_in_network(N_E, N_I, excitatory_eqs, excitatory_params, inhibitory_eqs,
  63. inhibitory_params, inhibitory_options, ei_synapse_model, ei_synapse_on_pre,
  64. ei_synapse_param,
  65. ex_in_weights, ie_synapse_model, ie_synapse_on_pre,
  66. ie_synapse_param, in_ex_weights, random_seed=4, dt=0.1 * ms)
  67. net["excitatory_neurons"].I[:int(N_E / 2.0)] = baseline + input_to_pop_1
  68. net["excitatory_neurons"].I[int(N_E / 2.0):] = baseline + input_to_pop_2
  69. net.run(duration=duration)
  70. traj.f_add_result(Brian2MonitorResult, 'spikes.e', net["excitatory_spike_monitor"],
  71. comment='The spiketimes of the excitatory population')
  72. traj.f_add_result(Brian2MonitorResult, 'spikes.i', net["inhibitory_spike_monitor"],
  73. comment='The spiketimes of the inhibitory population')
  74. excitatory_firing_rates = calculate_rates(net["excitatory_spike_monitor"].spike_trains().values())
  75. ex1 = numpy.mean(excitatory_firing_rates[:int(N_E / 2.0)])
  76. ex2 = numpy.mean(excitatory_firing_rates[int(N_E / 2.0):])
  77. return ex1, ex2
  78. def add_parameters_to_trajectory(traj, parameter_dict, name_list=[]):
  79. if "value" in parameter_dict.keys():
  80. parameter_name = ".".join(name_list)
  81. traj.f_add_parameter(parameter_name, parameter_dict["value"],
  82. comment=parameter_dict["comment"])
  83. else:
  84. for key in parameter_dict.keys():
  85. add_parameters_to_trajectory(traj, parameter_dict[key], name_list + [key])
  86. def micronetwork_postproc(traj, result_list):
  87. runs = [run for run, rates in result_list]
  88. ex_1 = [rates[0] / hertz for run, rates in result_list]
  89. ex_2 = [rates[1] / hertz for run, rates in result_list]
  90. architectures = traj.par.network.f_get("architecture").f_get_range()
  91. input_1 = traj.par.input.f_get("to_1").f_get_range()
  92. # input_2 = traj.par.input.f_get("to_2").f_get_range()
  93. traj.f_add_result('summary', {"run": runs,
  94. "architecture": architectures,
  95. "f_1": ex_1,
  96. "f_2": ex_2,
  97. "I_1": input_1
  98. })
  99. if __name__ == "__main__":
  100. env = Environment(trajectory=TRAJ_NAME, comment="Compare competition in microcircuits with "
  101. "relay "
  102. "interneurons or hub "
  103. "interneurons", multiproc=True,
  104. filename=DATA_FOLDER,
  105. overwrite_file=True, ncores=3, log_folder=LOG_FOLDER)
  106. traj = env.trajectory
  107. with open("micro_network_parameter_space.json") as f:
  108. parameter_dict = json.load(f)
  109. add_parameters_to_trajectory(traj, parameter_dict)
  110. exploration_dict = {
  111. "network.architecture": [0, 1, 2],
  112. "input.to_1": [float(x) for x in numpy.arange(0.0, 0.7, 0.2)]
  113. }
  114. env.add_postprocessing(micronetwork_postproc)
  115. traj.f_explore(cartesian_product(exploration_dict))
  116. env.run(run_micro_networks)
  117. env.disable_logging()