analyse_hdi_optimization_orientation_map.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import numpy as np
  2. from brian2.units import *
  3. from pypet import Environment, cartesian_product, Trajectory
  4. from pypet.brian2.parameter import Brian2MonitorResult
  5. from scipy.optimize import differential_evolution
  6. import matplotlib.pyplot as plt
  7. from scripts.interneuron_placement import create_grid_of_excitatory_neurons, \
  8. create_interneuron_sheet_entropy_max_orientation, get_excitatory_neurons_in_inhibitory_axonal_clouds, Pickle, \
  9. plot_neural_sheet, get_position_mesh
  10. from scripts.ring_network.head_direction import ex_in_network
  11. from scripts.spatial_maps.orientation_map import OrientationMap
  12. from scripts.spatial_maps.orientation_map_generator_pypet import TRAJ_NAME_ORIENTATION_MAPS
  13. from scripts.spatial_network.head_direction_index_over_noise_scale import excitatory_eqs, excitatory_params, \
  14. lif_interneuron_eqs, lif_interneuron_params, lif_interneuron_options, ei_synapse_model, ei_synapse_on_pre, \
  15. ei_synapse_param, ie_synapse_model, ie_synapse_on_pre, ie_synapse_param, get_synaptic_weights, \
  16. create_head_direction_input, calculate_rates
  17. from scripts.spatial_network.run_entropy_maximisation_orientation_map import get_orientation_map
  18. DATA_FOLDER = "../../data/"
  19. LOG_FOLDER = "../../logs/"
  20. TRAJ_NAME = "hdi_maximisation_by_differential_evolution"
  21. def plot_and_save_sheet(ex_positions, ex_tunings, interneuron_positions, interneuron_orientations, mean_hdi, a, b, label):
  22. axonal_clouds = [Pickle(x, y, a, b, phi)
  23. for x, y, phi in zip(*zip(*interneuron_positions), interneuron_orientations)]
  24. X, Y = get_position_mesh(ex_positions)
  25. n_ex = int(np.sqrt(len(ex_positions)))
  26. head_dir_preference = np.array(ex_tunings).reshape((n_ex, n_ex))
  27. fig = plt.figure()
  28. ax = fig.add_subplot(111)
  29. plt.set_cmap('twilight')
  30. c = ax.pcolor(X, Y, head_dir_preference.T, vmin=-np.pi, vmax=np.pi)
  31. fig.colorbar(c, ax=ax, label="Tuning")
  32. if axonal_clouds is not None:
  33. for i, p in enumerate(axonal_clouds):
  34. ell = p.get_ellipse()
  35. ax.add_artist(ell)
  36. plt.title('Mean HDI: {}'.format(mean_hdi))
  37. plt.savefig(DATA_FOLDER + 'optimization_figure_' + label + '.png')
  38. def optimize_interneuron_orientation_by_hdi(traj):
  39. sheet_size = traj.orientation_map.sheet_size
  40. N_E = traj.network.N_E
  41. N_I = traj.network.N_I
  42. orientation_map = get_orientation_map(traj.orientation_map.correlation_length, traj.orientation_map.seed,
  43. sheet_size, N_E)
  44. ex_positions, ex_tunings = create_grid_of_excitatory_neurons(sheet_size,
  45. sheet_size,
  46. int(np.sqrt(N_E)), orientation_map)
  47. inhibitory_axon_long_axis = traj.morphology.long_axis
  48. inhibitory_axon_short_axis = traj.morphology.short_axis
  49. # Einmal die Entropy Maximierung
  50. inhibitory_axonal_clouds, _ = create_interneuron_sheet_entropy_max_orientation(
  51. ex_positions, ex_tunings, N_I, inhibitory_axon_long_axis,
  52. inhibitory_axon_short_axis, sheet_size,
  53. sheet_size, trial_orientations=30)
  54. initial_interneuron_orientations = [p.phi for p in inhibitory_axonal_clouds]
  55. interneuron_positions = [(p.x, p.y) for p in inhibitory_axonal_clouds]
  56. interneuron_orientation_bounds = [(-np.pi,np.pi) for x in interneuron_positions]
  57. mean_hdi = 1. - spatial_network_hdi_by_orientations(initial_interneuron_orientations, interneuron_positions, ex_positions, ex_tunings, traj)
  58. plot_and_save_sheet(ex_positions, ex_tunings, interneuron_positions, initial_interneuron_orientations, mean_hdi, inhibitory_axon_long_axis, inhibitory_axon_short_axis, 'before')
  59. # Und dann die optimierte Variante
  60. axon_cloud_save_array = np.load(DATA_FOLDER + 'current_cloud_save_array.npy')
  61. interneuron_positions = [(p[0], p[1]) for p in axon_cloud_save_array]
  62. initial_interneuron_orientations = [p[2] for p in axon_cloud_save_array]
  63. mean_hdi = 1. - spatial_network_hdi_by_orientations(initial_interneuron_orientations, interneuron_positions, ex_positions, ex_tunings, traj)
  64. plot_and_save_sheet(ex_positions, ex_tunings, interneuron_positions, initial_interneuron_orientations, mean_hdi, inhibitory_axon_long_axis, inhibitory_axon_short_axis, 'before')
  65. plt.show()
  66. def spatial_network_hdi_by_orientations(interneuron_orientations, interneuron_positions, ex_positions, ex_tunings, traj):
  67. N_E = traj.network.N_E
  68. N_I = traj.network.N_I
  69. inhibitory_axon_long_axis = traj.morphology.long_axis
  70. inhibitory_axon_short_axis = traj.morphology.short_axis
  71. inhibitory_axonal_clouds = [Pickle(x, y, inhibitory_axon_long_axis, inhibitory_axon_short_axis, phi)
  72. for x, y, phi in zip(*zip(*interneuron_positions), interneuron_orientations)]
  73. ie_connections = get_excitatory_neurons_in_inhibitory_axonal_clouds(ex_positions, inhibitory_axonal_clouds)
  74. inhibitory_synapse_strength = traj.synapse.inhibitory * nS
  75. excitatory_synapse_strength = traj.synapse.excitatory * mV
  76. ex_in_weights, in_ex_weights = get_synaptic_weights(N_E, N_I, ie_connections, excitatory_synapse_strength,
  77. inhibitory_synapse_strength)
  78. sharpness = 1.0 / (traj.input.width) ** 2
  79. directions = np.linspace(-np.pi, np.pi, traj.input.number_of_directions, endpoint=False)
  80. firing_rate_array = np.ndarray((traj.N_E, traj.input.number_of_directions))
  81. net = ex_in_network(N_E, N_I, excitatory_eqs, excitatory_params, lif_interneuron_eqs,
  82. lif_interneuron_params,
  83. lif_interneuron_options, ei_synapse_model, ei_synapse_on_pre,
  84. ei_synapse_param,
  85. ex_in_weights, ie_synapse_model, ie_synapse_on_pre,
  86. ie_synapse_param, in_ex_weights, random_seed=2)
  87. for dir_idx, dir in enumerate(directions):
  88. # We recreate the network here for every dir, which slows down the simulation quite considerably. Otherwise,
  89. # we get a problem with saving and restoring the spike times (0s spike for neuron 0)
  90. input_to_excitatory_population = create_head_direction_input(traj.input.baseline * nA, ex_tunings,
  91. sharpness,
  92. traj.input.amplitude * nA, dir)
  93. excitatory_neurons = net["excitatory_neurons"]
  94. excitatory_neurons.I = input_to_excitatory_population
  95. net.run(traj.simulation.duration * ms)
  96. exc_spike_mon = net["excitatory_spike_monitor"]
  97. ex_spike_trains = exc_spike_mon.spike_trains()
  98. ex_spike_rates = calculate_rates(ex_spike_trains.values())
  99. for n_idx, spike_rate in enumerate(ex_spike_rates):
  100. firing_rate_array[n_idx, dir_idx] = spike_rate
  101. #TODO: Get head direction indices
  102. tuning_vectors = np.zeros((N_E, traj.input.number_of_directions, 2))
  103. for ex_id, ex_rates in enumerate(firing_rate_array):
  104. rate_sum = 0.
  105. for dir_id, dir in enumerate(directions):
  106. tuning_vectors[ex_id, dir_id] = np.array([np.cos(dir), np.sin(dir)]) * ex_rates[dir_id]
  107. rate_sum += ex_rates[dir_id]
  108. if rate_sum != 0.:
  109. tuning_vectors[ex_id, :, :] /= rate_sum
  110. tuning_vectors_summed = np.sum(tuning_vectors, axis=1)
  111. head_direction_indices = np.array([np.linalg.norm(v) for v in tuning_vectors_summed])
  112. mean_hdi = np.mean(head_direction_indices)
  113. return 1. - mean_hdi
  114. if __name__ == "__main__":
  115. print(np.linspace(0.0, 400.0, 30).tolist()[14])
  116. env = Environment(trajectory=TRAJ_NAME,
  117. comment="Compare the head direction tuning for circular and ellipsoid interneuron morphology, "
  118. "when tuning orientations to maximise entropy of connected excitatory tunings.",
  119. multiproc=True, filename=DATA_FOLDER, ncores=3, overwrite_file=True, log_folder=LOG_FOLDER)
  120. traj = env.trajectory
  121. traj.f_add_parameter_group("orientation_map")
  122. traj.f_add_parameter("orientation_map.correlation_length", np.linspace(0.0, 400.0, 30).tolist()[14],
  123. comment="Correlation length of orientations in um")
  124. traj.f_add_parameter("orientation_map.seed", 1, comment="Random seed for map generation.")
  125. traj.f_add_parameter("orientation_map.sheet_size", 450, comment="Sheet size in um")
  126. traj.f_add_parameter_group("network")
  127. traj.f_add_parameter("network.N_E", 900, comment="Number of excitatory neurons")
  128. traj.f_add_parameter("network.N_I", 100, comment="Number of inhibitory neurons")
  129. traj.f_add_parameter_group("synapse")
  130. traj.f_add_parameter("synapse.inhibitory", 30, "Strength of conductance-based inhibitory synapse in nS.")
  131. traj.f_add_parameter("synapse.excitatory", 1, "Strength of conductance-based inhibitory synapse in mV.")
  132. traj.f_add_parameter_group("input")
  133. traj.f_add_parameter("input.width", np.pi / 3.0, comment="Standard deviation of incoming head direction input.")
  134. traj.f_add_parameter("input.baseline", 0.2, comment="Head direction input baseline")
  135. traj.f_add_parameter("input.amplitude", 0.5, comment="Head direction input amplitude")
  136. traj.f_add_parameter("input.number_of_directions", 12, comment="Number of probed directions")
  137. traj.f_add_parameter_group("morphology")
  138. traj.f_add_parameter("morphology.long_axis", 100.0, comment="Long axis of axon ellipsoid")
  139. traj.f_add_parameter("morphology.short_axis", 25.0, comment="Short axis of axon ellipsoid")
  140. traj.f_add_parameter_group("simulation")
  141. traj.f_add_parameter("simulation.entropy_maximisation.steps", 30, comment="Steps for entropy maximisation")
  142. traj.f_add_parameter("simulation.dt", 0.1, comment="Network simulation time step in ms")
  143. traj.f_add_parameter("simulation.duration", 1000, comment="Network simulation duration in ms")
  144. optimize_interneuron_orientation_by_hdi(traj)