analyse_micro_network.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import matplotlib.pyplot as plt
  2. import pandas
  3. from pypet import Trajectory
  4. from pypet.brian2 import Brian2MonitorResult
  5. from scripts.competition_gain.run_micro_network import TRAJ_NAME, UNI_DIRECTIONAL, RECIPROCAL, NO_CONNECTIONS
  6. from scripts.spatial_network.run_entropy_maximisation_orientation_map import DATA_FOLDER
  7. if __name__ == "__main__":
  8. traj = Trajectory(TRAJ_NAME, add_time=False, dynamic_imports=Brian2MonitorResult)
  9. traj.f_load(filename=DATA_FOLDER + TRAJ_NAME + ".hdf5", load_parameters=2, load_results=2)
  10. firing_rates_frame = pandas.DataFrame(traj.results.summary)
  11. firing_rates_frame["delta_f"] = firing_rates_frame["f_1"] - firing_rates_frame["f_2"]
  12. fig, ax = plt.subplots(1, 1, figsize=(3, 4))
  13. colors = {NO_CONNECTIONS: "grey", RECIPROCAL: "blue", UNI_DIRECTIONAL: "orange"}
  14. labels = {
  15. NO_CONNECTIONS: "no inh",
  16. RECIPROCAL: "hub inh",
  17. UNI_DIRECTIONAL: "relay inh"
  18. }
  19. for architecture in [UNI_DIRECTIONAL, RECIPROCAL, NO_CONNECTIONS]:
  20. df = firing_rates_frame[firing_rates_frame["architecture"] == architecture]
  21. ax.plot(df["I_1"].values, df["delta_f"].values, label=labels[architecture], color=colors[architecture], lw=1.5,
  22. zorder=10)
  23. ax.plot(df["I_1"].values, df["f_1"].values, linestyle='--', color=colors[architecture], alpha=0.6, zorder=5)
  24. ax.plot(df["I_1"].values, df["f_2"].values, linestyle=':', color=colors[architecture], alpha=0.6, zorder=5)
  25. ax.set_xlabel("I$_1$ - I$_2$ (nA)")
  26. ax.set_ylabel("firing rate (Hz)")
  27. ax.legend()
  28. ax.text(0.1, 55, "f$_1$", ha="right", va="bottom")
  29. ax.text(0.23, 10, "f$_2$", ha="right", va="top")
  30. ax.text(0.55, 75, "f$_1$-f$_2$", ha="right", va="top")
  31. fig.tight_layout()
  32. fig.savefig("../../figures/competition_gain/rate_gain.png", dpi=300)
  33. N_E = traj.par.network.N_E
  34. N_I = traj.par.network.N_I
  35. ex_index_mappings = {
  36. RECIPROCAL: (lambda idx: N_E + N_I + 2 - idx if idx < int(N_E / 2.0) else N_E - idx),
  37. UNI_DIRECTIONAL: (lambda idx: N_E + 2 * N_I + 2 - idx if idx < int(N_E / 2.0) else N_E - idx)
  38. }
  39. in_index_mappings = {
  40. RECIPROCAL: (lambda idx: int(N_E / 2.0) + 2 + idx),
  41. UNI_DIRECTIONAL: (lambda idx: N_E + 2 * N_I + 2 - int(N_E / 2.0) - idx)
  42. }
  43. for input_to_1 in firing_rates_frame["I_1"].values:
  44. df = firing_rates_frame[
  45. (firing_rates_frame["I_1"] == input_to_1) & (firing_rates_frame["architecture"] != NO_CONNECTIONS)]
  46. fig, axes = plt.subplots(2, 1, sharex=True)
  47. for architecture, run_idx in zip(df["architecture"].values, df["run"].values):
  48. ax_idx = 0 if architecture == RECIPROCAL else 1
  49. ax = axes[ax_idx]
  50. traj.v_idx = run_idx
  51. neuron_indices = traj.results.crun.spikes.e.i
  52. spike_times = traj.results.crun.spikes.e.t
  53. ax.plot(spike_times*1000, list(map(ex_index_mappings[architecture], neuron_indices)), 'r|')
  54. if traj.results.crun.spikes.i.num_spikes > 0:
  55. neuron_indices = traj.results.crun.spikes.i.i
  56. spike_times = traj.results.crun.spikes.i.t
  57. ax.plot(spike_times*1000, list(map(in_index_mappings[architecture], neuron_indices)), 'b|')
  58. ax.set_xlim(0,100)
  59. ax.yaxis.set_ticks([])
  60. axes[1].set_xlabel("t (ms)")
  61. fig.suptitle("I$_1$-I$_2$ = {:.1f} nA".format(input_to_1))
  62. fig.savefig("../../figures/competition_gain/spike_raster_delta_I_{:.1f}.png".format(input_to_1), dpi=300)