analysis_spatio_temporal_activity.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. '''
  2. Spatio-temporal animation
  3. '''
  4. from brian2 import ms
  5. from matplotlib.animation import FuncAnimation
  6. import numpy as np
  7. import matplotlib.pyplot as plt
  8. def create_neural_sheet_animation(times, activities, frame_rate=25):
  9. """
  10. :param times: array of time points
  11. :param activtivies: 3d array of spiking activity from zero no spike to one very recent spike with shape(#neuros,
  12. #neurons,
  13. time)
  14. :param frame_rate: in hertz
  15. :return: animation
  16. """
  17. number_of_frames = times.shape[0]
  18. fig, ax = plt.subplots(1,1)
  19. image = ax.imshow(activities[:,:,0], vmin=0, vmax=1, cmap="gray")
  20. timer = ax.set_title("t={:10.1f}ms".format(times[0]))
  21. def animate(frame):
  22. image.set_array(activities[:,:,frame])
  23. timer.set_text("t={:10.1f}ms".format(times[frame]))
  24. return image
  25. animation = FuncAnimation(fig, animate, number_of_frames, interval=1000/frame_rate)
  26. return animation
  27. #number_of_excitatory_neurons_per_row = 30
  28. #times = np.arange(0, 10, 0.5)
  29. #activities = np.random.choice(np.array([0,1]),(number_of_excitatory_neurons_per_row,
  30. # number_of_excitatory_neurons_per_row,
  31. # times.shape[0]))
  32. #animation = create_neural_sheet_animation(times, activities)
  33. #plt.show()
  34. #animation.save("out_2dgrid.mp4", dpi=number_of_excitatory_neurons_per_row, writer='imagemagick')
  35. def transform_spike_train_in_activity_array(spike_trains, dt_binning, length, activity_decay_time_constant):
  36. times = np.arange(0, length / ms, dt_binning / ms) * ms
  37. number_of_neurons = len(spike_trains)
  38. number_of_neurons_per_row = int(np.sqrt(number_of_neurons))
  39. spike_activities = [transform_spike_times_to_activity(spike_times, dt_binning, length,
  40. activity_decay_time_constant)
  41. for spike_times in spike_trains]
  42. spike_activities = np.reshape(np.array(spike_activities), (number_of_neurons_per_row,
  43. number_of_neurons_per_row,-1))
  44. return times, spike_activities
  45. def transform_spike_times_to_activity(spike_times, dt_binning, length, activity_decay_time_constant):
  46. kernel_times = np.arange(0, 4 * activity_decay_time_constant / ms, dt_binning / ms) * ms
  47. activity_kernel = np.exp(-kernel_times / activity_decay_time_constant)
  48. number_of_bins = int(length/dt_binning)+1
  49. indices_with_a_spike = np.floor(spike_times / dt_binning).astype(int)
  50. spike_train_in_binary_form = np.zeros((number_of_bins,))
  51. spike_train_in_binary_form[indices_with_a_spike] = 1
  52. spike_activity = np.convolve(spike_train_in_binary_form, activity_kernel, mode='same')
  53. return spike_activity