analyse_entropy_maximisation_orientation_map.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import numpy as np
  2. from brian2.units import Hz
  3. from pypet import Trajectory
  4. from pypet.brian2 import Brian2MonitorResult, Brian2Result
  5. from scripts.spatial_network.head_direction_index_over_noise_scale import calculate_rates
  6. from scripts.spatial_network.run_entropy_maximisation_orientation_map import DATA_FOLDER, TRAJ_NAME
  7. n_exc_test_print = 465
  8. def get_spike_train_dictionary(number_of_neurons, spike_times, neuron_indices):
  9. spike_train_dict = {}
  10. for neuron_idx in range(number_of_neurons):
  11. spike_train_dict[neuron_idx] = []
  12. for neuron_idx, t in zip(neuron_indices, spike_times):
  13. spike_train_dict[neuron_idx].append(t)
  14. return spike_train_dict
  15. def get_firing_rate_dict_per_cell_and_direction(traj, run_name):
  16. traj.f_set_crun(run_name)
  17. firing_rate_dict = {}
  18. direction_names = ["dir{:d}".format(idx) for idx in range(traj.input.number_of_directions)]
  19. for idx in range(traj.N_E):
  20. firing_rate_dict[idx] = []
  21. for direction in direction_names:
  22. number_of_neurons = traj.N_E
  23. all_spike_times = traj.results.runs[run_name][direction].spikes.e.t
  24. neuron_indices = traj.results.runs[run_name][direction].spikes.e.i
  25. ex_spike_trains = get_spike_train_dictionary(number_of_neurons, all_spike_times,
  26. neuron_indices)
  27. # print(ex_spike_trains)
  28. # print(ex_spike_trains[n_exc_test_print])
  29. ex_spike_rates = calculate_rates(ex_spike_trains.values())
  30. for idx, spike_rate in enumerate(ex_spike_rates):
  31. firing_rate_dict[idx].append(spike_rate)
  32. traj.f_restore_default()
  33. return firing_rate_dict
  34. def get_firing_rate_array_per_cell_and_direction(traj, run_name):
  35. traj.f_set_crun(run_name)
  36. firing_rate_array = np.ndarray((traj.N_E, traj.input.number_of_directions))
  37. direction_names = ["dir{:d}".format(idx) for idx in range(traj.input.number_of_directions)]
  38. for dir_idx, direction in enumerate(direction_names):
  39. number_of_neurons = traj.N_E
  40. all_spike_times = traj.results.runs[run_name][direction].spikes.e.t
  41. neuron_indices = traj.results.runs[run_name][direction].spikes.e.i
  42. ex_spike_trains = get_spike_train_dictionary(number_of_neurons, all_spike_times,
  43. neuron_indices)
  44. ex_spike_rates = calculate_rates(ex_spike_trains.values())
  45. for n_idx, spike_rate in enumerate(ex_spike_rates):
  46. #TODO: Why on earth does the unit vanish?
  47. firing_rate_array[n_idx, dir_idx] = spike_rate
  48. traj.f_restore_default()
  49. return firing_rate_array
  50. def get_head_direction_indices(directions, firing_rate_array):
  51. n_exc_neurons = firing_rate_array.shape[0]
  52. n_directions = len(directions)
  53. tuning_vectors = np.zeros((n_exc_neurons,n_directions,2))
  54. # print('before:\n', tuning_vectors[9,:,:])
  55. for ex_id, ex_rates in enumerate(firing_rate_array):
  56. rate_sum = 0.
  57. for dir_id, dir in enumerate(directions):
  58. tuning_vectors[ex_id, dir_id] = np.array([np.cos(dir), np.sin(dir)]) * ex_rates[dir_id]
  59. rate_sum += ex_rates[dir_id]
  60. # if ex_id == 9:
  61. # print(np.array([np.cos(dir), np.sin(dir)]) * ex_rates[dir_id])
  62. if rate_sum != 0.:
  63. tuning_vectors[ex_id, :, :] /= rate_sum
  64. # print('after:\n', tuning_vectors[9, :, :])
  65. tuning_vectors_summed = np.sum(tuning_vectors, axis=1)
  66. # print(tuning_vectors_summed.shape)
  67. head_direction_indices = np.array([np.linalg.norm(v) for v in tuning_vectors_summed])
  68. # print(head_direction_indices)
  69. return head_direction_indices
  70. def get_runs_with_circular_morphology(traj):
  71. filtered_indices = traj.f_find_idx(('parameters.long_axis', 'parameters.short_axis'), lambda r1, r2: r1 == r2)
  72. return filtered_indices
  73. if __name__ == "__main__":
  74. traj = Trajectory(TRAJ_NAME, add_time=False, dynamic_imports=Brian2MonitorResult)
  75. NO_LOADING = 0
  76. FULL_LOAD = 2
  77. # TODO: Why no loading of results? Because of dynamic loading?
  78. traj.f_load(filename=DATA_FOLDER + TRAJ_NAME + ".hdf5", load_parameters=FULL_LOAD, load_results=NO_LOADING)
  79. traj.v_auto_load = True
  80. correlation_lengths = traj.f_get('correlation_length').f_get_range()
  81. long_axis = traj.f_get('long_axis').f_get_range()
  82. short_axis = traj.f_get('short_axis').f_get_range()
  83. # TODO: Again, maybe directions as parameters
  84. directions = np.linspace(-np.pi, np.pi, traj.input.number_of_directions)
  85. circular_indices = list(get_runs_with_circular_morphology(traj))
  86. for idx, run_name in enumerate(traj.f_get_run_names()):
  87. firing_rate_array = get_firing_rate_array_per_cell_and_direction(traj, run_name)
  88. firing_rate_dict = get_firing_rate_dict_per_cell_and_direction(traj, run_name)
  89. traj.f_set_crun(run_name)
  90. print(firing_rate_array)
  91. print(firing_rate_dict)
  92. traj.f_add_result('runs.$.firing_rate_array', firing_rate_array,
  93. comment='The firing rates of the excitatory population')
  94. print('Firing rate at neuron {}: \n'.format(n_exc_test_print),firing_rate_array[n_exc_test_print])
  95. head_direction_indices = get_head_direction_indices(directions, firing_rate_array)
  96. traj.f_add_result('runs.$.head_direction_indices', head_direction_indices,
  97. comment='The HDIs of the excitatory population')
  98. print("Circle" if idx in circular_indices else "Ellipsoid" )
  99. print("Corr length {:.1f}".format(traj.orientation_map.correlation_length))
  100. print("Long axis {:.1f}".format(traj.long_axis))
  101. print("Mean HDI {:.1f}".format(np.mean(head_direction_indices)))
  102. traj.f_restore_default()
  103. traj.f_store()